- DataStore: App Group 컨테이너의 HaruDanim.store 사용, 기존 default.store 1회 자동 이관 - 프리미엄 + 동기화 토글 시 CloudKit(.private) 구성으로 컨테이너 생성, 실패하면 로컬 폴백 - CloudKit 요건(모든 관계 optional)에 맞춰 to-many 관계를 optional 저장 + 기존 이름 접근자로 리팩터링 (originalName 매핑으로 기존 데이터 유지) - Tag/Action/Goal/Quest에 uuid 추가 (시리 단축어·위젯·워치 식별자) + 중복 보정 - 모델 레이어(Models/Settings/DayMath/QuestProgress/Formatters/Theme)를 Shared/로 이동 — 위젯 확장과 공유 - 집계 설정(주 시작 요일·하루 시작 시간·대표 시간·짧은 기록 무시)을 App Group defaults로 이관해 위젯·워치와 공유, 설정의 '기기 간 동기화' 토글 활성화 - Goal.combinedSpanRatio 공용화 (모음 탭 카드·위젯·시리가 동일 산식 사용) - DEBUG 검증 인자: -cloudSync YES, -settingsScrollPremium YES Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
59 lines
2.1 KiB
Swift
59 lines
2.1 KiB
Swift
//
|
|
// Theme.swift
|
|
// Haru_Danim
|
|
//
|
|
// 컬러 팔레트 (CLAUDE.md §5.2)
|
|
//
|
|
|
|
import SwiftUI
|
|
import UIKit
|
|
|
|
extension Color {
|
|
/// "#RRGGBB" 형식의 hex 문자열로 생성
|
|
init(hex: String) {
|
|
let cleaned = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
|
|
var value: UInt64 = 0
|
|
Scanner(string: cleaned).scanHexInt64(&value)
|
|
let r = Double((value >> 16) & 0xFF) / 255
|
|
let g = Double((value >> 8) & 0xFF) / 255
|
|
let b = Double(value & 0xFF) / 255
|
|
self.init(red: r, green: g, blue: b)
|
|
}
|
|
|
|
/// 라이트/다크 모드에 따라 달라지는 동적 색
|
|
init(light: Color, dark: Color) {
|
|
self.init(uiColor: UIColor { traits in
|
|
traits.userInterfaceStyle == .dark ? UIColor(dark) : UIColor(light)
|
|
})
|
|
}
|
|
|
|
/// "#RRGGBB" hex 문자열로 변환
|
|
var hexString: String {
|
|
let ui = UIColor(self)
|
|
var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
|
|
ui.getRed(&r, green: &g, blue: &b, alpha: &a)
|
|
return String(
|
|
format: "#%02X%02X%02X",
|
|
Int(round(r * 255)), Int(round(g * 255)), Int(round(b * 255))
|
|
)
|
|
}
|
|
}
|
|
|
|
enum AppTheme {
|
|
/// Primary Green: 라이트 딥 모스 그린 / 다크 세이지 민트
|
|
static let green = Color(light: Color(hex: "#2F6B4F"), dark: Color(hex: "#7FBF9E"))
|
|
/// Accent Yellow: 라이트 머스터드 골드 / 다크 소프트 앰버
|
|
static let yellow = Color(light: Color(hex: "#D9A621"), dark: Color(hex: "#E8C558"))
|
|
/// Background: 라이트 웜 화이트 / 다크 그린 틴트 블랙
|
|
static let background = Color(light: Color(hex: "#FAFAF6"), dark: Color(hex: "#111512"))
|
|
/// 카드 등 한 단계 떠 있는 표면
|
|
static let surface = Color(light: .white, dark: Color(hex: "#1B211D"))
|
|
|
|
/// 꼬리표 색 프리셋 (라이트/다크 공용으로 무난한 톤)
|
|
static let tagPresets: [String] = [
|
|
"#2F6B4F", "#D9A621", "#4A7A9D", "#9D5B4A",
|
|
"#7A5C9D", "#4F8A8B", "#C06C84", "#6B705C",
|
|
"#B5651D", "#3D5A80", "#8D6B94", "#588157",
|
|
]
|
|
}
|