Compare commits
2 Commits
06e5ba4515
...
698814621c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
698814621c | ||
|
|
dd58c6203d |
4
components.d.ts
vendored
4
components.d.ts
vendored
@ -48,6 +48,8 @@ declare module 'vue' {
|
|||||||
ElSwitch: typeof import('element-plus/es')['ElSwitch']
|
ElSwitch: typeof import('element-plus/es')['ElSwitch']
|
||||||
ElTable: typeof import('element-plus/es')['ElTable']
|
ElTable: typeof import('element-plus/es')['ElTable']
|
||||||
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
|
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
|
||||||
|
ElTabPane: typeof import('element-plus/es')['ElTabPane']
|
||||||
|
ElTabs: typeof import('element-plus/es')['ElTabs']
|
||||||
ElTag: typeof import('element-plus/es')['ElTag']
|
ElTag: typeof import('element-plus/es')['ElTag']
|
||||||
ElTree: typeof import('element-plus/es')['ElTree']
|
ElTree: typeof import('element-plus/es')['ElTree']
|
||||||
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
|
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
|
||||||
@ -114,6 +116,8 @@ declare global {
|
|||||||
const ElSwitch: typeof import('element-plus/es')['ElSwitch']
|
const ElSwitch: typeof import('element-plus/es')['ElSwitch']
|
||||||
const ElTable: typeof import('element-plus/es')['ElTable']
|
const ElTable: typeof import('element-plus/es')['ElTable']
|
||||||
const ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
|
const ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
|
||||||
|
const ElTabPane: typeof import('element-plus/es')['ElTabPane']
|
||||||
|
const ElTabs: typeof import('element-plus/es')['ElTabs']
|
||||||
const ElTag: typeof import('element-plus/es')['ElTag']
|
const ElTag: typeof import('element-plus/es')['ElTag']
|
||||||
const ElTree: typeof import('element-plus/es')['ElTree']
|
const ElTree: typeof import('element-plus/es')['ElTree']
|
||||||
const ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
|
const ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
|
||||||
|
|||||||
@ -2,9 +2,9 @@
|
|||||||
<html lang="">
|
<html lang="">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<link rel="icon" href="/favicon.ico">
|
<link rel="icon" type="image/png" href="/logo.png">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Vite App</title>
|
<title>投云科技</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
|||||||
BIN
public/logo.png
Normal file
BIN
public/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 166 KiB |
@ -1,18 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="tabs.length" class="ty-tabs">
|
<el-tabs
|
||||||
<div
|
v-if="tabs.length"
|
||||||
v-for="tab in tabs"
|
:model-value="activePath"
|
||||||
:key="tab.path"
|
type="card"
|
||||||
class="ty-tabs__item"
|
class="ty-tabs"
|
||||||
:class="{ 'is-active': tab.path === activePath }"
|
@tab-change="onTabChange"
|
||||||
@click="emit('click', tab.path)"
|
|
||||||
@contextmenu.prevent="openMenu($event, tab)"
|
|
||||||
>
|
>
|
||||||
|
<el-tab-pane v-for="tab in tabs" :key="tab.path" :name="tab.path">
|
||||||
|
<template #label>
|
||||||
|
<span class="ty-tabs__label" @contextmenu.prevent="openMenu($event, tab)">
|
||||||
<span class="ty-tabs__title">{{ tab.title }}</span>
|
<span class="ty-tabs__title">{{ tab.title }}</span>
|
||||||
<span v-if="tab.closable" class="ty-tabs__close" @click.stop="emit('remove', tab.path)">
|
<span v-if="tab.closable" class="ty-tabs__close" @click.stop="emit('remove', tab.path)">
|
||||||
<icon type="iconify" icon="mdi:close" />
|
<icon type="iconify" icon="mdi:close" />
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="menu.visible"
|
v-if="menu.visible"
|
||||||
@ -25,7 +29,6 @@
|
|||||||
<div class="ty-tabs__context-item" @click="onMenu('close-right')">关闭右侧</div>
|
<div class="ty-tabs__context-item" @click="onMenu('close-right')">关闭右侧</div>
|
||||||
<div class="ty-tabs__context-item" @click="onMenu('close-all')">关闭全部</div>
|
<div class="ty-tabs__context-item" @click="onMenu('close-all')">关闭全部</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@ -52,6 +55,10 @@ const emit = defineEmits<{
|
|||||||
|
|
||||||
const menu = reactive({ visible: false, x: 0, y: 0, path: '' })
|
const menu = reactive({ visible: false, x: 0, y: 0, path: '' })
|
||||||
|
|
||||||
|
function onTabChange(name: string | number): void {
|
||||||
|
emit('click', String(name))
|
||||||
|
}
|
||||||
|
|
||||||
function openMenu(e: MouseEvent, tab: TabItem): void {
|
function openMenu(e: MouseEvent, tab: TabItem): void {
|
||||||
menu.x = e.clientX
|
menu.x = e.clientX
|
||||||
menu.y = e.clientY
|
menu.y = e.clientY
|
||||||
@ -87,23 +94,44 @@ onBeforeUnmount(() => document.removeEventListener('click', closeMenu))
|
|||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.ty-tabs {
|
.ty-tabs {
|
||||||
@apply flex items-center gap-1 overflow-x-auto px-2 h-9 bg-bg-base border-b border-solid;
|
@apply px-2 bg-bg-base border-b border-solid;
|
||||||
border-color: var(--wm-border-color-light);
|
border-color: var(--wm-border-color-light);
|
||||||
|
|
||||||
&__item {
|
:deep(.el-tabs__header) {
|
||||||
@apply flex flex-shrink-0 cursor-pointer items-center gap-1 h-7 px-2.5 rounded-base text-sm text-text-regular;
|
@apply m-0;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
@apply bg-bg-page;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.is-active {
|
:deep(.el-tabs__content) {
|
||||||
|
@apply hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tabs__nav) {
|
||||||
|
@apply border-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tabs__item) {
|
||||||
|
@apply h-8 text-sm text-text-regular;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-tabs__item.is-active) {
|
||||||
color: var(--el-color-primary);
|
color: var(--el-color-primary);
|
||||||
background: var(--el-color-primary-light-9);
|
}
|
||||||
|
|
||||||
|
:deep(.el-tabs__nav-prev),
|
||||||
|
:deep(.el-tabs__nav-next) {
|
||||||
|
@apply h-8 text-text-regular;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__close {
|
.ty-tabs__label {
|
||||||
|
@apply inline-flex items-center gap-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ty-tabs__title {
|
||||||
|
@apply truncate;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ty-tabs__close {
|
||||||
@apply flex items-center justify-center w-4 h-4 rounded-full text-xs;
|
@apply flex items-center justify-center w-4 h-4 rounded-full text-xs;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@ -112,18 +140,17 @@ onBeforeUnmount(() => document.removeEventListener('click', closeMenu))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__context-menu {
|
.ty-tabs__context-menu {
|
||||||
@apply fixed z-50 min-w-[110px] py-1 bg-bg-base rounded-base border border-solid;
|
@apply fixed z-50 min-w-[110px] py-1 bg-bg-base rounded-base border border-solid;
|
||||||
border-color: var(--wm-border-color-light);
|
border-color: var(--wm-border-color-light);
|
||||||
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
|
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
|
||||||
}
|
}
|
||||||
|
|
||||||
&__context-item {
|
.ty-tabs__context-item {
|
||||||
@apply cursor-pointer py-1.5 px-3.5 text-sm text-text-regular;
|
@apply cursor-pointer py-1.5 px-3.5 text-sm text-text-regular;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@apply bg-bg-page;
|
@apply bg-bg-page;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user