Add the region map, permanent attribution and the Sources screen

Puts a MapLibre map on screen framed on the region, with the credit
obligations that come with showing third-party data satisfied structurally
rather than by remembering to add a label.

The base map style comes from MAP_STYLE_URL, and with no key configured the
app generates a fallback style from the region's own bounding box: a flat
background and the extent outline, no network sources at all. That keeps a
fresh clone runnable offline without pulling in a boundary dataset that would
carry its own licence, and it deliberately looks like a placeholder so it is
not mistaken for a finished map.

Attribution is driven by what is actually rendered. The bar lists the credits
for the active sources only, because crediting OpenStreetMap while showing the
fallback style would be a false attribution, and it says plainly when no base
map is configured. It sits below the map rather than floating over it so no
map control or gesture overlay can occlude a credit that the ODbL and CC BY-SA
terms require to be visible.

The Sources screen leads with the independence disclaimer, before the sources
it qualifies, so a reader who stops after the first screenful has still seen
it. Sources with no stated licence — ARPA publishes none for the alert
bulletin — say so explicitly rather than being shown bare or given an invented
one. A separate note explains that the rendered radar frames inherit CC BY-SA
from the DPC source data.

Also declares the INTERNET permission in the main manifest: Flutter injects it
into the debug and profile manifests only, so a release build would otherwise
fail every request on device.

Verified: analyze clean, 66 tests passing, appbundle builds with the native
MapLibre plugin. Not verified visually — this machine has no Android device or
emulator image, so nobody has watched the map render.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 11:35:14 +02:00
co-authored by Claude Opus 5
parent 85b2c99949
commit d84095b5a8
13 changed files with 998 additions and 57 deletions
+42 -6
View File
@@ -1,11 +1,9 @@
{
"@@locale": "it",
"appTitle": "Nuvolari",
"@appTitle": {
"description": "Application name, shown in the task switcher and the app bar"
},
"navRadar": "Radar",
"@navRadar": {
"description": "Bottom navigation label for the radar map"
@@ -18,7 +16,6 @@
"@navAlerts": {
"description": "Bottom navigation label for the official weather alerts"
},
"sourcesTitle": "Fonti e licenze",
"@sourcesTitle": {
"description": "Title of the screen listing data sources, licenses and the disclaimer"
@@ -31,12 +28,10 @@
"@sourcesDisclaimerBody": {
"description": "Disclaimer text. Must never be shortened in a way that drops the independence statement or the primacy of official channels."
},
"regionPiemonte": "Piemonte",
"@regionPiemonte": {
"description": "Display name of the Piedmont region"
},
"demoModeBanner": "Modalità dimostrativa: i dati radar sono di esempio",
"@demoModeBanner": {
"description": "Banner shown when the app runs on the mock radar source instead of live data"
@@ -55,7 +50,6 @@
}
}
},
"loading": "Caricamento…",
"@loading": {
"description": "Generic loading indicator label"
@@ -63,5 +57,47 @@
"retry": "Riprova",
"@retry": {
"description": "Button label to retry a failed operation"
},
"sourcesLink": "Fonti",
"@sourcesLink": {
"description": "Short label on the map attribution bar that opens the Sources screen"
},
"baseMapNotConfigured": "Mappa base non configurata",
"@baseMapNotConfigured": {
"description": "Shown on the attribution bar when no MAP_STYLE_URL is set and the offline fallback style is in use"
},
"sourcesDataSection": "Sorgenti dati",
"@sourcesDataSection": {
"description": "Section heading listing the data sources and their licenses"
},
"sourcesLicenseLabel": "Licenza: {license}",
"@sourcesLicenseLabel": {
"description": "License line under a data source",
"placeholders": {
"license": {
"type": "String",
"example": "CC BY-SA"
}
}
},
"sourcesNoLicenseStated": "Nessuna licenza dichiarata dalla fonte",
"@sourcesNoLicenseStated": {
"description": "Shown for a source that publishes no explicit license; we credit and link it without claiming any reuse right"
},
"sourcesShareAlikeTitle": "Dati derivati",
"@sourcesShareAlikeTitle": {
"description": "Heading of the note explaining that rendered radar frames inherit CC BY-SA"
},
"sourcesShareAlikeBody": "Le immagini radar mostrate sono un'elaborazione dei dati Radar-DPC, distribuiti con licenza CC BY-SA. Anche le immagini elaborate sono quindi CC BY-SA.",
"@sourcesShareAlikeBody": {
"description": "Explains the share-alike obligation inherited from the Radar-DPC source data"
},
"sourcesOfficialBulletin": "Bollettino ufficiale Arpa Piemonte",
"@sourcesOfficialBulletin": {
"description": "Link to the official alert bulletin, shown next to any alert level we republish"
},
"openLink": "Apri",
"@openLink": {
"description": "Accessibility label for a button that opens a link in the browser"
}
}