두 개의 케이스 - 금과 은
테마는 환경을 통해 모든 보기에 배포되고 즉시 전환됩니다. 문자반, 바늘, 숫자의 스타일도 각 케이스에 맞게 제작되었습니다.
골드 — 헌터 케이스
딥 라피스 에나멜 × 골드 악센트 로마 숫자(IIII 표기) · 중앙 초승달 문양과 팔각별
오래된 금(낡은 황동)이 새겨진 케이스입니다. 6시 위치에 다음 알람을 위한 작은 창이 있습니다.
#8F7028
라피스 #101838
골드 액센트 #D9B45C
문 골드 #F2DC96
색조 #A67C2E
은상 - 철도시계
하얀 문자판 · 굵은 아라비아 숫자 · 배턴 핸즈
초침은 철도시계의 관습에 따라 빨간색으로 설정됩니다.
#9CA3AE
백자 #FAFAF7
아이언 블랙 #1A1C22
빨간색 #B02E2E
색조 #44546A
수동으로 시간 설정하기
DatePicker가 사용되지 않습니다. 크라운을 감는 동작 대신 얼굴 자체의 손을 드래그하여 벨소리 시간을 결정합니다. 아래 면은 실제로 드래그할 수 있습니다.
오전7:30
- Angle-to-Time Conversion — 드래그 좌표는 fatan2를 사용하여 각도로 변환된 다음 분침의 경우 6°, 시침의 경우 30° 단위로 양자화됩니다(순수 함수인
ClockAngleMath로 구현되고 테스트로 다뤄짐). - 연동 — 분침을 돌리면 시침이 0.5°/분씩 따라갑니다. 0분 표시를 지나면 시간이 앞당겨지거나 되돌아갑니다(45분에서 15분을 교차하여 결정).
- Haptics — .sensoryFeedback(.selection)는 1분 간격으로 실행되어 기어 클릭을 손가락으로 되돌려줍니다.
- 선택한 손 - 손 끝에 황동색 링(손잡이)이 표시되어 어느 손이 작동 중인지 나타냅니다.
- 확인 — "이 시간으로 설정" 플레이트를 통해 저장되며 AlarmKit의 Alarm.Schedule.relative로 변환됩니다.
시간의 어둠 - 황혼과 새벽
밤이 깊어질수록 얼굴은 영혼을 담는 그릇처럼 보라색-남색으로 더 많이 흐려집니다. 새벽에는 어둠이 빛으로 정화됩니다. 해가 지면 계절의 별자리가 떠오르고 얼굴 위에서 빛납니다. 하루 동안 이동하려면 아래 슬라이더를 사용해 보세요.
21:00저녁
- Murk — 16:00부터 저녁까지 보라색-남색 찌꺼기가 얼굴 가장자리에서 채워지고 23:00에서 4:00 사이에 최고조에 이릅니다. 다중 혼합의 다층 그라데이션을 통해 상아색 바탕이 "그릇의 바닥"처럼 가라앉습니다.
- Purification of Dawn — between 4:00 and 6:00, light from above (screen blend) dissolves the dregs. The hero watch lives this cycle at all times, synced to the actual time.
- 계절별 별자리 — 일몰 시(±2시간) 계절별 별자리가 황금색으로 떠오릅니다. 봄 = 사자자리 / 여름 = 전갈자리 / 가을 = 카시오페이아자리 / 겨울 = 오리온자리. 밤새도록 희미하게 남아 있습니다.
- SwiftUI 구현 — 시간 계수는
TimelineView(.everyMinute)로 계산되고 캔버스의 곱셈/화면 렌더링 및 별자리 경로의 불투명도에 반영됩니다.
열두 집의 표지 - 매월 별자리 문장
커버 중앙에는 깊은 청금석이 세팅되어 있으며, 새로운 달이 바뀔 때마다 그 달의 집(별자리)이 금으로 다시 새겨져 있으며 초승달과 일본 전통 달 이름이 함께 표시됩니다. 영웅 시계의 표지에는 이번 달의 문장이 새겨져 있습니다.
터닝 하우스 —· 별은 깊이가 있고 공간을 계속 회전합니다. 뇌졸중을 일으키면 추진력이 계속됩니다.
디자인 톤은 앤티크 회중시계의 '라피스 에나멜×에이징 골드'(참조: design-refs/ref-watch.jpg)를 따릅니다. 별자리 선은 양식화되고 단순화된 형태입니다. SwiftUI에서 각 월의 문장은 Calendar.current.comComponent(.month)를 사용하여 선택되고 금색 액센트로 캔버스에 렌더링됩니다.
Arcana — 열두 집의 신비
얼굴을 원으로 쓰다듬고 열두 번 감으면 예술이 나타납니다. 밤에는 Arcana(12종, 집당 1개); 요일별, Solar Arts(6종); 커버를 닫은 상태의 씰(6종) — 실제 기기에서는 3개 시스템에 걸쳐 24종. 이 페이지의 데모를 통해 7가지 대표적인 예를 시도해 볼 수 있습니다.
뚜껑을 열면 나타나는 마법
커버를 닫았을 때의 마법 (실제 장치의 씰)
벨소리 시간(알람 벨이 울릴 때)
시간이 되면 화면 전체가 금색으로 깜박이고 "시간이 다가왔습니다"라는 문구가 적힌 마법진이 펼쳐집니다.
- 권선 감지 — 면 중심을 기준으로 누적 회전 각도를 추적합니다. 2π마다 하나의 권선입니다. 마법진의 다이아몬드가 빛납니다. 4초 동안 그대로 두면 권선이 사라집니다.
- 새벽빛의 정화 — 빛으로 어둠을 정화합니다. 얼굴이 새벽 상태로 바뀌고 금빛이 터져 나옵니다.
- 별자리의 폭풍 — 계절의 별자리가 빛나고, 그 별들은 시계에서 흩어집니다.
- 시간의 되감기 — 손이 빠른 속도로 뒤로 물러나고, 마법진이 역방향으로 회전합니다.
- 보라색 번개의 장벽 — 보라색-남색 섬광과 충격파. 마법진이 보라색으로 변합니다.
- 크림슨 블레이즈 — 불씨는 시계 주변의 3D 공간을 통해 상승합니다(원근 투영 입자, 깜박임 포함).
- 푸른 파도의 소용돌이 — 잔물결은 발 아래로 퍼지고, 중력에 의해 끌려가면서 호를 분사합니다.
- 강풍의 반지 — 시계의 앞뒤로 바람의 흐름이 돌고, 그 압력으로 인해 시계가 흔들리게 됩니다.
- SwiftUI 구현 — 회전 감지는
fatan2를 누적합니다(ClockAngleMath에 추가됨). 마법은 UserDefaults에 저장된 슬롯 설정과 함께SpellEffect프로토콜에 따라 통합됩니다. 벨이 울릴 때 AlarmKit의 경고 상태가 감지되어 fullScreenCover를 통해 웅장한 효과를 트리거합니다.
화면구성
홈 화면은 항상 시계입니다. 목록, 편집기 및 타이머는 표지 안쪽면의 작업 표면으로 제작되었으며, 동일한 펠트 바닥에 새겨진 플레이트가 설정되어 있습니다.
당신은 시간을 자유롭게 정하실 것입니다
다음 알람 — 내일 오전 7시 30분
테마를 전환하려면 길게 누르세요.
홈(루트뷰)
알람벨
오전7:30
평일 · 스누즈 9분
오전9:00
주말
오후10:15
한 번만
목록(AlarmListView)
시간을 설정하세요
오전7:30
라벨 — "Morning Tea" · 스누즈 9분
이 시간으로 설정편집(AlarmEditorView)
시간제 노동자
타이머(TimerView)
Live Activity / 다이나믹 아일랜드
타이머와 스톱워치는 잠금 화면과 Dynamic Island에 표시됩니다. 블랙에 단일 황동 액센트로 시스템 UI 내에서도 회중시계의 존재감을 유지합니다.
POCKETCHIME
티 타이머
4:23
잠금 화면 — Text(timerInterval:)에 의해 구동됨
다이내믹 아일랜드(소형) — 왼쪽에 시계 모드, 오른쪽에 남은 시간
타이포그래피와 색상
서체는 시스템 세리프(뉴욕/히라기노 민초)입니다. 숫자는 표 형식으로 설정되었으며 라틴어 라벨에는 새겨진 비문을 연상시키는 넓은 문자 간격이 제공됩니다.
10:09
시간을 설정하세요
덮개를 열면 하루가 시작됩니다. 바늘을 감고 시간을 기다립니다.
RAILROAD GRADE · EST. 2026
| 펠트지(배경) | #24331F → #0B110A | |
| 잉크 텍스트(본문) | #EFE6CD | |
| 황동(악센트) | #C9A24B | |
| 크림슨(초침, 경고) | #A03A2A | |
| 스틸(실버 테마) | #AEB6C2 |
| 설계 | 구현(DESIGN.md당) |
|---|---|
| 커버 열기 및 닫기 | rotation3DEffect(axis:(0,1,0), anchor:.leading) + spring 1.3s |
| 손의 움직임 | TimelineView(.animation)로 지속적으로 구동 |
| 손을 드래그 | ClockAngleMath(단위 테스트에서 다루는 순수 atan2 함수) |
| 선잠 | secondaryButtonBehavior: .countdown + 9분 postAlert |
| 남은 시간 표시 | Live Activity AlarmAttributes<PocketWatchMetadata>를 통해 |
| 테마 전파 | Consistent through to the Widget via tintColor and metadata.themeName |