diff --git a/apps/web/public/sitemap-0.xml b/apps/web/public/sitemap-0.xml index d99207b..9a8cc02 100644 --- a/apps/web/public/sitemap-0.xml +++ b/apps/web/public/sitemap-0.xml @@ -1,6 +1,6 @@ -https://www.singcode.kr/manifest.webmanifest2026-08-25T16:04:17.180Zweekly0.7 -https://www.singcode.kr/patch-notes2026-08-25T16:04:17.182Zweekly0.7 -https://www.singcode.kr2026-08-25T16:04:17.182Zweekly0.7 +https://www.singcode.kr/manifest.webmanifest2026-08-28T16:24:56.791Zweekly0.7 +https://www.singcode.kr/patch-notes2026-08-28T16:24:56.793Zweekly0.7 +https://www.singcode.kr2026-08-28T16:24:56.794Zweekly0.7 \ No newline at end of file diff --git a/apps/web/src/app/popular/ArtistVotePanel.tsx b/apps/web/src/app/popular/ArtistVotePanel.tsx index 95c1972..74ca962 100644 --- a/apps/web/src/app/popular/ArtistVotePanel.tsx +++ b/apps/web/src/app/popular/ArtistVotePanel.tsx @@ -137,118 +137,118 @@ export default function ArtistVotePanel() { ); }; - if (!isAuthenticated) { - return ( -
-

로그인하고 투표해보세요

-

- 보유 포인트로 이달의 아티스트를 뽑을 수 있어요. -

-
- ); - } - return ( -
-
- 보유 포인트 {point}P - {changedRows.length > 0 && ( - - {' '} - → 저장 후 {remainingPoint}P - - )} -
- -
- handleChangeQuery(event.target.value)} - onFocus={() => setIsFocusAuto(true)} - onBlur={() => setIsFocusAuto(false)} - /> - {isFocusAuto && ( - - )} -
- - {isSearchEmpty && ( -

- ‘{query.trim()}’ 검색 결과가 없어요. -

- )} +
+ {/* 비로그인이어도 투표 화면이 어떤 모습인지는 그대로 보여주고 안내 문구만 위에 덮는다. + inert는 아래 UI의 클릭·포커스·접근성 트리 노출을 한 번에 막아, 로그인 없이 조작되는 일이 없다. */} +
+
+ 보유 포인트 {point}P + {changedRows.length > 0 && ( + + {' '} + → 저장 후 {remainingPoint}P + + )} +
- -
- {rows.length === 0 ? ( -

- 검색해서 투표할 아티스트를 담아보세요. -

- ) : ( - rows.map(row => ( - handleChange(row.artist, amount)} - onSubmit={handleSubmit} - onDelete={() => handleDelete(row.artist)} - /> - )) +
+ handleChangeQuery(event.target.value)} + onFocus={() => setIsFocusAuto(true)} + onBlur={() => setIsFocusAuto(false)} + /> + {isFocusAuto && ( + )}
- -
- {isOverPoint && ( -

- 포인트가 {-remainingPoint}P 부족해요. 투표값을 줄여주세요. + {isSearchEmpty && ( +

+ ‘{query.trim()}’ 검색 결과가 없어요.

)} - -
- - - - 투표를 반영할까요? - - 저장하면 차액만큼 포인트가 차감되거나 환불돼요. 이번 달에는 언제든 다시 조정할 수 - 있어요. - - - -
- {changedRows.map(row => ( -
- - - {row.savedAmount}P → {row.amount}P - -
- ))} + +
+ {rows.length === 0 ? ( +

+ 검색해서 투표할 아티스트를 담아보세요. +

+ ) : ( + rows.map(row => ( + handleChange(row.artist, amount)} + onSubmit={handleSubmit} + onDelete={() => handleDelete(row.artist)} + /> + )) + )}
+
-
- {spending >= 0 ? '차감 포인트' : '환불 포인트'} - {Math.abs(spending)}P -
+
+ {isOverPoint && ( +

+ 포인트가 {-remainingPoint}P 부족해요. 투표값을 줄여주세요. +

+ )} + +
+ + + + + 투표를 반영할까요? + + 저장하면 차액만큼 포인트가 차감되거나 환불돼요. 이번 달에는 언제든 다시 조정할 수 + 있어요. + + + +
+ {changedRows.map(row => ( +
+ + + {row.savedAmount}P → {row.amount}P + +
+ ))} +
+ +
+ {spending >= 0 ? '차감 포인트' : '환불 포인트'} + {Math.abs(spending)}P +
+ + + + + +
+
+
- - - - -
-
+ {!isAuthenticated && ( +
+

로그인하면 참여할 수 있어요

+

이 달의 아티스트를 직접 뽑아주세요.

+
+ )}
); } diff --git a/apps/web/src/app/popular/ChartGenreFilter.tsx b/apps/web/src/app/popular/ChartGenreFilter.tsx index 331317a..eab0e54 100644 --- a/apps/web/src/app/popular/ChartGenreFilter.tsx +++ b/apps/web/src/app/popular/ChartGenreFilter.tsx @@ -3,7 +3,7 @@ import { useEffect, useRef } from 'react'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { STR_TYPE_EMOJI, STR_TYPE_LABEL, StrType } from '@/types/tjChart'; +import { STR_TYPE_LABEL, StrType } from '@/types/tjChart'; // 장르가 12종이라 줄바꿈 없이 한 줄로 두고 가로 스크롤로 훑게 한다. // TabsTrigger 기본 스타일의 flex-1(균등 분할)은 flex-none으로 해제해야 칩 너비가 라벨에 맞는다. @@ -57,7 +57,6 @@ export default function ChartGenreFilter({ value, onChange }: ChartGenreFilterPr {Object.values(StrType).map(type => ( - {STR_TYPE_LABEL[type]} ))} diff --git a/apps/web/src/app/search/SearchTour.tsx b/apps/web/src/app/search/SearchTour.tsx index 0cca923..527981c 100644 --- a/apps/web/src/app/search/SearchTour.tsx +++ b/apps/web/src/app/search/SearchTour.tsx @@ -136,6 +136,9 @@ export default function SearchTour({ zIndex: 10000, showProgress: true, buttons: TOOLTIP_BUTTONS, + // 라이브러리 기본값 'close'는 continuous 모드에서 X를 눌러도 다음 단계로 넘어갈 뿐 투어가 끝나지 않는다. + // 'skip'이어야 상태가 SKIPPED가 되어 투어가 종료되고 '다시 보지 않기'까지 저장된다. + closeButtonAction: 'skip' as const, skipBeacon: true, // 라이브러리 기본값(고정 380px)은 375px 이하 모바일 화면에서 좌우로 넘친다. // 뷰포트보다 넓어지지 않되, 넓은 화면에서는 기존 380px 상한을 유지한다. diff --git a/apps/web/src/constants/tourDemoSong.ts b/apps/web/src/constants/tourDemoSong.ts index 139bbe5..61fc1a4 100644 --- a/apps/web/src/constants/tourDemoSong.ts +++ b/apps/web/src/constants/tourDemoSong.ts @@ -6,12 +6,12 @@ import { SearchSong } from '@/types/song'; * 실제 검색 결과로 투어를 진행하면 곡 데이터가 바뀌거나 검색이 실패할 때 투어가 깨진다. * 네트워크 없이 항상 같은 카드를 보여주도록 고정값을 쓴다. */ -export const TOUR_DEMO_SEARCH_TERM = '밤이 깊었나'; +export const TOUR_DEMO_SEARCH_TERM = '밤이 깊었네'; export const TOUR_DEMO_SONG: SearchSong = { id: 'tour-demo-song', - title: '밤이 깊었나', - artist: '스판텍스', + title: '밤이 깊었네', + artist: '크라잉넛', num_tj: '10101', num_ky: '20202', badges: [], diff --git a/apps/web/src/types/tjChart.ts b/apps/web/src/types/tjChart.ts index 11409d5..72f63e1 100644 --- a/apps/web/src/types/tjChart.ts +++ b/apps/web/src/types/tjChart.ts @@ -32,24 +32,6 @@ export const STR_TYPE_LABEL: Record = { [StrType.RnbUrban]: 'R&B/어반', }; -// 장르 뱃지 앞에 붙는 아이콘. -// Windows의 Segoe UI Emoji에 글리프가 없으면 두부(tofu)로 깨지므로, -// 국기(regional indicator)와 최신 이모지는 쓰지 않는다. 아코디언(U+1FA97)도 여기서 깨진다. -export const STR_TYPE_EMOJI: Record = { - [StrType.All]: '🏆', - [StrType.Kpop]: '🎤', - [StrType.Pop]: '🌍', - [StrType.Jpop]: '🌸', - [StrType.Ballad]: '💗', - [StrType.Dance]: '💃', - [StrType.Trot]: '📻', - [StrType.Folk]: '🎸', - [StrType.Ost]: '🎬', - [StrType.RockMetal]: '🤘', - [StrType.RapHiphop]: '🔥', - [StrType.RnbUrban]: '🎷', -}; - export interface TjChartRankingSong extends Song { rank: number; }