[webapp] update ui
Signed-off-by: tomsun28 <tomsun28@outlook.com>
diff --git a/web-app/src/app/layout/basic/basic.component.html b/web-app/src/app/layout/basic/basic.component.html
index c524732..c7106c4 100644
--- a/web-app/src/app/layout/basic/basic.component.html
+++ b/web-app/src/app/layout/basic/basic.component.html
@@ -1,6 +1,4 @@
-<div class="alain-default__content">
- <router-outlet></router-outlet>
-</div>
+<router-outlet></router-outlet>
<div class="ai-chatbot-container">
<div class="ai-chatbot-button" (click)="toggleChatbot()">
diff --git a/web-app/src/app/layout/basic/basic.component.less b/web-app/src/app/layout/basic/basic.component.less
index 4e007f4..8f9b454 100644
--- a/web-app/src/app/layout/basic/basic.component.less
+++ b/web-app/src/app/layout/basic/basic.component.less
@@ -7,6 +7,39 @@
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
+ position: relative;
+ min-height: 100vh;
+
+ /* Modern background with subtle patterns */
+ &::before {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background:
+ radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.3) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(255, 119, 198, 0.3) 0%, transparent 50%),
+ radial-gradient(circle at 40% 40%, rgba(120, 219, 255, 0.3) 0%, transparent 50%);
+ z-index: -1;
+ animation: backgroundShift 20s ease-in-out infinite;
+ }
+
+ /* Subtle animated background */
+ &::after {
+ content: '';
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-image:
+ radial-gradient(circle at 1px 1px, rgba(255, 255, 255, 0.15) 1px, transparent 0);
+ background-size: 20px 20px;
+ z-index: -1;
+ animation: dotMove 30s linear infinite;
+ }
@media (max-width: 1200px) {
.page-header-item {
@@ -19,13 +52,1476 @@
}
}
}
+/* Background animations */
+@keyframes backgroundShift {
+ 0%, 100% {
+ filter: hue-rotate(0deg);
+ }
+ 50% {
+ filter: hue-rotate(90deg);
+ }
+}
-/* Footer styles */
+@keyframes dotMove {
+ 0% {
+ transform: translate(0, 0);
+ }
+ 100% {
+ transform: translate(20px, 20px);
+ }
+}
+
+/* Modern layout container */
+::ng-deep .ant-layout {
+ background: transparent;
+
+ .ant-layout-header {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
+ backdrop-filter: blur(20px);
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
+ box-shadow: 0 2px 20px rgba(0, 0, 0, 0.1);
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%);
+ }
+ }
+
+ .ant-layout-content {
+ background: transparent;
+ position: relative;
+ z-index: 1;
+ }
+
+ .ant-layout-sider {
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.02) 0%, rgba(255, 255, 255, 0.05) 100%);
+ backdrop-filter: blur(20px);
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
+ box-shadow: 2px 0 20px rgba(0, 0, 0, 0.05);
+ }
+}
+
+/* Modern Header Items Styles */
+.modern-header-item {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding: 8px 12px;
+ border-radius: 8px;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ cursor: pointer;
+ background: linear-gradient(135deg, transparent 0%, rgba(255, 255, 255, 0.05) 100%);
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.2) 100%);
+ transform: translateY(-2px);
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
+ border-color: rgba(255, 255, 255, 0.2);
+ }
+
+ .icon-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ border-radius: 6px;
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
+ transition: all 0.3s ease;
+ }
+
+ .header-icon {
+ font-size: 16px;
+ color: rgba(255, 255, 255, 0.85);
+ transition: all 0.3s ease;
+ }
+
+ .item-tooltip {
+ position: absolute;
+ bottom: -35px;
+ left: 50%;
+ transform: translateX(-50%);
+ background: rgba(0, 0, 0, 0.8);
+ color: white;
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 12px;
+ white-space: nowrap;
+ opacity: 0;
+ visibility: hidden;
+ transition: all 0.3s ease;
+ z-index: 1000;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: -4px;
+ left: 50%;
+ transform: translateX(-50%);
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-bottom: 4px solid rgba(0, 0, 0, 0.8);
+ }
+ }
+
+ &:hover .item-tooltip {
+ opacity: 1;
+ visibility: visible;
+ bottom: -40px;
+ }
+
+ &:hover .icon-wrapper {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%);
+ transform: scale(1.1);
+ }
+
+ &:hover .header-icon {
+ color: white;
+ transform: scale(1.1);
+ }
+}
+
+/* Specific header item styles */
+.github-link {
+ &:hover .header-icon {
+ color: #f78166;
+ }
+}
+
+.search-toggle {
+ &:hover .header-icon {
+ color: #1890ff;
+ }
+}
+
+.lock-item {
+ &:hover .header-icon {
+ color: #faad14;
+ }
+}
+
+.settings-item {
+ &:hover .header-icon {
+ color: #52c41a;
+ }
+}
+
+.spinning-on-hover {
+ &:hover {
+ animation: spin 1s linear infinite;
+ }
+}
+
+@keyframes spin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
+
+/* Modern Search Styles */
+.modern-search {
+ .search-input-group {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ backdrop-filter: blur(10px);
+ transition: all 0.3s ease;
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.1) 100%);
+ border-color: rgba(255, 255, 255, 0.3);
+ }
+ }
+}
+
+/* Modern Dropdown Menu Styles */
+.modern-dropdown-menu {
+ min-width: 240px;
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
+ backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 12px;
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
+ padding: 8px;
+
+ .modern-menu-item {
+ border-radius: 8px;
+ margin: 2px 0;
+ transition: all 0.3s ease;
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(24, 144, 255, 0.1) 0%, rgba(24, 144, 255, 0.05) 100%);
+ transform: translateX(4px);
+ }
+
+ .menu-item-content {
+ display: flex;
+ align-items: center;
+ padding: 8px 12px;
+
+ .menu-icon {
+ margin-right: 12px;
+ font-size: 16px;
+ color: @primary-color;
+ transition: all 0.3s ease;
+ }
+
+ .menu-text {
+ font-weight: 500;
+ color: rgba(0, 0, 0, 0.85);
+ }
+ }
+
+ &:hover .menu-icon {
+ transform: scale(1.2);
+ color: @primary-color;
+ }
+ }
+
+ .modern-divider {
+ margin: 8px 0;
+ background: linear-gradient(90deg, transparent 0%, rgba(0, 0, 0, 0.1) 50%, transparent 100%);
+ height: 1px;
+ border: none;
+ }
+}
+
+/* Notification item styles */
+.notification-item {
+ .ant-badge {
+ .ant-badge-count {
+ background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);
+ box-shadow: 0 2px 8px rgba(255, 77, 79, 0.3);
+ }
+ }
+}
+
+/* User item styles */
+.user-item {
+ .ant-avatar {
+ border: 2px solid rgba(255, 255, 255, 0.3);
+ transition: all 0.3s ease;
+
+ &:hover {
+ border-color: rgba(255, 255, 255, 0.6);
+ transform: scale(1.1);
+ }
+ }
+}
+
+/* Modern Navigation Styles */
+.modern-nav {
+ background: rgba(255, 255, 255, 0.1) !important;
+ backdrop-filter: blur(20px) !important;
+ border: 1px solid rgba(255, 255, 255, 0.2) !important;
+ border-radius: 12px !important;
+ margin: 8px !important;
+ position: relative !important;
+ overflow: hidden !important;
+
+ /* 动态边框效果 */
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57);
+ background-size: 400% 400%;
+ animation: borderPulse 4s ease-in-out infinite;
+ z-index: -1;
+ border-radius: 12px;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: 2px;
+ left: 2px;
+ right: 2px;
+ bottom: 2px;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border-radius: 10px;
+ z-index: 0;
+ }
+
+ /* sidebar-nav 容器样式 */
+ .sidebar-nav {
+ position: relative !important;
+ z-index: 1 !important;
+ }
+
+ /* 菜单项样式 */
+ .sidebar-nav__item {
+ position: relative !important;
+ z-index: 1 !important;
+ border-radius: 8px !important;
+ margin: 4px 8px !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ background: rgba(255, 255, 255, 0.05) !important;
+ border: 1px solid rgba(255, 255, 255, 0.1) !important;
+ backdrop-filter: blur(10px) !important;
+ border-left: 3px solid transparent !important;
+
+ /* 背景纹理 */
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-image:
+ radial-gradient(circle at 20% 50%, rgba(120, 119, 198, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(255, 119, 198, 0.1) 0%, transparent 50%),
+ radial-gradient(circle at 40% 80%, rgba(120, 219, 255, 0.1) 0%, transparent 50%);
+ border-radius: 8px;
+ z-index: -1;
+ }
+
+ &:hover {
+ transform: translateX(8px) scale(1.02) !important;
+ background: rgba(255, 255, 255, 0.15) !important;
+ border-color: rgba(255, 255, 255, 0.3) !important;
+ box-shadow:
+ 0 8px 32px rgba(0, 0, 0, 0.1),
+ 0 0 0 1px rgba(255, 255, 255, 0.2),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3) !important;
+
+ /* 滑动光效 */
+ &::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
+ animation: slideLight 0.6s ease-out;
+ border-radius: 8px;
+ }
+ }
+ }
+
+ /* 选中状态 */
+ .sidebar-nav__selected {
+ background: linear-gradient(135deg, rgba(63, 81, 181, 0.2), rgba(63, 81, 181, 0.1)) !important;
+ border-color: rgba(63, 81, 181, 0.4) !important;
+ border-left-color: #3f51b5 !important;
+ box-shadow:
+ 0 0 20px rgba(63, 81, 181, 0.3),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2) !important;
+
+ &::before {
+ background: linear-gradient(135deg, rgba(63, 81, 181, 0.1), transparent) !important;
+ }
+ }
+
+ /* 菜单链接样式 */
+ .sidebar-nav__item-link {
+ color: rgba(255, 255, 255, 0.85) !important;
+ font-weight: 500 !important;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) !important;
+ transition: all 0.3s ease !important;
+ padding: 12px 16px !important;
+ border-radius: 8px !important;
+
+ &:hover {
+ color: #fff !important;
+ text-shadow: 0 0 8px rgba(255, 255, 255, 0.5) !important;
+ }
+ }
+
+ .sidebar-nav__selected > .sidebar-nav__item-link {
+ color: #3f51b5 !important;
+ font-weight: 600 !important;
+ }
+
+ /* 图标样式 */
+ .sidebar-nav__item-icon {
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)) !important;
+ margin-right: 12px !important;
+ }
+
+ .sidebar-nav__item:hover .sidebar-nav__item-icon {
+ transform: scale(1.1) rotate(5deg) !important;
+ filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2)) !important;
+ }
+
+ /* 子菜单样式 */
+ .sidebar-nav__sub {
+ background: rgba(255, 255, 255, 0.05) !important;
+ backdrop-filter: blur(15px) !important;
+ border-radius: 8px !important;
+ margin-left: 16px !important;
+ border-left: 2px solid rgba(63, 81, 181, 0.3) !important;
+
+ .sidebar-nav__item {
+ margin-left: 12px !important;
+
+ .sidebar-nav__item-link {
+ padding-left: 24px !important;
+ }
+ }
+ }
+
+ /* 箭头图标 */
+ .sidebar-nav__sub-arrow {
+ transition: transform 0.3s ease !important;
+
+ &::before,
+ &::after {
+ background: rgba(255, 255, 255, 0.7) !important;
+ transition: all 0.3s ease !important;
+ }
+ }
+
+ .sidebar-nav__open > .sidebar-nav__item-link .sidebar-nav__sub-arrow {
+ transform: rotate(90deg) !important;
+ }
+
+ // 菜单图标颜色主题
+ .sidebar-nav__item-link {
+ // 仪表板图标
+ &[href*="dashboard"] .sidebar-nav__item-icon,
+ &[routerLink*="dashboard"] .sidebar-nav__item-icon {
+ color: #4CAF50 !important;
+
+ &:hover {
+ color: #66BB6A !important;
+ text-shadow: 0 0 10px rgba(76, 175, 80, 0.5) !important;
+ }
+ }
+
+ // 监控图标
+ &[href*="monitor"] .sidebar-nav__item-icon,
+ &[routerLink*="monitor"] .sidebar-nav__item-icon {
+ color: #2196F3 !important;
+
+ &:hover {
+ color: #42A5F5 !important;
+ text-shadow: 0 0 10px rgba(33, 150, 243, 0.5) !important;
+ }
+ }
+
+ // 告警图标
+ &[href*="alert"] .sidebar-nav__item-icon,
+ &[routerLink*="alert"] .sidebar-nav__item-icon {
+ color: #FF5722 !important;
+
+ &:hover {
+ color: #FF7043 !important;
+ text-shadow: 0 0 10px rgba(255, 87, 34, 0.5) !important;
+ }
+ }
+
+ // 设置图标
+ &[href*="setting"] .sidebar-nav__item-icon,
+ &[routerLink*="setting"] .sidebar-nav__item-icon {
+ color: #9C27B0 !important;
+
+ &:hover {
+ color: #BA68C8 !important;
+ text-shadow: 0 0 10px rgba(156, 39, 176, 0.5) !important;
+ }
+ }
+
+ // 帮助图标
+ &[href*="help"] .sidebar-nav__item-icon,
+ &[routerLink*="help"] .sidebar-nav__item-icon {
+ color: #FF9800 !important;
+
+ &:hover {
+ color: #FFB74D !important;
+ text-shadow: 0 0 10px rgba(255, 152, 0, 0.5) !important;
+ }
+ }
+ }
+
+ // 通知徽章样式
+ .sidebar-nav .badge {
+ background: linear-gradient(135deg, #FF6B6B, #FF8E53) !important;
+ color: white !important;
+ border: 2px solid rgba(255, 255, 255, 0.3) !important;
+ box-shadow: 0 2px 8px rgba(255, 107, 107, 0.4) !important;
+ animation: notificationPulse 2s ease-in-out infinite !important;
+
+ &.badge-dot {
+ background: radial-gradient(circle, #FF6B6B, #FF4757) !important;
+ box-shadow:
+ 0 0 0 2px rgba(255, 255, 255, 0.3),
+ 0 0 10px rgba(255, 107, 107, 0.6) !important;
+ }
+ }
+
+ ::ng-deep {
+ .ant-menu {
+ background: transparent;
+ border-right: none;
+ padding: 8px 0;
+
+ .ant-menu-item {
+ margin: 6px 12px;
+ border-radius: 12px;
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ background: transparent;
+ border: 1px solid transparent;
+ position: relative;
+ overflow: hidden;
+
+ /* Add subtle glow effect */
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.1) 50%, transparent 100%);
+ transition: left 0.6s ease;
+ }
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%);
+ border-color: rgba(255, 255, 255, 0.25);
+ transform: translateX(6px) scale(1.02);
+ box-shadow:
+ 0 6px 20px rgba(0, 0, 0, 0.12),
+ 0 0 0 1px rgba(255, 255, 255, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
+
+ &::before {
+ left: 100%;
+ }
+ }
+
+ &.ant-menu-item-selected {
+ background: linear-gradient(135deg, @primary-color 0%, lighten(@primary-color, 15%) 100%);
+ border-color: lighten(@primary-color, 10%);
+ color: white;
+ transform: translateX(4px);
+ box-shadow:
+ 0 8px 25px fade(@primary-color, 25%),
+ 0 0 0 1px lighten(@primary-color, 20%),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+
+ &::after {
+ display: none;
+ }
+
+ &::before {
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%);
+ }
+
+ .anticon {
+ color: white;
+ filter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.3));
+ }
+ }
+
+ .anticon {
+ font-size: 18px;
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ margin-right: 12px;
+ }
+
+ &:hover .anticon {
+ transform: scale(1.15) rotate(5deg);
+ filter: drop-shadow(0 0 6px rgba(255, 255, 255, 0.4));
+ }
+
+ /* Menu text styling */
+ span {
+ font-weight: 500;
+ letter-spacing: 0.5px;
+ transition: all 0.3s ease;
+ }
+
+ &:hover span {
+ text-shadow: 0 0 8px rgba(255, 255, 255, 0.3);
+ }
+ }
+
+ .ant-menu-submenu {
+ margin: 6px 12px;
+ border-radius: 12px;
+
+ .ant-menu-submenu-title {
+ border-radius: 12px;
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ background: transparent;
+ border: 1px solid transparent;
+ position: relative;
+ overflow: hidden;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.1) 50%, transparent 100%);
+ transition: left 0.6s ease;
+ }
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%);
+ border-color: rgba(255, 255, 255, 0.25);
+ transform: translateX(6px) scale(1.02);
+ box-shadow:
+ 0 6px 20px rgba(0, 0, 0, 0.12),
+ 0 0 0 1px rgba(255, 255, 255, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
+
+ &::before {
+ left: 100%;
+ }
+ }
+
+ .anticon {
+ font-size: 18px;
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ margin-right: 12px;
+
+ &:last-child {
+ margin-right: 0;
+ margin-left: auto;
+ }
+ }
+
+ &:hover .anticon {
+ transform: scale(1.15);
+ filter: drop-shadow(0 0 6px rgba(255, 255, 255, 0.4));
+
+ &:last-child {
+ transform: scale(1.15) rotate(180deg);
+ }
+ }
+
+ span {
+ font-weight: 500;
+ letter-spacing: 0.5px;
+ transition: all 0.3s ease;
+ }
+
+ &:hover span {
+ text-shadow: 0 0 8px rgba(255, 255, 255, 0.3);
+ }
+ }
+
+ &.ant-menu-submenu-open {
+ .ant-menu-submenu-title {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.12) 100%);
+ border-color: rgba(255, 255, 255, 0.35);
+ transform: translateX(4px);
+ box-shadow:
+ 0 4px 15px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.25);
+
+ .anticon:last-child {
+ transform: rotate(180deg) scale(1.1);
+ }
+ }
+ }
+
+ .ant-menu-sub {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.03) 100%);
+ border-radius: 12px;
+ margin: 8px 0;
+ padding: 8px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ backdrop-filter: blur(10px);
+
+ .ant-menu-item {
+ margin: 3px 8px;
+ padding-left: 52px !important;
+ border-radius: 10px;
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%);
+ transform: translateX(10px) scale(1.01);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
+ }
+
+ &.ant-menu-item-selected {
+ background: linear-gradient(135deg, fade(@primary-color, 80%) 0%, fade(@primary-color, 60%) 100%);
+ transform: translateX(8px);
+ }
+ }
+ }
+ }
+ }
+
+ .ant-layout-sider-trigger {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.12) 0%, rgba(255, 255, 255, 0.06) 100%);
+ border-top: 1px solid rgba(255, 255, 255, 0.15);
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ position: relative;
+ overflow: hidden;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.15) 50%, transparent 100%);
+ transition: left 0.6s ease;
+ }
+
+ &:hover {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.25) 0%, rgba(255, 255, 255, 0.15) 100%);
+ transform: scale(1.05);
+ box-shadow:
+ 0 4px 15px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
+
+ &::before {
+ left: 100%;
+ }
+ }
+
+ .anticon {
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ filter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.2));
+ }
+
+ &:hover .anticon {
+ transform: scale(1.2) rotate(180deg);
+ filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.4));
+ }
+ }
+ }
+}
+
+/* Border pulse animation */
+@keyframes borderPulse {
+ 0%, 100% {
+ opacity: 0.3;
+ }
+ 50% {
+ opacity: 0.8;
+ }
+}
+
+/* Slide light animation */
+@keyframes slideLight {
+ 0% {
+ left: -100%;
+ }
+ 100% {
+ left: 100%;
+ }
+}
+
+/* Menu icon color themes */
+.modern-nav ::ng-deep {
+ .ant-menu-item {
+ /* Dashboard icon */
+ &[title*="仪表板"], &[title*="Dashboard"] {
+ .anticon {
+ color: #1890ff;
+ }
+ &:hover .anticon {
+ color: #40a9ff;
+ }
+ }
+
+ /* Monitor icon */
+ &[title*="监控"], &[title*="Monitor"] {
+ .anticon {
+ color: #52c41a;
+ }
+ &:hover .anticon {
+ color: #73d13d;
+ }
+ }
+
+ /* Alert icon */
+ &[title*="告警"], &[title*="Alert"] {
+ .anticon {
+ color: #fa541c;
+ }
+ &:hover .anticon {
+ color: #ff7a45;
+ }
+ }
+
+ /* Setting icon */
+ &[title*="设置"], &[title*="Setting"] {
+ .anticon {
+ color: #722ed1;
+ }
+ &:hover .anticon {
+ color: #9254de;
+ }
+ }
+
+ /* Help icon */
+ &[title*="帮助"], &[title*="Help"] {
+ .anticon {
+ color: #eb2f96;
+ }
+ &:hover .anticon {
+ color: #f759ab;
+ }
+ }
+ }
+
+ .ant-menu-submenu {
+ /* Monitor submenu */
+ &[title*="监控"], &[title*="Monitor"] {
+ .ant-menu-submenu-title .anticon:first-child {
+ color: #52c41a;
+ }
+ &:hover .ant-menu-submenu-title .anticon:first-child {
+ color: #73d13d;
+ }
+ }
+
+ /* Alert submenu */
+ &[title*="告警"], &[title*="Alert"] {
+ .ant-menu-submenu-title .anticon:first-child {
+ color: #fa541c;
+ }
+ &:hover .ant-menu-submenu-title .anticon:first-child {
+ color: #ff7a45;
+ }
+ }
+
+ /* Setting submenu */
+ &[title*="设置"], &[title*="Setting"] {
+ .ant-menu-submenu-title .anticon:first-child {
+ color: #722ed1;
+ }
+ &:hover .ant-menu-submenu-title .anticon:first-child {
+ color: #9254de;
+ }
+ }
+ }
+}
+
+/* Enhanced menu item effects */
+.modern-nav ::ng-deep .ant-menu {
+ /* Add subtle background pattern */
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-image:
+ radial-gradient(circle at 2px 2px, rgba(255, 255, 255, 0.05) 1px, transparent 0);
+ background-size: 24px 24px;
+ pointer-events: none;
+ z-index: 0;
+ }
+
+ .ant-menu-item, .ant-menu-submenu-title {
+ position: relative;
+ z-index: 1;
+
+ /* Add subtle inner shadow */
+ &::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ border-radius: inherit;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ pointer-events: none;
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ }
+
+ &:hover::after {
+ opacity: 1;
+ }
+ }
+
+ /* Menu item badge/indicator */
+ .ant-menu-item {
+ &.has-notification {
+ &::before {
+ content: '';
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ width: 8px;
+ height: 8px;
+ background: #ff4d4f;
+ border-radius: 50%;
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
+ animation: notificationPulse 2s ease-in-out infinite;
+ z-index: 2;
+ }
+ }
+ }
+}
+
+/* Notification pulse animation */
+@keyframes notificationPulse {
+ 0%, 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+ 50% {
+ transform: scale(1.2);
+ opacity: 0.7;
+ }
+}
+
+/* Modern Footer styles */
global-footer {
text-align: center;
- padding: 16px;
- border-top: 1px solid #e5e5e5;
+ padding: 24px 16px;
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.02) 0%, rgba(255, 255, 255, 0.05) 100%);
+ backdrop-filter: blur(10px);
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
min-height: 120px;
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.3) 50%, transparent 100%);
+ }
+
+ a {
+ color: @primary-color;
+ transition: all 0.3s ease;
+ text-decoration: none;
+
+ &:hover {
+ color: lighten(@primary-color, 10%);
+ text-shadow: 0 0 8px fade(@primary-color, 30%);
+ }
+ }
+}
+
+/* Modern Layout Header Styles */
+::ng-deep .alain-default__header {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(15px) saturate(180%) !important;
+ border-bottom: 1px solid rgba(99, 102, 241, 0.2) !important;
+ box-shadow:
+ 0 4px 20px rgba(0, 0, 0, 0.08),
+ 0 1px 3px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.6) !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ position: relative !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ background:
+ radial-gradient(circle at 20% 50%, rgba(99, 102, 241, 0.03) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(168, 85, 247, 0.03) 0%, transparent 50%),
+ radial-gradient(circle at 40% 80%, rgba(59, 130, 246, 0.03) 0%, transparent 50%) !important;
+ pointer-events: none !important;
+ }
+
+ &::after {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ height: 1px !important;
+ background: linear-gradient(90deg,
+ transparent 0%,
+ rgba(99, 102, 241, 0.3) 20%,
+ rgba(168, 85, 247, 0.3) 50%,
+ rgba(59, 130, 246, 0.3) 80%,
+ transparent 100%) !important;
+ animation: slideLight 3s ease-in-out infinite !important;
+ }
+}
+
+/* Modern Header Items */
+::ng-deep .modern-header-item {
+ background: rgba(255, 255, 255, 0.8) !important;
+ backdrop-filter: blur(8px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.1) !important;
+ border-radius: 8px !important;
+ padding: 8px 12px !important;
+ margin: 0 4px !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ position: relative !important;
+ overflow: hidden !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: -100% !important;
+ width: 100% !important;
+ height: 100% !important;
+ background: linear-gradient(90deg, transparent 0%, rgba(99, 102, 241, 0.1) 50%, transparent 100%) !important;
+ transition: left 0.5s ease !important;
+ }
+
+ &:hover {
+ background: rgba(255, 255, 255, 0.95) !important;
+ border-color: rgba(99, 102, 241, 0.3) !important;
+ transform: translateY(-1px) !important;
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15) !important;
+
+ &::before {
+ left: 100% !important;
+ }
+
+ .header-icon {
+ color: #6366f1 !important;
+ transform: scale(1.1) !important;
+ }
+ }
+
+ .header-icon {
+ font-size: 16px !important;
+ transition: all 0.3s ease !important;
+ color: #64748b !important;
+ }
+
+ .item-tooltip {
+ font-size: 12px !important;
+ color: #64748b !important;
+ margin-left: 6px !important;
+ }
+}
+
+/* Modern Search Styles */
+::ng-deep .modern-search {
+ .alain-default__search-input {
+ background: rgba(255, 255, 255, 0.9) !important;
+ backdrop-filter: blur(10px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.2) !important;
+ border-radius: 20px !important;
+ padding: 8px 16px !important;
+ transition: all 0.3s ease !important;
+
+ &:focus {
+ background: rgba(255, 255, 255, 0.95) !important;
+ border-color: #6366f1 !important;
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1) !important;
+ }
+ }
+
+ .alain-default__search-btn {
+ background: linear-gradient(135deg, #6366f1, #8b5cf6) !important;
+ border: none !important;
+ border-radius: 50% !important;
+ width: 36px !important;
+ height: 36px !important;
+ display: flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ transition: all 0.3s ease !important;
+
+ &:hover {
+ transform: scale(1.05) !important;
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3) !important;
+ }
+ }
+}
+
+/* Modern Dropdown Menu Styles */
+::ng-deep .modern-dropdown-menu {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(15px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.2) !important;
+ border-radius: 12px !important;
+ box-shadow:
+ 0 10px 40px rgba(0, 0, 0, 0.1),
+ 0 4px 6px rgba(0, 0, 0, 0.05),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
+ padding: 8px !important;
+ min-width: 200px !important;
+
+ .modern-menu-item {
+ background: transparent !important;
+ border: 1px solid transparent !important;
+ border-radius: 8px !important;
+ margin: 2px 0 !important;
+ padding: 8px 12px !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ position: relative !important;
+ overflow: hidden !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: -100% !important;
+ width: 100% !important;
+ height: 100% !important;
+ background: linear-gradient(90deg, transparent 0%, rgba(99, 102, 241, 0.1) 50%, transparent 100%) !important;
+ transition: left 0.5s ease !important;
+ }
+
+ &:hover {
+ background: rgba(99, 102, 241, 0.05) !important;
+ border-color: rgba(99, 102, 241, 0.2) !important;
+ transform: translateX(4px) !important;
+
+ &::before {
+ left: 100% !important;
+ }
+
+ .menu-icon {
+ color: #6366f1 !important;
+ transform: scale(1.1) !important;
+ }
+ }
+
+ .menu-item-content {
+ display: flex !important;
+ align-items: center !important;
+
+ .menu-icon {
+ font-size: 14px !important;
+ margin-right: 8px !important;
+ color: #64748b !important;
+ transition: all 0.3s ease !important;
+ }
+
+ .menu-text {
+ color: #374151 !important;
+ font-weight: 500 !important;
+ }
+ }
+ }
+
+ .modern-divider {
+ background: linear-gradient(90deg, transparent 0%, rgba(99, 102, 241, 0.3) 50%, transparent 100%) !important;
+ height: 1px !important;
+ margin: 8px 0 !important;
+ border: none !important;
+ }
+}
+
+/* Modern Button Styles */
+::ng-deep .ant-btn {
+ border-radius: 8px !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ position: relative !important;
+ overflow: hidden !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: -100% !important;
+ width: 100% !important;
+ height: 100% !important;
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%) !important;
+ transition: left 0.5s ease !important;
+ }
+
+ &:hover::before {
+ left: 100% !important;
+ }
+}
+
+::ng-deep .ant-btn-primary {
+ background: linear-gradient(135deg, #6366f1, #8b5cf6) !important;
+ border: none !important;
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3) !important;
+
+ &:hover {
+ background: linear-gradient(135deg, #5855eb, #7c3aed) !important;
+ transform: translateY(-1px) !important;
+ box-shadow: 0 6px 16px rgba(99, 102, 241, 0.4) !important;
+ }
+}
+
+/* Modern Table Styles */
+::ng-deep .ant-table {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(10px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.1) !important;
+ border-radius: 12px !important;
+ overflow: hidden !important;
+
+ .ant-table-thead > tr > th {
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.08), rgba(168, 85, 247, 0.05)) !important;
+ border-bottom: 1px solid rgba(99, 102, 241, 0.2) !important;
+ color: #374151 !important;
+ font-weight: 600 !important;
+ position: relative !important;
+
+ &::after {
+ content: '' !important;
+ position: absolute !important;
+ bottom: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ height: 2px !important;
+ background: linear-gradient(90deg, #6366f1, #8b5cf6) !important;
+ opacity: 0.6 !important;
+ }
+ }
+
+ .ant-table-tbody > tr {
+ transition: all 0.3s ease !important;
+
+ &:hover {
+ background: rgba(99, 102, 241, 0.03) !important;
+ transform: scale(1.001) !important;
+ }
+
+ > td {
+ border-bottom: 1px solid rgba(99, 102, 241, 0.08) !important;
+ transition: all 0.3s ease !important;
+ }
+ }
+}
+
+/* Modern Form Styles */
+::ng-deep .ant-form-item {
+ margin-bottom: 20px !important;
+
+ .ant-form-item-label > label {
+ color: #374151 !important;
+ font-weight: 600 !important;
+ font-size: 14px !important;
+ }
+}
+
+::ng-deep .ant-input {
+ background: rgba(255, 255, 255, 0.9) !important;
+ backdrop-filter: blur(8px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.2) !important;
+ border-radius: 8px !important;
+ transition: all 0.3s ease !important;
+
+ &:focus {
+ background: rgba(255, 255, 255, 0.95) !important;
+ border-color: #6366f1 !important;
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1) !important;
+ }
+
+ &:hover {
+ border-color: rgba(99, 102, 241, 0.3) !important;
+ }
+}
+
+::ng-deep .ant-select {
+ .ant-select-selector {
+ background: rgba(255, 255, 255, 0.9) !important;
+ backdrop-filter: blur(8px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.2) !important;
+ border-radius: 8px !important;
+ transition: all 0.3s ease !important;
+ }
+
+ &.ant-select-focused .ant-select-selector {
+ background: rgba(255, 255, 255, 0.95) !important;
+ border-color: #6366f1 !important;
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1) !important;
+ }
+}
+
+/* Modern Modal Styles */
+::ng-deep .ant-modal {
+ .ant-modal-content {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(15px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.2) !important;
+ border-radius: 16px !important;
+ box-shadow:
+ 0 20px 60px rgba(0, 0, 0, 0.15),
+ 0 8px 20px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
+ overflow: hidden !important;
+ }
+
+ .ant-modal-header {
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.05), rgba(168, 85, 247, 0.03)) !important;
+ border-bottom: 1px solid rgba(99, 102, 241, 0.1) !important;
+ border-radius: 16px 16px 0 0 !important;
+
+ .ant-modal-title {
+ color: #374151 !important;
+ font-weight: 600 !important;
+ }
+ }
+
+ .ant-modal-close {
+ color: #64748b !important;
+ transition: all 0.3s ease !important;
+
+ &:hover {
+ color: #6366f1 !important;
+ transform: scale(1.1) !important;
+ }
+ }
+}
+
+/* Modern Notification Styles */
+::ng-deep .ant-notification {
+ .ant-notification-notice {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(15px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.2) !important;
+ border-radius: 12px !important;
+ box-shadow:
+ 0 10px 30px rgba(0, 0, 0, 0.1),
+ 0 4px 6px rgba(0, 0, 0, 0.05),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
+ }
+}
+
+/* Modern Layout Content Styles */
+::ng-deep .alain-default__content {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(10px) saturate(180%) !important;
+ border: 1px solid rgba(99, 102, 241, 0.15) !important;
+ border-radius: 16px !important;
+ margin: 16px 16px 16px 16px !important;
+ padding: 20px !important;
+ box-shadow:
+ 0 8px 32px rgba(0, 0, 0, 0.08),
+ 0 4px 16px rgba(0, 0, 0, 0.06),
+ inset 0 1px 0 rgba(255, 255, 255, 0.7),
+ inset 0 0 20px rgba(99, 102, 241, 0.02) !important;
+ position: relative !important;
+ overflow: visible !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ background:
+ radial-gradient(circle at 20% 30%, rgba(99, 102, 241, 0.03) 0%, transparent 50%),
+ radial-gradient(circle at 80% 70%, rgba(168, 85, 247, 0.03) 0%, transparent 50%),
+ radial-gradient(circle at 40% 80%, rgba(59, 130, 246, 0.02) 0%, transparent 50%) !important;
+ pointer-events: none !important;
+ z-index: 0 !important;
+ }
+
+ &::after {
+ content: '' !important;
+ position: absolute !important;
+ top: -1px !important;
+ left: -1px !important;
+ right: -1px !important;
+ bottom: -1px !important;
+ border: 2px solid transparent !important;
+ border-radius: 16px !important;
+ background: linear-gradient(135deg,
+ rgba(99, 102, 241, 0.3) 0%,
+ rgba(168, 85, 247, 0.2) 25%,
+ rgba(59, 130, 246, 0.2) 50%,
+ rgba(16, 185, 129, 0.2) 75%,
+ rgba(99, 102, 241, 0.3) 100%) border-box !important;
+ mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0) !important;
+ mask-composite: xor !important;
+ -webkit-mask-composite: xor !important;
+ animation: borderPulse 4s ease-in-out infinite !important;
+ pointer-events: none !important;
+ z-index: -1 !important;
+ }
+
+ > * {
+ position: relative !important;
+ z-index: 1 !important;
+ }
+}
+
+/* Modern Page Header Styles */
+::ng-deep page-header {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(248, 250, 252, 0.8)) !important;
+ backdrop-filter: blur(10px) !important;
+ border-radius: 12px !important;
+ margin: 16px !important;
+ border: 1px solid rgba(99, 102, 241, 0.1) !important;
+ box-shadow:
+ 0 4px 20px rgba(0, 0, 0, 0.06),
+ 0 1px 3px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
+ position: relative !important;
+ overflow: hidden !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: -100% !important;
+ width: 100% !important;
+ height: 100% !important;
+ background: linear-gradient(90deg, transparent 0%, rgba(99, 102, 241, 0.1) 50%, transparent 100%) !important;
+ animation: slideLight 4s ease-in-out infinite !important;
+ }
+}
+
+/* Modern Card Styles */
+::ng-deep .ant-card {
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(248, 250, 252, 0.9)) !important;
+ backdrop-filter: blur(10px) !important;
+ border: 1px solid rgba(99, 102, 241, 0.1) !important;
+ border-radius: 12px !important;
+ box-shadow:
+ 0 4px 20px rgba(0, 0, 0, 0.06),
+ 0 1px 3px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
+ position: relative !important;
+ overflow: hidden !important;
+
+ &::before {
+ content: '' !important;
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ background:
+ radial-gradient(circle at 20% 80%, rgba(99, 102, 241, 0.02) 0%, transparent 50%),
+ radial-gradient(circle at 80% 20%, rgba(168, 85, 247, 0.02) 0%, transparent 50%) !important;
+ pointer-events: none !important;
+ }
+
+ &:hover {
+ transform: translateY(-2px) !important;
+ box-shadow:
+ 0 8px 30px rgba(0, 0, 0, 0.1),
+ 0 4px 6px rgba(0, 0, 0, 0.1),
+ inset 0 1px 0 rgba(255, 255, 255, 0.9) !important;
+ border-color: rgba(99, 102, 241, 0.2) !important;
+ }
+
+ .ant-card-head {
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.05), rgba(168, 85, 247, 0.03)) !important;
+ border-bottom: 1px solid rgba(99, 102, 241, 0.1) !important;
+ border-radius: 12px 12px 0 0 !important;
+ }
}
/* AI Assistant Chatbot styles */
@@ -198,4 +1694,4 @@
.chatbot-input input {
flex: 1;
margin-right: 8px;
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/web-app/src/app/layout/basic/basic.component.ts b/web-app/src/app/layout/basic/basic.component.ts
index 5636f75..278a251 100644
--- a/web-app/src/app/layout/basic/basic.component.ts
+++ b/web-app/src/app/layout/basic/basic.component.ts
@@ -13,52 +13,107 @@
selector: 'layout-basic',
template: `
<layout-default [options]="options" [nav]="navTpl" [content]="contentTpl" [customError]="null">
+ <!-- 左侧菜单项 - GitHub链接 -->
<layout-default-header-item direction="left">
- <a layout-default-header-item-trigger href="//github.com/apache/hertzbeat" target="_blank">
- <i nz-icon nzType="github"></i>
+ <a
+ layout-default-header-item-trigger
+ href="//github.com/apache/hertzbeat"
+ target="_blank"
+ class="modern-header-item github-link"
+ >
+ <div class="icon-wrapper">
+ <i nz-icon nzType="github" class="header-icon"></i>
+ </div>
+ <span class="item-tooltip">GitHub</span>
</a>
</layout-default-header-item>
+ <!-- 移动端搜索按钮 -->
<layout-default-header-item direction="left" hidden="pc">
- <div layout-default-header-item-trigger (click)="searchToggleStatus = !searchToggleStatus">
- <i nz-icon nzType="search"></i>
+ <div
+ layout-default-header-item-trigger
+ (click)="searchToggleStatus = !searchToggleStatus"
+ class="modern-header-item search-toggle"
+ >
+ <div class="icon-wrapper">
+ <i nz-icon nzType="search" class="header-icon"></i>
+ </div>
</div>
</layout-default-header-item>
+
+ <!-- 中间搜索栏 -->
<layout-default-header-item direction="middle">
- <header-search class="alain-default__search" [toggleChange]="searchToggleStatus"></header-search>
+ <header-search class="alain-default__search modern-search" [toggleChange]="searchToggleStatus"></header-search>
</layout-default-header-item>
+
+ <!-- 右侧通知 -->
<layout-default-header-item direction="right" hidden="mobile">
- <header-notify></header-notify>
+ <header-notify class="modern-header-item notification-item">
+ </header-notify>
</layout-default-header-item>
+
+ <!-- 锁定按钮 -->
<layout-default-header-item direction="right" hidden="mobile">
- <a layout-default-header-item-trigger routerLink="/passport/lock">
- <i nz-icon nzType="lock"></i>
+ <a
+ layout-default-header-item-trigger
+ routerLink="/passport/lock"
+ class="modern-header-item lock-item"
+ >
+ <div class="icon-wrapper">
+ <i nz-icon nzType="lock" class="header-icon"></i>
+ </div>
+ <span class="item-tooltip">{{ 'menu.lock' | i18n }}</span>
</a>
</layout-default-header-item>
+
+ <!-- 设置下拉菜单 -->
<layout-default-header-item direction="right" hidden="mobile">
- <div layout-default-header-item-trigger nz-dropdown [nzDropdownMenu]="settingsMenu" nzTrigger="click" nzPlacement="bottomRight">
- <i nz-icon nzType="setting"></i>
+ <div
+ layout-default-header-item-trigger
+ nz-dropdown
+ [nzDropdownMenu]="settingsMenu"
+ nzTrigger="click"
+ nzPlacement="bottomRight"
+ class="modern-header-item settings-item"
+ >
+ <div class="icon-wrapper">
+ <i nz-icon nzType="setting" class="header-icon spinning-on-hover"></i>
+ </div>
+ <span class="item-tooltip">{{ 'menu.settings' | i18n }}</span>
</div>
<nz-dropdown-menu #settingsMenu="nzDropdownMenu">
- <div nz-menu style="width: 200px;">
- <div nz-menu-item>
- <header-fullscreen></header-fullscreen>
+ <div nz-menu class="modern-dropdown-menu">
+ <div nz-menu-item class="modern-menu-item">
+ <div class="menu-item-content">
+ <i nz-icon nzType="fullscreen" class="menu-icon"></i>
+ <header-fullscreen></header-fullscreen>
+ </div>
</div>
- <div nz-menu-item routerLink="/setting/labels">
- <i nz-icon nzType="tag" class="mr-sm"></i>
- <span style="margin-left: 4px">{{ 'menu.advanced.labels' | i18n }}</span>
+ <li nz-menu-divider class="modern-divider"></li>
+ <div nz-menu-item routerLink="/setting/labels" class="modern-menu-item">
+ <div class="menu-item-content">
+ <i nz-icon nzType="tag" class="menu-icon"></i>
+ <span class="menu-text">{{ 'menu.advanced.labels' | i18n }}</span>
+ </div>
</div>
- <div nz-menu-item>
- <header-i18n></header-i18n>
+ <li nz-menu-divider class="modern-divider"></li>
+ <div nz-menu-item class="modern-menu-item">
+ <div class="menu-item-content">
+ <i nz-icon nzType="global" class="menu-icon"></i>
+ <header-i18n></header-i18n>
+ </div>
</div>
</div>
</nz-dropdown-menu>
</layout-default-header-item>
+
+ <!-- 用户菜单 -->
<layout-default-header-item direction="right">
- <header-user></header-user>
+ <header-user class="modern-header-item user-item">
+ </header-user>
</layout-default-header-item>
<ng-template #navTpl>
- <layout-default-nav class="d-block py-lg" openStrictly="true"></layout-default-nav>
+ <layout-default-nav class="d-block py-lg modern-nav" openStrictly="true"></layout-default-nav>
</ng-template>
<ng-template #contentTpl>
<router-outlet></router-outlet>