feat(project): 홈 화면 업무추가·멤버표시·댓글팝업·실시간 새로고침 추가
- 카드 이름 옆 호버 노출 업무 추가 버튼(기존 업무편집 팝업을 생성 모드로 재사용) - 카드 이름 아래 배정 멤버 아이콘+이름 표시, 새 프로젝트 모달에서 멤버 다중 선택 - 업무별 댓글 말풍선+개수 표시, 더블클릭 시 카톡형 댓글 전용 팝업 - 확인 안 한 새 댓글은 말풍선이 커지며 반짝임(localStorage 로 확인 여부 추적) - GET /project/api/live-version 폴링으로 다른 사용자의 변경사항을 자동 새로고침 - 날짜 표기를 yy/mm/dd(요일)에서 mm/dd(요일)로 변경 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+41
-7
@@ -44,18 +44,24 @@
|
||||
.pj-project-card.is-done { background: #f6f7f8; opacity: .62; }
|
||||
.pj-project-card.is-done:hover { opacity: .85; }
|
||||
.pj-project-card.is-done .pj-project-dot { background: #9aa5b1; }
|
||||
/* 카드 수정 버튼 */
|
||||
.pj-card-edit {
|
||||
position: absolute; top: 8px; right: 8px; width: 28px; height: 28px;
|
||||
/* 카드 우측 상단 액션(업무 추가/수정) — 호버 시에만 노출 */
|
||||
.pj-card-actions {
|
||||
position: absolute; top: 8px; right: 8px; display: flex; gap: 2px;
|
||||
}
|
||||
.pj-card-actions .pj-icon-btn {
|
||||
width: 28px; height: 28px;
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
border-radius: 8px; color: #6b7280; opacity: 0; transition: opacity .12s;
|
||||
}
|
||||
.pj-card-edit .material-symbols-outlined { font-size: 18px; }
|
||||
.pj-project-card:hover .pj-card-edit { opacity: 1; }
|
||||
.pj-card-edit:hover { background: #eceef0; color: #1e1f21; }
|
||||
.pj-card-actions .pj-icon-btn .material-symbols-outlined { font-size: 18px; }
|
||||
.pj-project-card:hover .pj-card-actions .pj-icon-btn { opacity: 1; }
|
||||
.pj-card-actions .pj-icon-btn:hover { background: #eceef0; color: #1e1f21; }
|
||||
.pj-project-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--pj-color, #4573d2); margin-top: 5px; flex: 0 0 auto; }
|
||||
.pj-project-name { font-weight: 700; font-size: 15px; }
|
||||
.pj-project-desc { color: #6b7280; font-size: 12.5px; margin-top: 3px; }
|
||||
/* 프로젝트 이름 아래 — 배정 멤버(아이콘+이름) */
|
||||
.pj-project-members { display: flex; flex-wrap: wrap; gap: 3px 10px; margin-top: 6px; }
|
||||
.pj-project-member { display: inline-flex; align-items: center; gap: 4px; font-size: 11.5px; color: #6b7280; }
|
||||
.pj-project-meta { margin-top: 10px; display: flex; gap: 6px; flex-wrap: wrap; }
|
||||
.pj-project-progress { margin-top: 10px; height: 5px; border-radius: 999px; background: #eef0f2; overflow: hidden; }
|
||||
.pj-project-progress-bar { height: 100%; border-radius: 999px; background: var(--pj-color, #4573d2); }
|
||||
@@ -326,9 +332,37 @@
|
||||
.pj-card-proj { font-size: 11px; font-weight: 700; margin-bottom: 3px; letter-spacing: -.2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
|
||||
/* 댓글 말풍선(💬 이모지) 표시 */
|
||||
.pj-cmt-ic { font-size: 12px; vertical-align: middle; margin-left: 4px; line-height: 1; }
|
||||
.pj-cmt-ic { font-size: 12px; vertical-align: middle; margin-left: 4px; line-height: 1; display: inline-block; }
|
||||
.pj-cmt-n { font-size: 11px; font-weight: 700; vertical-align: middle; margin-left: 1px; }
|
||||
.pj-card-cmt { display: inline-flex; align-items: center; color: #6b7280; }
|
||||
.pj-cmt-badge { display: inline-flex; align-items: center; flex: 0 0 auto; color: #6b7280; cursor: pointer; }
|
||||
/* 새 댓글이 등록된 뒤 아직 확인 안 한 업무 — 살짝 커지며 반짝임. 확인하면(더블클릭) 원래대로. */
|
||||
@keyframes pj-cmt-pulse {
|
||||
0%, 100% { transform: scale(1); opacity: 1; }
|
||||
50% { transform: scale(1.5); opacity: .55; }
|
||||
}
|
||||
.pj-cmt-badge.is-unread .pj-cmt-ic { animation: pj-cmt-pulse 1.1s ease-in-out infinite; }
|
||||
.pj-cmt-badge.is-unread .pj-cmt-n { color: #e8384f; font-weight: 800; }
|
||||
|
||||
/* ── 새 프로젝트 모달 — 멤버 선택 ── */
|
||||
.pj-modal-card .pj-field-label { display: block; font-size: 12.5px; font-weight: 600; color: #525860; margin-bottom: 12px; }
|
||||
.pj-member-picker { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 5px; max-height: 140px; overflow-y: auto; padding: 6px 2px; border: 1px solid #eef0f2; border-radius: 8px; }
|
||||
.pj-member-pick { display: inline-flex !important; align-items: center; gap: 5px; font-size: 12.5px; font-weight: 500 !important; color: #333; width: auto !important; margin: 0 !important; }
|
||||
.pj-member-pick input { width: auto !important; margin: 0 !important; }
|
||||
|
||||
/* ── 댓글만 보는 채팅형 팝업(카톡 대화창 느낌) ── */
|
||||
.pj-modal-chat { width: min(420px, 92vw); display: flex; flex-direction: column; }
|
||||
.pj-chat-list { list-style: none; margin: 0 0 10px; padding: 4px; max-height: 420px; min-height: 120px; overflow-y: auto; background: #eef0f2; border-radius: 10px; display: flex; flex-direction: column; gap: 8px; }
|
||||
.pj-chat-msg { display: flex; flex-direction: column; align-items: flex-start; max-width: 78%; }
|
||||
.pj-chat-msg.mine { align-self: flex-end; align-items: flex-end; }
|
||||
.pj-chat-name { font-size: 11px; color: #6b7280; margin-bottom: 2px; padding: 0 2px; }
|
||||
.pj-chat-bubble {
|
||||
background: #fff; border-radius: 14px 14px 14px 4px; padding: 8px 12px;
|
||||
font-size: 13.5px; color: #1e1f21; white-space: pre-wrap; word-break: break-word;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,.06);
|
||||
}
|
||||
.pj-chat-msg.mine .pj-chat-bubble { background: #fee500; border-radius: 14px 14px 4px 14px; }
|
||||
.pj-chat-time { font-size: 10px; color: #9aa1a9; margin-top: 3px; padding: 0 2px; }
|
||||
|
||||
/* ── 보드 단계 컨트롤 ── */
|
||||
.pj-col-head { position: relative; }
|
||||
|
||||
Reference in New Issue
Block a user