style: 终端样式.
This commit is contained in:
@@ -69,7 +69,7 @@
|
|||||||
|
|
||||||
.right-side {
|
.right-side {
|
||||||
width: 280px;
|
width: 280px;
|
||||||
margin-left: 16px;
|
margin-top: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel {
|
.panel {
|
||||||
|
|||||||
@@ -14,8 +14,15 @@ body[terminal-theme='light'] {
|
|||||||
--color-bg-content: #FEFEFE;
|
--color-bg-content: #FEFEFE;
|
||||||
--color-sidebar-icon: #737070;
|
--color-sidebar-icon: #737070;
|
||||||
--color-sidebar-icon-bg: #D7D8DB;
|
--color-sidebar-icon-bg: #D7D8DB;
|
||||||
--color-sidebar-tooltip-text: rgba(255, 255, 255, .9);
|
--color-text-white: rgba(255, 255, 255, .9);
|
||||||
|
--color-text-black: rgba(0, 0, 0, .9);
|
||||||
|
--color-sidebar-tooltip-text: var(--color-text-white);
|
||||||
--color-sidebar-tooltip-bg: rgb(var(--gray-10));
|
--color-sidebar-tooltip-bg: rgb(var(--gray-10));
|
||||||
|
--color-host-tabs-bg: var(--color-bg-header);
|
||||||
|
--color-host-tabs-active-bg: var(--color-bg-content);
|
||||||
|
--color-host-tabs-text: rgba(255, 255, 255, .6);
|
||||||
|
--color-host-tabs-hover-text: rgba(255, 255, 255, .8);
|
||||||
|
--color-host-tabs-active-text: var(--color-text-black);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 暗色主题配色常量
|
// 暗色主题配色常量
|
||||||
@@ -25,8 +32,15 @@ body[terminal-theme='dark'] {
|
|||||||
--color-bg-content: #1A1B1F;
|
--color-bg-content: #1A1B1F;
|
||||||
--color-sidebar-icon: #C3C8CE;
|
--color-sidebar-icon: #C3C8CE;
|
||||||
--color-sidebar-icon-bg: #43444C;
|
--color-sidebar-icon-bg: #43444C;
|
||||||
--color-sidebar-tooltip-text: rgba(255, 255, 255, .9);
|
--color-text-white: rgba(255, 255, 255, .9);
|
||||||
|
--color-text-black: rgba(0, 0, 0, .9);
|
||||||
|
--color-sidebar-tooltip-text: var(--color-text-white);
|
||||||
--color-sidebar-tooltip-bg: var(--color-sidebar-icon-bg);
|
--color-sidebar-tooltip-bg: var(--color-sidebar-icon-bg);
|
||||||
|
--color-host-tabs-bg: var(--color-bg-header);
|
||||||
|
--color-host-tabs-active-bg: var(--color-bg-content);
|
||||||
|
--color-host-tabs-text: rgba(255, 255, 255, .6);
|
||||||
|
--color-host-tabs-hover-text: rgba(255, 255, 255, .8);
|
||||||
|
--color-host-tabs-active-text: rgba(255, 255, 255, .9);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 侧栏图标 wrapper
|
// 侧栏图标 wrapper
|
||||||
|
|||||||
@@ -1,6 +1,29 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="terminal-header">
|
<div class="terminal-header">
|
||||||
tabs > > > 全屏 > > > 传输列表
|
<!-- 左侧 logo -->
|
||||||
|
<div class="terminal-header-left">
|
||||||
|
<h5 class="terminal-header-logo-text">Orion Ops Pro</h5>
|
||||||
|
</div>
|
||||||
|
<!-- 左侧 tabs -->
|
||||||
|
<div class="terminal-header-tabs">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
<!-- 右侧操作 -->
|
||||||
|
<div class="terminal-header-right-actions">
|
||||||
|
<!-- 操作按钮 -->
|
||||||
|
<a-tooltip position="left"
|
||||||
|
:mini="true"
|
||||||
|
content-class="terminal-sidebar-tooltip-content"
|
||||||
|
arrow-class="terminal-sidebar-tooltip-arrow"
|
||||||
|
:content="isFullscreen ? '点击退出全屏模式' : '点击切换全屏模式'">
|
||||||
|
<div class="terminal-sidebar-icon-wrapper">
|
||||||
|
<div class="terminal-sidebar-icon" @click="toggleFullScreen">
|
||||||
|
<icon-fullscreen-exit v-if="isFullscreen" />
|
||||||
|
<icon-fullscreen v-else />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tooltip>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -11,11 +34,111 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { useFullscreen } from '@vueuse/core';
|
||||||
|
|
||||||
|
const { isFullscreen, toggle: toggleFullScreen } = useFullscreen();
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
.terminal-header {
|
.terminal-header {
|
||||||
|
--logo-width: 150px;
|
||||||
|
--right-action-width: calc(var(--header-height) * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.terminal-header {
|
||||||
|
height: 100%;
|
||||||
|
color: var(--color-text-white);
|
||||||
|
display: flex;
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
&-left {
|
||||||
|
width: var(--logo-width);
|
||||||
|
}
|
||||||
|
|
||||||
|
&-logo-text {
|
||||||
|
height: var(--header-height);
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding-left: 16px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-tabs {
|
||||||
|
width: calc(100% - var(--logo-width) - var(--right-action-width));
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-right-actions {
|
||||||
|
width: var(--right-action-width);
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-nav) {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-nav-tab) {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-nav-ink) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-tab-close-btn) {
|
||||||
|
margin-left: -12px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--color-text-black);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-nav-button .arco-icon-hover:hover) {
|
||||||
|
color: var(--color-text-black);
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-nav-type-line .arco-tabs-tab:hover .arco-tabs-tab-title::before) {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-tab) {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 8px 12px;
|
||||||
|
color: var(--color-host-tabs-text);
|
||||||
|
background: var(--color-host-tabs-bg);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--color-host-tabs-hover-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.arco-tabs-tab-title {
|
||||||
|
padding: 0 16px 0 0;
|
||||||
|
background: var(--color-host-tabs-bg);
|
||||||
|
z-index: 100;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.arco-tabs-tab-active) {
|
||||||
|
background: var(--color-host-tabs-active-bg);
|
||||||
|
color: var(--color-host-tabs-active-text) !important;
|
||||||
|
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
||||||
|
|
||||||
|
.arco-tabs-tab-title {
|
||||||
|
background: var(--color-host-tabs-active-bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -8,14 +8,11 @@
|
|||||||
content-class="terminal-sidebar-tooltip-content"
|
content-class="terminal-sidebar-tooltip-content"
|
||||||
arrow-class="terminal-sidebar-tooltip-arrow"
|
arrow-class="terminal-sidebar-tooltip-arrow"
|
||||||
:content="action.content">
|
:content="action.content">
|
||||||
<div class="terminal-sidebar-icon-wrapper">
|
<div class="terminal-sidebar-icon-wrapper" :style="action?.style">
|
||||||
<div class="terminal-sidebar-icon" @click="action.event">
|
<div class="terminal-sidebar-icon" @click="action.event">
|
||||||
<component :is="action.icon" />
|
<component :is="action.icon" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
外观
|
|
||||||
主题
|
|
||||||
快捷键
|
|
||||||
</a-tooltip>
|
</a-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -27,10 +24,12 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { SidebarAction } from '../../types/terminal.type';
|
||||||
|
|
||||||
const emits = defineEmits(['openAdd', 'openSetting']);
|
const emits = defineEmits(['openAdd', 'openSetting']);
|
||||||
|
|
||||||
// 操作
|
// 操作
|
||||||
const actions = [
|
const actions: Array<SidebarAction> = [
|
||||||
{
|
{
|
||||||
icon: 'icon-plus',
|
icon: 'icon-plus',
|
||||||
content: '新建连接',
|
content: '新建连接',
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
content-class="terminal-sidebar-tooltip-content"
|
content-class="terminal-sidebar-tooltip-content"
|
||||||
arrow-class="terminal-sidebar-tooltip-arrow"
|
arrow-class="terminal-sidebar-tooltip-arrow"
|
||||||
:content="action.content">
|
:content="action.content">
|
||||||
<div class="terminal-sidebar-icon-wrapper">
|
<div class="terminal-sidebar-icon-wrapper" :style="action?.style">
|
||||||
<div class="terminal-sidebar-icon" @click="action.event">
|
<div class="terminal-sidebar-icon" @click="action.event">
|
||||||
<component :is="action.icon" />
|
<component :is="action.icon" />
|
||||||
</div>
|
</div>
|
||||||
@@ -24,15 +24,37 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
const emits = defineEmits(['openSnippet']);
|
import { SidebarAction } from '../../types/terminal.type';
|
||||||
|
|
||||||
|
const emits = defineEmits(['openSnippet', 'openSftp', 'openTransfer', 'openHistory']);
|
||||||
|
|
||||||
// 操作
|
// 操作
|
||||||
const actions = [
|
const actions: Array<SidebarAction> = [
|
||||||
{
|
{
|
||||||
icon: 'icon-code-block',
|
icon: 'icon-code-block',
|
||||||
content: '打开命令片段',
|
content: '打开命令片段',
|
||||||
|
style: {},
|
||||||
event: () => emits('openSnippet')
|
event: () => emits('openSnippet')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
icon: 'icon-folder',
|
||||||
|
content: '打开 SFTP',
|
||||||
|
style: {},
|
||||||
|
event: () => emits('openSftp')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: 'icon-swap',
|
||||||
|
content: '文件传输列表',
|
||||||
|
style: {
|
||||||
|
transform: 'rotate(90deg)'
|
||||||
|
},
|
||||||
|
event: () => emits('openTransfer')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: 'icon-history',
|
||||||
|
content: '历史命令',
|
||||||
|
event: () => emits('openHistory')
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -2,7 +2,14 @@
|
|||||||
<div class="host-layout">
|
<div class="host-layout">
|
||||||
<!-- 头部区域 -->
|
<!-- 头部区域 -->
|
||||||
<header class="host-layout-header">
|
<header class="host-layout-header">
|
||||||
<terminal-header />
|
<terminal-header>
|
||||||
|
<!-- 主机 tabs -->
|
||||||
|
<a-tabs :editable="true" :hide-content="true">
|
||||||
|
<a-tab-pane v-for="i in 30"
|
||||||
|
:key="i"
|
||||||
|
:title="'主机主机主机'+i+''" />
|
||||||
|
</a-tabs>
|
||||||
|
</terminal-header>
|
||||||
</header>
|
</header>
|
||||||
<!-- 主体区域 -->
|
<!-- 主体区域 -->
|
||||||
<main class="host-layout-main">
|
<main class="host-layout-main">
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import type { CSSProperties } from 'vue';
|
||||||
|
|
||||||
|
// Sidebar 操作类型
|
||||||
|
export interface SidebarAction {
|
||||||
|
icon: string,
|
||||||
|
content: string,
|
||||||
|
style?: CSSProperties
|
||||||
|
event: () => void,
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user