Feature(custom): refactor plugin page

This commit is contained in:
Kuingsmile
2025-04-09 15:23:42 +08:00
parent 711a89a85e
commit a06b7e8b03
3 changed files with 564 additions and 325 deletions
+185 -81
View File
@@ -4,21 +4,20 @@
<div class="fake-title-bar__title">PicList - {{ version }}</div> <div class="fake-title-bar__title">PicList - {{ version }}</div>
<div v-if="osGlobal !== 'darwin'" class="handle-bar"> <div v-if="osGlobal !== 'darwin'" class="handle-bar">
<el-icon <el-icon
class="minus" class="control-icon always-on-top"
:color="isAlwaysOnTop ? '#409EFF' : '#fff'" :color="isAlwaysOnTop ? '#409EFF' : '#fff'"
size="20" size="20"
style="margin-right: 10px"
@click="setAlwaysOnTop" @click="setAlwaysOnTop"
> >
<ArrowUpBold /> <ArrowUpBold />
</el-icon> </el-icon>
<el-icon class="minus" color="#fff" size="20" style="margin-right: 10px" @click="minimizeWindow"> <el-icon class="control-icon minimize" color="#fff" size="20" @click="minimizeWindow">
<SemiSelect /> <SemiSelect />
</el-icon> </el-icon>
<el-icon class="plus" color="orange" size="20" style="margin-right: 10px" @click="openMiniWindow"> <el-icon class="control-icon mini-window" color="#FFA500" size="20" @click="openMiniWindow">
<ArrowDownBold /> <ArrowDownBold />
</el-icon> </el-icon>
<el-icon class="close" color="#fff" size="20" @click="closeWindow"> <el-icon class="control-icon close" color="#fff" size="20" @click="closeWindow">
<CloseBold /> <CloseBold />
</el-icon> </el-icon>
</div> </div>
@@ -26,38 +25,30 @@
<el-progress <el-progress
v-if="isShowprogress" v-if="isShowprogress"
:percentage="progress" :percentage="progress"
:stroke-width="7" :stroke-width="4"
:text-inside="true" :text-inside="true"
:show-text="false" :show-text="false"
status="success" status="success"
class="progress-bar" class="progress-bar"
/> />
<el-row style="padding-top: 22px" class="main-content"> <el-row class="main-content">
<el-col class="side-bar-menu"> <el-col class="side-bar-menu">
<el-menu class="picgo-sidebar" :default-active="defaultActive" :unique-opened="true" @select="handleSelect"> <el-menu class="picgo-sidebar" :default-active="defaultActive" :unique-opened="true" @select="handleSelect">
<el-menu-item :index="routerConfig.UPLOAD_PAGE"> <el-menu-item :index="routerConfig.UPLOAD_PAGE" class="side-menu-item">
<el-icon> <el-icon class="menu-icon"><UploadFilled /></el-icon>
<UploadFilled />
</el-icon>
<span>{{ $T('UPLOAD_AREA') }}</span> <span>{{ $T('UPLOAD_AREA') }}</span>
</el-menu-item> </el-menu-item>
<el-menu-item :index="routerConfig.MANAGE_LOGIN_PAGE"> <el-menu-item :index="routerConfig.MANAGE_LOGIN_PAGE" class="side-menu-item">
<el-icon> <el-icon class="menu-icon"><PieChart /></el-icon>
<PieChart />
</el-icon>
<span>{{ $T('MANAGE_PAGE') }}</span> <span>{{ $T('MANAGE_PAGE') }}</span>
</el-menu-item> </el-menu-item>
<el-menu-item :index="routerConfig.GALLERY_PAGE"> <el-menu-item :index="routerConfig.GALLERY_PAGE" class="side-menu-item">
<el-icon> <el-icon class="menu-icon"><PictureFilled /></el-icon>
<PictureFilled />
</el-icon>
<span>{{ $T('GALLERY') }}</span> <span>{{ $T('GALLERY') }}</span>
</el-menu-item> </el-menu-item>
<el-sub-menu index="sub-menu" :show-timeout="0" :hide-timeout="0" :popper-offset="0"> <el-sub-menu index="sub-menu" :show-timeout="0" :hide-timeout="0" :popper-offset="0" class="side-menu-sub">
<template #title> <template #title>
<el-icon> <el-icon class="menu-icon"><Menu /></el-icon>
<Menu />
</el-icon>
<span>{{ $T('PICBEDS_SETTINGS') }}</span> <span>{{ $T('PICBEDS_SETTINGS') }}</span>
</template> </template>
<template v-for="item in picBedGlobal"> <template v-for="item in picBedGlobal">
@@ -65,35 +56,32 @@
v-if="item.visible" v-if="item.visible"
:key="item.type" :key="item.type"
:index="`${routerConfig.UPLOADER_CONFIG_PAGE}-${item.type}`" :index="`${routerConfig.UPLOADER_CONFIG_PAGE}-${item.type}`"
class="side-submenu-item"
> >
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</el-menu-item> </el-menu-item>
</template> </template>
</el-sub-menu> </el-sub-menu>
<el-menu-item :index="routerConfig.SETTING_PAGE"> <el-menu-item :index="routerConfig.SETTING_PAGE" class="side-menu-item">
<el-icon> <el-icon class="menu-icon"><Tools /></el-icon>
<Tools />
</el-icon>
<span>{{ $T('PICLIST_SETTINGS') }}</span> <span>{{ $T('PICLIST_SETTINGS') }}</span>
</el-menu-item> </el-menu-item>
<el-menu-item :index="routerConfig.PLUGIN_PAGE"> <el-menu-item :index="routerConfig.PLUGIN_PAGE" class="side-menu-item">
<el-icon> <el-icon class="menu-icon"><Share /></el-icon>
<Share />
</el-icon>
<span>{{ $T('PLUGIN_SETTINGS') }}</span> <span>{{ $T('PLUGIN_SETTINGS') }}</span>
</el-menu-item> </el-menu-item>
<el-menu-item :index="routerConfig.DocumentPage"> <el-menu-item :index="routerConfig.DocumentPage" class="side-menu-item">
<el-icon> <el-icon class="menu-icon"><Link /></el-icon>
<Link />
</el-icon>
<span>{{ $T('MANUAL') }}</span> <span>{{ $T('MANUAL') }}</span>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>
</el-col>
<div class="info-window-container">
<el-icon class="info-window" @click="openMenu"> <el-icon class="info-window" @click="openMenu">
<InfoFilled /> <InfoFilled />
</el-icon> </el-icon>
</el-col> </div>
<el-col :span="21" :offset="3" style="height: 100%" class="main-wrapper"> <el-col :span="21" :offset="3" class="main-wrapper">
<router-view v-slot="{ Component }"> <router-view v-slot="{ Component }">
<transition name="picgo-fade" mode="out-in"> <transition name="picgo-fade" mode="out-in">
<keep-alive :include="keepAlivePages"> <keep-alive :include="keepAlivePages">
@@ -305,13 +293,20 @@ export default {
name: 'MainPage' name: 'MainPage'
} }
</script> </script>
<style lang="stylus"> <style lang="stylus">
$darwinBg = transparentify(#172426, #000, 0.7) $darwinBg = transparentify(#172426, #000, 0.7)
$menuActiveBg = rgba(64, 158, 255, 0.15)
$menuHoverBg = rgba(255, 255, 255, 0.08)
$borderRadius = 8px
$transitionDefault = all 0.25s cubic-bezier(0.4, 0, 0.2, 1)
.setting-list-scroll .setting-list-scroll
height 800px height 800px
overflow-y auto overflow-y auto
overflow-x hidden overflow-x hidden
margin-right 0!important margin-right 0!important
.picgo-fade .picgo-fade
&-enter, &-enter,
&-leave, &-leave,
@@ -319,14 +314,44 @@ $darwinBg = transparentify(#172426, #000, 0.7)
opacity 0 opacity 0
&-enter-active, &-enter-active,
&-leave-active &-leave-active
transition all 150ms linear transition all 200ms cubic-bezier(0.4, 0, 0.2, 1)
.view-title .view-title
color #eee color #eee
font-size 20px font-size 20px
text-align center text-align center
margin 10px auto margin 10px auto
#main-page #main-page
height 100% height 100%
background linear-gradient(135deg, rgba(40, 44, 52, 0.85) 0%, rgba(30, 34, 42, 0.9) 100%)
display flex
flex-direction column
overflow hidden
.info-window-container
position fixed
bottom 4px
left 4px
z-index 50
width 40px
height 40px
.info-window
cursor pointer
color #878d99
padding 6px
background rgba(40, 44, 52, 0.5)
border-radius 50%
box-shadow 0 2px 8px rgba(0, 0, 0, 0.15)
transition $transitionDefault
&:hover
color #409EFF
background rgba(64, 158, 255, 0.15)
transform translateY(-2px)
box-shadow 0 4px 12px rgba(0, 0, 0, 0.25)
.qrcode-dialog .qrcode-dialog
.qrcode-container .qrcode-container
display flex display flex
@@ -335,16 +360,26 @@ $darwinBg = transparentify(#172426, #000, 0.7)
padding-top 10px padding-top 10px
.copy-picbed-config .copy-picbed-config
margin-left 10px margin-left 10px
transition $transitionDefault
&:hover
transform translateY(-2px)
box-shadow 0 4px 12px rgba(0, 0, 0, 0.2)
.fake-title-bar .fake-title-bar
-webkit-app-region drag -webkit-app-region drag
height h = 22px height h = 28px
width 100% width 100%
text-align center text-align center
color #eee color #eee
font-size 12px font-size 13px
font-weight 500
line-height h line-height h
position fixed position fixed
z-index 100 z-index 100
backdrop-filter blur(5px)
background rgba(30, 34, 42, 0.7)
box-shadow 0 1px 3px rgba(0, 0, 0, 0.2)
&.darwin &.darwin
background transparent background transparent
background-image linear-gradient( background-image linear-gradient(
@@ -356,98 +391,167 @@ $darwinBg = transparentify(#172426, #000, 0.7)
) )
.fake-title-bar__title .fake-title-bar__title
padding-left 167px padding-left 167px
.fake-title-bar__title
letter-spacing 0.5px
.handle-bar .handle-bar
position absolute position absolute
top 2px top 4px
right 4px right 8px
z-index 10000 z-index 10000
-webkit-app-region no-drag -webkit-app-region no-drag
.el-icon display flex
gap 12px
.control-icon
cursor pointer cursor pointer
font-size 16px font-size 16px
margin-left 5px transition $transitionDefault
.el-icon.minus border-radius 4px
&:hover padding 2px
color #409EFF
.el-icon.close &.always-on-top
&:hover &:hover
color #F15140 color #409EFF
.el-icon.plus background rgba(64, 158, 255, 0.15)
&:hover
color #69C282 &.minimize
&:hover
color #409EFF
background $menuHoverBg
&.close
&:hover
color #F15140
background rgba(241, 81, 64, 0.15)
&.mini-window
&:hover
color #FFC107
background rgba(255, 193, 7, 0.15)
.progress-bar
position fixed
top 28px
width 100%
z-index 90
transition opacity 0.3s ease
.main-wrapper .main-wrapper
&.darwin &.darwin
background $darwinBg background $darwinBg
padding 10px
border-radius $borderRadius
background rgba(30, 34, 42, 0.5)
.side-bar-menu .side-bar-menu
position fixed position fixed
height calc(100vh - 22px) height calc(100vh - 28px)
overflow-x hidden overflow-x hidden
overflow-y auto overflow-y auto
width 142px width 142px
.info-window padding-top 35px
cursor pointer padding-bottom 40px
position fixed transition $transitionDefault
bottom 4px background rgba(30, 34, 42, 0.5)
left 4px backdrop-filter blur(10px)
cursor poiter
color #878d99 &:hover
transition .2s all ease-in-out width 145px
&:hover
color #409EFF
.el-menu .el-menu
border-right none border-right none
background transparent background transparent
width 142px width 142px
&-item &-item
color #eee color #eee
position relative position relative
border-radius $borderRadius
margin 4px 8px
height 40px
line-height 40px
transition $transitionDefault
&:focus, &:focus,
&:hover &:hover
color #fff color #fff
background transparent background $menuHoverBg
&.is-active &.is-active
color active-color = #409EFF color active-color = #409EFF
&:before background $menuActiveBg
content '' font-weight 500
position absolute
width 1px .menu-icon
height 20px color active-color
right 0
top 18px .side-menu-item
background active-color padding-left 16px!important
.menu-icon
margin-right 8px
transition $transitionDefault
.el-sub-menu__title .el-sub-menu__title
color #eee color #eee
border-radius $borderRadius
margin 4px 8px
height 40px
line-height 40px
transition $transitionDefault
&:hover &:hover
background transparent background $menuHoverBg
span span
color #fff color #fff
.menu-icon
margin-right 8px
.el-sub-menu .el-sub-menu
.el-menu-item .el-menu-item
min-width 142px min-width 142px
&.is-active &.is-active
&:before background $menuActiveBg
top 16px
.side-submenu-item
margin-left 0!important
border-radius $borderRadius
padding-left 38px!important
.main-content .main-content
padding-top 22px padding-top 28px
position relative position relative
height calc(100vh - 22px) height calc(100vh - 28px)
z-index 10 z-index 10
.el-dialog__body .el-dialog__body
padding 20px padding 20px
.support .support
text-align center text-align center
&-title &-title
text-align center text-align center
color #878d99 color #878d99
.align-center .align-center
input input
text-align center text-align center
*::-webkit-scrollbar *::-webkit-scrollbar
width 2px width 4px
height 8px height 8px
*::-webkit-scrollbar-thumb *::-webkit-scrollbar-thumb
border-radius 4px border-radius 10px
background #6f6f6f background rgba(111, 111, 111, 0.5)
&:hover
background rgba(140, 140, 140, 0.7)
*::-webkit-scrollbar-track *::-webkit-scrollbar-track
background-color transparent background-color transparent
</style> </style>
+378 -243
View File
@@ -1,122 +1,144 @@
<template> <template>
<div id="plugin-view"> <div id="plugin-view">
<div class="view-title"> <div class="view-header">
{{ $T('PLUGIN_SETTINGS') }} - <div class="view-title">
<el-tooltip :content="pluginListToolTip" placement="right" :persistent="false" teleported> <span>{{ $T('PLUGIN_SETTINGS') }}</span>
<el-icon class="el-icon-goods" @click="goAwesomeList"> <div class="view-actions">
<Goods /> <el-tooltip :content="pluginListToolTip" placement="top" :persistent="false" teleported>
</el-icon> <el-button class="action-button" circle @click="goAwesomeList">
</el-tooltip> <el-icon><Goods /></el-icon>
<el-tooltip :content="updateAllToolTip" placement="left" :persistent="false" teleported> </el-button>
<el-icon class="el-icon-update" @click="handleUpdateAllPlugin"> </el-tooltip>
<Refresh /> <el-tooltip :content="updateAllToolTip" placement="top" :persistent="false" teleported>
</el-icon> <el-button class="action-button" circle @click="handleUpdateAllPlugin">
</el-tooltip> <el-icon><Refresh /></el-icon>
<el-tooltip :content="importLocalPluginToolTip" placement="left"> </el-button>
<el-icon class="el-icon-download" :persistent="false" teleported @click="handleImportLocalPlugin"> </el-tooltip>
<Download /> <el-tooltip :content="importLocalPluginToolTip" placement="top" :persistent="false" teleported>
</el-icon> <el-button class="action-button" circle @click="handleImportLocalPlugin">
</el-tooltip> <el-icon><Download /></el-icon>
</el-button>
</el-tooltip>
</div>
</div>
<div class="search-bar">
<el-input v-model="searchText" :placeholder="$T('PLUGIN_SEARCH_PLACEHOLDER')" size="large" class="search-input">
<template #prefix>
<el-icon class="search-icon"><Search /></el-icon>
</template>
<template #suffix>
<el-icon v-if="searchText" class="clear-icon" @click="cleanSearch">
<Close />
</el-icon>
</template>
</el-input>
</div>
</div> </div>
<el-row class="handle-bar" :class="{ 'cut-width': pluginList.length > 6 }">
<el-input v-model="searchText" :placeholder="$T('PLUGIN_SEARCH_PLACEHOLDER')" size="small"> <div id="pluginList" v-loading="loading" class="plugin-list" element-loading-text="Loading...">
<template #suffix> <el-row :gutter="16">
<el-icon class="el-input__icon" style="cursor: pointer" @click="cleanSearch"> <el-col
<close /> v-for="item in pluginList"
</el-icon> :key="item.fullName"
</template> class="plugin-item__container"
</el-input> :xs="24"
</el-row> :sm="12"
<el-row id="pluginList" v-loading="loading" :gutter="10" class="plugin-list"> :md="8"
<el-col :lg="8"
v-for="item in pluginList" :xl="6"
:key="item.fullName" >
class="plugin-item__container" <div class="plugin-card" :class="{ disabled: !item.enabled, darwin: osGlobal === 'darwin' }">
:xs="24" <div v-if="!item.gui" class="cli-only-badge">CLI</div>
:sm="pluginList.length === 1 ? 24 : 12" <div class="plugin-header">
:md="pluginList.length === 1 ? 24 : 12" <img class="plugin-logo" :src="item.logo" :onerror="defaultLogo" />
:lg="pluginList.length === 1 ? 24 : 12" <div class="plugin-title" @click="openHomepage(item.homepage)">
:xl="pluginList.length === 1 ? 24 : 12" <div class="plugin-name">
> {{ item.name }}
<div class="plugin-item" :class="{ darwin: osGlobal === 'darwin' }"> <el-tag
<div v-if="!item.gui" class="cli-only-badge" title="CLI only">CLI</div> v-if="latestVersionMap[item.fullName] && latestVersionMap[item.fullName] !== item.version"
<img class="plugin-item__logo" :src="item.logo" :onerror="defaultLogo" /> type="success"
<div class="plugin-item__content" :class="{ disabled: !item.enabled }"> size="small"
<div class="plugin-item__name" @click="openHomepage(item.homepage)"> effect="dark"
{{ item.name }} <small>{{ ' ' + item.version }}</small> &nbsp; class="version-tag"
<!-- 升级提示 --> >
<el-tag new
v-if="latestVersionMap[item.fullName] && latestVersionMap[item.fullName] !== item.version" </el-tag>
type="success" </div>
size="small" <div class="plugin-version">v{{ item.version }}</div>
round </div>
effect="plain"
>
new
</el-tag>
</div> </div>
<div class="plugin-item__desc" :title="item.description">
<div class="plugin-description" :title="item.description">
{{ item.description }} {{ item.description }}
</div> </div>
<div class="plugin-item__info-bar">
<span class="plugin-item__author"> <div class="plugin-footer">
<div class="plugin-author">
<el-icon><User /></el-icon>
{{ item.author.replace(/<.*>/, '') }} {{ item.author.replace(/<.*>/, '') }}
</span> </div>
<span class="plugin-item__config">
<div class="plugin-actions">
<template v-if="searchText"> <template v-if="searchText">
<template v-if="!item.hasInstall"> <template v-if="!item.hasInstall">
<span v-if="!item.ing" class="config-button install" @click="installPlugin(item)"> <el-button
v-if="!item.ing"
type="primary"
size="small"
:loading="item.ing"
@click="installPlugin(item)"
>
{{ $T('PLUGIN_INSTALL') }} {{ $T('PLUGIN_INSTALL') }}
</span> </el-button>
<span v-else-if="item.ing" class="config-button ing"> <el-button v-else type="info" size="small" loading>
{{ $T('PLUGIN_INSTALLING') }} {{ $T('PLUGIN_INSTALLING') }}
</span> </el-button>
</template> </template>
<span v-else class="config-button ing"> <el-button v-else type="success" size="small" disabled>
{{ $T('PLUGIN_INSTALLED') }} {{ $T('PLUGIN_INSTALLED') }}
</span> </el-button>
</template> </template>
<template v-else> <template v-else>
<span v-if="item.ing" class="config-button ing"> <el-button v-if="item.ing" type="info" size="small" loading>
{{ $T('PLUGIN_DOING_SOMETHING') }} {{ $T('PLUGIN_DOING_SOMETHING') }}
</span> </el-button>
<template v-else> <template v-else>
<el-icon v-if="item.enabled" class="el-icon-setting" @click="buildContextMenu(item)"> <el-button v-if="item.enabled" type="primary" size="small" circle @click="buildContextMenu(item)">
<Tools /> <el-icon><Tools /></el-icon>
</el-icon> </el-button>
<el-icon v-else class="el-icon-remove-outline" @click="buildContextMenu(item)"> <el-button v-else type="danger" size="small" circle @click="buildContextMenu(item)">
<Remove /> <el-icon><Remove /></el-icon>
</el-icon> </el-button>
</template> </template>
</template> </template>
</span> </div>
</div> </div>
</div> </div>
</div> </el-col>
</el-col> </el-row>
</el-row> </div>
<el-row v-show="needReload" class="reload-mask" :class="{ 'cut-width': pluginList.length > 6 }" justify="center">
<el-button type="primary" size="small" round @click="reloadApp"> <div v-show="needReload" class="reload-mask">
<el-button type="primary" size="large" @click="reloadApp">
<el-icon class="reload-icon"><Refresh /></el-icon>
{{ $T('TIPS_NEED_RELOAD') }} {{ $T('TIPS_NEED_RELOAD') }}
</el-button> </el-button>
</el-row> </div>
<el-dialog <el-dialog
v-model="dialogVisible" v-model="dialogVisible"
:modal-append-to-body="false" :modal-append-to-body="false"
:title=" :title="$T('CONFIG_THING', { c: configName })"
$T('CONFIG_THING', {
c: configName
})
"
width="70%" width="70%"
class="config-dialog"
append-to-body append-to-body
> >
<config-form :id="configName" ref="$configForm" :config="config" :type="currentType" color-mode="white" /> <config-form :id="configName" ref="$configForm" :config="config" :type="currentType" color-mode="white" />
<template #footer> <template #footer>
<el-button round @click="dialogVisible = false"> <el-button @click="dialogVisible = false">
{{ $T('CANCEL') }} {{ $T('CANCEL') }}
</el-button> </el-button>
<el-button type="primary" round @click="handleConfirmConfig"> <el-button type="primary" @click="handleConfirmConfig">
{{ $T('CONFIRM') }} {{ $T('CONFIRM') }}
</el-button> </el-button>
</template> </template>
@@ -129,7 +151,7 @@ import axios from 'axios'
import { ipcRenderer, IpcRendererEvent } from 'electron' import { ipcRenderer, IpcRendererEvent } from 'electron'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import { debounce, DebouncedFunc } from 'lodash' import { debounce, DebouncedFunc } from 'lodash'
import { Close, Download, Refresh, Goods, Remove, Tools } from '@element-plus/icons-vue' import { Close, Download, Refresh, Goods, Remove, Tools, Search, User } from '@element-plus/icons-vue'
import { computed, ref, onBeforeMount, onBeforeUnmount, watch, onMounted, reactive, toRaw } from 'vue' import { computed, ref, onBeforeMount, onBeforeUnmount, watch, onMounted, reactive, toRaw } from 'vue'
import ConfigForm from '@/components/ConfigFormForPlugin.vue' import ConfigForm from '@/components/ConfigFormForPlugin.vue'
@@ -309,7 +331,8 @@ async function buildContextMenu(plugin: IPicGoPlugin) {
function handleResize() { function handleResize() {
const myDiv = document.getElementById('pluginList') as HTMLElement const myDiv = document.getElementById('pluginList') as HTMLElement
const windowHeight = window.innerHeight const windowHeight = window.innerHeight
const newHeight = windowHeight * 0.75 const headerHeight = 120 // Adjusted for new header layout
const newHeight = windowHeight - headerHeight - 30
myDiv.style.height = newHeight + 'px' myDiv.style.height = newHeight + 'px'
} }
@@ -492,171 +515,283 @@ export default {
} }
</script> </script>
<style lang="stylus"> <style lang="stylus">
$darwinBg = #172426 $primaryColor = #409EFF
$dangerColor = #F56C6C
$successColor = #67C23A
$warningColor = #E6A23C
$infoColor = #909399
$textColor = #FFFFFF
$subtextColor = #E8EAED
$disabledColor = #A0A0A0
$cardBg = rgba(55, 60, 70, 0.85)
$headerBg = rgba(35, 40, 50, 0.9)
$hoverBg = rgba(65, 70, 85, 0.9)
$borderRadius = 8px
$transitionEase = all 0.3s cubic-bezier(0.4, 0, 0.2, 1)
$boxShadow = 0 4px 12px rgba(0, 0, 0, 0.2)
$hoverShadow = 0 8px 16px rgba(0, 0, 0, 0.3)
#plugin-view #plugin-view
position absolute position absolute
left 142px left 142px
right 0 right 0
.el-loading-mask height 100%
background-color rgba(0, 0, 0, 0.8) padding 0 16px
.plugin-list box-sizing border-box
align-content flex-start overflow hidden
height: 600px; color $textColor
box-sizing: border-box;
padding: 8px 15px; .view-header
overflow-y: auto; position sticky
overflow-x: hidden; top 0
position: absolute; z-index 90
top: 70px; padding 16px 0
left: 5px; background linear-gradient(to bottom, rgba(30, 34, 42, 0.95), rgba(30, 34, 42, 0.85))
transition: all 0.2s ease-in-out 0.1s; backdrop-filter blur(8px)
width: 100% border-bottom 1px solid rgba(255, 255, 255, 0.1)
.el-loading-mask
left: 20px
width: calc(100% - 40px)
.view-title .view-title
color #eee display flex
font-size 20px justify-content space-between
text-align center align-items center
margin 10px auto margin-bottom 16px
position relative font-size 24px
i.el-icon-goods font-weight 600
margin-left 4px
font-size 20px span
vertical-align middle flex 1
cursor pointer
transition color .2s ease-in-out .view-actions
&:hover display flex
color #49B1F5 gap 8px
i.el-icon-update
position absolute .action-button
right 35px background rgba(255, 255, 255, 0.1)
top 8px border none
font-size 20px color $textColor
vertical-align middle transition $transitionEase
cursor pointer
transition color .2s ease-in-out &:hover
&:hover background rgba(255, 255, 255, 0.2)
color #49B1F5 transform translateY(-2px)
i.el-icon-download
position absolute .search-bar
right 5px margin-bottom 8px
top 8px
font-size 20px .search-input
vertical-align middle .el-input__wrapper
cursor pointer background rgba(255, 255, 255, 0.1)
transition color .2s ease-in-out border-radius $borderRadius
&:hover border none
color #49B1F5 box-shadow none !important
.handle-bar transition $transitionEase
margin-bottom 20px
&.cut-width &:hover, &:focus-within
padding-right: 8px background rgba(255, 255, 255, 0.15)
.el-input__inner
border-radius 0 .el-input__inner
.plugin-item color $textColor
box-sizing border-box
height 80px .search-icon
background #444 color $disabledColor
padding 8px
user-select text .clear-icon
transition all .2s ease-in-out color $disabledColor
position relative cursor pointer
&__container transition $transitionEase
height 80px
margin-bottom 10px &:hover
.cli-only-badge color $textColor
position absolute
right 0px .plugin-list
top 0 height calc(100vh - 175px)
font-size 12px overflow-y auto
padding 3px 8px overflow-x hidden
background #49B1F5 padding 16px 0 // Increased padding from 8px to 16px
color #eee scroll-behavior smooth
&.darwin
background transparentify($darwinBg, #000, 0.75) .el-row
&:hover margin-bottom 0 !important // Ensure el-row doesn't add its own margins
background transparentify($darwinBg, #000, 0.85)
&:hover .el-loading-mask
background #333 background-color rgba(0, 0, 0, 0.8)
&__logo backdrop-filter blur(4px)
width 64px
height 64px .plugin-item__container
float left margin-bottom 24px // Increased from 16px to provide more space between rows
&__content
float left .plugin-card
width calc(100% - 72px) background $cardBg
height 64px border-radius $borderRadius
color #ddd padding 16px
margin-left 8px min-height 220px
box-shadow $boxShadow
transition $transitionEase
display flex display flex
flex-direction column flex-direction column
justify-content space-between
&.disabled
color #aaa
&__name
font-size 16px
height 22px
line-height 22px
font-weight 600
cursor pointer
text-overflow ellipsis
white-space nowrap
overflow hidden
transition all .2s ease-in-out
&:hover
color: #1B9EF3
&__desc
font-size 14px
height 21px
line-height 21px
overflow hidden
text-overflow ellipsis
white-space nowrap
&__info-bar
font-size 14px
height 21px
line-height 28px
position relative position relative
&__author overflow hidden
border 1px solid rgba(255, 255, 255, 0.1) // Added subtle border
&:hover
transform translateY(-3px)
box-shadow $hoverShadow
background $hoverBg
border-color rgba(255, 255, 255, 0.2) // Brighter border on hover
&.disabled
opacity 0.7
&:before
content ""
position absolute
top 0
left 0
right 0
bottom 0
background rgba(0, 0, 0, 0.3)
z-index 1
pointer-events none
.cli-only-badge
position absolute
right 0
top 0
font-size 11px
font-weight 600
padding 4px 10px
background $warningColor
color #fff
z-index 5
border-bottom-left-radius $borderRadius
.plugin-header
display flex
align-items center
margin-bottom 12px
.plugin-logo
width 48px
height 48px
border-radius 12px
object-fit cover
background rgba(0, 0, 0, 0.2)
box-shadow 0 2px 6px rgba(0, 0, 0, 0.2)
.plugin-title
margin-left 12px
cursor pointer
transition $transitionEase
&:hover
color $primaryColor
.plugin-name
font-size 16px
font-weight 600
display flex
align-items center
max-width 200px
overflow hidden
text-overflow ellipsis
white-space nowrap
.version-tag
margin-left 8px
font-size 10px
height 18px
line-height 1
padding 2px 6px
border-radius 10px
.plugin-version
font-size 12px
color $disabledColor
margin-top 2px
.plugin-description
flex 1
font-size 14px
line-height 1.5
margin-bottom 16px
display -webkit-box
-webkit-line-clamp 3
-webkit-box-orient vertical
overflow hidden
color rgba(255, 255, 255, 0.95)
font-weight 400
.plugin-footer
display flex
justify-content space-between
align-items center
margin-top auto
padding-top 12px
border-top 1px solid rgba(255, 255, 255, 0.1)
.plugin-author
font-size 13px
color $disabledColor
display flex
align-items center
max-width 60%
overflow hidden overflow hidden
text-overflow ellipsis text-overflow ellipsis
white-space nowrap white-space nowrap
&__config
float right .el-icon
font-size 16px margin-right 6px
cursor pointer font-size 14px
transition all .2s ease-in-out
&:hover .plugin-actions
color: #1B9EF3 display flex
.config-button gap 8px
font-size 12px
color #ddd
background #222
padding 1px 8px
height 18px
line-height 18px
text-align center
position absolute
top 4px
right 20px
transition all .2s ease-in-out
&.reload
right 0px
&.ing
right 0px
&.install
right 0px
&:hover
background: #1B9EF3
color #fff
.reload-mask .reload-mask
position absolute position fixed
width calc(100% - 40px) bottom 0
bottom -320px left 142px
text-align center right 0
background rgba(0,0,0,0.4) padding 16px
padding 10px 0 background rgba(0, 0, 0, 0.7)
&.cut-width display flex
width calc(100% - 48px) justify-content center
align-items center
backdrop-filter blur(8px)
z-index 100
box-shadow 0 -2px 10px rgba(0, 0, 0, 0.3)
animation slideUp 0.3s cubic-bezier(0.4, 0, 0.2, 1)
.reload-icon
margin-right 8px
.config-dialog
.el-dialog__header
border-bottom 1px solid rgba(255, 255, 255, 0.1)
padding-bottom 16px
.el-dialog__footer
border-top 1px solid rgba(255, 255, 255, 0.1)
padding-top 16px
@keyframes slideUp
from
transform translateY(100%)
to
transform translateY(0)
// Scrollbar styling
*::-webkit-scrollbar
width 6px
height 6px
*::-webkit-scrollbar-thumb
border-radius 10px
background rgba(255, 255, 255, 0.2)
&:hover
background rgba(255, 255, 255, 0.3)
*::-webkit-scrollbar-track
background-color transparent
</style> </style>
+1 -1
View File
@@ -553,7 +553,7 @@ export default {
gap 12px gap 12px
.option-card .option-card
background rgba(255, 255, 255, 0.05) background rgba(255, 255, 255, 0.02)
border-radius 12px border-radius 12px
padding 12px padding 12px
backdrop-filter blur(5px) backdrop-filter blur(5px)