Files
teach_sys_Demo/src/pages/CalendarPage/index.css
KQL 4f64941d85 feat: 添加HR访问量弹窗和日历事项样式优化
- 新增HR访问详情弹窗组件,支持左右切换查看不同HR信息
- 优化日历事项样式系统,基于事件类型匹配样式配置
- 完善侧边栏HR访问量组件,添加重叠头像和点击交互
- 增加班级排名弹窗组件
- 更新专家支持页面布局和样式

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 18:40:40 +08:00

1020 lines
17 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* CSS变量定义 */
:root {
--primary-color: #3b82f6;
--border-color: #e5e6eb;
--text-color: #1d2129;
--text-muted: #86909c;
--bg-hover: #f2f3f5;
}
/* 日历页面样式 */
.calendar-page {
width: 100%;
height: 100%;
padding: 20px;
.calendar-page-wrapper {
width: 1120px;
height: 862px;
display: flex;
padding: 20px;
background-color: #fff;
flex-direction: column;
}
}
/* 日历头部控制栏 */
.calendar-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 0;
margin-bottom: 24px;
border-bottom: 1px solid var(--border-color);
}
.calendar-nav {
display: flex;
align-items: center;
gap: 16px;
}
.nav-button {
width: 32px;
height: 32px;
border: 1px solid var(--border-color);
background: white;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.15s ease;
color: var(--text-secondary);
}
.nav-button:hover {
background: #f3f4f6;
border-color: var(--primary-color);
color: var(--primary-color);
}
.nav-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.calendar-title {
font-size: 20px;
font-weight: 600;
color: var(--text-primary);
margin: 0 8px;
}
.view-switcher {
display: flex;
background: #f3f4f6;
border-radius: 6px;
padding: 2px;
}
.view-button {
padding: 6px 16px;
border: none;
background: none;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
color: var(--text-secondary);
}
.view-button.active {
background: var(--text-primary);
color: white;
}
.view-button:hover:not(.active) {
background: #e5e7eb;
}
/* 日历主体容器 */
.calendar-container {
flex: 1;
background: white;
border-radius: 8px;
box-shadow: var(--shadow);
border: 1px solid var(--border-color);
overflow: hidden;
}
/* 月视图样式 */
.month-view {
height: 100%;
display: flex;
flex-direction: column;
}
.month-header {
display: grid;
grid-template-columns: repeat(7, 1fr);
background: #f8fafc;
border-bottom: 1px solid var(--border-color);
}
.weekday-header {
padding: 12px 8px;
text-align: center;
font-size: 13px;
font-weight: 600;
color: var(--text-secondary);
border-right: 1px solid #e5e7eb;
}
.weekday-header:last-child {
border-right: none;
}
.month-grid {
flex: 1;
display: grid;
grid-template-columns: repeat(7, 1fr);
grid-template-rows: repeat(6, 1fr);
gap: 1px;
background: #e5e7eb;
padding: 1px;
}
.day-cell {
background: white;
padding: 10px;
display: flex;
flex-direction: column;
cursor: pointer;
transition: all 0.3s ease;
min-height: 100px;
max-height: 100px;
height: 100px;
position: relative;
border-radius: 10px;
border: 1px solid #e8e8f0;
margin: 3px;
overflow: hidden;
}
.day-cell:hover {
background: linear-gradient(135deg, #fafbff 0%, #f5f7ff 100%);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.08);
transform: translateY(-2px);
border-color: #d4deff;
}
.day-cell.other-month {
background: #fafbfc;
color: #b8bcc8;
opacity: 0.5;
}
.day-cell.today {
background: linear-gradient(135deg, #e8f4ff 0%, #f0f9ff 100%) !important;
border: 2px solid #3b82f6;
box-shadow: 0 6px 16px rgba(59, 130, 246, 0.12);
}
.day-cell.selected {
background: linear-gradient(135deg, #dbeafe 0%, #e6f2ff 100%) !important;
border: 2px solid #2563eb;
box-shadow: 0 4px 12px rgba(37, 99, 235, 0.15);
}
/* 删除no-events样式限制允许所有日期都可点击 */
.day-number {
font-size: 14px;
font-weight: 500;
margin-bottom: 4px;
align-self: flex-start;
}
.day-cell.today .day-number {
background: #3b82f6;
color: white;
width: 24px;
height: 24px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
.event-list {
flex: 1;
display: flex;
flex-direction: column;
gap: 2px;
overflow: hidden;
}
/* 新的事项样式 - 使用JSON配置 */
.event-item-new {
font-size: 11px;
padding: 3px 6px;
border-radius: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 500;
max-width: 100%;
display: block;
margin: 1px 0;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(0, 0, 0, 0.1);
}
.event-item-new:hover {
transform: translateX(2px);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15);
opacity: 0.9;
}
.event-item-new .event-content {
display: flex;
align-items: center;
overflow: hidden;
}
.event-item-new .event-icon {
flex-shrink: 0;
}
.event-item-new .event-title {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 保持原有样式作为备用 */
.event-item {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
font-size: 11px;
padding: 3px 6px;
border-radius: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
transition: all 0.3s ease;
margin: 1px 0;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
font-weight: 500;
max-width: 100%;
display: block;
}
.event-item:hover {
transform: translateX(2px);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15);
}
/* 复合技能课 */
.event-item.compound-skill {
background: #5AC6FF;
}
/* 垂直技能课 */
.event-item.vertical-skill {
background: #CB78E0;
}
/* 企业高管公开课 */
.event-item.public-course {
background: #D0A474;
}
/* AI课程 */
.event-item.ai-course {
background: #F7A133;
}
/* 营销课 */
.event-item.marketing-course {
background: #FF4277;
}
/* 1v1规划 */
.event-item.one-on-one {
background: #FFCC3F;
}
/* 线下面试模拟 */
.event-item.interview {
background: #0743DA;
}
.event-more {
font-size: 9px;
color: var(--text-muted);
margin-top: 2px;
}
/* 周视图样式 */
.week-view {
height: 100%;
display: flex;
flex-direction: column;
}
.week-header {
display: grid;
grid-template-columns: 60px repeat(7, 1fr);
background: #f8fafc;
border-bottom: 1px solid var(--border-color);
position: sticky;
top: 0;
z-index: var(--z-header); /* 使用全局header层级确保不干扰弹窗 */
}
.time-header {
padding: 12px 8px;
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
border-right: 1px solid #e5e7eb;
display: flex;
align-items: center;
justify-content: center;
}
.day-header {
padding: 12px 8px;
text-align: center;
border-right: 1px solid #e5e7eb;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.day-header:last-child {
border-right: none;
}
.day-name {
font-size: 12px;
font-weight: 500;
color: var(--text-secondary);
}
.day-date {
font-size: 16px;
font-weight: 600;
color: var(--text-primary);
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.day-header.today .day-date {
background: var(--primary-color);
color: white;
}
.week-grid {
flex: 1;
display: grid;
grid-template-columns: 60px repeat(7, 1fr);
overflow-y: auto;
position: relative;
}
.time-column {
border-right: 1px solid #e5e7eb;
background: #fafbfc;
display: flex;
flex-direction: column;
}
.time-slot {
height: 60px;
border-bottom: 1px solid #f3f4f6;
display: flex;
align-items: flex-start;
padding: 4px 8px;
font-size: 11px;
color: var(--text-muted);
position: relative;
}
.time-slot:nth-child(odd) {
background: #fbfcfd;
}
.day-column {
border-right: 1px solid #f3f4f6;
position: relative;
display: flex;
flex-direction: column;
}
.day-column:last-child {
border-right: none;
}
.hour-slot {
height: 60px;
border-bottom: 1px solid #f3f4f6;
position: relative;
}
.hour-slot:nth-child(odd) {
background: #fbfcfd;
}
/* 新的周视图事件块样式 */
.event-block-new {
position: absolute;
left: 4px;
right: 4px;
border-radius: 4px;
padding: 4px 6px;
font-size: 11px;
z-index: 5;
cursor: pointer;
transition: all 0.15s ease;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(0, 0, 0, 0.1);
}
.event-block-new:hover {
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
opacity: 0.9;
}
.event-block-new .event-header {
display: flex;
align-items: center;
margin-bottom: 2px;
}
.event-block-new .event-icon {
flex-shrink: 0;
}
.event-block-new .event-title {
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
}
.event-block-new .event-time {
font-size: 10px;
opacity: 0.9;
}
/* 保持原有样式作为备用 */
.event-block {
position: absolute;
left: 4px;
right: 4px;
background: var(--primary-color);
color: white;
border-radius: 4px;
padding: 4px 6px;
font-size: 11px;
z-index: 5;
cursor: pointer;
transition: all 0.15s ease;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.event-block:hover {
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
}
.event-block.class {
background: #3b82f6;
}
.event-block.meeting {
background: #10b981;
}
.event-block.lab {
background: #f59e0b;
}
.event-block.exam {
background: #ef4444;
}
.event-title {
font-weight: 600;
margin-bottom: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.event-time {
font-size: 10px;
opacity: 0.9;
}
/* 当前时间线 - 使用合理的层级 */
.current-time-line {
position: absolute;
left: 60px;
right: 0;
height: 2px;
background: #ef4444;
z-index: var(--z-content); /* 使用内容层级,不需要很高 */
pointer-events: none;
}
.current-time-line::before {
content: "";
position: absolute;
left: -6px;
top: -4px;
width: 10px;
height: 10px;
background: #ef4444;
border-radius: 50%;
}
/* 空状态 */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 200px;
color: var(--text-muted);
}
.empty-state-icon {
font-size: 48px;
margin-bottom: 16px;
opacity: 0.5;
}
.empty-state-text {
font-size: 16px;
margin-bottom: 8px;
}
.empty-state-description {
font-size: 14px;
opacity: 0.7;
}
/* 事件详情提示 - 使用全局z-index系统 */
.event-tooltip {
position: absolute;
background: var(--text-primary);
color: white;
padding: 8px 12px;
border-radius: 6px;
font-size: 12px;
z-index: var(--z-tooltip); /* 使用全局tooltip层级 */
max-width: 200px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
pointer-events: none;
}
.event-tooltip::after {
content: "";
position: absolute;
bottom: -6px;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid var(--text-primary);
}
/* 事件详情模态框样式 - 新设计 */
/* 模态框遮罩层 */
.event-detail-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.45);
z-index: var(--z-modal);
display: flex;
align-items: center;
justify-content: center;
animation: overlayFadeIn 200ms ease-out;
backdrop-filter: blur(4px);
}
@keyframes overlayFadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* 新模态框主体 */
.event-detail-modal-new {
background: #ffffff;
border-radius: 12px;
box-shadow: 0 24px 48px rgba(0, 0, 0, 0.12), 0 8px 16px rgba(0, 0, 0, 0.08);
width: 520px;
max-width: 90vw;
max-height: 75vh;
display: flex;
flex-direction: column;
animation: modalSlideIn 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes modalSlideIn {
from {
opacity: 0;
transform: scale(0.96) translateY(-20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
/* 新模态框头部 */
.event-detail-header-new {
padding: 20px 24px;
border-bottom: 1px solid #e5e7eb;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
}
/* 新标题样式 */
.event-detail-title-new {
font-size: 18px;
font-weight: 600;
color: #1f2937;
margin: 0;
letter-spacing: -0.01em;
}
/* 新关闭按钮 */
.event-detail-close-new {
width: 36px;
height: 36px;
border: none;
background: transparent;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: #6b7280;
transition: all 150ms ease;
}
.event-detail-close-new:hover {
background: #f3f4f6;
color: #374151;
}
.event-detail-close-new:active {
background: #e5e7eb;
}
/* 日期头部(多事件模式) */
.event-detail-date-header {
padding: 16px 24px;
background: linear-gradient(to right, #f0f9ff, #e0f2fe);
border-bottom: 1px solid #e0e7ff;
display: flex;
align-items: center;
gap: 12px;
font-size: 15px;
font-weight: 500;
color: #1e40af;
flex-shrink: 0;
}
/* 新内容区域 */
.event-detail-content-new {
flex: 1;
overflow-y: auto;
padding: 20px 24px;
}
/* 事件列表容器 */
.event-list-container {
display: flex;
flex-direction: column;
gap: 16px;
}
/* 新事件卡片 */
.event-card-new {
background: #fafbfc;
border: 1px solid #e5e7eb;
border-radius: 10px;
padding: 16px;
transition: all 150ms ease;
}
.event-card-new:hover {
background: #f9fafb;
border-color: #d1d5db;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
/* 可点击的课程卡片样式 */
.event-card-new.clickable-course {
cursor: pointer;
transition: all 0.2s ease;
}
.event-card-new.clickable-course:hover {
background: #f3f4f6;
border-color: #4080ff;
box-shadow: 0 4px 12px rgba(64, 128, 255, 0.15);
transform: translateY(-2px);
}
/* 事件卡片头部 */
.event-card-header {
display: flex;
gap: 12px;
margin-bottom: 12px;
}
/* 事件类型指示器 */
.event-type-indicator {
width: 4px;
border-radius: 2px;
flex-shrink: 0;
}
/* 事件卡片标题区 */
.event-card-title {
flex: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
}
.event-card-title h4 {
margin: 0;
font-size: 16px;
font-weight: 600;
color: #111827;
line-height: 1.4;
}
/* 事件类型标签 */
.event-type-tag {
padding: 4px 10px;
border-radius: 6px;
font-size: 12px;
font-weight: 500;
white-space: nowrap;
flex-shrink: 0;
}
/* 事件卡片内容 */
.event-card-body {
padding-left: 16px;
display: flex;
flex-direction: column;
gap: 10px;
}
/* 事件信息行 */
.event-info-row {
display: flex;
align-items: center;
gap: 8px;
}
/* 事件时间 */
.event-time {
font-size: 14px;
color: #6b7280;
font-family: "SF Mono", "Monaco", "Cascadia Code", monospace;
}
/* 事件状态 */
.event-status {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
font-weight: 500;
}
/* 事件描述 */
.event-description {
font-size: 14px;
color: #4b5563;
line-height: 1.5;
padding: 12px;
background: white;
border-radius: 6px;
border-left: 3px solid #e5e7eb;
margin-top: 4px;
}
/* 更多事件指示器 */
.event-more {
font-size: 11px;
color: #6b7280;
background: #f3f4f6;
padding: 2px 6px;
border-radius: 4px;
text-align: center;
cursor: pointer;
transition: all 150ms ease;
}
.event-more:hover {
background: #e5e7eb;
color: #374151;
}
/* 无事项状态 */
.event-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
}
/* 响应式设计 */
@media (max-width: 1024px) {
.calendar-header {
flex-direction: column;
gap: 16px;
align-items: stretch;
}
.calendar-nav {
justify-content: center;
}
.view-switcher {
align-self: center;
}
.day-cell {
min-height: 60px;
padding: 4px;
}
.event-item {
font-size: 9px;
padding: 1px 2px;
}
}
@media (max-width: 768px) {
.calendar-title {
font-size: 18px;
}
.nav-button {
width: 28px;
height: 28px;
}
.view-button {
padding: 4px 12px;
font-size: 13px;
}
.week-grid {
grid-template-columns: 50px repeat(7, 1fr);
}
.time-header,
.time-column {
width: 50px;
}
.time-slot {
padding: 2px 4px;
font-size: 10px;
}
.day-cell {
min-height: 50px;
padding: 2px;
}
.day-number {
font-size: 12px;
}
.event-item {
font-size: 8px;
padding: 1px;
}
}
/* 加载状态 */
.calendar-loading {
display: flex;
align-items: center;
justify-content: center;
height: 200px;
color: var(--text-muted);
}
.loading-spinner {
width: 32px;
height: 32px;
border: 3px solid #f3f4f6;
border-top: 3px solid var(--primary-color);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* 响应式设计 - 移动端适配 */
@media (max-width: 640px) {
.event-detail-modal-new {
width: 95vw;
max-height: 85vh;
margin: 16px;
}
.event-detail-header-new,
.event-detail-content-new {
padding: 16px;
}
.event-detail-date-header {
padding: 12px 16px;
font-size: 14px;
}
.event-card-new {
padding: 12px;
}
.event-card-title h4 {
font-size: 15px;
}
.event-type-tag {
font-size: 11px;
padding: 3px 8px;
}
.event-time {
font-size: 13px;
}
.event-status {
font-size: 12px;
}
.event-description {
font-size: 13px;
padding: 10px;
}
}