| | |
| | | #app { |
| | | .main-container { |
| | | min-height: 100%; |
| | | transition: margin-left 0.28s; |
| | | margin-left: $base-sidebar-width; |
| | | min-height: 100vh; |
| | | margin-left: var(--sidebar-width); |
| | | transition: margin-left 0.25s ease; |
| | | position: relative; |
| | | background: transparent; |
| | | } |
| | |
| | | } |
| | | |
| | | .sidebar-container { |
| | | transition: width 0.28s; |
| | | width: $base-sidebar-width !important; |
| | | height: 100%; |
| | | transition: width 0.25s ease; |
| | | width: var(--sidebar-width) !important; |
| | | height: 100vh; |
| | | position: fixed; |
| | | font-size: 0px; |
| | | top: 0; |
| | | bottom: 0; |
| | | left: 0; |
| | | z-index: 1001; |
| | | overflow: hidden; |
| | | padding: 12px 0 16px 16px; |
| | | background: transparent; |
| | | box-shadow: none; |
| | | padding: 0; |
| | | font-size: 0; |
| | | background: var(--sidebar-bg); |
| | | border-right: 1px solid var(--surface-border); |
| | | box-shadow: var(--shadow-md); |
| | | |
| | | // reset element-ui css |
| | | > * { |
| | | position: relative; |
| | | z-index: 1; |
| | | } |
| | | |
| | | .horizontal-collapse-transition { |
| | | transition: 0s width ease-in-out, 0s padding-left ease-in-out, |
| | | 0s padding-right ease-in-out; |
| | | transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; |
| | | } |
| | | |
| | | .scrollbar-wrapper { |
| | | overflow-x: hidden !important; |
| | | overflow-y: auto !important; |
| | | } |
| | | |
| | | .el-scrollbar__bar.is-vertical { |
| | | right: 0px; |
| | | right: 2px; |
| | | } |
| | | |
| | | .el-scrollbar { |
| | |
| | | |
| | | &.has-logo { |
| | | .el-scrollbar { |
| | | height: calc(100% - 72px); |
| | | margin-top: 10px; |
| | | height: calc(100% - 64px); |
| | | } |
| | | } |
| | | |
| | |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .svg-icon { |
| | | margin-right: 16px; |
| | | } |
| | | |
| | | .el-menu { |
| | | border: 1px solid var(--surface-border) !important; |
| | | border: none !important; |
| | | height: 100%; |
| | | width: 100% !important; |
| | | padding: 12px 10px 20px; |
| | | border-radius: var(--radius-lg); |
| | | background: var(--menu-surface); |
| | | backdrop-filter: blur(20px); |
| | | box-shadow: var(--shadow-sm); |
| | | transition: all 0.3s ease; |
| | | padding: 12px 0; |
| | | background: transparent !important; |
| | | } |
| | | |
| | | .el-menu-item, |
| | |
| | | white-space: nowrap !important; |
| | | } |
| | | |
| | | .el-menu-item .el-menu-tooltip__trigger { |
| | | display: inline-block !important; |
| | | .submenu-title-noDropdown, |
| | | .el-menu-item { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | // menu hover - 优化后的悬停效果 |
| | | .submenu-title-noDropdown, |
| | | .el-sub-menu__title { |
| | | transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); |
| | | .el-sub-menu__title, |
| | | .el-menu-item { |
| | | width: calc(100% - 16px) !important; |
| | | margin: 4px 8px !important; |
| | | height: 44px; |
| | | line-height: 44px; |
| | | border-radius: var(--radius-md); |
| | | padding-left: 16px !important; |
| | | padding-right: 36px !important; // 预留箭头位置 |
| | | box-sizing: border-box; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | color: var(--sidebar-text); |
| | | background: transparent; |
| | | border: none !important; |
| | | |
| | | &:hover { |
| | | background-color: var(--menu-hover) !important; |
| | | border-radius: var(--radius-sm); |
| | | transform: translateX(2px); |
| | | position: relative; |
| | | |
| | | .svg-icon { |
| | | margin-right: 12px; |
| | | width: 18px; |
| | | height: 18px; |
| | | vertical-align: middle; |
| | | flex-shrink: 0; |
| | | transition: transform 0.3s ease; |
| | | } |
| | | } |
| | | |
| | | & .theme-light .is-active > .el-sub-menu__title, |
| | | & .theme-dark .is-active > .el-sub-menu__title { |
| | | |
| | | .el-sub-menu { |
| | | &.is-opened { |
| | | > .el-sub-menu__title { |
| | | color: var(--menu-active-text) !important; |
| | | |
| | | .el-sub-menu__icon-arrow { |
| | | transform: rotate(180deg) !important; |
| | | color: var(--menu-active-text) !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .el-sub-menu__icon-arrow { |
| | | position: absolute !important; |
| | | right: 16px !important; |
| | | top: 50% !important; |
| | | margin-top: -6px !important; |
| | | width: 12px !important; |
| | | height: 12px !important; |
| | | font-size: 12px !important; |
| | | display: inline-block !important; |
| | | transition: transform 0.3s ease !important; |
| | | color: var(--sidebar-text) !important; |
| | | z-index: 2; |
| | | } |
| | | } |
| | | |
| | | .submenu-title-noDropdown:hover, |
| | | .el-sub-menu__title:hover, |
| | | .el-menu-item:hover { |
| | | background: var(--menu-hover) !important; |
| | | color: var(--menu-active-text) !important; |
| | | |
| | | .svg-icon { |
| | | transform: scale(1.1); |
| | | } |
| | | } |
| | | |
| | | .el-menu-item.is-active, |
| | | .el-sub-menu.is-active > .el-sub-menu__title { |
| | | color: var(--menu-active-text) !important; |
| | | background: var(--menu-active-bg) !important; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); |
| | | border: none !important; |
| | | box-shadow: var(--menu-active-glow); |
| | | font-weight: 600; |
| | | |
| | | .svg-icon { |
| | | color: var(--menu-active-text) !important; |
| | | } |
| | | } |
| | | |
| | | & .nest-menu .el-sub-menu > .el-sub-menu__title, |
| | | & .el-sub-menu .el-menu-item { |
| | | min-width: 0 !important; |
| | | margin: 0 10px 5px; |
| | | width: calc(100% - 20px); |
| | | padding-left: 10px !important; |
| | | padding-right: 10px !important; |
| | | box-sizing: border-box; |
| | | border-radius: var(--radius-xs); |
| | | transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); |
| | | color: var(--sidebar-text); |
| | | border: none !important; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | margin: 2px 8px !important; |
| | | padding-left: 44px !important; // 增加子菜单缩进 |
| | | border-radius: var(--radius-sm); |
| | | font-size: 13px; |
| | | |
| | | &:hover { |
| | | background-color: var(--menu-hover) !important; |
| | | transform: translateX(2px); |
| | | } |
| | | |
| | | &.is-active { |
| | | background: var(--menu-active-bg) !important; |
| | | border-radius: var(--radius-sm); |
| | | color: var(--menu-active-text) !important; |
| | | font-weight: 500; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); |
| | | } |
| | | } |
| | | |
| | | & .theme-light .nest-menu .el-sub-menu > .el-sub-menu__title, |
| | | & .theme-light .el-sub-menu .el-menu-item, |
| | | & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, |
| | | & .theme-dark .el-sub-menu .el-menu-item { |
| | | &:hover { |
| | | background-color: var(--menu-hover) !important; |
| | | border-radius: var(--radius-xs); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .hideSidebar { |
| | | .sidebar-container { |
| | | width: 68px !important; |
| | | padding-left: 0; |
| | | padding-right: 0; |
| | | width: var(--sidebar-collapsed-width) !important; |
| | | |
| | | .el-menu-item, |
| | | .el-sub-menu__title { |
| | | padding: 0 !important; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin: 4px 8px !important; |
| | | width: calc(var(--sidebar-collapsed-width) - 16px) !important; |
| | | |
| | | .svg-icon { |
| | | margin-right: 0; |
| | | } |
| | | |
| | | .menu-title, |
| | | .el-sub-menu__icon-arrow { |
| | | display: none; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .main-container { |
| | | margin-left: 84px; |
| | | } |
| | | |
| | | .submenu-title-noDropdown { |
| | | padding: 0 !important; |
| | | position: relative; |
| | | display: flex !important; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .svg-icon { |
| | | margin-right: 0; |
| | | } |
| | | |
| | | .el-tooltip { |
| | | padding: 0 !important; |
| | | display: inline-flex !important; |
| | | align-items: center; |
| | | justify-content: center; |
| | | width: 100%; |
| | | |
| | | .svg-icon { |
| | | margin-left: 0; |
| | | } |
| | | } |
| | | |
| | | .el-menu-tooltip__trigger { |
| | | width: 100%; |
| | | display: inline-flex !important; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .svg-icon { |
| | | width: 18px; |
| | | height: 18px; |
| | | margin-right: 0; |
| | | flex-shrink: 0; |
| | | } |
| | | } |
| | | } |
| | | .el-sub-menu { |
| | | overflow: hidden; |
| | | |
| | | & > .el-sub-menu__title { |
| | | padding: 0 !important; |
| | | display: flex !important; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .svg-icon { |
| | | margin-left: 0; |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .el-menu--collapse { |
| | | width: 100% !important; |
| | | padding: 10px 6px 18px; |
| | | |
| | | > .el-menu-item, |
| | | .el-sub-menu { |
| | | & > .el-sub-menu__title, |
| | | &.el-menu-item { |
| | | margin: 0 0 6px; |
| | | width: 100%; |
| | | padding-left: 0 !important; |
| | | padding-right: 0 !important; |
| | | box-sizing: border-box; |
| | | display: flex !important; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | .svg-icon { |
| | | width: 18px; |
| | | height: 18px; |
| | | margin-right: 0; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | &:hover { |
| | | border-radius: 14px; |
| | | } |
| | | |
| | | & > span { |
| | | height: 0; |
| | | width: 0; |
| | | overflow: hidden; |
| | | visibility: hidden; |
| | | display: inline-block; |
| | | } |
| | | } |
| | | } |
| | | margin-left: var(--sidebar-collapsed-width); |
| | | } |
| | | } |
| | | |
| | | .el-menu--collapse .el-menu .el-sub-menu { |
| | | min-width: $base-sidebar-width !important; |
| | | min-width: var(--sidebar-width) !important; |
| | | } |
| | | |
| | | // mobile responsive |
| | | .mobile { |
| | | .main-container { |
| | | margin-left: 0px; |
| | | margin-left: 0; |
| | | } |
| | | |
| | | .sidebar-container { |
| | | transition: transform 0.28s; |
| | | width: $base-sidebar-width !important; |
| | | transition: transform 0.25s; |
| | | width: var(--sidebar-width) !important; |
| | | } |
| | | |
| | | &.hideSidebar { |
| | | .sidebar-container { |
| | | pointer-events: none; |
| | | transition-duration: 0.3s; |
| | | transform: translate3d(-$base-sidebar-width, 0, 0); |
| | | transform: translate3d(calc(-1 * var(--sidebar-width)), 0, 0); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | // when menu collapsed |
| | | .el-menu--vertical { |
| | | & > .el-menu { |
| | | .svg-icon { |
| | | margin-right: 14px; |
| | | margin-right: 12px; |
| | | } |
| | | } |
| | | |
| | | .nest-menu .el-sub-menu > .el-sub-menu__title, |
| | | .el-menu-item { |
| | | min-width: 0 !important; |
| | | margin: 0 10px 5px; |
| | | margin: 4px 10px; |
| | | width: calc(100% - 20px); |
| | | padding-left: 10px !important; |
| | | padding-right: 10px !important; |
| | | height: 44px; |
| | | line-height: 44px; |
| | | padding-left: 16px !important; |
| | | padding-right: 16px !important; |
| | | box-sizing: border-box; |
| | | border-radius: var(--radius-xs); |
| | | transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); |
| | | border-radius: var(--radius-md); |
| | | color: var(--sidebar-text); |
| | | border: none !important; |
| | | background: transparent; |
| | | transition: all 0.2s ease; |
| | | |
| | | &:hover { |
| | | background-color: var(--menu-hover) !important; |
| | | transform: translateX(2px); |
| | | background: var(--menu-hover) !important; |
| | | color: #fff !important; |
| | | } |
| | | |
| | | |
| | | &.is-active { |
| | | background: var(--menu-active-bg) !important; |
| | | color: var(--menu-active-text) !important; |
| | | border-radius: var(--radius-sm); |
| | | font-weight: 500; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); |
| | | font-weight: 600; |
| | | box-shadow: var(--menu-active-glow); |
| | | } |
| | | } |
| | | |
| | | // the scroll bar appears when the sub-menu is too long |
| | | > .el-menu--popup { |
| | | max-height: 100vh; |
| | | overflow-y: auto; |
| | | padding: 10px; |
| | | border-radius: var(--radius-md); |
| | | overflow: hidden; |
| | | padding: 8px; |
| | | border-radius: var(--radius-lg); |
| | | border: 1px solid var(--surface-border); |
| | | box-shadow: var(--shadow-md); |
| | | background: var(--menu-surface); |
| | | backdrop-filter: blur(20px); |
| | | box-shadow: var(--shadow-menu); |
| | | background: var(--sidebar-bg); |
| | | backdrop-filter: blur(16px); |
| | | |
| | | &::-webkit-scrollbar-track-piece { |
| | | background: var(--surface-muted); |
| | | } |
| | | > .el-menu { |
| | | max-height: calc(100vh - 16px); |
| | | overflow-y: auto; |
| | | overflow-x: hidden; |
| | | background: transparent !important; |
| | | |
| | | &::-webkit-scrollbar { |
| | | width: 5px; |
| | | } |
| | | &::-webkit-scrollbar { |
| | | width: 4px; |
| | | } |
| | | |
| | | &::-webkit-scrollbar-thumb { |
| | | background: var(--accent-light); |
| | | border-radius: 10px; |
| | | &::-webkit-scrollbar-thumb { |
| | | background: var(--sidebar-muted); |
| | | border-radius: 4px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @keyframes sidebarActiveFlow { |
| | | 0% { |
| | | background-position: 0% 50%; |
| | | } |
| | | 50% { |
| | | background-position: 100% 50%; |
| | | } |
| | | 100% { |
| | | background-position: 0% 50%; |
| | | } |
| | | } |