diff --git a/frontend/index.html b/frontend/index.html index 9456db6..07f9e10 100755 --- a/frontend/index.html +++ b/frontend/index.html @@ -34,25 +34,55 @@ } .stats { display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 20px; margin-bottom: 30px; } .stat-card { background: white; - padding: 20px; + padding: 15px; border-radius: 10px; text-align: center; box-shadow: 0 4px 6px rgba(0,0,0,0.1); } .stat-card h3 { color: #667eea; - font-size: 2em; + font-size: 1.8em; margin-bottom: 5px; } .stat-card p { color: #666; + font-size: 0.9em; } + + /* Tab 切换 */ + .tabs { + display: flex; + gap: 10px; + margin-bottom: 20px; + flex-wrap: wrap; + } + .tab-btn { + padding: 12px 24px; + background: white; + border: none; + border-radius: 8px; + cursor: pointer; + font-size: 1em; + font-weight: 500; + color: #666; + transition: all 0.3s; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + } + .tab-btn:hover { + background: #f8f9fa; + transform: translateY(-2px); + } + .tab-btn.active { + background: linear-gradient(135deg, #667eea, #764ba2); + color: white; + } + .section-box { background: white; border-radius: 10px; @@ -66,17 +96,155 @@ padding-bottom: 10px; border-bottom: 2px solid #667eea; } - .diary-item { + + /* 日历组件 */ + .calendar-wrapper { + display: flex; + gap: 20px; + flex-wrap: wrap; + } + .calendar { + flex: 0 0 300px; + background: #f8f9fa; + padding: 15px; + border-radius: 8px; + } + .calendar-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; + } + .calendar-header button { + background: #667eea; + color: white; + border: none; + padding: 5px 10px; + border-radius: 5px; + cursor: pointer; + } + .calendar-header button:hover { + background: #5568d3; + } + .calendar-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 2px; + } + .calendar-day-header { + text-align: center; + font-size: 0.75em; + color: #666; + padding: 5px; + } + .calendar-day { + aspect-ratio: 1; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.85em; + border-radius: 5px; + cursor: pointer; + transition: all 0.2s; + } + .calendar-day:hover { + background: #e0e7ff; + } + .calendar-day.selected { + background: #667eea; + color: white; + } + .calendar-day.today { + border: 2px solid #667eea; + font-weight: bold; + } + .calendar-day.has-data { + position: relative; + } + .calendar-day.has-data::after { + content: ''; + position: absolute; + bottom: 2px; + width: 6px; + height: 6px; + background: #10b981; + border-radius: 50%; + } + .calendar-day.empty { + cursor: default; + } + + /* 内容区域 */ + .content-area { + flex: 1; + min-width: 0; + } + + .task-item, .diary-item { padding: 15px; border-left: 4px solid #667eea; background: #f8f9fa; margin-bottom: 15px; border-radius: 5px; + cursor: pointer; + transition: all 0.2s; } - .diary-item h3 { - color: #333; + .task-item:hover, .diary-item:hover { + transform: translateX(5px); + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + } + .task-item.status-pending { border-left-color: #6b7280; } + .task-item.status-in_progress { border-left-color: #3b82f6; } + .task-item.status-blocked { border-left-color: #f59e0b; } + .task-item.status-completed { border-left-color: #10b981; } + .task-item.status-cancelled { border-left-color: #ef4444; opacity: 0.6; } + + .task-item .header, .diary-item .header { + display: flex; + justify-content: space-between; + align-items: center; margin-bottom: 10px; } + .task-item .title, .diary-item .title { + font-weight: bold; + color: #333; + font-size: 1.1em; + } + .task-item .status { + padding: 4px 12px; + border-radius: 20px; + font-size: 0.85em; + color: white; + } + .status-pending .status { background: #6b7280; } + .status-in_progress .status { background: #3b82f6; } + .status-blocked .status { background: #f59e0b; } + .status-completed .status { background: #10b981; } + .status-cancelled .status { background: #ef4444; } + + .task-item .priority { + font-size: 0.8em; + color: #666; + margin-bottom: 8px; + } + .task-item .progress-bar { + height: 8px; + background: #e5e7eb; + border-radius: 4px; + overflow: hidden; + margin: 10px 0; + } + .task-item .progress-fill { + height: 100%; + background: linear-gradient(90deg, #667eea, #764ba2); + transition: width 0.3s; + } + .task-item .progress-text { + font-size: 0.85em; + color: #666; + text-align: right; + } + .diary-item .date { color: #667eea; font-weight: bold; @@ -94,6 +262,52 @@ margin-left: 20px; white-space: pre-wrap; } + + /* 任务详情 */ + .task-detail { + background: #f8f9fa; + padding: 20px; + border-radius: 8px; + margin-top: 20px; + } + .task-detail h3 { + color: #333; + margin-bottom: 15px; + } + .task-detail .meta { + display: flex; + gap: 20px; + margin-bottom: 15px; + flex-wrap: wrap; + } + .task-detail .meta-item { + background: white; + padding: 8px 15px; + border-radius: 5px; + font-size: 0.9em; + } + .task-detail .description { + margin-bottom: 15px; + white-space: pre-wrap; + color: #666; + } + .task-detail .progress-notes { + background: #fffbeb; + padding: 15px; + border-radius: 5px; + margin-top: 15px; + } + .task-detail .progress-notes h4 { + color: #92400e; + margin-bottom: 10px; + } + .task-detail .progress-notes .note { + font-size: 0.85em; + color: #666; + padding: 8px 0; + border-bottom: 1px solid #f3e5d5; + } + .experience-item { padding: 15px; border-left: 4px solid #f59e0b; @@ -119,7 +333,7 @@ border-radius: 20px; font-size: 0.85em; } - .experience-item .problem { + .experience-item .problem, .experience-item .solution, .experience-item .lesson { margin: 10px 0; } .experience-item .problem-title { @@ -127,16 +341,12 @@ color: #dc2626; margin-bottom: 5px; } - .experience-item .solution { - margin: 10px 0; - } .experience-item .solution-title { font-weight: bold; color: #059669; margin-bottom: 5px; } .experience-item .lesson { - margin: 10px 0; padding: 10px; background: #fef3c7; border-radius: 5px; @@ -146,6 +356,7 @@ color: #92400e; margin-bottom: 5px; } + .loading { text-align: center; padding: 40px; @@ -159,92 +370,24 @@ border-radius: 10px; margin-bottom: 20px; } - .emoji { - font-size: 1.2em; + .empty-state { + text-align: center; + padding: 40px; + color: #666; } + .grid-2 { display: grid; - grid-template-columns: repeat(auto-fit, minmax(600px, 1fr)); - gap: 30px; - } - .grid-3 { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(500px, 1fr)); gap: 30px; } @media (max-width: 768px) { - .grid-2, .grid-3 { + .grid-2, .calendar-wrapper { grid-template-columns: 1fr; } - } - .task-item { - padding: 15px; - border-left: 4px solid #667eea; - background: #f8f9fa; - margin-bottom: 15px; - border-radius: 5px; - } - .task-item.status-pending { border-left-color: #6b7280; } - .task-item.status-in_progress { border-left-color: #3b82f6; } - .task-item.status-blocked { border-left-color: #f59e0b; } - .task-item.status-completed { border-left-color: #10b981; } - .task-item.status-cancelled { border-left-color: #ef4444; opacity: 0.6; } - .task-item .header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 10px; - } - .task-item .title { - font-weight: bold; - color: #333; - font-size: 1.1em; - } - .task-item .status { - padding: 4px 12px; - border-radius: 20px; - font-size: 0.85em; - color: white; - } - .status-pending .status { background: #6b7280; } - .status-in_progress .status { background: #3b82f6; } - .status-blocked .status { background: #f59e0b; } - .status-completed .status { background: #10b981; } - .status-cancelled .status { background: #ef4444; } - .task-item .priority { - font-size: 0.8em; - color: #666; - margin-bottom: 8px; - } - .task-item .progress-bar { - height: 8px; - background: #e5e7eb; - border-radius: 4px; - overflow: hidden; - margin: 10px 0; - } - .task-item .progress-fill { - height: 100%; - background: linear-gradient(90deg, #667eea, #764ba2); - transition: width 0.3s; - } - .task-item .progress-text { - font-size: 0.85em; - color: #666; - text-align: right; - } - .task-item .description { - color: #666; - margin: 10px 0; - white-space: pre-wrap; - } - .task-item .progress-notes { - background: #fef3c7; - padding: 10px; - border-radius: 5px; - font-size: 0.85em; - color: #92400e; - white-space: pre-wrap; + .calendar { + flex: 1; + } } @@ -262,26 +405,37 @@