diff --git a/design/uiux/prototype/03-회의예약.html b/design/uiux/prototype/03-회의예약.html index 101899a..9a825e8 100644 --- a/design/uiux/prototype/03-회의예약.html +++ b/design/uiux/prototype/03-회의예약.html @@ -287,7 +287,7 @@ - + diff --git a/design/uiux/prototype/05-회의진행.html b/design/uiux/prototype/05-회의진행.html index 72a8ed7..34c9f31 100644 --- a/design/uiux/prototype/05-회의진행.html +++ b/design/uiux/prototype/05-회의진행.html @@ -33,14 +33,22 @@ gap: 0; flex: 1; overflow: hidden; + min-height: 0; /* Flexbox shrink 허용 */ } .main-content { flex: 1; min-width: 0; overflow-y: auto; - padding: 0 var(--space-md) var(--space-md); + padding: 0 var(--space-md) 0; background: var(--gray-50); + display: flex; + flex-direction: column; + } + + /* 콘텐츠 영역이 남은 공간을 채우지 않도록 */ + .main-content > * { + flex-shrink: 0; } .right-sidebar { @@ -411,7 +419,7 @@ align-items: center; justify-content: center; position: fixed; - bottom: 100px; + bottom: 96px; /* 액션바(80px) + 여유(16px) */ right: 16px; width: 56px; height: 56px; @@ -624,7 +632,7 @@ - + 회의 개요 diff --git a/design/uiux/prototype/06-검증완료.html b/design/uiux/prototype/06-검증완료.html index 43abd54..4ee38af 100644 --- a/design/uiux/prototype/06-검증완료.html +++ b/design/uiux/prototype/06-검증완료.html @@ -112,7 +112,7 @@ - + diff --git a/design/uiux/prototype/07-회의종료.html b/design/uiux/prototype/07-회의종료.html index bd9dd9e..8490af7 100644 --- a/design/uiux/prototype/07-회의종료.html +++ b/design/uiux/prototype/07-회의종료.html @@ -225,7 +225,7 @@ - + ✅ 회의가 종료되었습니다 diff --git a/design/uiux/prototype/10-회의록상세조회.html b/design/uiux/prototype/10-회의록상세조회.html index 281005a..5fd27da 100644 --- a/design/uiux/prototype/10-회의록상세조회.html +++ b/design/uiux/prototype/10-회의록상세조회.html @@ -82,14 +82,12 @@ .main-content { margin-top: 112px; padding: var(--space-md); - padding-bottom: 120px; } /* 데스크톱: 메인 콘텐츠 조정 */ @media (min-width: 768px) { .main-content { padding: var(--space-xl); - padding-bottom: var(--space-xl); max-width: 1200px; margin-left: auto; margin-right: auto; @@ -460,20 +458,24 @@ .filter-btn { padding: 8px 16px; - border: 1px solid var(--gray-300); - background: var(--white); + border: none; + background: var(--gray-100); border-radius: 20px; font-size: var(--font-small); color: var(--gray-700); cursor: pointer; white-space: nowrap; transition: all var(--transition-fast); + font-weight: var(--font-weight-medium); } .filter-btn.active { background: var(--primary); color: var(--white); - border-color: var(--primary); + } + + .filter-btn:hover:not(.active) { + background: var(--gray-200); } .todo-group { @@ -507,63 +509,6 @@ margin-bottom: var(--space-xs); } - /* 원형 진행 바 - 모바일에서 축소 */ - .circular-progress { - width: 60px; - height: 60px; - margin: 0 auto; - position: relative; - } - - .circular-progress svg { - width: 80px; - height: 80px; - transform: rotate(-90deg); - } - - .circular-progress circle { - fill: none; - stroke-width: 6; - } - - .circular-progress .bg-circle { - stroke: var(--gray-300); - } - - .circular-progress .progress-circle { - stroke: var(--primary); - stroke-linecap: round; - transition: stroke-dashoffset 1s ease; - } - - .circular-progress-text { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-size: var(--font-h3); - font-weight: var(--font-weight-bold); - color: var(--primary); - } - - /* 데스크톱에서 원형 진행 바 크기 복원 */ - @media (min-width: 768px) { - .circular-progress { - width: 80px; - height: 80px; - margin-bottom: var(--space-sm); - } - - .circular-progress svg { - width: 100px; - height: 100px; - } - - .circular-progress circle { - stroke-width: 8; - } - } - /* Todo 진행상황 - 09-Todo관리 스타일 적용 */ .todo-filters { display: flex; @@ -775,7 +720,7 @@ - + @@ -1094,14 +1039,13 @@ - - - - - - - 40% + + + 전체 진행률 + 40% + + + 2 / 5 완료 @@ -1109,11 +1053,18 @@ - 전체 (5) - 시작 전 (1) - 지연 (1) - 진행 중 (2) - 완료 (2) + + 전체 (5) + + + 지연 (1) + + + 마감 임박 (2) + + + 완료 (2) + @@ -1468,6 +1419,9 @@ // Todo 편집 ID let editingTodoId = null; + // 현재 필터 + let currentFilter = 'all'; + // 탭 전환 const tabs = document.querySelectorAll('.tab'); const tabContents = document.querySelectorAll('.tab-content'); @@ -1486,15 +1440,33 @@ }); }); - // 필터 버튼 - const filterBtns = document.querySelectorAll('.filter-btn'); - filterBtns.forEach(btn => { - btn.addEventListener('click', () => { - const group = btn.parentElement; - group.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active')); - btn.classList.add('active'); + /** + * D-day 계산 (09-Todo관리와 동일) + */ + function calculateDday(dueDate) { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const due = new Date(dueDate); + due.setHours(0, 0, 0, 0); + const diffTime = due - today; + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + return diffDays; + } + + /** + * Todo 필터링 (09-Todo관리와 동일) + */ + function filterTodos(filter) { + currentFilter = filter; + + // 탭 활성화 + document.querySelectorAll('.filter-btn').forEach(btn => { + btn.classList.remove('active'); }); - }); + document.querySelector(`.filter-btn[data-filter="${filter}"]`).classList.add('active'); + + renderTodoList(); + } /** * Todo 편집 모달 열기 @@ -1670,44 +1642,87 @@ const completed = meetingTodos.filter(t => t.status === 'completed').length; const percent = total > 0 ? Math.round((completed / total) * 100) : 0; - // 원형 진행 바 업데이트 - const progressCircle = document.querySelector('.progress-circle'); - const progressText = document.querySelector('.circular-progress-text'); - const completionText = document.querySelector('.circular-progress').nextElementSibling; + // 수평 진행 바 업데이트 (선택자를 더 구체적으로 지정) + const progressSection = document.querySelector('.dashboard-section:nth-child(3)'); + if (progressSection) { + const progressBar = progressSection.querySelector('div[style*="width: 40%"]'); + const progressPercent = progressSection.querySelector('span[style*="color: var(--primary)"]'); + const completionText = progressSection.querySelector('div[style*="font-size: var(--font-caption)"]'); - if (progressCircle && progressText) { - const circumference = 2 * Math.PI * 36; // r=36 - const offset = circumference - (percent / 100) * circumference; - progressCircle.style.strokeDashoffset = offset; - progressText.textContent = `${percent}%`; - } + if (progressBar) { + progressBar.style.width = `${percent}%`; + } - if (completionText) { - completionText.querySelector('div').textContent = `${completed} / ${total} 완료`; + if (progressPercent) { + progressPercent.textContent = `${percent}%`; + } + + if (completionText) { + completionText.textContent = `${completed} / ${total} 완료`; + } } } /** - * Todo 리스트 렌더링 (필터 적용) + * Todo 리스트 렌더링 (09-Todo관리와 동일한 필터 및 정렬) */ function renderTodoList() { - // 현재 활성 필터 확인 - const activeFilterBtn = document.querySelector('.filter-group .filter-btn.active'); - const currentFilter = activeFilterBtn ? activeFilterBtn.textContent.trim().split(' ')[0] : '전체'; - - // 필터 적용된 Todo 목록 가져오기 let filteredTodos = meetingTodos; - if (currentFilter === '완료') { + // 필터 적용 (09-Todo관리와 동일) + if (currentFilter === 'completed') { filteredTodos = meetingTodos.filter(t => t.status === 'completed'); - } else if (currentFilter === '진행') { - filteredTodos = meetingTodos.filter(t => t.status === 'in_progress'); - } else if (currentFilter === '시작') { - filteredTodos = meetingTodos.filter(t => t.status === 'not_started'); + } else if (currentFilter === 'overdue') { + filteredTodos = meetingTodos.filter(t => { + const dday = calculateDday(t.dueDate); + return dday < 0 && t.status !== 'completed'; + }); + } else if (currentFilter === 'urgent') { + filteredTodos = meetingTodos.filter(t => { + const dday = calculateDday(t.dueDate); + return dday >= 0 && dday <= 3 && t.status !== 'completed'; + }); } + // 정렬: 완료되지 않은 것 우선, 마감일 순 (09-Todo관리와 동일) + filteredTodos.sort((a, b) => { + if (a.status === 'completed' && b.status !== 'completed') return 1; + if (a.status !== 'completed' && b.status === 'completed') return -1; + return new Date(a.dueDate) - new Date(b.dueDate); + }); + + // 필터별 개수 업데이트 + updateFilterCounts(); + // 실제 DOM 업데이트는 필요시 구현 // 프로토타입에서는 페이지 새로고침이나 동적 렌더링 로직 추가 필요 + console.log('Filtered Todos:', filteredTodos); + } + + /** + * 필터별 개수 업데이트 + */ + function updateFilterCounts() { + const total = meetingTodos.length; + const completed = meetingTodos.filter(t => t.status === 'completed').length; + const urgent = meetingTodos.filter(t => { + const dday = calculateDday(t.dueDate); + return dday >= 0 && dday <= 3 && t.status !== 'completed'; + }).length; + const overdue = meetingTodos.filter(t => { + const dday = calculateDday(t.dueDate); + return dday < 0 && t.status !== 'completed'; + }).length; + + const filterAllCount = document.getElementById('filterAllCount'); + const filterOverdueCount = document.getElementById('filterOverdueCount'); + const filterUrgentCount = document.getElementById('filterUrgentCount'); + const filterCompletedCount = document.getElementById('filterCompletedCount'); + + if (filterAllCount) filterAllCount.textContent = total; + if (filterOverdueCount) filterOverdueCount.textContent = overdue; + if (filterUrgentCount) filterUrgentCount.textContent = urgent; + if (filterCompletedCount) filterCompletedCount.textContent = completed; } /** @@ -1715,6 +1730,7 @@ */ function initPage() { updateTodoProgress(); + updateFilterCounts(); } // 페이지 로드 시 초기화 diff --git a/design/uiux/prototype/11-회의록수정.html b/design/uiux/prototype/11-회의록수정.html index fd3aff4..9410484 100644 --- a/design/uiux/prototype/11-회의록수정.html +++ b/design/uiux/prototype/11-회의록수정.html @@ -275,7 +275,7 @@ - + diff --git a/design/uiux/prototype/common.css b/design/uiux/prototype/common.css index 7e4692b..93ae8c2 100644 --- a/design/uiux/prototype/common.css +++ b/design/uiux/prototype/common.css @@ -98,6 +98,7 @@ body { color: var(--gray-700); line-height: 1.6; background: var(--gray-100); + overflow-x: hidden; /* 가로 스크롤 방지 */ } /* ======================================== @@ -1216,7 +1217,6 @@ input[type="date"]::-webkit-calendar-picker-indicator { .main-content { margin-top: 64px; padding: var(--space-md); - padding-bottom: 100px; } /* 반응형: 데스크톱에서 중앙 정렬 */ @@ -1225,7 +1225,6 @@ input[type="date"]::-webkit-calendar-picker-indicator { max-width: 900px; margin-left: auto; margin-right: auto; - padding-bottom: var(--space-xxl); } /* 사이드바가 있는 경우 */ @@ -1611,6 +1610,18 @@ input[type="date"]::-webkit-calendar-picker-indicator { } } +/* 하단 액션 바가 있는 페이지를 위한 공통 여백 */ +.has-action-bar { + padding-bottom: 90px !important; /* 액션 바 높이(80px) + 최소 여유 공간(10px) */ +} + +/* 데스크톱에서도 동일한 여백 유지 */ +@media (min-width: 768px) { + .has-action-bar { + padding-bottom: 90px !important; + } +} + /* ======================================== LAYOUT PATTERNS ======================================== */ @@ -1647,7 +1658,6 @@ input[type="date"]::-webkit-calendar-picker-indicator { .layout-sidebar-header .main-content { margin-top: 64px; padding: var(--space-md); - padding-bottom: 80px; background: var(--gray-50); width: 100%; max-width: 100%; @@ -1663,7 +1673,6 @@ input[type="date"]::-webkit-calendar-picker-indicator { .layout-sidebar-header .main-content { margin-left: 240px; /* 사이드바 너비만큼 왼쪽 여백 추가 */ padding: var(--space-lg); - padding-bottom: var(--space-xl); max-width: calc(100vw - 240px); } } @@ -1766,7 +1775,6 @@ input[type="date"]::-webkit-calendar-picker-indicator { .layout-header-only .main-content { margin-top: 64px; padding: var(--space-md); - padding-bottom: 80px; } @media (min-width: 768px) { @@ -1776,7 +1784,6 @@ input[type="date"]::-webkit-calendar-picker-indicator { .layout-header-only .main-content { padding: var(--space-xl); - padding-bottom: var(--space-xl); } }