Release v2.21.0 (#332)
Release — F-Droid repo + Gitea/Codeberg release + Play / detect (push) Successful in 32s
Release — F-Droid repo + Gitea/Codeberg release + Play / release (push) Successful in 14m32s
Release — F-Droid repo + Gitea/Codeberg release + Play / play (push) Successful in 1m33s

Minor release rounding up the 2.21.0 milestone.

- Setup makes sure there is a calendar to write to: it offers to create a local calendar or add a syncing account when the device has none, and lists switched-off calendars so they can be turned back on (#287).
- The month grid gives its days more room: smaller week numbers in a gutter measured from the widest number, less chip padding, tighter label tracking (#189, #190, #212, #213).
- A month day shows as many event chips as its week row has height for, instead of a flat three.
- Split view draws only the rows its month spans instead of padding to six (#162).
- Short events show their title in week and day view (#289).
- A fully zoomed-out timeline no longer scrolls by its rounding leftover (#290).
- Backup & restore has loading, failure and empty states instead of a blank page (#304).
- Untitled events and unnamed calendars use the translated placeholder instead of the hardcoded German one, which the calendar editor could also save into the calendar (#321, #329).

Plus the release commit: CHANGELOG section, versionName 2.21.0 / versionCode 22100, and the en-US 22100 changelog. Merging this to main triggers the release pipeline.

Closes #287
Closes #189
Closes #190
Closes #212
Closes #213
Closes #162
Closes #289
Closes #290
Closes #304
Closes #321
Closes #329

Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de>
Reviewed-on: https://codeberg.org/jlmakiola/calendula/pulls/332
This commit is contained in:
Jean-Luc Makiola
2026-09-24 15:51:06 +02:00
co-authored by makiolaj
parent 5c20c5f6eb
commit 994fa010b8
60 changed files with 2823 additions and 500 deletions
+13
View File
@@ -113,6 +113,19 @@ notice (#75) is a step in front of it rather than a dialog over the app — it
is the only optional step an *already onboarded* install can be given, which
is why it alone is not gated on the wizard being armed.
"Every calendar is switched off" is a *state*, not that announcement, so it
is a step of its own at the front of the flow (#287) rather than another face
of the notice: the notice is settled once and for good, while the state is
derived from the live calendar list on every launch. It lists the calendars
with their own switches — switching one on un-hides it in every other calendar
app too, which is not a choice to make on the app's word — and it sits *in
front of* the calendar step, so declining it falls through to the offer to
make a calendar that a device with none at all gets. That is also why
`calendarsApplies` resolves on "something is visible" rather than "the list is
non-empty". Being derived, it is gated on the wizard being armed: an install
that switched its own calendars off from Settings meant it, and has the in-app
empty state (#239) instead.
## Recurring writes
The provider's invariants drive the design (learned the hard way, verified