A warm, emotional Chinese-language anniversary & countdown iOS app — SwiftUI, iOS 17+. Implementation of the Anthropic Design handoff bundle in _design/days-remember/.
| Capability | Wiring |
|---|---|
| Local notifications | Store/NotificationManager.swift schedules dr.day.<id>.pre.<offset> requests via UNUserNotificationCenter. Authorization is requested on first launch, schedule re-syncs on day add/edit/delete and on every reminder-toggle change in 提醒. Quiet-hours toggle pushes any 22:00–08:00 trigger past 08:00. |
| WidgetKit | DaysRememberWidget/ extension target with Small / Medium / Large families. Reads days through the group.com.shiguang.daysremember App Group (Store/SharedStorage.swift); the app calls WidgetCenter.shared.reloadAllTimelines() on every day change. Refreshes at the next midnight. |
| PhotosPicker | AddDayView exposes a PhotosPicker tile alongside the gradient palette. Picked images are JPEG-compressed (max 1600px) and stored on Day.photoData. PhotoTile(day:) renders the image when present, falls back to the gradient otherwise — the change cascades through Home, Detail, Calendar, Share. |
| Share sheet | ShareCardView renders the chosen template via ImageRenderer, then routes 微信 / 朋友圈 / 小红书 / 更多 buttons through UIActivityViewController. The 保存 button writes the rendered card to Photos via PHPhotoLibrary (requires NSPhotoLibraryAddUsageDescription). |
Out of scope: WeChat-/小红书-specific SDK integrations are intentionally not wired — the system share sheet routes to whatever messaging apps the user has installed.
This project uses XcodeGen to generate DaysRemember.xcodeproj from project.yml.
brew install xcodegen
xcodegen generate
open DaysRemember.xcodeprojThen run on the iPhone 15 simulator (iOS 17.5+).
The app falls back to Songti SC (serif) and PingFang SC (sans), both bundled with iOS, so it will render correctly without any extra setup. For pixel-faithful match with the design, drop the following TTFs into DaysRemember/Resources/Fonts/ and add them to UIAppFonts in Info.plist:
NotoSerifSC-Regular.ttf,NotoSerifSC-Medium.ttf,NotoSerifSC-SemiBold.ttfNotoSansSC-Regular.ttf,NotoSansSC-Medium.ttf,NotoSansSC-SemiBold.ttf
Theme.serif() / Theme.sans() already prefer Noto when present and degrade silently when not.
See /Users/suny/.claude/plans/fetch-this-design-file-optimized-lagoon.md (the approved plan) for the full file map and design-token correspondence to the prototype CSS.
Open the prototype at _design/days-remember/project/Days Remember.html in any browser to see the source artboards side-by-side with the running app.
For inspecting individual screens without manual navigation, the app reads a few launch arguments (debug only — production launches ignore them):
# Pin "today" to 2026-04-23 (the prototype's reference date) so countdowns match the design.
# (`SIMCTL_CHILD_*` env vars are forwarded to the launched app by simctl.)
SIMCTL_CHILD_DR_PIN_TODAY=1 xcrun simctl launch <device> com.shiguang.daysremember
# Open a specific tab on launch
xcrun simctl launch <device> com.shiguang.daysremember --tab calendar # home | calendar | categories | notifications
# Open a specific screen directly (bypasses the tab shell)
xcrun simctl launch <device> com.shiguang.daysremember --screen detail --day wedding
xcrun simctl launch <device> com.shiguang.daysremember --screen add
xcrun simctl launch <device> com.shiguang.daysremember --screen share --day japan
xcrun simctl launch <device> com.shiguang.daysremember --screen widgets
xcrun simctl launch <device> com.shiguang.daysremember --screen onboarding --page 2--day accepts any sample id from Models/SampleData.swift (wedding, baby, birthday, midautumn, japan, kaoyan, firstmet, work, dog, moved).