diff --git a/UPDATES.md b/UPDATES.md new file mode 100644 index 0000000..adff287 --- /dev/null +++ b/UPDATES.md @@ -0,0 +1,33 @@ +--- +updatedAt: 2026-08-31T14:15:17+09:00 +--- + +## 2026년 8월 31일 + +### 업데이트 내역 탭 추가 + +`NEW` 버전 배포를 기다리지 않고, 수시로 반영되는 기능·개선·수정·데이터 변경 내용을 한곳에서 확인할 수 있습니다. + +### 제보와 기능 건의 동선 개선 + +`IMPROVED` 상단 메뉴에서 버그 제보, 기능 건의, 실측값 제보 폼을 바로 열 수 있도록 정리했습니다. + +### 카드별 가창 보너스 덮어쓰기 + +`NEW` 배치 분석과 조합 탐색에서 카드별 가창 보너스를 직접 입력해 계산에 반영할 수 있습니다. + +### 점수 타임라인 추가 + +`NEW` 배치 분석 결과에서 초당 노트 분포와 멤버별 액티브·스페셜 발동 구간을 시각적으로 확인할 수 있습니다. + +### 일반 배치 분석의 순서 선정 기준 보정 + +`FIXED` 일반 배치 분석이 예상 점수보다 이론상 최고점을 우선해 최적 순서를 선정하도록 기준을 바로잡았습니다. + +--- + +## 2026년 8월 29일 + +### 최신 카드와 악곡 데이터 반영 + +`DATA` 신규 수영복 5성 카드와 악곡 6종의 Hard·Expert 채보를 추가하고, 악곡이 게임 내 공개 시각에 맞춰 목록에 표시되도록 개선했습니다. diff --git a/offline/OfflineApp.svelte b/offline/OfflineApp.svelte index 133b60f..5801ab8 100644 --- a/offline/OfflineApp.svelte +++ b/offline/OfflineApp.svelte @@ -8,6 +8,7 @@ import DataPage from '../src/routes/data/+page.svelte'; import DataCardsPage from '../src/routes/data/cards/+page.svelte'; import DataBoardsPage from '../src/routes/data/boards/+page.svelte'; + import UpdatesPage from '../src/routes/updates/+page.svelte'; import { setOfflinePage } from './page-store'; import { events } from '../src/lib/data/events'; import { activeEventAt } from '../src/lib/engine/event-optimization'; @@ -20,7 +21,8 @@ ['/event', EventPage], ['/data', DataPage], ['/data/cards', DataCardsPage], - ['/data/boards', DataBoardsPage] + ['/data/boards', DataBoardsPage], + ['/updates', UpdatesPage] ]); function pathFromHash() { @@ -78,6 +80,7 @@ 조합 탐색 {#if showEventTab}이벤트 Pt{/if} 사용자 데이터 + 업데이트 내역 import { onMount } from 'svelte'; import { dev } from '$app/environment'; + import updateHistoryMarkdown from '../../../UPDATES.md?raw'; import { renderReleaseMarkdown } from '$lib/release-notes/markdown'; - import { RELEASES_PAGE_URL } from '$lib/release-notes/release-note-service'; import { currentAppVersion, releaseNotes } from '$lib/release-notes/release-note-store'; import { versionTagIsNewer } from '$lib/release-notes/version'; + import { parseUpdateHistoryDocument } from '$lib/update-history-document.ts'; let previewUpdate = false; + const updateHistoryDocument = parseUpdateHistoryDocument(updateHistoryMarkdown); onMount(() => { previewUpdate = dev && new URLSearchParams(window.location.search).get('previewUpdate') === '1'; @@ -16,6 +18,20 @@ $: latestRelease = $releaseNotes.releases[0] ?? null; $: updateAvailable = latestRelease !== null && (previewUpdate || versionTagIsNewer(latestRelease.tagName, currentAppVersion)); + function updatedDateTime(value: string | null): string { + if (!value) return '시각 미등록'; + const date = new Date(value); + if (Number.isNaN(date.getTime())) return value; + return new Intl.DateTimeFormat('ko-KR', { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + hour12: false + }).format(date); + } + function publishedDate(value: string): string { const date = new Date(value); if (Number.isNaN(date.getTime())) return value; @@ -27,25 +43,22 @@ } -{#if $releaseNotes.status === 'available' && latestRelease} -