diff --git a/Projects/Feature/Home/Sources/Goal/AddGoalListView.swift b/Projects/Feature/Home/Sources/Goal/AddGoalListView.swift index 117ea967..05484ae2 100644 --- a/Projects/Feature/Home/Sources/Goal/AddGoalListView.swift +++ b/Projects/Feature/Home/Sources/Goal/AddGoalListView.swift @@ -26,9 +26,6 @@ struct AddGoalListView: View { headerView .padding(.horizontal, 20) categoryListView - .padding(.top, 20) - .padding(.horizontal, 20) - .padding(.bottom, 80) } .padding(.top, 28) } @@ -54,10 +51,15 @@ private extension AddGoalListView { } var categoryListView: some View { - VStack(spacing: 16) { - ForEach(items, id: \.self) { item in - categoryCardView(for: item) + ScrollView { + VStack(spacing: 16) { + ForEach(items, id: \.self) { item in + categoryCardView(for: item) + } } + .padding(.top, 20) + .padding(.bottom, 80) + .padding(.horizontal, 20) } } diff --git a/Projects/Feature/Home/Sources/Home/HomeReducer+Impl.swift b/Projects/Feature/Home/Sources/Home/HomeReducer+Impl.swift index 245f2633..3c28625e 100644 --- a/Projects/Feature/Home/Sources/Home/HomeReducer+Impl.swift +++ b/Projects/Feature/Home/Sources/Home/HomeReducer+Impl.swift @@ -218,10 +218,10 @@ extension HomeReducer { case let .myCardTapped(card): let verificationDate = TXCalendarUtil.apiDateString(for: state.calendarDate) return .send(.delegate(.goToGoalDetail(id: card.id, owner: .mySelf, verificationDate: verificationDate))) - + case let .headerTapped(card): return .send(.delegate(.goToStatsDetail(id: card.id))) - + case .floatingButtonTapped: state.isAddGoalPresented = true return .none @@ -267,24 +267,31 @@ extension HomeReducer { state.cards = items } return .none - + case .fetchGoalsFailed: state.isLoading = false return .send(.showToast(.warning(message: "목표 조회에 실패했어요"))) case let .setCalendarDate(date): - let now = state.nowDate - if date == state.calendarDate { - return .none - } + guard date != state.calendarDate else { return .none } + + let today = TXCalendarDate() + let calendar = Calendar(identifier: .gregorian) + state.calendarDate = date state.calendarMonthTitle = "\(date.month)월 \(date.year)" state.calendarWeeks = TXCalendarDataGenerator.generateWeekData(for: date) - state.isRefreshHidden = ( - date.year == now.year && - date.month == now.month && - date.day == now.day - ) + + if let selectedDate = date.date, + let todayDate = today.date { + let isThisWeek = calendar.isDate( + selectedDate, + equalTo: todayDate, + toGranularity: .weekOfYear + ) + state.isRefreshHidden = isThisWeek + } + state.isLoading = true return .send(.fetchGoals) diff --git a/Projects/Feature/Home/Sources/Home/HomeView.swift b/Projects/Feature/Home/Sources/Home/HomeView.swift index 4462dcd8..3e841de3 100644 --- a/Projects/Feature/Home/Sources/Home/HomeView.swift +++ b/Projects/Feature/Home/Sources/Home/HomeView.swift @@ -49,15 +49,23 @@ public struct HomeView: View { headerRow .padding(.horizontal, 20) .padding(.top, 16) - goalEmptyView } - Spacer() } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .overlay { if store.isLoading { ProgressView() .frame(maxWidth: .infinity, maxHeight: .infinity) } + + if !store.hasCards { + goalEmptyView + } + } + .overlay(alignment: .bottomTrailing) { + if !store.hasCards { + emptyArrow + } } .onAppear { store.send(.onAppear) @@ -106,7 +114,6 @@ public struct HomeView: View { isPresented: $store.isCameraPermissionAlertPresented, onDismiss: { store.send(.cameraPermissionAlertDismissed) } ) - .frame(alignment: .center) .toolbar(.hidden, for: .navigationBar) } } @@ -132,6 +139,9 @@ private extension HomeView { TXCalendar( mode: .weekly, weeks: store.calendarWeeks, + config: .init( + dateStyle: .init(lastDateTextColor: Color.Gray.gray500) + ), onSelect: { item in store.send(.calendarDateSelected(item)) }, @@ -212,25 +222,28 @@ private extension HomeView { } var goalEmptyView: some View { - GeometryReader { geometry in - VStack(alignment: .center, spacing: 0) { - Image.Illustration.emptyPoke - - Text("첫 목표를 세워볼까요?") - .typography(.t2_16b) - .foregroundStyle(Color.Gray.gray400) - - Text("+ 버튼을 눌러 목표를 추가해보세요") - .typography(.c1_12r) - .foregroundStyle(Color.Gray.gray300) - .padding(.top, 5) - } - .frame(width: geometry.size.width, height: geometry.size.height) - .overlay(alignment: .bottomTrailing) { - Image.Illustration.arrow - .padding(.bottom, 63) - .padding(.trailing, 86) - } + VStack(spacing: 0) { + Image.Illustration.emptyPoke + .frame(height: 116) + + Text("첫 목표를 세워볼까요?") + .typography(.t2_16b) + .foregroundStyle(Color.Gray.gray400) + .padding(.top, 16) + + Text("+ 버튼을 눌러 목표를 추가해보세요") + .typography(.c1_12r) + .foregroundStyle(Color.Gray.gray300) + .padding(.top, 4) } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .ignoresSafeArea() + } + + var emptyArrow: some View { + Image.Illustration.arrow + .padding(.bottom, 71) + .padding(.trailing, 86) + .ignoresSafeArea() } } diff --git a/Projects/Feature/MainTab/Sources/View/MainTabView.swift b/Projects/Feature/MainTab/Sources/View/MainTabView.swift index 97791066..3d352a96 100644 --- a/Projects/Feature/MainTab/Sources/View/MainTabView.swift +++ b/Projects/Feature/MainTab/Sources/View/MainTabView.swift @@ -74,7 +74,7 @@ private extension MainTabView { TXCircleButton(config: .plus()) { store.send(.home(.home(.floatingButtonTapped))) } - .insideBorder( + .outsideBorder( Color.Gray.gray300, shape: .circle, lineWidth: LineWidth.m diff --git a/Projects/Feature/MakeGoal/Sources/MakeGoalView.swift b/Projects/Feature/MakeGoal/Sources/MakeGoalView.swift index 219c3965..93fe2afc 100644 --- a/Projects/Feature/MakeGoal/Sources/MakeGoalView.swift +++ b/Projects/Feature/MakeGoal/Sources/MakeGoalView.swift @@ -273,7 +273,7 @@ private extension MakeGoalView { .padding(.vertical, 8) } .padding(.top, 36) - .padding(.bottom, TXSafeArea.inset(.bottom) + 16) + .padding(.bottom, 16) } var periodTabButtons: some View { diff --git a/Projects/Feature/Onboarding/Sources/Connect/OnboardingConnectView.swift b/Projects/Feature/Onboarding/Sources/Connect/OnboardingConnectView.swift index aa73b3b1..6cc31234 100644 --- a/Projects/Feature/Onboarding/Sources/Connect/OnboardingConnectView.swift +++ b/Projects/Feature/Onboarding/Sources/Connect/OnboardingConnectView.swift @@ -242,7 +242,7 @@ private extension OnboardingConnectView { .padding(.horizontal, 30) } .padding(.top, 28) - .padding(.bottom, TXSafeArea.inset(.bottom) + Spacing.spacing7) + .padding(.bottom, Spacing.spacing7) } func bulletItem(_ text: String) -> some View { diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/doubt.imageset/doubt.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/doubt.imageset/doubt.svg index 5c5744cc..3217fb89 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/doubt.imageset/doubt.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/doubt.imageset/doubt.svg @@ -1,26 +1,17 @@ - - - - + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/fuck.imageset/fuck.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/fuck.imageset/fuck.svg index 3a73026d..c4e104a7 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/fuck.imageset/fuck.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/fuck.imageset/fuck.svg @@ -1,29 +1,29 @@ - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/happy.imageset/happy.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/happy.imageset/happy.svg index 87105ec8..d8b95744 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/happy.imageset/happy.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/happy.imageset/happy.svg @@ -1,21 +1,22 @@ - - - + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_clean.imageset/icon_clean.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_clean.imageset/icon_clean.svg index 5b0a8edb..6c5abe8a 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_clean.imageset/icon_clean.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_clean.imageset/icon_clean.svg @@ -1,22 +1,22 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_default.imageset/icon_default.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_default.imageset/icon_default.svg index 9729ddc7..2889eea5 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_default.imageset/icon_default.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_default.imageset/icon_default.svg @@ -1,13 +1,16 @@ - - - - + + + + - - - + + + - + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_health.imageset/icon_health.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_health.imageset/icon_health.svg index 51c01dd4..df7cef31 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_health.imageset/icon_health.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_health.imageset/icon_health.svg @@ -11,7 +11,7 @@ - + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heart_double.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heartDouble.imageset/Contents.json similarity index 100% rename from Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heart_double.imageset/Contents.json rename to Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heartDouble.imageset/Contents.json diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heartDouble.imageset/icon_heart.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heartDouble.imageset/icon_heart.svg new file mode 100644 index 00000000..5f352dea --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heartDouble.imageset/icon_heart.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heart_double.imageset/icon_heart.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heart_double.imageset/icon_heart.svg deleted file mode 100644 index 69bd7053..00000000 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_heart_double.imageset/icon_heart.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_laptop.imageset/icon_laptop.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_laptop.imageset/icon_laptop.svg index 7c6fcdca..bcc946c8 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_laptop.imageset/icon_laptop.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_laptop.imageset/icon_laptop.svg @@ -1,25 +1,25 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_pencil.imageset/icon_pencil.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_pencil.imageset/icon_pencil.svg index 09de3d25..57a92958 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_pencil.imageset/icon_pencil.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/icon_pencil.imageset/icon_pencil.svg @@ -1,17 +1,17 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/love.imageset/love.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/love.imageset/love.svg index 80cf5160..07d03b93 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/love.imageset/love.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/love.imageset/love.svg @@ -1,20 +1,23 @@ - - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/trouble.imageset/trouble.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/trouble.imageset/trouble.svg index d17e6e6a..9ac07bf9 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/trouble.imageset/trouble.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Illustration/trouble.imageset/trouble.svg @@ -1,34 +1,32 @@ - - - - + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/Contents.json index fbc96130..009a07cc 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "selected=none-1.svg", + "filename" : "ic_statistics.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/ic_statistics.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/ic_statistics.svg new file mode 100644 index 00000000..71286bac --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/ic_statistics.svg @@ -0,0 +1,3 @@ + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/selected=none-1.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/selected=none-1.svg deleted file mode 100644 index 7e760dc2..00000000 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-1.imageset/selected=none-1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/Contents.json index 58dcaff5..c5c93503 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "selected=none-2.svg", + "filename" : "ic_couple.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/selected=none-2.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/ic_couple.svg similarity index 100% rename from Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/selected=none-2.svg rename to Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none-2.imageset/ic_couple.svg diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/Contents.json index ab7057a0..c381355f 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "selected=none.svg", + "filename" : "ic_home.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/selected=none.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/ic_home.svg similarity index 100% rename from Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/selected=none.svg rename to Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=none.imageset/ic_home.svg diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/Contents.json index 476256a7..e6b83579 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "selected=selected-1.svg", + "filename" : "ic_statistics_selected.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/ic_statistics_selected.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/ic_statistics_selected.svg new file mode 100644 index 00000000..a4604210 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/ic_statistics_selected.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/selected=selected-1.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/selected=selected-1.svg deleted file mode 100644 index 3d1d521c..00000000 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-1.imageset/selected=selected-1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/Contents.json index 75275725..3242fbbe 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "selected=selected-2.svg", + "filename" : "ic_couple_selected.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/selected=selected-2.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/ic_couple_selected.svg similarity index 100% rename from Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/selected=selected-2.svg rename to Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected-2.imageset/ic_couple_selected.svg diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/Contents.json index ce6a7a2b..de01255b 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "selected=selected.svg", + "filename" : "ic_home_selected.svg", "idiom" : "universal" } ], diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/selected=selected.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/ic_home_selected.svg similarity index 100% rename from Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/selected=selected.svg rename to Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Icons/Symbol/selected=selected.imageset/ic_home_selected.svg diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_empty_poke.imageset/illust_empty_poke.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_empty_poke.imageset/illust_empty_poke.svg index 8d61679c..633c98ba 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_empty_poke.imageset/illust_empty_poke.svg +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_empty_poke.imageset/illust_empty_poke.svg @@ -1,39 +1,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/Contents.json index e45f5fcc..ef060d80 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/Contents.json @@ -1,23 +1,15 @@ { "images" : [ { - "filename" : "illust_keepiluv.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "illust_keepiluv@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "illust_keepiluv@3x.png", - "idiom" : "universal", - "scale" : "3x" + "filename" : "illust_keepiluv.svg", + "idiom" : "universal" } ], "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true } } diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv.png deleted file mode 100644 index de21c2be..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv.svg new file mode 100644 index 00000000..b6dfa47b --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv@2x.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv@2x.png deleted file mode 100644 index c21926cd..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv@2x.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv@3x.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv@3x.png deleted file mode 100644 index 845ea58d..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_keepiluv.imageset/illust_keepiluv@3x.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/Contents.json index dc44bdac..095075cd 100644 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/Contents.json +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/Contents.json @@ -1,23 +1,15 @@ { "images" : [ { - "filename" : "illust_poke.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "illust_poke@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "illust_poke@3x.png", - "idiom" : "universal", - "scale" : "3x" + "filename" : "illust_poke.svg", + "idiom" : "universal" } ], "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true } } diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke.png deleted file mode 100644 index 2d51088f..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke.svg new file mode 100644 index 00000000..a284a33b --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke@2x.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke@2x.png deleted file mode 100644 index 3a559807..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke@2x.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke@3x.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke@3x.png deleted file mode 100644 index 37572359..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/illust_poke.imageset/illust_poke@3x.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/logo.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/logo.imageset/Contents.json new file mode 100644 index 00000000..151248e9 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/logo.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "logo.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/logo.imageset/logo.svg b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/logo.imageset/logo.svg new file mode 100644 index 00000000..d0fb4522 --- /dev/null +++ b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/Illustration/logo.imageset/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/Contents.json b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index b54d4d9a..00000000 --- a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "logo.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "logo@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "logo@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo.png deleted file mode 100644 index 6d502cf1..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo@2x.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo@2x.png deleted file mode 100644 index 8946e20c..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo@2x.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo@3x.png b/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo@3x.png deleted file mode 100644 index 189247ac..00000000 Binary files a/Projects/Shared/DesignSystem/Resources/Image/ImageAssets.xcassets/logo.imageset/logo@3x.png and /dev/null differ diff --git a/Projects/Shared/DesignSystem/Sources/Components/Bar/Navigation/TXNavigationBar.swift b/Projects/Shared/DesignSystem/Sources/Components/Bar/Navigation/TXNavigationBar.swift index c624f122..042ce19e 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Bar/Navigation/TXNavigationBar.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Bar/Navigation/TXNavigationBar.swift @@ -206,9 +206,10 @@ private extension TXNavigationBar { homeActionButtons(isRemained: homeStyle.isRemainedAlarm) } + .offset(y: -1) } .padding(style.horizontalPadding) - .padding(.vertical, 7) + .offset(y: -3) } func subTitleRow(subTitle: String) -> some View { @@ -231,7 +232,7 @@ private extension TXNavigationBar { } func mainTitleRow(_ homeStyle: Style.Home) -> some View { - HStack(spacing: 4) { + HStack(alignment: .top, spacing: 4) { Image.Illustration.logo if !homeStyle.isHiddenRefresh { @@ -244,12 +245,11 @@ private extension TXNavigationBar { .frame(width: 24, height: 24) .foregroundStyle(Color.Gray.gray300) } - .padding(.top, 2) .buttonStyle(.plain) + .padding(.top, 2) } } - .padding(.bottom, 1) - .frame(height: 27) + .frame(height: 27, alignment: .top) } func homeActionButtons(isRemained: Bool) -> some View { @@ -451,3 +451,456 @@ private extension TXNavigationBar { print(action) } } + +//// +//// TXNavigationBar.swift +//// SharedDesignSystem +//// +//// Created by 정지용 on 1/21/26. +//// +// +//import SwiftUI +// +///// 상단 앱바 컴포넌트입니다. +///// +///// ## 사용 예시 +///// ```swift +///// // mainTitle 스타일 +///// TXNavigationBar(style: .mainTitle(title: "스탬프 통계")) +///// +///// // home 스타일 +///// TXNavigationBar(style: .home(.init(subTitle: "1월 2026", mainTitle: "오늘 우리 목표", isHiddenRefresh: false, isRemainedAlarm: true))) { action in +///// switch action { +///// case .subTitleTapped: +///// // 날짜 선택 +///// case .refreshTapped: +///// // 새로고침 +///// case .alertTapped: +///// // 알림 +///// case .settingTapped: +///// // 설정 +///// default: +///// break +///// } +///// } +///// +///// // subTitle 스타일 (back) +///// TXNavigationBar(style: .subTitle(title: "설정", type: .back)) { action in +///// if action == .backTapped { +///// // 뒤로가기 +///// } +///// } +///// +///// // subTitle 스타일 (close) +///// TXNavigationBar(style: .subTitle(title: "알림", type: .close)) { action in +///// if action == .closeTapped { +///// // 닫기 +///// } +///// } +///// +///// // iconOnly 스타일 +///// TXNavigationBar(style: .iconOnly(.back)) { action in +///// if action == .backTapped { +///// // 뒤로가기 +///// } +///// } +///// ``` +//public struct TXNavigationBar: View { +// private let style: Style +// private let onAction: ((Action) -> Void)? +// +// /// NavigationBar를 생성합니다. +// /// +// /// ## 사용 예시 +// /// ```swift +// /// TXNavigationBar(style: .mainTitle(title: "스탬프 통계")) +// /// ``` +// public init( +// style: Style, +// onAction: ((Action) -> Void)? = nil +// ) { +// self.style = style +// self.onAction = onAction +// } +// +// public var body: some View { +// Group { +// switch style { +// case let .mainTitle(title): +// mainTitleContent(title: title) +// +// case let .subContent(content): +// subContent(content) +// +// case let .home(homeStyle): +// homeContent(homeStyle) +// +// case let .subTitle(title, type): +// subTitleContent(title: title, type: type) +// +// case .iconOnly(let iconStyle): +// iconOnlyContent(iconStyle: iconStyle) +// +// case .noTitle: +// Spacer() +// } +// } +// .frame(height: style.height) +// .background(style.backgroundColor) +// } +//} +// +//// MARK: - MainTitle Style +//private extension TXNavigationBar { +// func mainTitleContent(title: String) -> some View { +// HStack { +// Text(title) +// .typography(style.titleFont) +// .foregroundStyle(style.foregroundColor) +// +// Spacer() +// } +// .padding(style.horizontalPadding) +// } +// +// @ViewBuilder +// func subContent(_ subContent: Style.SubContent) -> some View { +// VStack(spacing: 0) { +// HStack(spacing: 0) { +// TXRectangleButton( +// config: .blankLeftBack(), +// action: { onAction?(.backTapped) } +// ) +// +// Spacer() +// +// Text(subContent.title) +// .typography(style.titleFont) +// .foregroundStyle(style.foregroundColor) +// +// Spacer() +// +// subContentRightArea(subContent.rightContent, backgroundColor: subContent.backgroundColor) +// } +// .frame(height: 60) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom], +// color: style.borderColor +// ) +// } +// .padding(.vertical, 20) +// } +// +// @ViewBuilder +// func subContentRightArea( +// _ content: Style.SubContent.RightContent?, +// backgroundColor: Color +// ) -> some View { +// if let content { +// Button { +// onAction?(.rightTapped) +// } label: { +// rightContentView(content) +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom, .leading], +// color: style.borderColor +// ) +// } +// .buttonStyle(.plain) +// } else { +// backgroundColor +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom, .leading], +// color: style.borderColor +// ) +// } +// } +// +// @ViewBuilder +// func rightContentView(_ content: Style.SubContent.RightContent) -> some View { +// switch content { +// case let .text(text): +// Text(text) +// .typography(.t2_16b) +// .foregroundStyle(style.foregroundColor) +// +// case let .image(image): +// image +// .resizable() +// .renderingMode(.template) +// .frame(width: style.iconSize.width, height: style.iconSize.height) +// .foregroundStyle(style.iconForegroundColor) +// +// case let .rotatedImage(image, angle): +// image +// .resizable() +// .renderingMode(.template) +// .rotationEffect(angle) +// .frame(width: style.iconSize.width, height: style.iconSize.height) +// .foregroundStyle(style.iconForegroundColor) +// } +// } +//} +// +//// MARK: - Home Style +//private extension TXNavigationBar { +// func homeContent(_ homeStyle: Style.Home) -> some View { +// VStack(alignment: .leading, spacing: 0) { +// subTitleRow(subTitle: homeStyle.subTitle) +// +// HStack(spacing: 0) { +// mainTitleRow(homeStyle) +// +// Spacer() +// +// homeActionButtons(isRemained: homeStyle.isRemainedAlarm) +// } +// .offset(y: -1) +// } +// .padding(style.horizontalPadding) +// .offset(y: -2) +// } +// +// func subTitleRow(subTitle: String) -> some View { +// Button { +// onAction?(.subTitleTapped) +// } label: { +// HStack(spacing: 0) { +// Text(subTitle) +// .typography(style.subTitleFont) +// .foregroundStyle(style.subTitleForegroundColor) +// +// Image.Icon.Symbol.arrow4 +// .resizable() +// .renderingMode(.template) +// .frame(width: 20, height: 20) +// .foregroundStyle(style.subTitleForegroundColor) +// } +// } +// .buttonStyle(.plain) +// } +// +// func mainTitleRow(_ homeStyle: Style.Home) -> some View { +// HStack(spacing: 4) { +// Image.Illustration.logo +// +// if !homeStyle.isHiddenRefresh { +// Button { +// onAction?(.refreshTapped) +// } label: { +// Image.Icon.Symbol.icReturn +// .resizable() +// .renderingMode(.template) +// .frame(width: 24, height: 24) +// .foregroundStyle(Color.Gray.gray300) +// } +// .buttonStyle(.plain) +// } +// } +// .offset(y: -1) +// } +// +// func homeActionButtons(isRemained: Bool) -> some View { +// HStack(spacing: 0) { +// Button { +// onAction?(.alertTapped) +// } label: { +// alertImage(isRemained: isRemained) +// .resizable() +// .renderingMode(.template) +// .frame(width: style.iconSize.width, height: style.iconSize.height) +// .foregroundStyle(style.iconForegroundColor) +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// } +// .buttonStyle(.plain) +// +// Button { +// onAction?(.settingTapped) +// } label: { +// Image.Icon.Symbol.setting +// .resizable() +// .renderingMode(.template) +// .frame(width: style.iconSize.width, height: style.iconSize.height) +// .foregroundStyle(style.iconForegroundColor) +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// } +// .buttonStyle(.plain) +// } +// } +// +// func alertImage(isRemained: Bool) -> Image { +// return isRemained ? Image.Icon.Symbol.alertRemained : Image.Icon.Symbol.alert +// } +//} +// +//// MARK: - SubTitle Style +//private extension TXNavigationBar { +// func subTitleContent(title: String, type: SubTitleType) -> some View { +// VStack(spacing: 0) { +// HStack(spacing: 0) { +// // 왼쪽 영역 +// subTitleLeftArea(type: type) +// +// Spacer() +// +// Text(title) +// .typography(style.titleFont) +// .foregroundStyle(style.foregroundColor) +// +// Spacer() +// +// // 오른쪽 영역 +// subTitleRightArea(type: type) +// } +// .frame(height: 60) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom], +// color: style.borderColor +// ) +// } +// .padding(.vertical, 20) +// } +// +// @ViewBuilder +// func subTitleLeftArea(type: SubTitleType) -> some View { +// switch type { +// case .back: +// TXRectangleButton( +// config: .blankLeftBack(), +// action: { onAction?(.backTapped) } +// ) +// case .close: +// Color.Common.white +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom, .trailing], +// color: style.borderColor +// ) +// } +// } +// +// @ViewBuilder +// func subTitleRightArea(type: SubTitleType) -> some View { +// switch type { +// case .back: +// Color.Common.white +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom, .leading], +// color: style.borderColor +// ) +// case .close: +// Button { +// onAction?(.closeTapped) +// } label: { +// Image.Icon.Symbol.closeM +// .resizable() +// .renderingMode(.template) +// .frame(width: style.iconSize.width, height: style.iconSize.height) +// .foregroundStyle(style.iconForegroundColor) +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// .insideRectEdgeBorder( +// width: style.borderWidth, +// edges: [.top, .bottom, .leading], +// color: style.borderColor +// ) +// } +// .buttonStyle(.plain) +// } +// } +//} +// +//// MARK: - IconOnly Style +//private extension TXNavigationBar { +// func iconOnlyContent(iconStyle: IconStyle) -> some View { +// HStack { +// switch iconStyle { +// case .back: +// Button { +// onAction?(.backTapped) +// } label: { +// iconImage(.Icon.Symbol.arrow1LLeft) +// } +// .buttonStyle(.plain) +// +// Spacer() +// +// case .close: +// Spacer() +// +// Button { +// onAction?(.closeTapped) +// } label: { +// iconImage(.Icon.Symbol.closeM) +// } +// .buttonStyle(.plain) +// } +// } +// .padding(style.horizontalPadding) +// } +// +// @ViewBuilder +// func iconImage(_ image: Image) -> some View { +// image +// .resizable() +// .renderingMode(.template) +// .frame(width: style.iconSize.width, height: style.iconSize.height) +// .foregroundStyle(style.foregroundColor) +// .frame(width: style.actionButtonSize.width, height: style.actionButtonSize.height) +// } +//} +// +//#Preview("MainTitle") { +// TXNavigationBar(style: .mainTitle(title: "스탬프 통계")) +//} +// +//#Preview("subContent - Image") { +// TXNavigationBar( +// style: .subContent( +// .init( +// title: "스탬프 통계", +// rightContent: .image(.Icon.Symbol.meatball) +// ) +// ) +// ) +//} +// +//#Preview("Home") { +// TXNavigationBar( +// style: .home(.init(subTitle: "1월 2026", mainTitle: "오늘 우리 목표", isHiddenRefresh: false, isRemainedAlarm: false)) +// ) { action in +// print(action) +// } +//} +// +//#Preview("SubTitle - Back") { +// TXNavigationBar(style: .subTitle(title: "설정", type: .back)) { action in +// print(action) +// } +//} +// +//#Preview("SubTitle - Close") { +// TXNavigationBar(style: .subTitle(title: "알림", type: .close)) { action in +// print(action) +// } +//} +// +//#Preview("IconOnly - Back") { +// TXNavigationBar(style: .iconOnly(.back)) { action in +// print(action) +// } +//} +// +//#Preview("IconOnly - Close") { +// TXNavigationBar(style: .iconOnly(.close)) { action in +// print(action) +// } +//} diff --git a/Projects/Shared/DesignSystem/Sources/Components/Bar/TabBar/TXTabBar.swift b/Projects/Shared/DesignSystem/Sources/Components/Bar/TabBar/TXTabBar.swift index 1947ba78..eab4e17b 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Bar/TabBar/TXTabBar.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Bar/TabBar/TXTabBar.swift @@ -49,7 +49,7 @@ private extension TXTabBar { .typography(Constants.labelFont) .foregroundStyle(Constants.labelColor) } - .frame(maxWidth: .infinity) + .frame(maxWidth: .infinity, alignment: .top) .padding(.top, Constants.topPadding) } .buttonStyle(.plain) diff --git a/Projects/Shared/DesignSystem/Sources/Components/Calendar/BottomSheet/TXCalendarBottomSheet.swift b/Projects/Shared/DesignSystem/Sources/Components/Calendar/BottomSheet/TXCalendarBottomSheet.swift index e2c38007..cb32f2a9 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Calendar/BottomSheet/TXCalendarBottomSheet.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Calendar/BottomSheet/TXCalendarBottomSheet.swift @@ -111,7 +111,6 @@ public struct TXCalendarBottomSheet: View { // 버튼 영역 buttonArea - .padding(.bottom, Spacing.spacing5) } .frame(maxWidth: .infinity) .background(Color.Common.white) @@ -162,7 +161,7 @@ public struct DefaultCalendarButton: View { action: action ) .padding(.horizontal, Spacing.spacing8) - .padding(.vertical, Spacing.spacing4) + .padding(.vertical, Spacing.spacing5) } } @@ -178,14 +177,15 @@ private extension TXCalendarBottomSheet { func calendarContentHeight(for weeks: [[TXCalendarDateItem]]) -> CGFloat { let headerHeight = TXCalendarLayout.weekdayLabelHeight(calendarConfig.weekdayTypography) let headerSectionHeight = headerHeight + calendarConfig.monthlyHeaderSpacing + let verticalPadding = calendarConfig.verticalPadding * 2 - guard !weeks.isEmpty else { return headerSectionHeight } + guard !weeks.isEmpty else { return headerSectionHeight + verticalPadding } let rowCount = CGFloat(weeks.count) let rowSpacing = calendarConfig.monthlyRowSpacing * CGFloat(weeks.count - 1) let monthGridHeight = (calendarConfig.dateStyle.size * rowCount) + rowSpacing - return headerSectionHeight + monthGridHeight + return headerSectionHeight + monthGridHeight + verticalPadding } @ViewBuilder diff --git a/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift b/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift index a9277368..28c1f1ad 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendar.swift @@ -35,6 +35,7 @@ public struct TXCalendar: View { public struct Configuration { let weeklyHorizontalPadding: CGFloat let monthlyHorizontalPadding: CGFloat + let verticalPadding: CGFloat let weeklyHeaderSpacing: CGFloat let weeklyBottomPadding: CGFloat let monthlyHeaderSpacing: CGFloat @@ -49,6 +50,7 @@ public struct TXCalendar: View { public init( weeklyHorizontalPadding: CGFloat = Spacing.spacing6, monthlyHorizontalPadding: CGFloat = Spacing.spacing7, + verticalPadding: CGFloat = Spacing.spacing3, weeklyHeaderSpacing: CGFloat = Spacing.spacing4, weeklyBottomPadding: CGFloat = Spacing.spacing5, monthlyHeaderSpacing: CGFloat = Spacing.spacing8, @@ -61,6 +63,7 @@ public struct TXCalendar: View { ) { self.weeklyHorizontalPadding = weeklyHorizontalPadding self.monthlyHorizontalPadding = monthlyHorizontalPadding + self.verticalPadding = verticalPadding self.weeklyHeaderSpacing = weeklyHeaderSpacing self.weeklyBottomPadding = weeklyBottomPadding self.monthlyHeaderSpacing = monthlyHeaderSpacing @@ -144,6 +147,7 @@ public struct TXCalendar: View { weekdayRow(spacing: spacing) dateContent(spacing: spacing) } + .padding(.vertical, config.verticalPadding) .padding(.horizontal, horizontalPadding) .frame(width: proxy.size.width, height: contentHeight, alignment: .top) .background(config.backgroundColor) @@ -276,10 +280,11 @@ private extension TXCalendar { var contentHeight: CGFloat { let headerHeight = TXCalendarLayout.weekdayLabelHeight(config.weekdayTypography) let headerSectionHeight = headerHeight + headerSpacing + let verticalPadding: CGFloat = config.verticalPadding * 2 switch mode { - case .weekly: return headerSectionHeight + config.dateStyle.size + config.weeklyBottomPadding - case .monthly: return headerSectionHeight + monthGridHeight + case .weekly: return headerSectionHeight + config.dateStyle.size + config.weeklyBottomPadding + verticalPadding + case .monthly: return headerSectionHeight + monthGridHeight + verticalPadding } } diff --git a/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendarDateCell.swift b/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendarDateCell.swift index 0d767d41..53d6fef7 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendarDateCell.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Calendar/Core/TXCalendarDateCell.swift @@ -46,9 +46,7 @@ private extension TXCalendarDateCell { case .selectedLine: shape .fill(style.selectedLineBackgroundColor) - .overlay { - shape.stroke(style.selectedLineBorderColor, lineWidth: style.borderWidth) - } + .insideBorder(style.selectedLineBorderColor, shape: .circle, lineWidth: style.borderWidth) case .completed: customBackground diff --git a/Projects/Shared/DesignSystem/Sources/Components/Calendar/Navigation/TXCalendarMonthNavigation.swift b/Projects/Shared/DesignSystem/Sources/Components/Calendar/Navigation/TXCalendarMonthNavigation.swift index 5e96104c..d3f8528e 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Calendar/Navigation/TXCalendarMonthNavigation.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Calendar/Navigation/TXCalendarMonthNavigation.swift @@ -94,6 +94,7 @@ public struct TXCalendarMonthNavigation: View { .padding(.horizontal, config.horizontalPadding) .frame(maxWidth: .infinity) .frame(height: config.height) + .transaction { $0.disablesAnimations = true } } } diff --git a/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView+Configuration.swift b/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView+Configuration.swift index c12177ac..0d9960c7 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView+Configuration.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView+Configuration.swift @@ -61,10 +61,10 @@ extension GoalCardView.Configuration { contentBackgroundColor: Color.Gray.gray50, borderColor: Color.Gray.gray500, borderWidth: LineWidth.m, - cornerRadius: 16, + cornerRadius: Radius.s, imageHeight: 136, - emojiSize: CGSize(width: 32, height: 32), - emojiPadding: Spacing.spacing4 + emojiSize: CGSize(width: 40, height: 40), + emojiPadding: Spacing.spacing3 ) } } diff --git a/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView.swift b/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView.swift index ce8fadf5..833cd092 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Card/Goal/GoalCardView.swift @@ -111,9 +111,6 @@ public struct GoalCardView: View { CardHeaderView(config: config.headerConfig) if config.showsContent { - config.borderColor - .frame(height: config.borderWidth) - .frame(maxWidth: .infinity) HStack(spacing: 0) { myContent @@ -207,19 +204,18 @@ private extension GoalCardView { ) -> some View { VStack(spacing: 0) { placeholder.image - .resizable() - .frame(width: 84, height: 80) - .padding(.top, 5) if placeholder.isButton { pokeButton(text: placeholder.text, action: buttonAction) + .padding(.bottom, 14) } else { Text(placeholder.text) .typography(.b4_12b) .foregroundStyle(Color.Gray.gray500) + .padding(.bottom, 10) } } - .padding(.bottom, 14) + .frame(maxHeight: .infinity) } func pokeButton(text: String, action: (() -> Void)?) -> some View { diff --git a/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView+Configuration.swift b/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView+Configuration.swift index eb29ad6d..0e6cacd9 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView+Configuration.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView+Configuration.swift @@ -34,6 +34,7 @@ extension CardHeaderView { let iconImage: Image let content: Content var isBordered: Bool + let insideBorderEdges: [Edge] let padding: CGFloat let contentSpacing: CGFloat let radius: CGFloat @@ -47,6 +48,7 @@ extension CardHeaderView { iconImage: Image, content: Content, isBordered: Bool, + insideBorderEdges: [Edge] = [], padding: CGFloat, contentSpacing: CGFloat, radius: CGFloat, @@ -59,6 +61,7 @@ extension CardHeaderView { self.iconImage = iconImage self.content = content self.isBordered = isBordered + self.insideBorderEdges = insideBorderEdges self.padding = padding self.contentSpacing = contentSpacing self.radius = radius @@ -97,6 +100,7 @@ extension CardHeaderView.Configuration { isCoupleChecked: isCoupleChecked, action: action, isBordered: false, + insideBorderEdges: [.bottom], onHeaderTapped: onHeaderTapped ) } @@ -228,6 +232,7 @@ extension CardHeaderView.Configuration { isCoupleChecked: Bool, action: @escaping () -> Void, isBordered: Bool, + insideBorderEdges: [Edge] = [], onHeaderTapped: (() -> Void)? = nil ) -> Self { Self( @@ -239,6 +244,7 @@ extension CardHeaderView.Configuration { action: action ), isBordered: isBordered, + insideBorderEdges: insideBorderEdges, padding: Spacing.spacing7, contentSpacing: Spacing.spacing6, radius: Radius.s, diff --git a/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView.swift b/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView.swift index 975f7efa..4a09c525 100644 --- a/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView.swift +++ b/Projects/Shared/DesignSystem/Sources/Components/Card/Header/CardHeaderView.swift @@ -71,25 +71,26 @@ private extension CardHeaderView { HStack(spacing: config.contentSpacing) { HStack(spacing: config.contentSpacing) { config.iconImage + .resizable() + .frame(width: 32, height: 32) Text(config.goalName) .typography(config.titleTypography) } - .contentShape(Rectangle()) + .frame(maxWidth: .infinity, alignment: .leading) .onTapGesture { config.onHeaderTapped?() } - Spacer() - .contentShape(Rectangle()) - .onTapGesture { - config.onHeaderTapped?() - } - rightContent } .padding(config.padding) .background(Color.Common.white) + .insideRectEdgeBorder( + width: config.borderWidth, + edges: config.insideBorderEdges, + color: config.borderColor + ) } @ViewBuilder var rightContent: some View { @@ -138,6 +139,15 @@ private struct CardHeaderPreview: View { ) ) + CardHeaderView( + config: .goalCheckOpened( + goalName: "목표 이름", + iconImage: .Icon.Illustration.exercise, + isMyChecked: isMyChecked, + action: { isMyChecked.toggle() } + ) + ) + CardHeaderView( config: .goalAdd( goalName: "목표 이름", diff --git a/Projects/Shared/DesignSystem/Sources/Modifiers/View+TxBottomSheet.swift b/Projects/Shared/DesignSystem/Sources/Modifiers/View+TxBottomSheet.swift index e399ccaa..30e8b056 100644 --- a/Projects/Shared/DesignSystem/Sources/Modifiers/View+TxBottomSheet.swift +++ b/Projects/Shared/DesignSystem/Sources/Modifiers/View+TxBottomSheet.swift @@ -83,6 +83,7 @@ private struct TXBottomSheetModifier: ViewModifier { private extension TXBottomSheetModifier { var sheetView: some View { sheetContent() + .padding(.bottom, TXSafeArea.inset(.bottom)) .frame(maxWidth: .infinity, alignment: .bottom) .background(Color.Common.white) .clipShape( diff --git a/Projects/Shared/DesignSystem/Sources/Resources/Image/Images.swift b/Projects/Shared/DesignSystem/Sources/Resources/Image/Images.swift index 617ac95d..f0e81d7b 100644 --- a/Projects/Shared/DesignSystem/Sources/Resources/Image/Images.swift +++ b/Projects/Shared/DesignSystem/Sources/Resources/Image/Images.swift @@ -112,7 +112,7 @@ public extension Image.Illustration { static let connect = IllustrationAsset.illustConnect.swiftUIImage static let invite = IllustrationAsset.illustInvite.swiftUIImage static let singing = IllustrationAsset.illustSinging.swiftUIImage - static let logo = SharedDesignSystemAsset.ImageAssets.logo.swiftUIImage + static let logo = IllustrationAsset.logo.swiftUIImage static let emptyPoke = IllustrationAsset.illustEmptyPoke.swiftUIImage static let arrow = IllustrationAsset.illustArrow.swiftUIImage static let hug = IllustrationAsset.illustHug.swiftUIImage