diff --git a/AIProject/iCo/Core/Util/Font+Util.swift b/AIProject/iCo/Core/Util/Font+Util.swift index 300be14f..bdeb62cc 100644 --- a/AIProject/iCo/Core/Util/Font+Util.swift +++ b/AIProject/iCo/Core/Util/Font+Util.swift @@ -142,6 +142,24 @@ extension Font { static var ico21H = Font.dynamic(size: 21, weight: .heavy) static var ico21Bl = Font.dynamic(size: 21, weight: .black) + // 22pt + static var ico22 = Font.dynamic(size: 22, weight: .regular) + static var ico22L = Font.dynamic(size: 22, weight: .light) + static var ico22M = Font.dynamic(size: 22, weight: .medium) + static var ico22Sb = Font.dynamic(size: 22, weight: .semibold) + static var ico22B = Font.dynamic(size: 22, weight: .bold) + static var ico22H = Font.dynamic(size: 22, weight: .heavy) + static var ico22Bl = Font.dynamic(size: 22, weight: .black) + + // 23pt + static var ico23 = Font.dynamic(size: 23, weight: .regular) + static var ico23L = Font.dynamic(size: 23, weight: .light) + static var ico23M = Font.dynamic(size: 23, weight: .medium) + static var ico23Sb = Font.dynamic(size: 23, weight: .semibold) + static var ico23B = Font.dynamic(size: 23, weight: .bold) + static var ico23H = Font.dynamic(size: 23, weight: .heavy) + static var ico23Bl = Font.dynamic(size: 23, weight: .black) + // 24pt static var ico24 = Font.dynamic(size: 24, weight: .regular) static var ico24L = Font.dynamic(size: 24, weight: .light) @@ -151,6 +169,15 @@ extension Font { static var ico24H = Font.dynamic(size: 24, weight: .heavy) static var ico24Bl = Font.dynamic(size: 24, weight: .black) + // 26pt + static var ico26 = Font.dynamic(size: 26, weight: .regular) + static var ico26L = Font.dynamic(size: 26, weight: .light) + static var ico26M = Font.dynamic(size: 26, weight: .medium) + static var ico26Sb = Font.dynamic(size: 26, weight: .semibold) + static var ico26B = Font.dynamic(size: 26, weight: .bold) + static var ico26H = Font.dynamic(size: 26, weight: .heavy) + static var ico26Bl = Font.dynamic(size: 26, weight: .black) + // 35pt static var ico35 = Font.dynamic(size: 35, weight: .regular) static var ico35L = Font.dynamic(size: 35, weight: .light) diff --git a/AIProject/iCo/Core/Util/String+Util.swift b/AIProject/iCo/Core/Util/String+Util.swift index b544577b..bb7f9c7f 100644 --- a/AIProject/iCo/Core/Util/String+Util.swift +++ b/AIProject/iCo/Core/Util/String+Util.swift @@ -116,7 +116,7 @@ extension String { /// - searchTerm: 검색어 func highlighted(_ searchTerm: String, color: Color = .iCoAccent, - font: Font = Font.system(size: 14, weight: .bold)) -> AttributedString { + font: Font = Font.system(size: 16, weight: .bold)) -> AttributedString { var attributed = AttributedString(self) let lowercasedText = self.lowercased() let lowercasedSearch = searchTerm.lowercased() diff --git a/AIProject/iCo/Features/Base/CommonPlaceholderView.swift b/AIProject/iCo/Features/Base/CommonPlaceholderView.swift index 8bddd24f..1f2a9466 100644 --- a/AIProject/iCo/Features/Base/CommonPlaceholderView.swift +++ b/AIProject/iCo/Features/Base/CommonPlaceholderView.swift @@ -35,7 +35,7 @@ struct CommonPlaceholderView: View { .padding(.bottom, 16) Text(text) - .font(.ico14) + .font(.ico15) .foregroundStyle(.iCoLabelSecondary) .lineSpacing(6) } diff --git a/AIProject/iCo/Features/Base/DefaultProgressView.swift b/AIProject/iCo/Features/Base/DefaultProgressView.swift index ff04f3f3..ad70603c 100644 --- a/AIProject/iCo/Features/Base/DefaultProgressView.swift +++ b/AIProject/iCo/Features/Base/DefaultProgressView.swift @@ -81,7 +81,7 @@ struct DefaultProgressView: View { .padding(.bottom, 18) Text(message) - .font(.ico14) + .font(.ico15) .foregroundColor(.iCoLabel) .multilineTextAlignment(.center) .lineSpacing(4) diff --git a/AIProject/iCo/Features/Base/HeaderView.swift b/AIProject/iCo/Features/Base/HeaderView.swift index 13123ad3..68744751 100644 --- a/AIProject/iCo/Features/Base/HeaderView.swift +++ b/AIProject/iCo/Features/Base/HeaderView.swift @@ -72,13 +72,13 @@ struct HeaderView: View { VStack(alignment: .leading, spacing: 4) { HStack(alignment: .center, spacing: 4) { Text(heading) - .font(heading.count < 11 ? .ico21B : .ico18B) + .font(heading.count < 11 ? .ico22B : .ico19B) .foregroundStyle(.iCoLabel) .lineLimit(2) if showNewBadge { Text("N") - .font(.ico12H) + .font(.ico13H) .foregroundStyle(.white) .padding(4) .background(Circle().foregroundStyle(.iCoAccent)) @@ -86,14 +86,14 @@ struct HeaderView: View { } Text(coin) - .font(.ico14B) + .font(.ico16B) .foregroundStyle(.iCoLabelSecondary) } } } else { HStack(alignment: .center, spacing: 8) { Text(heading) - .font(.ico24B) + .font(.ico26B) .foregroundStyle(headingColor) .lineLimit(2) .multilineTextAlignment(showBackButton ? .center : .leading) diff --git a/AIProject/iCo/Features/Base/ReportSectionView.swift b/AIProject/iCo/Features/Base/ReportSectionView.swift index a431285f..f67be6e5 100644 --- a/AIProject/iCo/Features/Base/ReportSectionView.swift +++ b/AIProject/iCo/Features/Base/ReportSectionView.swift @@ -69,11 +69,11 @@ struct ReportSectionView: View { // Header HStack { Image(systemName: data.icon) - .font(.ico14B) + .font(.ico16B) .foregroundStyle(.iCoAccent) Text(data.title) - .font(.ico16B) + .font(.ico18B) .foregroundStyle(.iCoLabel) Spacer() @@ -93,13 +93,13 @@ struct ReportSectionView: View { case .success(let value): if !(Trailing.self == EmptyView.self) { Text(String.aiGeneratedContentNotice) - .font(.ico11) + .font(.ico13) .foregroundStyle(.iCoNeutral) .lineSpacing(5) } content(value) - .font(.ico14) + .font(.ico15) .foregroundStyle(.iCoLabel) .lineSpacing(6) .fixedSize(horizontal: false, vertical: true) @@ -226,7 +226,7 @@ struct ReportSectionView: View { trailing: { value in Button(action: { UIPasteboard.general.string = value }) { Image(systemName: "doc.on.doc") - .font(.ico14Sb) + .font(.ico16Sb) } .buttonStyle(.plain) .accessibilityLabel("내용 복사") diff --git a/AIProject/iCo/Features/Base/RoundedButton.swift b/AIProject/iCo/Features/Base/RoundedButton.swift index 08b089ff..8d0619ac 100644 --- a/AIProject/iCo/Features/Base/RoundedButton.swift +++ b/AIProject/iCo/Features/Base/RoundedButton.swift @@ -31,13 +31,13 @@ struct RoundedButton: View { HStack(spacing: 4) { if let title { Text(title) - .font(.ico11) + .font(.ico14) .tint(foregroundColor ?? .iCoLabel) } if let imageName { Image(systemName: imageName) - .font(.ico10) + .font(.ico13) .tint(foregroundColor ?? .iCoLabelSecondary) .rotation3DEffect( .degrees(isRotated ? 180 : 0), diff --git a/AIProject/iCo/Features/Base/RoundedRectangleButton.swift b/AIProject/iCo/Features/Base/RoundedRectangleButton.swift index 61508301..f27a5986 100644 --- a/AIProject/iCo/Features/Base/RoundedRectangleButton.swift +++ b/AIProject/iCo/Features/Base/RoundedRectangleButton.swift @@ -38,7 +38,7 @@ struct RoundedRectangleButton: View { } Text(title) - .font(.ico14Sb) + .font(.ico16Sb) .foregroundStyle(isActive ? .iCoAccent : .iCoLabel) } .padding(.horizontal, 14) diff --git a/AIProject/iCo/Features/Base/RoundedRectangleFillButton.swift b/AIProject/iCo/Features/Base/RoundedRectangleFillButton.swift index da38d3e2..3001473a 100644 --- a/AIProject/iCo/Features/Base/RoundedRectangleFillButton.swift +++ b/AIProject/iCo/Features/Base/RoundedRectangleFillButton.swift @@ -54,7 +54,7 @@ struct RoundedRectangleFillButtonView: View { Text(title) .frame(height: 36) - .font(!isHighlighted ? .ico14 : .ico14M) + .font(!isHighlighted ? .ico16 : .ico16M) .tint(!isHighlighted ? .iCoLabel : .iCoAccent) } .padding(.horizontal, 14) diff --git a/AIProject/iCo/Features/Base/SegmentedControlView.swift b/AIProject/iCo/Features/Base/SegmentedControlView.swift index 001eb533..860ffcd4 100644 --- a/AIProject/iCo/Features/Base/SegmentedControlView.swift +++ b/AIProject/iCo/Features/Base/SegmentedControlView.swift @@ -40,7 +40,7 @@ struct SegmentedControlView: View { .frame(maxWidth: .infinity) .padding(.horizontal, 14) .padding(.vertical, 8) - .foregroundColor(selection == idx ? .iCoBackgroundWhite : .iCoLabelSecondary) + .foregroundColor(selection == idx ? .white : .iCoLabelSecondary) .background( ZStack { if selection == idx { diff --git a/AIProject/iCo/Features/Base/SortToggleButton.swift b/AIProject/iCo/Features/Base/SortToggleButton.swift index 07b74770..f78726a2 100644 --- a/AIProject/iCo/Features/Base/SortToggleButton.swift +++ b/AIProject/iCo/Features/Base/SortToggleButton.swift @@ -48,7 +48,7 @@ struct SortToggleButton: View { HStack { Text(title) - .font(.ico11) + .font(.ico13) .foregroundStyle(.iCoLabel) RoundedButton(imageName: sortOrder.iconName) { if currentCategory == sortCategory { diff --git a/AIProject/iCo/Features/Base/SubheaderView.swift b/AIProject/iCo/Features/Base/SubheaderView.swift index 287d1727..1c03fe35 100644 --- a/AIProject/iCo/Features/Base/SubheaderView.swift +++ b/AIProject/iCo/Features/Base/SubheaderView.swift @@ -27,17 +27,17 @@ struct SubheaderView: View { HStack(spacing: 4) { if let imageName { Image(systemName: imageName) - .font(.ico19) + .font(.ico21) .foregroundStyle(imageColor) } Text(subheading) - .font(.ico20B) + .font(.ico23B) .foregroundStyle(fontColor) } if let description { Text(description) - .font(.ico15) + .font(.ico17) .foregroundStyle(fontColor) .lineSpacing(6) .fixedSize(horizontal: false, vertical: true) diff --git a/AIProject/iCo/Features/Base/TimestampWithRefreshButtonView.swift b/AIProject/iCo/Features/Base/TimestampWithRefreshButtonView.swift index 35b0dc89..dc86462c 100644 --- a/AIProject/iCo/Features/Base/TimestampWithRefreshButtonView.swift +++ b/AIProject/iCo/Features/Base/TimestampWithRefreshButtonView.swift @@ -24,7 +24,7 @@ struct TimestampWithRefreshButtonView: View { Spacer() Text("\(formattedTime) 기준") - .font(.ico11) + .font(.ico13) .foregroundStyle(.iCoLabelSecondary) .contentTransition(.numericText(countsDown: true)) diff --git a/AIProject/iCo/Features/ChatBot/View/BotMessageView.swift b/AIProject/iCo/Features/ChatBot/View/BotMessageView.swift index d9efa618..c307f98e 100644 --- a/AIProject/iCo/Features/ChatBot/View/BotMessageView.swift +++ b/AIProject/iCo/Features/ChatBot/View/BotMessageView.swift @@ -48,7 +48,7 @@ struct BotMessageView: View { } } .foregroundStyle(.iCoLabel) - .font(.ico14) + .font(.ico16) .lineSpacing(6) .padding(.vertical, 15) .padding(.horizontal, 18) diff --git a/AIProject/iCo/Features/ChatBot/View/ChatBotFAQView.swift b/AIProject/iCo/Features/ChatBot/View/ChatBotFAQView.swift index 2e22fbad..5a0f056a 100644 --- a/AIProject/iCo/Features/ChatBot/View/ChatBotFAQView.swift +++ b/AIProject/iCo/Features/ChatBot/View/ChatBotFAQView.swift @@ -39,7 +39,7 @@ struct ChatBotFAQView: View { VStack(spacing: 15) { HStack { Text("안녕하세요, 아이코 챗봇입니다.\n궁금하신 내용을 선택해주세요.") - .font(.ico15) + .font(.ico17) Spacer() } @@ -51,7 +51,7 @@ struct ChatBotFAQView: View { } .frame(maxWidth: .infinity) .padding(.vertical, 10) - .font(.ico14) + .font(.ico16) .background(.iCoBackgroundAccent) .clipShape(RoundedRectangle(cornerRadius: 15)) .overlay(RoundedRectangle(cornerRadius: 15).strokeBorder(.accentGradient, lineWidth: 0.5)) @@ -60,7 +60,7 @@ struct ChatBotFAQView: View { } } .foregroundStyle(.iCoLabel) - .font(.ico14) + .font(.ico16) .lineSpacing(6) .padding(.vertical, 15) .padding(.horizontal, 18) diff --git a/AIProject/iCo/Features/ChatBot/View/ChatInputView.swift b/AIProject/iCo/Features/ChatBot/View/ChatInputView.swift index 38ba26ac..1eeb53a6 100644 --- a/AIProject/iCo/Features/ChatBot/View/ChatInputView.swift +++ b/AIProject/iCo/Features/ChatBot/View/ChatInputView.swift @@ -17,7 +17,7 @@ struct ChatInputView: View { HStack { TextField("무엇이든 물어보세요.", text: $viewModel.searchText, axis: .vertical) .lineLimit(1...3) - .font(.ico14) + .font(.ico16) .foregroundStyle(.iCoLabel) .focused($isFocused) diff --git a/AIProject/iCo/Features/ChatBot/View/UserMessageView.swift b/AIProject/iCo/Features/ChatBot/View/UserMessageView.swift index efaaf421..f0eff1b0 100644 --- a/AIProject/iCo/Features/ChatBot/View/UserMessageView.swift +++ b/AIProject/iCo/Features/ChatBot/View/UserMessageView.swift @@ -15,7 +15,7 @@ struct UserMessageView: View { HStack { Spacer() Text(content) - .font(.ico14) + .font(.ico16) .lineSpacing(6) .foregroundStyle(.iCoLabel) .padding(.vertical, 15) diff --git a/AIProject/iCo/Features/CoinDetail/View/CandleChartView.swift b/AIProject/iCo/Features/CoinDetail/View/CandleChartView.swift index 63f6f197..52451423 100644 --- a/AIProject/iCo/Features/CoinDetail/View/CandleChartView.swift +++ b/AIProject/iCo/Features/CoinDetail/View/CandleChartView.swift @@ -148,7 +148,7 @@ struct CandleChartView: View { if date <= visibleRight { AxisValueLabel { Text(timeFormatter.string(from: date)) - .font(.ico11) + .font(.ico13) .lineLimit(1) .minimumScaleFactor(0.75) .dynamicTypeSize(.xSmall ... .medium) diff --git a/AIProject/iCo/Features/CoinDetail/View/ChartView.swift b/AIProject/iCo/Features/CoinDetail/View/ChartView.swift index 5e8cc73b..6a553b76 100644 --- a/AIProject/iCo/Features/CoinDetail/View/ChartView.swift +++ b/AIProject/iCo/Features/CoinDetail/View/ChartView.swift @@ -111,23 +111,23 @@ struct ChartView: View { /// 기준 시간 / 현재가 / 등락가, 등락률 / 거래대금 VStack(alignment: .leading, spacing: 8) { Text(lastUpdatedText) - .font(.ico10) + .font(.ico12) .foregroundStyle(.iCoLabel) .lineLimit(1) Text(viewModel.displayLastPrice.formatKRW) - .font(.ico20B) + .font(.ico22B) .foregroundStyle(.iCoLabel) .lineLimit(1) Text("\(sign)\(absChange.formatKRW) (\(arrow)\(abs(viewModel.displayChangeRate).formatRate))") - .font(.ico16M) + .font(.ico18M) .foregroundStyle(headerColor) .lineLimit(2) .multilineTextAlignment(.leading) Text("거래대금 \(viewModel.headerAccTradePrice.formatMillion)") - .font(.ico12M) + .font(.ico15M) .foregroundStyle(.iCoLabelSecondary) .lineLimit(1) } diff --git a/AIProject/iCo/Features/CoinDetail/View/ReportNewsSectionView.swift b/AIProject/iCo/Features/CoinDetail/View/ReportNewsSectionView.swift index 3b773cb0..3ab5cda6 100644 --- a/AIProject/iCo/Features/CoinDetail/View/ReportNewsSectionView.swift +++ b/AIProject/iCo/Features/CoinDetail/View/ReportNewsSectionView.swift @@ -29,14 +29,14 @@ struct ReportNewsSectionView: View { var body: some View { VStack(alignment: .leading, spacing: 0) { Text(title) - .font(.ico13B) + .font(.ico15B) .foregroundStyle(.iCoAccent) ForEach(displayedArticles, id: \.id) { article in VStack(alignment: .leading, spacing: 8) { HStack { Text(article.title.byCharWrapping) - .font(.ico15B) + .font(.ico17B) .foregroundStyle(.iCoLabel) .lineLimit(1) @@ -50,7 +50,7 @@ struct ReportNewsSectionView: View { } Text(article.summary.byCharWrapping) - .font(.ico14) + .font(.ico15) .foregroundStyle(.iCoLabel) .lineSpacing(6) .fixedSize(horizontal: false, vertical: true) diff --git a/AIProject/iCo/Features/CoinDetail/View/ReportView.swift b/AIProject/iCo/Features/CoinDetail/View/ReportView.swift index 2d58c499..52d544bd 100644 --- a/AIProject/iCo/Features/CoinDetail/View/ReportView.swift +++ b/AIProject/iCo/Features/CoinDetail/View/ReportView.swift @@ -18,12 +18,12 @@ struct ReportView: View { VStack(alignment: .leading, spacing: 16) { if hSizeClass == .regular { Text("AI 리포트") - .font(.ico18B) + .font(.ico20B) .foregroundStyle(.iCoLabel) } Text(String.aiGeneratedContentNotice) - .font(.ico11) + .font(.ico13) .foregroundStyle(.iCoNeutral) .lineSpacing(5) diff --git a/AIProject/iCo/Features/Dashboard/View/AIBriefingView.swift b/AIProject/iCo/Features/Dashboard/View/AIBriefingView.swift index 3cd4ff0f..63064818 100644 --- a/AIProject/iCo/Features/Dashboard/View/AIBriefingView.swift +++ b/AIProject/iCo/Features/Dashboard/View/AIBriefingView.swift @@ -29,7 +29,7 @@ struct AIBriefingView: View { SubheaderView(subheading: "시장 한눈에 보기") .padding(.bottom, 4) - VStack(alignment: .leading, spacing: 20) { + VStack(alignment: .leading, spacing: 16) { FearGreedView() VStack(spacing: 16) { @@ -63,7 +63,7 @@ struct AIBriefingView: View { data: data, trailing: { Text($0.sentiment.rawValue) - .font(.ico16B) + .font(.ico18B) .foregroundStyle($0.sentiment.color(for: themeManager.selectedTheme)) }, content: { diff --git a/AIProject/iCo/Features/Dashboard/View/CoinCarouselView.swift b/AIProject/iCo/Features/Dashboard/View/CoinCarouselView.swift index a532d4d3..1af5e0ce 100644 --- a/AIProject/iCo/Features/Dashboard/View/CoinCarouselView.swift +++ b/AIProject/iCo/Features/Dashboard/View/CoinCarouselView.swift @@ -58,10 +58,7 @@ struct CoinCarouselView: View { let coin = tempCoinArray[index] RecommendCardView(recommendCoin: coin) - .frame( - width: nil, - height: CardConst.cardHeight - ) + .frame(height: CardConst.cardHeight) .onTapGesture { selectedCoin = coin } @@ -79,7 +76,7 @@ struct CoinCarouselView: View { } } .scrollTargetLayout() - .frame(height: CardConst.cardHeight, alignment: .top) +// .frame(height: CardConst.cardHeight, alignment: .top) } .contentMargins(.horizontal, CardConst.cardInnerPadding + .spacingXSmall) // 활성 카드의 양쪽에 2개의 카드 꽁지가 보이게하기 .scrollTargetBehavior(.viewAligned) @@ -142,29 +139,29 @@ struct CoinCarouselView: View { wrappedCoins.removeAll() } .sheet(item: $selectedCoin) { coin in - VStack(spacing: .spacing) { + VStack(spacing: 30) { CoinInfoView(recommendCoin: coin) { selectedCoin = nil } - VStack(alignment: .leading, spacing: 4) { + VStack(alignment: .leading, spacing: 12) { HStack(spacing: 8) { Image(systemName: "sparkles") - .font(.ico14B) + .font(.ico16B) .foregroundStyle(.iCoAccent) Text("아이코가 추천하는 이유") - .font(.ico16B) + .font(.ico18B) .foregroundStyle(.iCoLabel) } Text(String.aiGeneratedContentNotice) - .font(.ico11) + .font(.ico13) .foregroundStyle(.iCoNeutral) - .lineSpacing(5) + .lineSpacing(6) Text(coin.comment.byCharWrapping) - .font(.ico14) + .font(.ico16) .lineSpacing(6) .foregroundStyle(.iCoLabel) } @@ -292,13 +289,11 @@ extension CoinCarouselView { if !isSheetPresented { isSheetPresented = true viewModel.stopTimer() - print("‼️stop") } } else { if isSheetPresented { isSheetPresented = false viewModel.startTimer() - print("‼️start") } } } diff --git a/AIProject/iCo/Features/Dashboard/View/CoinInfoView.swift b/AIProject/iCo/Features/Dashboard/View/CoinInfoView.swift index 3f157c37..f3f4e8c2 100644 --- a/AIProject/iCo/Features/Dashboard/View/CoinInfoView.swift +++ b/AIProject/iCo/Features/Dashboard/View/CoinInfoView.swift @@ -31,12 +31,12 @@ struct CoinInfoView: View { VStack(alignment: .leading, spacing: 4) { Text(recommendCoin.name) - .font(.ico17B) + .font(.ico19B) .bold() .foregroundStyle(.iCoLabel) Text(recommendCoin.id) - .font(.ico12Sb) + .font(.ico14Sb) .fontWeight(.semibold) .foregroundStyle(.iCoLabelSecondary) } @@ -54,24 +54,24 @@ struct CoinInfoView: View { VStack(alignment: .leading, spacing: 8) { HStack(spacing: 4) { Text("현재가") - .font(.ico14) + .font(.ico16) .foregroundStyle(.iCoLabel) Text(recommendCoin.tradePrice.formatKRW) - .font(.ico14B) + .font(.ico16B) .bold() .foregroundStyle(dynamicStatusColor(for: recommendCoin.changeType)) } HStack(spacing: 4) { Text("전일대비") - .font(.ico14) + .font(.ico16) .foregroundStyle(.iCoLabel) Group { Text("\(recommendCoin.changeType.code)\(recommendCoin.changeRate.formatRate)") } - .font(.ico14B) + .font(.ico16B) .bold() .foregroundStyle(dynamicStatusColor(for: recommendCoin.changeType)) } diff --git a/AIProject/iCo/Features/Dashboard/View/DashboardView.swift b/AIProject/iCo/Features/Dashboard/View/DashboardView.swift index a4c3eff7..74af725d 100644 --- a/AIProject/iCo/Features/Dashboard/View/DashboardView.swift +++ b/AIProject/iCo/Features/Dashboard/View/DashboardView.swift @@ -110,7 +110,7 @@ struct DashboardView: View { .background(.ultraThinMaterial) .overlay(alignment: .center) { Text("대시보드") - .font(.ico18B) + .font(.ico20B) .foregroundStyle(.iCoLabel) .offset(y: -5) // 텍스트가 네비게이션바 중앙에 오도록 위치 조정하기 } diff --git a/AIProject/iCo/Features/Dashboard/View/FearGreedView.swift b/AIProject/iCo/Features/Dashboard/View/FearGreedView.swift index 9885d57e..08ec55c1 100644 --- a/AIProject/iCo/Features/Dashboard/View/FearGreedView.swift +++ b/AIProject/iCo/Features/Dashboard/View/FearGreedView.swift @@ -63,7 +63,7 @@ struct FearGreedView: View { var headerSection: some View { VStack(alignment: .leading, spacing: 4) { if hSizeClass == .compact { - VStack(alignment: .leading, spacing: 0) { + VStack(alignment: .leading, spacing: 4) { Group { Text("지금 시장은") @@ -72,7 +72,7 @@ struct FearGreedView: View { + Text(" 상태예요") } - .font(.ico16B) + .font(.ico18B) .foregroundStyle(.iCoLabel) } } else { @@ -85,7 +85,7 @@ struct FearGreedView: View { + Text(" 상태예요") } - .font(.ico16B) + .font(.ico18B) .foregroundStyle(.iCoLabel) } } @@ -101,6 +101,7 @@ struct FearGreedView: View { fearGreedDescription } } + .animation(.easeInOut, value: viewModel.classification) } var chartSection: some View { @@ -115,14 +116,14 @@ struct FearGreedView: View { Text("100") .offset(y: 6) } - .font(.ico10M) + .font(.ico12M) .foregroundStyle(.secondary) } } var fearGreedDescription: some View { Text("ⓘ 공포 탐욕 지수는 투자 심리를 0~100 사이 수치로 나타낸 지표로, 0에 가까울수록 불안감으로 투자를 피하는 '공포', 100에 가까울수록 낙관적으로 적극 매수하는 '탐욕'을 의미합니다.".byCharWrapping) - .font(.ico11) + .font(.ico13) .padding(.top, 4) .foregroundStyle(.iCoNeutral) .lineSpacing(5) @@ -145,7 +146,7 @@ extension FearGreedView { private static let gaugeTrim: CGFloat = 0.5 private static let lineWidth: CGFloat = 10 private static let rotationDegrees: Double = 180 - @State private var guageValue: CGFloat = 0 + @State private var guageValue: CGFloat let chartWidth: CGFloat let chartHeight: CGFloat @@ -154,6 +155,7 @@ extension FearGreedView { self._viewModel = ObservedObject(wrappedValue: viewModel) self.chartWidth = chartWidth self.chartHeight = chartWidth / 2 + self.guageValue = viewModel.indexValue } var body: some View { @@ -191,10 +193,10 @@ extension FearGreedView { .contentTransition(.numericText(countsDown: true)) } .offset(y: chartHeight / 2) - .task { + .onChange(of: viewModel.indexValue) { _, newValue in Task { try await Task.sleep(for: .seconds(0.5)) - guageValue = viewModel.indexValue + guageValue = newValue } } } diff --git a/AIProject/iCo/Features/Dashboard/View/RecommendCardView.swift b/AIProject/iCo/Features/Dashboard/View/RecommendCardView.swift index 559c0b83..4572cf7a 100644 --- a/AIProject/iCo/Features/Dashboard/View/RecommendCardView.swift +++ b/AIProject/iCo/Features/Dashboard/View/RecommendCardView.swift @@ -14,11 +14,12 @@ struct RecommendCardView: View { VStack(alignment: .leading, spacing: 0) { CoinInfoView(recommendCoin: recommendCoin) + Spacer() + Text(recommendCoin.comment.byCharWrapping) - .font(.ico14) + .font(.ico15) .lineSpacing(6) .foregroundStyle(.iCoLabel) - .padding(.top, 30) } .padding(24) .background( diff --git a/AIProject/iCo/Features/Dashboard/View/TopCoinListView.swift b/AIProject/iCo/Features/Dashboard/View/TopCoinListView.swift index 6dc8f70e..b5aace94 100644 --- a/AIProject/iCo/Features/Dashboard/View/TopCoinListView.swift +++ b/AIProject/iCo/Features/Dashboard/View/TopCoinListView.swift @@ -18,10 +18,9 @@ struct TopCoinListView: View { .foregroundStyle(.iCoAccent) Text("주목할 만한 코인 TOP5") + .foregroundStyle(.iCoLabel) } - .font(.ico16B) - .padding(.horizontal, 22) - .padding(.top, 20) + .font(.ico18B) SegmentedControlView( selection: Binding( @@ -35,7 +34,8 @@ struct TopCoinListView: View { tabTitles: TopCoinListViewModel.SegmentType.allCases.map { $0.rawValue }, width: .infinity ) - .padding(.horizontal) + .padding(.horizontal, -4) + .padding(.bottom, 4) if viewModel.isLoading { DefaultProgressView(status: .loading, message: "시세 불러오는중") @@ -43,6 +43,7 @@ struct TopCoinListView: View { TopCoinListSection(viewModel: viewModel) } } + .padding(22) .background(.iCoBackground) .clipShape(RoundedRectangle(cornerRadius: 20)) .overlay( @@ -95,13 +96,13 @@ struct TopCoinListSection: View { } label: { HStack { Text("\(index + 1)") - .font(.ico14B) + .font(.ico15B) .foregroundColor(.iCoAccent) .padding(.trailing, 16) - + CachedAsyncImage(resource: .symbol(coin.coinSymbol)) { Text(String(coin.coinSymbol.prefix(1))) - .font(.ico15Sb) + .font(.ico17Sb) .foregroundStyle(.iCoAccent) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(.iCoBackgroundAccent) @@ -115,20 +116,23 @@ struct TopCoinListSection: View { VStack(alignment: .leading, spacing: 8) { Text(viewModel.koreanName(for: coin.id)) - .font(.ico15) + .font(.ico16Sb) + .lineLimit(1) + .foregroundStyle(.iCoLabel) if viewModel.selectedSegment == .volume { Text(coin.formatedVolume) - .font(.ico12) + .font(.ico14) .foregroundColor(.iCoLabelSecondary) } else { Text(coin.formatedRate) - .font(.ico12) + .font(.ico14) .foregroundColor( coin.change == .rise ? .iCoPositive : (coin.change == .fall ? .iCoNegative : .iCoNeutral) ) } } + .padding(.trailing, 8) Spacer() @@ -137,21 +141,24 @@ struct TopCoinListSection: View { values: values, lineColor: coin.change == .fall ? .iCoNegative : .iCoPositive ) - .frame(width: 100, height: 40) + .frame(width: 80, height: 40) } else { ProgressView() - .frame(width: 100, height: 40) + .frame(width: 80, height: 40) } } - .padding(.vertical, 16) - .padding(.horizontal, 22) + .padding(.bottom, index != viewModel.topCoins.count - 1 ? 14 : 0) } .buttonStyle(.plain) } } + .padding(.vertical, 4) } } #Preview { TopCoinListView() + .environmentObject(ThemeManager()) + .environment(CoinStore(coinService: DefaultCoinService(network: NetworkClient()))) + .padding() } diff --git a/AIProject/iCo/Features/Dashboard/ViewModel/FearGreedViewModel.swift b/AIProject/iCo/Features/Dashboard/ViewModel/FearGreedViewModel.swift index ad0cb600..b005405d 100644 --- a/AIProject/iCo/Features/Dashboard/ViewModel/FearGreedViewModel.swift +++ b/AIProject/iCo/Features/Dashboard/ViewModel/FearGreedViewModel.swift @@ -16,7 +16,7 @@ final class FearGreedViewModel: ObservableObject { /// 공포-탐욕 지수 값입니다. @Published var indexValue: CGFloat = 50 /// 한글로 표시된 공포-탐욕 분류입니다. - @Published var classification: String = "" + @Published var classification: String = "중립" var baseColor: Color { fearGreed.color } diff --git a/AIProject/iCo/Features/Market/SubView/CoinCell.swift b/AIProject/iCo/Features/Market/SubView/CoinCell.swift index 8ff357ca..40f6a06d 100644 --- a/AIProject/iCo/Features/Market/SubView/CoinCell.swift +++ b/AIProject/iCo/Features/Market/SubView/CoinCell.swift @@ -43,15 +43,15 @@ fileprivate struct CoinMetaView: View { CoinView(symbol: symbol, size: 30) VStack(alignment: .leading, spacing: 6) { - Text(name.highlighted(searchTerm, font: name.count < 8 ? .ico14B : .ico12B)) + Text(name.highlighted(searchTerm, font: name.count < 7 ? .ico16B : .ico14B)) .lineLimit(1) - .font(name.count < 8 ? .ico14B : .ico12B) + .font(name.count < 7 ? .ico16B : .ico14B) Text(symbol.highlighted(searchTerm)) .foregroundStyle(.secondary) } } - .font(.ico11M) + .font(.ico13M) .foregroundStyle(.iCoLabel) } } @@ -89,30 +89,30 @@ fileprivate struct CoinPriceView: View { Text(ticker.snapshot.formatedPrice) .frame(minWidth: priceWidth, alignment: .trailing) - .font(.ico15M) + .font(.ico17M) .blinkUnderlineOnChange(ticker.snapshot.price) } .frame(alignment: .trailing) HStack(spacing: 0) { Text("거래") - .font(.ico11M) + .font(.ico13M) Text(ticker.snapshot.formatedVolume) .frame(minWidth: volumeWidth, alignment: .trailing) } } - .font(.ico12M) + .font(.ico14M) .foregroundStyle(.iCoLabel) .background { VStack { ZStack { Text(ticker.snapshot.formatedPrice) - .font(.ico15M) + .font(.ico17M) .measureWidth { w in priceWidth = w + pricePadding } Text(ticker.snapshot.formatedVolume) - .font(.ico11M) + .font(.ico13M) .measureWidth { w in volumeWidth = w + pricePadding } diff --git a/AIProject/iCo/Features/Market/SubView/HeaderToggleButton.swift b/AIProject/iCo/Features/Market/SubView/HeaderToggleButton.swift index a73000a7..e9c80975 100644 --- a/AIProject/iCo/Features/Market/SubView/HeaderToggleButton.swift +++ b/AIProject/iCo/Features/Market/SubView/HeaderToggleButton.swift @@ -21,12 +21,12 @@ struct HeaderToggleButton: View { } label: { HStack { Text(title) - .font(.ico11) + .font(.ico13) .foregroundStyle(.iCoLabelSecondary) HStack(spacing: 4) { Image(systemName: sortOrder.iconName) - .font(.ico12) + .font(.ico14) .foregroundStyle(.iCoLabelSecondary) .animation(nil, value: sortOrder) } diff --git a/AIProject/iCo/Features/Market/SubView/RecentCoinSectionView.swift b/AIProject/iCo/Features/Market/SubView/RecentCoinSectionView.swift index f7bf0789..cb7469c8 100644 --- a/AIProject/iCo/Features/Market/SubView/RecentCoinSectionView.swift +++ b/AIProject/iCo/Features/Market/SubView/RecentCoinSectionView.swift @@ -18,7 +18,7 @@ struct RecentCoinSectionView: View { ForEach(coins) { coin in HStack(spacing: 8) { Text(coin.koreanName) - .font(.ico14) + .font(.ico15) Button { deleteAction(coin) diff --git a/AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift b/AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift index 7879b73d..d13da9c1 100644 --- a/AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift +++ b/AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift @@ -133,7 +133,7 @@ struct BookmarkView: View { .padding(.horizontal, 16) Text(String.aiGeneratedContentNotice) - .font(.ico11) + .font(.ico13) .foregroundColor(.iCoNeutral) .lineSpacing(5) .frame(maxWidth: .infinity, alignment: .leading) diff --git a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift index b3fec297..6927c7c8 100644 --- a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift +++ b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift @@ -13,25 +13,25 @@ struct BriefingSectionView: View { var body: some View { VStack(alignment: .leading, spacing: 8) { Text("분석 결과") - .font(.ico14Sb) + .font(.ico16Sb) .foregroundColor(Color(.iCoAccent)) briefing.briefing .byCharWrapping .highlightTextForNumbersOperator() - .font(.ico14) + .font(.ico16) .lineSpacing(6) Spacer(minLength: 20) Text("전략 제안") - .font(.ico14Sb) + .font(.ico16Sb) .foregroundColor(Color(.iCoAccent)) briefing.strategy .byCharWrapping .highlightTextForNumbersOperator() - .font(.ico14) + .font(.ico16) .lineSpacing(6) } } diff --git a/AIProject/iCo/Features/MyPage/View/BookmarkBulkInsert/HeaderSection.swift b/AIProject/iCo/Features/MyPage/View/BookmarkBulkInsert/HeaderSection.swift index d8a592c2..82c9d5c9 100644 --- a/AIProject/iCo/Features/MyPage/View/BookmarkBulkInsert/HeaderSection.swift +++ b/AIProject/iCo/Features/MyPage/View/BookmarkBulkInsert/HeaderSection.swift @@ -11,14 +11,14 @@ struct HeaderSection: View { var body: some View { VStack(alignment: .leading, spacing: 6) { Text("코인 목록이 캡쳐된 스크린샷을 업로드하세요") - .font(.ico18) + .font(.ico20) .fontWeight(.medium) .multilineTextAlignment(.leading) .frame(maxWidth: .infinity, alignment: .leading) Text("아이코가 자동으로 북마크를 등록해드려요") .foregroundStyle(.iCoLabelSecondary) - .font(.ico15) + .font(.ico17) .frame(maxWidth: .infinity, alignment: .leading) } .padding(.horizontal, 16) diff --git a/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift b/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift index 8bc7eb82..2eed6b08 100644 --- a/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift +++ b/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift @@ -37,7 +37,7 @@ struct CoinListSectionView: View { } } .padding(.horizontal, 16) - .font(.ico12) + .font(.ico14) .foregroundStyle(.iCoLabel) ForEach(sortedCoins, id: \.coinID) { coin in diff --git a/AIProject/iCo/Features/MyPage/View/CoinRowView.swift b/AIProject/iCo/Features/MyPage/View/CoinRowView.swift index 8044c72b..85306e9a 100644 --- a/AIProject/iCo/Features/MyPage/View/CoinRowView.swift +++ b/AIProject/iCo/Features/MyPage/View/CoinRowView.swift @@ -20,12 +20,12 @@ struct CoinRowView: View { HStack(spacing: 8) { Text(coin.coinKoreanName) - .font(.ico15Sb) + .font(.ico17Sb) .lineLimit(1) .foregroundColor(.primary) Text(coin.coinSymbol) - .font(.ico12) + .font(.ico14) .foregroundColor(.secondary) } diff --git a/AIProject/iCo/Features/MyPage/View/Theme/ThemeRow.swift b/AIProject/iCo/Features/MyPage/View/Theme/ThemeRow.swift index fb7a3661..62aa5378 100644 --- a/AIProject/iCo/Features/MyPage/View/Theme/ThemeRow.swift +++ b/AIProject/iCo/Features/MyPage/View/Theme/ThemeRow.swift @@ -27,7 +27,7 @@ struct ThemeRow: View { HStack(spacing: 8) { Text(title) .frame(height: 36) - .font(isSelected ? .ico14M : .ico14) + .font(isSelected ? .ico16M : .ico16) .foregroundStyle(!isSelected ? .iCoLabel : .iCoAccent) Spacer() diff --git a/AIProject/iCo/Features/Search/SearchBarView.swift b/AIProject/iCo/Features/Search/SearchBarView.swift index 4c39db64..de3c1301 100644 --- a/AIProject/iCo/Features/Search/SearchBarView.swift +++ b/AIProject/iCo/Features/Search/SearchBarView.swift @@ -36,7 +36,7 @@ struct SearchBarView: View { .autocorrectionDisabled(true) .padding(.horizontal, 8) .submitLabel(.search) - .font(.ico14) + .font(.ico16) .focused($isFocused) .onChange(of: isFocused) { showCancel = isFocused @@ -67,7 +67,7 @@ struct SearchBarView: View { } label: { Text("취소") .foregroundStyle(.iCoNegative) - .font(.ico13) + .font(.ico15) } .opacity(showCancel ? 1 : 0) .frame(width: showCancel ? 40 : 0, alignment: .trailing)