二つの外装 — 金と銀
テーマは Environment 経由で全ビューに配布され、即時に切り替わる。文字盤・針・数字の様式まで含めて外装ごとに造り分ける。
金 — 狩猟時計
紺瑠璃エナメル×金彩ローマ数字(IIII 表記)・三日月と八芒星の中央紋
古金(エイジド真鍮)の彫金ケース。6時位置に次の刻限の小窓
#8F7028
瑠璃 #101838
金彩 #D9B45C
月金 #F2DC96
tint #A67C2E
銀 — 鉄道時計
白文字盤・太いアラビア数字・棒針
秒針は鉄道時計の作法どおり赤で挿す
#9CA3AE
白磁 #FAFAF7
鉄黒 #1A1C22
赤 #B02E2E
tint #44546A
針で時刻を合わせる
DatePicker は使わない。竜頭を巻く所作の代わりに、文字盤の針そのものをドラッグして鳴動時刻を決める。下の文字盤は実際にドラッグできます。
午前7:30
- 角度→時刻変換 — ドラッグ座標を atan2 で角度化し、分針は 6°、時針は 30° 刻みに量子化する(
ClockAngleMathとして純関数化しテスト対象に)。 - 連動 — 分針を回すと時針が 0.5°/分 で追従。0 分をまたぐと時を送る/戻す(45→15 分の跨ぎで判定)。
- 触覚 — 1 分刻みごとに .sensoryFeedback(.selection)。歯車のクリック感を指に返す。
- 選択中の針 — 真鍮色のリング(ノブ)を針の先端に表示し、どちらを操作しているかを示す。
- 確定 — 「この時刻で合わせる」プレートで保存。AlarmKit の Alarm.Schedule.relative に変換される。
刻の濁り — 宵闇と暁
夜が深まるほど、文字盤は魂の器のように紫紺へ濁ってゆく。暁の刻、濁りは光とともに浄化される。日没の刻には、その季節の星座が盤面に浮かび上がって光る。下のスライダーで一日を巡らせてみてください。
21:00宵
- 濁り — 16時から宵にかけて盤面の縁から紫紺の澱が満ち、23時〜4時で最大に。乗算ブレンドの多層グラデーションで、象牙の地色が「器の底」のように沈む。
- 暁の浄化 — 4時〜6時、上方からの光(スクリーン合成)が澱を溶かす。ヒーローの時計は実際の時刻に連動して常時この周期を生きる。
- 季節の星座 — 日没(±2時間)にその季節の星座が金色に浮かぶ。春=しし座 / 夏=さそり座 / 秋=カシオペヤ座 / 冬=オリオン座。夜間は微光で残る。
- SwiftUI 実装 —
TimelineView(.everyMinute)で時刻係数を算出し、Canvas の乗算/スクリーン描画と星座パスの不透明度に反映。
十二宮ノ蓋 — 月替わりの星座紋
蓋の中央には紺瑠璃のエナメルが嵌め込まれ、月が替わるたびにその月の宮(星座)が金で刻み直される。三日月を伴い、和風月名とともに。ヒーローの時計の蓋は、いまの月の紋様を纏っている。
廻ル星宿 — · 星々は奥行きを持ち、宙で廻り続ける。撫でて回せば惰性が乗る
意匠のトーンはアンティーク懐中時計の「瑠璃エナメル×古金」に倣う(参考資料: design-refs/ref-watch.jpg)。星座線は意匠化した略式。SwiftUI では月替わりの紋様を Calendar.current.component(.month) で選択し、Canvas に金彩で描画する。
魔導 — 十二宮の秘蹟
盤面を円を描くように撫で、十二周巻き上げると術が顕現する。夜は魔導(十二宮の12種)、昼は秘術(6種)、蓋を鎖せば封呪(6種) — 実機は三体系24種。この頁の演武は、その中から代表の七種を試せる。
蓋を開きし時の魔法
蓋を鎖せし時の魔法(実機では封呪)
鳴動の刻(刻告鐘の発動時)
刻限が至ると画面全体が金色に明滅し、「刻限、到来せり」の刻印とともに魔法陣が展開する。
- 巻上検出 — 盤面中心まわりの累積回転角を追跡し、2π ごとに一巻。魔法陣の菱形が灯る。4秒間放置で巻きは霧散する。
- 暁光の祓 — 濁りを光で浄化する。盤面が暁の状態へ強制遷移し、金色のバーストが走る。
- 星宿の嵐 — 季節の星座が燃え上がり、星々が時計から飛散する。
- 刻戻し — 針が高速で逆行し、魔法陣が逆回転する。
- 紫電結界 — 紫紺の閃光と衝撃。魔法陣が紫に転じる。
- 紅蓮の焔 — 時計の周囲から火の粉が3D空間を舞い上がる(透視投影パーティクル、揺らぎ付き)。
- 蒼波の渦 — 足元に波紋が広がり、飛沫が重力に引かれて弧を描く。
- 疾風の環 — 風の筋が時計の前後を廻り込みながら周回し、その風圧で時計が揺れる。
- SwiftUI 実装 — 回転検出は
atan2の累積(ClockAngleMath に追加)、魔法は protocolSpellEffectに統一しスロット設定は UserDefaults へ。鳴動時は AlarmKit の alerting 状態を検知して fullScreenCover で大発動。
画面構成
ホームは常に時計。一覧・編集・刻限計は蓋裏の作業面として、同じフェルト地の上に彫金プレートで組む。
汝、刻限を解き放て
次の刻限 — 明日 午前 7:30
長押しでテーマ切替
ホーム(RootView)
刻告鐘
午前7:30
平日 · スヌーズ 9分
午前9:00
週末
午後10:15
一度のみ
一覧(AlarmListView)
時刻を合わせる
午前7:30
ラベル — 「朝の紅茶」 · スヌーズ 9分
この時刻で合わせる編集(AlarmEditorView)
刻限計
刻限計(TimerView)
Live Activity / Dynamic Island
刻限計と刻止計はロック画面と Dynamic Island に生きる。黒地に真鍮の一点差しで、システム UI の中でも懐中時計の气配を保つ。
POCKETCHIME
紅茶の刻限計
4:23
ロック画面 — Text(timerInterval:) で駆動
Dynamic Island(compact)— 左に文字盤、右に残時間
組版と色
書体はシステムのセリフ(New York / ヒラギノ明朝)。数字は等幅数字で刻み、英字ラベルは字間を広く取って彫金の銘に見立てる。
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 + postAlert 9分 |
| 残時間表示 | AlarmAttributes<PocketWatchMetadata> の Live Activity |
| テーマ伝搬 | tintColor と metadata.themeName で Widget まで一貫 |