-
Notifications
You must be signed in to change notification settings - Fork 0
Feat/#19 CherrishButtoncomponent 수정 #33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| { | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "check_circular.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "checkbox_active.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "checkbox_default.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "chevron_left.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "chevron_right.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "clock.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "close.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "deletebox.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "info.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "plus.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "radiobtn_default.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "radiobtn_selected.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "return.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "search.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| { | ||
| "images" : [ | ||
| { | ||
| "filename" : "sun.svg", | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,115 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // CherrishButton.swift | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Cherrish-iOS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Created by sumin Kong on 1/10/26. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import SwiftUI | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| enum ButtonState { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case normal | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case active | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| enum CherrishButtonType { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case next | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case confirm | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case save | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case addEvent | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+15
to
+20
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial 접근 제어 수정자 추가를 고려하세요. 재사용 가능한 컴포넌트의 일부이므로 ♻️ 제안하는 개선사항-enum CherrishButtonType {
+public enum CherrishButtonType: CaseIterable {
case next
case confirm
case save
case addEvent
}🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| struct CherrishButton: View { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major 접근 제어 수정자를 추가하세요. Global Components로 제공되는 재사용 가능한 컴포넌트이므로 ♻️ 제안하는 개선사항-struct CherrishButton: View {
+public struct CherrishButton: View {초기화 메서드도 public으로 명시해야 합니다: public init(title: String, type: CherrishButtonType, state: Binding<ButtonState>, action: @escaping () -> Void) {
self.title = title
self.type = type
self._state = state
self.action = action
}🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let title: String | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let type: CherrishButtonType | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @Binding var state: ButtonState | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let action: () -> Void | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var body: some View { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Button(action: action) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Text(title) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .typography(.title2_sb_16) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .foregroundStyle(type.textColor(for: state)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .buttonStyle(CherrishButtonStyle(state: state, type: type)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .disabled(type.isDisabled(for: state)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+29
to
+37
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial 접근성(Accessibility) 지원이 누락되었습니다. VoiceOver 사용자를 위해 접근성 레이블을 추가하는 것이 좋습니다. 버튼이 비활성화된 경우 힌트도 제공하면 더 좋습니다. ♻️ 제안된 수정 var body: some View {
Button(action: action) {
Text(title)
.typography(.title2_sb_16)
.foregroundStyle(type.textColor(for: state))
}
.buttonStyle(CherrishButtonStyle(state: state, type: type))
.disabled(type.isDisabled(for: state))
+ .accessibilityLabel(title)
+ .accessibilityHint(type.isDisabled(for: state) ? "비활성화됨" : "")
}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| struct CherrishButtonStyle: ButtonStyle { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let state: ButtonState | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let type: CherrishButtonType | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func makeBody(configuration: Configuration) -> some View { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| configuration.label | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .frame( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| width: configuration.isPressed ? type.width * 0.95 : type.width, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| height: configuration.isPressed ? type.height * 0.95 : type.height | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .background(type.backgroundColor(for: state)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .clipShape(RoundedRectangle(cornerRadius: configuration.isPressed | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ? type.cornerRadius * 0.95 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| : type.cornerRadius)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
45
to
55
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major 🧩 Analysis chain🌐 Web query:
💡 Result: Short answer: cornerRadius was deprecated in iOS 17 (Xcode 15). Use clipShape (or fill/background APIs) with a RoundedRectangle (or new UnevenRoundedRectangle / .rect shorthands) instead. Examples:
Notes: Apple’s implementation shows cornerRadius forwards to clipShape/fill; you can also use fill/in background to avoid double-shaping when drawing borders. [1][2][3][4] Sources: Citations:
♻️ 제안된 수정 func makeBody(configuration: Configuration) -> some View {
configuration.label
.frame(
width: configuration.isPressed ? type.width * 0.95 : type.width,
height: configuration.isPressed ? type.height * 0.95 : type.height
)
.background(type.backgroundColor(for: state))
- .cornerRadius(
- configuration.isPressed
- ? type.cornerRadius * 0.95
- : type.cornerRadius
- )
+ .clipShape(
+ RoundedRectangle(
+ cornerRadius: configuration.isPressed
+ ? type.cornerRadius * 0.95
+ : type.cornerRadius
+ )
+ )
+ .animation(.easeInOut(duration: 0.1), value: configuration.isPressed)
}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 요내용 확인하면 좋을 거 같아욤 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
41
to
56
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial 접근 제어 수정자를 추가하고 햅틱 피드백을 고려하세요.
♻️ 제안하는 개선사항-struct CherrishButtonStyle: ButtonStyle {
+public struct CherrishButtonStyle: ButtonStyle {
let state: ButtonState
let type: CherrishButtonType
func makeBody(configuration: Configuration) -> some View {
configuration.label
.frame(
width: configuration.isPressed ? type.width * 0.95 : type.width,
height: configuration.isPressed ? type.height * 0.95 : type.height
)
.background(type.backgroundColor(for: state))
.cornerRadius(
configuration.isPressed
? type.cornerRadius * 0.95
: type.cornerRadius
)
+ .onChange(of: configuration.isPressed) { oldValue, newValue in
+ if newValue {
+ let generator = UIImpactFeedbackGenerator(style: .light)
+ generator.impactOccurred()
+ }
+ }
}
}🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| extension CherrishButtonType { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var width: CGFloat { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .next: return 326 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .confirm: return 126 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .save: return 278 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .addEvent: return 196 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+61
to
+68
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial 고정 너비 값은 다양한 화면 크기에 적응하지 못할 수 있습니다. 하드코딩된 너비 값(326, 126, 278, 196)은 다른 기기나 Dynamic Type 설정에서 문제가 될 수 있습니다. 유연한 레이아웃이나 상대적인 크기를 고려해 보세요. ♻️ 예시: 화면 너비 기반 상대적 크기var width: CGFloat {
let screenWidth = UIScreen.main.bounds.width
switch self {
case .next: return screenWidth - 48 // 양쪽 24pt 마진
case .confirm: return 126
case .save: return screenWidth - 96
case .addEvent: return 196
}
}🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var height: CGFloat { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .save: return 44 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return 50 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var cornerRadius: CGFloat { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .save: return 10 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: return 12 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func backgroundColor(for state: ButtonState) -> Color { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .next: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return state == .active ? .red700 : .gray200 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .confirm, .save: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return .red700 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .addEvent: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return .gray400 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func textColor(for state: ButtonState) -> Color { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .next: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return state == .active ? .gray0 : .gray600 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .confirm, .save: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return .gray0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .addEvent: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return .gray700 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func isDisabled(for state: ButtonState) -> Bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| switch self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| case .next: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return state == .normal | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧹 Nitpick | 🔵 Trivial
ButtonState네이밍이 너무 일반적입니다.다른 모듈과의 충돌을 방지하고 일관성을 위해
CherrishButtonState로 이름을 변경하는 것을 고려해 주세요.♻️ 제안된 수정
📝 Committable suggestion
🤖 Prompt for AI Agents