커스텀 폰트 pretendard-regular, gmarket-regular를 사용하고 있던 것을 appFont 모디파이어를 사용하여 한국어는 pretendard, 그 외에는 시스템 폰트를 사용하도록 수정

This commit is contained in:
Yu Sung
2026-01-23 03:25:19 +09:00
parent c9c1db39a6
commit b3331d5512
44 changed files with 166 additions and 150 deletions

View File

@@ -34,7 +34,7 @@ struct CharacterItemView: View {
Spacer()
Text("N")
.font(.custom(Font.preRegular.rawValue, size: 18))
.appFont(size: 18, weight: .regular)
.foregroundColor(.white)
.frame(width: 30, height: 30)
.background(Color.button)
@@ -57,14 +57,14 @@ struct CharacterItemView: View {
}
Text(character.name)
.font(.custom(Font.preRegular.rawValue, size: 18))
.appFont(size: 18, weight: .regular)
.foregroundColor(.white)
.lineLimit(1)
.truncationMode(.tail)
if let desc = character.description, !desc.isEmpty {
Text(desc)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "78909C"))
.lineLimit(1)
}

View File

@@ -24,7 +24,7 @@ struct CharacterSectionView: View {
Spacer()
if let trailingTitle = trailingTitle {
Text(trailingTitle)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "90A4AE"))
.onTapGesture { onTapTrailing?() }
}

View File

@@ -205,7 +205,7 @@ extension CharacterDetailView {
HStack(spacing: 4) {
if let gender = viewModel.characterDetail?.gender {
Text(viewModel.characterDetail?.translated?.gender ?? gender)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(
gender == "남성" ?
Color.button :
@@ -228,7 +228,7 @@ extension CharacterDetailView {
if let age = viewModel.characterDetail?.age {
Text("\(age)")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
.padding(.horizontal, 7)
.padding(.vertical, 3)
@@ -244,7 +244,7 @@ extension CharacterDetailView {
if let mbti = viewModel.characterDetail?.mbti {
Text(mbti)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
.padding(.horizontal, 7)
.padding(.vertical, 3)
@@ -271,7 +271,7 @@ extension CharacterDetailView {
if let characterType = viewModel.characterDetail?.characterType {
HStack(spacing: 8) {
Text(characterType.rawValue)
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(.white)
.padding(.horizontal, 5)
.padding(.vertical, 1)
@@ -283,11 +283,11 @@ extension CharacterDetailView {
//
Text(viewModel.characterDetail?.translated?.description ?? viewModel.characterDetail?.description ?? "")
.font(.custom(Font.preRegular.rawValue, size: 18))
.appFont(size: 18, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
Text(viewModel.characterDetail?.translated?.tags ?? viewModel.characterDetail?.tags ?? "")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "3BB9F1"))
.multilineTextAlignment(.leading)
}
@@ -328,7 +328,7 @@ extension CharacterDetailView {
HStack {
Text(title)
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
Spacer()
@@ -382,7 +382,7 @@ extension CharacterDetailView {
Text("""
보이스온의 오픈월드 캐릭터톡은 대화의 자유도가 높아 대화에 참여하는 당신은 누구든 될 수 있습니다. 세계관 속 연관 캐릭터가 되어 대화를 하거나 완전히 새로운 인물이 되어 캐릭터와 당신만의 스토리를 만들어 갈 수 있습니다.
""")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(Color(hex: "AEAEB2"))
.multilineTextAlignment(.leading)
@@ -390,7 +390,7 @@ extension CharacterDetailView {
오픈월드 캐릭터톡은 캐릭터를 정교하게 설계하였지만, 대화가 어색하거나 불완전할 수도 있습니다.
대화 도중 캐릭터의 대화가 이상하거나 새로운 캐릭터로 대화를 나누고 싶다면 대화를 초기화 하고 새롭게 캐릭터와 대화를 나눠보세요.
""")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(Color(hex: "AEAEB2"))
.multilineTextAlignment(.leading)
}
@@ -443,7 +443,7 @@ struct CharacterExpandableTextView: View {
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Text(text)
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
.lineLimit(isExpanded ? nil : 3)
.multilineTextAlignment(.leading)
@@ -469,7 +469,7 @@ struct CharacterExpandableTextView: View {
.rotationEffect(.degrees(isExpanded ? 180 : 0))
Text(isExpanded ? "간략히" : "더보기")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(Color(hex: "607D8B"))
}
.onTapGesture {

View File

@@ -102,15 +102,15 @@ struct CharacterDetailGalleryView: View {
HStack(spacing: 4) {
Text("\(viewModel.ownedCount)")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(Color(hex: "#FDD453"))
Text("/")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
Text("\(viewModel.totalCount)")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
}

View File

@@ -24,13 +24,13 @@ struct NewCharacterListView: View {
// n
HStack(spacing: 0) {
Text("전체")
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(Color(hex: "e2e2e2"))
Text(" \(viewModel.totalCount)")
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(Color(hex: "ff5c49"))
Text("")
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(Color(hex: "e2e2e2"))
Spacer()
}

View File

@@ -20,7 +20,7 @@ struct RecentCharacterItemView: View {
.clipShape(Circle())
Text(character.name)
.font(.custom(Font.preRegular.rawValue, size: 18))
.appFont(size: 18, weight: .regular)
.foregroundColor(.white)
.lineLimit(1)
.frame(maxWidth: 76)

View File

@@ -32,7 +32,7 @@ struct OriginalWorkDetailHeaderView: View {
HStack(spacing: 4) {
Text(item.translated?.contentType ?? item.contentType)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
.padding(.horizontal, 7)
.padding(.vertical, 3)
@@ -45,7 +45,7 @@ struct OriginalWorkDetailHeaderView: View {
}
Text(item.translated?.category ?? item.category)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(.button)
.padding(.horizontal, 7)
.padding(.vertical, 3)
@@ -59,7 +59,7 @@ struct OriginalWorkDetailHeaderView: View {
if item.isAdult {
Text("19+")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "ff5c49"))
.padding(.horizontal, 7)
.padding(.vertical, 3)
@@ -79,7 +79,7 @@ struct OriginalWorkDetailHeaderView: View {
.map { $0.hasPrefix("#") ? $0 : "#\($0)" }
.joined(separator: " ")
)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "3bb9f1"))
.frame(maxWidth: .infinity)
.padding(.top, 14)

View File

@@ -161,7 +161,7 @@ struct OriginalWorkInfoView: View {
.foregroundColor(.white)
Text(response.translated?.description ?? response.description)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
.lineLimit(isExpandDesc ? Int.max : 3)
.truncationMode(.tail)
@@ -185,7 +185,7 @@ struct OriginalWorkInfoView: View {
let link = response.originalLinks[$0]
Text(link)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(.white)
.onTapGesture {
if let url = URL(string: link) {
@@ -210,19 +210,19 @@ struct OriginalWorkInfoView: View {
VStack(alignment: .leading, spacing: 8) {
if let _ = response.writer {
Text("작가")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
}
if let _ = response.studio {
Text("제작사")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
}
if let _ = response.originalWork {
Text("원작")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "B0BEC5"))
}
}
@@ -230,19 +230,19 @@ struct OriginalWorkInfoView: View {
VStack(alignment: .leading, spacing: 8) {
if let writer = response.writer {
Text(writer)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(.white)
}
if let studio = response.studio {
Text(studio)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(.white)
}
if let originalWork = response.originalWork {
Text(originalWork)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(.white)
.underline(response.originalLink != nil ? true : false)
.onTapGesture {

View File

@@ -21,13 +21,13 @@ struct OriginalTabItemView: View {
).cornerRadius(16)
Text(item.title)
.font(.custom(Font.preRegular.rawValue, size: 18))
.appFont(size: 18, weight: .regular)
.foregroundColor(.white)
.lineLimit(1)
.truncationMode(.tail)
Text(item.contentType)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "78909C"))
.lineLimit(1)
.truncationMode(.tail)

View File

@@ -73,7 +73,7 @@ struct ChatRoomView: View {
.frame(width: 20, height: 20)
Text("\(can)")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
.padding(.horizontal, 10)
@@ -103,7 +103,7 @@ struct ChatRoomView: View {
? "보이스온 AI캐릭터톡은 대화의 자유도가 높아 대화에 참여하는 당신은 누구든 될 수 있습니다.\n세계관 속 캐릭터로 대화를 하거나 새로운 인물로 캐릭터와 당신만의 스토리를 만들어보세요.\n※ AI캐릭터톡은 오픈베타 서비스 중이며, 캐릭터의 대화가 어색하거나 불완전할 수 있습니다."
: "AI Clone은 크리에이터의 정보를 기반으로 대화하지만, 모든 정보를 완벽하게 반영하거나 실제 대화와 일치하지 않을 수 있습니다."
)
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(.white)
Image(systemName: "chevron.up")
@@ -187,12 +187,12 @@ struct ChatRoomView: View {
ZStack(alignment: .leading) {
if viewModel.messageText.isEmpty {
Text("메시지를 입력하세요.")
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "78909C"))
}
TextField("", text: $viewModel.messageText)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(.white)
.onSubmit {
viewModel.sendMessage()

View File

@@ -86,7 +86,7 @@ struct AiMessageItemView: View {
VStack(alignment: .leading, spacing: 4) {
HStack(spacing: 4) {
Text(characterName)
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(.white)
}
@@ -162,7 +162,7 @@ struct AiMessageItemView: View {
//
VStack {
Text(formatTime(from: message.createdAt))
.font(.custom(Font.preRegular.rawValue, size: 10))
.appFont(size: 10, weight: .regular)
.foregroundColor(.white)
}
@@ -185,7 +185,7 @@ struct AiMessageItemView: View {
//
if !component.isEmpty {
result = result + Text(component)
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
} else {
@@ -202,13 +202,13 @@ struct AiMessageItemView: View {
// ( )
if !afterClose.isEmpty {
result = result + Text(afterClose)
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
} else {
//
result = result + Text("(\(component)")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
}

View File

@@ -37,7 +37,7 @@ struct TypingIndicatorItemView: View {
VStack(alignment: .leading, spacing: 4) {
HStack(spacing: 4) {
Text(characterName)
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(.white)
}

View File

@@ -69,7 +69,7 @@ struct UserMessageItemView: View {
//
VStack {
Text(formatTime(from: message.createdAt))
.font(.custom(Font.preRegular.rawValue, size: 10))
.appFont(size: 10, weight: .regular)
.foregroundColor(.white)
}
@@ -106,7 +106,7 @@ struct UserMessageItemView: View {
//
if !component.isEmpty {
result = result + Text(component)
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
} else {
@@ -123,13 +123,13 @@ struct UserMessageItemView: View {
// ( )
if !afterClose.isEmpty {
result = result + Text(afterClose)
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
} else {
//
result = result + Text("(\(component)")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white)
}
}

View File

@@ -98,7 +98,7 @@ struct ChatBgSelectionView: View {
if selectedBgImageId == item.id {
Text("현재 배경")
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(.white)
.padding(.horizontal, 6)
.padding(.vertical, 2)

View File

@@ -67,11 +67,11 @@ struct ChatSettingsView: View {
HStack(alignment: .top, spacing: 0) {
Text("⚠️ ")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white.opacity(0.7))
Text("지금까지의 대화가 모두 초기화 되고, 이용자가 새로운 캐릭터가 되어 새롭게 대화를 시작합니다.")
.font(.custom(Font.preRegular.rawValue, size: 16))
.appFont(size: 16, weight: .regular)
.foregroundColor(.white.opacity(0.7))
.fixedSize(horizontal: false, vertical: true)
}

View File

@@ -29,7 +29,7 @@ struct TalkItemView: View {
.lineLimit(1)
Text(item.opponentType)
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(Color(hex: "D9FCF4"))
.lineLimit(1)
.padding(.horizontal, 5)
@@ -40,14 +40,14 @@ struct TalkItemView: View {
Spacer()
Text(item.lastMessageTimeLabel)
.font(.custom(Font.preRegular.rawValue, size: 12))
.appFont(size: 12, weight: .regular)
.foregroundColor(Color(hex: "78909C"))
.lineLimit(1)
}
if let message = item.lastMessagePreview {
Text(message)
.font(.custom(Font.preRegular.rawValue, size: 14))
.appFont(size: 14, weight: .regular)
.foregroundColor(Color(hex: "b0bec5"))
.lineLimit(2)
.truncationMode(.tail)

View File

@@ -15,7 +15,7 @@ struct TalkView: View {
BaseView(isLoading: $viewModel.isLoading) {
if viewModel.talkRooms.isEmpty {
Text("대화 중인 톡이 없습니다")
.font(.custom(Font.preRegular.rawValue, size: 20))
.appFont(size: 20, weight: .regular)
.foregroundColor(.white)
} else {
ScrollView(.vertical, showsIndicators: false) {