diff --git a/.pi/orksorksorks/alanvardy-var-1133-improve-watch-no-reminders-screen/done.md b/.pi/orksorksorks/alanvardy-var-1133-improve-watch-no-reminders-screen/done.md new file mode 100644 index 00000000..06fe5f4c --- /dev/null +++ b/.pi/orksorksorks/alanvardy-var-1133-improve-watch-no-reminders-screen/done.md @@ -0,0 +1,28 @@ +# Done + +- **What was built**: The watchOS "No Reminders" empty state no longer shows the + default "No reminders yet" caption. The caption now renders only when + `hasHidden` is true, keeping the "Nothing due right now" hidden-reminders + variant, and preserving the title and Refresh button. `SharedStrings.noRemindersYet` + and `Localizable.xcstrings` are untouched; the widget's usage still compiles. +- **Commit SHA(s)**: `7c2dae19c13641152876f73d45b549be5b5cc420` (watch empty-state + change), `2b3386f7` (chore: remove DELETEME bootstrap marker). Both pushed. +- **Verification**: `make format`, `make lint` (0 violations), `make watch-build` + (`** BUILD SUCCEEDED **`), `make watch-test` (`** TEST SUCCEEDED **`, watch + unit tests on Apple Watch Series 11 (46mm)). No new unit test required: recon + found no test anywhere references `noRemindersYet`, `nothingDueRightNow`, + "No reminders yet", `emptyStateTitle`, or `noRemindersState`. +- **Reviewer findings**: The `reviewer` child timed out after 30 min in a + degenerate repetition loop; its partial output had no blockers ("The change is + correct. … default 'No reminders yet' caption is removed. Title and Refresh + button preserved."). The parent then completed the review pass itself: + verified `noRemindersState(hasHidden:)` (WatchReminderView.swift:227-238), the + `.empty(hasHidden)` call site (:104), that the watch view no longer references + `noRemindersYet`, and that `SingleThreadWidget/NextThingWidget.swift:126` still + uses both shared strings. No blockers; no nits requiring action. No files were + changed by the reviewer. +- **Remaining manual items**: Visual check of the two watch previews + (`#Preview("No Reminders")`, `#Preview("Nothing Due")`) on-device/simulator; + `VStack(spacing: 6)` was left unchanged since the remaining title + Refresh + stack shows no obvious gap. Full `./scripts/test.sh` gate was intentionally not + run (SMALL task: targeted verify only). \ No newline at end of file diff --git a/.pi/orksorksorks/alanvardy-var-1133-improve-watch-no-reminders-screen/small.md b/.pi/orksorksorks/alanvardy-var-1133-improve-watch-no-reminders-screen/small.md new file mode 100644 index 00000000..e965ed44 --- /dev/null +++ b/.pi/orksorksorks/alanvardy-var-1133-improve-watch-no-reminders-screen/small.md @@ -0,0 +1,48 @@ +# Task + +Improve the watchOS "No Reminders" empty state (VAR-1133). Today the watch empty +state renders three things stacked vertically: + +- the title "No Reminders" +- a caption line that reads either "No reminders yet" (default) or + "Nothing due right now" (when reminders are hidden/skipped) +- a "Refresh" button + +Remove the "No reminders yet" caption text from the watch screen. Keep the title +and the Refresh button. Preserve the hidden-reminders variant ("Nothing due +right now") unless removing the whole caption line is the cleaner, obviously +intended reading — the ticket only names "No reminders yet", so the safest +minimal change is to drop the default caption while keeping the "nothing due" +message when reminders are hidden. Note that `SharedStrings.noRemindersYet` is +also used by `SingleThreadWidget/NextThingWidget.swift`, so do not delete or +change the shared string itself; only the watch view's usage of it. + +Verify the resulting watch empty-state layout still looks correct (spacing in +the `VStack`), adjust spacing only if the removal leaves an obvious gap, and run +the project gate (format, lint, relevant watch build/tests). Since this is a +pure view-copy change, a new unit test is not required unless existing copy +tests assert on the removed string. + +## Why SMALL + +A. Single view file (`SingleThreadWatch/WatchReminderView.swift`, one `VStack` +in `noRemindersState`), no new pattern. +B. No unknowns; the exact line and shared string usage are already located. +C. No schema/migration. +D. No new subsystem/shared-convention change; the shared localization resource +is intentionally left untouched because the widget still uses it. +E. No design decision or human sign-off. +F. No new test surface — existing empty-state tests do not reference this string. + +## Key files + +- `SingleThreadWatch/WatchReminderView.swift` — `noRemindersState(hasHidden:)` + (~line 228) renders the title, the caption, and `refreshButton`. +- `SingleThreadCore/Sources/SingleThreadCore/LocalizedString+Shared.swift` — + `SharedStrings.noRemindersYet` (~line 101) is shared with the widget; leave it. +- `SingleThreadWidget/NextThingWidget.swift:~126` — other consumer of + `noRemindersYet`; must keep working. +- `SingleThreadCore/Sources/SingleThreadCore/Resources/Localizable.xcstrings` — + "No reminders yet" entry stays because the widget still uses it. +- `SingleThreadWatch/WatchReminderView.swift:436` — `#Preview("No Reminders")` + for manual visual check. diff --git a/SingleThreadWatch/WatchReminderView.swift b/SingleThreadWatch/WatchReminderView.swift index c889173d..3b238879 100644 --- a/SingleThreadWatch/WatchReminderView.swift +++ b/SingleThreadWatch/WatchReminderView.swift @@ -229,10 +229,12 @@ struct WatchReminderView: View { Text(SharedStrings.noReminders) .foregroundStyle(.secondary) .accessibilityIdentifier("emptyStateTitle") - Text(hasHidden ? SharedStrings.nothingDueRightNow : SharedStrings.noRemindersYet) - .font(.caption2) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) + if hasHidden { + Text(SharedStrings.nothingDueRightNow) + .font(.caption2) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } refreshButton } }