|
@@ -3,6 +3,12 @@
|
|
|
// 导入iOS主题变量
|
|
|
@use '../ios-theme.scss' as *;
|
|
|
|
|
|
+// 导入响应式布局样式
|
|
|
+@import './responsive-layout.scss';
|
|
|
+
|
|
|
+// 导入交互效果样式
|
|
|
+@import './interactive-effects.scss';
|
|
|
+
|
|
|
.dashboard-container {
|
|
|
max-width: 1200px;
|
|
|
margin: 0 auto;
|
|
@@ -12,166 +18,369 @@
|
|
|
}
|
|
|
|
|
|
.dashboard-header {
|
|
|
- margin-bottom: 30px;
|
|
|
+ margin-bottom: 32px;
|
|
|
+ padding: 24px 0;
|
|
|
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ // 添加装饰性渐变线
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ bottom: -1px;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ height: 2px;
|
|
|
+ background: linear-gradient(90deg, #007aff 0%, #5ac8fa 50%, transparent 100%);
|
|
|
+ opacity: 0.6;
|
|
|
+ }
|
|
|
+
|
|
|
h1 {
|
|
|
- font-size: 32px;
|
|
|
- color: $ios-text-primary;
|
|
|
- font-weight: $ios-font-weight-semibold;
|
|
|
+ font-size: 36px;
|
|
|
+ color: #1a202c;
|
|
|
+ font-weight: 700;
|
|
|
font-family: $ios-font-family;
|
|
|
- margin-bottom: 20px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ letter-spacing: -0.8px;
|
|
|
+ line-height: 1.2;
|
|
|
+ background: linear-gradient(135deg, #1a202c 0%, #2d3748 100%);
|
|
|
+ -webkit-background-clip: text;
|
|
|
+ -webkit-text-fill-color: transparent;
|
|
|
+ background-clip: text;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ // 添加微妙的文字阴影效果
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background: linear-gradient(135deg, rgba(0, 122, 255, 0.1) 0%, rgba(90, 200, 250, 0.05) 100%);
|
|
|
+ z-index: -1;
|
|
|
+ border-radius: 8px;
|
|
|
+ transform: scale(1.05);
|
|
|
+ opacity: 0;
|
|
|
+ transition: opacity 0.3s ease;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover::before {
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .subtitle {
|
|
|
+ color: #64748b;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 500;
|
|
|
+ margin-top: 8px;
|
|
|
+ letter-spacing: 0.2px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* 顶部导航样式 - 重写为白色背景蓝色过渡效果 */
|
|
|
+/* 顶部导航样式 - 现代化升级 */
|
|
|
.dashboard-nav {
|
|
|
display: flex;
|
|
|
- background-color: #ffffff; /* 设置底色为白色 */
|
|
|
- border-radius: 12px; /* 增大圆角 */
|
|
|
- padding: 4px; /* 保留内边距 */
|
|
|
- margin-bottom: 20px;
|
|
|
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); /* 添加轻微阴影 */
|
|
|
- border: 1px solid #f0f0f0; /* 添加细微边框 */
|
|
|
+ background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
|
|
|
+ border-radius: 16px;
|
|
|
+ padding: 6px;
|
|
|
+ margin-bottom: 24px;
|
|
|
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
|
+ border: 1px solid rgba(0, 0, 0, 0.06);
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ // 添加背景光晕效果
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.8) 0%, rgba(255, 255, 255, 0.4) 100%);
|
|
|
+ pointer-events: none;
|
|
|
+ }
|
|
|
|
|
|
.nav-btn {
|
|
|
flex: 1;
|
|
|
- padding: 14px 24px; /* 增加垂直内边距 */
|
|
|
+ padding: 16px 24px;
|
|
|
border: none;
|
|
|
- border-radius: 10px; /* 增大圆角 */
|
|
|
+ border-radius: 12px;
|
|
|
background-color: transparent;
|
|
|
- color: #666666; /* 默认文字颜色 */
|
|
|
- font-size: 16px; /* 略微增大字体 */
|
|
|
- font-weight: 500;
|
|
|
+ color: #64748b;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
cursor: pointer;
|
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
font-family: $ios-font-family;
|
|
|
position: relative;
|
|
|
overflow: hidden;
|
|
|
- z-index: 1;
|
|
|
+ z-index: 2;
|
|
|
text-align: center;
|
|
|
+ letter-spacing: 0.3px;
|
|
|
|
|
|
- // 按钮点击效果
|
|
|
- &:active {
|
|
|
- transform: scale(0.97);
|
|
|
+ // 悬停效果
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: -100%;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ background: linear-gradient(90deg, transparent, rgba(0, 122, 255, 0.1), transparent);
|
|
|
+ transition: left 0.4s;
|
|
|
}
|
|
|
-
|
|
|
- // 活动状态样式
|
|
|
- &.active {
|
|
|
- color: #ffffff; /* 活动状态文字为白色 */
|
|
|
- font-weight: 600;
|
|
|
+
|
|
|
+ &:hover:not(.active) {
|
|
|
+ color: #374151;
|
|
|
+ background: rgba(255, 255, 255, 0.8);
|
|
|
+ transform: translateY(-1px);
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
|
|
|
|
- // 蓝色背景动画效果
|
|
|
&::before {
|
|
|
+ left: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &.active {
|
|
|
+ background: linear-gradient(135deg, #007aff 0%, #5ac8fa 100%);
|
|
|
+ color: white;
|
|
|
+ transform: translateY(-2px);
|
|
|
+ box-shadow: 0 6px 20px rgba(0, 122, 255, 0.3), 0 2px 4px rgba(0, 122, 255, 0.2);
|
|
|
+ font-weight: 700;
|
|
|
+
|
|
|
+ // 活跃状态的光晕效果
|
|
|
+ &::after {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
- top: 0;
|
|
|
- left: 0;
|
|
|
- right: 0;
|
|
|
- bottom: 0;
|
|
|
- background-color: #007aff; /* 设置为iOS蓝色 */
|
|
|
- border-radius: 10px;
|
|
|
- box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3); /* 蓝色阴影效果 */
|
|
|
+ top: -2px;
|
|
|
+ left: -2px;
|
|
|
+ right: -2px;
|
|
|
+ bottom: -2px;
|
|
|
+ background: linear-gradient(135deg, #007aff 0%, #5ac8fa 100%);
|
|
|
+ border-radius: 14px;
|
|
|
z-index: -1;
|
|
|
- animation: buttonSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
|
+ opacity: 0.3;
|
|
|
+ filter: blur(6px);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // 悬停效果
|
|
|
- &:hover:not(.active) {
|
|
|
- background-color: rgba(0, 122, 255, 0.05); /* 轻微蓝色背景 */
|
|
|
- color: #007aff; /* 文字变为蓝色 */
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-// 按钮切换动画 - 优化效果
|
|
|
-@keyframes buttonSlideIn {
|
|
|
- 0% {
|
|
|
- transform: translateX(100%);
|
|
|
- opacity: 0;
|
|
|
- }
|
|
|
- 100% {
|
|
|
- transform: translateX(0);
|
|
|
- opacity: 1;
|
|
|
+ &:active {
|
|
|
+ transform: translateY(-1px);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
.dashboard-main {
|
|
|
display: grid;
|
|
|
grid-template-columns: 1fr;
|
|
|
- gap: 24px;
|
|
|
+ gap: 32px;
|
|
|
+ padding: 0 4px; // 添加轻微的水平内边距
|
|
|
}
|
|
|
|
|
|
-/* 视图切换按钮样式 */
|
|
|
+/* 视图切换按钮样式 - 现代化升级 */
|
|
|
.view-toggle {
|
|
|
display: flex;
|
|
|
justify-content: flex-end;
|
|
|
- margin-bottom: 8px;
|
|
|
+ margin-bottom: 16px;
|
|
|
+ gap: 8px;
|
|
|
|
|
|
.toggle-btn {
|
|
|
- background: $ios-card-background;
|
|
|
- color: $ios-text-primary;
|
|
|
- border: 1px solid $ios-border;
|
|
|
- border-radius: $ios-radius-md;
|
|
|
- padding: 8px 14px;
|
|
|
+ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
|
|
|
+ color: #64748b;
|
|
|
+ border: 1px solid rgba(0, 0, 0, 0.08);
|
|
|
+ border-radius: 12px;
|
|
|
+ padding: 12px 20px;
|
|
|
cursor: pointer;
|
|
|
font-family: $ios-font-family;
|
|
|
- transition: all .2s ease;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 14px;
|
|
|
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+ letter-spacing: 0.3px;
|
|
|
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
|
|
|
|
- &:hover {
|
|
|
- background-color: color-mix(in srgb, $ios-background-secondary 70%, white);
|
|
|
+ // 图标样式
|
|
|
+ ion-icon {
|
|
|
+ font-size: 18px;
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 悬停效果
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: -100%;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ background: linear-gradient(90deg, transparent, rgba(0, 122, 255, 0.1), transparent);
|
|
|
+ transition: left 0.4s;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover:not(.active) {
|
|
|
+ color: #374151;
|
|
|
+ background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
|
|
|
+ transform: translateY(-2px);
|
|
|
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ left: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ ion-icon {
|
|
|
+ transform: scale(1.1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &.active {
|
|
|
+ background: linear-gradient(135deg, #007aff 0%, #5ac8fa 100%);
|
|
|
+ color: white;
|
|
|
+ border-color: transparent;
|
|
|
+ box-shadow: 0 4px 16px rgba(0, 122, 255, 0.3), 0 2px 4px rgba(0, 122, 255, 0.2);
|
|
|
+ transform: translateY(-2px);
|
|
|
+
|
|
|
+ ion-icon {
|
|
|
+ transform: scale(1.1);
|
|
|
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 活跃状态的光晕效果
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: -2px;
|
|
|
+ left: -2px;
|
|
|
+ right: -2px;
|
|
|
+ bottom: -2px;
|
|
|
+ background: linear-gradient(135deg, #007aff 0%, #5ac8fa 100%);
|
|
|
+ border-radius: 14px;
|
|
|
+ z-index: -1;
|
|
|
+ opacity: 0.3;
|
|
|
+ filter: blur(6px);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ transform: translateY(-1px);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* 列表视图样式 */
|
|
|
+/* 列表视图样式 - 现代化升级 */
|
|
|
.list-section {
|
|
|
- background: $ios-card-background;
|
|
|
- border-radius: $ios-radius-lg;
|
|
|
- border: 1px solid $ios-border;
|
|
|
- box-shadow: $ios-shadow-card;
|
|
|
+ background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
|
|
|
+ border-radius: 16px;
|
|
|
+ border: 1px solid rgba(0, 0, 0, 0.06);
|
|
|
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
|
overflow: hidden;
|
|
|
+ backdrop-filter: blur(10px);
|
|
|
|
|
|
.list-header {
|
|
|
display: grid;
|
|
|
grid-template-columns: 120px 1.2fr 1.2fr 120px 180px 120px 160px;
|
|
|
- padding: 12px 16px;
|
|
|
- background: $ios-background-secondary;
|
|
|
- color: $ios-text-secondary;
|
|
|
- font-weight: $ios-font-weight-medium;
|
|
|
- border-bottom: 1px solid $ios-border;
|
|
|
+ padding: 16px 20px;
|
|
|
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
|
|
|
+ color: #64748b;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 13px;
|
|
|
+ letter-spacing: 0.5px;
|
|
|
+ text-transform: uppercase;
|
|
|
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
|
|
|
+ position: sticky;
|
|
|
+ top: 0;
|
|
|
+ z-index: 10;
|
|
|
}
|
|
|
|
|
|
.list-body {
|
|
|
.list-row {
|
|
|
display: grid;
|
|
|
grid-template-columns: 120px 1.2fr 1.2fr 120px 180px 120px 160px;
|
|
|
- padding: 12px 16px;
|
|
|
+ padding: 16px 20px;
|
|
|
align-items: center;
|
|
|
- border-bottom: 1px solid $ios-border;
|
|
|
- transition: background .2s ease;
|
|
|
+ border-bottom: 1px solid rgba(0, 0, 0, 0.04);
|
|
|
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ // 添加微妙的悬停效果
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ width: 4px;
|
|
|
+ background: linear-gradient(135deg, #007aff 0%, #5ac8fa 100%);
|
|
|
+ transform: scaleY(0);
|
|
|
+ transition: transform 0.3s ease;
|
|
|
+ }
|
|
|
|
|
|
&:hover {
|
|
|
- background: rgba(0,0,0,0.02);
|
|
|
+ background: linear-gradient(135deg, rgba(0, 122, 255, 0.02) 0%, rgba(90, 200, 250, 0.01) 100%);
|
|
|
+ transform: translateX(4px);
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ transform: scaleY(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ border-bottom: none;
|
|
|
}
|
|
|
|
|
|
.col {
|
|
|
font-size: 14px;
|
|
|
- color: $ios-text-primary;
|
|
|
+ color: #374151;
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
|
|
|
.actions-col {
|
|
|
display: flex;
|
|
|
- gap: 10px;
|
|
|
+ gap: 12px;
|
|
|
+
|
|
|
.btn-link {
|
|
|
background: transparent;
|
|
|
border: none;
|
|
|
color: #007aff;
|
|
|
cursor: pointer;
|
|
|
- padding: 6px 8px;
|
|
|
- border-radius: $ios-radius-sm;
|
|
|
+ padding: 8px 12px;
|
|
|
+ border-radius: 8px;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 13px;
|
|
|
+ transition: all 0.3s 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, rgba(0, 122, 255, 0.1), transparent);
|
|
|
+ transition: left 0.4s;
|
|
|
+ }
|
|
|
|
|
|
&:hover {
|
|
|
- background: rgba(0,122,255,0.08);
|
|
|
+ background: rgba(0, 122, 255, 0.08);
|
|
|
+ transform: translateY(-1px);
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ left: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ transform: translateY(0);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -179,192 +388,441 @@
|
|
|
.urgency-col {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- gap: 8px;
|
|
|
+ gap: 10px;
|
|
|
+
|
|
|
.urgency-dot {
|
|
|
- width: 10px;
|
|
|
- height: 10px;
|
|
|
+ width: 12px;
|
|
|
+ height: 12px;
|
|
|
border-radius: 50%;
|
|
|
display: inline-block;
|
|
|
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ // 添加脉冲动画效果
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: -2px;
|
|
|
+ left: -2px;
|
|
|
+ right: -2px;
|
|
|
+ bottom: -2px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: inherit;
|
|
|
+ opacity: 0.3;
|
|
|
+ animation: pulse 2s infinite;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
.urgency-text {
|
|
|
- font-weight: $ios-font-weight-medium;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 13px;
|
|
|
+ letter-spacing: 0.3px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* 紧急度颜色 */
|
|
|
- .urgency-overdue { background: $ios-danger; }
|
|
|
- .urgency-high { background: #ff9500; }
|
|
|
- .urgency-medium { background: #ffcc00; }
|
|
|
- .urgency-low { background: #34c759; }
|
|
|
+ /* 紧急度颜色 - 现代化升级 */
|
|
|
+ .urgency-overdue {
|
|
|
+ background: linear-gradient(135deg, #ef4444 0%, #f87171 100%);
|
|
|
+
|
|
|
+ .urgency-text {
|
|
|
+ color: #dc2626;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .urgency-high {
|
|
|
+ background: linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%);
|
|
|
+
|
|
|
+ .urgency-text {
|
|
|
+ color: #d97706;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .urgency-medium {
|
|
|
+ background: linear-gradient(135deg, #eab308 0%, #facc15 100%);
|
|
|
+
|
|
|
+ .urgency-text {
|
|
|
+ color: #ca8a04;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .urgency-low {
|
|
|
+ background: linear-gradient(135deg, #22c55e 0%, #4ade80 100%);
|
|
|
+
|
|
|
+ .urgency-text {
|
|
|
+ color: #16a34a;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* 核心卡片区域样式 */
|
|
|
+// 脉冲动画
|
|
|
+@keyframes pulse {
|
|
|
+ 0% {
|
|
|
+ transform: scale(1);
|
|
|
+ opacity: 0.3;
|
|
|
+ }
|
|
|
+ 50% {
|
|
|
+ transform: scale(1.2);
|
|
|
+ opacity: 0.1;
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ transform: scale(1);
|
|
|
+ opacity: 0.3;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 核心卡片区域样式 - 现代化设计 */
|
|
|
.core-cards-section {
|
|
|
- margin-bottom: 30px;
|
|
|
+ margin-bottom: 32px;
|
|
|
|
|
|
.cards-grid {
|
|
|
display: grid;
|
|
|
- grid-template-columns: repeat(3, 1fr);
|
|
|
- gap: 20px;
|
|
|
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
|
|
+ gap: 24px;
|
|
|
+
|
|
|
+ @media (max-width: 1400px) {
|
|
|
+ grid-template-columns: repeat(2, 1fr);
|
|
|
+ gap: 22px;
|
|
|
+ }
|
|
|
|
|
|
- @media (max-width: 1024px) {
|
|
|
+ @media (max-width: 1200px) {
|
|
|
grid-template-columns: repeat(2, 1fr);
|
|
|
+ gap: 20px;
|
|
|
}
|
|
|
|
|
|
@media (max-width: 768px) {
|
|
|
grid-template-columns: 1fr;
|
|
|
+ gap: 16px;
|
|
|
+ }
|
|
|
+
|
|
|
+ @media (max-width: 480px) {
|
|
|
+ gap: 12px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* 核心卡片基础样式 */
|
|
|
+/* 核心卡片基础样式 - 现代化升级 */
|
|
|
.core-card {
|
|
|
- background: $ios-card-background;
|
|
|
- border-radius: $ios-radius-lg;
|
|
|
- padding: 20px;
|
|
|
- box-shadow: $ios-shadow-card;
|
|
|
- transition: all 0.3s ease;
|
|
|
- border: 1px solid $ios-border;
|
|
|
+ background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
|
|
|
+ border-radius: 16px;
|
|
|
+ padding: 24px;
|
|
|
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
|
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
+ border: 1px solid rgba(255, 255, 255, 0.8);
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
height: 100%;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ // 添加微妙的背景纹理
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ height: 4px;
|
|
|
+ background: linear-gradient(90deg, #007aff 0%, #5ac8fa 50%, #34c759 100%);
|
|
|
+ opacity: 0;
|
|
|
+ transition: opacity 0.3s ease;
|
|
|
+ }
|
|
|
|
|
|
&:hover {
|
|
|
- box-shadow: $ios-shadow-lg;
|
|
|
- transform: translateY(-2px);
|
|
|
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
|
+ transform: translateY(-4px) scale(1.02);
|
|
|
+ border-color: rgba(0, 122, 255, 0.2);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 紧急任务卡片特殊样式
|
|
|
+ &.urgent-card {
|
|
|
+ background: linear-gradient(135deg, #fff5f5 0%, #fef2f2 100%);
|
|
|
+ border-color: rgba(239, 68, 68, 0.2);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ background: linear-gradient(90deg, #ef4444 0%, #f87171 100%);
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ border-color: rgba(239, 68, 68, 0.3);
|
|
|
+ box-shadow: 0 8px 32px rgba(239, 68, 68, 0.15), 0 2px 8px rgba(239, 68, 68, 0.1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 工作量卡片特殊样式
|
|
|
+ &.workload-card {
|
|
|
+ background: linear-gradient(135deg, #f0fdf4 0%, #f7fee7 100%);
|
|
|
+ border-color: rgba(34, 197, 94, 0.2);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ background: linear-gradient(90deg, #22c55e 0%, #4ade80 100%);
|
|
|
+ opacity: 0.8;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ border-color: rgba(34, 197, 94, 0.3);
|
|
|
+ box-shadow: 0 8px 32px rgba(34, 197, 94, 0.15), 0 2px 8px rgba(34, 197, 94, 0.1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.card-header {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
align-items: flex-start;
|
|
|
- margin-bottom: 16px;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
|
|
|
.card-badge {
|
|
|
- padding: 4px 12px;
|
|
|
- border-radius: $ios-radius-full;
|
|
|
- font-size: 12px;
|
|
|
- font-weight: $ios-font-weight-medium;
|
|
|
+ padding: 6px 14px;
|
|
|
+ border-radius: 20px;
|
|
|
+ font-size: 11px;
|
|
|
+ font-weight: 600;
|
|
|
+ letter-spacing: 0.5px;
|
|
|
+ text-transform: uppercase;
|
|
|
color: $ios-text-secondary;
|
|
|
- background-color: $ios-background-secondary;
|
|
|
+ background: rgba(0, 0, 0, 0.05);
|
|
|
+ backdrop-filter: blur(10px);
|
|
|
+ border: 1px solid rgba(255, 255, 255, 0.2);
|
|
|
|
|
|
&.urgent {
|
|
|
- background-color: rgba(255, 59, 48, 0.1);
|
|
|
- color: $ios-danger;
|
|
|
- border: 1px solid $ios-danger;
|
|
|
+ background: linear-gradient(135deg, rgba(239, 68, 68, 0.15) 0%, rgba(248, 113, 113, 0.1) 100%);
|
|
|
+ color: #dc2626;
|
|
|
+ border-color: rgba(239, 68, 68, 0.3);
|
|
|
+ box-shadow: 0 2px 8px rgba(239, 68, 68, 0.2);
|
|
|
}
|
|
|
|
|
|
&.workload {
|
|
|
- background-color: rgba(52, 199, 89, 0.1);
|
|
|
- color: $ios-success;
|
|
|
- border: 1px solid $ios-success;
|
|
|
+ background: linear-gradient(135deg, rgba(34, 197, 94, 0.15) 0%, rgba(74, 222, 128, 0.1) 100%);
|
|
|
+ color: #16a34a;
|
|
|
+ border-color: rgba(34, 197, 94, 0.3);
|
|
|
+ box-shadow: 0 2px 8px rgba(34, 197, 94, 0.2);
|
|
|
}
|
|
|
|
|
|
&.overdue {
|
|
|
- background-color: rgba(255, 149, 0, 0.1);
|
|
|
- color: $ios-warning;
|
|
|
- border: 1px solid $ios-warning;
|
|
|
+ background: linear-gradient(135deg, rgba(245, 158, 11, 0.15) 0%, rgba(251, 191, 36, 0.1) 100%);
|
|
|
+ color: #d97706;
|
|
|
+ border-color: rgba(245, 158, 11, 0.3);
|
|
|
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.2);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
h3 {
|
|
|
- font-size: 17px;
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: 600;
|
|
|
color: $ios-text-primary;
|
|
|
margin: 0;
|
|
|
font-family: $ios-font-family;
|
|
|
flex: 1;
|
|
|
- margin-right: 10px;
|
|
|
+ margin-right: 12px;
|
|
|
+ line-height: 1.4;
|
|
|
+ letter-spacing: -0.2px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.card-content {
|
|
|
flex: 1;
|
|
|
- margin-bottom: 16px;
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
|
- .project-name,
|
|
|
- .deadline,
|
|
|
- .countdown,
|
|
|
- .workload-status {
|
|
|
- font-size: 14px;
|
|
|
- color: $ios-text-secondary;
|
|
|
- margin: 6px 0;
|
|
|
+ .project-name {
|
|
|
+ font-size: 15px;
|
|
|
+ color: #6b7280;
|
|
|
+ margin: 8px 0;
|
|
|
+ font-weight: 500;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '📁';
|
|
|
+ margin-right: 8px;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- .deadline.overdue {
|
|
|
- color: $ios-danger;
|
|
|
+ .deadline {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #9ca3af;
|
|
|
+ margin: 8px 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '📅';
|
|
|
+ margin-right: 8px;
|
|
|
+ font-size: 13px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.overdue {
|
|
|
+ color: #dc2626;
|
|
|
+ font-weight: 600;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '⚠️';
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.countdown {
|
|
|
- color: $ios-warning;
|
|
|
- font-weight: $ios-font-weight-medium;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #f59e0b;
|
|
|
+ font-weight: 600;
|
|
|
+ margin: 8px 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '⏰';
|
|
|
+ margin-right: 8px;
|
|
|
+ font-size: 13px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .workload-status {
|
|
|
+ font-size: 15px;
|
|
|
+ color: #6b7280;
|
|
|
+ margin: 8px 0;
|
|
|
+ font-weight: 500;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.card-actions {
|
|
|
display: flex;
|
|
|
- gap: 10px;
|
|
|
+ gap: 12px;
|
|
|
|
|
|
button {
|
|
|
- padding: 8px 16px;
|
|
|
+ padding: 12px 20px;
|
|
|
border: none;
|
|
|
- border-radius: $ios-radius-md;
|
|
|
+ border-radius: 12px;
|
|
|
font-size: 14px;
|
|
|
+ font-weight: 600;
|
|
|
cursor: pointer;
|
|
|
- transition: all 0.3s ease;
|
|
|
- font-weight: $ios-font-weight-medium;
|
|
|
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
font-family: $ios-font-family;
|
|
|
flex: 1;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: -100%;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
|
|
|
+ transition: left 0.5s;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover::before {
|
|
|
+ left: 100%;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.btn-primary {
|
|
|
- background-color: $ios-primary;
|
|
|
+ background: linear-gradient(135deg, #007aff 0%, #5ac8fa 100%);
|
|
|
color: white;
|
|
|
+ box-shadow: 0 4px 12px rgba(0, 122, 255, 0.3);
|
|
|
|
|
|
&:hover {
|
|
|
- background-color: color-mix(in srgb, $ios-primary 90%, black);
|
|
|
- transform: translateY(-1px);
|
|
|
- box-shadow: $ios-shadow-md;
|
|
|
+ background: linear-gradient(135deg, #0056cc 0%, #4aa3d9 100%);
|
|
|
+ transform: translateY(-2px);
|
|
|
+ box-shadow: 0 6px 20px rgba(0, 122, 255, 0.4);
|
|
|
+ }
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ transform: translateY(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.btn-secondary {
|
|
|
- background-color: $ios-background-secondary;
|
|
|
+ background: rgba(0, 0, 0, 0.05);
|
|
|
color: $ios-text-primary;
|
|
|
- border: 1px solid $ios-border;
|
|
|
+ border: 1px solid rgba(0, 0, 0, 0.1);
|
|
|
+ backdrop-filter: blur(10px);
|
|
|
|
|
|
&:hover {
|
|
|
- background-color: color-mix(in srgb, $ios-background-secondary 70%, white);
|
|
|
+ background: rgba(0, 0, 0, 0.08);
|
|
|
+ border-color: rgba(0, 0, 0, 0.15);
|
|
|
+ transform: translateY(-1px);
|
|
|
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* 工作量卡片特定样式 */
|
|
|
+/* 工作量卡片特定样式 - 现代化升级 */
|
|
|
.workload-card {
|
|
|
.workload-indicator {
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
- margin: 20px 0;
|
|
|
+ margin: 24px 0;
|
|
|
}
|
|
|
|
|
|
.workload-circle {
|
|
|
- width: 120px;
|
|
|
- height: 120px;
|
|
|
+ width: 140px;
|
|
|
+ height: 140px;
|
|
|
border-radius: 50%;
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
- box-shadow: $ios-shadow-md;
|
|
|
- transition: all 0.3s ease;
|
|
|
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), inset 0 2px 4px rgba(255, 255, 255, 0.8);
|
|
|
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
+ position: relative;
|
|
|
+ background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%);
|
|
|
+ border: 3px solid transparent;
|
|
|
+
|
|
|
+ // 动态边框效果
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: -3px;
|
|
|
+ left: -3px;
|
|
|
+ right: -3px;
|
|
|
+ bottom: -3px;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: linear-gradient(135deg, #22c55e 0%, #4ade80 50%, #10b981 100%);
|
|
|
+ z-index: -1;
|
|
|
+ opacity: 0.8;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 内部光晕效果
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 10%;
|
|
|
+ left: 10%;
|
|
|
+ right: 10%;
|
|
|
+ bottom: 10%;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.6) 0%, transparent 50%);
|
|
|
+ pointer-events: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ transform: scale(1.05);
|
|
|
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15), inset 0 2px 4px rgba(255, 255, 255, 0.9);
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ opacity: 1;
|
|
|
+ background: linear-gradient(135deg, #16a34a 0%, #22c55e 50%, #4ade80 100%);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
.workload-percentage {
|
|
|
- font-size: 28px;
|
|
|
- font-weight: $ios-font-weight-bold;
|
|
|
- color: white;
|
|
|
+ font-size: 32px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #1f2937;
|
|
|
font-family: $ios-font-family;
|
|
|
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
}
|
|
|
}
|
|
|
}
|