Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f11c0d3cef |
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
- 프로젝트명: 10 Minute Planner 웹 UI
|
- 프로젝트명: 10 Minute Planner 웹 UI
|
||||||
- 기술 스택: Vue 3 + Vite + TailwindCSS + JavaScript
|
- 기술 스택: Vue 3 + Vite + TailwindCSS + JavaScript
|
||||||
- 현재 기준 버전: `v0.1.30` 준비 중
|
- 현재 기준 버전: `v0.1.31` 준비 중
|
||||||
- Git 원격 저장소: `https://git.sori.studio/zenn/planner.sori.studio.git`
|
- Git 원격 저장소: `https://git.sori.studio/zenn/planner.sori.studio.git`
|
||||||
|
|
||||||
## 기준 디자인
|
## 기준 디자인
|
||||||
@@ -175,6 +175,7 @@
|
|||||||
- `2 PAGE SPREAD`는 화면 폭을 기준으로 배율을 자동 계산해서 오른쪽 페이지가 잘리는 현상을 줄이는 방향으로 조정했다.
|
- `2 PAGE SPREAD`는 화면 폭을 기준으로 배율을 자동 계산해서 오른쪽 페이지가 잘리는 현상을 줄이는 방향으로 조정했다.
|
||||||
- `1280px` 미만에서는 왼쪽 내비게이션도 본문 위에 쌓이지 않고 `MENU` 버튼으로 여는 드로어형 패널로 전환된다.
|
- `1280px` 미만에서는 왼쪽 내비게이션도 본문 위에 쌓이지 않고 `MENU` 버튼으로 여는 드로어형 패널로 전환된다.
|
||||||
- 태블릿/모바일 구간에서는 `왼쪽 내비게이션 드로어 + 오른쪽 정보 패널 오버레이 + 본문 단일 컬럼` 조합으로 보는 흐름을 기본값으로 삼는다.
|
- 태블릿/모바일 구간에서는 `왼쪽 내비게이션 드로어 + 오른쪽 정보 패널 오버레이 + 본문 단일 컬럼` 조합으로 보는 흐름을 기본값으로 삼는다.
|
||||||
|
- 통계 화면과 우측 `FOCUSED TIME` 요약처럼 사용자에게 보여주는 집중 시간 표기는 `00H 00M` 대신 `00시간 00분` 한글 형식으로 바꿨다.
|
||||||
- 비로그인 랜딩 카드는 상단 고정이 아니라 화면 중앙에 오도록 정렬을 수정했다.
|
- 비로그인 랜딩 카드는 상단 고정이 아니라 화면 중앙에 오도록 정렬을 수정했다.
|
||||||
- 현재 환경에서는 Docker 데몬이 꺼져 있어서 `docker compose build` 실검증은 하지 못했고, 데몬 시작 후 다시 확인이 필요하다.
|
- 현재 환경에서는 Docker 데몬이 꺼져 있어서 `docker compose build` 실검증은 하지 못했고, 데몬 시작 후 다시 확인이 필요하다.
|
||||||
- 이미지 저장 기능은 추후 `print-only` 또는 별도 export 전용 레이아웃을 기준으로 구현하면 화면/인쇄/공유 결과를 맞추기 쉽다.
|
- 이미지 저장 기능은 추후 `print-only` 또는 별도 export 전용 레이아웃을 기준으로 구현하면 화면/인쇄/공유 결과를 맞추기 쉽다.
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ten-minute-planner",
|
"name": "ten-minute-planner",
|
||||||
"version": "0.1.30",
|
"version": "0.1.31",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ten-minute-planner",
|
"name": "ten-minute-planner",
|
||||||
"version": "0.1.30",
|
"version": "0.1.31",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"vue": "^3.5.13"
|
"vue": "^3.5.13"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "ten-minute-planner",
|
"name": "ten-minute-planner",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.1.30",
|
"version": "0.1.31",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
22
src/App.vue
22
src/App.vue
@@ -404,6 +404,16 @@ function formatTotalTime(record) {
|
|||||||
return `${hoursPart}H ${minutesPart}M`
|
return `${hoursPart}H ${minutesPart}M`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatMinutesKorean(totalMinutes) {
|
||||||
|
const hoursPart = `${Math.floor(totalMinutes / 60)}`.padStart(2, '0')
|
||||||
|
const minutesPart = `${totalMinutes % 60}`.padStart(2, '0')
|
||||||
|
return `${hoursPart}시간 ${minutesPart}분`
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatTotalTimeKorean(record) {
|
||||||
|
return formatMinutesKorean(record.timetable.filter(Boolean).length * 10)
|
||||||
|
}
|
||||||
|
|
||||||
function getFocusedMinutes(record) {
|
function getFocusedMinutes(record) {
|
||||||
return record.timetable.filter(Boolean).length * 10
|
return record.timetable.filter(Boolean).length * 10
|
||||||
}
|
}
|
||||||
@@ -549,7 +559,7 @@ const aggregateCompletionRate = computed(() => {
|
|||||||
const overviewCards = computed(() => [
|
const overviewCards = computed(() => [
|
||||||
{
|
{
|
||||||
label: 'TOTAL FOCUSED',
|
label: 'TOTAL FOCUSED',
|
||||||
value: formatMinutes(totalFocusedMinutes.value),
|
value: formatMinutesKorean(totalFocusedMinutes.value),
|
||||||
caption: '지금까지 기록된 전체 집중 시간',
|
caption: '지금까지 기록된 전체 집중 시간',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -591,7 +601,7 @@ const weeklyRecords = computed(() => {
|
|||||||
key,
|
key,
|
||||||
weekday: weekdayShort,
|
weekday: weekdayShort,
|
||||||
focusedMinutes,
|
focusedMinutes,
|
||||||
focusedTime: formatMinutes(focusedMinutes),
|
focusedTime: formatMinutesKorean(focusedMinutes),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -615,7 +625,7 @@ const recentRecords = computed(() =>
|
|||||||
key,
|
key,
|
||||||
dateLabel: createDateLabel(key),
|
dateLabel: createDateLabel(key),
|
||||||
comment: record.comment.trim(),
|
comment: record.comment.trim(),
|
||||||
focusedTime: formatTotalTime(record),
|
focusedTime: formatTotalTimeKorean(record),
|
||||||
completionRate: getCompletionRate(record),
|
completionRate: getCompletionRate(record),
|
||||||
})),
|
})),
|
||||||
)
|
)
|
||||||
@@ -634,7 +644,7 @@ const bestDay = computed(() => {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
dateLabel: createDateLabel(bestKey),
|
dateLabel: createDateLabel(bestKey),
|
||||||
summary: `${formatTotalTime(bestRecord)} 집중, 완료율 ${getCompletionRate(bestRecord)}%, 코멘트 "${
|
summary: `${formatTotalTimeKorean(bestRecord)} 집중, 완료율 ${getCompletionRate(bestRecord)}%, 코멘트 "${
|
||||||
bestRecord.comment.trim() || '없음'
|
bestRecord.comment.trim() || '없음'
|
||||||
}"`,
|
}"`,
|
||||||
}
|
}
|
||||||
@@ -664,7 +674,7 @@ const prevSnapshotItems = computed(() => {
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
`${createDateLabel(entryKey)} 기록`,
|
`${createDateLabel(entryKey)} 기록`,
|
||||||
`${formatTotalTime(entryRecord)} 집중 / 완료 ${completedCount}개`,
|
`${formatTotalTimeKorean(entryRecord)} 집중 / 완료 ${completedCount}개`,
|
||||||
previousComment || (previousTopTask ? `주요 작업: ${previousTopTask.title}` : '남겨진 코멘트 없음'),
|
previousComment || (previousTopTask ? `주요 작업: ${previousTopTask.title}` : '남겨진 코멘트 없음'),
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
@@ -1814,7 +1824,7 @@ onBeforeUnmount(() => {
|
|||||||
<p class="text-[11px] font-semibold tracking-[0.08em] text-stone-500">TASK COMPLETION</p>
|
<p class="text-[11px] font-semibold tracking-[0.08em] text-stone-500">TASK COMPLETION</p>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="text-[22px] font-semibold tracking-[-0.04em] text-stone-900">{{ formatTotalTime(planner) }}</p>
|
<p class="text-[22px] font-semibold tracking-[-0.04em] text-stone-900">{{ formatTotalTimeKorean(planner) }}</p>
|
||||||
<p class="text-[11px] font-semibold tracking-[0.08em] text-stone-500">FOCUSED TIME</p>
|
<p class="text-[11px] font-semibold tracking-[0.08em] text-stone-500">FOCUSED TIME</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user