first commit

This commit is contained in:
2026-06-16 17:12:08 +09:00
commit e1bc5a1dfc
257 changed files with 49823 additions and 0 deletions
+910
View File
@@ -0,0 +1,910 @@
/**
* Relay 목업 데이터 — 프론트 UI 우선 구성용 정적 데이터
* 추후 backend API 연동 시 composable/store 에서 이 데이터를 실제 응답으로 교체한다.
*/
/** 아바타 색상 키 (relay.css 의 .av-* 클래스와 대응) */
export type AvatarColor = 'av-a' | 'av-b' | 'av-c' | 'av-d' | 'av-e' | 'av-f'
/** 업무 상태 */
export type TaskStatus = 'todo' | 'prog' | 'review' | 'done' | 'changes'
/** 저장소 공개 여부 */
export type Visibility = 'private' | 'public'
/** 사용자(멤버) */
export interface User {
id: string
name: string
role: string
initial: string
color: AvatarColor
}
/** 첨부파일 */
export interface Attachment {
name: string
size: string
/** 파일 아이콘 종류 */
kind: 'pdf' | 'zip' | 'doc' | 'img'
}
/** 체크리스트 항목 */
export interface ChecklistItem {
text: string
done: boolean
}
/** 저장소 */
export interface Repo {
/** 라우팅 식별자(slug 의 마지막 segment) */
id: string
name: string
owner: string
slug: string
desc: string
visibility: Visibility
branch: string
members: User[]
/** 멤버 스택에서 추가로 더 있는 인원 수(+N) */
moreCount: number
updatedAgo: string
doneCount: number
totalCount: number
progressPct: number
/** 진행률 바 색상 단계 */
progressLevel: 'done' | 'mid' | 'low'
/** 진행률 텍스트(예: "67% 완료", "시작 전") */
progressLabel: string
}
/** 저장소 상세의 업무 목록 행 */
export interface RepoTask {
id: number
title: string
status: TaskStatus
/** 마감 라벨(D-3 / 2일 지남 / 6월 9일 완료 등) */
dueLabel?: string
overdue?: boolean
/** 체크리스트 [완료, 전체] */
checklist?: [number, number]
/** 코멘트 수 */
comments?: number
assignees: User[]
}
/** 댓글의 답글 */
export interface Reply {
author: User
time: string
text: string
}
/** 댓글 */
export interface Comment {
author: User
/** 작성자 역할 배지(예: 지시자) */
roleBadge?: string
time: string
text: string
file?: string
replies: Reply[]
}
/** 활동 타임라인 항목 */
export interface Activity {
/** 아이콘 색상 톤 */
tone: '' | 'green' | 'amber' | 'blue' | 'accent'
/** 아이콘 종류 */
icon: 'check-circle' | 'check' | 'paperclip' | 'calendar' | 'users' | 'flag'
/** 본문(굵게 처리는 컴포넌트에서 b 태그로) */
html: string
time: string
file?: string
statusFrom?: string
statusTo?: string
}
/** 업무 상세 */
export interface TaskDetail {
id: number
repoId: string
repoName: string
title: string
status: TaskStatus
statusLabel: string
/** 본문 문단 (멘션은 @로 시작) */
content: string[]
checklist: ChecklistItem[]
comments: Comment[]
activities: Activity[]
assignees: User[]
issuer: User
dueLabel: string
dday: string
files: Attachment[]
/** 승인 요청 정보(승인 대기 상태일 때) */
approval?: {
requester: string
requestedAgo: string
note: string
}
issuedLabel: string
}
/* ============================================================
* 사용자
* ============================================================ */
// satisfies 로 선언해 각 키 접근이 `User | undefined` 로 넓어지지 않도록 한다
// (tsconfig 의 noUncheckedIndexedAccess 대응)
export const USERS = {
kim: { id: 'kim', name: '김서연', role: '콘텐츠 기획', initial: '김', color: 'av-a' },
park: { id: 'park', name: '박지훈', role: '퍼포먼스 마케팅', initial: '박', color: 'av-b' },
lee: { id: 'lee', name: '이도윤', role: '카피라이팅', initial: '이', color: 'av-c' },
choi: { id: 'choi', name: '최유진', role: 'UX 디자인', initial: '최', color: 'av-d' },
han: { id: 'han', name: '한승우', role: '브랜드 전략', initial: '한', color: 'av-e' },
jung: { id: 'jung', name: '정태경', role: '마케팅 그룹 리드', initial: '정', color: 'av-f' },
} satisfies Record<string, User>
/* ============================================================
* 저장소 목록
* ============================================================ */
export const REPOS: Repo[] = [
{
id: 'q3-launch-campaign',
name: '3분기 신제품 런칭 캠페인',
owner: 'marketing-team',
slug: 'marketing-team/q3-launch-campaign',
desc: '3분기 신제품(라인 클렌저) 런칭 캠페인 소재 제작 및 검수',
visibility: 'private',
branch: 'main',
members: [USERS.kim, USERS.park, USERS.lee],
moreCount: 2,
updatedAgo: '2시간 전 업데이트',
doneCount: 8,
totalCount: 12,
progressPct: 67,
progressLevel: 'mid',
progressLabel: '67% 완료',
},
{
id: 'brand-refresh-2026',
name: '브랜드 리뉴얼 2026',
owner: 'marketing-team',
slug: 'marketing-team/brand-refresh-2026',
desc: '브랜드 아이덴티티 리뉴얼 및 가이드라인 개편 프로젝트',
visibility: 'private',
branch: 'main',
members: [USERS.choi, USERS.jung, USERS.han],
moreCount: 1,
updatedAgo: '어제 업데이트',
doneCount: 5,
totalCount: 9,
progressPct: 56,
progressLevel: 'mid',
progressLabel: '56% 완료',
},
{
id: 'monthly-newsletter',
name: '월간 뉴스레터 운영',
owner: 'marketing-team',
slug: 'marketing-team/monthly-newsletter',
desc: '월간 뉴스레터 기획 · 콘텐츠 작성 · 발송 정기 운영',
visibility: 'public',
branch: 'main',
members: [USERS.lee, USERS.park, USERS.kim],
moreCount: 0,
updatedAgo: '3일 전 업데이트',
doneCount: 14,
totalCount: 14,
progressPct: 100,
progressLevel: 'done',
progressLabel: '100% 완료',
},
{
id: 'seo-content-hub',
name: 'SEO 콘텐츠 허브',
owner: 'marketing-team',
slug: 'marketing-team/seo-content-hub',
desc: '검색 유입 강화를 위한 SEO 콘텐츠 기획 및 제작 허브',
visibility: 'private',
branch: 'main',
members: [USERS.park, USERS.han, USERS.lee],
moreCount: 3,
updatedAgo: '5시간 전 업데이트',
doneCount: 2,
totalCount: 11,
progressPct: 18,
progressLevel: 'low',
progressLabel: '18% 완료',
},
{
id: 'event-handbook',
name: '사내 행사 핸드북',
owner: 'marketing-team',
slug: 'marketing-team/event-handbook',
desc: '사내 행사 운영 가이드 및 준비 체크리스트 모음',
visibility: 'public',
branch: 'main',
members: [USERS.jung, USERS.kim],
moreCount: 0,
updatedAgo: '1주 전 업데이트',
doneCount: 0,
totalCount: 4,
progressPct: 0,
progressLevel: 'low',
progressLabel: '시작 전',
},
{
id: 'design-system-assets',
name: '디자인 시스템 에셋',
owner: 'marketing-team',
slug: 'marketing-team/design-system-assets',
desc: '공통 디자인 시스템 에셋 및 컴포넌트 관리',
visibility: 'private',
branch: 'develop',
members: [USERS.kim, USERS.choi, USERS.lee],
moreCount: 1,
updatedAgo: '30분 전 업데이트',
doneCount: 9,
totalCount: 10,
progressPct: 90,
progressLevel: 'done',
progressLabel: '90% 완료',
},
]
/* ============================================================
* 저장소 상세 — 업무 목록 (q3-launch-campaign 기준)
* ============================================================ */
export const REPO_TASKS: Record<string, RepoTask[]> = {
'q3-launch-campaign': [
{
id: 11,
title: '법무 검토 요청 및 회신 반영',
status: 'prog',
dueLabel: '2일 지남',
overdue: true,
checklist: [1, 3],
assignees: [USERS.lee],
},
{
id: 9,
title: '메인 배너 이미지 2종 (가로/세로) 디자인',
status: 'review',
dueLabel: 'D-3',
checklist: [1, 3],
comments: 2,
assignees: [USERS.park, USERS.choi],
},
{
id: 8,
title: '상세페이지 카피라이팅',
status: 'todo',
dueLabel: 'D-5',
checklist: [0, 3],
assignees: [USERS.lee],
},
{
id: 7,
title: 'SNS 콘텐츠 1차 시안',
status: 'todo',
dueLabel: 'D-8',
checklist: [0, 4],
assignees: [USERS.han],
},
{
id: 6,
title: '캠페인 핵심 메시지 시안 작성',
status: 'done',
dueLabel: '6월 9일 완료',
checklist: [3, 3],
assignees: [USERS.kim],
},
{
id: 5,
title: '레퍼런스 리서치 및 무드보드 정리',
status: 'done',
dueLabel: '6월 6일 완료',
assignees: [USERS.kim],
},
{
id: 4,
title: '퍼포먼스 광고 소재 세팅',
status: 'done',
dueLabel: '6월 5일 완료',
checklist: [2, 2],
assignees: [USERS.park],
},
{
id: 3,
title: '타깃 오디언스 정의 및 페르소나 정리',
status: 'done',
dueLabel: '6월 4일 완료',
assignees: [USERS.park],
},
{
id: 1,
title: '킥오프 미팅 및 일정 수립',
status: 'done',
dueLabel: '6월 2일 완료',
assignees: [USERS.jung],
},
],
}
/* ============================================================
* 업무 상세 (#9)
* ============================================================ */
export const TASK_DETAIL: TaskDetail = {
id: 9,
repoId: 'q3-launch-campaign',
repoName: '3분기 신제품 런칭 캠페인',
title: '메인 배너 이미지 2종 (가로/세로) 디자인',
status: 'review',
statusLabel: '승인 대기',
content: [
'9월 신제품 런칭 캠페인에 사용할 메인 배너를 가로형/세로형 2종으로 제작합니다. 톤앤매너는 @브랜드_가이드라인.pdf 기준을 따라주세요.',
'퍼포먼스 광고와 자사몰 상단에 동시 노출되므로, 두 비율 모두 핵심 메시지("민감 피부 저자극")가 명확히 보이도록 구성해주세요. 1차 시안 확정 후 모바일 적응형까지 진행합니다.',
],
checklist: [
{ text: '가로형 메인 배너 1920×1080 디자인', done: true },
{ text: '세로형 메인 배너 1080×1920 디자인', done: false },
{ text: '모바일 적응형 600×600 제작', done: false },
],
comments: [
{
author: USERS.jung,
roleBadge: '지시자',
time: '2일 전',
text: '가로형부터 확정하고 세로형 진행해주세요. 카피 위치는 좌측 정렬 기준입니다.',
replies: [
{ author: USERS.park, time: '2일 전', text: '네, 가로형 정렬 기준으로 먼저 잡겠습니다.' },
],
},
{
author: USERS.park,
time: '1일 전',
text: '가로형 1차 시안 업로드했습니다. 검토 부탁드려요.',
file: 'main_banner_h_v1.png',
replies: [],
},
{
author: USERS.choi,
time: '3시간 전',
text: '세로형은 내일 오전까지 공유하겠습니다.',
replies: [],
},
],
activities: [
{
tone: 'amber',
icon: 'check-circle',
html: '<b>박지훈</b>님이 승인을 요청했습니다',
statusFrom: '진행 중',
statusTo: '승인 대기',
time: '2시간 전 · 오후 3:24',
},
{
tone: 'green',
icon: 'check',
html: '<b>박지훈</b>님이 <b>가로형 메인 배너 1920×1080 디자인</b> 항목을 완료했습니다',
time: '1일 전 · 오후 6:10',
},
{
tone: '',
icon: 'paperclip',
html: '<b>박지훈</b>님이 파일을 첨부했습니다',
file: 'main_banner_h_v1.png',
time: '1일 전 · 오후 6:08',
},
{
tone: 'blue',
icon: 'calendar',
html: '<b>정태경</b>님이 마감기한을 <b>6월 18일 (목)</b>로 설정했습니다',
time: '6월 8일 · 오전 10:32',
},
{
tone: 'blue',
icon: 'users',
html: '<b>정태경</b>님이 <b>박지훈</b>, <b>최유진</b>님을 담당자로 지정했습니다',
time: '6월 8일 · 오전 10:31',
},
{
tone: 'accent',
icon: 'flag',
html: '<b>정태경</b>님이 업무를 생성했습니다',
time: '6월 8일 · 오전 10:30',
},
],
assignees: [USERS.park, USERS.choi],
issuer: USERS.jung,
dueLabel: '6월 18일 (목)',
dday: 'D-3',
files: [
{ name: '레퍼런스_무드보드.png', size: '3.2 MB', kind: 'img' },
{ name: '배너_소스_파일.zip', size: '18.4 MB', kind: 'zip' },
],
approval: {
requester: '박지훈',
requestedAgo: '2시간 전',
note: '가로형/세로형 메인 배너 1차 제작을 완료했습니다. 모바일 적응형은 컨펌 후 진행 예정이며, 우선 두 비율 검토 부탁드립니다.',
},
issuedLabel: '6월 8일 지시 · #9',
}
/* ============================================================
* 조회 헬퍼
* ============================================================ */
export function findRepo(id: string): Repo | undefined {
return REPOS.find((r) => r.id === id)
}
export function findRepoTasks(id: string): RepoTask[] {
return REPO_TASKS[id] ?? []
}
/* ============================================================
* 내 업무 (담당 / 지시) — 상태 그룹 단위 정적 데이터
* ============================================================ */
/** D-day 강조 단계 */
export type DdayLevel = 'urgent' | 'soon' | 'calm'
/** 내 업무 목록 행 */
export interface MyTaskRow {
id: number
title: string
status: TaskStatus
repoName: string
/** 담당자 미니 아바타(지시 뷰) */
assignees?: User[]
/** 보조 텍스트(예: "지시 · 한승우", "정민호", "박지훈님이 2시간 전 승인 요청") */
metaText?: string
/** metaText 를 amber 강조로 표시할지 (승인 요청 등) */
metaAttn?: boolean
/** 체크리스트 [완료, 전체] */
checklist?: [number, number]
/** 마감/완료 라벨(예: "6월 18일", "6월 9일 승인됨") */
dueLabel?: string
dday?: string
ddayLevel?: DdayLevel
/** 마감 지남(빨강 강조) */
overdue?: boolean
/** 배지 텍스트(예: 진행 중 / 승인 대기). reviewBtn 이 true 면 미표시 */
statusLabel?: string
/** 검토하기 버튼 표시(지시 뷰의 승인 대기) */
reviewBtn?: boolean
/** 완료 행 스타일 */
done?: boolean
}
/** 상태 그룹 */
export interface MyTaskGroup {
key: TaskStatus
label: string
/** 그룹 헤더 우측 보조 문구(예: "· 내 승인 필요") */
action?: string
/** 강조 목록 스타일(amber 테두리) */
attn?: boolean
rows: MyTaskRow[]
}
/** 담당 업무 */
export const MY_TASKS_ASSIGNED: MyTaskGroup[] = [
{
key: 'changes',
label: '수정 요청',
rows: [
{
id: 14,
title: '3분기 캠페인 예산안 재작성',
status: 'changes',
repoName: '3분기 신제품 런칭 캠페인',
metaText: '지시 · 한승우',
dueLabel: '6월 16일',
dday: 'D-1',
ddayLevel: 'urgent',
statusLabel: '수정 요청',
},
],
},
{
key: 'prog',
label: '진행 중',
rows: [
{
id: 12,
title: '브랜드 리뉴얼 킥오프 기획서 작성',
status: 'prog',
repoName: '브랜드 리뉴얼 2026',
checklist: [2, 5],
metaText: '지시 · 한승우',
dueLabel: '6월 18일',
dday: 'D-3',
ddayLevel: 'soon',
statusLabel: '진행 중',
},
{
id: 10,
title: '9월 신제품 GTM 전략 수립',
status: 'prog',
repoName: '3분기 신제품 런칭 캠페인',
checklist: [1, 4],
metaText: '지시 · 한승우',
dueLabel: '6월 21일',
dday: 'D-6',
ddayLevel: 'calm',
statusLabel: '진행 중',
},
],
},
{
key: 'todo',
label: '할 일',
rows: [
{
id: 15,
title: '월간 뉴스레터 8월호 주제 선정',
status: 'todo',
repoName: '월간 뉴스레터',
metaText: '지시 · 한승우',
dueLabel: '6월 24일',
dday: 'D-9',
ddayLevel: 'calm',
statusLabel: '할 일',
},
{
id: 13,
title: 'SEO 키워드 전략 분기 리뷰',
status: 'todo',
repoName: 'SEO 콘텐츠 허브',
metaText: '지시 · 한승우',
dueLabel: '6월 27일',
dday: 'D-12',
ddayLevel: 'calm',
statusLabel: '할 일',
},
],
},
{
key: 'review',
label: '승인 대기',
rows: [
{
id: 2,
title: '브랜드 무드보드 방향 정리',
status: 'review',
repoName: '브랜드 리뉴얼 2026',
metaText: '한승우님 검토 중 · 1일 전 요청',
dueLabel: '6월 17일',
dday: 'D-2',
ddayLevel: 'soon',
statusLabel: '승인 대기',
},
],
},
{
key: 'done',
label: '완료',
rows: [
{
id: 6,
title: '2분기 캠페인 성과 회고 정리',
status: 'done',
repoName: '월간 뉴스레터',
metaText: '지시 · 한승우',
dueLabel: '6월 11일 승인됨',
statusLabel: '완료',
done: true,
},
{
id: 5,
title: '신제품 네이밍 후보 정리',
status: 'done',
repoName: '3분기 신제품 런칭 캠페인',
metaText: '지시 · 한승우',
dueLabel: '6월 5일 승인됨',
statusLabel: '완료',
done: true,
},
],
},
]
/** 지시한 업무 */
export const MY_TASKS_ISSUED: MyTaskGroup[] = [
{
key: 'review',
label: '승인 대기',
action: '· 내 승인 필요',
attn: true,
rows: [
{
id: 9,
title: '메인 배너 이미지 2종 (가로/세로) 디자인',
status: 'review',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.park, USERS.choi],
metaText: '박지훈님이 2시간 전 승인 요청',
metaAttn: true,
dueLabel: '6월 18일',
dday: 'D-3',
ddayLevel: 'soon',
reviewBtn: true,
},
],
},
{
key: 'prog',
label: '진행 중',
rows: [
{
id: 11,
title: '법무 검토 요청 및 회신 반영',
status: 'prog',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.lee],
metaText: '이도윤',
dueLabel: '6월 12일',
dday: '3일 지남',
ddayLevel: 'urgent',
overdue: true,
statusLabel: '진행 중',
},
{
id: 16,
title: 'SNS 콘텐츠 2차 시안 제작',
status: 'prog',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.han],
metaText: '정민호',
checklist: [3, 6],
dueLabel: '6월 19일',
dday: 'D-4',
ddayLevel: 'soon',
statusLabel: '진행 중',
},
],
},
{
key: 'changes',
label: '수정 요청함',
rows: [
{
id: 8,
title: '상세페이지 카피라이팅',
status: 'changes',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.lee],
metaText: '이도윤에게 수정 요청 · 1일 전',
dueLabel: '6월 20일',
dday: 'D-5',
ddayLevel: 'soon',
statusLabel: '수정 요청',
},
],
},
{
key: 'todo',
label: '할 일',
rows: [
{
id: 7,
title: 'SNS 콘텐츠 1차 시안',
status: 'todo',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.han],
metaText: '정민호',
dueLabel: '6월 23일',
dday: 'D-8',
ddayLevel: 'calm',
statusLabel: '할 일',
},
],
},
{
key: 'done',
label: '완료',
rows: [
{
id: 6,
title: '캠페인 핵심 메시지 시안 작성',
status: 'done',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.kim],
metaText: '김서연',
dueLabel: '6월 9일 승인됨',
statusLabel: '완료',
done: true,
},
{
id: 4,
title: '퍼포먼스 광고 소재 세팅',
status: 'done',
repoName: '3분기 신제품 런칭 캠페인',
assignees: [USERS.park],
metaText: '박지훈',
dueLabel: '6월 5일 승인됨',
statusLabel: '완료',
done: true,
},
],
},
]
/** 비완료(활성) 업무 수 — 뷰 탭 카운트용 */
export function countActive(groups: MyTaskGroup[]): number {
return groups.filter((g) => g.key !== 'done').reduce((sum, g) => sum + g.rows.length, 0)
}
/* ============================================================
* 저장소 멤버
* ============================================================ */
export interface RepoMember {
user: User
email: string
/** 저장소 내 직무 표기(예: 리드, 콘텐츠 디자인) */
subRole: string
/** 담당 업무 수 */
taskCount: number
/** 권한 역할 */
roleType: 'admin' | 'member'
/** 현재 로그인 사용자 여부 */
isYou?: boolean
/** 소유자(역할 변경/제거 불가) */
owner?: boolean
}
export const REPO_MEMBERS: Record<string, RepoMember[]> = {
'q3-launch-campaign': [
{ user: USERS.jung, email: 'tkjung@acme.co', subRole: '리드', taskCount: 1, roleType: 'admin', isYou: true, owner: true },
{ user: USERS.kim, email: 'sykim@acme.co', subRole: '콘텐츠 디자인', taskCount: 2, roleType: 'member' },
{ user: USERS.park, email: 'jhpark@acme.co', subRole: '퍼포먼스 마케팅', taskCount: 2, roleType: 'member' },
{ user: USERS.lee, email: 'dylee@acme.co', subRole: '카피라이터', taskCount: 2, roleType: 'member' },
{ user: USERS.choi, email: 'yjchoi@acme.co', subRole: 'UX 디자인', taskCount: 1, roleType: 'member' },
],
}
export function findRepoMembers(id: string): RepoMember[] {
return REPO_MEMBERS[id] ?? []
}
/* ============================================================
* 저장소 활동 피드
* ============================================================ */
/** 활동 아이콘 종류(모양) */
export type ActivityIcon =
| 'check'
| 'pencil'
| 'member-add'
| 'member-check'
| 'member-remove'
| 'lock'
| 'repo'
/** 활동 항목 */
export interface RepoActivityItem {
/** 아이콘 색상 톤 */
tone: 'task' | 'member' | 'setting'
/** 아이콘 모양 */
icon: ActivityIcon
/** 행위자 아바타 */
initial: string
color: AvatarColor
/** 본문 HTML(내부 생성, 신뢰 가능 마크업) */
html: string
time: string
}
/** 날짜 그룹 */
export interface RepoActivityDay {
day: string
items: RepoActivityItem[]
}
export const REPO_ACTIVITY: RepoActivityDay[] = [
{
day: '오늘',
items: [
{
tone: 'task',
icon: 'check',
initial: '이',
color: 'av-c',
html: '<b>이도윤</b>님이 <a class="tgt" href="#">법무 검토 요청 및 회신 반영</a> 업무를 <span class="st prog">진행 중</span>으로 변경했습니다',
time: '2시간 전',
},
{
tone: 'task',
icon: 'check',
initial: '박',
color: 'av-b',
html: '<b>박지훈</b>님이 <a class="tgt" href="#">메인 배너 이미지 2종 디자인</a>의 체크리스트 ‘가로형 메인 배너’를 완료했습니다',
time: '3시간 전',
},
{
tone: 'member',
icon: 'member-add',
initial: '정',
color: 'av-f',
html: '<b>정태경</b>님이 <b>한지민</b>님을 멤버로 초대했습니다',
time: '5시간 전',
},
{
tone: 'member',
icon: 'member-check',
initial: '한',
color: 'av-d',
html: '<b>한지민</b>님이 멤버로 합류했습니다',
time: '5시간 전',
},
],
},
{
day: '어제',
items: [
{
tone: 'task',
icon: 'check',
initial: '최',
color: 'av-d',
html: '<b>최유진</b>님이 <a class="tgt" href="#">메인 비주얼 컨셉 확정</a> 업무를 <span class="st done">완료</span>했습니다',
time: '어제 18:40',
},
{
tone: 'task',
icon: 'pencil',
initial: '정',
color: 'av-f',
html: '<b>정태경</b>님이 <a class="tgt" href="#">SNS 콘텐츠 1차 시안</a> 업무를 지시했습니다 <span style="color:var(--text-3)">· 담당 정민호</span>',
time: '어제 14:10',
},
],
},
{
day: '이번 주',
items: [
{
tone: 'setting',
icon: 'lock',
initial: '정',
color: 'av-f',
html: '<b>정태경</b>님이 저장소 공개 범위를 <b>비공개</b>로 변경했습니다',
time: '6월 11일',
},
{
tone: 'member',
icon: 'member-remove',
initial: '박',
color: 'av-b',
html: '<b>박지훈</b>님의 역할이 <b>멤버</b>로 설정되었습니다',
time: '6월 11일',
},
{
tone: 'setting',
icon: 'pencil',
initial: '정',
color: 'av-f',
html: '<b>정태경</b>님이 표시 제목을 ‘3분기 신제품 런칭 캠페인’으로 변경했습니다',
time: '6월 10일',
},
{
tone: 'task',
icon: 'check',
initial: '김',
color: 'av-a',
html: '<b>김서연</b>님이 <a class="tgt" href="#">캠페인 핵심 메시지 시안 작성</a> 업무를 <span class="st done">완료</span>했습니다',
time: '6월 9일',
},
{
tone: 'setting',
icon: 'repo',
initial: '정',
color: 'av-f',
html: '<b>정태경</b>님이 저장소를 생성했습니다',
time: '6월 2일',
},
],
},
]