| | |
| | | <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> |
| | | <img :src="faviconUrl" class="sidebar-logo sidebar-favicon" alt="站点图标" /> |
| | | </router-link> |
| | | <router-link v-else key="expand" class="sidebar-logo-link" to="/"> |
| | | <router-link v-else key="expand" class="sidebar-logo-link" :style="expandLogoLinkStyle" to="/"> |
| | | <img v-if="logoUrl" :src="logoUrl" class="sidebar-logo" @error="handleImageError" alt="公司Logo" /> |
| | | <h1 v-if="!logoUrl" class="sidebar-title">{{ title }}</h1> |
| | | </router-link> |
| | |
| | | }) |
| | | |
| | | const logoUrl = ref('') |
| | | |
| | | const expandLogoLinkStyle = computed(() => { |
| | | if (!logoUrl.value) { |
| | | return { '--logo-bg-image': 'none' } |
| | | } |
| | | const escaped = String(logoUrl.value).replace(/"/g, '\\"') |
| | | return { '--logo-bg-image': `url("${escaped}")` } |
| | | }) |
| | | |
| | | const updateLogoUrl = () => { |
| | | if (!cleanFactoryName.value) { |
| | |
| | | .sidebar-logo-container { |
| | | position: relative; |
| | | width: 100% !important; |
| | | height: 56px !important; |
| | | line-height: 56px; |
| | | background: rgba(255, 255, 255, 0.78); |
| | | border: 1px solid var(--surface-border); |
| | | border-radius: 22px; |
| | | text-align: center; |
| | | height: 78px !important; |
| | | line-height: 78px; |
| | | background: transparent; |
| | | border-bottom: 1px solid rgba(255, 255, 255, 0.08); |
| | | text-align: left; |
| | | overflow: hidden; |
| | | box-shadow: var(--shadow-sm); |
| | | box-shadow: none; |
| | | backdrop-filter: none; |
| | | transition: all 0.3s ease; |
| | | |
| | | .sidebar-logo-link { |
| | | position: relative; |
| | | isolation: isolate; |
| | | height: 100%; |
| | | width: 100%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 0 18px 0 14px; |
| | | padding: 0; |
| | | |
| | | &::before { |
| | | content: ""; |
| | | position: absolute; |
| | | inset: 0; |
| | | background-image: var(--logo-bg-image); |
| | | background-size: cover; |
| | | background-position: center; |
| | | opacity: 0.26; |
| | | filter: blur(8px) saturate(0.9); |
| | | transform: scale(1.06); |
| | | pointer-events: none; |
| | | z-index: 0; |
| | | } |
| | | |
| | | &::after { |
| | | content: ""; |
| | | position: absolute; |
| | | inset: 0; |
| | | background: linear-gradient(180deg, rgba(16, 49, 89, 0.18), rgba(16, 49, 89, 0.08)); |
| | | pointer-events: none; |
| | | z-index: 0; |
| | | } |
| | | } |
| | | |
| | | .sidebar-logo { |
| | | width: auto; |
| | | max-width: 250px; |
| | | max-height: 50px; |
| | | height: auto; |
| | | width: 100%; |
| | | height: 100%; |
| | | max-width: none; |
| | | max-height: none; |
| | | padding: 6px 10px; |
| | | vertical-align: middle; |
| | | object-fit: contain; |
| | | object-position: center; |
| | | filter: none; |
| | | display: block; |
| | | position: relative; |
| | | z-index: 1; |
| | | } |
| | | |
| | | .sidebar-title { |
| | |
| | | font-size: 14px; |
| | | font-family: "Segoe UI", "PingFang SC", sans-serif; |
| | | vertical-align: middle; |
| | | position: relative; |
| | | z-index: 1; |
| | | } |
| | | |
| | | &.collapse { |
| | | .sidebar-logo-link { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 0; |
| | | |
| | | &::before, |
| | | &::after { |
| | | display: none; |
| | | } |
| | | } |
| | | |
| | | .sidebar-logo { |
| | | max-width: 30px; |
| | | max-height: 30px; |
| | | width: calc(100% - 8px); |
| | | height: calc(100% - 8px); |
| | | max-width: none; |
| | | max-height: none; |
| | | padding: 4px; |
| | | margin: 0 auto; |
| | | filter: none; |
| | | object-fit: contain; |
| | | object-position: center; |
| | | } |
| | | |
| | | .sidebar-favicon { |
| | | width: 24px; |
| | | height: 24px; |
| | | max-width: 24px; |
| | | max-height: 24px; |
| | | width: calc(100% - 8px); |
| | | height: calc(100% - 8px); |
| | | max-width: none; |
| | | max-height: none; |
| | | } |
| | | } |
| | | } |