From 3dc19a9c23bfe53b0300223e3dac534991629e59 Mon Sep 17 00:00:00 2001 From: dal4segno Date: Fri, 21 Aug 2026 19:33:26 +0900 Subject: [PATCH] feat: add score report links and estimation warnings --- offline/OfflineApp.svelte | 22 +++++++++++++++++++--- release-notes/1.0.7.md | 2 +- src/routes/+layout.svelte | 22 +++++++++++++++++++--- src/routes/analysis/+page.svelte | 5 +++++ src/routes/combination/+page.svelte | 9 +++++++-- 5 files changed, 51 insertions(+), 9 deletions(-) diff --git a/offline/OfflineApp.svelte b/offline/OfflineApp.svelte index 15d8f3a..5263063 100644 --- a/offline/OfflineApp.svelte +++ b/offline/OfflineApp.svelte @@ -69,6 +69,13 @@ 배치 분석 조합 탐색 사용자 데이터 + 실측값 제보 @@ -92,6 +99,7 @@ display: flex; align-items: center; justify-content: space-between; + gap: 10px; width: min(var(--page-max-width), calc(100% - var(--page-gutter))); min-height: 62px; margin: 0 auto; @@ -105,23 +113,31 @@ text-decoration: none; } - nav { display: flex; align-items: center; gap: 4px; } + nav { display: flex; min-width: 0; flex: 1; align-items: center; justify-content: flex-end; gap: 4px; overflow-x: auto; scrollbar-width: none; } + nav::-webkit-scrollbar { display: none; } nav a { + flex: 0 0 auto; padding: 8px 12px; border-radius: 9px; color: #929cad; font-size: 13px; font-weight: 750; text-decoration: none; + white-space: nowrap; } nav a:hover { color: #e2e6ed; background: rgb(255 255 255 / 5%); } nav a[aria-current='page'] { color: #f1a1c3; background: rgb(239 139 182 / 12%); } + .report-link { flex: 0 0 auto; padding: 8px 12px; border: 1px solid #ef8bb6; border-radius: 9px; color: #21121a; background: linear-gradient(135deg, #f3a3c5, #e77ead); box-shadow: 0 0 18px rgb(239 139 182 / 18%); font-size: 13px; font-weight: 800; text-decoration: none; white-space: nowrap; } + .report-link:hover { color: #160d12; background: linear-gradient(135deg, #f8bad3, #ee94ba); box-shadow: 0 0 22px rgb(239 139 182 / 30%); } + .report-link span { margin-left: 2px; font-size: 11px; } a:focus-visible { outline: 3px solid rgb(239 139 182 / 28%); outline-offset: 2px; } @media (max-width: 560px) { :global(:root) { --page-gutter: 24px; } .nav-inner { width: calc(100% - 24px); min-height: 54px; } - .brand { font-size: 15px; } - nav a { padding: 7px 9px; font-size: 14px; } + .brand { font-size: 13px; } + nav { gap: 2px; } + nav a { padding: 7px 7px; font-size: 12px; } + .report-link { padding: 7px 8px; font-size: 12px; } } diff --git a/release-notes/1.0.7.md b/release-notes/1.0.7.md index 244233a..558e0e5 100644 --- a/release-notes/1.0.7.md +++ b/release-notes/1.0.7.md @@ -17,7 +17,7 @@ - 점수 계수가 보정된 채보와 복수 기수 카드의 보드 보너스는 이전 버전과 계산 결과가 달라질 수 있습니다. - 현재 실측 점수 계수가 등록된 채보는 일부입니다. 계산 정확도 향상을 위해 대부분의 악곡에서 실측값 제보가 필요합니다. -- 실측값 제보: `[제보 링크 입력]` +- 실측값 제보: [Google Form](https://docs.google.com/forms/d/1bShzsxNN-iTk0uU3RfMfmLkYXYmUTmIWMmCtQmfl_Ik) - 연결 카드 최적화는 결과를 확인한 뒤 적용할 때만 사용자 데이터의 배치를 변경하며, 적용 직후에는 이전 배치로 복원할 수 있습니다. ## 다운로드 diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index f632e85..600eba1 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -11,6 +11,13 @@ 배치 분석 조합 탐색 사용자 데이터 + 실측값 제보 @@ -34,6 +41,7 @@ display: flex; align-items: center; justify-content: space-between; + gap: 10px; width: min(var(--page-max-width), calc(100% - var(--page-gutter))); min-height: 62px; margin: 0 auto; @@ -47,25 +55,33 @@ text-decoration: none; } - nav { display: flex; align-items: center; gap: 4px; } + nav { display: flex; min-width: 0; flex: 1; align-items: center; justify-content: flex-end; gap: 4px; overflow-x: auto; scrollbar-width: none; } + nav::-webkit-scrollbar { display: none; } nav a { + flex: 0 0 auto; padding: 8px 12px; border-radius: 9px; color: #929cad; font-size: 13px; font-weight: 750; text-decoration: none; + white-space: nowrap; } nav a:hover { color: #e2e6ed; background: rgb(255 255 255 / 5%); } nav a[aria-current='page'] { color: #f1a1c3; background: rgb(239 139 182 / 12%); } + .report-link { flex: 0 0 auto; padding: 8px 12px; border: 1px solid #ef8bb6; border-radius: 9px; color: #21121a; background: linear-gradient(135deg, #f3a3c5, #e77ead); box-shadow: 0 0 18px rgb(239 139 182 / 18%); font-size: 13px; font-weight: 800; text-decoration: none; white-space: nowrap; } + .report-link:hover { color: #160d12; background: linear-gradient(135deg, #f8bad3, #ee94ba); box-shadow: 0 0 22px rgb(239 139 182 / 30%); } + .report-link span { margin-left: 2px; font-size: 11px; } a:focus-visible { outline: 3px solid rgb(239 139 182 / 28%); outline-offset: 2px; } @media (max-width: 560px) { :global(:root) { --page-gutter: 24px; } .nav-inner { width: calc(100% - 24px); min-height: 54px; } - .brand { font-size: 15px; } - nav a { padding: 7px 9px; font-size: 14px; } + .brand { font-size: 13px; } + nav { gap: 2px; } + nav a { padding: 7px 7px; font-size: 12px; } + .report-link { padding: 7px 8px; font-size: 12px; } } diff --git a/src/routes/analysis/+page.svelte b/src/routes/analysis/+page.svelte index dfe3304..a17f780 100644 --- a/src/routes/analysis/+page.svelte +++ b/src/routes/analysis/+page.svelte @@ -768,6 +768,9 @@

배치 분석

특정 악곡과 카드 조합에서 최고 점수를 낼 수 있는 스페셜 발동 순서와 빈도 감소 조합을 찾습니다.

+ {#if selectedChart && selectedChart.scoreCalibrationSource !== 'measured'} +

추정 점수 안내 이 악곡의 점수 계수는 실측값이 아니므로 실제 점수와 오차가 크게 발생할 수 있습니다.

+ {/if}
@@ -1017,6 +1020,8 @@ .page-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; margin-bottom: var(--page-header-bottom); } h1 { margin: 0; color: #f3f5f8; font-size: var(--page-title-size); line-height: 1.15; letter-spacing: -.045em; } .page-description { margin: 10px 0 0; color: #929cab; font-size: var(--page-description-size); line-height: 1.6; } + .calibration-warning { width: fit-content; margin: 10px 0 0; padding: 8px 11px; border: 1px solid #604653; border-radius: 8px; color: #c8aeb9; background: #261d23; font-size: 13px; line-height: 1.55; } + .calibration-warning strong { margin-right: 5px; color: #f1a3c4; } .panel { margin-top: 16px; padding: 24px; border: 1px solid #2a303a; border-radius: 16px; background: #171b22; } .section-title, .section-title > div { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .section-title > div { justify-content: flex-start; } diff --git a/src/routes/combination/+page.svelte b/src/routes/combination/+page.svelte index 92e4562..6577bdb 100644 --- a/src/routes/combination/+page.svelte +++ b/src/routes/combination/+page.svelte @@ -1007,6 +1007,9 @@

조합 탐색

악곡과 고정 멤버 조건을 바탕으로 최고 점수 조합과 스페셜 발동 순서를 함께 찾습니다.

+ {#if selectedChart && selectedChart.scoreCalibrationSource !== 'measured'} +

추정 점수 안내 이 악곡의 점수 계수는 실측값이 아니므로 실제 점수와 오차가 크게 발생할 수 있습니다.

+ {/if}

기준 조합은 배치 분석 결과가 저장되어 있고, 저장된 악곡과 난이도가 현재 탐색 조건과 같을 때 표시됩니다.

{#if baselineState && baselineMatchesConditions} @@ -1184,6 +1187,8 @@ header { margin-bottom: var(--page-header-bottom); } h1 { margin: 0; color: #f3f5f8; font-size: var(--page-title-size); line-height: 1.15; letter-spacing: -.045em; } .page-description { margin: 10px 0 0; color: #929cab; font-size: var(--page-description-size); line-height: 1.6; } + .calibration-warning { width: fit-content; margin: 10px 0 0; padding: 8px 11px; border: 1px solid #604653; border-radius: 8px; color: #c8aeb9; background: #261d23; font-size: 13px; line-height: 1.55; } + .calibration-warning strong { margin-right: 5px; color: #f1a3c4; } .baseline-guide { width: fit-content; margin: 10px 0 0; padding: 8px 11px; border-radius: 8px; color: #8d96a5; background: #1b2029; font-size: 13px; line-height: 1.55; } .baseline-guide strong { color: #dba0b9; } .panel { margin-top: 16px; padding: 24px; border: 1px solid #2a303a; border-radius: 16px; background: #171b22; } @@ -1202,9 +1207,9 @@ label { display: grid; gap: 7px; color: #8f98a8; font-size: 14px; font-weight: 750; } select, .number-input { width: 100%; min-width: 0; height: 42px; padding: 0 12px; border: 1px solid #343c49; border-radius: 9px; color: #e8ebf1; background: #11151b; font: inherit; } select:focus, .number-input:focus, .generation-input:focus { border-color: #d86f9c; outline: 3px solid rgb(216 111 156 / 14%); } - .song-fields { display: grid; grid-template-columns: minmax(0, 4fr) clamp(110px, 11vw, 170px) minmax(220px, .8fr); align-items: start; gap: 12px; margin-top: 22px; } + .song-fields { display: grid; grid-template-columns: minmax(0, 1fr) clamp(110px, 11vw, 170px); align-items: start; gap: 12px; margin-top: 22px; } .song-picker-field { min-width: 0; } - .chart-meta { display: flex; align-items: center; gap: 8px; height: 42px; margin-top: 25px; } + .chart-meta { display: flex; grid-column: 1 / -1; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 42px; } .chart-meta span { padding: 7px 9px; border-radius: 7px; color: #adb5c2; background: #202631; font-size: 13px; white-space: nowrap; } .candidate-fields { display: grid; grid-template-columns: clamp(130px, 12vw, 180px) clamp(260px, 24vw, 380px); gap: 9px; margin-top: 18px; } .candidate-awakening { display: grid; gap: 7px; color: #8f98a8; font-size: 14px; font-weight: 750; }