a7e6145bb1
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 2s
CI/CD Pipeline / Check push changed paths (push) Successful in 5s
CI/CD Pipeline / Build Staging API Image (push) Successful in 25s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 25s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 50s
CI/CD Pipeline / Integration Tests (push) Successful in 1m45s
CI/CD Pipeline / Validate - Python (mypy + alembic) (push) Successful in 2m0s
CI/CD Pipeline / Validate - Style (push) Successful in 2m28s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 1m33s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m46s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 4m48s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 2m35s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m9s
CI/CD Pipeline / Unit Tests (push) Successful in 7m41s
CI/CD Pipeline / Validate - Security (push) Successful in 8m31s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Canary Release to Production (push) Failing after 182h57m22s
CI/CD Pipeline / CI Gate (push) Failing after 182h57m25s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 182h57m25s
CI/CD Pipeline / Build Production API Image (push) Failing after 182h57m26s
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Failing after 183h5m2s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 183h6m2s
CI/CD Pipeline / PR Build Web Image (push) Failing after 183h6m2s
CI/CD Pipeline / Retag skipped Staging Web Image (push) Failing after 183h5m2s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 183h6m4s
CI/CD Pipeline / Retag skipped Staging API Image (push) Failing after 183h5m2s
CI/CD Pipeline / Deploy Production (push) Failing after 183h32m8s
CI/CD Pipeline / Build Production Web Image (push) Failing after 183h32m11s
CI/CD Pipeline / Frontend Lint (push) Failing after 183h40m44s
CI/CD Pipeline / PR Build API Image (push) Failing after 183h40m48s
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
169 lines
5.1 KiB
CSS
169 lines
5.1 KiB
CSS
/* ============================================================
|
||
Sidebar.css - 侧边栏导航样式(Task 1.3)
|
||
|
||
结构:
|
||
.xx-sidebar-nav 导航容器
|
||
├── .xx-sidebar-group 分组
|
||
│ ├── .xx-sidebar-group-title 分组标题(折叠时隐藏)
|
||
│ └── .xx-sidebar-menu 菜单列表
|
||
│ └── .xx-sidebar-menu-item 菜单项
|
||
│ ├── .xx-sidebar-menu-icon 图标
|
||
│ └── .xx-sidebar-menu-label 文字标签(折叠时隐藏)
|
||
└── .xx-sidebar-nav--collapsed 折叠态修饰类
|
||
|
||
所有样式使用 global.css 设计系统变量
|
||
============================================================ */
|
||
|
||
/* ── 导航容器 ─────────────────────────────────────────────── */
|
||
.xx-sidebar-nav {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: var(--space-xs);
|
||
padding: var(--space-xs) 0;
|
||
}
|
||
|
||
/* ── 分组 ─────────────────────────────────────────────────── */
|
||
.xx-sidebar-group {
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
|
||
/* 分组标题 */
|
||
.xx-sidebar-group-title {
|
||
padding: var(--space-sm) var(--space-sm) var(--space-xs);
|
||
font-size: var(--font-size-xs);
|
||
font-weight: var(--font-weight-semibold);
|
||
color: var(--text-tertiary);
|
||
text-transform: uppercase;
|
||
letter-spacing: var(--letter-spacing-wide);
|
||
line-height: var(--line-height-tight);
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
user-select: none;
|
||
}
|
||
|
||
/* ── 菜单列表 ─────────────────────────────────────────────── */
|
||
.xx-sidebar-menu {
|
||
list-style: none;
|
||
margin: 0;
|
||
padding: 0;
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: var(--space-xxs);
|
||
}
|
||
|
||
/* ── 菜单项 ───────────────────────────────────────────────── */
|
||
.xx-sidebar-menu-item {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: var(--space-xs);
|
||
padding: var(--space-sm) var(--space-xs);
|
||
margin: 0 var(--space-xxs);
|
||
border-radius: var(--radius-sm);
|
||
cursor: pointer;
|
||
color: var(--text-secondary);
|
||
font-size: var(--font-size-base);
|
||
font-weight: var(--font-weight-medium);
|
||
line-height: var(--line-height-base);
|
||
transition: var(--transition-colors);
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
user-select: none;
|
||
min-height: 40px;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.xx-sidebar-menu-item:hover {
|
||
color: var(--text-primary);
|
||
background: var(--primary-soft);
|
||
}
|
||
|
||
/* 激活态 —— Indigo 高亮 */
|
||
.xx-sidebar-menu-item.xx-active {
|
||
color: var(--primary-color);
|
||
background: var(--primary-soft);
|
||
font-weight: var(--font-weight-semibold);
|
||
box-shadow: inset 3px 0 0 var(--primary-color);
|
||
}
|
||
|
||
.xx-sidebar-menu-item.xx-active:hover {
|
||
color: var(--primary-hover);
|
||
background: var(--primary-soft);
|
||
}
|
||
|
||
/* ── 菜单项图标 ───────────────────────────────────────────── */
|
||
.xx-sidebar-menu-icon {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
flex-shrink: 0;
|
||
width: 28px;
|
||
height: 28px;
|
||
border-radius: 8px;
|
||
background: #f1f5f9;
|
||
color: var(--text-secondary);
|
||
font-size: 16px;
|
||
line-height: 1;
|
||
transition: 0.15s ease;
|
||
}
|
||
|
||
.xx-sidebar-menu-item.xx-active .xx-sidebar-menu-icon {
|
||
background: var(--primary-color);
|
||
color: #fff;
|
||
}
|
||
|
||
.xx-sidebar-menu-item:hover .xx-sidebar-menu-icon {
|
||
color: var(--primary-color);
|
||
}
|
||
|
||
/* ── 菜单项文字 ───────────────────────────────────────────── */
|
||
.xx-sidebar-menu-label {
|
||
flex: 1;
|
||
min-width: 0;
|
||
overflow: hidden;
|
||
white-space: nowrap;
|
||
text-overflow: ellipsis;
|
||
}
|
||
|
||
/* ============================================================
|
||
折叠态 —— 仅显示图标
|
||
============================================================ */
|
||
.xx-sidebar-nav--collapsed {
|
||
padding: var(--space-xs) 0;
|
||
}
|
||
|
||
/* 折叠时菜单项居中,仅图标 */
|
||
.xx-sidebar-nav--collapsed .xx-sidebar-menu-item {
|
||
justify-content: center;
|
||
padding: var(--space-xs);
|
||
margin: 0;
|
||
}
|
||
|
||
/* 折叠态图标恢复更大尺寸居中 */
|
||
.xx-sidebar-nav--collapsed .xx-sidebar-menu-icon {
|
||
width: 32px;
|
||
height: 32px;
|
||
border-radius: 8px;
|
||
font-size: 16px;
|
||
}
|
||
|
||
/* 折叠时隐藏分组标题 */
|
||
.xx-sidebar-nav--collapsed .xx-sidebar-group-title {
|
||
display: none;
|
||
}
|
||
|
||
/* ============================================================
|
||
响应式 —— 移动端(≤768px)
|
||
侧边栏整体由 MainLayout 控制显示/隐藏,
|
||
此处仅确保导航内容在移动端不溢出
|
||
============================================================ */
|
||
@media (max-width: 768px) {
|
||
.xx-sidebar-nav {
|
||
padding: var(--space-xs) 0;
|
||
}
|
||
|
||
.xx-sidebar-menu-item {
|
||
min-height: 44px; /* 移动端更大的点击区域 */
|
||
}
|
||
}
|