feat: 添加复古主题下的导航栏、侧边栏和标签视图信息架构

This commit is contained in:
zhanghao 2026-08-28 09:37:53 +08:00
parent a49404ec5c
commit a51190adf7
6 changed files with 696 additions and 1 deletions

View File

@ -1,6 +1,11 @@
<template>
<div class="navbar" :class="'nav' + settingsStore.navType">
<hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<div class="navbar-context">
<span class="navbar-context__eyebrow">FIELD OPERATIONS / CMVR</span>
<strong>{{ route.meta?.title || '工作台' }}</strong>
<code>{{ route.path }}</code>
</div>
<breadcrumb v-if="settingsStore.navType == 1" id="breadcrumb-container" class="breadcrumb-container" />
<top-nav v-if="settingsStore.navType == 2" id="topmenu-container" class="topmenu-container" />
<template v-if="settingsStore.navType == 3">
@ -8,6 +13,12 @@
<top-bar id="topbar-container" class="topbar-container" />
</template>
<div class="navbar-console-status" aria-label="系统状态">
<span class="console-led"></span>
<span>LOCAL CONSOLE</span>
<b>READY</b>
</div>
<div class="right-menu">
<template v-if="appStore.device !== 'mobile'">
<header-search id="header-search" class="right-menu-item" />

View File

@ -1,6 +1,10 @@
<template>
<div :class="['sidebar-theme-wrapper', {'has-logo':showLogo}, sideTheme]" class="sidebar-container">
<logo v-if="showLogo" :collapse="isCollapse" />
<div class="sidebar-plate" aria-hidden="true">
<span>ARCHIVE INDEX</span>
<strong>04 / 12</strong>
</div>
<el-scrollbar wrap-class="scrollbar-wrapper">
<el-menu
:default-active="activeMenu"

View File

@ -1,5 +1,6 @@
<template>
<div id="tags-view-container" class="tags-view-container">
<div class="tags-view-label" aria-hidden="true">OPEN DOSSIERS</div>
<scroll-pane ref="scrollPaneRef" class="tags-view-wrapper" @scroll="handleScroll">
<router-link
v-for="tag in visitedViews"

View File

@ -1,5 +1,5 @@
<template>
<div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme, '--current-color-light': theme + '1a', '--current-color-dark-bg': theme + '33' }">
<div :class="classObj" class="app-wrapper retro-shell" :style="{ '--current-color': theme, '--current-color-light': theme + '1a', '--current-color-dark-bg': theme + '33' }">
<div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
<sidebar v-if="!sidebar.hide" class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
@ -7,6 +7,10 @@
<navbar @setLayout="setLayout" />
<tags-view v-if="needTagsView" />
</div>
<div class="shell-watermark" aria-hidden="true">
<span>CMVR / CONTROL REGISTER</span>
<span>ARCHIVE 04</span>
</div>
<app-main />
<settings ref="settingRef" />
</div>

View File

@ -520,3 +520,665 @@ html.dark .el-loading-mask {
box-shadow: 3px 3px 0 rgba(33, 27, 18, 0.28);
}
}
/* Console shell: a new information architecture for every routed page. */
#app .retro-shell {
--shell-rail: 278px;
background: var(--retro-bg-page);
}
#app .retro-shell .sidebar-container {
top: 14px;
bottom: 14px;
left: 14px;
width: 244px !important;
height: calc(100% - 28px);
border: 3px solid var(--retro-border-strong);
box-shadow: 7px 7px 0 rgba(33, 27, 18, 0.32) !important;
z-index: 1001;
}
#app .retro-shell .sidebar-logo-container {
height: 96px;
line-height: normal;
padding: 19px 18px 14px;
text-align: left;
background: #2d2922 !important;
}
#app .retro-shell .sidebar-logo-container .sidebar-logo-link {
display: flex;
align-items: center;
gap: 12px;
}
#app .retro-shell .sidebar-logo-container .sidebar-logo {
width: 42px;
height: 42px;
margin: 0;
border: 2px solid #d4b46e;
padding: 3px;
background: #fffaf0;
filter: sepia(.3) contrast(1.08);
}
#app .retro-shell .sidebar-logo-container .sidebar-title {
max-width: 156px;
overflow: hidden;
font-size: 17px;
line-height: 1.15;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
}
#app .retro-shell .sidebar-plate {
height: 54px;
padding: 10px 18px 9px;
border-bottom: 1px solid #8e7658;
display: flex;
align-items: center;
justify-content: space-between;
background: #383127;
color: #cdbc9d;
font-family: var(--retro-font-display);
font-size: 10px;
letter-spacing: .08em;
}
#app .retro-shell .sidebar-plate strong {
color: #f3cf7a;
font-size: 14px;
letter-spacing: .03em;
}
#app .retro-shell .sidebar-container.has-logo .el-scrollbar {
height: calc(100% - 150px);
}
#app .retro-shell .sidebar-container .el-menu {
padding: 12px 10px 20px;
background: #3b342a !important;
}
#app .retro-shell .sidebar-container .el-menu-item,
#app .retro-shell .sidebar-container .el-sub-menu__title {
height: 45px;
margin: 3px 0;
padding: 0 13px !important;
border: 1px solid transparent;
border-left: 5px solid transparent;
line-height: 43px;
font-size: 13px;
letter-spacing: .02em;
}
#app .retro-shell .sidebar-container .el-menu-item .svg-icon,
#app .retro-shell .sidebar-container .el-sub-menu__title .svg-icon {
width: 17px;
height: 17px;
margin-right: 12px;
color: #cdbc9d;
}
#app .retro-shell .sidebar-container .el-menu-item:hover,
#app .retro-shell .sidebar-container .el-sub-menu__title:hover {
border-color: #8e7658;
border-left-color: #d4b46e;
background: #514535 !important;
}
#app .retro-shell .sidebar-container .el-menu-item.is-active {
border-color: #8e7658;
border-left-color: #d4b46e;
background: #554a3a !important;
box-shadow: 3px 3px 0 rgba(20, 16, 11, .32);
}
#app .retro-shell .main-container {
margin-left: var(--shell-rail) !important;
background: transparent;
}
#app .retro-shell .fixed-header {
width: calc(100% - var(--shell-rail)) !important;
}
#app .retro-shell .navbar {
height: 76px;
padding-right: 14px;
overflow: hidden;
border-bottom: 3px solid var(--retro-border-strong);
background: #f3e6ca !important;
box-shadow: 0 5px 0 rgba(75, 61, 48, .22) !important;
}
#app .retro-shell .hamburger-container {
width: 58px;
height: 76px;
line-height: 76px;
border-right: 2px solid var(--retro-border-dark);
text-align: center;
}
#app .retro-shell .navbar-context {
min-width: 238px;
height: 76px;
padding: 13px 18px 10px;
display: flex;
flex-direction: column;
justify-content: center;
border-right: 2px solid var(--retro-border-dark);
}
#app .retro-shell .navbar-context__eyebrow {
color: var(--retro-primary-dark);
font-family: var(--retro-font-display);
font-size: 10px;
font-weight: 700;
letter-spacing: .12em;
}
#app .retro-shell .navbar-context strong {
margin-top: 3px;
color: var(--retro-text-primary);
font-family: var(--retro-font-display);
font-size: 18px;
line-height: 1.15;
}
#app .retro-shell .navbar-context code {
margin-top: 3px;
color: var(--retro-text-secondary);
font-family: "Courier New", monospace;
font-size: 10px;
}
#app .retro-shell .breadcrumb-container {
min-width: 0;
margin-left: 18px;
padding-top: 1px;
}
#app .retro-shell .navbar-console-status {
height: 30px;
margin-left: auto;
margin-right: 9px;
padding: 0 10px;
border: 1px solid var(--retro-border-dark);
display: inline-flex;
align-items: center;
gap: 7px;
background: #ead9b7;
color: var(--retro-text-secondary);
font-family: "Courier New", monospace;
font-size: 10px;
letter-spacing: .06em;
white-space: nowrap;
}
#app .retro-shell .navbar-console-status b {
color: var(--retro-success);
font-size: 10px;
}
#app .retro-shell .console-led {
width: 8px;
height: 8px;
border: 1px solid var(--retro-border-strong);
background: #91a257;
box-shadow: 2px 2px 0 rgba(33, 27, 18, .3);
}
#app .retro-shell .right-menu {
height: 76px;
line-height: 76px;
}
#app .retro-shell .right-menu .right-menu-item {
height: 76px;
padding: 0 9px;
border-right: 1px solid rgba(75, 61, 48, .25);
}
#app .retro-shell .right-menu .avatar-container {
margin-right: 0;
padding-left: 13px;
}
#app .retro-shell .right-menu .avatar-wrapper {
margin-top: 18px;
}
#app .retro-shell .right-menu .user-avatar {
width: 38px;
height: 38px;
}
#app .retro-shell .tags-view-container {
height: 44px;
padding: 0 14px;
border-bottom: 2px solid var(--retro-border-strong) !important;
display: flex;
align-items: center;
background: #ded0b0 !important;
box-shadow: 0 4px 0 rgba(75, 61, 48, .16) !important;
}
#app .retro-shell .tags-view-label {
width: 116px;
flex: 0 0 116px;
color: var(--retro-text-secondary);
font-family: var(--retro-font-display);
font-size: 10px;
font-weight: 700;
letter-spacing: .11em;
}
#app .retro-shell .tags-view-wrapper {
min-width: 0;
flex: 1;
height: 44px;
display: flex;
align-items: center;
}
#app .retro-shell .tags-view-wrapper .tags-view-item {
height: 29px;
margin: 0 5px 0 0;
padding: 0 12px;
border: 1px solid var(--retro-border-dark) !important;
line-height: 27px;
background: #f5ead2 !important;
color: var(--retro-text-regular) !important;
box-shadow: 2px 2px 0 rgba(33, 27, 18, .18);
}
#app .retro-shell .tags-view-wrapper .tags-view-item.active {
border-color: var(--retro-border-strong) !important;
background: var(--retro-primary) !important;
color: #fffaf0 !important;
box-shadow: 3px 3px 0 rgba(33, 27, 18, .3);
}
#app .retro-shell .tags-view-wrapper .tags-view-item.active::before {
width: 6px;
height: 6px;
margin-right: 7px;
border: 1px solid #f3cf7a;
background: #f3cf7a !important;
}
#app .retro-shell .app-main {
height: calc(100% - 120px);
padding: 28px 34px 38px;
overflow: auto;
background-color: var(--retro-bg-page) !important;
background-image:
linear-gradient(rgba(122, 103, 79, .1) 1px, transparent 1px),
linear-gradient(90deg, rgba(122, 103, 79, .1) 1px, transparent 1px),
var(--retro-paper-texture);
background-size: 32px 32px, 32px 32px, auto;
}
#app .retro-shell .fixed-header + .app-main,
#app .retro-shell.hasTagsView .fixed-header + .app-main {
padding-top: 28px;
}
#app .retro-shell .shell-watermark {
position: fixed;
right: 24px;
bottom: 9px;
z-index: 3;
display: flex;
gap: 15px;
color: rgba(75, 61, 48, .42);
font-family: "Courier New", monospace;
font-size: 9px;
letter-spacing: .1em;
pointer-events: none;
}
#app .retro-shell .app-container {
position: relative;
min-height: 100%;
padding: 30px 32px 34px;
border: 3px solid var(--retro-border-strong);
background-color: rgba(255, 250, 240, .9);
box-shadow: 7px 7px 0 rgba(33, 27, 18, .24);
}
#app .retro-shell .app-container::before {
content: 'CASE FILE';
position: absolute;
top: -13px;
left: 22px;
padding: 3px 9px;
border: 2px solid var(--retro-border-strong);
background: var(--retro-ochre);
color: #fffaf0;
font-family: "Courier New", monospace;
font-size: 9px;
font-weight: 700;
letter-spacing: .12em;
}
#app .retro-shell .el-card,
#app .retro-shell .el-table,
#app .retro-shell .el-descriptions,
#app .retro-shell .el-collapse,
#app .retro-shell .el-tabs {
background-color: rgba(255, 250, 240, .74);
}
/* Dashboard composition: editorial command board rather than a centered card grid. */
#app .home-dashboard {
max-width: 1680px;
margin: 0 auto;
padding: 4px 4px 46px;
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 0;
}
#app .home-dashboard .hero-panel {
min-height: 318px;
padding: 30px 38px 28px 28px;
display: grid;
grid-template-columns: 96px minmax(0, 1fr) 205px;
align-items: stretch;
gap: 28px;
border-width: 3px;
box-shadow: 8px 8px 0 rgba(33, 27, 18, .38);
}
#app .home-dashboard .hero-spec {
position: relative;
z-index: 1;
padding: 8px 12px 0 0;
border-right: 1px solid rgba(255, 244, 220, .46);
display: flex;
flex-direction: column;
align-items: flex-start;
color: #fff4dc;
}
#app .home-dashboard .hero-spec__label,
#app .home-dashboard .hero-spec__code {
font-family: "Courier New", monospace;
font-size: 9px;
letter-spacing: .12em;
}
#app .home-dashboard .hero-spec strong {
margin: 26px 0 3px;
font-family: var(--retro-font-display);
font-size: 31px;
letter-spacing: .03em;
}
#app .home-dashboard .hero-spec i {
width: 37px;
height: 2px;
margin: 18px 0 13px;
background: #d7b35f;
}
#app .home-dashboard .hero-spec small {
color: rgba(255, 244, 220, .7);
font-family: "Courier New", monospace;
font-size: 9px;
line-height: 1.5;
}
#app .home-dashboard .hero-content {
align-self: center;
}
#app .home-dashboard .hero-content h1 {
max-width: 670px;
font-size: 36px;
}
#app .home-dashboard .hero-time {
justify-content: center;
align-items: flex-start;
border-left: 1px solid rgba(255, 244, 220, .46);
border-right: 0;
}
#app .home-dashboard .dashboard-rule {
min-height: 44px;
display: flex;
align-items: center;
gap: 15px;
color: var(--retro-text-secondary);
font-family: "Courier New", monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: .12em;
}
#app .home-dashboard .dashboard-rule i {
height: 1px;
flex: 1;
background: var(--retro-border-dark);
}
#app .home-dashboard .dashboard-rule b {
color: var(--retro-primary-dark);
font-size: 10px;
}
#app .home-dashboard .overview-section {
padding: 13px 0 24px;
display: grid;
grid-template-columns: 178px minmax(0, 1fr);
align-items: start;
gap: 24px;
}
#app .home-dashboard .overview-section .section-heading {
display: block;
margin: 0;
padding: 11px 16px 12px 0;
border-right: 2px solid var(--retro-border-dark);
}
#app .home-dashboard .overview-section .refresh-button {
margin-top: 24px;
}
#app .home-dashboard .metric-grid {
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
}
#app .home-dashboard .metric-card {
min-height: 142px;
padding: 17px 14px;
align-items: flex-start;
flex-direction: column;
gap: 11px;
}
#app .home-dashboard .metric-content {
width: 100%;
}
#app .home-dashboard .metric-content strong {
font-size: 32px;
}
#app .home-dashboard .workspace-grid {
grid-template-columns: minmax(0, 1.35fr) minmax(320px, .65fr);
gap: 18px;
margin-bottom: 18px;
}
#app .home-dashboard .dashboard-panel {
padding: 22px 20px;
border-width: 3px;
box-shadow: 5px 5px 0 rgba(33, 27, 18, .24);
}
#app .home-dashboard .capability-panel {
background: #e8ddc5;
}
#app .home-dashboard .feature-grid {
grid-template-columns: 1fr;
gap: 7px;
}
#app .home-dashboard .feature-item {
min-height: 62px;
border-width: 2px;
background: #f8eed9;
}
#app .home-dashboard .recent-list {
grid-template-columns: repeat(3, minmax(0, 1fr));
column-gap: 24px;
}
@media (max-width: 1200px) {
#app .retro-shell .navbar-context {
min-width: 190px;
}
#app .home-dashboard .metric-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
#app .home-dashboard .workspace-grid {
grid-template-columns: 1fr;
}
#app .home-dashboard .recent-list {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 768px) {
#app .retro-shell.mobile.hideSidebar .sidebar-container {
transform: translate3d(-270px, 0, 0) !important;
}
#app .retro-shell.mobile.openSidebar .sidebar-container {
transform: translate3d(0, 0, 0) !important;
}
#app .retro-shell .sidebar-container {
top: 0;
bottom: 0;
left: 0;
height: 100%;
}
#app .retro-shell .main-container,
#app .retro-shell.hideSidebar .main-container {
margin-left: 0 !important;
}
#app .retro-shell .fixed-header,
#app .retro-shell.hideSidebar .fixed-header {
width: 100% !important;
}
#app .retro-shell .navbar-context {
min-width: 0;
padding-left: 12px;
border-right: 0;
}
#app .retro-shell .navbar-context__eyebrow,
#app .retro-shell .navbar-context code,
#app .retro-shell .navbar-console-status {
display: none;
}
#app .retro-shell .navbar-context strong {
font-size: 16px;
}
#app .retro-shell .breadcrumb-container {
display: none;
}
#app .retro-shell .right-menu .right-menu-item {
padding: 0 5px;
}
#app .retro-shell .tags-view-label {
display: none;
}
#app .retro-shell .app-main {
height: calc(100% - 120px);
padding: 19px 14px 30px;
}
#app .retro-shell .app-container {
padding: 24px 16px 28px;
}
#app .home-dashboard .hero-panel {
min-height: 0;
padding: 20px 18px;
grid-template-columns: 1fr;
gap: 13px;
}
#app .home-dashboard {
display: block;
}
#app .home-dashboard .hero-panel {
height: auto !important;
margin-bottom: 0;
}
#app .home-dashboard .hero-spec {
min-height: 76px;
padding: 0 0 12px;
border-right: 0;
border-bottom: 1px solid rgba(255, 244, 220, .46);
display: grid;
grid-template-columns: auto auto 1fr;
align-items: center;
column-gap: 11px;
}
#app .home-dashboard .hero-spec strong {
margin: 0;
font-size: 26px;
}
#app .home-dashboard .hero-spec i,
#app .home-dashboard .hero-spec small {
display: none;
}
#app .home-dashboard .hero-time {
padding: 13px 0 0;
border-top: 1px solid rgba(255, 244, 220, .46);
border-left: 0;
}
#app .home-dashboard .overview-section {
grid-template-columns: 1fr;
gap: 8px;
}
#app .home-dashboard .overview-section .section-heading {
border-right: 0;
border-bottom: 2px solid var(--retro-border-dark);
}
#app .home-dashboard .metric-grid,
#app .home-dashboard .recent-list {
grid-template-columns: 1fr;
}
}

View File

@ -1,6 +1,13 @@
<template>
<div class="home-dashboard">
<section class="hero-panel">
<div class="hero-spec" aria-hidden="true">
<span class="hero-spec__label">FIELD MANUAL</span>
<strong>CMVR</strong>
<span class="hero-spec__code">BID / 04</span>
<i></i>
<small>TEST OPERATIONS<br />CONTROL DESK</small>
</div>
<div class="hero-content">
<div class="platform-state">
<span class="state-dot"></span>
@ -29,6 +36,12 @@
</div>
</section>
<div class="dashboard-rule" aria-hidden="true">
<span>OPERATING REGISTER</span>
<i></i>
<b>LIVE / 04</b>
</div>
<section class="overview-section" aria-labelledby="overview-title">
<div class="section-heading">
<div>