From 4f35fc9ff8558aa372b138169594aeb4bddef195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Tue, 14 Oct 2025 15:29:16 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=20scale=20AppFon?= =?UTF-8?q?t=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AIProject/iCo/Data/Util/AppFont.swift | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 AIProject/iCo/Data/Util/AppFont.swift diff --git a/AIProject/iCo/Data/Util/AppFont.swift b/AIProject/iCo/Data/Util/AppFont.swift new file mode 100644 index 00000000..46fffddf --- /dev/null +++ b/AIProject/iCo/Data/Util/AppFont.swift @@ -0,0 +1,30 @@ +// +// AppFont.swift +// iCo +// +// Created by 백현진 on 10/14/25. +// + +import SwiftUI + + +struct AppFont { + /// 시스템 다이내믹 폰트 크기에 따라 자동으로 크기가 조정되는 폰트를 반환합니다. + /// 기본 폰트는 iOS 시스템 폰트인 "SF Pro Text"이며, 비율에 따라 targetSize 크기로 스케일됩니다. + /// - Parameters: + /// - targetSize: 기준이 되는 폰트 크기(pt)입니다. (예: 17) + /// - weight: 폰트 두께를 지정합니다. 기본값은 `.regular`입니다. + /// - relativeTo: 다이내믹 타입 기준이 되는 텍스트 스타일입니다. 기본값은 `.body`입니다. + static func dynamic( + size targetSize: CGFloat, + weight: Font.Weight = .regular, + relativeTo: Font.TextStyle = .body + ) -> Font { + let baseSize: CGFloat = 17 + let ratio = targetSize / baseSize + let scaledSize = baseSize * ratio + + return .custom("SF Pro Text", size: scaledSize, relativeTo: relativeTo) + .weight(weight) + } +} From b319a5219bf116bc6410f3e3ac71636fecc80865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Wed, 15 Oct 2025 19:56:16 +0900 Subject: [PATCH 2/8] =?UTF-8?q?build:=20=EC=95=94=ED=98=B8=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20info.plist?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AIProject/iCOWidget/Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AIProject/iCOWidget/Info.plist b/AIProject/iCOWidget/Info.plist index 0f118fb7..ad340857 100644 --- a/AIProject/iCOWidget/Info.plist +++ b/AIProject/iCOWidget/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + NSExtension NSExtensionPointIdentifier From ecf402cb428741ddca4576efc17a8c84c30cc825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Thu, 16 Oct 2025 20:45:54 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20AppFont=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20UIFontMetrics=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=B0=A9=EB=B2=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AIProject/iCo/Data/Util/AppFont.swift | 34 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/AIProject/iCo/Data/Util/AppFont.swift b/AIProject/iCo/Data/Util/AppFont.swift index 46fffddf..d38313e0 100644 --- a/AIProject/iCo/Data/Util/AppFont.swift +++ b/AIProject/iCo/Data/Util/AppFont.swift @@ -7,24 +7,30 @@ import SwiftUI - struct AppFont { - /// 시스템 다이내믹 폰트 크기에 따라 자동으로 크기가 조정되는 폰트를 반환합니다. - /// 기본 폰트는 iOS 시스템 폰트인 "SF Pro Text"이며, 비율에 따라 targetSize 크기로 스케일됩니다. + /// 시스템 다이내믹 타입 설정에 따라 자동으로 크기가 조정되는 폰트를 반환합니다. + /// 폰트 두께(weight)와 접근성 글자 크기 설정을 모두 지원하며, + /// 과도한 라인 높이(line height) 증가를 자동으로 보정합니다. /// - Parameters: - /// - targetSize: 기준이 되는 폰트 크기(pt)입니다. (예: 17) - /// - weight: 폰트 두께를 지정합니다. 기본값은 `.regular`입니다. - /// - relativeTo: 다이내믹 타입 기준이 되는 텍스트 스타일입니다. 기본값은 `.body`입니다. + /// - targetSize: 기본 폰트 크기(pt) + /// - weight: 폰트 두께 (예: .regular, .bold 등) + /// - textStyle: 다이내믹 타입 기준 스타일 (기본값: .body) + /// - maxLineHeightScale: 라인 높이 확장 제한 비율 (기본값: 1.8) static func dynamic( size targetSize: CGFloat, - weight: Font.Weight = .regular, - relativeTo: Font.TextStyle = .body + weight: UIFont.Weight = .regular, + textStyle: UIFont.TextStyle = .body, + maxLineHeightScale: CGFloat = 1.8 ) -> Font { - let baseSize: CGFloat = 17 - let ratio = targetSize / baseSize - let scaledSize = baseSize * ratio - - return .custom("SF Pro Text", size: scaledSize, relativeTo: relativeTo) - .weight(weight) + let baseFont = UIFont.systemFont(ofSize: targetSize, weight: weight) + + let scaledFont = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: baseFont) + + // 폰트가 너무 커졌을 경우, 기본 대비 maxLineHeightScale까지만 확장 + let scaleRatio = scaledFont.pointSize / baseFont.pointSize + let clampedScale = min(scaleRatio, maxLineHeightScale) + let adjustedFont = baseFont.withSize(baseFont.pointSize * clampedScale) + + return Font(adjustedFont) } } From 7dc5af6ecd4cd14829398a2b0cb1a7cd7c098486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Thu, 16 Oct 2025 20:47:23 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20=EB=B6=81=EB=A7=88=ED=81=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=B7=B0=EC=97=90=20=ED=8F=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift # AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift # AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift --- .../Features/MyPage/View/Bookmark/BriefingSectionView.swift | 6 ++---- AIProject/iCo/Features/MyPage/View/CoinRowView.swift | 5 +++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift index e3e0b79f..0ae8c511 100644 --- a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift +++ b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift @@ -20,8 +20,7 @@ struct BriefingSectionView: View { briefing.briefing .byCharWrapping .highlightTextForNumbersOperator() - .font(.system(size: 14)) - .fontWeight(.regular) + .font(AppFont.dynamic(size: 14)) .lineSpacing(6) Spacer(minLength: 20) @@ -34,8 +33,7 @@ struct BriefingSectionView: View { briefing.strategy .byCharWrapping .highlightTextForNumbersOperator() - .font(.system(size: 14)) - .fontWeight(.regular) + .font(AppFont.dynamic(size: 14)) .lineSpacing(6) } } diff --git a/AIProject/iCo/Features/MyPage/View/CoinRowView.swift b/AIProject/iCo/Features/MyPage/View/CoinRowView.swift index e035f6a4..1ec76498 100644 --- a/AIProject/iCo/Features/MyPage/View/CoinRowView.swift +++ b/AIProject/iCo/Features/MyPage/View/CoinRowView.swift @@ -20,11 +20,12 @@ struct CoinRowView: View { HStack(spacing: 8) { Text(coin.coinKoreanName) - .font(.system(size: 15, weight: .semibold)) + .font(AppFont.dynamic(size: 15, weight: .semibold)) + .lineLimit(1) .foregroundColor(.primary) Text(coin.coinSymbol) - .font(.caption) + .font(AppFont.dynamic(size: 12)) .foregroundColor(.secondary) } From f1e638fe9a2205102c94ad7f18be174c891022b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Sat, 18 Oct 2025 18:30:15 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20Data=EC=97=90=EC=84=9C=20Core?= =?UTF-8?q?=EB=A1=9C=20=ED=8C=8C=EC=9D=BC=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AIProject/iCo/{Data => Core}/Util/AppFont.swift | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename AIProject/iCo/{Data => Core}/Util/AppFont.swift (100%) diff --git a/AIProject/iCo/Data/Util/AppFont.swift b/AIProject/iCo/Core/Util/AppFont.swift similarity index 100% rename from AIProject/iCo/Data/Util/AppFont.swift rename to AIProject/iCo/Core/Util/AppFont.swift From 21b726d850d8f01a92bf0df0790cbf48f96e0de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Mon, 20 Oct 2025 17:49:07 +0900 Subject: [PATCH 6/8] =?UTF-8?q?fix:=20AppFont=20struct=EC=97=90=EC=84=9C?= =?UTF-8?q?=20Font=20extension=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AIProject/iCo/Core/Util/AppFont.swift | 36 ----- AIProject/iCo/Core/Util/Font+Util.swift | 153 ++++++++++++++++++ .../View/Bookmark/BriefingSectionView.swift | 4 +- .../Features/MyPage/View/CoinRowView.swift | 4 +- 4 files changed, 157 insertions(+), 40 deletions(-) delete mode 100644 AIProject/iCo/Core/Util/AppFont.swift create mode 100644 AIProject/iCo/Core/Util/Font+Util.swift diff --git a/AIProject/iCo/Core/Util/AppFont.swift b/AIProject/iCo/Core/Util/AppFont.swift deleted file mode 100644 index d38313e0..00000000 --- a/AIProject/iCo/Core/Util/AppFont.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AppFont.swift -// iCo -// -// Created by 백현진 on 10/14/25. -// - -import SwiftUI - -struct AppFont { - /// 시스템 다이내믹 타입 설정에 따라 자동으로 크기가 조정되는 폰트를 반환합니다. - /// 폰트 두께(weight)와 접근성 글자 크기 설정을 모두 지원하며, - /// 과도한 라인 높이(line height) 증가를 자동으로 보정합니다. - /// - Parameters: - /// - targetSize: 기본 폰트 크기(pt) - /// - weight: 폰트 두께 (예: .regular, .bold 등) - /// - textStyle: 다이내믹 타입 기준 스타일 (기본값: .body) - /// - maxLineHeightScale: 라인 높이 확장 제한 비율 (기본값: 1.8) - static func dynamic( - size targetSize: CGFloat, - weight: UIFont.Weight = .regular, - textStyle: UIFont.TextStyle = .body, - maxLineHeightScale: CGFloat = 1.8 - ) -> Font { - let baseFont = UIFont.systemFont(ofSize: targetSize, weight: weight) - - let scaledFont = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: baseFont) - - // 폰트가 너무 커졌을 경우, 기본 대비 maxLineHeightScale까지만 확장 - let scaleRatio = scaledFont.pointSize / baseFont.pointSize - let clampedScale = min(scaleRatio, maxLineHeightScale) - let adjustedFont = baseFont.withSize(baseFont.pointSize * clampedScale) - - return Font(adjustedFont) - } -} diff --git a/AIProject/iCo/Core/Util/Font+Util.swift b/AIProject/iCo/Core/Util/Font+Util.swift new file mode 100644 index 00000000..c8e12a6a --- /dev/null +++ b/AIProject/iCo/Core/Util/Font+Util.swift @@ -0,0 +1,153 @@ +// +// Font+Util.swift +// iCo +// +// Created by 백현진 on 10/14/25. +// + +import SwiftUI + +extension Font { + /// 시스템 다이내믹 타입 설정에 따라 자동으로 크기가 조정되는 폰트를 반환합니다. + /// 폰트 두께(weight)와 접근성 글자 크기 설정을 모두 지원하며, + /// 과도한 라인 높이(line height) 증가를 자동으로 보정합니다. + /// - Parameters: + /// - targetSize: 기본 폰트 크기(pt) + /// - weight: 폰트 두께 (예: .regular, .bold 등) + /// - textStyle: 다이내믹 타입 기준 스타일 (기본값: .body) + /// - maxLineHeightScale: 라인 높이 확장 제한 비율 (기본값: 1.8) + static func dynamic( + size targetSize: CGFloat, + weight: UIFont.Weight = .regular, + textStyle: UIFont.TextStyle = .body, + maxLineHeightScale: CGFloat = 1.8 + ) -> Font { + let baseFont = UIFont.systemFont(ofSize: targetSize, weight: weight) + + let scaledFont = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: baseFont) + + // 폰트가 너무 커졌을 경우, 기본 대비 maxLineHeightScale까지만 확장 + let scaleRatio = scaledFont.pointSize / baseFont.pointSize + let clampedScale = min(scaleRatio, maxLineHeightScale) + let adjustedFont = baseFont.withSize(baseFont.pointSize * clampedScale) + + return Font(adjustedFont) + } + + // 10pt + static let ico10 = Font.dynamic(size: 10, weight: .regular) + static let ico10L = Font.dynamic(size: 10, weight: .light) + static let ico10M = Font.dynamic(size: 10, weight: .medium) + static let ico10Sb = Font.dynamic(size: 10, weight: .semibold) + static let ico10B = Font.dynamic(size: 10, weight: .bold) + static let ico10H = Font.dynamic(size: 10, weight: .heavy) + static let ico10Bl = Font.dynamic(size: 10, weight: .black) + + // 11pt + static let ico11 = Font.dynamic(size: 11, weight: .regular) + static let ico11L = Font.dynamic(size: 11, weight: .light) + static let ico11M = Font.dynamic(size: 11, weight: .medium) + static let ico11Sb = Font.dynamic(size: 11, weight: .semibold) + static let ico11B = Font.dynamic(size: 11, weight: .bold) + static let ico11H = Font.dynamic(size: 11, weight: .heavy) + static let ico11Bl = Font.dynamic(size: 11, weight: .black) + + // 12pt + static let ico12 = Font.dynamic(size: 12, weight: .regular) + static let ico12L = Font.dynamic(size: 12, weight: .light) + static let ico12M = Font.dynamic(size: 12, weight: .medium) + static let ico12Sb = Font.dynamic(size: 12, weight: .semibold) + static let ico12B = Font.dynamic(size: 12, weight: .bold) + static let ico12H = Font.dynamic(size: 12, weight: .heavy) + static let ico12Bl = Font.dynamic(size: 12, weight: .black) + + // 13pt + static let ico13 = Font.dynamic(size: 13, weight: .regular) + static let ico13L = Font.dynamic(size: 13, weight: .light) + static let ico13M = Font.dynamic(size: 13, weight: .medium) + static let ico13Sb = Font.dynamic(size: 13, weight: .semibold) + static let ico13B = Font.dynamic(size: 13, weight: .bold) + static let ico13H = Font.dynamic(size: 13, weight: .heavy) + static let ico13Bl = Font.dynamic(size: 13, weight: .black) + + // 14pt + static let ico14 = Font.dynamic(size: 14, weight: .regular) + static let ico14L = Font.dynamic(size: 14, weight: .light) + static let ico14M = Font.dynamic(size: 14, weight: .medium) + static let ico14Sb = Font.dynamic(size: 14, weight: .semibold) + static let ico14B = Font.dynamic(size: 14, weight: .bold) + static let ico14H = Font.dynamic(size: 14, weight: .heavy) + static let ico14Bl = Font.dynamic(size: 14, weight: .black) + + // 15pt + static let ico15 = Font.dynamic(size: 15, weight: .regular) + static let ico15L = Font.dynamic(size: 15, weight: .light) + static let ico15M = Font.dynamic(size: 15, weight: .medium) + static let ico15Sb = Font.dynamic(size: 15, weight: .semibold) + static let ico15B = Font.dynamic(size: 15, weight: .bold) + static let ico15H = Font.dynamic(size: 15, weight: .heavy) + static let ico15Bl = Font.dynamic(size: 15, weight: .black) + + // 16pt + static let ico16 = Font.dynamic(size: 16, weight: .regular) + static let ico16L = Font.dynamic(size: 16, weight: .light) + static let ico16M = Font.dynamic(size: 16, weight: .medium) + static let ico16Sb = Font.dynamic(size: 16, weight: .semibold) + static let ico16B = Font.dynamic(size: 16, weight: .bold) + static let ico16H = Font.dynamic(size: 16, weight: .heavy) + static let ico16Bl = Font.dynamic(size: 16, weight: .black) + + // 17pt + static let ico17 = Font.dynamic(size: 17, weight: .regular) + static let ico17L = Font.dynamic(size: 17, weight: .light) + static let ico17M = Font.dynamic(size: 17, weight: .medium) + static let ico17Sb = Font.dynamic(size: 17, weight: .semibold) + static let ico17B = Font.dynamic(size: 17, weight: .bold) + static let ico17H = Font.dynamic(size: 17, weight: .heavy) + static let ico17Bl = Font.dynamic(size: 17, weight: .black) + + // 18pt + static let ico18 = Font.dynamic(size: 18, weight: .regular) + static let ico18L = Font.dynamic(size: 18, weight: .light) + static let ico18M = Font.dynamic(size: 18, weight: .medium) + static let ico18Sb = Font.dynamic(size: 18, weight: .semibold) + static let ico18B = Font.dynamic(size: 18, weight: .bold) + static let ico18H = Font.dynamic(size: 18, weight: .heavy) + static let ico18Bl = Font.dynamic(size: 18, weight: .black) + + // 19pt + static let ico19 = Font.dynamic(size: 19, weight: .regular) + static let ico19L = Font.dynamic(size: 19, weight: .light) + static let ico19M = Font.dynamic(size: 19, weight: .medium) + static let ico19Sb = Font.dynamic(size: 19, weight: .semibold) + static let ico19B = Font.dynamic(size: 19, weight: .bold) + static let ico19H = Font.dynamic(size: 19, weight: .heavy) + static let ico19Bl = Font.dynamic(size: 19, weight: .black) + + // 20pt + static let ico20 = Font.dynamic(size: 20, weight: .regular) + static let ico20L = Font.dynamic(size: 20, weight: .light) + static let ico20M = Font.dynamic(size: 20, weight: .medium) + static let ico20Sb = Font.dynamic(size: 20, weight: .semibold) + static let ico20B = Font.dynamic(size: 20, weight: .bold) + static let ico20H = Font.dynamic(size: 20, weight: .heavy) + static let ico20Bl = Font.dynamic(size: 20, weight: .black) + + // 24pt + static let ico24 = Font.dynamic(size: 24, weight: .regular) + static let ico24L = Font.dynamic(size: 24, weight: .light) + static let ico24M = Font.dynamic(size: 24, weight: .medium) + static let ico24Sb = Font.dynamic(size: 24, weight: .semibold) + static let ico24B = Font.dynamic(size: 24, weight: .bold) + static let ico24H = Font.dynamic(size: 24, weight: .heavy) + static let ico24Bl = Font.dynamic(size: 24, weight: .black) + + // 35pt + static let ico35 = Font.dynamic(size: 35, weight: .regular) + static let ico35L = Font.dynamic(size: 35, weight: .light) + static let ico35M = Font.dynamic(size: 35, weight: .medium) + static let ico35Sb = Font.dynamic(size: 35, weight: .semibold) + static let ico35B = Font.dynamic(size: 35, weight: .bold) + static let ico35H = Font.dynamic(size: 35, weight: .heavy) + static let ico35Bl = Font.dynamic(size: 35, weight: .black) +} diff --git a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift index 0ae8c511..8a9a5208 100644 --- a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift +++ b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift @@ -20,7 +20,7 @@ struct BriefingSectionView: View { briefing.briefing .byCharWrapping .highlightTextForNumbersOperator() - .font(AppFont.dynamic(size: 14)) + .font(.ico14) .lineSpacing(6) Spacer(minLength: 20) @@ -33,7 +33,7 @@ struct BriefingSectionView: View { briefing.strategy .byCharWrapping .highlightTextForNumbersOperator() - .font(AppFont.dynamic(size: 14)) + .font(.ico14) .lineSpacing(6) } } diff --git a/AIProject/iCo/Features/MyPage/View/CoinRowView.swift b/AIProject/iCo/Features/MyPage/View/CoinRowView.swift index 1ec76498..8044c72b 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(AppFont.dynamic(size: 15, weight: .semibold)) + .font(.ico15Sb) .lineLimit(1) .foregroundColor(.primary) Text(coin.coinSymbol) - .font(AppFont.dynamic(size: 12)) + .font(.ico12) .foregroundColor(.secondary) } From a99806dcdf4f31a318da8f0b3fc63d8355db2f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Mon, 20 Oct 2025 18:00:35 +0900 Subject: [PATCH 7/8] chore: conflict resolve --- .../iCo/Features/MyPage/View/Bookmark/BookmarkView.swift | 2 +- .../Features/MyPage/View/Bookmark/BriefingSectionView.swift | 6 ++---- .../iCo/Features/MyPage/View/CoinListSectionView.swift | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift b/AIProject/iCo/Features/MyPage/View/Bookmark/BookmarkView.swift index fb91317c..7879b73d 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(.system(size: 11)) + .font(.ico11) .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 8a9a5208..b3fec297 100644 --- a/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift +++ b/AIProject/iCo/Features/MyPage/View/Bookmark/BriefingSectionView.swift @@ -13,8 +13,7 @@ struct BriefingSectionView: View { var body: some View { VStack(alignment: .leading, spacing: 8) { Text("분석 결과") - .font(.system(size: 14)) - .fontWeight(.semibold) + .font(.ico14Sb) .foregroundColor(Color(.iCoAccent)) briefing.briefing @@ -26,8 +25,7 @@ struct BriefingSectionView: View { Spacer(minLength: 20) Text("전략 제안") - .font(.system(size: 14)) - .fontWeight(.semibold) + .font(.ico14Sb) .foregroundColor(Color(.iCoAccent)) briefing.strategy diff --git a/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift b/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift index 110d58b2..8bc7eb82 100644 --- a/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift +++ b/AIProject/iCo/Features/MyPage/View/CoinListSectionView.swift @@ -37,8 +37,7 @@ struct CoinListSectionView: View { } } .padding(.horizontal, 16) - .fontWeight(.regular) - .font(.system(size: 12)) + .font(.ico12) .foregroundStyle(.iCoLabel) ForEach(sortedCoins, id: \.coinID) { coin in From 5b5db39b3e4d1ce2c1f0bf011eb590b6456cddd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=8C=E1=85=B5=E1=86=AB?= Date: Mon, 20 Oct 2025 18:32:25 +0900 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20static=20let=20=EC=97=90=EC=84=9C=20?= =?UTF-8?q?var=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AIProject/iCo/Core/Util/Font+Util.swift | 182 ++++++++++++------------ 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/AIProject/iCo/Core/Util/Font+Util.swift b/AIProject/iCo/Core/Util/Font+Util.swift index c8e12a6a..f61290fd 100644 --- a/AIProject/iCo/Core/Util/Font+Util.swift +++ b/AIProject/iCo/Core/Util/Font+Util.swift @@ -35,119 +35,119 @@ extension Font { } // 10pt - static let ico10 = Font.dynamic(size: 10, weight: .regular) - static let ico10L = Font.dynamic(size: 10, weight: .light) - static let ico10M = Font.dynamic(size: 10, weight: .medium) - static let ico10Sb = Font.dynamic(size: 10, weight: .semibold) - static let ico10B = Font.dynamic(size: 10, weight: .bold) - static let ico10H = Font.dynamic(size: 10, weight: .heavy) - static let ico10Bl = Font.dynamic(size: 10, weight: .black) + static var ico10 = Font.dynamic(size: 10, weight: .regular) + static var ico10L = Font.dynamic(size: 10, weight: .light) + static var ico10M = Font.dynamic(size: 10, weight: .medium) + static var ico10Sb = Font.dynamic(size: 10, weight: .semibold) + static var ico10B = Font.dynamic(size: 10, weight: .bold) + static var ico10H = Font.dynamic(size: 10, weight: .heavy) + static var ico10Bl = Font.dynamic(size: 10, weight: .black) // 11pt - static let ico11 = Font.dynamic(size: 11, weight: .regular) - static let ico11L = Font.dynamic(size: 11, weight: .light) - static let ico11M = Font.dynamic(size: 11, weight: .medium) - static let ico11Sb = Font.dynamic(size: 11, weight: .semibold) - static let ico11B = Font.dynamic(size: 11, weight: .bold) - static let ico11H = Font.dynamic(size: 11, weight: .heavy) - static let ico11Bl = Font.dynamic(size: 11, weight: .black) + static var ico11 = Font.dynamic(size: 11, weight: .regular) + static var ico11L = Font.dynamic(size: 11, weight: .light) + static var ico11M = Font.dynamic(size: 11, weight: .medium) + static var ico11Sb = Font.dynamic(size: 11, weight: .semibold) + static var ico11B = Font.dynamic(size: 11, weight: .bold) + static var ico11H = Font.dynamic(size: 11, weight: .heavy) + static var ico11Bl = Font.dynamic(size: 11, weight: .black) // 12pt - static let ico12 = Font.dynamic(size: 12, weight: .regular) - static let ico12L = Font.dynamic(size: 12, weight: .light) - static let ico12M = Font.dynamic(size: 12, weight: .medium) - static let ico12Sb = Font.dynamic(size: 12, weight: .semibold) - static let ico12B = Font.dynamic(size: 12, weight: .bold) - static let ico12H = Font.dynamic(size: 12, weight: .heavy) - static let ico12Bl = Font.dynamic(size: 12, weight: .black) + static var ico12 = Font.dynamic(size: 12, weight: .regular) + static var ico12L = Font.dynamic(size: 12, weight: .light) + static var ico12M = Font.dynamic(size: 12, weight: .medium) + static var ico12Sb = Font.dynamic(size: 12, weight: .semibold) + static var ico12B = Font.dynamic(size: 12, weight: .bold) + static var ico12H = Font.dynamic(size: 12, weight: .heavy) + static var ico12Bl = Font.dynamic(size: 12, weight: .black) // 13pt - static let ico13 = Font.dynamic(size: 13, weight: .regular) - static let ico13L = Font.dynamic(size: 13, weight: .light) - static let ico13M = Font.dynamic(size: 13, weight: .medium) - static let ico13Sb = Font.dynamic(size: 13, weight: .semibold) - static let ico13B = Font.dynamic(size: 13, weight: .bold) - static let ico13H = Font.dynamic(size: 13, weight: .heavy) - static let ico13Bl = Font.dynamic(size: 13, weight: .black) + static var ico13 = Font.dynamic(size: 13, weight: .regular) + static var ico13L = Font.dynamic(size: 13, weight: .light) + static var ico13M = Font.dynamic(size: 13, weight: .medium) + static var ico13Sb = Font.dynamic(size: 13, weight: .semibold) + static var ico13B = Font.dynamic(size: 13, weight: .bold) + static var ico13H = Font.dynamic(size: 13, weight: .heavy) + static var ico13Bl = Font.dynamic(size: 13, weight: .black) // 14pt - static let ico14 = Font.dynamic(size: 14, weight: .regular) - static let ico14L = Font.dynamic(size: 14, weight: .light) - static let ico14M = Font.dynamic(size: 14, weight: .medium) - static let ico14Sb = Font.dynamic(size: 14, weight: .semibold) - static let ico14B = Font.dynamic(size: 14, weight: .bold) - static let ico14H = Font.dynamic(size: 14, weight: .heavy) - static let ico14Bl = Font.dynamic(size: 14, weight: .black) + static var ico14 = Font.dynamic(size: 14, weight: .regular) + static var ico14L = Font.dynamic(size: 14, weight: .light) + static var ico14M = Font.dynamic(size: 14, weight: .medium) + static var ico14Sb = Font.dynamic(size: 14, weight: .semibold) + static var ico14B = Font.dynamic(size: 14, weight: .bold) + static var ico14H = Font.dynamic(size: 14, weight: .heavy) + static var ico14Bl = Font.dynamic(size: 14, weight: .black) // 15pt - static let ico15 = Font.dynamic(size: 15, weight: .regular) - static let ico15L = Font.dynamic(size: 15, weight: .light) - static let ico15M = Font.dynamic(size: 15, weight: .medium) - static let ico15Sb = Font.dynamic(size: 15, weight: .semibold) - static let ico15B = Font.dynamic(size: 15, weight: .bold) - static let ico15H = Font.dynamic(size: 15, weight: .heavy) - static let ico15Bl = Font.dynamic(size: 15, weight: .black) + static var ico15 = Font.dynamic(size: 15, weight: .regular) + static var ico15L = Font.dynamic(size: 15, weight: .light) + static var ico15M = Font.dynamic(size: 15, weight: .medium) + static var ico15Sb = Font.dynamic(size: 15, weight: .semibold) + static var ico15B = Font.dynamic(size: 15, weight: .bold) + static var ico15H = Font.dynamic(size: 15, weight: .heavy) + static var ico15Bl = Font.dynamic(size: 15, weight: .black) // 16pt - static let ico16 = Font.dynamic(size: 16, weight: .regular) - static let ico16L = Font.dynamic(size: 16, weight: .light) - static let ico16M = Font.dynamic(size: 16, weight: .medium) - static let ico16Sb = Font.dynamic(size: 16, weight: .semibold) - static let ico16B = Font.dynamic(size: 16, weight: .bold) - static let ico16H = Font.dynamic(size: 16, weight: .heavy) - static let ico16Bl = Font.dynamic(size: 16, weight: .black) + static var ico16 = Font.dynamic(size: 16, weight: .regular) + static var ico16L = Font.dynamic(size: 16, weight: .light) + static var ico16M = Font.dynamic(size: 16, weight: .medium) + static var ico16Sb = Font.dynamic(size: 16, weight: .semibold) + static var ico16B = Font.dynamic(size: 16, weight: .bold) + static var ico16H = Font.dynamic(size: 16, weight: .heavy) + static var ico16Bl = Font.dynamic(size: 16, weight: .black) // 17pt - static let ico17 = Font.dynamic(size: 17, weight: .regular) - static let ico17L = Font.dynamic(size: 17, weight: .light) - static let ico17M = Font.dynamic(size: 17, weight: .medium) - static let ico17Sb = Font.dynamic(size: 17, weight: .semibold) - static let ico17B = Font.dynamic(size: 17, weight: .bold) - static let ico17H = Font.dynamic(size: 17, weight: .heavy) - static let ico17Bl = Font.dynamic(size: 17, weight: .black) + static var ico17 = Font.dynamic(size: 17, weight: .regular) + static var ico17L = Font.dynamic(size: 17, weight: .light) + static var ico17M = Font.dynamic(size: 17, weight: .medium) + static var ico17Sb = Font.dynamic(size: 17, weight: .semibold) + static var ico17B = Font.dynamic(size: 17, weight: .bold) + static var ico17H = Font.dynamic(size: 17, weight: .heavy) + static var ico17Bl = Font.dynamic(size: 17, weight: .black) // 18pt - static let ico18 = Font.dynamic(size: 18, weight: .regular) - static let ico18L = Font.dynamic(size: 18, weight: .light) - static let ico18M = Font.dynamic(size: 18, weight: .medium) - static let ico18Sb = Font.dynamic(size: 18, weight: .semibold) - static let ico18B = Font.dynamic(size: 18, weight: .bold) - static let ico18H = Font.dynamic(size: 18, weight: .heavy) - static let ico18Bl = Font.dynamic(size: 18, weight: .black) + static var ico18 = Font.dynamic(size: 18, weight: .regular) + static var ico18L = Font.dynamic(size: 18, weight: .light) + static var ico18M = Font.dynamic(size: 18, weight: .medium) + static var ico18Sb = Font.dynamic(size: 18, weight: .semibold) + static var ico18B = Font.dynamic(size: 18, weight: .bold) + static var ico18H = Font.dynamic(size: 18, weight: .heavy) + static var ico18Bl = Font.dynamic(size: 18, weight: .black) // 19pt - static let ico19 = Font.dynamic(size: 19, weight: .regular) - static let ico19L = Font.dynamic(size: 19, weight: .light) - static let ico19M = Font.dynamic(size: 19, weight: .medium) - static let ico19Sb = Font.dynamic(size: 19, weight: .semibold) - static let ico19B = Font.dynamic(size: 19, weight: .bold) - static let ico19H = Font.dynamic(size: 19, weight: .heavy) - static let ico19Bl = Font.dynamic(size: 19, weight: .black) + static var ico19 = Font.dynamic(size: 19, weight: .regular) + static var ico19L = Font.dynamic(size: 19, weight: .light) + static var ico19M = Font.dynamic(size: 19, weight: .medium) + static var ico19Sb = Font.dynamic(size: 19, weight: .semibold) + static var ico19B = Font.dynamic(size: 19, weight: .bold) + static var ico19H = Font.dynamic(size: 19, weight: .heavy) + static var ico19Bl = Font.dynamic(size: 19, weight: .black) // 20pt - static let ico20 = Font.dynamic(size: 20, weight: .regular) - static let ico20L = Font.dynamic(size: 20, weight: .light) - static let ico20M = Font.dynamic(size: 20, weight: .medium) - static let ico20Sb = Font.dynamic(size: 20, weight: .semibold) - static let ico20B = Font.dynamic(size: 20, weight: .bold) - static let ico20H = Font.dynamic(size: 20, weight: .heavy) - static let ico20Bl = Font.dynamic(size: 20, weight: .black) + static var ico20 = Font.dynamic(size: 20, weight: .regular) + static var ico20L = Font.dynamic(size: 20, weight: .light) + static var ico20M = Font.dynamic(size: 20, weight: .medium) + static var ico20Sb = Font.dynamic(size: 20, weight: .semibold) + static var ico20B = Font.dynamic(size: 20, weight: .bold) + static var ico20H = Font.dynamic(size: 20, weight: .heavy) + static var ico20Bl = Font.dynamic(size: 20, weight: .black) // 24pt - static let ico24 = Font.dynamic(size: 24, weight: .regular) - static let ico24L = Font.dynamic(size: 24, weight: .light) - static let ico24M = Font.dynamic(size: 24, weight: .medium) - static let ico24Sb = Font.dynamic(size: 24, weight: .semibold) - static let ico24B = Font.dynamic(size: 24, weight: .bold) - static let ico24H = Font.dynamic(size: 24, weight: .heavy) - static let ico24Bl = Font.dynamic(size: 24, weight: .black) + static var ico24 = Font.dynamic(size: 24, weight: .regular) + static var ico24L = Font.dynamic(size: 24, weight: .light) + static var ico24M = Font.dynamic(size: 24, weight: .medium) + static var ico24Sb = Font.dynamic(size: 24, weight: .semibold) + static var ico24B = Font.dynamic(size: 24, weight: .bold) + static var ico24H = Font.dynamic(size: 24, weight: .heavy) + static var ico24Bl = Font.dynamic(size: 24, weight: .black) // 35pt - static let ico35 = Font.dynamic(size: 35, weight: .regular) - static let ico35L = Font.dynamic(size: 35, weight: .light) - static let ico35M = Font.dynamic(size: 35, weight: .medium) - static let ico35Sb = Font.dynamic(size: 35, weight: .semibold) - static let ico35B = Font.dynamic(size: 35, weight: .bold) - static let ico35H = Font.dynamic(size: 35, weight: .heavy) - static let ico35Bl = Font.dynamic(size: 35, weight: .black) + static var ico35 = Font.dynamic(size: 35, weight: .regular) + static var ico35L = Font.dynamic(size: 35, weight: .light) + static var ico35M = Font.dynamic(size: 35, weight: .medium) + static var ico35Sb = Font.dynamic(size: 35, weight: .semibold) + static var ico35B = Font.dynamic(size: 35, weight: .bold) + static var ico35H = Font.dynamic(size: 35, weight: .heavy) + static var ico35Bl = Font.dynamic(size: 35, weight: .black) }