From 06d9b00830cba878e7bf60390daf87b9817b6197 Mon Sep 17 00:00:00 2001 From: manNomi Date: Tue, 11 Aug 2026 22:50:36 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20iOS=20=EB=AA=A8=EC=85=98=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.config.js | 6 +++++- .../deployment/IOS_PHYSICAL_DEVICE_TESTING.md | 2 +- scripts/check-store-release.js | 20 +++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app.config.js b/app.config.js index 583fe16..1d46967 100644 --- a/app.config.js +++ b/app.config.js @@ -1,3 +1,6 @@ +const motionUsageDescription = + 'Soundlog가 이동 중인 여행의 위치 기록을 안정적으로 제공하기 위해 기기의 동작 상태에 접근할 수 있습니다.'; + const baseConfig = { name: 'Soundlog', slug: 'soundlog', @@ -16,6 +19,7 @@ const baseConfig = { 'Soundlog가 저장된 로그인 정보를 안전하게 보호하기 위해 Face ID를 사용할 수 있습니다.', NSLocationWhenInUseUsageDescription: 'Soundlog가 현재 장소에 맞는 음악을 추천하고 여행 순간의 위치를 기록하기 위해 위치 권한이 필요합니다.', + NSMotionUsageDescription: motionUsageDescription, NSPhotoLibraryAddUsageDescription: 'Soundlog가 리캡 이미지를 사진 보관함에 저장하기 위해 권한이 필요합니다.', NSPhotoLibraryUsageDescription: @@ -139,7 +143,7 @@ const baseConfig = { 'Soundlog가 현재 장소에 맞는 음악을 추천하고 여행 순간의 위치를 기록하기 위해 위치 권한이 필요합니다.', locationAlwaysAndWhenInUsePermission: false, locationAlwaysPermission: false, - motionUsagePermission: false, + motionUsagePermission: motionUsageDescription, isIosBackgroundLocationEnabled: false, isAndroidBackgroundLocationEnabled: false, isAndroidForegroundServiceEnabled: false, diff --git a/docs/deployment/IOS_PHYSICAL_DEVICE_TESTING.md b/docs/deployment/IOS_PHYSICAL_DEVICE_TESTING.md index 84c9499..7fd2dd8 100644 --- a/docs/deployment/IOS_PHYSICAL_DEVICE_TESTING.md +++ b/docs/deployment/IOS_PHYSICAL_DEVICE_TESTING.md @@ -183,7 +183,7 @@ v1.0은 iPhone 전용으로 제출한다. iPad 스크린샷 자산과 iPad 실 ### 출시 권한 및 개인정보 선언 -production 설정은 사진 기록에 필요한 카메라와 사진 보관함, 현재 장소와 여행 기록에 필요한 `When In Use` 위치 권한만 요청한다. 녹음, 항상 위치, 모션 활동, iOS/Android 백그라운드 위치 권한은 사용하지 않는다. +production 설정은 사진 기록에 필요한 카메라와 사진 보관함, 현재 장소와 여행 기록에 필요한 `When In Use` 위치 권한만 직접 요청한다. 녹음, 항상 위치, 모션 활동, iOS와 Android의 백그라운드 위치 권한은 앱 기능에서 사용하지 않는다. 다만 ExpoLocation 바이너리가 CoreMotion API를 포함하므로 Apple 업로드 검사를 통과하기 위한 `NSMotionUsageDescription` 문구는 `Info.plist`에 유지한다. 이 문구만으로 사용자에게 모션 권한을 요청하지는 않는다. `ios.privacyManifests`에는 계정 이름·이메일·사용자 ID, 정확한 위치, 사진 또는 비디오, 사용자 콘텐츠를 앱 기능 목적으로 선언하고, 추천·저장·공유 등 앱 내 상호작용은 분석 목적으로 선언한다. 모든 선언은 계정과 연결되지만 추적에는 사용하지 않는다. App Store Connect의 App Privacy 응답도 이 설정 및 실제 서버 처리와 동일하게 입력한다. diff --git a/scripts/check-store-release.js b/scripts/check-store-release.js index 561be3d..4049c03 100644 --- a/scripts/check-store-release.js +++ b/scripts/check-store-release.js @@ -204,10 +204,21 @@ function assertRuntimePermissionPlugins(config) { addError('expo-location must retain an iOS When In Use location permission message.'); } + if (!config.ios?.infoPlist?.NSMotionUsageDescription?.trim()) { + addError( + 'Expo config must include NSMotionUsageDescription because ExpoLocation links CoreMotion APIs.', + ); + } + + if (location.motionUsagePermission !== config.ios?.infoPlist?.NSMotionUsageDescription) { + addError( + 'expo-location motionUsagePermission must match the iOS NSMotionUsageDescription.', + ); + } + [ 'locationAlwaysAndWhenInUsePermission', 'locationAlwaysPermission', - 'motionUsagePermission', 'isIosBackgroundLocationEnabled', 'isAndroidBackgroundLocationEnabled', 'isAndroidForegroundServiceEnabled', @@ -297,7 +308,6 @@ function assertNativeIosPlist() { 'NSLocationAlwaysUsageDescription', 'NSLocationAlwaysAndWhenInUseUsageDescription', 'NSMicrophoneUsageDescription', - 'NSMotionUsageDescription', ]; forbiddenKeys.forEach((key) => { @@ -306,6 +316,12 @@ function assertNativeIosPlist() { } }); + if (!/NSMotionUsageDescription<\/key>\s*[^<]+<\/string>/.test(plist)) { + addError( + 'iOS native Info.plist must include a non-empty NSMotionUsageDescription because ExpoLocation links CoreMotion APIs.', + ); + } + if (plist.includes('Expo Dev Launcher')) { const projectPath = path.join( projectRoot, From 4a5bd4e19a312cb387ad8554b7223b3f9eb1b1be Mon Sep 17 00:00:00 2001 From: manNomi Date: Sat, 15 Aug 2026 15:05:35 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EC=95=B1=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B0=80=EB=8F=85=EC=84=B1=EA=B3=BC=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=20=EC=BB=A4=EB=B2=84=20=ED=91=9C=EC=8B=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/auth/login.tsx | 2 +- src/api/homeApi.ts | 2 +- src/components/AppText.tsx | 16 ++++++++++--- src/components/EmptyState.tsx | 2 +- src/components/MiniPlayer.tsx | 4 ++-- src/components/dev/DevTestManager.tsx | 2 +- src/components/home/FeaturedPlaylistCard.tsx | 20 ++++++++++++++-- .../home/HomeSoundtrackBottomSheet.tsx | 2 +- src/components/home/MusicLogCard.tsx | 4 ++-- src/components/home/TravelModeHomeView.tsx | 14 +++++------ .../home/TravelModeSuggestionSheet.tsx | 2 +- src/components/library/LibraryScreen.tsx | 2 +- .../moment-capture/CameraCaptureView.tsx | 2 +- .../moment-capture/MomentPhotoCanvas.tsx | 24 +++++++++---------- .../moment-capture/MomentReviewPanel.tsx | 2 +- src/components/playlist/PlaylistHeroInfo.tsx | 2 +- .../playlist/PlaylistMusicFilter.tsx | 2 +- .../recap-share/RecapMusicSummary.tsx | 2 +- .../recap-share/RecapPreviewCard.tsx | 18 +++++++------- .../recap-share/RecapTemplateSelector.tsx | 2 +- .../recap-share/ShareActionList.tsx | 4 ++-- src/components/recap/RecapListCard.tsx | 2 +- src/components/travel/CommunityRecapCard.tsx | 2 +- .../travel/EndTravelConfirmModal.tsx | 2 +- src/components/travel/RecapCard.tsx | 2 +- src/components/travel/TravelStatusCard.tsx | 4 ++-- .../live-sound-map/LiveSoundMapSection.tsx | 2 +- .../travel/live-sound-map/SoundMapView.tsx | 6 ++--- .../travel/recap-map/RecapMapSection.tsx | 4 ++-- src/constants/colors.ts | 2 +- src/design-system/primitives.tsx | 4 ++-- src/types/domain.ts | 2 ++ tailwind.config.js | 2 +- 33 files changed, 96 insertions(+), 68 deletions(-) diff --git a/app/auth/login.tsx b/app/auth/login.tsx index 726175c..2135071 100644 --- a/app/auth/login.tsx +++ b/app/auth/login.tsx @@ -247,7 +247,7 @@ export default function LoginScreen() { }`} > {hasAcceptedRequiredTerms ? ( - + ) : null} diff --git a/src/api/homeApi.ts b/src/api/homeApi.ts index a9c20a7..e725c32 100644 --- a/src/api/homeApi.ts +++ b/src/api/homeApi.ts @@ -39,7 +39,7 @@ export const homeApi = { const playlists = await requestApi('/v1/home/featured-playlists', { query: { lat: params?.location?.lat, - limit: 10, + limit: 20, lng: params?.location?.lng, locationRecommendationEnabled: params?.locationRecommendationEnabled ?? false, placeId: params?.place?.id, diff --git a/src/components/AppText.tsx b/src/components/AppText.tsx index 9517b5a..b1c56e5 100644 --- a/src/components/AppText.tsx +++ b/src/components/AppText.tsx @@ -1,5 +1,15 @@ -import { Text, TextProps } from 'react-native'; +import { StyleSheet, Text, TextProps } from 'react-native'; -export function AppText({ className = '', ...props }: TextProps & { className?: string }) { - return ; +const textColorClassPattern = /(?:^|\s)text-(?:\[#|(?:black|white|transparent)(?:\/\d+)?(?:\s|$)|(?:amber|blue|cyan|emerald|fuchsia|gray|green|indigo|lime|neutral|orange|pink|purple|red|rose|sky|slate|stone|teal|violet|yellow|zinc)-\d+(?:\/\d+)?(?:\s|$)|soundlog-[\w-]+(?:\/\d+)?(?:\s|$))/; + +export function AppText({ + className = '', + style, + ...props +}: TextProps & { className?: string }) { + const hasExplicitColor = + textColorClassPattern.test(className) || Boolean(StyleSheet.flatten(style)?.color); + const resolvedClassName = hasExplicitColor ? className : `text-white ${className}`.trim(); + + return ; } diff --git a/src/components/EmptyState.tsx b/src/components/EmptyState.tsx index be674a6..3349183 100644 --- a/src/components/EmptyState.tsx +++ b/src/components/EmptyState.tsx @@ -22,7 +22,7 @@ export function EmptyState({ action, description, title }: EmptyStateProps) { ) : null} {action ? ( - {action.label} + {action.label} ) : null} diff --git a/src/components/MiniPlayer.tsx b/src/components/MiniPlayer.tsx index 51b3778..c6ba305 100644 --- a/src/components/MiniPlayer.tsx +++ b/src/components/MiniPlayer.tsx @@ -500,8 +500,8 @@ export function MiniPlayer() { className="h-12 flex-row items-center justify-center gap-2 rounded-full bg-white" onPress={handleCaptureMoment} > - - + + 이 곡으로 기록 diff --git a/src/components/dev/DevTestManager.tsx b/src/components/dev/DevTestManager.tsx index 769fc66..b6060a4 100644 --- a/src/components/dev/DevTestManager.tsx +++ b/src/components/dev/DevTestManager.tsx @@ -129,7 +129,7 @@ function ManagerButton({ : destructive ? 'rgba(248,113,113,0.28)' : 'rgba(255,255,255,0.12)'; - const color = active ? '#050916' : destructive ? '#fecaca' : 'rgba(255,255,255,0.78)'; + const color = active ? '#4A1D96' : destructive ? '#fecaca' : 'rgba(255,255,255,0.78)'; return ( onPress(playlist)} > - + {playlist.coverImageUrl ? ( + + ) : null} + diff --git a/src/components/home/HomeSoundtrackBottomSheet.tsx b/src/components/home/HomeSoundtrackBottomSheet.tsx index 34ef2af..7577a2a 100644 --- a/src/components/home/HomeSoundtrackBottomSheet.tsx +++ b/src/components/home/HomeSoundtrackBottomSheet.tsx @@ -309,7 +309,7 @@ export function HomeSoundtrackBottomSheet({ className="mt-4 min-h-11 items-center justify-center rounded-full bg-[#B7E628] px-6" onPress={onRetry} > - + 다시 시도 diff --git a/src/components/home/MusicLogCard.tsx b/src/components/home/MusicLogCard.tsx index 5dd77c8..2347a7d 100644 --- a/src/components/home/MusicLogCard.tsx +++ b/src/components/home/MusicLogCard.tsx @@ -69,13 +69,13 @@ export function MusicLogCard({ {item.placeName} {item.trackTitle} diff --git a/src/components/home/TravelModeHomeView.tsx b/src/components/home/TravelModeHomeView.tsx index 472002d..a6d1d26 100644 --- a/src/components/home/TravelModeHomeView.tsx +++ b/src/components/home/TravelModeHomeView.tsx @@ -309,8 +309,8 @@ function TravelStartPanel({ className="mt-5 h-[132px] w-[132px] self-center items-center justify-center rounded-full bg-soundlog-lime" onPress={onStartTravel} > - - + + 여행 시작 @@ -384,7 +384,7 @@ function ActiveRecommendationPanel({ - + 여행 기록 중 @@ -444,13 +444,13 @@ function ActiveRecommendationPanel({ onPress={needsLocation && !playlist ? onRefreshLocation : onOpenPlaylist} > {isOpeningPlaylist ? '여는 중' : needsLocation && !playlist ? '위치 잡기' : '곡 보기'} @@ -493,8 +493,8 @@ function ActiveRecommendationPanel({ className="h-11 flex-1 flex-row items-center justify-center gap-2 rounded-full bg-soundlog-warning" onPress={onEndTravel} > - - 여행 종료 + + 여행 종료 diff --git a/src/components/home/TravelModeSuggestionSheet.tsx b/src/components/home/TravelModeSuggestionSheet.tsx index 06fa72a..0030f73 100644 --- a/src/components/home/TravelModeSuggestionSheet.tsx +++ b/src/components/home/TravelModeSuggestionSheet.tsx @@ -54,7 +54,7 @@ export function TravelModeSuggestionSheet({ onPress={onStartTravelMode} style={{ backgroundColor: '#F5A451' }} > - + Travel Mode 시작 diff --git a/src/components/library/LibraryScreen.tsx b/src/components/library/LibraryScreen.tsx index d2d2a5d..a4cc914 100644 --- a/src/components/library/LibraryScreen.tsx +++ b/src/components/library/LibraryScreen.tsx @@ -278,7 +278,7 @@ export function LibraryScreen() { {tab.label} diff --git a/src/components/moment-capture/CameraCaptureView.tsx b/src/components/moment-capture/CameraCaptureView.tsx index 731c2e2..b1b88fe 100644 --- a/src/components/moment-capture/CameraCaptureView.tsx +++ b/src/components/moment-capture/CameraCaptureView.tsx @@ -80,7 +80,7 @@ export function CameraCaptureView({ style={{ opacity: controlsDisabled ? 0.7 : 1 }} > {isCapturing || isPickingPhoto ? ( - + ) : ( )} diff --git a/src/components/moment-capture/MomentPhotoCanvas.tsx b/src/components/moment-capture/MomentPhotoCanvas.tsx index dbf4a89..3fb47ea 100644 --- a/src/components/moment-capture/MomentPhotoCanvas.tsx +++ b/src/components/moment-capture/MomentPhotoCanvas.tsx @@ -517,7 +517,7 @@ export const MomentPhotoCanvas = forwardRef< {isMapTemplate ? ( - + @@ -651,7 +651,7 @@ function MapMusicPin({ track }: { track?: Track }) { { backgroundColor: track?.fallbackColor ?? '#B7E628' }, ]} > - + )} @@ -665,7 +665,7 @@ function MapMusicPin({ track }: { track?: Track }) { - + @@ -977,7 +977,7 @@ function StickerSegment({ {option.label} @@ -1065,12 +1065,12 @@ function getStickerThemeStyle(theme: StickerTheme) { backgroundColor: 'rgba(183,230,40,0.94)', borderColor: 'rgba(255,255,255,0.42)', }, - dateText: { color: 'rgba(5,9,22,0.72)' }, + dateText: { color: 'rgba(74,29,150,0.82)' }, divider: { backgroundColor: 'rgba(5,9,22,0.28)' }, iconBubble: { backgroundColor: 'rgba(5,9,22,0.13)' }, - iconColor: 'rgba(5,9,22,0.78)', - metaText: { color: 'rgba(5,9,22,0.66)' }, - timeText: { color: '#050916' }, + iconColor: 'rgba(74,29,150,0.9)', + metaText: { color: 'rgba(74,29,150,0.78)' }, + timeText: { color: '#4A1D96' }, }; } @@ -1080,12 +1080,12 @@ function getStickerThemeStyle(theme: StickerTheme) { backgroundColor: 'rgba(255,255,255,0.92)', borderColor: 'rgba(255,255,255,0.66)', }, - dateText: { color: 'rgba(5,9,22,0.6)' }, + dateText: { color: 'rgba(74,29,150,0.76)' }, divider: { backgroundColor: 'rgba(5,9,22,0.22)' }, iconBubble: { backgroundColor: 'rgba(5,9,22,0.08)' }, - iconColor: 'rgba(5,9,22,0.64)', - metaText: { color: 'rgba(5,9,22,0.5)' }, - timeText: { color: '#050916' }, + iconColor: 'rgba(74,29,150,0.82)', + metaText: { color: 'rgba(74,29,150,0.68)' }, + timeText: { color: '#4A1D96' }, }; } diff --git a/src/components/moment-capture/MomentReviewPanel.tsx b/src/components/moment-capture/MomentReviewPanel.tsx index 3535634..e801b27 100644 --- a/src/components/moment-capture/MomentReviewPanel.tsx +++ b/src/components/moment-capture/MomentReviewPanel.tsx @@ -343,7 +343,7 @@ export const MomentReviewPanel = forwardRef< style={{ opacity: isSaving ? 0.72 : 1 }} > {isSaving ? ( - + ) : ( 이 리캡 저장하기 diff --git a/src/components/playlist/PlaylistHeroInfo.tsx b/src/components/playlist/PlaylistHeroInfo.tsx index 3facf9c..caf5185 100644 --- a/src/components/playlist/PlaylistHeroInfo.tsx +++ b/src/components/playlist/PlaylistHeroInfo.tsx @@ -98,7 +98,7 @@ export function PlaylistHeroInfo({ onPress={onOpenFirstTrack} style={{ opacity: disabled ? 0.45 : 1 }} > - + diff --git a/src/components/playlist/PlaylistMusicFilter.tsx b/src/components/playlist/PlaylistMusicFilter.tsx index 1233860..a12bd85 100644 --- a/src/components/playlist/PlaylistMusicFilter.tsx +++ b/src/components/playlist/PlaylistMusicFilter.tsx @@ -48,7 +48,7 @@ export function PlaylistMusicFilter({ /> diff --git a/src/components/recap-share/RecapMusicSummary.tsx b/src/components/recap-share/RecapMusicSummary.tsx index 5f06ff6..0e0b34c 100644 --- a/src/components/recap-share/RecapMusicSummary.tsx +++ b/src/components/recap-share/RecapMusicSummary.tsx @@ -131,7 +131,7 @@ export function RecapMusicSummary({ className="h-10 w-10 items-center justify-center rounded-full bg-soundlog-lime" onPress={onOpenMap} > - + ) : null } diff --git a/src/components/recap-share/RecapPreviewCard.tsx b/src/components/recap-share/RecapPreviewCard.tsx index 0967027..79b70c7 100644 --- a/src/components/recap-share/RecapPreviewCard.tsx +++ b/src/components/recap-share/RecapPreviewCard.tsx @@ -535,7 +535,7 @@ function RecapMapTemplate({ recap }: { recap: RecapShare }) { style={pinPositions[index % pinPositions.length]} > - + {index + 1} @@ -620,10 +620,10 @@ function getRecapMusicStickerThemeStyle(theme: RecapMusicStickerTheme) { borderColor: 'rgba(255,255,255,0.42)', }, iconBubble: { backgroundColor: 'rgba(5,9,22,0.14)' }, - iconColor: '#050916', - metaText: { color: 'rgba(5,9,22,0.62)' }, - primaryText: { color: '#050916' }, - secondaryText: { color: 'rgba(5,9,22,0.68)' }, + iconColor: '#4A1D96', + metaText: { color: 'rgba(74,29,150,0.76)' }, + primaryText: { color: '#4A1D96' }, + secondaryText: { color: 'rgba(74,29,150,0.82)' }, }; } @@ -634,10 +634,10 @@ function getRecapMusicStickerThemeStyle(theme: RecapMusicStickerTheme) { borderColor: 'rgba(255,255,255,0.66)', }, iconBubble: { backgroundColor: 'rgba(5,9,22,0.08)' }, - iconColor: 'rgba(5,9,22,0.72)', - metaText: { color: 'rgba(5,9,22,0.52)' }, - primaryText: { color: '#050916' }, - secondaryText: { color: 'rgba(5,9,22,0.62)' }, + iconColor: 'rgba(74,29,150,0.84)', + metaText: { color: 'rgba(74,29,150,0.7)' }, + primaryText: { color: '#4A1D96' }, + secondaryText: { color: 'rgba(74,29,150,0.76)' }, }; } diff --git a/src/components/recap-share/RecapTemplateSelector.tsx b/src/components/recap-share/RecapTemplateSelector.tsx index 8434ce3..ce2255e 100644 --- a/src/components/recap-share/RecapTemplateSelector.tsx +++ b/src/components/recap-share/RecapTemplateSelector.tsx @@ -40,7 +40,7 @@ export function RecapTemplateSelector({ > {option.label} diff --git a/src/components/recap-share/ShareActionList.tsx b/src/components/recap-share/ShareActionList.tsx index a77008a..da36e3a 100644 --- a/src/components/recap-share/ShareActionList.tsx +++ b/src/components/recap-share/ShareActionList.tsx @@ -14,11 +14,11 @@ const actions: Array<{ { backgroundColor: '#B7E628', icon: 'download', - iconColor: '#050916', + iconColor: '#4A1D96', id: 'save', label: '이미지 저장', loadingLabel: '저장 중', - textColor: '#050916', + textColor: '#4A1D96', }, { backgroundColor: 'rgba(255,255,255,0.1)', diff --git a/src/components/recap/RecapListCard.tsx b/src/components/recap/RecapListCard.tsx index e59eed0..758fe0b 100644 --- a/src/components/recap/RecapListCard.tsx +++ b/src/components/recap/RecapListCard.tsx @@ -59,7 +59,7 @@ export function RecapListCard({ imageUrl, item, onPress }: RecapListCardProps) { - + diff --git a/src/components/travel/CommunityRecapCard.tsx b/src/components/travel/CommunityRecapCard.tsx index faff331..b08d966 100644 --- a/src/components/travel/CommunityRecapCard.tsx +++ b/src/components/travel/CommunityRecapCard.tsx @@ -860,7 +860,7 @@ export function CommunityRecapCard({ onPress={() => void handleCreateRoom()} style={{ opacity: !canUseRoom || isCreatingRoom ? 0.55 : 1 }} > - + {isCreatingRoom ? "여행방 생성 중" : "새 여행방 만들기"} diff --git a/src/components/travel/EndTravelConfirmModal.tsx b/src/components/travel/EndTravelConfirmModal.tsx index 700405d..359e511 100644 --- a/src/components/travel/EndTravelConfirmModal.tsx +++ b/src/components/travel/EndTravelConfirmModal.tsx @@ -28,7 +28,7 @@ export function EndTravelConfirmModal({ - + diff --git a/src/components/travel/RecapCard.tsx b/src/components/travel/RecapCard.tsx index c38c645..cac2fe1 100644 --- a/src/components/travel/RecapCard.tsx +++ b/src/components/travel/RecapCard.tsx @@ -55,7 +55,7 @@ export function RecapCard({ item, onPress }: RecapCardProps) { - + diff --git a/src/components/travel/TravelStatusCard.tsx b/src/components/travel/TravelStatusCard.tsx index 958b208..f884031 100644 --- a/src/components/travel/TravelStatusCard.tsx +++ b/src/components/travel/TravelStatusCard.tsx @@ -120,7 +120,7 @@ export function TravelStatusCard({ className="h-11 flex-1 items-center justify-center rounded-full bg-soundlog-warning" onPress={onEndTravel} > - 여행 종료 + 여행 종료 - + 여행을 시작해보세요 diff --git a/src/components/travel/live-sound-map/LiveSoundMapSection.tsx b/src/components/travel/live-sound-map/LiveSoundMapSection.tsx index 52910e2..fc4a152 100644 --- a/src/components/travel/live-sound-map/LiveSoundMapSection.tsx +++ b/src/components/travel/live-sound-map/LiveSoundMapSection.tsx @@ -728,7 +728,7 @@ export function LiveSoundMapSection({ - + diff --git a/src/components/travel/live-sound-map/SoundMapView.tsx b/src/components/travel/live-sound-map/SoundMapView.tsx index 910e6e6..fcbc1be 100644 --- a/src/components/travel/live-sound-map/SoundMapView.tsx +++ b/src/components/travel/live-sound-map/SoundMapView.tsx @@ -65,10 +65,10 @@ const markerPalette: Record< }, me: { background: '#B7E628', - border: '#090515', - icon: '#090515', + border: '#4A1D96', + icon: '#4A1D96', labelBackground: 'rgba(9,5,21,0.18)', - labelText: '#090515', + labelText: '#4A1D96', }, nearby: { background: '#2A1A15', diff --git a/src/components/travel/recap-map/RecapMapSection.tsx b/src/components/travel/recap-map/RecapMapSection.tsx index 846abba..b0845b2 100644 --- a/src/components/travel/recap-map/RecapMapSection.tsx +++ b/src/components/travel/recap-map/RecapMapSection.tsx @@ -511,7 +511,7 @@ export function RecapMapSection({ @@ -626,7 +626,7 @@ export function RecapMapSection({ diff --git a/src/constants/colors.ts b/src/constants/colors.ts index 194ef50..4cc6f77 100644 --- a/src/constants/colors.ts +++ b/src/constants/colors.ts @@ -40,6 +40,6 @@ export const colors = { primary: '#FFFFFF', secondary: '#ACACAC', muted: 'rgba(255,255,255,0.58)', - inverse: '#090515', + inverse: '#4A1D96', }, } as const; diff --git a/src/design-system/primitives.tsx b/src/design-system/primitives.tsx index 73a84ce..ee60d79 100644 --- a/src/design-system/primitives.tsx +++ b/src/design-system/primitives.tsx @@ -42,14 +42,14 @@ const buttonVariantClass: Record = { }; const buttonTextClass: Record = { - danger: 'text-black', + danger: 'text-soundlog-inverse', ghost: 'text-white', primary: 'text-soundlog-inverse', secondary: 'text-white', }; function getButtonIconColor(variant: SoundlogButtonVariant) { - return variant === 'primary' || variant === 'danger' ? '#090515' : '#FFFFFF'; + return variant === 'primary' || variant === 'danger' ? '#4A1D96' : '#FFFFFF'; } export function SoundlogButton({ diff --git a/src/types/domain.ts b/src/types/domain.ts index c1a83ad..8790f2b 100644 --- a/src/types/domain.ts +++ b/src/types/domain.ts @@ -61,6 +61,8 @@ export type Track = { }; export type FeaturedPlaylist = { + backgroundImageUrl?: string; + coverImageUrl?: string; id: string; regionName: string; description: string; diff --git a/tailwind.config.js b/tailwind.config.js index e4796c8..523bd69 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -21,7 +21,7 @@ module.exports = { lime: '#B7E628', player: '#45343D', warning: '#FF8A3D', - inverse: '#090515', + inverse: '#4A1D96', }, }, opacity: {