Fixed
- Updating the container while the app was open in a browser tab could leave that tab on an error screen naming a module, for example "The requested module '/utils/empty-state.js' does not provide an export named 'mountLoadError'". A browser keeps one set of loaded building blocks per open page and cannot exchange them, so a part of the app fetched after the update was assembled against parts of the previous version that were still in memory. Opening a section that had not been visited yet in that tab, most often Recipes, was enough. The app now stops loading further parts of a page as soon as it knows a new version is available and reloads instead, and it treats a failed load of this kind as a reason to reload once rather than to give up. Reloading the page had always cleared it; the point is that it no longer happens. Updating to this version can still show the error once in a tab that was open across the update, because the safeguard only arrives with the version it protects. It never indicated a damaged database, although the message in the container log at the time suggested one.
- The offline cache stored the pages of the app without the shared building blocks they are made of: 52 of them, among those the module every page uses to insert text safely, were missing. After an update a page could therefore be present in its new form while its foundation was not, which is what made the error above possible in the first place, and offline a page could be complete but unusable. Pages and the modules they rely on are now cached together, and a test walks the whole dependency graph so the next added module cannot quietly reopen the gap.
- The colour field in the appointment dialog was labelled "Color {{color}}" in 16 of the 23 languages, with the placeholder spelled out. It was written into the label as if a value would be filled in there, and nothing ever filled it. English, Spanish, French, Italian, Swedish, Greek, Russian, Turkish, Chinese, Japanese, Arabic, Hindi, Portuguese, Ukrainian, Vietnamese and Hungarian were affected; German and six others had it right, as did the identical label in Notes. A test now compares the placeholders of every translation against the German reference, so a text that promises a value the app does not supply cannot be added again.