Compare commits

...

1 Commits

Author SHA1 Message Date
f11c0d3cef v0.1.31 - 집중 시간 한글 표기와 통계 문구 정리 2026-04-22 16:42:25 +09:00
4 changed files with 21 additions and 10 deletions

View File

@@ -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
View File

@@ -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"
}, },

View File

@@ -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",

View File

@@ -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>