You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/src/assets/styles/sidebar.scss

1565 lines
40 KiB
SCSS

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#app {
.main-container {
height: calc(100% - 50px);
transition: margin-left 0.28s;
margin-left: $base-sidebar-width;
position: relative;
}
.sidebarHide {
margin-left: 0 !important;
}
.sidebar-container {
-webkit-transition: width 0.28s;
transition: width 0.28s;
width: 239px !important;
background: url("../images/sidebar-background.webp") no-repeat center;
// background-color: $base-menu-background;
background-size: 100% 100%;
height: 100%;
position: fixed;
font-size: 0px;
top: -8px;
bottom: 0;
left: 0;
z-index: 1001;
overflow: hidden;
-webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
// reset element-ui css
.horizontal-collapse-transition {
transition:
0s width ease-in-out,
0s padding-left ease-in-out,
0s padding-right ease-in-out;
}
.scrollbar-wrapper {
overflow-x: hidden !important;
}
.el-scrollbar__bar.is-vertical {
right: 0px;
}
.el-scrollbar {
height: 100%;
}
&.has-logo {
.el-scrollbar {
height: calc(100% - 50px);
}
}
.is-horizontal {
display: none;
}
a {
display: inline-block;
width: 100%;
overflow: hidden;
}
.svg-icon {
margin-right: 16px;
}
.el-menu {
border: none;
height: 100%;
width: 100% !important;
background-color: transparent !important;
padding: 25px 18px;
.el-sub-menu {
margin-bottom: 15px !important;
.el-sub-menu__title {
height: 37px;
line-height: 37px;
background: url("../images/sidebar-normal.png") no-repeat;
background-size: 100% 100% !important;
}
.el-menu {
padding: 1px 18px !important;
.el-menu-item {
min-width: 100% !important;
height: 30px;
color: #fff;
padding-left: 4px;
background: transparent !important;
margin-bottom: 0px;
&:hover {
background: transparent !important;
}
}
}
}
.is-opened {
margin-bottom: 0px !important;
}
.el-menu-item {
display: flex;
align-items: center;
margin-bottom: 20px;
height: 37px;
line-height: 37px;
color: #fff;
background: url("../images/sidebar-normal.png") no-repeat;
background-size: 100% 100% !important;
}
.is-active {
background: url("../images/sidebar-active.png") no-repeat !important;
.el-menu {
.nest-menu {
.is-active {
color: #008efe !important;
}
}
}
.el-sub-menu__title {
background: url("../images/sidebar-active.png") no-repeat !important;
background-size: 100% 100% !important;
}
}
}
.el-menu-item,
.menu-title {
// overflow: hidden !important;
// text-overflow: ellipsis !important;
// white-space: nowrap !important;
}
.el-menu-item .el-menu-tooltip__trigger {
display: inline-block !important;
}
// menu hover
.sub-menu-title-noDropdown,
.el-sub-menu__title {
&:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
}
}
& .theme-dark .is-active > .el-sub-menu__title {
color: $base-menu-color-active !important;
}
& .nest-menu .el-sub-menu > .el-sub-menu__title,
& .el-sub-menu .el-menu-item {
min-width: $base-sidebar-width !important;
&:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
}
}
& .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title,
& .theme-dark .el-sub-menu .el-menu-item {
background-color: $base-sub-menu-background !important;
&:hover {
background-color: $base-sub-menu-hover !important;
}
}
}
.hideSidebar {
.sidebar-container {
width: 54px !important;
}
.main-container {
margin-left: 54px;
}
.sub-menu-title-noDropdown {
padding: 0 !important;
position: relative;
.el-tooltip {
padding: 0 !important;
.svg-icon {
margin-left: 20px;
}
}
}
.el-sub-menu {
overflow: hidden;
& > .el-sub-menu__title {
padding: 0 !important;
.svg-icon {
margin-left: 20px;
}
}
}
.el-menu--collapse {
.el-sub-menu {
& > .el-sub-menu__title {
& > span {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
& > i {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
}
}
}
}
.el-menu--collapse .el-menu .el-sub-menu {
min-width: $base-sidebar-width !important;
}
// mobile responsive
.mobile {
.main-container {
margin-left: 0px;
}
.sidebar-container {
transition: transform 0.28s;
width: $base-sidebar-width !important;
}
&.hideSidebar {
.sidebar-container {
pointer-events: none;
transition-duration: 0.3s;
transform: translate3d(-$base-sidebar-width, 0, 0);
}
}
}
.withoutAnimation {
.main-container,
.sidebar-container {
transition: none;
}
}
/* 纯顶部导航模式(超管/校管,不渲染侧边栏):清除侧边菜单默认宽度的占位 */
/* 需压过 #app .teacherLayout .main-container 的 margin-left:180px !important(位置更靠后),用双类提权 */
.topNavbarOnly.teacherLayout .main-container,
.topNavbarOnly .main-container {
margin-left: 0 !important;
}
/* 超管端主区域:与教师端一致改浅色(body.teacher-light-mode 时),保留暗色作为无亮色主题时的兜底 */
.platform-admin-main {
height: calc(100vh - 50px);
overflow: auto !important;
background: radial-gradient(circle at 12% 18%, rgba(14, 74, 112, 0.45), transparent 34%), radial-gradient(circle at 78% 6%, rgba(25, 92, 170, 0.3), transparent 28%), linear-gradient(135deg, #03070e 0%, #061827 48%, #02060d 100%) !important;
&::-webkit-scrollbar {
width: 5px;
height: 5px;
}
&::-webkit-scrollbar-track {
background: #111a24;
border-radius: 10px;
}
&::-webkit-scrollbar-thumb {
background: #2d8fcf;
border-radius: 10px;
}
}
/* @at-root 跳出 #app 并提升特异性(压过 #app .platform-admin-main 的 ID 权重深色规则) */
@at-root body.teacher-light-mode #app .platform-admin-main {
// 纯白画布,与教师端/学生端亮色体系一致(禁渐变、禁浅灰底)
background: #ffffff !important;
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: #d1d5db;
&:hover {
background: #9ca3af;
}
}
}
.studentLayout,
.teacherLayout {
background: radial-gradient(circle at 10% 20%, rgba(11, 42, 74, 0.74), transparent 34%), radial-gradient(circle at 88% 8%, rgba(0, 136, 210, 0.24), transparent 28%), linear-gradient(135deg, #02050c 0%, #07101d 52%, #02060d 100%);
.main-container {
margin-left: 304px;
background: radial-gradient(circle at 10% 20%, rgba(11, 42, 74, 0.72), transparent 34%), radial-gradient(circle at 88% 8%, rgba(0, 136, 210, 0.22), transparent 28%), linear-gradient(135deg, #02050c 0%, #07101d 52%, #02060d 100%);
}
.app-main,
.teacher-main {
height: calc(100vh - 50px);
padding: 28px 32px 40px 24px;
overflow: auto;
background: radial-gradient(circle at 12% 18%, rgba(14, 74, 112, 0.45), transparent 34%), radial-gradient(circle at 78% 6%, rgba(25, 92, 170, 0.3), transparent 28%), linear-gradient(135deg, #03070e 0%, #061827 48%, #02060d 100%) !important;
&::-webkit-scrollbar {
width: 5px;
height: 5px;
}
&::-webkit-scrollbar-track {
background: #111a24;
border-radius: 10px;
}
&::-webkit-scrollbar-thumb {
background: #2d8fcf;
border-radius: 10px;
}
}
.sidebar-container {
top: 50px;
width: 304px !important;
height: calc(100% - 50px);
padding: 0;
background: transparent !important;
border-right: 0;
box-shadow: none;
overflow: hidden;
&::before {
display: none;
}
&.student-sidebar-shell {
position: fixed;
z-index: 1;
height: calc(100% - 50px);
background: transparent !important;
}
.student-sidebar-scroll {
height: 100%;
}
.scrollbar-wrapper {
overflow-x: hidden !important;
}
.student-course-nav {
width: calc(100% - 40px);
min-height: calc(100% - 56px);
margin: 28px 20px;
padding: 24px 16px 28px;
border: 1px solid rgba(0, 180, 255, 0.25);
border-radius: 32px;
background: rgba(8, 18, 28, 0.7);
box-shadow:
0 22px 48px rgba(0, 0, 0, 0.22),
inset 0 1px 0 rgba(169, 229, 255, 0.08);
backdrop-filter: blur(12px);
}
.student-course-heading {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
min-height: 22px;
margin: 0 0 14px;
border: 0;
padding: 0 6px;
line-height: 1.35;
text-align: left;
color: #7e9fc5;
background: transparent;
font-family: inherit;
font-size: 12px;
font-weight: 800;
letter-spacing: 1.6px;
text-transform: uppercase;
white-space: normal;
cursor: pointer;
transition: color 0.2s ease;
}
.student-course-heading:hover,
.student-course-heading.active {
color: #c9edff;
}
.student-course-list {
margin: 0 0 28px;
}
.student-course-link {
position: relative;
display: flex;
align-items: center;
gap: 10px;
width: 100%;
min-height: 42px;
margin: 0 0 8px;
border: 1px solid transparent;
border-radius: 18px;
padding: 10px 14px 10px 16px;
line-height: 1.4;
text-align: left;
color: #d7e9ff;
background: rgba(255, 255, 255, 0.025);
font-family: inherit;
font-size: 15px;
font-weight: 700;
letter-spacing: 0;
white-space: normal;
overflow: hidden;
cursor: pointer;
transition:
color 0.2s ease,
transform 0.2s ease,
border-color 0.2s ease,
background 0.2s ease,
box-shadow 0.2s ease;
}
.student-course-icon {
position: relative;
z-index: 1;
display: inline-flex;
flex: 0 0 auto;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
border: 1px solid rgba(0, 170, 255, 0.26);
border-radius: 10px;
color: #7ee9ff;
background: linear-gradient(135deg, rgba(0, 170, 255, 0.24), rgba(43, 110, 255, 0.08)), rgba(1, 24, 36, 0.82);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.08),
0 0 10px rgba(0, 170, 255, 0.08);
svg {
width: 15px;
height: 15px;
}
}
.student-course-icon--heading {
width: 22px;
height: 22px;
border-radius: 9px;
color: #9defff;
background: rgba(0, 132, 198, 0.18);
svg {
width: 13px;
height: 13px;
}
}
.student-course-text {
min-width: 0;
flex: 1;
}
.student-course-link:hover,
.student-course-link.active {
color: #ffffff;
border-color: rgba(0, 170, 255, 0.72);
background: linear-gradient(95deg, rgba(0, 160, 255, 0.2), rgba(0, 100, 200, 0.1));
box-shadow: 0 2px 14px rgba(0, 170, 255, 0.18);
transform: translateX(3px);
}
.student-course-link.active {
border-left: 3px solid #00aaff;
}
.student-course-link.disabled {
cursor: default;
}
.student-report-button {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
width: calc(100% - 28px);
min-height: 44px;
margin: 18px 14px 0;
border: 1px solid rgba(0, 170, 255, 0.65);
border-radius: 40px;
line-height: 42px;
text-align: center;
color: #caf0ff;
background: rgba(0, 160, 255, 0.15);
font-family: inherit;
font-size: 14px;
font-weight: 800;
cursor: pointer;
transition:
background 0.2s ease,
box-shadow 0.2s ease;
&:hover,
&.active {
color: #ffffff;
background: rgba(0, 170, 255, 0.26);
box-shadow: 0 0 14px rgba(34, 183, 237, 0.32);
}
}
}
}
.mobile.studentLayout,
.mobile.teacherLayout {
.main-container {
margin-left: 0;
}
.sidebar-container {
width: 304px !important;
}
&.hideSidebar {
.sidebar-container {
transform: translate3d(-304px, 0, 0);
}
}
}
.teacherLayout {
.sidebar-container {
border-right: 1px solid rgba(0, 180, 255, 0.24);
&::after {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
z-index: 3;
width: 1px;
background: linear-gradient(180deg, rgba(81, 211, 255, 0.38), rgba(81, 211, 255, 0.18) 45%, rgba(81, 211, 255, 0.28));
pointer-events: none;
}
.student-sidebar-scroll,
.el-scrollbar__wrap,
.el-scrollbar__view {
height: 100%;
}
.el-scrollbar__bar.is-vertical {
right: 4px;
opacity: 0;
transition: opacity 0.2s ease;
}
&:hover .el-scrollbar__bar.is-vertical {
opacity: 1;
}
.student-course-nav {
width: 100%;
height: 100%;
min-height: 100%;
margin: 0;
padding: 28px 20px;
box-sizing: border-box;
border: 0;
border-radius: 0;
background: radial-gradient(circle at 18% 10%, rgba(0, 170, 255, 0.12), transparent 34%), rgba(8, 18, 28, 0.82);
box-shadow:
inset -1px 0 0 rgba(169, 229, 255, 0.06),
12px 0 32px rgba(0, 5, 16, 0.2);
}
.student-course-list {
margin-bottom: 0;
}
.student-course-link {
min-height: 46px;
margin-bottom: 10px;
}
.course-sidebar-toggle {
position: absolute;
top: 14px;
right: 14px;
z-index: 8;
display: grid;
width: 32px;
height: 32px;
place-items: center;
border: 1px solid rgba(89, 218, 255, 0.5);
border-radius: 9px;
color: #dff8ff;
background: rgba(5, 54, 83, 0.84);
box-shadow: 0 0 14px rgba(0, 170, 255, 0.15);
font-size: 24px;
line-height: 1;
cursor: pointer;
transition:
background 0.2s ease,
border-color 0.2s ease,
transform 0.2s ease;
&:hover {
border-color: #70e4ff;
background: rgba(11, 116, 160, 0.8);
transform: translateX(1px);
}
}
}
&.hideSidebar {
.sidebar-container {
width: 64px !important;
.student-course-nav {
padding: 58px 10px 24px;
}
.student-course-heading,
.student-course-link {
justify-content: center;
padding-right: 0;
padding-left: 0;
}
.student-course-heading {
margin-bottom: 14px;
}
.student-course-link {
min-height: 42px;
margin-bottom: 10px;
}
.student-course-text {
display: none;
}
.course-sidebar-toggle {
right: 16px;
transform: none;
}
}
.main-container {
margin-left: 64px;
}
}
}
/* 仅学生实训任务页提供课程导航的图标轨道,离开任务页不改变原有学生布局。 */
.studentLayout:has(.student-training-shell) {
.sidebar-container {
border-right: 1px solid rgba(0, 180, 255, 0.24);
.student-course-nav {
margin: 20px;
}
.course-sidebar-toggle {
position: absolute;
top: 28px;
right: 28px;
z-index: 8;
display: grid;
width: 32px;
height: 32px;
place-items: center;
border: 1px solid rgba(89, 218, 255, 0.5);
border-radius: 9px;
color: #dff8ff;
background: rgba(5, 54, 83, 0.84);
box-shadow: 0 0 14px rgba(0, 170, 255, 0.15);
font-size: 24px;
line-height: 1;
cursor: pointer;
transition:
background 0.2s ease,
border-color 0.2s ease,
transform 0.2s ease;
&:hover,
&:focus-visible {
border-color: #70e4ff;
outline: none;
background: rgba(11, 116, 160, 0.8);
transform: translateX(1px);
}
}
}
&.hideSidebar {
.sidebar-container {
width: 64px !important;
.student-course-nav {
box-sizing: border-box;
width: 100%;
min-height: 100%;
margin: 0;
padding: 58px 11px 24px;
border: 0;
border-radius: 0;
background: linear-gradient(180deg, rgba(8, 31, 47, 0.92), rgba(3, 16, 28, 0.98));
box-shadow: inset -1px 0 0 rgba(132, 228, 255, 0.1);
}
.student-course-heading,
.student-course-link {
box-sizing: border-box;
width: 42px;
justify-content: center;
padding-right: 0;
padding-left: 0;
}
/* 分类名收起后没有辨识价值,保留具有页面入口的标题按钮。 */
div.student-course-heading {
display: none;
}
.student-course-heading {
min-height: 42px;
margin: 0 0 10px;
}
.student-course-link {
min-height: 42px;
margin: 0 0 8px;
border-radius: 13px;
background: rgba(255, 255, 255, 0.025);
}
.student-course-list {
margin: 0 0 10px;
}
.student-course-text {
display: none;
}
.student-course-icon {
width: 27px;
height: 27px;
}
.student-course-link.active {
border: 1px solid rgba(0, 190, 255, 0.85);
background: linear-gradient(135deg, rgba(0, 174, 255, 0.28), rgba(18, 95, 190, 0.14));
box-shadow: 0 0 14px rgba(0, 178, 255, 0.25);
transform: none;
}
.course-sidebar-toggle {
top: 12px;
right: 16px;
transform: none;
}
}
.main-container {
margin-left: 64px;
}
}
}
}
// when menu collapsed
.el-menu--vertical {
& > .el-menu {
.svg-icon {
margin-right: 16px;
}
}
.nest-menu .el-sub-menu > .el-sub-menu__title,
.el-menu-item {
&:hover {
// you can use $sub-menuHover
background-color: rgba(0, 0, 0, 0.06) !important;
}
}
// the scroll bar appears when the sub-menu is too long
> .el-menu--popup {
max-height: 100vh;
overflow-y: auto;
&::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
}
}
/*
* 学生端 + 教师端共用亮色主题覆盖
* 取代 #app .studentLayout, #app .teacherLayout 共享的暗色背景(L274-411)
* 超管端 (role 1) 走独立深色路径:#app .platform-admin-main (L250-272)
*/
#app .studentLayout,
#app .teacherLayout {
// 整体浅色背景 + 蓝色点缀,营造明亮的科技感
background: radial-gradient(circle at 10% 20%, rgba(30, 136, 229, 0.07), transparent 34%), radial-gradient(circle at 88% 8%, rgba(66, 165, 245, 0.05), transparent 28%), linear-gradient(135deg, #f5f8fc 0%, #eaf2fb 52%, #f3f8ff 100%) !important;
.main-container {
background: radial-gradient(circle at 10% 20%, rgba(30, 136, 229, 0.06), transparent 34%), radial-gradient(circle at 88% 8%, rgba(66, 165, 245, 0.04), transparent 28%), linear-gradient(135deg, #f5f8fc 0%, #eaf2fb 52%, #f3f8ff 100%) !important;
}
.app-main,
.teacher-main {
background: radial-gradient(circle at 12% 18%, rgba(30, 136, 229, 0.05), transparent 34%), radial-gradient(circle at 78% 6%, rgba(66, 165, 245, 0.04), transparent 28%), linear-gradient(135deg, #f7fafd 0%, #eef4fb 48%, #f5f8fc 100%) !important;
&::-webkit-scrollbar {
width: 6px;
height: 6px;
}
&::-webkit-scrollbar-track {
background: rgba(30, 60, 100, 0.06);
border-radius: 10px;
}
&::-webkit-scrollbar-thumb {
background: rgba(30, 136, 229, 0.35);
border-radius: 10px;
&:hover {
background: rgba(30, 136, 229, 0.55);
}
}
}
// 侧边栏整体:纯白极简(Stripe/Linear 风),右侧 1px 灰线,无玻璃无发光
.sidebar-container {
border-right: 1px solid #e5e7eb !important;
background: #ffffff !important;
box-shadow: none !important;
&::after {
display: none !important;
}
// 教师端导航容器:透明,交给容器白底
.student-course-nav {
background: transparent !important;
box-shadow: none !important;
backdrop-filter: none !important;
}
// 分组标题:小号灰字
.student-course-heading {
color: #9ca3af !important;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.02em;
&:hover,
&.active {
color: #6b7280 !important;
}
}
// 菜单项:默认透明无边框;hover 中性灰;激活淡蓝平底 + 细指示条
.student-course-link {
color: #374151 !important;
background: transparent !important;
border: none !important;
border-radius: 6px !important;
box-shadow: none !important;
// 连续列表风:小间距贴边排列,压过共用区 8px 胶囊悬浮间距
margin: 0 0 2px !important;
min-height: 40px !important;
padding: 0 12px !important;
transition:
background-color 0.15s ease,
color 0.15s ease;
&:hover {
color: #1f2937 !important;
background: #f5f7fa !important;
}
// 激活:无渐变、无发光;2px 短指示条(Stripe 式)+ 蓝字 + 蓝色软底
&.active {
color: #2563eb !important;
font-weight: 600;
background: #eff6ff !important;
border-left: none !important;
position: relative;
&::before {
content: "";
position: absolute;
left: 0;
top: 22%;
bottom: 22%;
width: 2px;
border-radius: 1px;
background: #2563eb;
}
}
}
// 图标容器:透明无边框,颜色跟随菜单文字
.student-course-icon {
color: inherit !important;
border-color: transparent !important;
background: transparent !important;
box-shadow: none !important;
&--heading {
color: #9ca3af !important;
background: transparent !important;
}
}
// 报告按钮(如有):白底灰边 ghost
.student-report-button {
color: #374151 !important;
background: #ffffff !important;
border-color: #e5e7eb !important;
&:hover,
&.active {
color: #2563eb !important;
background: #eff6ff !important;
border-color: rgba(37, 99, 235, 0.35) !important;
}
}
// 折叠把手:贴侧边栏右缘、垂直居中的极小竖条(全 !important 压过旧深色块)
.course-sidebar-toggle {
position: absolute !important;
top: 50% !important;
right: 0 !important;
transform: translateY(-50%) !important;
z-index: 8;
display: flex !important;
align-items: center !important;
justify-content: center !important;
box-sizing: border-box !important;
width: 14px !important;
height: 44px !important;
padding: 0 !important;
border: 1px solid #e5e7eb !important;
border-right: 0 !important;
border-radius: 8px 0 0 8px !important;
background: #ffffff !important;
color: #9ca3af !important;
box-shadow: -2px 0 6px rgba(17, 24, 39, 0.08) !important;
cursor: pointer;
transition:
background-color 0.15s ease,
color 0.15s ease;
.toggle-arrow {
font-size: 10px;
}
.toggle-arrow--right {
display: none;
}
&:hover,
&:focus-visible {
background: #1f2937 !important;
color: #ffffff !important;
outline: none;
}
}
}
// 折叠态:左箭头隐藏、右箭头显示(与 .sidebar-container 同级,避免嵌套出双容器)
.sidebar-container.is-collapse .course-sidebar-toggle {
.toggle-arrow--left {
display: none;
}
.toggle-arrow--right {
display: inline-flex;
}
}
}
/*
* 教师端 sidebar 宽度单独缩减 50%(304 → 152px)
* 教师端使用 el-menu 直显式布局,无需学生端的内嵌卡片空间,原 304px 造成大量空白
* 学生端保持 304px 不变(内部 .student-course-nav 卡片需要空间)
* 同时隐藏教师端唯一的分组标题"教学管理"(标识),仅保留菜单项
*/
#app .teacherLayout {
.main-container {
margin-left: 180px !important;
}
// 收起后侧边栏仅保留 64px 图标轨道,主内容同步释放展开态的空间。
&.hideSidebar .main-container {
margin-left: 64px !important;
}
.sidebar-container {
width: 180px !important;
}
// 隐藏教师端顶部分组标题("教学管理"标识),不影响学生端多分组标题
.student-course-nav > .student-course-heading {
display: none !important;
}
}
/*
* 学生端 + 教师端实训页背景覆盖
* student-training.scss 中 .student-training-shell 的暗色背景统一覆盖为亮色
*/
#app .studentLayout .app-main:has(.student-training-shell),
#app .teacherLayout .app-main:has(.student-training-shell) {
background: linear-gradient(135deg, #f5f8fc 0%, #eaf2fb 52%, #f3f8ff 100%) !important;
}
#app .studentLayout .app-main:has(.student-training-shell) .student-training-shell,
#app .teacherLayout .app-main:has(.student-training-shell) .student-training-shell {
background: transparent !important;
}
/* ========================================================================
* 学生端课程菜单(role 4)教育蓝极简主题
* 1) 仅命中 .is-student-nav,教师端 teacherLayout 不受影响
* 2) 置于文件末尾,选择器多出一个 .is-student-nav 类,覆盖前文共享亮色块
* 3) 风格:白底 + 教育蓝 Stripe 激活(浅蓝底 + 蓝字 + 左侧 3px 蓝条)
* ====================================================================== */
#app .studentLayout {
.sidebar-container.is-student-nav {
background: #ffffff !important;
border-right: 1px solid #e5e7eb !important;
box-shadow: none !important;
&::after {
display: none !important;
}
/* 清除遗留背景图:sidebar-normal.png / sidebar-active.png / sidebar-background.webp
这些 !important 老规则在 L15/L75/L103/L107 会给 li/sub-menu-title/menu-item
贴蓝底图,必须在此逐层 !important 覆盖。注意只清 background-image,
不要写 background: transparent !important 否则会和 .is-active 的
background-color: #f3f4f6 !important 发生 specificity 竞争 */
.el-menu {
background-color: transparent !important;
background-image: none !important;
}
.el-sub-menu {
background-color: transparent !important;
background-image: none !important;
&.is-active,
&.is-opened {
background-color: transparent !important;
background-image: none !important;
}
.el-sub-menu__title {
background-color: transparent !important;
background-image: none !important;
}
}
.el-menu-item {
background-image: none !important;
&.is-active {
background-image: none !important;
}
}
.student-sidebar-scroll,
.el-scrollbar__wrap,
.el-scrollbar__view {
height: 100%;
}
/* 侧边栏滚动条中性化 */
.el-scrollbar__wrap {
&::-webkit-scrollbar {
width: 5px;
}
&::-webkit-scrollbar-track {
background: transparent;
}
&::-webkit-scrollbar-thumb {
background: #d1d5db;
border-radius: 10px;
}
&::-webkit-scrollbar-thumb:hover {
background: #9ca3af;
}
}
.el-scrollbar__bar.is-vertical {
right: 4px;
opacity: 0;
transition: opacity 0.2s ease;
}
&:hover .el-scrollbar__bar.is-vertical {
opacity: 1;
}
}
/* el-menu 菜单容器:白底、紧凑行高 */
.sidebar-container.is-student-nav .student-course-menu {
box-sizing: border-box;
width: 100%;
border-right: 0;
background: #ffffff;
padding: 12px 10px;
--el-menu-item-height: 46px;
--el-menu-sub-item-height: 46px;
}
/* 侧栏 Logo 标题(Logo.vue scoped 写死 14px,此处仅学生端放大一档) */
.sidebar-container.is-student-nav .sidebar-title {
font-size: var(--student-fs-body);
}
/* 一级行(直跳项 / 分组标题):教育蓝极简文字行,白底深灰字。
EP 会给 title 绑内联 color/background,必须 !important 才能覆盖。
一级用最深字色 + 700 加粗 + 15px,与二级(浅灰 14px/400)拉开层级 */
.student-course-menu > li.el-menu-item,
.student-course-menu > li.el-sub-menu > .el-sub-menu__title {
position: relative;
height: 44px;
line-height: 44px;
margin: 10px 0 2px;
border-radius: 6px;
color: #1f2937 !important;
font-size: var(--student-fs-body);
font-weight: 700;
letter-spacing: 0.01em;
background: transparent !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transition:
background-color 0.15s ease,
color 0.15s ease;
.student-menu-icon {
color: #1f2937 !important;
transition: color 0.15s ease;
}
&:hover,
&:focus {
color: #1f2937 !important;
background: #f9fafb !important;
outline: none;
.student-menu-icon {
color: #1f2937 !important;
}
}
}
/* 直跳一级项(AI 智能助手)收紧上边距,贴顶无空隙 */
.student-course-menu > li.el-menu-item:first-child,
.student-course-menu > li.el-sub-menu:first-child > .el-sub-menu__title {
margin-top: 0;
}
/* 一级直跳项激活(如 AI 智能助手 = 当前路由叶子):中性灰底胶囊 + 近黑粗体 + 蓝图标。
不用蓝底色块(AI 味),不用左条墨标(太碎),用 Notion 式灰底 + 字重 + 图标色三重信号 */
.student-course-menu > li.el-menu-item.is-active {
color: #111827 !important;
font-weight: 700;
background: #f3f4f6 !important;
box-shadow: none;
.student-menu-icon {
color: #2563eb !important;
}
&:hover,
&:focus {
color: #111827 !important;
background: #e5e7eb !important;
.student-menu-icon {
color: #2563eb !important;
}
}
}
/* 一级分组标题含激活子项:仅蓝字 + 蓝图标,不加底色 ——
只指示「你在这个分区」,完整高亮留给当前路由叶子项 */
.student-course-menu > li.el-sub-menu.is-active > .el-sub-menu__title {
color: #2563eb !important;
font-weight: 700;
background: transparent !important;
box-shadow: none;
.student-menu-icon {
color: #2563eb !important;
}
&:hover,
&:focus {
color: #2563eb !important;
background: #f9fafb !important;
.student-menu-icon {
color: #2563eb !important;
}
}
}
/* 二级分组标题含激活子项(如「消费者需求与行为」内含三级路由):
同样仅蓝字 + 蓝图标,不加底色 */
.sidebar-container.is-student-nav .el-sub-menu .el-sub-menu.is-active > .el-sub-menu__title {
color: #2563eb !important;
font-weight: 600;
background: transparent !important;
box-shadow: none;
.student-menu-icon {
color: #2563eb !important;
}
&:hover,
&:focus {
color: #2563eb !important;
background: #f9fafb !important;
.student-menu-icon {
color: #2563eb !important;
}
}
}
/* 二级列表展开区:白底 */
.sidebar-container.is-student-nav .el-sub-menu .el-menu {
background: #ffffff;
}
/* 二级菜单项:透明底浅灰字、14px/400、左侧缩进,明显从属于一级分组。
与一级(#1f2937 15px/700)拉开三重对比:字色 / 字号 / 字重。
老规则对嵌套项写了 transparent !important(L80-90),背景必须 !important 才能覆盖 */
.sidebar-container.is-student-nav .el-sub-menu .el-menu-item {
position: relative;
height: 36px;
line-height: 36px;
min-width: auto;
padding-left: 40px !important;
border-radius: 8px;
color: #6b7280;
font-size: var(--student-fs-body-sm);
font-weight: 400;
background: transparent;
transition:
background-color 0.15s ease,
color 0.15s ease;
.student-menu-icon {
color: #9ca3af !important;
font-size: 15px;
margin-right: 8px;
}
&:hover,
&:focus {
background: #f9fafb !important;
color: #1f2937;
outline: none;
.student-menu-icon {
color: #6b7280 !important;
}
}
&.is-active {
background: #f3f4f6 !important;
color: #111827;
font-weight: 600;
box-shadow: none;
.student-menu-icon {
color: #2563eb !important;
}
&:hover {
background: #e5e7eb !important;
color: #111827;
}
}
&.is-disabled,
&.is-disabled:hover {
color: #c0c5cd;
opacity: 1;
background: transparent !important;
cursor: default;
}
}
/* 分组折叠箭头:灰色,hover/激活教育蓝;旋转由组件内置 */
.sidebar-container.is-student-nav .el-sub-menu__icon-arrow {
color: #9ca3af !important;
}
.sidebar-container.is-student-nav .el-sub-menu__title:hover .el-sub-menu__icon-arrow,
.sidebar-container.is-student-nav li.el-sub-menu.is-active .el-sub-menu__icon-arrow {
color: #2563eb !important;
}
/* 菜单图标:16px,与文字间距 8px */
.sidebar-container.is-student-nav .student-menu-icon {
margin-right: 8px;
font-size: 16px;
}
/* 折叠把手沿用共享块的边缘定位(!important);此处仅覆写 hover,
压过旧 .studentLayout:has(.student-training-shell) 蓝色玻璃 hover */
.sidebar-container.is-student-nav .course-sidebar-toggle {
&:hover,
&:focus-visible {
border-color: #2563eb;
background: #2563eb;
color: #ffffff;
outline: none;
}
}
/* 64px 图标轨道模式(el-menu collapse 原生支持,二级以弹出层展示) */
&.hideSidebar .sidebar-container.is-student-nav {
.student-course-menu {
box-sizing: border-box;
width: 64px;
padding: 12px 8px;
}
/* 一级深蓝块在轨道模式下只居中显图标 */
.student-course-menu > li.el-menu-item,
.student-course-menu > li.el-sub-menu > .el-sub-menu__title {
justify-content: center;
padding: 0;
}
.student-menu-icon {
margin-right: 0;
}
/* 恢复折叠模式下 sub-menu title 里的 icon 尺寸 ——
Element Plus 默认把 .hideSidebar 里 sub-menu title 的 <i> 也压成 0 宽高,
但分组标题在折叠轨道模式下仍需显示图标 */
.el-menu--collapse .el-sub-menu > .el-sub-menu__title > i.student-menu-icon {
width: var(--el-menu-icon-width, 24px) !important;
height: var(--el-menu-icon-width, 24px) !important;
overflow: visible !important;
visibility: visible !important;
display: inline-flex !important;
}
}
}
/* ========================================================================
* 学生端 64px 轨道模式:分组二级弹出层(teleport 到 body,脱离 sidebar 作用域)
* 通过 el-sub-menu 的 popper-class="student-menu-popper" 锚定换肤
* ====================================================================== */
.el-popper.student-menu-popper,
.el-menu--popup-container.student-menu-popper {
padding: 6px;
border: 1px solid #e5e7eb;
border-radius: 10px;
box-shadow: 0 6px 20px rgba(17, 24, 39, 0.12);
.el-menu--popup {
padding: 0;
background: #ffffff;
}
.el-menu-item {
position: relative;
height: 36px;
line-height: 36px;
border-radius: 8px;
color: #6b7280;
font-size: var(--student-fs-body-sm);
font-weight: 400;
background: transparent;
transition:
background-color 0.15s ease,
color 0.15s ease;
&:hover,
&:focus {
background: #f9fafb;
color: #1f2937;
outline: none;
}
&.is-active {
background: #f3f4f6;
color: #111827;
font-weight: 600;
box-shadow: none;
&:hover {
background: #e5e7eb;
color: #111827;
}
}
}
}
/* ========================================================================
* 教师端(role 3)极简 SaaS 教育风:纯白画布 + 教育蓝
* 覆盖前文 #app .studentLayout, #app .teacherLayout 共享的浅蓝玻璃块
* 选择器带 .teacherLayout 锚点且置于文件末尾,确保胜出
* ====================================================================== */
#app .teacherLayout {
background: #ffffff !important;
.main-container {
background: #ffffff !important;
}
.app-main,
.teacher-main {
background: #ffffff !important;
&::-webkit-scrollbar-track {
background: transparent !important;
}
&::-webkit-scrollbar-thumb {
background: #d1d5db !important;
}
&::-webkit-scrollbar-thumb:hover {
background: #9ca3af !important;
}
}
// 实训页背景一并收敛为纯白
.app-main:has(.student-training-shell) {
background: #ffffff !important;
}
.sidebar-container {
background: #ffffff !important;
border-right: 1px solid #e5e7eb !important;
box-shadow: none !important;
&::after {
display: none !important;
}
// 导航容器:去掉大圆角玻璃卡片,铺满侧栏
.student-course-nav {
width: 100%;
min-height: 100%;
margin: 0;
padding: 16px 10px;
border: 0;
border-radius: 0;
background: #ffffff !important;
box-shadow: none !important;
backdrop-filter: none;
}
// 分组标题:13px 深灰 700,不再大写拉字距
.student-course-heading {
margin: 0 0 8px;
padding: 0 8px;
color: #1f2937 !important;
font-size: 13px;
font-weight: 700;
letter-spacing: 0;
text-transform: none;
&:hover {
color: #1f2937 !important;
}
}
.student-course-list {
margin: 0 0 16px;
}
// 菜单项:纯文字行、38px 高、8px 圆角
.student-course-link {
min-height: 38px;
margin: 0 0 4px;
padding: 0 10px;
border: 0 !important;
border-radius: 8px !important;
color: #4b5563 !important;
background: transparent !important;
font-size: 13px;
font-weight: 400;
&:hover {
color: #1f2937 !important;
background: #f3f4f6 !important;
box-shadow: none !important;
transform: none !important;
}
// 激活:教育蓝浅底 + 蓝字 + 左侧 3px 蓝条
&.active {
color: #3b82f6 !important;
background: #eff6ff !important;
box-shadow: inset 3px 0 0 #3b82f6;
}
&.disabled {
color: #c0c5cd !important;
background: transparent !important;
}
}
// 图标:透明底灰图标,hover/激活变色
.student-course-icon {
width: 24px;
height: 24px;
border: 0 !important;
border-radius: 6px;
color: #9ca3af !important;
background: transparent !important;
box-shadow: none !important;
}
.student-course-icon--heading {
color: #3b82f6 !important;
background: #eff6ff !important;
}
.student-course-link:hover .student-course-icon {
color: #4b5563 !important;
}
.student-course-link.active .student-course-icon {
color: #3b82f6 !important;
}
}
}