From 3d39c954194c24efe08bbb8faed725a9d1160904 Mon Sep 17 00:00:00 2001 From: Jonas Hertner Date: Sat, 22 Aug 2026 19:17:23 +0200 Subject: [PATCH] Perfect responsive navigation and evidence access --- .github/workflows/pages.yml | 2 + GOVERNANCE.md | 9 ++- build/14-pages.py | 2 +- build/pages/de.json | 5 ++ build/pages/fr.json | 5 ++ build/pages/index.en.html | 9 +-- build/pages/it.json | 5 ++ build/pages/rm.json | 5 ++ scripts/verify-site.mjs | 26 ++++++++ site/about.html | 16 +++-- site/app.js | 127 ++++++++++++++++++++++++++++++++---- site/data/provenance.json | 2 +- site/de/about.html | 12 ++-- site/de/index.html | 9 +-- site/de/law.html | 4 +- site/de/method.html | 4 +- site/de/sources.html | 4 +- site/en/index.html | 9 +-- site/fr/about.html | 12 ++-- site/fr/index.html | 9 +-- site/fr/law.html | 4 +- site/fr/method.html | 4 +- site/fr/sources.html | 4 +- site/i18n-map.js | 61 ++++++++++++++++- site/index.html | 9 +-- site/it/about.html | 12 ++-- site/it/index.html | 9 +-- site/it/law.html | 4 +- site/it/method.html | 4 +- site/it/sources.html | 4 +- site/law.html | 4 +- site/method.html | 4 +- site/rm/about.html | 12 ++-- site/rm/index.html | 9 +-- site/rm/law.html | 4 +- site/rm/method.html | 4 +- site/rm/sources.html | 4 +- site/site.js | 15 +++-- site/sources.html | 4 +- site/style.css | 53 ++++++++++++--- 40 files changed, 382 insertions(+), 122 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index ca6936d..c1dbedc 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -33,6 +33,8 @@ jobs: - run: npm ci - name: Verify the complete publication surface run: npm test + - name: Check primary external links + run: npm run check:links refresh-review: if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && inputs.refresh_data) diff --git a/GOVERNANCE.md b/GOVERNANCE.md index e794f3a..9050472 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -7,9 +7,12 @@ publication process; no maintainer owns the underlying facts. - Scientific claims require a primary source, data date and stated limitation. - Legal claims require the operative text, jurisdiction and date checked. -- Material data, method and copy changes are made by pull request. -- At least one review is required before `main` changes. Authors do not approve - their own pull requests. +- Material data, method and copy changes require a pull request and passing + publication checks. +- Independent scientific or legal review is required before a contribution is + described as reviewed or relied upon; authors do not certify their own + specialist review. Until independent reviewers participate, merges are + maintainer decisions and the review status remains explicit. - Generated data refreshes receive the same review as hand-written changes. - Uncertainty is disclosed next to the claim it qualifies. diff --git a/build/14-pages.py b/build/14-pages.py index 337028a..2f97395 100644 --- a/build/14-pages.py +++ b/build/14-pages.py @@ -37,7 +37,7 @@ 'svg', 'script', 'style'} OPAQUE = {'svg', 'script', 'style'} VOID = {'meta', 'link', 'br', 'hr', 'img', 'input', 'source', 'wbr', 'col', 'area'} -ATTRS = ('title', 'aria-label', 'alt', 'placeholder') +ATTRS = ('title', 'aria-label', 'aria-roledescription', 'alt', 'placeholder') META = ('description', 'og:title', 'og:description', 'og:site_name', 'og:image:alt') ENTITY = re.compile(r'&(?:#\d+|#x[0-9a-fA-F]+|[a-zA-Z]+);') diff --git a/build/pages/de.json b/build/pages/de.json index 3e8c37f..4c2017d 100644 --- a/build/pages/de.json +++ b/build/pages/de.json @@ -22,6 +22,8 @@ "The Swiss river network beside the title Water and ice in Switzerland, with counts for river reaches, dams and glacier bodies.": "Das Schweizer Flussnetz neben dem Titel Wasser und Eis in der Schweiz, mit Zahlen zu Gewässerabschnitten, Stauanlagen und Gletscherkörpern.", "Swiss rivers, live. Reservoirs against 26 years of their own record. Glaciers across five dated inventories. A measured base layer for legal work on climate.": "Schweizer Fliessgewässer, live. Speicherseen gegen 26 Jahre der eigenen Reihe. Gletscher über fünf datierte Inventare. Eine gemessene Grundlage für die juristische Arbeit am Klima.", "Skip to the layer controls": "Direkt zur Ebenensteuerung", + "Skip to the interactive map": "Direkt zur interaktiven Karte", + "interactive map": "interaktive Karte", "Rivers read live from the federal gauges. Ice across five surveys. Reservoirs against their own record.": "Flüsse live aus den Messstellen des Bundes gelesen. Eis über fünf Aufnahmen. Speicherseen gegen die eigene Reihe.", "Loading…": "Wird geladen…", "What is drawn, by class of evidence": "Was gezeichnet ist, nach Beweisklasse", @@ -127,6 +129,9 @@ "Prior art": "Bestehende Arbeiten", "Colophon": "Kolophon", "A measured base layer, and an argument about age": "Eine gemessene Grundlage und ein Argument über das Alter", + "Follow the water. Protect its pathways.": "Dem Wasser folgen. Seine Wege schützen.", + "Riverflow makes Switzerland’s water cycle observable—from mountain precipitation, snow and ice to groundwater, rivers, lakes, wetlands, use and return. The purpose is practical: detect change, test whether essential pathways are protected, and support evidence-led legal action when they are not.": "Riverflow macht den Wasserkreislauf der Schweiz beobachtbar – vom Niederschlag im Gebirge, von Schnee und Eis bis zu Grundwasser, Flüssen, Seen, Feuchtgebieten, Nutzung und Rückführung. Der Zweck ist praktisch: Veränderungen erkennen, den Schutz wesentlicher Wege prüfen und rechtliche Schritte auf Belege stützen, wenn der Schutz versagt.", + "Last revised 22.08.2026. Sources and comparisons were checked against their published records.": "Zuletzt überarbeitet am 22.08.2026. Quellen und Vergleiche wurden anhand der veröffentlichten Unterlagen geprüft.", "Switzerland is upstream of four European sea basins, and almost everything published about that water is inference over registers that are years old. The inference is unavoidable. Hiding it is not.": "Die Schweiz liegt oberhalb von vier europäischen Meereseinzugsgebieten, und fast alles, was über dieses Wasser publiziert wird, ist Schluss aus Registern, die Jahre alt sind. Der Schluss ist unvermeidlich. Ihn zu verbergen ist es nicht.", "Last revised 19.08.2026. Prior art checked the same day, by fetching rather than from memory.": "Zuletzt überarbeitet am 19.08.2026. Die bestehenden Arbeiten am selben Tag geprüft, durch Abruf und nicht aus dem Gedächtnis.", "One country, four seas": "Ein Land, vier Meere", diff --git a/build/pages/fr.json b/build/pages/fr.json index 7786173..dab61c0 100644 --- a/build/pages/fr.json +++ b/build/pages/fr.json @@ -22,6 +22,8 @@ "The Swiss river network beside the title Water and ice in Switzerland, with counts for river reaches, dams and glacier bodies.": "Le réseau hydrographique suisse à côté du titre L’eau et la glace en Suisse, avec le nombre de tronçons, de barrages et de corps glaciaires.", "Swiss rivers, live. Reservoirs against 26 years of their own record. Glaciers across five dated inventories. A measured base layer for legal work on climate.": "Les cours d’eau suisses, en direct. Les retenues face à 26 ans de leur propre série. Les glaciers à travers cinq inventaires datés. Une base mesurée pour le travail juridique sur le climat.", "Skip to the layer controls": "Aller aux commandes des couches", + "Skip to the interactive map": "Aller à la carte interactive", + "interactive map": "carte interactive", "Rivers read live from the federal gauges. Ice across five surveys. Reservoirs against their own record.": "Cours d’eau lus en direct depuis les stations de la Confédération. Glace à travers cinq relevés. Retenues face à leur propre série.", "Loading…": "Chargement…", "What is drawn, by class of evidence": "Ce qui est dessiné, par classe de preuve", @@ -127,6 +129,9 @@ "Prior art": "État de l’existant", "Colophon": "Colophon", "A measured base layer, and an argument about age": "Une base mesurée, et un argument sur l’âge", + "Follow the water. Protect its pathways.": "Suivre l’eau. Protéger ses voies.", + "Riverflow makes Switzerland’s water cycle observable—from mountain precipitation, snow and ice to groundwater, rivers, lakes, wetlands, use and return. The purpose is practical: detect change, test whether essential pathways are protected, and support evidence-led legal action when they are not.": "Riverflow rend observable le cycle de l’eau en Suisse — des précipitations en montagne, de la neige et de la glace jusqu’aux eaux souterraines, aux cours d’eau, aux lacs, aux zones humides, aux usages et aux retours. Le but est concret : détecter les changements, vérifier si les voies essentielles sont protégées et étayer une action en justice lorsqu’elles ne le sont pas.", + "Last revised 22.08.2026. Sources and comparisons were checked against their published records.": "Dernière révision le 22.08.2026. Les sources et les comparaisons ont été vérifiées à partir des documents publiés.", "Switzerland is upstream of four European sea basins, and almost everything published about that water is inference over registers that are years old. The inference is unavoidable. Hiding it is not.": "La Suisse se trouve en amont de quatre bassins maritimes européens, et presque tout ce qui se publie sur cette eau est une inférence tirée de registres vieux de plusieurs années. L’inférence est inévitable. La cacher ne l’est pas.", "Last revised 19.08.2026. Prior art checked the same day, by fetching rather than from memory.": "Dernière révision le 19.08.2026. L’état de l’existant a été vérifié le même jour, en consultant les sources et non de mémoire.", "One country, four seas": "Un pays, quatre mers", diff --git a/build/pages/index.en.html b/build/pages/index.en.html index 9d50e84..ca1d16f 100644 --- a/build/pages/index.en.html +++ b/build/pages/index.en.html @@ -33,14 +33,15 @@ - + - + +
@@ -85,7 +86,7 @@

Water and ice in Switzerland

- +

@@ -466,6 +467,6 @@

Follow the water. Protect its pathways.

- + diff --git a/build/pages/it.json b/build/pages/it.json index 7af2886..4591fd4 100644 --- a/build/pages/it.json +++ b/build/pages/it.json @@ -22,6 +22,8 @@ "The Swiss river network beside the title Water and ice in Switzerland, with counts for river reaches, dams and glacier bodies.": "La rete idrografica svizzera accanto al titolo Acqua e ghiaccio in Svizzera, con il numero di tratti, dighe e corpi glaciali.", "Swiss rivers, live. Reservoirs against 26 years of their own record. Glaciers across five dated inventories. A measured base layer for legal work on climate.": "I corsi d’acqua svizzeri, in diretta. I bacini di accumulazione contro 26 anni della propria serie. I ghiacciai attraverso cinque inventari datati. Una base misurata per il lavoro giuridico sul clima.", "Skip to the layer controls": "Vai ai comandi dei livelli", + "Skip to the interactive map": "Vai alla carta interattiva", + "interactive map": "carta interattiva", "Rivers read live from the federal gauges. Ice across five surveys. Reservoirs against their own record.": "Corsi d’acqua letti in diretta dalle stazioni della Confederazione. Ghiaccio attraverso cinque rilievi. Bacini di accumulazione contro la propria serie.", "Loading…": "Caricamento…", "What is drawn, by class of evidence": "Che cosa è disegnato, per classe di prova", @@ -127,6 +129,9 @@ "Prior art": "Quel che esiste già", "Colophon": "Colophon", "A measured base layer, and an argument about age": "Una base misurata, e un argomento sull’età", + "Follow the water. Protect its pathways.": "Seguire l’acqua. Proteggere i suoi percorsi.", + "Riverflow makes Switzerland’s water cycle observable—from mountain precipitation, snow and ice to groundwater, rivers, lakes, wetlands, use and return. The purpose is practical: detect change, test whether essential pathways are protected, and support evidence-led legal action when they are not.": "Riverflow rende osservabile il ciclo dell’acqua in Svizzera: dalle precipitazioni in montagna, dalla neve e dal ghiaccio fino alle acque sotterranee, ai fiumi, ai laghi, alle zone umide, agli usi e alle restituzioni. Lo scopo è concreto: rilevare i cambiamenti, verificare se i percorsi essenziali sono protetti e sostenere azioni legali basate su prove quando non lo sono.", + "Last revised 22.08.2026. Sources and comparisons were checked against their published records.": "Ultima revisione il 22.08.2026. Fonti e confronti sono stati verificati sui documenti pubblicati.", "Switzerland is upstream of four European sea basins, and almost everything published about that water is inference over registers that are years old. The inference is unavoidable. Hiding it is not.": "La Svizzera sta a monte di quattro bacini marittimi europei, e quasi tutto ciò che si pubblica su quest’acqua è inferenza su registri vecchi di anni. L’inferenza è inevitabile. Nasconderla non lo è.", "Last revised 19.08.2026. Prior art checked the same day, by fetching rather than from memory.": "Ultima revisione il 19.08.2026. Quel che esiste già è stato verificato lo stesso giorno, consultando le fonti e non a memoria.", "One country, four seas": "Un Paese, quattro mari", diff --git a/build/pages/rm.json b/build/pages/rm.json index b0e421f..eda79b0 100644 --- a/build/pages/rm.json +++ b/build/pages/rm.json @@ -22,6 +22,8 @@ "The Swiss river network beside the title Water and ice in Switzerland, with counts for river reaches, dams and glacier bodies.": "La rait da flums svizra sper il titel Aua e glatsch en Svizra, cun las cifras da las partidas da flum, las serras ed ils corps da glatscher.", "Swiss rivers, live. Reservoirs against 26 years of their own record. Glaciers across five dated inventories. A measured base layer for legal work on climate.": "Ils flums svizzers, en direct. Ils lais da serra cunter ventgasis onns da lur atgna seria. Ils glatschers sur tschintg inventaris datads. Ina basa mesirada per la lavur giuridica davart il clima.", "Skip to the layer controls": "Directamain als reglers dals nivels", + "Skip to the interactive map": "Directamain a la charta interactiva", + "interactive map": "charta interactiva", "Rivers read live from the federal gauges. Ice across five surveys. Reservoirs against their own record.": "Flums legids en direct ord las staziuns da la Confederaziun. Glatsch sur tschintg relevaziuns. Lais da serra cunter lur atgna seria.", "Loading…": "Vegn chargià…", "What is drawn, by class of evidence": "Quai ch’è dissegnà, tenor classa da cumprova", @@ -127,6 +129,9 @@ "Prior art": "Quai ch’exista gia", "Colophon": "Colophon", "A measured base layer, and an argument about age": "Ina basa mesirada, ed in argument davart la vegliadetgna", + "Follow the water. Protect its pathways.": "Suandar l’aua. Proteger ses percurs.", + "Riverflow makes Switzerland’s water cycle observable—from mountain precipitation, snow and ice to groundwater, rivers, lakes, wetlands, use and return. The purpose is practical: detect change, test whether essential pathways are protected, and support evidence-led legal action when they are not.": "Riverflow renda observabel il ciclus da l’aua en Svizra – da la precipitaziun en muntogna, da la naiv e dal glatsch fin a l’aua sutterrana, ils flums, ils lais, las zonas umidas, il diever e la restituziun. La finamira è pratica: percorscher midadas, controllar sche ils percurs essenzials èn protegids e sustegnair pass giuridics basads sin cumprovas, sch’els n’èn betg protegids.", + "Last revised 22.08.2026. Sources and comparisons were checked against their published records.": "Ultima revisiun ils 22.08.2026. Las funtaunas e las cumparegliaziuns èn vegnidas controlladas tenor ils documents publitgads.", "Switzerland is upstream of four European sea basins, and almost everything published about that water is inference over registers that are years old. The inference is unavoidable. Hiding it is not.": "La Svizra sa chatta survart quatter bacins da mar europeics, e quasi tut quai che vegn publitgà davart questa aua è ina conclusiun tratga ord registers vegls dad onns. La conclusiun n’è betg evitabla. La zuppentar è.", "Last revised 19.08.2026. Prior art checked the same day, by fetching rather than from memory.": "Ultima revisiun ils 19.08.2026. Quai ch’exista gia è vegnì controllà il medem di, cun consultar las funtaunas e betg ord memoria.", "One country, four seas": "In pajais, quatter mars", diff --git a/scripts/verify-site.mjs b/scripts/verify-site.mjs index 3b9a13e..69a7840 100644 --- a/scripts/verify-site.mjs +++ b/scripts/verify-site.mjs @@ -158,6 +158,10 @@ for (const file of landingFiles) { !/]*for=["']dataSearch["']/i.test(raw)) { fail(file, 'active layers need a searchable semantic data-table alternative to the canvases'); } + if (!/]*class=["']skip["'][^>]*href=["']#map["']/i.test(raw) || + !/]*id=["']map["'][^>]*tabindex=["']0["'][^>]*role=["']application["'][^>]*aria-roledescription=/i.test(raw)) { + fail(file, 'interactive map needs a direct skip link and an explicit keyboard-operable role'); + } if (!/]*id=["']liveAlerts["'][\s\S]*?]*id=["']liveAlertsToggle["'][\s\S]*?]*id=["']liveAlertsList["']/i.test(raw) || !/fedlex\.admin\.ch\/eli\/cc\/1998\/2863_2863_2863\/de/i.test(raw) || !/lindas\.admin\.ch\/query/i.test(raw) || @@ -225,6 +229,9 @@ for (const [label, pattern] of [ ['stacked portrait workspace', /@media \(max-width:\s*900px\) and \(orientation:\s*portrait\)[\s\S]*?#workspace\s*\{[^}]*height:\s*var\(--workspace-h\)[\s\S]*?#map, #flow\s*\{[^}]*width:\s*100vw;[^}]*height:\s*calc\(100dvh - var\(--workspace-h\)\)/s], ['compact short-landscape rail', /@media \(max-height:\s*560px\) and \(orientation:\s*landscape\)[\s\S]*?#workspace #modes\s*\{[^}]*overflow-x:\s*auto/s], ['discoverable narrow layer rail', /#workspace #modeRail\.canScrollForward \.modeRailCue-end\s*\{\s*opacity:\s*1/s], + ['non-overlapping column layer index', /#workspace #modeRail\s*\{[^}]*position:\s*static/s], + ['compact smallest-phone layer picker', /@media \(max-width:\s*480px\)[\s\S]*?#workspace #modeRail\s*\{\s*display:\s*none;[\s\S]*?#workspace #mobileModePicker\s*\{[^}]*display:\s*grid/s], + ['mobile data cards without horizontal clipping', /#dataView tr\s*\{[^}]*display:\s*grid;[^}]*grid-template-columns:[^}]*minmax\(0,\s*1fr\)/s], ['useful smallest-phone evidence height', /@media \(max-width:\s*480px\) and \(max-height:\s*650px\) and \(orientation:\s*portrait\)\s*\{[\s\S]*?--workspace-h:\s*62dvh/s], ['sidebar project brief', /#workspace #intro\s*\{[^}]*position:\s*absolute;[^}]*inset:\s*0;[^}]*height:\s*100%/s], ['sidebar map readout', /#workspace #tooltip\s*\{[^}]*position:\s*static;[^}]*border-bottom:/s], @@ -284,6 +291,10 @@ const siteSource = readFileSync(join(site, 'site.js'), 'utf8'); if (!/function restoreDeepLink\(\)[\s\S]*?target\.scrollIntoView\(\{ block: 'start' \}\)[\s\S]*?new ResizeObserver\(align\)/.test(siteSource)) { fail(join(site, 'site.js'), 'late data layout can displace direct section links'); } +if (!/if \(disclosure && !wide\.matches\) disclosure\.open = false/.test(siteSource) || + !/resizeDisclosure[\s\S]*?disclosure\.open = e\.matches/.test(siteSource)) { + fail(join(site, 'site.js'), 'narrow reading pages do not start with a compact contents disclosure'); +} if (/tt\.style\.(?:left|top)\s*=/.test(appSource)) { fail(join(site, 'app.js'), 'map readout must live in the evidence workspace instead of floating over geography'); } @@ -300,6 +311,21 @@ for (const name of ['loadIce', 'loadUsers', 'loadReservoirs', 'loadResidual', 'l if (!/const DATA_PAGE\s*=\s*50/.test(appSource) || !/function renderDataView\(/.test(appSource)) { fail(join(site, 'app.js'), 'accessible data view is not implemented or paginated'); } +if (!/mobileModeSelect\.addEventListener\(['"]change['"]/.test(appSource) || + !/function updateLayerStatus\(\)/.test(appSource)) { + fail(join(site, 'app.js'), 'compact layer choice or layer-specific publication status is missing'); +} +if (!/td\.dataset\.label\s*=\s*headers\[index\]/.test(appSource) || + !/`\$\{nm\.n\} · \$\{identity\}`/.test(appSource)) { + fail(join(site, 'app.js'), 'mobile data cards lack field labels or river rows lack unique reach identity'); +} + +const workflowFile = join(root, '.github', 'workflows', 'pages.yml'); +const workflow = readFileSync(workflowFile, 'utf8'); +const validateJob = /\n validate:\n([\s\S]*?)(?=\n [a-z][\w-]*:\n)/.exec(workflow)?.[1] ?? ''; +if (!/npm test/.test(validateJob) || !/npm run check:links/.test(validateJob)) { + fail(workflowFile, 'pull-request validation must run both publication and primary external-link checks'); +} try { const fmtFile = join(site, 'fmt.js'); const fmtSandbox = {}; diff --git a/site/about.html b/site/about.html index 8248fc0..253018d 100644 --- a/site/about.html +++ b/site/about.html @@ -30,7 +30,7 @@ - + @@ -79,11 +79,13 @@
-

About

-

A measured base layer, and an argument about age

-

Switzerland sits upstream of four European seas. Much of the published picture - is inference over old registers. Inference is unavoidable. Hiding it is not.

- +

Project

+

Follow the water. Protect its pathways.

+

Riverflow makes Switzerland’s water cycle observable—from mountain precipitation, + snow and ice to groundwater, rivers, lakes, wetlands, use and return. The purpose is practical: + detect change, test whether essential pathways are protected, and support evidence-led legal + action when they are not.

+
@@ -348,6 +350,6 @@

Colophon

- + diff --git a/site/app.js b/site/app.js index 6040708..061b086 100644 --- a/site/app.js +++ b/site/app.js @@ -86,6 +86,30 @@ for (const [side, arrow] of [['start', '\u2039'], ['end', '\u203a']]) { modeRail.append(cue); } +// A phone does not have enough width for ten layer names in a horizontal strip. +// Mirror the same grouped controls in one native selector: it is compact, fully +// keyboard accessible and opens as the platform's own touch-sized choice sheet. +const mobileModePicker = document.createElement('label'); +mobileModePicker.id = 'mobileModePicker'; +const mobileModeLabel = document.createElement('span'); +mobileModeLabel.textContent = T('m.chooseLayer'); +const mobileModeSelect = document.createElement('select'); +mobileModeSelect.id = 'modeSelect'; +mobileModeSelect.setAttribute('aria-label', T('m.chooseLayer')); +for (const group of layerModes.querySelectorAll('.modeGroup')) { + const options = document.createElement('optgroup'); + options.label = group.querySelector('.modeGroupLabel')?.textContent.trim() || T('m.chooseLayer'); + for (const button of group.querySelectorAll('button[data-mode]')) { + const option = document.createElement('option'); + option.value = button.dataset.mode; + option.textContent = button.textContent.trim(); + options.append(option); + } + mobileModeSelect.append(options); +} +mobileModePicker.append(mobileModeLabel, mobileModeSelect); +modeRail.before(mobileModePicker); + // The map remains the working surface; prose can become a reading surface on // demand. The same full-screen mode is used for legal review, selected features // and the first-visit brief, so users learn one way in and one way back. @@ -664,7 +688,10 @@ async function refresh(auto = false) { applyLive(); invalidate(); dirtyAlloc = true; if (auto) stampText(); - else document.getElementById('stamp').textContent = T('m.liveFail', { e: e.message }); + else { + liveFlowStatus = T('m.liveFail', { e: e.message }); + updateLayerStatus(); + } liveBackoff = Math.min(liveBackoff ? liveBackoff * 2 : 60000, LIVE_CADENCE); } finally { if (!auto) { btn.disabled = false; btn.textContent = T('m.refresh'); } @@ -785,20 +812,82 @@ function updateEvidence() { })); } -function stampText() { +let liveFlowStatus = T('m.reading'); + +function updateLayerStatus() { const el = document.getElementById('stamp'); + if (!el) return; + if (mode === 'flow' || mode === 'normal') { + el.textContent = liveFlowStatus; + return; + } + if (mode === 'temp') { + const current = stations.filter(s => Number.isFinite(s.obs?.temp)); + const newest = current.map(s => s.rawObs?.time).filter(Boolean).sort().at(-1); + el.textContent = current.length + ? T('m.statusTemp', { n: nf(current.length), t: newest ? fmtStamp(new Date(newest)) : T('m.unstated') }) + : T('m.noTemp'); + return; + } + if (mode === 'quality' && quality) { + const cells = quality.stations.map(s => qualityCell(s)).filter(Boolean); + const samples = cells.reduce((n, a) => n + a[2], 0); + el.textContent = T('m.statusQuality', { + parameter: qualityParameterName(quality.parameters[qualityParam]), year: qualityYear, + samples: nf(samples), stations: nf(cells.length), + }); + return; + } + if (mode === 'res' && reservoirs) { + el.textContent = T('m.statusReservoirs', { + n: nf(reservoirs.totals.count), d: fmtDate(reservoirs.fill.latest.d), + pct: nfd(reservoirs.fill.latest.pct, 1), + }); + return; + } + if (mode === 'ice' && glaciers) { + el.textContent = T('m.statusIce', { + n: nf(glaciers.now.count), from: glaciers.past.year, to: glaciers.now.year, + }); + return; + } + if (mode === 'residual' && residual) { + el.textContent = T('m.statusResidual', { n: nf(residual.points.length), d: fmtDate(residual.datenstand) }); + return; + } + if (mode === 'use' && users) { + const n = ['hydro', 'abstraction', 'npp', 'ara'].reduce((sum, key) => sum + users[key].length, 0); + el.textContent = T('m.statusUse', { n: nf(n) }); + return; + } + if (mode === 'wet' && wetlands) { + el.textContent = T('m.statusWet', { n: nf(wetlands.objects.length), inventories: nf(Object.keys(wetlands.inventories).length) }); + return; + } + if (mode === 'source') { + el.textContent = vintage + ? T('m.statusSource', { n: nf(vintage.sources.length) }) + : T('m.statusSourceLoading'); + return; + } + el.textContent = T('m.readingLayer'); +} + +function stampText() { if (!liveStamp) { const rejected = liveSummary.stale + liveSummary.invalid + liveSummary.unit; - el.textContent = rejected ? T('m.noValidLive', { n: rejected }) : T('m.noLive'); + liveFlowStatus = rejected ? T('m.noValidLive', { n: rejected }) : T('m.noLive'); + updateLayerStatus(); updateLiveLegalScreen(); return; } const d = new Date(liveStamp); const t = fmtStamp(d); const excluded = liveSummary.stale + liveSummary.invalid + liveSummary.unit; - el.textContent = excluded + liveFlowStatus = excluded ? T('m.stampExcluded', { n: liveSummary.current, t, x: excluded }) : T('m.stamp', { n: liveSummary.current, t }); + updateLayerStatus(); const withT = stations.filter(s => s.obs?.temp !== null && s.obs?.temp !== undefined); const c = document.getElementById('tempCount'); @@ -1059,6 +1148,7 @@ function qualityLegend() { b.classList.toggle('on', +b.dataset.parameterIndex === qualityParam); b.setAttribute('aria-pressed', String(+b.dataset.parameterIndex === qualityParam)); } + updateLayerStatus(); } function qualityPosition(v, p) { @@ -2242,6 +2332,8 @@ function setMode(m) { document.getElementById('legendTitle').textContent = LGTITLE[m]; document.getElementById('sheetTitle').textContent = LGTITLE[m]; cv.setAttribute('aria-label', T('m.mapAria', { layer: LGTITLE[m] })); + mobileModeSelect.value = m; + updateLayerStatus(); // A selection made on one layer is a fact about that layer. Carrying a glacier // panel into the reservoir layer would leave a reading on screen that the map // beneath it no longer supports. @@ -2263,6 +2355,11 @@ for (const b of document.querySelectorAll('#modes button')) { b.setAttribute('aria-pressed', String(b.dataset.mode === mode)); b.onclick = () => setMode(b.dataset.mode); } +mobileModeSelect.value = mode; +mobileModeSelect.addEventListener('change', () => { + const requested = mobileModeSelect.value; + if (!setMode(requested)) mobileModeSelect.value = mode; +}); /* Between phone and wide desktop the translated layer names form a horizontal rail. Touch and trackpads scroll it natively; a vertical mouse wheel should be @@ -2315,7 +2412,8 @@ function dataRowsForMode() { const value = !current ? T('m.dataNoCurrent') : mode === 'normal' && r.mean > 0 ? nfd(100 * r.live / r.mean, 0) + ' %' : fmtQ(r.live) + ' m³/s'; - return [nm?.n || T('m.dataReach', { id: r.id }), value, reachEvidence(r), + const identity = T('m.dataReach', { id: r.id }); + return [nm?.n ? `${nm.n} · ${identity}` : identity, value, reachEvidence(r), r.basis === 'measured' ? 'BAFU · LINDAS' : 'HydroRIVERS · BAFU']; }); if (mode === 'temp') return stations.map(s => [ @@ -2390,14 +2488,18 @@ function renderDataView() { if (!shown.length) { const tr = document.createElement('tr'), td = document.createElement('td'); td.colSpan = 4; td.textContent = T('m.dataEmpty'); tr.appendChild(td); dataBody.appendChild(tr); - } else for (const row of shown) { - const tr = document.createElement('tr'); - for (const value of row) { - const td = document.createElement('td'); - td.textContent = value || '—'; - tr.appendChild(td); + } else { + const headers = [...dataView.querySelectorAll('thead th')].map(th => th.textContent.trim()); + for (const row of shown) { + const tr = document.createElement('tr'); + for (const [index, value] of row.entries()) { + const td = document.createElement('td'); + td.textContent = value || '—'; + td.dataset.label = headers[index] || ''; + tr.appendChild(td); + } + dataBody.appendChild(tr); } - dataBody.appendChild(tr); } document.getElementById('dataCaption').textContent = T('m.dataCaption', { layer: LGTITLE[mode], n: nf(rows.length) }); document.getElementById('dataStatus').textContent = rows.length @@ -3287,6 +3389,7 @@ function renderVintage() { ca: vintageOf('catchments'), caAge: ca?.ageDays ? T('m.srcAgeBare', { a: ageText(ca.ageDays) }) : '', }); + updateLayerStatus(); } /* =========================================================================== diff --git a/site/data/provenance.json b/site/data/provenance.json index 031ef1c..ebe4078 100644 --- a/site/data/provenance.json +++ b/site/data/provenance.json @@ -1 +1 @@ -{"schema":3,"built":"2026-08-22T14:59:44.021Z","revision":"sha256:f71cbd4b40488517ade31857e0e1640672a44241d4954798dd301309bf9cc1d1","publicationDigest":"sha256:f71cbd4b40488517ade31857e0e1640672a44241d4954798dd301309bf9cc1d1","sourceRevision":null,"scope":"The publication digest identifies the exact public artifacts and generators. sourceRevision is added by the deployment workflow. Reviewed archive hashes survive partial API refreshes; mutable API responses are identified by their published source state.","archiveEvidence":"unavailable","facts":{"stations":233,"uniqueStationIds":233,"boundStations":227,"dischargeStations":187,"unresolvedDischargeUnits":5,"dischargeReaches":173,"eligibleDischargeReaches":168,"reaches":8711,"uniqueReachIds":8711,"q347Points":1041,"reservoirWeeks":1390,"qualityRows":1543996,"qualityStations":144,"qualityParameters":724,"monitoringCantons":26,"monitoringCantonsWithNawa":25},"sources":[{"key":"q347","holder":"BAFU","datenstand":"2000-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.hydrologie-q347","links":[],"licence":"opendata.swiss, attribution"},{"key":"abstraction","holder":"BAFU and the cantons","datenstand":"2004-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-entnahme","links":[],"licence":"opendata.swiss, attribution"},{"key":"ara","holder":"BAFU and the cantons","datenstand":"2014-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.gewaesserschutz-klaeranlagen_anteilq347","links":[],"licence":"opendata.swiss, attribution"},{"key":"groundwater","holder":"BAFU","datenstand":"2017-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.grundwasserkoerper","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"wet_auen","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-auen","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_moorl","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-moorlandschaften","links":[],"licence":"opendata.swiss, attribution"},{"key":"rivers","holder":"HydroSHEDS / WWF, HydroRIVERS v1.0","datenstand":"2019-01-01","live":false,"url":"https://www.hydrosheds.org/products/hydrorivers","links":[],"licence":"Free for non-commercial and commercial use with attribution"},{"key":"npp","holder":"BFE","datenstand":"2019-12-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.kernkraftwerke","links":[],"licence":"opendata.swiss, attribution"},{"key":"context","holder":"Natural Earth 10m","datenstand":"2022-05-01","live":false,"url":"https://www.naturalearthdata.com/","links":[{"label":"10m lakes","url":"https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-lakes/"},{"label":"10m countries","url":"https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/"}],"licence":"Public domain"},{"key":"zones","holder":"the 26 cantons via geodienste.ch","datenstand":"2023-05-16","live":false,"url":"https://geodienste.ch/services/planerischer_gewaesserschutz","links":[],"licence":"per canton; all 26 currently publish this model freely"},{"key":"ice","holder":"GLAMOS","datenstand":"2023-09-01","live":false,"url":"https://doi.glamos.ch/","links":[{"label":"SGI1850","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1850_r1992.html"},{"label":"SGI1931","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1931_r2022.html"},{"label":"SGI1973","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1973_r1976.html"},{"label":"SGI2010","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2010_r2010.html"},{"label":"SGI2016","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2016_r2020.html"},{"label":"SGI2023","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2023_r2026.html"},{"label":"length change","url":"https://doi.glamos.ch/data/lengthchange/lengthchange_2025_r2025.html"}],"licence":"CC BY 4.0 per the DOI index; the length-change file header adds \"scientific and non-commercial use\". Both statements stand."},{"key":"dams","holder":"BFE","datenstand":"2023-11-28","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.stauanlagen-bundesaufsicht","links":[],"licence":"opendata.swiss, attribution"},{"key":"catchments","holder":"BAFU","datenstand":"2024-06-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-teileinzugsgebiete_2","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"quality","holder":"BAFU and the cantons","datenstand":"2024-12-31","live":false,"url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend","links":[{"label":"NAWA programme","url":"https://www.bafu.admin.ch/de/nawa"},{"label":"dataset and field definitions","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend"},{"label":"prepared annual files","url":"https://data.bafu.admin.ch/download?list-type=2&prefix=water/nawa-trend/"},{"label":"licence and source","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/lizenz-und-quelle"}],"licence":"Open use. Must provide the source. Commercial and non-commercial use permitted with attribution."},{"key":"wet_hoch","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-hochmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_flach","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-flachmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"hydro","holder":"BFE","datenstand":"2025-12-31","live":false,"url":"https://www.bfe.admin.ch/de/wasserkraft","links":[],"licence":"opendata.swiss, attribution"},{"key":"names","holder":"swisstopo, swissNAMES3D 2026","datenstand":"2026-03-09","live":false,"url":"https://data.geo.admin.ch/ch.swisstopo.swissnames3d/","links":[],"licence":"Open data, free use with source attribution"},{"key":"wet_amphi","holder":"BAFU","datenstand":"2026-05-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-amphibien","links":[],"licence":"opendata.swiss, attribution"},{"key":"reservoirFill","holder":"BFE","datenstand":"2026-08-17","live":false,"url":"https://www.uvek-gis.admin.ch/BFE/ogd/17/ogd17_fuellungsgrad_speicherseen.csv","links":[],"licence":"opendata.swiss, attribution"},{"key":"gauges","holder":"BAFU","datenstand":null,"live":true,"url":"https://lindas.admin.ch/query","links":[{"label":"LINDAS observations","url":"https://lindas.admin.ch/query"},{"label":"hydrodaten station plots and units","url":"https://www.hydrodaten.admin.ch/"}],"licence":"Open government data, no key"},{"key":"basemap","holder":"swisstopo","datenstand":null,"live":false,"url":"https://docs.geo.admin.ch/visualize-data/wms.html","links":[],"licence":"FSDI general terms of use, free use with source attribution"}],"upstreamArchives":[],"generators":{".github/workflows/pages.yml":{"bytes":3319,"sha256":"db641bc9404c15c8ea4305ab9700998d4cd390d5d0dffa255c75979819c431bc"},"build/00-sources.sh":{"bytes":8872,"sha256":"8ec73140ecc00c2b7cb44f17115706cb0f3a520927c4c452b9c2858a90b37f28"},"build/01-stations.mjs":{"bytes":5719,"sha256":"4d81f143d263c84c05ef541b732d6e2dcee6aa60a59971b543faf04a77bc2a1e"},"build/02-network.mjs":{"bytes":3111,"sha256":"394b73f8e36e98d8d09bea66fcaf42883bfd7bfe228000341ba72444047975d8"},"build/03-context.mjs":{"bytes":1641,"sha256":"9061bfb755f87b78e3a52d0d080c19845f3cd131c173683131610613b0188038"},"build/04-glaciers.mjs":{"bytes":8309,"sha256":"b02d1e76ddfddb9ae2c2100c0f6d9d1c388afa23268ad29a052ec99080423320"},"build/05-users.mjs":{"bytes":11468,"sha256":"7a4bdf9fd2b521e19641b34cb74b4a3b720a569a88fd2b3f36570273b2dccb5c"},"build/06-reservoirs.mjs":{"bytes":12702,"sha256":"a6188f5c0c11a1a2822f4f9f9100750123442dde6a9d6ae1b983e3971fee9635"},"build/07-residual.mjs":{"bytes":13124,"sha256":"85991e1825ff9f027c0d9147616941ef4505c9dd25fa291826884650b135ff80"},"build/08-vintage.mjs":{"bytes":21960,"sha256":"10d0191fa478023043555fcd592ef6efcfdebcedd9941b431e65e7339d342fe3"},"build/09-icehistory.mjs":{"bytes":6719,"sha256":"24bd4e2d658b2169f0864aa4475e0d8b976462c1598051f43c4e266ef0ef2e57"},"build/10-names.mjs":{"bytes":16681,"sha256":"70313e9fad336e981fd14affd094e9dec2214d1d5dbf9facb1d408c28f31749b"},"build/11-cantons.mjs":{"bytes":3034,"sha256":"9f88c2f7b8bef1bc9901e17b1075a520ce4061984ebf9a672349d2d8659045b4"},"build/12-wetlands.mjs":{"bytes":13776,"sha256":"9703b964901932b5382212f207c0570c0a1033b3d3d6dbd7aabf70019a4195e5"},"build/13-basins.mjs":{"bytes":13142,"sha256":"c89b0a6797b4b824c62119b9ddbd6f260d29fac0041757d904acef81c34158fc"},"build/14-pages.py":{"bytes":15802,"sha256":"81ceecd1cce2150f86fcde46dcadd58cfbe147ef0f4b113a23f4b71b2e8f0b95"},"build/15-social-card.mjs":{"bytes":6144,"sha256":"51414e2510d58ea5af4373264efcbb937984443e826e5b5a71fbd067f44bc6c1"},"build/16-provenance.mjs":{"bytes":5320,"sha256":"08e31dc626be2c9809191bc7d0fd8b20d63446c41444788b9d26f46bc3026c07"},"build/17-quality.mjs":{"bytes":12969,"sha256":"80cdb035bb96541066904c02ef7f33bf60719d4550d51d49a3cd465d13effa7a"},"build/18-monitoring.mjs":{"bytes":7703,"sha256":"8c4bb64641562a77fb6dd22940b4c607e2f1da245ac453cb09c283ecefc24550"},"build/lib-stations.mjs":{"bytes":1501,"sha256":"17d8c00b36f96fba383b430f8f22d37c83e7c5f895fa9f99823dd0ead087b3f5"},"build/pages/de.json":{"bytes":155594,"sha256":"662f1344c6991313e33d9b6a73ea166681e300d5ccf35de9f9672bd151913ce2"},"build/pages/fr.json":{"bytes":159142,"sha256":"cf4d1a4ed1cd09c18c0346b58654b192180f8932105379943a1883186f18b0c5"},"build/pages/index.en.html":{"bytes":28909,"sha256":"56bf69c9d85d19427d009f96d1e7a426370f98ec4250dc990263288741079c54"},"build/pages/it.json":{"bytes":154686,"sha256":"6bbfbbec18f06c0536bf4cbd3d668d856b04fa3f84917567e6887acf81fc9fd2"},"build/pages/rm.json":{"bytes":157695,"sha256":"33b229bacffbee7c5c8f788bcec8023c3ebf7bda5b3187a90e974140e9c2fe7f"},"build/pages/updates.json":{"bytes":258015,"sha256":"18e5a6fe6f779ef4000e5c6f7f00ce47f04d274eed4987865fcc23724649836d"},"package-lock.json":{"bytes":63777,"sha256":"c3c32ff1af7525028f4c955f9aadba58f0a252692b04f3ee54958ebcbf268e50"},"package.json":{"bytes":1070,"sha256":"53caf42b0f271b8567a224f37d229fb516257d30cfe536661cc96433f8d75bfe"},"scripts/check-external-links.mjs":{"bytes":2337,"sha256":"0d23a491568eec07b7830c5598f7ae6478e376e82ded972dade923ccf8d70352"},"scripts/check-performance-budget.mjs":{"bytes":3003,"sha256":"5217493c384f55470b32c94a15e359742a1aecb6371b87bbf9e469e553101cfd"},"scripts/verify-site.mjs":{"bytes":42919,"sha256":"45cd772857029165e29a3c29b350a5e5952df6525fa5e128ddf28b9273cf5b73"}},"artifacts":{"about.html":{"bytes":23427,"sha256":"c9cdbf33863172bf8a6ce3954ed12cd618bca5e85cb815b76230792dc720dba2"},"app.js":{"bytes":178811,"sha256":"97ab7b8677bc8b50ad946180ac0eeae9efb953a8d3066ca5ada102107cbac185"},"data/basins.json":{"bytes":3488,"sha256":"9fc9f8a3f55a42580dafac22eedf9f1090ee6b31873110719bde121ff968c537"},"data/canton-monitoring.json":{"bytes":6601,"sha256":"5a0723e5a87ba9643591c466d653604e0418c364ed4487791c84e26afdbdbb69"},"data/cantons.json":{"bytes":3625,"sha256":"31d0e54c707c1cb511b22dfb263a3edaeeb81f098f5643dab3828e945f8e5b69"},"data/context.json":{"bytes":23094,"sha256":"274f0a40245933156cb8daa994f1e9188fbe6f99db0be2e3cea80925f2368007"},"data/glaciers.json":{"bytes":1115131,"sha256":"2ab15ef0c109995bd740902856eb6b3c6d12f82899d2af39e893e28e5b0dc35f"},"data/icehistory.json":{"bytes":625151,"sha256":"9ceb75bab89879565bfd13e2d7614f0bd25c6a63d92733cd27f841931e63e5ab"},"data/names.json":{"bytes":365854,"sha256":"97c91c4a7b74685ab81752617c2db1399408ece0d3f0e11683f621711dcf2192"},"data/network.json":{"bytes":1105368,"sha256":"4b04980eb3a2f4385d783af8da41eb15bcc28ad2e5f22f94d6c3ced7938ba12c"},"data/quality.json":{"bytes":4624338,"sha256":"47cfd9b0e50d22baa268280250401d3af2bc2e70af08455a053addde2ee94084"},"data/reservoirs.json":{"bytes":110597,"sha256":"26de75b0047008cdd94c563c78f67eb737f4f450763ef11cab3c140a48320bef"},"data/residual.json":{"bytes":235789,"sha256":"614e5f00f726148d30a23b5debe508561ae0163ce60002ef3723b48f9aece406"},"data/social-card.json":{"bytes":184,"sha256":"ce6711de7c2883ace6daf796e4044124b104c1392d553374af08a178b1782172"},"data/stations.json":{"bytes":41444,"sha256":"9f55491b1b1aa992a79e2568bcb3363e6daf02cc9f121e8a82afdc8d005f53c8"},"data/users.json":{"bytes":346478,"sha256":"1399cdf3eabed26a519f609db326cecdb99ea4a9146aa640630fbd45d2c7f4bf"},"data/vintage.json":{"bytes":13903,"sha256":"c98fcc5bf4a509aba37cc804945bbc931ad843e3913ccaf24aebd01c45a83db0"},"data/wetlands.json":{"bytes":1081150,"sha256":"eee2b59945140fea80178edae6b5bfe973f2a52475c72d0bf268d4a7809170cb"},"de/about.html":{"bytes":24620,"sha256":"372507f5ef64267f723483d26e0050fec4f67529c598275aa0809282277284f6"},"de/index.html":{"bytes":29973,"sha256":"e95da0048d649c76f8b481545b74fc474f2698e23d1b7871d6edc303c333f409"},"de/law.html":{"bytes":29481,"sha256":"bded7ab11a750a94a6ee3e73256c71b1302464107375f607bdfa0e49672cca05"},"de/method.html":{"bytes":47288,"sha256":"116f2f1db59ebb7e7efaddf64cdb990e6e0289eb2464603e255958663328afd7"},"de/sources.html":{"bytes":13193,"sha256":"cdfe2baeaf397d7a9632615b6247294bf6d18721395b8e3cf0da8bd1d7c089d7"},"en/index.html":{"bytes":29028,"sha256":"0389597dcd1cd80d3455db973d05874df2972a1a91983c1a7efca5c7c1a79fef"},"favicon.svg":{"bytes":598,"sha256":"ffb7394f49c0ac90daa0203d9ce45bfafbf7d3d9cac1f0fdafc561f797f9195f"},"fmt.js":{"bytes":2388,"sha256":"eb50d45ea49aa0b8ef4d434d6dce3ece9537965a44948b350ce8b99b1c03cb66"},"fonts.css":{"bytes":4631,"sha256":"a919c516ef820d854333516658188efaa463cb5535277a12a14c5afd9e2d3be8"},"fonts/OFL-Archivo.txt":{"bytes":4387,"sha256":"1778201b7bd33e8c08a2eda32a4ad2f69bc38ced9731b01cc3fc47f268c8ef3c"},"fonts/OFL-IBM-Plex-Mono.txt":{"bytes":4362,"sha256":"d741e57d5f865e294df801f96b7b5161a88b211df65887e4358d271c9fc5fb4f"},"fonts/OFL-Source-Serif-4.txt":{"bytes":4399,"sha256":"0fd8b796c1c6220a559a5682cfd00d1c8488b428369f7cb70deb671888cef85f"},"fonts/archivo-italic-latin-ext.woff2":{"bytes":35208,"sha256":"71d5c4e5da1cc99cf78fe92f2fb9880dfc03dfef7122b0d1ed1d56f25452e824"},"fonts/archivo-italic-latin.woff2":{"bytes":39132,"sha256":"e1989a5727374fcd299979407c8087669ca223f5281f8645891e5400f3e61aeb"},"fonts/archivo-normal-latin-ext.woff2":{"bytes":32672,"sha256":"a999e009fdcd0f939c138e04043b3b2ad083b26252b644e8f94c083d48b77af0"},"fonts/archivo-normal-latin.woff2":{"bytes":34940,"sha256":"7150c0ec5ad356453013d11affec1fbab95de0dd2dcecb043b4f1cb7f87c4ba4"},"fonts/ibm-plex-mono-400-latin-ext.woff2":{"bytes":8860,"sha256":"f1050dc5317b43434c0aeda599d4624c774ffc162e87a8cf204b949b6a85816d"},"fonts/ibm-plex-mono-400-latin.woff2":{"bytes":10052,"sha256":"c36f509c0a8f9f85f29cb44bc8701d8a9e0b14c499e77a884f789ead7093a7ac"},"fonts/ibm-plex-mono-500-latin-ext.woff2":{"bytes":8848,"sha256":"77f03e26f981c582bdba3a7abed4baa2d3149211c01366bb3ab3ba7622ec4ae5"},"fonts/ibm-plex-mono-500-latin.woff2":{"bytes":10060,"sha256":"a76f53ca6612e7b3828eec2311098675b7f9849ae4169a8bcef6302aec02a6c0"},"fonts/source-serif-italic-latin-ext.woff2":{"bytes":43964,"sha256":"3eff7682cb08de3fbd2f411e05dc3f68fbd3ce721ec554ffafa7b0397214e76f"},"fonts/source-serif-italic-latin.woff2":{"bytes":50584,"sha256":"419703e180143eb9033e02651331fcf3cc8558d42f1041140a0b24e5be0933bb"},"fonts/source-serif-normal-latin-ext.woff2":{"bytes":100772,"sha256":"a0cd390d017200f91327781204458ff918999584bece8902497ba6c08472178d"},"fonts/source-serif-normal-latin.woff2":{"bytes":122168,"sha256":"2a24bad466f09b88b8e9cbc488bf774117c912e66374c57bf4716855849143f8"},"fr/about.html":{"bytes":24923,"sha256":"ac47a6d084732808b54eda1b5f3b916b8055197cba9c44e4c8124b2f00986d19"},"fr/index.html":{"bytes":30750,"sha256":"dc0db5057565bbccec3bbe303d90924060107c21de27dbc211fba96db965e4a1"},"fr/law.html":{"bytes":30904,"sha256":"0d98194a8d1a713aac792b78ed703a5475564f6d90951bebcb08e99d70a53fad"},"fr/method.html":{"bytes":48880,"sha256":"36420c14e14c829821df1cea9a905e401f0078ea4e87a1813aa4818493b62623"},"fr/sources.html":{"bytes":13503,"sha256":"9af06471f88ca99963010b8ec4b966fb9a07c8ab65ab274332aa94c00ac7bae8"},"gschg31.js":{"bytes":1894,"sha256":"bf4673598fd6936aec1a2eeb2e692b24ea984fb728146324dcf8586f183a9c08"},"i18n-data.js":{"bytes":59884,"sha256":"e416f44065e452e52f810fc76c3df633853c6ae8604517d79d6b61453789f129"},"i18n-map.js":{"bytes":137697,"sha256":"264eef4fe58af15364a4461e11789b6b64dbb1b1e6145d07f2283da8747eb464"},"i18n.js":{"bytes":38264,"sha256":"260d45c429e32b77efffbeb1fb84f2fad55de31654e8df2a36e8b2ec6fb828c5"},"index.html":{"bytes":29988,"sha256":"e33b8eb060d0f6ed1345500997ebcf65bdd5c3a4a319a841f0fce657dff81c94"},"it/about.html":{"bytes":24042,"sha256":"9ba8bcf6f6356ea56cabd09125a3beb0688b50331f716cd94f9531c8d1606b3a"},"it/index.html":{"bytes":30137,"sha256":"768610b811666947a16c84ea0e296153d99398dc78a483181f3b8d51166c35d9"},"it/law.html":{"bytes":29853,"sha256":"09a959830d532da47f5cea0c00d9eb1e38e5e5c2eeccbaf812f5ade159f08495"},"it/method.html":{"bytes":46646,"sha256":"ba0365bb655e8df2d7b7f60eeca5f435f661473bff444deec147d55d3b2ff3f0"},"it/sources.html":{"bytes":13047,"sha256":"fad144aecd3287538bfc8eb6d6cc4c6ddd2abbaa41fb3ccdbf16bffa9bfe6919"},"law.html":{"bytes":28203,"sha256":"598750873da8ccd057b548ce24bc5e9672f1b66f36639493b071ada1da185cd6"},"legal-alerts.js":{"bytes":2495,"sha256":"98f782af37d89a363f19c6e3a9abf7b9bc5226efcb891751f20adad7614f308e"},"method.html":{"bytes":45355,"sha256":"f4974a62358a9918a2742be8c5528274877ce655821db7d905fd72cad2e7824d"},"og-image.jpg":{"bytes":200325,"sha256":"f6a6cbd88798900d3b584b1e966c764506ddd85e88328d77e17cf77cf89f5144"},"rm/about.html":{"bytes":24338,"sha256":"89115acfa934e73afe239ac00e60cade069efbaacd28ce5c4b4cd7e9d0dfb800"},"rm/index.html":{"bytes":30492,"sha256":"dc66b228ed23e5f214ea3473c78e2a7aff29c7e1ea2634de56eb501904c101f9"},"rm/law.html":{"bytes":30438,"sha256":"65fb4b599cf0f406718ae4416bc195d81d439887b30b2f89f95bb87a1ed97e39"},"rm/method.html":{"bytes":47987,"sha256":"88801d72275dc950d38a7c3882288f939932f9a906d684341757e07974e8de3a"},"rm/sources.html":{"bytes":13574,"sha256":"4662b473b82ba86eddaffa07036f1a42945437017d25ab8859a8f4a520bf04f4"},"robots.txt":{"bytes":80,"sha256":"f8de6fa3cc79f4c7b56023e2618742b16dabde01c2d950dc0a48f71309ed9018"},"site.css":{"bytes":25213,"sha256":"46432b270e3187a66f0517ab77df107c4ff6a4f8012871aa4fedf2fabd7ff289"},"site.js":{"bytes":25768,"sha256":"caa0b3b41eb1027aca3f6ffbf3aa56b2e09ad96c32aac89268902cc298645875"},"sitemap.xml":{"bytes":18506,"sha256":"862dd487e520d4006c55150f2e4c7c42c7a93366f3fc01b8dfb27f68fe2b94a6"},"sources.html":{"bytes":12739,"sha256":"216652d9550aa70d9fbfd67869324298b08ec28c12ee2c03cc58c1ff196b01ff"},"style.css":{"bytes":75714,"sha256":"0f934fcdd39ed7546dc18fba486217a3698dcb441bed28fb2452d4614c02ad69"},"theme.js":{"bytes":3354,"sha256":"a1811f92d1d08cc87cb3c8f41515a9f0868bdad44782150bd41074af1df06b3a"},"tokens.css":{"bytes":16169,"sha256":"a09dd19c74aa879f8211196eed3ed19b97c6a576985253b4c468e9b52b5b4f7a"}}} \ No newline at end of file +{"schema":3,"built":"2026-08-22T17:16:50.443Z","revision":"sha256:4ad7fd8397bbe4999d2a6a8019cdbee6055eb20cb97b0e42fcab833b0ba1061a","publicationDigest":"sha256:4ad7fd8397bbe4999d2a6a8019cdbee6055eb20cb97b0e42fcab833b0ba1061a","sourceRevision":null,"scope":"The publication digest identifies the exact public artifacts and generators. sourceRevision is added by the deployment workflow. Reviewed archive hashes survive partial API refreshes; mutable API responses are identified by their published source state.","archiveEvidence":"unavailable","facts":{"stations":233,"uniqueStationIds":233,"boundStations":227,"dischargeStations":187,"unresolvedDischargeUnits":5,"dischargeReaches":173,"eligibleDischargeReaches":168,"reaches":8711,"uniqueReachIds":8711,"q347Points":1041,"reservoirWeeks":1390,"qualityRows":1543996,"qualityStations":144,"qualityParameters":724,"monitoringCantons":26,"monitoringCantonsWithNawa":25},"sources":[{"key":"q347","holder":"BAFU","datenstand":"2000-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.hydrologie-q347","links":[],"licence":"opendata.swiss, attribution"},{"key":"abstraction","holder":"BAFU and the cantons","datenstand":"2004-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-entnahme","links":[],"licence":"opendata.swiss, attribution"},{"key":"ara","holder":"BAFU and the cantons","datenstand":"2014-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.gewaesserschutz-klaeranlagen_anteilq347","links":[],"licence":"opendata.swiss, attribution"},{"key":"groundwater","holder":"BAFU","datenstand":"2017-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.grundwasserkoerper","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"wet_auen","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-auen","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_moorl","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-moorlandschaften","links":[],"licence":"opendata.swiss, attribution"},{"key":"rivers","holder":"HydroSHEDS / WWF, HydroRIVERS v1.0","datenstand":"2019-01-01","live":false,"url":"https://www.hydrosheds.org/products/hydrorivers","links":[],"licence":"Free for non-commercial and commercial use with attribution"},{"key":"npp","holder":"BFE","datenstand":"2019-12-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.kernkraftwerke","links":[],"licence":"opendata.swiss, attribution"},{"key":"context","holder":"Natural Earth 10m","datenstand":"2022-05-01","live":false,"url":"https://www.naturalearthdata.com/","links":[{"label":"10m lakes","url":"https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-lakes/"},{"label":"10m countries","url":"https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/"}],"licence":"Public domain"},{"key":"zones","holder":"the 26 cantons via geodienste.ch","datenstand":"2023-05-16","live":false,"url":"https://geodienste.ch/services/planerischer_gewaesserschutz","links":[],"licence":"per canton; all 26 currently publish this model freely"},{"key":"ice","holder":"GLAMOS","datenstand":"2023-09-01","live":false,"url":"https://doi.glamos.ch/","links":[{"label":"SGI1850","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1850_r1992.html"},{"label":"SGI1931","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1931_r2022.html"},{"label":"SGI1973","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1973_r1976.html"},{"label":"SGI2010","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2010_r2010.html"},{"label":"SGI2016","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2016_r2020.html"},{"label":"SGI2023","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2023_r2026.html"},{"label":"length change","url":"https://doi.glamos.ch/data/lengthchange/lengthchange_2025_r2025.html"}],"licence":"CC BY 4.0 per the DOI index; the length-change file header adds \"scientific and non-commercial use\". Both statements stand."},{"key":"dams","holder":"BFE","datenstand":"2023-11-28","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.stauanlagen-bundesaufsicht","links":[],"licence":"opendata.swiss, attribution"},{"key":"catchments","holder":"BAFU","datenstand":"2024-06-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-teileinzugsgebiete_2","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"quality","holder":"BAFU and the cantons","datenstand":"2024-12-31","live":false,"url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend","links":[{"label":"NAWA programme","url":"https://www.bafu.admin.ch/de/nawa"},{"label":"dataset and field definitions","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend"},{"label":"prepared annual files","url":"https://data.bafu.admin.ch/download?list-type=2&prefix=water/nawa-trend/"},{"label":"licence and source","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/lizenz-und-quelle"}],"licence":"Open use. Must provide the source. Commercial and non-commercial use permitted with attribution."},{"key":"wet_hoch","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-hochmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_flach","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-flachmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"hydro","holder":"BFE","datenstand":"2025-12-31","live":false,"url":"https://www.bfe.admin.ch/de/wasserkraft","links":[],"licence":"opendata.swiss, attribution"},{"key":"names","holder":"swisstopo, swissNAMES3D 2026","datenstand":"2026-03-09","live":false,"url":"https://data.geo.admin.ch/ch.swisstopo.swissnames3d/","links":[],"licence":"Open data, free use with source attribution"},{"key":"wet_amphi","holder":"BAFU","datenstand":"2026-05-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-amphibien","links":[],"licence":"opendata.swiss, attribution"},{"key":"reservoirFill","holder":"BFE","datenstand":"2026-08-17","live":false,"url":"https://www.uvek-gis.admin.ch/BFE/ogd/17/ogd17_fuellungsgrad_speicherseen.csv","links":[],"licence":"opendata.swiss, attribution"},{"key":"gauges","holder":"BAFU","datenstand":null,"live":true,"url":"https://lindas.admin.ch/query","links":[{"label":"LINDAS observations","url":"https://lindas.admin.ch/query"},{"label":"hydrodaten station plots and units","url":"https://www.hydrodaten.admin.ch/"}],"licence":"Open government data, no key"},{"key":"basemap","holder":"swisstopo","datenstand":null,"live":false,"url":"https://docs.geo.admin.ch/visualize-data/wms.html","links":[],"licence":"FSDI general terms of use, free use with source attribution"}],"upstreamArchives":[],"generators":{".github/workflows/pages.yml":{"bytes":3395,"sha256":"9d74a5ead409d694f2ca02f8a652a7cd130ff1849d2c57bcf3be46b823beca2c"},"build/00-sources.sh":{"bytes":8872,"sha256":"8ec73140ecc00c2b7cb44f17115706cb0f3a520927c4c452b9c2858a90b37f28"},"build/01-stations.mjs":{"bytes":5719,"sha256":"4d81f143d263c84c05ef541b732d6e2dcee6aa60a59971b543faf04a77bc2a1e"},"build/02-network.mjs":{"bytes":3111,"sha256":"394b73f8e36e98d8d09bea66fcaf42883bfd7bfe228000341ba72444047975d8"},"build/03-context.mjs":{"bytes":1641,"sha256":"9061bfb755f87b78e3a52d0d080c19845f3cd131c173683131610613b0188038"},"build/04-glaciers.mjs":{"bytes":8309,"sha256":"b02d1e76ddfddb9ae2c2100c0f6d9d1c388afa23268ad29a052ec99080423320"},"build/05-users.mjs":{"bytes":11468,"sha256":"7a4bdf9fd2b521e19641b34cb74b4a3b720a569a88fd2b3f36570273b2dccb5c"},"build/06-reservoirs.mjs":{"bytes":12702,"sha256":"a6188f5c0c11a1a2822f4f9f9100750123442dde6a9d6ae1b983e3971fee9635"},"build/07-residual.mjs":{"bytes":13124,"sha256":"85991e1825ff9f027c0d9147616941ef4505c9dd25fa291826884650b135ff80"},"build/08-vintage.mjs":{"bytes":21960,"sha256":"10d0191fa478023043555fcd592ef6efcfdebcedd9941b431e65e7339d342fe3"},"build/09-icehistory.mjs":{"bytes":6719,"sha256":"24bd4e2d658b2169f0864aa4475e0d8b976462c1598051f43c4e266ef0ef2e57"},"build/10-names.mjs":{"bytes":16681,"sha256":"70313e9fad336e981fd14affd094e9dec2214d1d5dbf9facb1d408c28f31749b"},"build/11-cantons.mjs":{"bytes":3034,"sha256":"9f88c2f7b8bef1bc9901e17b1075a520ce4061984ebf9a672349d2d8659045b4"},"build/12-wetlands.mjs":{"bytes":13776,"sha256":"9703b964901932b5382212f207c0570c0a1033b3d3d6dbd7aabf70019a4195e5"},"build/13-basins.mjs":{"bytes":13142,"sha256":"c89b0a6797b4b824c62119b9ddbd6f260d29fac0041757d904acef81c34158fc"},"build/14-pages.py":{"bytes":15826,"sha256":"8ff7c52bbbe4bfb5f7f67c8300085a8ed12572f8b88622e01b42782d0c204e7d"},"build/15-social-card.mjs":{"bytes":6144,"sha256":"51414e2510d58ea5af4373264efcbb937984443e826e5b5a71fbd067f44bc6c1"},"build/16-provenance.mjs":{"bytes":5320,"sha256":"08e31dc626be2c9809191bc7d0fd8b20d63446c41444788b9d26f46bc3026c07"},"build/17-quality.mjs":{"bytes":12969,"sha256":"80cdb035bb96541066904c02ef7f33bf60719d4550d51d49a3cd465d13effa7a"},"build/18-monitoring.mjs":{"bytes":7703,"sha256":"8c4bb64641562a77fb6dd22940b4c607e2f1da245ac453cb09c283ecefc24550"},"build/lib-stations.mjs":{"bytes":1501,"sha256":"17d8c00b36f96fba383b430f8f22d37c83e7c5f895fa9f99823dd0ead087b3f5"},"build/pages/de.json":{"bytes":156677,"sha256":"4bdd81d5e4b205f3405499adce5583e55ac60ccefe61ffae2f36ba7198bbad17"},"build/pages/fr.json":{"bytes":160270,"sha256":"3624e910cc1ccd58d7e3425b29c364b359a7b47e233d2d589a3203554a464730"},"build/pages/index.en.html":{"bytes":29097,"sha256":"37138bbcfd052305936fa75e4577c0f5181c59dd49b28d4d90db5413f8da5dbb"},"build/pages/it.json":{"bytes":155782,"sha256":"d5e1798bfbec380d6ce9cd29ee0dcf7e0f70a4beb16b29b353ce8decb396d110"},"build/pages/rm.json":{"bytes":158840,"sha256":"d62410dc26fbba22c5ab9ddf8a17554920419de0291c49a41b16695303ed6bf7"},"build/pages/updates.json":{"bytes":258015,"sha256":"18e5a6fe6f779ef4000e5c6f7f00ce47f04d274eed4987865fcc23724649836d"},"package-lock.json":{"bytes":63777,"sha256":"c3c32ff1af7525028f4c955f9aadba58f0a252692b04f3ee54958ebcbf268e50"},"package.json":{"bytes":1070,"sha256":"53caf42b0f271b8567a224f37d229fb516257d30cfe536661cc96433f8d75bfe"},"scripts/check-external-links.mjs":{"bytes":2337,"sha256":"0d23a491568eec07b7830c5598f7ae6478e376e82ded972dade923ccf8d70352"},"scripts/check-performance-budget.mjs":{"bytes":3003,"sha256":"5217493c384f55470b32c94a15e359742a1aecb6371b87bbf9e469e553101cfd"},"scripts/verify-site.mjs":{"bytes":44818,"sha256":"6a871ba737e13587e86be40ae8a6f408b1ae2b52253cc61406f0ca9fcfd68736"}},"artifacts":{"about.html":{"bytes":23592,"sha256":"fd625ff0104050b9b52c5d6248bf90292bb3e85097785f0de00dd1999bbb0339"},"app.js":{"bytes":182745,"sha256":"b43241b425bc0a751b7c42236ffc75120500453789f085346a781759bafcd992"},"data/basins.json":{"bytes":3488,"sha256":"9fc9f8a3f55a42580dafac22eedf9f1090ee6b31873110719bde121ff968c537"},"data/canton-monitoring.json":{"bytes":6601,"sha256":"5a0723e5a87ba9643591c466d653604e0418c364ed4487791c84e26afdbdbb69"},"data/cantons.json":{"bytes":3625,"sha256":"31d0e54c707c1cb511b22dfb263a3edaeeb81f098f5643dab3828e945f8e5b69"},"data/context.json":{"bytes":23094,"sha256":"274f0a40245933156cb8daa994f1e9188fbe6f99db0be2e3cea80925f2368007"},"data/glaciers.json":{"bytes":1115131,"sha256":"2ab15ef0c109995bd740902856eb6b3c6d12f82899d2af39e893e28e5b0dc35f"},"data/icehistory.json":{"bytes":625151,"sha256":"9ceb75bab89879565bfd13e2d7614f0bd25c6a63d92733cd27f841931e63e5ab"},"data/names.json":{"bytes":365854,"sha256":"97c91c4a7b74685ab81752617c2db1399408ece0d3f0e11683f621711dcf2192"},"data/network.json":{"bytes":1105368,"sha256":"4b04980eb3a2f4385d783af8da41eb15bcc28ad2e5f22f94d6c3ced7938ba12c"},"data/quality.json":{"bytes":4624338,"sha256":"47cfd9b0e50d22baa268280250401d3af2bc2e70af08455a053addde2ee94084"},"data/reservoirs.json":{"bytes":110597,"sha256":"26de75b0047008cdd94c563c78f67eb737f4f450763ef11cab3c140a48320bef"},"data/residual.json":{"bytes":235789,"sha256":"614e5f00f726148d30a23b5debe508561ae0163ce60002ef3723b48f9aece406"},"data/social-card.json":{"bytes":184,"sha256":"ce6711de7c2883ace6daf796e4044124b104c1392d553374af08a178b1782172"},"data/stations.json":{"bytes":41444,"sha256":"9f55491b1b1aa992a79e2568bcb3363e6daf02cc9f121e8a82afdc8d005f53c8"},"data/users.json":{"bytes":346478,"sha256":"1399cdf3eabed26a519f609db326cecdb99ea4a9146aa640630fbd45d2c7f4bf"},"data/vintage.json":{"bytes":13903,"sha256":"c98fcc5bf4a509aba37cc804945bbc931ad843e3913ccaf24aebd01c45a83db0"},"data/wetlands.json":{"bytes":1081150,"sha256":"eee2b59945140fea80178edae6b5bfe973f2a52475c72d0bf268d4a7809170cb"},"de/about.html":{"bytes":24703,"sha256":"c6d5e38f371e6c04c61a7ee09239bb823c39cbbf8e26ce768880dd51272fe2cd"},"de/index.html":{"bytes":30165,"sha256":"b5314f838a23d15264e00acae2af70982a8868dd81a9fa4a1649af8df14579b3"},"de/law.html":{"bytes":29481,"sha256":"0f3c17aa5273782dce886ead2ee983a84607d40a44c9ceddf2fcc00da8bd2394"},"de/method.html":{"bytes":47288,"sha256":"b3d3103b689b57b2897d996426ffc7528c8b23405cc94f110eae13ea5f191377"},"de/sources.html":{"bytes":13193,"sha256":"355c0f888194eddee885ca056e5b3ae734941230eebe9eb07ff5d1372bb0b4df"},"en/index.html":{"bytes":29216,"sha256":"f71ffcf35fc6cf832f6af9b30cc0944cdb7b9a73090aa12249d3e58f285257e6"},"favicon.svg":{"bytes":598,"sha256":"ffb7394f49c0ac90daa0203d9ce45bfafbf7d3d9cac1f0fdafc561f797f9195f"},"fmt.js":{"bytes":2388,"sha256":"eb50d45ea49aa0b8ef4d434d6dce3ece9537965a44948b350ce8b99b1c03cb66"},"fonts.css":{"bytes":4631,"sha256":"a919c516ef820d854333516658188efaa463cb5535277a12a14c5afd9e2d3be8"},"fonts/OFL-Archivo.txt":{"bytes":4387,"sha256":"1778201b7bd33e8c08a2eda32a4ad2f69bc38ced9731b01cc3fc47f268c8ef3c"},"fonts/OFL-IBM-Plex-Mono.txt":{"bytes":4362,"sha256":"d741e57d5f865e294df801f96b7b5161a88b211df65887e4358d271c9fc5fb4f"},"fonts/OFL-Source-Serif-4.txt":{"bytes":4399,"sha256":"0fd8b796c1c6220a559a5682cfd00d1c8488b428369f7cb70deb671888cef85f"},"fonts/archivo-italic-latin-ext.woff2":{"bytes":35208,"sha256":"71d5c4e5da1cc99cf78fe92f2fb9880dfc03dfef7122b0d1ed1d56f25452e824"},"fonts/archivo-italic-latin.woff2":{"bytes":39132,"sha256":"e1989a5727374fcd299979407c8087669ca223f5281f8645891e5400f3e61aeb"},"fonts/archivo-normal-latin-ext.woff2":{"bytes":32672,"sha256":"a999e009fdcd0f939c138e04043b3b2ad083b26252b644e8f94c083d48b77af0"},"fonts/archivo-normal-latin.woff2":{"bytes":34940,"sha256":"7150c0ec5ad356453013d11affec1fbab95de0dd2dcecb043b4f1cb7f87c4ba4"},"fonts/ibm-plex-mono-400-latin-ext.woff2":{"bytes":8860,"sha256":"f1050dc5317b43434c0aeda599d4624c774ffc162e87a8cf204b949b6a85816d"},"fonts/ibm-plex-mono-400-latin.woff2":{"bytes":10052,"sha256":"c36f509c0a8f9f85f29cb44bc8701d8a9e0b14c499e77a884f789ead7093a7ac"},"fonts/ibm-plex-mono-500-latin-ext.woff2":{"bytes":8848,"sha256":"77f03e26f981c582bdba3a7abed4baa2d3149211c01366bb3ab3ba7622ec4ae5"},"fonts/ibm-plex-mono-500-latin.woff2":{"bytes":10060,"sha256":"a76f53ca6612e7b3828eec2311098675b7f9849ae4169a8bcef6302aec02a6c0"},"fonts/source-serif-italic-latin-ext.woff2":{"bytes":43964,"sha256":"3eff7682cb08de3fbd2f411e05dc3f68fbd3ce721ec554ffafa7b0397214e76f"},"fonts/source-serif-italic-latin.woff2":{"bytes":50584,"sha256":"419703e180143eb9033e02651331fcf3cc8558d42f1041140a0b24e5be0933bb"},"fonts/source-serif-normal-latin-ext.woff2":{"bytes":100772,"sha256":"a0cd390d017200f91327781204458ff918999584bece8902497ba6c08472178d"},"fonts/source-serif-normal-latin.woff2":{"bytes":122168,"sha256":"2a24bad466f09b88b8e9cbc488bf774117c912e66374c57bf4716855849143f8"},"fr/about.html":{"bytes":25087,"sha256":"ce286739f9a7923e125b9d78ab298a0ec47d2a6885dac8ac08fbaa057ac1003e"},"fr/index.html":{"bytes":30942,"sha256":"5900c3adcdaa4649689f8ba0f2bf9783c080e0560fe9b360d8655fd69ee574f3"},"fr/law.html":{"bytes":30904,"sha256":"506079b7a3a02c72f3262cfb879ce4dd8de3a8a7dd0f1813b608dc06881436b5"},"fr/method.html":{"bytes":48880,"sha256":"abba234155945972f7b446148bd93ba7d322f869e20afff2b3b51d5ba4e74f34"},"fr/sources.html":{"bytes":13503,"sha256":"5dd4bd7eb50a2c2078e113743b3e7c7a05eeaee5d181ae9ec547db6e2e5d8978"},"gschg31.js":{"bytes":1894,"sha256":"bf4673598fd6936aec1a2eeb2e692b24ea984fb728146324dcf8586f183a9c08"},"i18n-data.js":{"bytes":59884,"sha256":"e416f44065e452e52f810fc76c3df633853c6ae8604517d79d6b61453789f129"},"i18n-map.js":{"bytes":141457,"sha256":"3d94081016765f3d0dc90e58f8836a5dc33cb2b7959bdc62a0db268f4d50a5ef"},"i18n.js":{"bytes":38264,"sha256":"260d45c429e32b77efffbeb1fb84f2fad55de31654e8df2a36e8b2ec6fb828c5"},"index.html":{"bytes":30180,"sha256":"04c81bb5296b61e357bd11a75d570a9fefa41a7f40bd5aa02925dc2f9454eae7"},"it/about.html":{"bytes":24210,"sha256":"9cded7ca1422a4ff807cf80ee0c9188f2e74a48ef05bf121e25973a301ba2efb"},"it/index.html":{"bytes":30326,"sha256":"1bf4e47b6e2152cd74a6143898b1b90c738549929c391a35a14739425282f276"},"it/law.html":{"bytes":29853,"sha256":"a206f8ed32f5e3aeda46f53104333a6b52e9c8cd1ff85ff346f99f5a73f678a3"},"it/method.html":{"bytes":46646,"sha256":"c18e0bdafe12c12b88ebdd656b5b4c470ca6edc80ce6cfe218f37ebf6e645798"},"it/sources.html":{"bytes":13047,"sha256":"24ba1a2b2a86226d936a1d51e2ec6610b35ab104cfe42714183de22761c1cebb"},"law.html":{"bytes":28203,"sha256":"a51683dd970c0d29eb5d3933bedb23b1a972dcf2b89c19e1f93de6244bb0a28d"},"legal-alerts.js":{"bytes":2495,"sha256":"98f782af37d89a363f19c6e3a9abf7b9bc5226efcb891751f20adad7614f308e"},"method.html":{"bytes":45355,"sha256":"a5d577fd5dc3427d03439f5d654f7cf31adf8a793991080b9c4d7f6bc83b04fc"},"og-image.jpg":{"bytes":200325,"sha256":"f6a6cbd88798900d3b584b1e966c764506ddd85e88328d77e17cf77cf89f5144"},"rm/about.html":{"bytes":24529,"sha256":"4144d8f2667689739394e08d19c1a0a1252d1ba3ea9850dc4da49e2de8958950"},"rm/index.html":{"bytes":30691,"sha256":"20ffc44b3fe61a4c2510603fdcd8d7a32b8a8fa828c19a74fdc875db51bd9edc"},"rm/law.html":{"bytes":30438,"sha256":"38ac0cad0fcf2dcb488c0e64f9876d9c2fa7633c36f8242f9f9cbff4b357fd09"},"rm/method.html":{"bytes":47987,"sha256":"a67be40bf19e346e820acdc97e898cde55d35b99350f7db80305cd998c0c96d4"},"rm/sources.html":{"bytes":13574,"sha256":"5a4f37c4d366cb5ff90f5998841dd2319dab28d6611d1428e62b0c7628786bd5"},"robots.txt":{"bytes":80,"sha256":"f8de6fa3cc79f4c7b56023e2618742b16dabde01c2d950dc0a48f71309ed9018"},"site.css":{"bytes":25213,"sha256":"46432b270e3187a66f0517ab77df107c4ff6a4f8012871aa4fedf2fabd7ff289"},"site.js":{"bytes":26027,"sha256":"5a4721e778c5fc63c5c8f1247c911df98e17f46f39a3111a6dc991883a6536c1"},"sitemap.xml":{"bytes":18506,"sha256":"862dd487e520d4006c55150f2e4c7c42c7a93366f3fc01b8dfb27f68fe2b94a6"},"sources.html":{"bytes":12739,"sha256":"d0a5ba87a7ca54cdd1e3720228074425e14528337393aa1e47475114627ea6e1"},"style.css":{"bytes":77555,"sha256":"6ec9cff30e31f92325855b57e2dd91720ffe1d30885edd11ff30ac714120846e"},"theme.js":{"bytes":3354,"sha256":"a1811f92d1d08cc87cb3c8f41515a9f0868bdad44782150bd41074af1df06b3a"},"tokens.css":{"bytes":16169,"sha256":"a09dd19c74aa879f8211196eed3ed19b97c6a576985253b4c468e9b52b5b4f7a"}}} \ No newline at end of file diff --git a/site/de/about.html b/site/de/about.html index 19cfc62..976efb6 100644 --- a/site/de/about.html +++ b/site/de/about.html @@ -30,7 +30,7 @@ - + @@ -79,10 +79,10 @@
-

Über

-

Eine gemessene Grundlage und ein Argument über das Alter

-

Die Schweiz liegt im Oberlauf der Einzugsgebiete von vier europäischen Meeren. Ein grosser Teil des publizierten Bildes beruht auf Schlussfolgerungen aus alten Registern. Schlussfolgerungen sind unvermeidbar. Sie zu verbergen ist es nicht.

- +

Projekt

+

Dem Wasser folgen. Seine Wege schützen.

+

Riverflow macht den Wasserkreislauf der Schweiz beobachtbar – vom Niederschlag im Gebirge, von Schnee und Eis bis zu Grundwasser, Flüssen, Seen, Feuchtgebieten, Nutzung und Rückführung. Der Zweck ist praktisch: Veränderungen erkennen, den Schutz wesentlicher Wege prüfen und rechtliche Schritte auf Belege stützen, wenn der Schutz versagt.

+
@@ -210,6 +210,6 @@

Kolophon

- + diff --git a/site/de/index.html b/site/de/index.html index df31c8a..49eed3a 100644 --- a/site/de/index.html +++ b/site/de/index.html @@ -33,14 +33,15 @@ - + - + +
@@ -84,7 +85,7 @@

Wasser und Eis in der Schweiz

- +

@@ -407,6 +408,6 @@

Dem Wasser folgen. Seine Wege schützen.

- + diff --git a/site/de/law.html b/site/de/law.html index a19eed1..e8b59d3 100644 --- a/site/de/law.html +++ b/site/de/law.html @@ -30,7 +30,7 @@ - + @@ -196,6 +196,6 @@

Wofür die Reihe auf dieser Karte taugt

- + diff --git a/site/de/method.html b/site/de/method.html index ce20b79..cc5e86b 100644 --- a/site/de/method.html +++ b/site/de/method.html @@ -30,7 +30,7 @@ - + @@ -345,6 +345,6 @@

Wie sie neu gebaut wird

- + diff --git a/site/de/sources.html b/site/de/sources.html index 81303ba..20424cc 100644 --- a/site/de/sources.html +++ b/site/de/sources.html @@ -30,7 +30,7 @@ - + @@ -132,6 +132,6 @@

Lizenzen und Quellenangabe

- + diff --git a/site/en/index.html b/site/en/index.html index 45beeed..4063c03 100644 --- a/site/en/index.html +++ b/site/en/index.html @@ -33,14 +33,15 @@ - + - + +
@@ -85,7 +86,7 @@

Water and ice in Switzerland

- +

@@ -466,6 +467,6 @@

Follow the water. Protect its pathways.

- + diff --git a/site/fr/about.html b/site/fr/about.html index a80c6ad..4a66b83 100644 --- a/site/fr/about.html +++ b/site/fr/about.html @@ -30,7 +30,7 @@ - + @@ -79,10 +79,10 @@
-

À propos

-

Une base mesurée, et un argument sur l’âge

-

La Suisse se trouve en amont de quatre mers européennes. Une grande part du tableau publié repose sur des inférences tirées d’anciens registres. L’inférence est inévitable. La dissimuler ne l’est pas.

- +

Projet

+

Suivre l’eau. Protéger ses voies.

+

Riverflow rend observable le cycle de l’eau en Suisse — des précipitations en montagne, de la neige et de la glace jusqu’aux eaux souterraines, aux cours d’eau, aux lacs, aux zones humides, aux usages et aux retours. Le but est concret : détecter les changements, vérifier si les voies essentielles sont protégées et étayer une action en justice lorsqu’elles ne le sont pas.

+
@@ -210,6 +210,6 @@

Colophon

- + diff --git a/site/fr/index.html b/site/fr/index.html index 7062a1c..efbf1d8 100644 --- a/site/fr/index.html +++ b/site/fr/index.html @@ -33,14 +33,15 @@ - + - + +
@@ -84,7 +85,7 @@

L’eau et la glace en Suisse

- +

@@ -407,6 +408,6 @@

Suivre l’eau. Protéger ses voies.

- + diff --git a/site/fr/law.html b/site/fr/law.html index 419affc..1437cf6 100644 --- a/site/fr/law.html +++ b/site/fr/law.html @@ -30,7 +30,7 @@ - + @@ -196,6 +196,6 @@

Ce à quoi sert le relevé de cette carte

- + diff --git a/site/fr/method.html b/site/fr/method.html index b1b6df3..8a3c372 100644 --- a/site/fr/method.html +++ b/site/fr/method.html @@ -30,7 +30,7 @@ - + @@ -345,6 +345,6 @@

Comment elle est reconstruite

- + diff --git a/site/fr/sources.html b/site/fr/sources.html index c7f5fd2..61b09ee 100644 --- a/site/fr/sources.html +++ b/site/fr/sources.html @@ -30,7 +30,7 @@ - + @@ -132,6 +132,6 @@

Licences et mention de la source

- + diff --git a/site/i18n-map.js b/site/i18n-map.js index 0ee945e..a0ea34d 100644 --- a/site/i18n-map.js +++ b/site/i18n-map.js @@ -117,6 +117,65 @@ Object.assign(STR, { it: 'Nessuna serie di temperatura in questa lettura.', rm: 'Nagina seria da temperatura en questa lectura.', }, + 'm.chooseLayer': { en: 'Choose a layer', de: 'Ebene wählen', fr: 'Choisir une couche', it: 'Scegliere un livello', rm: 'Tscherner in nivel' }, + 'm.readingLayer': { en: 'Reading layer data…', de: 'Ebenendaten werden gelesen…', fr: 'Lecture des données de la couche…', it: 'Lettura dei dati del livello…', rm: 'Las datas dal nivel vegnan legidas…' }, + 'm.statusTemp': { + en: '{n} current temperature gauges · newest {t}', + de: '{n} aktuelle Temperaturmessstellen · neueste Messung {t}', + fr: '{n} stations de température actuelles · mesure la plus récente {t}', + it: '{n} stazioni di temperatura attuali · misura più recente {t}', + rm: '{n} staziuns actualas da temperatura · mesiraziun la pli nova {t}', + }, + 'm.statusQuality': { + en: '{parameter} · {year} · {samples} results at {stations} stations', + de: '{parameter} · {year} · {samples} Resultate an {stations} Messstellen', + fr: '{parameter} · {year} · {samples} résultats à {stations} stations', + it: '{parameter} · {year} · {samples} risultati in {stations} stazioni', + rm: '{parameter} · {year} · {samples} resultats a {stations} staziuns', + }, + 'm.statusReservoirs': { + en: '{n} supervised dams · power-reservoir energy {pct}% · {d}', + de: '{n} beaufsichtigte Stauanlagen · Energieinhalt der Speicherseen {pct}% · {d}', + fr: '{n} ouvrages surveillés · énergie des retenues {pct} % · {d}', + it: '{n} impianti sorvegliati · energia dei bacini {pct}% · {d}', + rm: '{n} implants survegliads · energia dals lais da serra {pct}% · {d}', + }, + 'm.statusIce': { + en: '{n} glacier bodies · six inventories, {from}–{to}', + de: '{n} Gletscherkörper · sechs Inventare, {from}–{to}', + fr: '{n} corps glaciaires · six inventaires, {from}–{to}', + it: '{n} corpi glaciali · sei inventari, {from}–{to}', + rm: '{n} corps da glatschers · sis inventaris, {from}–{to}', + }, + 'm.statusResidual': { + en: '{n} Q347 register points · register state {d}', + de: '{n} Q347-Registerpunkte · Registerstand {d}', + fr: '{n} points Q347 du registre · état du registre {d}', + it: '{n} punti Q347 del registro · stato del registro {d}', + rm: '{n} puncts Q347 dal register · stadi dal register {d}', + }, + 'm.statusUse': { + en: '{n} entries across four federal water-use registers', + de: '{n} Einträge in vier eidgenössischen Wassernutzungsregistern', + fr: '{n} entrées dans quatre registres fédéraux des usages de l’eau', + it: '{n} voci in quattro registri federali degli usi dell’acqua', + rm: '{n} endataziuns en quatter registers federals dal diever da l’aua', + }, + 'm.statusWet': { + en: '{n} protected objects · {inventories} federal inventories', + de: '{n} geschützte Objekte · {inventories} Bundesinventare', + fr: '{n} objets protégés · {inventories} inventaires fédéraux', + it: '{n} oggetti protetti · {inventories} inventari federali', + rm: '{n} objects protegids · {inventories} inventaris federals', + }, + 'm.statusSource': { + en: '{n} disclosed sources · each with link, date and licence', + de: '{n} offengelegte Quellen · jeweils mit Link, Datenstand und Lizenz', + fr: '{n} sources déclarées · chacune avec lien, date et licence', + it: '{n} fonti dichiarate · ciascuna con link, data e licenza', + rm: '{n} funtaunas decleradas · mintgamai cun link, data e licenza', + }, + 'm.statusSourceLoading': { en: 'Reading source dates…', de: 'Quellenstände werden gelesen…', fr: 'Lecture des dates des sources…', it: 'Lettura delle date delle fonti…', rm: 'Las datas da las funtaunas vegnan legidas…' }, 'm.tempCount': { en: '{n} gauges report temperature. Median {med} °C; {warm} at or above 20 °C; {above} above 25 °C and {at} exactly at it. Warmest: {top} °C at {where}.', de: '{n} Messstellen melden Temperatur. Median {med} °C; {warm} bei 20 °C oder darüber; {above} über 25 °C und {at} genau bei 25 °C. Höchstwert: {top} °C bei {where}.', @@ -843,7 +902,7 @@ Object.assign(STR, { 'm.qLoq': { en: 'determination limit {v} {unit}', de: 'Bestimmungsgrenze {v} {unit}', fr: 'limite de quantification {v} {unit}', it: 'limite di quantificazione {v} {unit}', rm: 'cunfin da quantificaziun {v} {unit}' }, 'm.qLod': { en: 'detection limit {v} {unit}', de: 'Nachweisgrenze {v} {unit}', fr: 'limite de détection {v} {unit}', it: 'limite di rilevamento {v} {unit}', rm: 'cunfin da cumprova {v} {unit}' }, 'm.qUncertainty': { en: 'uncertainty {v} {kind}', de: 'Messunsicherheit {v} {kind}', fr: 'incertitude {v} {kind}', it: 'incertezza {v} {kind}', rm: 'intschertezza da mesiraziun {v} {kind}' }, - 'm.dataEstimated': { en: 'Estimated from a gauge', de: 'Von einer Messstelle geschätzt', fr: 'Estimé à partir d’une station', it: 'Stimato da una stazione', rm: 'Stimà a partir d’ina staziun' }, + 'm.dataEstimated': { en: 'Estimated for this reach from a gauge', de: 'Für diesen Abschnitt aus einer Messstelle geschätzt', fr: 'Estimé pour ce tronçon à partir d’une station', it: 'Stimato per questo tratto da una stazione', rm: 'Stimà per questa partida a partir d’ina staziun' }, 'm.dataNoValue': { en: 'No published value', de: 'Kein publizierter Wert', fr: 'Aucune valeur publiée', it: 'Nessun valore pubblicato', rm: 'Nagina valur publitgada' }, 'm.dataNoCurrent': { en: 'No current basis', de: 'Keine aktuelle Grundlage', fr: 'Aucune base actuelle', it: 'Nessuna base attuale', rm: 'Nagina basa actuala' }, 'm.dataReach': { en: 'River reach {id}', de: 'Gewässerabschnitt {id}', fr: 'Tronçon de cours d’eau {id}', it: 'Tratto di corso d’acqua {id}', rm: 'Partida dal flum {id}' }, diff --git a/site/index.html b/site/index.html index 10e3adb..8a526db 100644 --- a/site/index.html +++ b/site/index.html @@ -33,14 +33,15 @@ - + - + +
@@ -84,7 +85,7 @@

Wasser und Eis in der Schweiz

- +

@@ -407,6 +408,6 @@

Dem Wasser folgen. Seine Wege schützen.

- + diff --git a/site/it/about.html b/site/it/about.html index edbcd63..5848a7c 100644 --- a/site/it/about.html +++ b/site/it/about.html @@ -30,7 +30,7 @@ - + @@ -79,10 +79,10 @@
-

Informazioni

-

Una base misurata, e un argomento sull’età

-

La Svizzera si trova a monte di quattro mari europei. Gran parte del quadro pubblicato deriva da inferenze su registri datati. L’inferenza è inevitabile. Nasconderla non lo è.

- +

Progetto

+

Seguire l’acqua. Proteggere i suoi percorsi.

+

Riverflow rende osservabile il ciclo dell’acqua in Svizzera: dalle precipitazioni in montagna, dalla neve e dal ghiaccio fino alle acque sotterranee, ai fiumi, ai laghi, alle zone umide, agli usi e alle restituzioni. Lo scopo è concreto: rilevare i cambiamenti, verificare se i percorsi essenziali sono protetti e sostenere azioni legali basate su prove quando non lo sono.

+
@@ -210,6 +210,6 @@

Colophon

- + diff --git a/site/it/index.html b/site/it/index.html index 375fb12..8d1e705 100644 --- a/site/it/index.html +++ b/site/it/index.html @@ -33,14 +33,15 @@ - + - + +
@@ -84,7 +85,7 @@

Acqua e ghiaccio in Svizzera

- +

@@ -407,6 +408,6 @@

Seguire l’acqua. Proteggere i suoi percorsi.

- + diff --git a/site/it/law.html b/site/it/law.html index 8efc20b..8f2e67c 100644 --- a/site/it/law.html +++ b/site/it/law.html @@ -30,7 +30,7 @@ - + @@ -196,6 +196,6 @@

A che cosa serve la serie su questa carta

- + diff --git a/site/it/method.html b/site/it/method.html index 692f512..df35187 100644 --- a/site/it/method.html +++ b/site/it/method.html @@ -30,7 +30,7 @@ - + @@ -345,6 +345,6 @@

Come viene ricostruita

- + diff --git a/site/it/sources.html b/site/it/sources.html index 8c7422e..dade7f1 100644 --- a/site/it/sources.html +++ b/site/it/sources.html @@ -30,7 +30,7 @@ - + @@ -132,6 +132,6 @@

Licenze e indicazione della fonte

- + diff --git a/site/law.html b/site/law.html index 9ebb10d..403606b 100644 --- a/site/law.html +++ b/site/law.html @@ -30,7 +30,7 @@ - + @@ -344,6 +344,6 @@

What the record on this map is good for

- + diff --git a/site/method.html b/site/method.html index bfafb51..e957591 100644 --- a/site/method.html +++ b/site/method.html @@ -30,7 +30,7 @@ - + @@ -593,6 +593,6 @@

How it is rebuilt

- + diff --git a/site/rm/about.html b/site/rm/about.html index 222064c..2efb1f0 100644 --- a/site/rm/about.html +++ b/site/rm/about.html @@ -30,7 +30,7 @@ - + @@ -79,10 +79,10 @@
-

Davart

-

Ina basa mesirada, ed in argument davart la vegliadetgna

-

La Svizra è situada amunt da quatter mars europeicas. Ina gronda part dal maletg publitgà sa basa sin conclusiuns da registers vegls. Conclusiuns èn inevitablas. Las zuppentar betg.

- +

Project

+

Suandar l’aua. Proteger sias vias.

+

Riverflow renda observabel il ciclus da l’aua en Svizra – da la precipitaziun en muntogna, da la naiv e dal glatsch fin a l’aua sutterrana, ils flums, ils lais, las zonas umidas, il diever e la restituziun. La finamira è pratica: percorscher midadas, controllar sche ils percurs essenzials èn protegids e sustegnair pass giuridics basads sin cumprovas, sch’els n’èn betg protegids.

+
@@ -210,6 +210,6 @@

Colophon

- + diff --git a/site/rm/index.html b/site/rm/index.html index 9cf76d7..efd327b 100644 --- a/site/rm/index.html +++ b/site/rm/index.html @@ -33,14 +33,15 @@ - + - + +
@@ -84,7 +85,7 @@

Aua e glatsch en Svizra

- +

@@ -407,6 +408,6 @@

Suandar l’aua. Proteger sias vias.

- + diff --git a/site/rm/law.html b/site/rm/law.html index 970c5de..02c9f36 100644 --- a/site/rm/law.html +++ b/site/rm/law.html @@ -30,7 +30,7 @@ - + @@ -196,6 +196,6 @@

Per tge che la seria sin questa charta è buna

- + diff --git a/site/rm/method.html b/site/rm/method.html index 3ee5e71..886f405 100644 --- a/site/rm/method.html +++ b/site/rm/method.html @@ -30,7 +30,7 @@ - + @@ -345,6 +345,6 @@

Co ch’ella vegn rebajegiada

- + diff --git a/site/rm/sources.html b/site/rm/sources.html index f8f0dc9..445c571 100644 --- a/site/rm/sources.html +++ b/site/rm/sources.html @@ -30,7 +30,7 @@ - + @@ -132,6 +132,6 @@

Licenzas ed indicaziun da la funtauna

- + diff --git a/site/site.js b/site/site.js index 6ac124d..24e90f6 100644 --- a/site/site.js +++ b/site/site.js @@ -66,6 +66,12 @@ (function toc() { const rail = document.querySelector('.toc'); if (!rail) return; + const disclosure = rail.closest('details'); + const wide = window.matchMedia('(min-width: 1080px)'); + // English source pages stay open in markup as a progressive-enhancement + // fallback. Once JavaScript is available, a narrow screen starts with the + // contents folded so the page heading and purpose are immediately visible. + if (disclosure && !wide.matches) disclosure.open = false; const links = new Map(); for (const a of rail.querySelectorAll('a[href^="#"]')) links.set(a.getAttribute('href').slice(1), a); const secs = [...links.keys()].map(id => document.getElementById(id)).filter(Boolean); @@ -87,17 +93,14 @@ for (const s of secs) io.observe(s); // A rail that folds shut on a phone should not fold shut again on every tap. for (const a of links.values()) a.addEventListener('click', () => { - const d = rail.closest('details'); - if (d && window.matchMedia('(max-width: 1079px)').matches) d.open = false; + if (disclosure && !wide.matches) disclosure.open = false; }); // ...and having folded shut, it has to come back when the window widens. At // 1080 px the summary is display:none, because the rail is meant to be a // permanently open column there — so a rail left closed by a tap at phone width // would have neither list nor control, and no way back short of a reload. - const wide = window.matchMedia('(min-width: 1080px)'); - const reopen = e => { const d = rail.closest('details'); if (d && e.matches) d.open = true; }; - wide.addEventListener('change', reopen); - reopen(wide); + const resizeDisclosure = e => { if (disclosure) disclosure.open = e.matches; }; + wide.addEventListener('change', resizeDisclosure); })(); // ---- Art. 31(1) GSchG, with the reader's own figure -------------------------- diff --git a/site/sources.html b/site/sources.html index 301e5d5..fcc7313 100644 --- a/site/sources.html +++ b/site/sources.html @@ -30,7 +30,7 @@ - + @@ -190,6 +190,6 @@

Licences and attribution

- + diff --git a/site/style.css b/site/style.css index 8278a03..02aa9cd 100644 --- a/site/style.css +++ b/site/style.css @@ -143,7 +143,7 @@ html, body { height: 100%; overflow: hidden; overscroll-behavior: none; } .modeGroup { display: flex; align-items: center; gap: 2px; } .modeGroup + .modeGroup { border-left: 1px solid var(--rule); padding-left: 5px; margin-left: 2px; } .modeGroupLabel { - font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; + font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-muted); padding: 0 5px 0 3px; user-select: none; } #modes button { @@ -851,9 +851,26 @@ body.hasRibbon #credits { display: none; } #dataView { width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; margin: 0; padding: 22px 16px 16px; border: 0; border-radius: 0; } #dataViewLead { font-size: 13px; } - .dataTableWrap { max-height: calc(100dvh - 375px); } - #dataView th, #dataView td { min-width: 112px; padding: 9px 10px 9px 0; } - #dataView th:first-child, #dataView td:first-child { min-width: 170px; } + .dataTableWrap { max-height: calc(100dvh - 340px); overflow-x: hidden; overflow-y: auto; border: 0; } + #dataView table, #dataView tbody { display: block; width: 100%; } + #dataView thead { + position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; + overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; + } + #dataView tbody { display: grid; gap: 9px; } + #dataView tr { + display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px 14px; + padding: 12px; background: var(--surface-2); border: 1px solid var(--rule); border-radius: 8px; + } + #dataView td { + display: block; min-width: 0; padding: 0; border: 0; + overflow-wrap: anywhere; word-break: normal; + } + #dataView td:first-child, #dataView td:nth-child(4), #dataView td:only-child { grid-column: 1 / -1; } + #dataView td[data-label]::before { + display: block; margin-bottom: 3px; color: var(--ink-muted); content: attr(data-label); + font: 600 10px/1.2 var(--sans); letter-spacing: .07em; text-transform: uppercase; + } .dataFooter { flex-wrap: wrap; } #dataStatus { flex-basis: 100%; } @@ -1118,7 +1135,7 @@ body.hasRibbon #credits { display: none; } #workspace #titlebar .stamp { margin-top: 6px; } #workspace #evidence { display: none; } #workspace #modeRail { - position: sticky; z-index: 7; top: 0; + position: static; z-index: 7; display: block; min-width: 0; background: var(--surface-1); border-bottom: 1px solid var(--rule); } @@ -1139,6 +1156,7 @@ body.hasRibbon #credits { display: none; } } #workspace #modeRail.canScrollBack .modeRailCue-start, #workspace #modeRail.canScrollForward .modeRailCue-end { opacity: 1; } +#mobileModePicker { display: none; } @media (min-width: 1100px) and (min-height: 860px) { #workspace #evidence { display: block; } } @@ -1155,19 +1173,19 @@ body.hasRibbon #credits { display: none; } border: 0; border-radius: 0; } #workspace .modeGroup { - display: grid; grid-template-columns: 68px minmax(0, 1fr); + display: grid; grid-template-columns: 82px minmax(0, 1fr); align-items: stretch; gap: 3px; min-width: 0; padding: 3px 4px; } #workspace .modeGroup:first-child, -#workspace .modeGroup:nth-child(4) { grid-template-columns: 68px repeat(3, minmax(0, 1fr)); } -#workspace .modeGroup:nth-child(3) { grid-template-columns: 68px repeat(2, minmax(0, 1fr)); } +#workspace .modeGroup:nth-child(4) { grid-template-columns: 82px repeat(3, minmax(0, 1fr)); } +#workspace .modeGroup:nth-child(3) { grid-template-columns: 82px repeat(2, minmax(0, 1fr)); } #workspace .modeGroup + .modeGroup { margin: 0; border-left: 0; border-top: 1px solid var(--rule); padding-left: 4px; } #workspace .modeGroupLabel { display: flex; align-items: center; grid-column: auto; padding: 0 5px; - font-size: 8.5px; line-height: 1.2; + font-size: 10px; line-height: 1.2; } #workspace #modes button { min-width: 0; min-height: 38px; padding: 7px 6px; @@ -1433,6 +1451,22 @@ body.hasRibbon #workspace #credits { display: block; } #workspace #introTitle { font-size: clamp(31px, 9vw, 43px); } #workspace .introLangs [lang] { min-width: 40px; min-height: 44px; } } +@media (max-width: 480px) { + #workspace #modeRail { display: none; } + #workspace #mobileModePicker { + position: sticky; z-index: 7; top: 0; + display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 10px; + padding: 7px calc(10px + var(--safe-r)) 7px calc(10px + var(--safe-l)); + color: var(--ink-muted); background: var(--surface-1); border-bottom: 1px solid var(--rule); + font-size: 11px; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; + } + #workspace #modeSelect { + width: 100%; min-width: 0; min-height: 44px; padding: 7px 34px 7px 11px; + color: var(--ink); background: var(--surface-2); border: 1px solid var(--control-border); + border-radius: 6px; font: 600 14px/1.2 var(--sans); letter-spacing: 0; text-transform: none; + } + #workspace #modeSelect:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; } +} @media (max-width: 480px) and (max-height: 650px) and (orientation: portrait) { :root { --workspace-h: 62dvh; } #workspace #titlebar { padding-top: 6px; padding-bottom: 4px; } @@ -1506,6 +1540,7 @@ body.workspaceReading #workspaceRead { display: none; } body.workspaceReading #dataViewOpen { margin-left: auto; } body.workspaceReading #workspaceScroll > #titlebar, body.workspaceReading #workspaceScroll > #modeRail, +body.workspaceReading #workspaceScroll > #mobileModePicker, body.workspaceReading #workspaceScroll > #mapControls, body.workspaceReading #workspaceScroll > #liveAlerts, body.workspaceReading #workspaceScroll > #tooltip,