diff --git a/build/pages/index.en.html b/build/pages/index.en.html index a139ff8..d370fdb 100644 --- a/build/pages/index.en.html +++ b/build/pages/index.en.html @@ -34,7 +34,7 @@ - + diff --git a/build/pages/updates.json b/build/pages/updates.json index ed95d13..f4777ce 100644 --- a/build/pages/updates.json +++ b/build/pages/updates.json @@ -512,5 +512,9 @@ "Storage, spring discharge and recharge": {"de":"Vorrat, Quellschüttung und Neubildung","fr":"Réserves, débit des sources et recharge","it":"Riserve, portata delle sorgenti e ricarica","rm":"Reserva, defluss da las funtaunas e rimplazzament"}, "Four historical registers; annual public drinking-water supply": {"de":"Vier historische Register; jährliche öffentliche Trinkwasserversorgung","fr":"Quatre registres historiques ; distribution publique annuelle d’eau potable","it":"Quattro registri storici; approvvigionamento pubblico annuale di acqua potabile","rm":"Quatter registers istorics; provediment public annual d’aua da baiver"}, "The national water balance, stores and uses": {"de":"Die nationale Wasserbilanz, Speicher und Nutzungen","fr":"Le bilan hydrique national, les réserves et les utilisations","it":"Il bilancio idrico nazionale, le riserve e gli utilizzi","rm":"La bilantscha d’aua naziunala, las reservas e las utilisaziuns"}, - "Current outflow, groundwater, lake levels and drought": {"de":"Aktueller Abfluss, Grundwasser, Seestände und Trockenheit","fr":"Écoulement actuel, eaux souterraines, niveaux des lacs et sécheresse","it":"Deflusso attuale, acque sotterranee, livelli dei laghi e siccità","rm":"Defluss actual, aua sutterrana, nivels dals lais e sitgira"} + "Current outflow, groundwater, lake levels and drought": {"de":"Aktueller Abfluss, Grundwasser, Seestände und Trockenheit","fr":"Écoulement actuel, eaux souterraines, niveaux des lacs et sécheresse","it":"Deflusso attuale, acque sotterranee, livelli dei laghi e siccità","rm":"Defluss actual, aua sutterrana, nivels dals lais e sitgira"}, + "Groundwater and lakes, site by site": {"de":"Grundwasser und Seen, Messstelle für Messstelle","fr":"Eaux souterraines et lacs, station par station","it":"Acque sotterranee e laghi, stazione per stazione","rm":"Aua sutterrana e lais, staziun per staziun"}, + "Each square is one monitoring site, placed by where its latest monthly mean stands in its own 1991–2020 record for the same month: below the 20th percentile, between the 20th and 80th, or above the 80th. Point at a square for the site and its values.": {"de":"Jedes Quadrat ist eine Messstelle, eingeordnet danach, wo ihr jüngstes Monatsmittel in ihrer eigenen Messreihe 1991–2020 für denselben Monat liegt: unter dem 20. Perzentil, zwischen dem 20. und dem 80. oder über dem 80. Zeigen Sie auf ein Quadrat für die Messstelle und ihre Werte.","fr":"Chaque carré est une station de mesure, classée selon la place de sa dernière moyenne mensuelle dans sa propre série 1991–2020 pour le même mois : sous le 20e centile, entre le 20e et le 80e, ou au-dessus du 80e. Pointez un carré pour voir la station et ses valeurs.","it":"Ogni quadrato è una stazione di misura, collocata secondo la posizione della sua ultima media mensile nella propria serie 1991–2020 per lo stesso mese: sotto il 20° percentile, tra il 20° e l’80° o sopra l’80°. Puntate su un quadrato per la stazione e i suoi valori.","rm":"Mintga quadrat è ina staziun da mesiraziun, ordinada tenor nua che sia ultima media mensila stat en sia atgna seria 1991–2020 per il medem mais: sut il 20avel percentil, tranter il 20avel e l’80avel u sur l’80avel. Mussai sin in quadrat per la staziun e sias valurs."}, + "Show the numbers": {"de":"Zahlen anzeigen","fr":"Afficher les chiffres","it":"Mostra i numeri","rm":"Mussar las cifras"}, + "Every other use": {"de":"Alle übrigen Nutzungen","fr":"Toutes les autres utilisations","it":"Tutti gli altri utilizzi","rm":"Tut las autras utilisaziuns"} } diff --git a/site/about.html b/site/about.html index b11b940..1368c5d 100644 --- a/site/about.html +++ b/site/about.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/budget.html b/site/budget.html index 8b60df1..1623aa7 100644 --- a/site/budget.html +++ b/site/budget.html @@ -30,8 +30,8 @@ - - + + @@ -98,12 +98,17 @@

Water leaving the country

where most Swiss water crosses the border, as a share of the 1991–2020 mean for the same month. Together they carry about five sixths of the national outflow; the Ticino, the Inn, the Doubs and smaller border rivers carry the rest.

-
+

Drought regions

The combined drought index of the federal drought platform for its 38 warning regions, week by week. It merges precipitation over one, three and twenty-four months, river flow and modelled soil moisture into five levels, from 1, not dry, to 5, extremely dry.

-
+
+

Groundwater and lakes, site by site

+

Each square is one monitoring site, placed by where its latest monthly mean stands in its + own 1991–2020 record for the same month: below the 20th percentile, between the 20th + and 80th, or above the 80th. Point at a square for the site and its values.

+

@@ -114,7 +119,11 @@

The annual balance

ice, soil, groundwater and lakes. BAFU publishes the terms for political Switzerland, 41’285 km², in millimetres of water over that area. Here they are also given in cubic kilometres; one millimetre is 0.041 km³.

-
+
+
+
+

+

A model constrained by measurement. The figures come from the hydrological model PREVAH on a 200-metre grid. Measured discharge is treated as exact and @@ -129,7 +138,12 @@

By catchment

The same table gives the twelve large catchments BAFU balances separately. Their figures are in millimetres over each catchment’s own area and are compared here with that catchment’s own 1991–2020 mean.

-
+
+ +
+
Show the numbers
+
+

@@ -148,7 +162,14 @@

What is used

by the Swiss Gas and Water Industry Association (SVGW) published by the Federal Statistical Office. Every other national figure for abstraction describes 2006 or carries no year at all.

-
+

+
+
+ +
Show the numbers
+
+

+

Every other use

@@ -254,6 +275,6 @@

How this page is built

- + diff --git a/site/budget.js b/site/budget.js index d0552f5..fc4d024 100644 --- a/site/budget.js +++ b/site/budget.js @@ -10,6 +10,10 @@ * that their sizes can be compared, but no total is printed, because the sources * count the border lakes differently and the reservoir figure is a register of * capacity, not of water. + * + * The charts are SVG drawn at the width they are given and redrawn when it + * changes, so text is never stretched. Every mark that carries a number has a + * hover reading, and every chart has a table with the same numbers. */ (async function drawBudget() { const $ = id => document.getElementById(id); @@ -27,6 +31,8 @@ const km3 = v => nfd(v, 1) + ' km³'; const mm = v => nf(v) + ' mm'; const signed = (v, f) => (v > 0 ? '+' : v < 0 ? '−' : '') + f(Math.abs(v)); + const sum = xs => xs.reduce((a, x) => a + x, 0); + const REDUCED = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false; // Month names come from the browser's own calendar data, which has no Romansh. const RM_MONTHS = ['schaner', 'favrer', 'mars', 'avrigl', 'matg', 'zercladur', 'fanadur', 'avust', 'settember', 'october', 'november', 'december']; @@ -38,6 +44,69 @@ .format(new Date(Date.UTC(y, m - 1, 15))); }; + // ---- hover readings: one tooltip for the page, filled from a table of strings + // so that no markup has to survive an attribute. + const tips = [], tipIndex = new Map(); + const tip = html => { + if (!tipIndex.has(html)) tipIndex.set(html, tips.push(html) - 1); + return `data-tip="${tipIndex.get(html)}"`; + }; + const tipEl = document.createElement('div'); + tipEl.className = 'bTip'; + tipEl.setAttribute('role', 'tooltip'); + tipEl.hidden = true; + document.body.append(tipEl); + let tipOn = null; + function showTip(e) { + const t = e.target.closest?.('[data-tip]'); + if (!t) { hideTip(); return; } + if (t !== tipOn) { + tipOn?.classList.remove('on'); + tipOn = t; t.classList.add('on'); + tipEl.innerHTML = tips[t.dataset.tip]; + tipEl.hidden = false; + } + const r = tipEl.getBoundingClientRect(), pad = 14; + let x = e.clientX + pad, y = e.clientY - r.height - pad; + if (x + r.width > innerWidth - 8) x = e.clientX - r.width - pad; + if (x < 8) x = 8; + if (y < 8) y = e.clientY + pad; + tipEl.style.transform = `translate(${Math.round(x)}px,${Math.round(y)}px)`; + } + function hideTip() { tipOn?.classList.remove('on'); tipOn = null; tipEl.hidden = true; } + const main = $('main'); + main.addEventListener('pointermove', showTip); + main.addEventListener('pointerdown', showTip); + main.addEventListener('pointerleave', hideTip); + addEventListener('scroll', hideTip, { passive: true }); + + // Draw an SVG at the element's own width, and again whenever that width changes. + function responsive(el, draw) { + let w = 0; + const run = () => { + const nw = Math.round(el.clientWidth); + if (nw && nw !== w) { w = nw; draw(w); } + }; + new ResizeObserver(run).observe(el); + run(); + return () => { w = 0; run(); }; + } + const svg = (w, h, label, body) => + `${body}`; + const f1 = v => Math.round(v * 10) / 10; + // Time-axis labels: the last is always printed, flush right; the others only where + // they clear their neighbours, judged by the width of the monospace text. + const timeAxis = (cands, y) => { + const wOf = t => t.length * 6.5, last = cands.at(-1), stop = last.x - wOf(last.t) - 10; + let right = -Infinity, out = ''; + for (const c of cands.slice(0, -1)) { + if (c.x < right + 10 || c.x + wOf(c.t) > stop) continue; + out += `${c.t}`; + right = c.x + wOf(c.t); + } + return out + `${last.t}`; + }; + // ---- dateline const nat = b.national, Y = String(b.year), N = '1991-2020'; // BAFU stamps its table in German, "Bundesamt für Umwelt, September 2025". @@ -50,84 +119,237 @@ upd: fmtDate(c.meta.updated), m: month(c.meta.lastMonth), }); - // ---- now: one tile per store or flow, each with its own period + // ---- now: one tile per store or flow, each with its own period and a small + // picture of the same number: a bar against its reference, or one square per site. const o = c.outflow, om = o.months.at(-1); const res = b.stocks.find(s => s.key === 'reservoirs'); const ice = b.stocks.find(s => s.key === 'glaciers'); const dr = c.drought; const dry = dr.levels[3] + dr.levels[4]; + const STATE = { low: 'lo', normal: 'no', high: 'hi' }; + const ORDER = { low: 0, normal: 1, high: 2 }; + // The platform's 'depth' series are groundwater levels in metres above sea level. + const UNIT = { depth: 'bg.unit.masl', discharge_lmin: 'bg.unit.lmin', discharge_ms: 'bg.unit.ms', masl: 'bg.unit.masl' }; + const DIGITS = { depth: 2, discharge_lmin: 0, discharge_ms: 2, masl: 2 }; + const siteTip = (s, m) => `${esc(s.name)}${T('bg.kind.' + s.kind)} · ${T('bg.s.' + s.state)} + ${T('bg.tipSite', { + m: month(m), v: nfd(s.v, DIGITS[s.unit] ?? 1), u: T(UNIT[s.unit] ?? s.unit), + a: nfd(Math.min(s.p20, s.p80), DIGITS[s.unit] ?? 1), z: nfd(Math.max(s.p20, s.p80), DIGITS[s.unit] ?? 1), y: s.years, + })}`; + const sortSites = xs => xs.slice().sort((p, q) => ORDER[p.state] - ORDER[q.state] || p.name.localeCompare(q.name)); + // Square grids are laid out in even rows, so 45 sites are three rows of 15, not 22, 22 and 1. + const cols = n => `style="--cols:${Math.ceil(n / Math.ceil(n / 20))}"`; + const siteDots = (set, cls = '') => `${sortSites(set.stations).map(s => + ``).join('')}`; + // Regions at levels 1 and 2 are counted by the platform but not named in its summary. + const named = new Map(dr.driest.map(r => [r.cdi, []])); + for (const r of dr.driest) named.get(r.cdi).push(r.name); + const regionDots = `${[5, 4, 3, 2, 1].flatMap(l => { + const names = named.get(l) ?? []; + return Array.from({ length: dr.levels[l - 1] }, (_, i) => + `${names[i] ? esc(names[i]) : T('bg.cdi' + l)}${names[i] ? T('bg.cdi' + l) : ''}`)}>`); + }).join('')}`; + const meter = (v, max, ref, cls) => `${ + ref != null ? `` : ''}`; const tiles = [ - { big: pct(om.pct), label: T('bg.tOut'), sub: T('bg.tOutSub', { m: month(om.m), q: nf(om.q), n: nf(om.norm) }) }, + { big: pct(om.pct), label: T('bg.tOut'), sub: T('bg.tOutSub', { m: month(om.m), q: nf(om.q), n: nf(om.norm) }), + pic: meter(om.pct, Math.max(150, om.pct), 100, om.pct < 100 ? 'below' : 'above') }, { big: `${c.groundwater.low}/${c.groundwater.n}`, label: T('bg.tGw'), - sub: T('bg.tGwSub', { m: month(c.groundwater.month), high: c.groundwater.high }) }, + sub: T('bg.tGwSub', { m: month(c.groundwater.month), high: c.groundwater.high }), pic: siteDots(c.groundwater) }, { big: `${c.lakes.low}/${c.lakes.n}`, label: T('bg.tLake'), - sub: T('bg.tLakeSub', { m: month(c.lakes.month), high: c.lakes.high }) }, + sub: T('bg.tLakeSub', { m: month(c.lakes.month), high: c.lakes.high }), pic: siteDots(c.lakes) }, { big: `${dry}/${dr.regions}`, label: T('bg.tDry'), - sub: T('bg.tDrySub', { d: fmtDate(dr.week), soil: dr.soilMedian ?? '—' }) }, + sub: T('bg.tDrySub', { d: fmtDate(dr.week), soil: dr.soilMedian ?? '—' }), pic: regionDots }, { big: pct(res.fill.pct), label: T('bg.tRes'), - sub: T('bg.tResSub', { d: fmtDate(res.fill.d), rank: esc(D(res.fill.rank)) }) }, + sub: T('bg.tResSub', { d: fmtDate(res.fill.d), rank: esc(D(res.fill.rank)) }), pic: meter(res.fill.pct, 100, null, 'store') }, { big: '−' + nfd(ice.lossLastPct, 1) + ' %', label: T('bg.tIce', { y: ice.lossYear }), - sub: T('bg.tIceSub', { loss: nfd(ice.lossLast, 1), left: nfd(ice.km3, 1) }) }, + sub: T('bg.tIceSub', { loss: nfd(ice.lossLast, 1), left: nfd(ice.km3, 1) }), + pic: meter(ice.km3, ice.km3In2000, null, 'ice') }, ]; $('nowTiles').innerHTML = tiles.map(t => `
-

${t.big}

${t.label}

${t.sub}

`).join(''); +

${t.big}

${t.pic}

${t.label}

${t.sub}

`).join(''); - // ---- outflow: 24 months as a share of the same month's mean - const top = Math.max(150, ...o.months.map(r => r.pct)); - const tick = v => `${pct(v)}`; - $('outflowFig').innerHTML = ` - -
${o.months.map((r, i) => `${(i % 3 === 0 && i < o.months.length - 2) || i === o.months.length - 1 - ? `${month(r.m, true)}${r.m.endsWith('-01') || i === 0 ? ' ' + r.m.slice(2, 4) : ''}` : ''}`).join('')}
- + // ---- outflow: 24 months as a share of the same month's mean, drawn from the + // mean line, so a bar's length is the departure and its side is the sign. + const outTip = r => `${month(r.m)}${T('bg.tipShare', { p: pct(r.pct) })} + ${esc(o.gauges[0].name)}: ${nf(r.byGauge[0])} m³/s + ${esc(o.gauges[1].name)}: ${nf(r.byGauge[1])} m³/s + ${T('bg.tipMean', { n: nf(r.norm) })}`; + responsive($('outflowChart'), W => { + const H = W < 480 ? 190 : 230, top = Math.ceil(Math.max(160, ...o.months.map(r => r.pct)) / 10) * 10; + const pT = 14, pB = 24, pR = 44, pw = W - pR, n = o.months.length, step = pw / n; + const y = v => pT + (1 - v / top) * (H - pT - pB); + let g = ''; + for (const v of [50, 100, 150]) { + if (v > top) continue; + g += ` + ${nf(v)} %`; + } + const y0 = y(100), cands = []; + o.months.forEach((r, i) => { + const y1 = y(r.pct), x = i * step + 1, w = Math.max(1, step - 2); + g += ``; + if (i % 3 === 0 || i === n - 1) cands.push({ x: i === n - 1 ? x + w : x, + t: month(r.m, true) + (r.m.endsWith('-01') || i === 0 ? ' ' + r.m.slice(2, 4) : '') }); + }); + g += timeAxis(cands, H - 6); + const last = o.months.at(-1), ly = y(last.pct); + g += `${pct(last.pct)}`; + g += o.months.map((r, i) => ``).join(''); + $('outflowChart').innerHTML = svg(W, H, T('bg.outAria', { from: month(o.months[0].m), to: month(om.m) }), g); + }); + $('outflowAfter').innerHTML = ` +
  • ${T('bg.keyBelow')}
  • ${T('bg.keyAbove')}
  • +
  • ${T('bg.meanLine')}

${T('bg.outNote', { from: month(o.last12.from), to: month(o.last12.to), v: nfd(o.last12.km3, 1), n: nfd(o.last12.normKm3, 1), p: o.last12.pct })}

${T('bg.showNumbers')}
- ${o.months.map(r => ` + ${o.months.slice().reverse().map(r => ``).join('')}
${T('bg.thMonth')}${esc(o.gauges[0].name)} ${esc(o.gauges[1].name)}${T('bg.thMeanMonth')}${T('bg.thShare')}
${month(r.m)}${nf(r.byGauge[0])} m³/s
${month(r.m)}${nf(r.byGauge[0])} m³/s ${nf(r.byGauge[1])} m³/s${nf(r.norm)} m³/s${pct(r.pct)}
`; - // ---- drought: 52 weeks of the five levels, stacked to the 38 regions - $('droughtFig').innerHTML = ` - -
${dr.weeks.map((w, i) => `${(i % 8 === 0 && i < dr.weeks.length - 5) || i === dr.weeks.length - 1 ? fmtDate(w[0]).slice(0, 5) : ''}`).join('')}
+ // ---- drought: a year of weeks, each column the 38 regions sorted by level with + // the driest at the foot, so the height of the warm part is the share in drought. + const weekTip = w => `${T('bg.tipWeek', { d: fmtDate(w[0]) })}${[5, 4, 3, 2, 1].map(l => + `${T('bg.cdi' + l)}: ${w[l]}`).join('')}`; + responsive($('droughtChart'), W => { + const H = W < 480 ? 150 : 180, pT = 8, pB = 24, pR = 44, pw = W - pR, n = dr.weeks.length, step = pw / n; + const ph = H - pT - pB, k = ph / dr.regions, cands = []; + let g = ''; + for (const v of [0, Math.round(dr.regions / 2), dr.regions]) { + g += `${v}`; + } + dr.weeks.forEach((w, i) => { + let yb = pT + ph; + const x = i * step + 0.5, cw = Math.max(1, step - 1); + for (const l of [5, 4, 3, 2, 1]) { + if (!w[l]) continue; + const h = w[l] * k; + g += ``; + yb -= h; + } + if (i % 8 === 0 || i === n - 1) cands.push({ x: i === n - 1 ? x + cw : x, t: fmtDate(w[0]).slice(0, 5) }); + }); + g += timeAxis(cands, H - 6); + g += dr.weeks.map((w, i) => ``).join(''); + $('droughtChart').innerHTML = svg(W, H, T('bg.dryAria', { from: fmtDate(dr.weeks[0][0]), to: fmtDate(dr.week) }), g); + }); + $('droughtAfter').innerHTML = `
    ${[1, 2, 3, 4, 5].map(l => `
  • ${T('bg.cdi' + l)}
  • `).join('')}
${dr.driest.length ? `

${T('bg.dryList', { d: fmtDate(dr.week) })} ${ dr.driest.filter(r => r.cdi === 5).map(r => esc(r.name)).join(', ') || '—'}.

` : ''}`; + + // ---- groundwater and lakes, one square per site + const siteBlock = (set, key) => { + const counts = ['low', 'normal', 'high'].map(s => `${T('bg.s.' + s)} ${set[s]}`).join(''); + return `

${T(key, { n: set.n, m: month(set.month) })}

+ ${siteDots(set, 'big')}

${counts}

`; + }; + const siteRows = set => sortSites(set.stations).map(s => `${esc(s.name)}${T('bg.kind.' + s.kind)} + ${T('bg.s.' + s.state)} + ${nfd(s.v, DIGITS[s.unit] ?? 1)} ${T(UNIT[s.unit] ?? s.unit)} + ${nfd(Math.min(s.p20, s.p80), DIGITS[s.unit] ?? 1)}–${nfd(Math.max(s.p20, s.p80), DIGITS[s.unit] ?? 1)} + ${s.years}`).join(''); + $('sitesFig').innerHTML = `
${siteBlock(c.groundwater, 'bg.gwSites')}${siteBlock(c.lakes, 'bg.lakeSites')}
+
${T('bg.showSites')}
+ + + ${siteRows(c.groundwater)}${siteRows(c.lakes)}
${T('bg.thSite')}${T('bg.thKind')}${T('bg.thState')}${month(c.groundwater.month)}${T('bg.thRange')}${T('bg.thYears')}
`; $('nowNote').innerHTML = T('bg.nowNote', { gw: c.groundwater.skipped.shortRecord + c.groundwater.skipped.noRecent, lk: c.lakes.skipped.shortRecord + c.lakes.skipped.noRecent, min: c.meta.minYears, }); - // ---- balance: what comes in equals what goes out, for one chosen period + // ---- balance: what comes in equals what goes out. A flow diagram for one + // period: the inputs on the left run into the country, the outputs leave on the + // right, and every band is as thick as its volume. const LABEL = { P: T('bg.P'), inflow: T('bg.inflow'), draw: T('bg.draw'), E: T('bg.E'), outflow: T('bg.outflow'), gain: T('bg.gain') }; - function balance(p) { + const terms = p => { const t = nat[p], k = t.km3; const ins = [['P', t.P, k.P], ['inflow', t.inflow, k.inflow]]; const outs = [['E', t.E, k.E], ['outflow', t.outflow, k.outflow]]; - if (t.dS < 0) ins.push(['draw', -t.dS, -k.dS]); else if (t.dS > 0) outs.push(['gain', t.dS, k.dS]); - const total = ins.reduce((a, x) => a + x[1], 0); - const row = (name, xs) => `
${name}
${ - xs.map(([key, v]) => ``).join('')}
`; - $('balanceFig').innerHTML = ` -
${b.periods.slice().reverse().map(q => - ``).join('')}
- ${row(T('bg.in'), ins)}${row(T('bg.out'), outs)} -
    ${[...ins, ...outs].map(([key, v, q]) => `
  • ${esc(LABEL[key])} - ${mm(v)} · ${km3(q)}
  • `).join('')}
-

${T('bg.balSum', { t: mm(total), k: km3(total * b.meta.areaKm2 / 1e6) })}

`; - for (const btn of $('balanceFig').querySelectorAll('button[data-p]')) btn.addEventListener('click', () => balance(btn.dataset.p)); + ins.push(['draw', Math.max(0, -t.dS), Math.max(0, -k.dS)]); + outs.push(['gain', Math.max(0, t.dS), Math.max(0, k.dS)]); + return { ins, outs }; + }; + let period = Y, shown = terms(Y), redrawFlow; + function flow(W) { + const { ins, outs } = shown, target = terms(period); + // Wide, the labels stand in gutters beside the nodes; narrow, they sit on their bands. + const narrow = W < 560, gut = W >= 720 ? 172 : 0, H = narrow ? 330 : 380, pT = 46, pB = 10, nw = narrow ? 8 : 10, gap = narrow ? 22 : 26; + // One scale for every period, so a wet year is drawn bigger than the normal. + const tot = Math.max(sum(ins.map(x => x[1])), sum(outs.map(x => x[1]))), most = Math.max(tot, ...b.periods.map(q => sum(terms(q).ins.map(x => x[1])))); + const count = xs => xs.filter(x => x[1] > 0).length; + const k = (H - pT - pB - gap * (Math.max(count(ins), count(outs)) - 1)) / most; + const cx = W / 2 - nw / 2, ch = tot * k, cy = pT + (H - pT - pB - ch) / 2; + // Each side is stacked with gaps and centred; the centre column has none. + const stack = xs => { + const live = xs.filter(x => x[1] > 0), h = sum(live.map(x => x[1] * k)) + gap * (live.length - 1); + let yy = pT + (H - pT - pB - h) / 2, cc = cy; + return xs.map(x => { + const hh = x[1] * k, r = { key: x[0], y: yy, h: hh, cy: cc }; + if (x[1] > 0) { yy += hh + gap; cc += hh; } + return r; + }); + }; + const xl = gut, xr = W - gut - nw; + const L = stack(ins), R = stack(outs), mid1 = (xl + nw + cx) / 2, mid2 = (cx + nw + xr) / 2; + const band = (x0, ya, x1, yb, h, m) => `M${f1(x0)},${f1(ya)}C${f1(m)},${f1(ya)} ${f1(m)},${f1(yb)} ${f1(x1)},${f1(yb)}V${f1(yb + h)}C${f1(m)},${f1(yb + h)} ${f1(m)},${f1(ya + h)} ${f1(x0)},${f1(ya + h)}Z`; + const tipOf = (key, side) => { + const x = target[side].find(t => t[0] === key); + return `${esc(LABEL[key])}${mm(x[1])} · ${km3(x[2])}${pct(Math.round(100 * x[1] / sum(target[side].map(t => t[1]))))} ${T('bg.ofTotal')}`; + }; + let g = ''; + for (const n of L) if (n.h > 0.2) g += ``; + for (const n of R) if (n.h > 0.2) g += ``; + for (const n of L) if (n.h > 0.2) g += ``; + for (const n of R) if (n.h > 0.2) g += ``; + g += ` + ${T('bg.ch')} + ${nf(b.meta.areaKm2)} km²`; + // Labels sit over their own band beside the node; a thin band's label is pushed + // clear of its neighbour rather than overlapping it. + const labels = (nodes, side, x, anchor) => { + const live = nodes.map(n => [n, target[side].find(v => v[0] === n.key)]).filter(([, t]) => t[1] > 0); + const ys = []; + live.forEach(([n], i) => ys.push(Math.max(n.y + n.h / 2 - 3, i ? ys[i - 1] + 36 : -Infinity))); + for (let i = ys.length - 1; i >= 0; i--) ys[i] = Math.min(ys[i], H - 22 - (ys.length - 1 - i) * 36); + return live.map(([n, t], i) => `${esc(LABEL[n.key])} + ${mm(t[1])} · ${km3(t[2])}`).join(''); + }; + g += gut ? labels(L, 'ins', xl - 10, 'end') + labels(R, 'outs', xr + nw + 10, 'start') + : labels(L, 'ins', nw + 8, 'start') + labels(R, 'outs', W - nw - 8, 'end'); + const desc = xs => xs.filter(x => x[1] > 0).map(x => `${LABEL[x[0]]} ${nf(x[1])} mm`).join(', '); + $('balanceChart').innerHTML = svg(W, H, T('bg.flowAria', { p: period === Y ? Y : period.replace('-', '–'), + ins: desc(target.ins), outs: desc(target.outs) }), g); } - balance(Y); + function setPeriod(p) { + const from = shown, to = terms(p); + period = p; + for (const btn of $('balancePick').querySelectorAll('button')) btn.setAttribute('aria-pressed', String(btn.dataset.p === p)); + const total = sum(to.ins.map(x => x[1])); + $('balanceSum').innerHTML = T('bg.balSum', { t: mm(total), k: km3(total * b.meta.areaKm2 / 1e6) }); + const W = $('balanceChart').clientWidth; + if (REDUCED || !W) { shown = to; redrawFlow(); return; } + // Tween the volumes, not the picture, so every frame is itself a closed budget. + const t0 = performance.now(), D = 520; + const mix = (a, z, s) => a.map((x, i) => [x[0], x[1] + (z[i][1] - x[1]) * s, x[2] + (z[i][2] - x[2]) * s]); + const frame = now => { + const s = Math.min(1, (now - t0) / D), e = 1 - Math.pow(1 - s, 3); + shown = { ins: mix(from.ins, to.ins, e), outs: mix(from.outs, to.outs, e) }; + flow(W); + if (s < 1) requestAnimationFrame(frame); + }; + requestAnimationFrame(frame); + } + $('balancePick').innerHTML = b.periods.slice().reverse().map(q => + ``).join(''); + $('balancePick').setAttribute('aria-label', T('bg.periodPick')); + for (const btn of $('balancePick').querySelectorAll('button')) btn.addEventListener('click', () => setPeriod(btn.dataset.p)); + redrawFlow = responsive($('balanceChart'), flow); + setPeriod(Y); const TERMS = [['P', 'bg.P'], ['E', 'bg.E'], ['R', 'bg.R'], ['dS', 'bg.dS'], ['inflow', 'bg.inflow'], ['outflow', 'bg.outflow']]; $('balanceTable').innerHTML = ` @@ -140,7 +362,38 @@ url: esc(b.meta.source.url), m: esc(b.meta.method.url), }); - // ---- catchments + // ---- catchments: each against its own normal, so a wet Ticino and a dry Jura + // can sit on one axis. + const share = (x, k) => x[N][k] ? Math.round(100 * x[Y][k] / x[N][k]) : null; + const CK = ['P', 'R', 'E']; + const catchTip = x => `${esc(x.name)}${CK.map(k => `${T('bg.' + k)}: ${mm(x[Y][k])} · ${pct(share(x, k))}`).join('')} + ${T('bg.dS')}: ${signed(x[Y].dS, mm)} (${T('bg.normDs', { v: signed(x[N].dS, mm) })})`; + const shape = (k, x, y, r) => k === 'P' ? `` + : k === 'R' ? `` + : ``; + const allShares = b.basins.flatMap(x => CK.map(k => share(x, k))).filter(v => v != null); + const lo = Math.min(80, Math.floor(Math.min(...allShares) / 20) * 20), hi = Math.max(140, Math.ceil(Math.max(...allShares) / 20) * 20); + responsive($('catchChart'), W => { + const narrow = W < 560, lw = narrow ? 0 : 168, rh = narrow ? 46 : 32, pT = 26; + const H = pT + rh * b.basins.length + 4, x = v => lw + 8 + (v - lo) / (hi - lo) * (W - lw - 16); + let g = ''; + for (let v = lo; v <= hi; v += 20) { + g += ` + ${nf(v)} %`; + } + b.basins.forEach((bs, i) => { + const y0 = pT + i * rh, cy = narrow ? y0 + 30 : y0 + rh / 2; + const vs = CK.map(k => share(bs, k)).filter(v => v != null); + g += `${esc(bs.name)}`; + g += ``; + for (const k of ['E', 'R', 'P']) { const v = share(bs, k); if (v != null) g += shape(k, x(v), cy, 5.4); } + g += ``; + }); + $('catchChart').innerHTML = svg(W, H, T('bg.catchAria', { y: Y }), g); + }); + const keyShape = k => ``; + $('catchKey').innerHTML = CK.map(k => `
  • ${keyShape(k)}${T('bg.' + k)} ${Y}
  • `).join('') + + `
  • ${T('bg.meanLine')}
  • `; const rel = (v, n) => n ? `
    ${pct(Math.round(100 * v / n))}` : ''; $('catchTable').innerHTML = `
    @@ -148,8 +401,8 @@ ${b.basins.map(x => ``).join('')}
    ${T('bg.thCatch')}${T('bg.P')} ${Y}
    ${esc(x.name)} ${mm(x[Y].P)}${rel(x[Y].P, x[N].P)}${mm(x[Y].R)}${rel(x[Y].R, x[N].R)} ${mm(x[Y].E)}${rel(x[Y].E, x[N].E)}${signed(x[Y].dS, mm)}
    ${ - T('bg.normDs', { v: signed(x[N].dS, mm) })}
    -

    ${T('bg.catchNote')}

    `; + T('bg.normDs', { v: signed(x[N].dS, mm) })}`).join('')}`; + $('catchNote').innerHTML = T('bg.catchNote'); // ---- stores, on one axis, with a year's flow beside them for scale const order = ['groundwater', 'lakes', 'glaciers', 'soil', 'reservoirs']; @@ -170,15 +423,51 @@ ${s.fill ? `
    ${T('bg.fillNow', { p: nfd(s.fill.pct, 1), d: fmtDate(s.fill.d) })}` : ''} ${esc(s.holder)}
    ${esc(D(s.doc))}, ${esc(D(s.pin))}`).join('')}`; - // ---- use - const dk = b.use.drinking.rows.slice(-10), last = dk.at(-1); - $('useFig').innerHTML = `

    ${T('bg.useLead', { y: last.y, v: nfd(last.total / 1000, 2), mio: nf(last.total), - share: nfd(100 * last.total / 1000 / nat[Y].km3.P, 1), py: Y, lpd: nf(last.lpd) })}

    - + // ---- use: public supply by source, every year the series has + const rows = b.use.drinking.rows, last = rows.at(-1), first = rows[0]; + const SRC = [['spring', 'bg.thSpring'], ['ground', 'bg.thGround'], ['lake', 'bg.thLake']]; + $('useLead').innerHTML = T('bg.useLead', { y: last.y, v: nfd(last.total / 1000, 2), mio: nf(last.total), + share: nfd(100 * last.total / 1000 / nat[Y].km3.P, 1), py: Y, lpd: nf(last.lpd) }) + ' ' + + T('bg.useTrend', { a: first.y, b: last.y, d: nf(Math.round(100 * (1 - last.total / first.total))), l0: nf(first.lpd), l1: nf(last.lpd) }); + const useTip = r => `${r.y}${T('bg.thTotal')}: ${nfd(r.total, 1)}${SRC.map(([k, l]) => + `${T(l)}: ${nfd(r[k], 1)}`).join('')}${T('bg.thLpd')}: ${nf(r.lpd)}`; + responsive($('useChart'), W => { + const narrow = W < 560, H = narrow ? 200 : 240, pT = 10, pB = 24, pL = 40, pR = narrow ? 0 : 104; + const top = Math.ceil(Math.max(...rows.map(r => r.total)) / 100) * 100, ph = H - pT - pB; + const pw = W - pL - pR, step = pw / rows.length, y = v => pT + ph - v / top * ph; + let g = ''; + for (let v = 0; v <= top; v += 250) { + g += ` + ${nf(v)}`; + } + rows.forEach((r, i) => { + const x = pL + i * step + 1, w = Math.max(1, step - 2); + let acc = 0; + for (const [k] of SRC) { + const y1 = y(acc + r[k]), y0 = y(acc); + g += ``; + acc += r[k]; + } + const lab = i === 0 || i === rows.length - 1 || (r.y % 5 === 0 && i > 1 && i < rows.length - 2); + if (lab) g += `${r.y}`; + }); + if (!narrow) { + let acc = 0, prev = Infinity; + for (const [k, l] of SRC) { + const yc = Math.min(y(acc + last[k] / 2) + 4, prev - 14); + prev = yc; acc += last[k]; + g += `${T(l)}`; + } + } + g += rows.map((r, i) => ``).join(''); + $('useChart').innerHTML = svg(W, H, T('bg.useAria', { a: first.y, b: last.y }), g); + }); + $('useKey').innerHTML = SRC.map(([k, l]) => `
  • ${T(l)}
  • `).join(''); + $('useTable').innerHTML = `
    ${T('bg.thYear')}${T('bg.thTotal')}
    - ${dk.slice().reverse().map(r => ` - `).join('')}
    ${T('bg.thYear')}${T('bg.thTotal')} ${T('bg.thSpring')}${T('bg.thGround')}${T('bg.thLake')}${T('bg.thLpd')}
    ${r.y}${nfd(r.total, 1)}${nfd(r.spring, 1)}${nfd(r.ground, 1)}${nfd(r.lake, 1)}${nf(r.lpd)}
    -

    ${T('bg.useNote', { url: esc(b.use.drinking.url), d: b.use.drinking.changed ? fmtDate(b.use.drinking.changed) : '—' })}

    `; + ${rows.slice().reverse().map(r => `${r.y}${nfd(r.total, 1)}${nfd(r.spring, 1)} + ${nfd(r.ground, 1)}${nfd(r.lake, 1)}${nf(r.lpd)}`).join('')}`; + $('useNote').innerHTML = T('bg.useNote', { url: esc(b.use.drinking.url), d: b.use.drinking.changed ? fmtDate(b.use.drinking.changed) : '—' }); $('useOther').innerHTML = `${b.use.other.map(u => ``).join('')}
    ${T('bg.thUse')}${T('bg.thVolume')}${T('bg.thYear')}
    ${T('bg.u.' + u.key)}
    ${T('bg.un.' + u.key)}
    ${nf(u.mioM3)} ${T('bg.mio')}${u.year ?? T('bg.noYear')}
    diff --git a/site/data/provenance.json b/site/data/provenance.json index a6583cc..922d2f1 100644 --- a/site/data/provenance.json +++ b/site/data/provenance.json @@ -1 +1 @@ -{"schema":3,"built":"2026-10-10T18:19:21.174Z","revision":"sha256:daf3c25319627f8d04e45afed2077cfce18b32dffdd75b1fb7e898354432cea5","publicationDigest":"sha256:daf3c25319627f8d04e45afed2077cfce18b32dffdd75b1fb7e898354432cea5","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":1396,"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":"waterBalance","holder":"BAFU","datenstand":"2024-12-31","live":false,"url":"https://www.bafu.admin.ch/de/wasserhaushalt-heute","links":[{"label":"method","url":"https://www.bafu.admin.ch/dam/de/sd-web/r5wsqRim2y1u/WHH_CH_WEL_2017_3_Methode.pdf"}],"licence":"No licence stated on the file; federal website terms, with source attribution."},{"key":"drinkingWater","holder":"BFS, from SVGW","datenstand":"2024-12-31","live":false,"url":"https://dam-api.bfs.admin.ch/hub/api/dam/assets/36409183/master","links":[],"licence":"BFS terms of use: free use with source 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-09-28","live":false,"url":"https://www.uvek-gis.admin.ch/BFE/ogd/17/ogd17_fuellungsgrad_speicherseen.csv","links":[],"licence":"opendata.swiss, attribution"},{"key":"drought","holder":"BAFU, MeteoSwiss, swisstopo","datenstand":"2026-10-09","live":false,"url":"https://data.geo.admin.ch/ch.bafu.trockenheitsdaten-numerisch","links":[{"label":"drought platform","url":"https://www.trockenheit.admin.ch/"}],"licence":"FSDI general terms of use, free use with source 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":24908,"sha256":"49832308b7b5f29cc114ead7cc16269e38d51daa15b62ba75da439ca7b41b7ce"},"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":15900,"sha256":"92ae244d9d83c10306e8512a72a3ec814eac06230e169573d477ac707304a566"},"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/19-budget.mjs":{"bytes":15850,"sha256":"405675cc891219904162e92b211d1e4d6d3c650d7b0cce2663e4a94cad03e1dc"},"build/20-conditions.mjs":{"bytes":11782,"sha256":"a4509400e1816dd0f7a45e9002c697683c174ba4d9142a50ba89ed515ff2a4b7"},"build/lib-stations.mjs":{"bytes":1501,"sha256":"17d8c00b36f96fba383b430f8f22d37c83e7c5f895fa9f99823dd0ead087b3f5"},"build/lib-zip.mjs":{"bytes":1246,"sha256":"0d54a4b7c4b3a78a444364fde62acaead60e070d20f679663d9bf9d4016ab510"},"build/pages/de.json":{"bytes":156677,"sha256":"4bdd81d5e4b205f3405499adce5583e55ac60ccefe61ffae2f36ba7198bbad17"},"build/pages/fr.json":{"bytes":160270,"sha256":"3624e910cc1ccd58d7e3425b29c364b359a7b47e233d2d589a3203554a464730"},"build/pages/index.en.html":{"bytes":29178,"sha256":"7074353fe015ff56a9a6713ee6dfd22027d2f301c1348009996f51b466da8072"},"build/pages/it.json":{"bytes":155782,"sha256":"d5e1798bfbec380d6ce9cd29ee0dcf7e0f70a4beb16b29b353ce8decb396d110"},"build/pages/rm.json":{"bytes":158840,"sha256":"d62410dc26fbba22c5ab9ddf8a17554920419de0291c49a41b16695303ed6bf7"},"build/pages/updates.json":{"bytes":306327,"sha256":"6489e358f496badbb36706e2e4d845455bc456bb4be87810a12ca773ea8fef9a"},"package-lock.json":{"bytes":63777,"sha256":"c3c32ff1af7525028f4c955f9aadba58f0a252692b04f3ee54958ebcbf268e50"},"package.json":{"bytes":1130,"sha256":"317d86ebd2d5bc91ea7a98b4984daebbbe315dba7a794b8f9baf0dedff16a221"},"scripts/check-external-links.mjs":{"bytes":2533,"sha256":"c2615d0a1bd52c49150888024bdf22493177afc66cc3a07b32fc47fa65ef7ff7"},"scripts/check-performance-budget.mjs":{"bytes":3047,"sha256":"8630fe16197ef7117271018b8b4d26ee8ef05ddc33b2302b1f21567957a41ab9"},"scripts/verify-site.mjs":{"bytes":46685,"sha256":"3817ed5cd502b324364eeafcd14b0f2cae178107488809b40707445de27267b2"}},"artifacts":{"about.html":{"bytes":23674,"sha256":"6541cda29370b4f74a9bc48b334ee666af877103942286b74919649f331703d3"},"app.js":{"bytes":182745,"sha256":"b43241b425bc0a751b7c42236ffc75120500453789f085346a781759bafcd992"},"budget.html":{"bytes":15950,"sha256":"fa95dacdb1406150cf57dfbce45ae504a1a1e93230c379b69b8e7869e945233a"},"budget.js":{"bytes":14161,"sha256":"751b0adf3412221bcff661ed68817882583ad77f5abd5c3c7d35df211a0f8e90"},"data/basins.json":{"bytes":3488,"sha256":"9fc9f8a3f55a42580dafac22eedf9f1090ee6b31873110719bde121ff968c537"},"data/budget.json":{"bytes":9406,"sha256":"c71e68c8028a31c38e1a839800f5b2ffc5ecf53bee68d375a92d3cf92a53006c"},"data/canton-monitoring.json":{"bytes":6601,"sha256":"5a0723e5a87ba9643591c466d653604e0418c364ed4487791c84e26afdbdbb69"},"data/cantons.json":{"bytes":3625,"sha256":"31d0e54c707c1cb511b22dfb263a3edaeeb81f098f5643dab3828e945f8e5b69"},"data/conditions.json":{"bytes":16324,"sha256":"72b0091e022751771ab1a19d5dd831c3a91644ee1664f6dcf874d32ee25126d9"},"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":111095,"sha256":"906cb1f308c7143e3a0ebd7c871c02b04f9613eb35342637fb4732ae7d5501ce"},"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":15692,"sha256":"9054bec62bdacf5dfe5302a32e1659beaae5f262b417b19e8e055d5ab765827f"},"data/wetlands.json":{"bytes":1081150,"sha256":"eee2b59945140fea80178edae6b5bfe973f2a52475c72d0bf268d4a7809170cb"},"de/about.html":{"bytes":24779,"sha256":"ee36b450f1abf9ccf0614bb59f4b803c8958502a0a869b6b5f8e096fea8552e5"},"de/budget.html":{"bytes":16191,"sha256":"0586076624f6a3b4085f6303de993bc4217f9fea86b1b61b039b8810d0e6482b"},"de/index.html":{"bytes":30242,"sha256":"ff9a966404afd72d175f778dc096453790771a82610ffc36f4c90ed5aefc9376"},"de/law.html":{"bytes":29557,"sha256":"15478f89f360eee48a5350f4b3dd69ee5f10fe4e9510a68404d4f74870d3de7f"},"de/method.html":{"bytes":47965,"sha256":"b7fd1059bd9b19587f3f8cb3e37765bffb5b0ce1520b6bdc029b81ff0700e4e1"},"de/sources.html":{"bytes":13269,"sha256":"65fa4ddf2cf754292097419e2146459cd1d00db75bcd29913ec65c5b485752b0"},"en/index.html":{"bytes":29303,"sha256":"4f9f846180c53869e3f0d0f714f9be1327b6c883533ff592d3a537b00d5886a1"},"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":25164,"sha256":"b5a1dcbd437e3888085a279257f9d12a4af85ae054053d9a012221de2fd0ba54"},"fr/budget.html":{"bytes":16775,"sha256":"7f06c34f5fac7caf88e6556cb359f3ac789dc6eaf5ad9f85fb988ec5cf7de403"},"fr/index.html":{"bytes":31020,"sha256":"fbe36156573903ffe81e78eca57ab82558c91541d2eef56154d56bd30d1e5c98"},"fr/law.html":{"bytes":30981,"sha256":"8321aa573f46133ed42f657a04fa645ed6abd7bc6580f87ea18e54a076dcff54"},"fr/method.html":{"bytes":49565,"sha256":"10ed58563b1c88157fce44c1278d8d1ec445a5f999d44a59da9c0366501d82ae"},"fr/sources.html":{"bytes":13580,"sha256":"bff066e850905df596dabac4d568ecc45224d2542d496a789a7d5e187e9e84ae"},"gschg31.js":{"bytes":1894,"sha256":"bf4673598fd6936aec1a2eeb2e692b24ea984fb728146324dcf8586f183a9c08"},"i18n-data.js":{"bytes":68245,"sha256":"d66de33cd3386b5249cf6d084f771d1eefb623177fabb6753061e829c5cee26e"},"i18n-map.js":{"bytes":141457,"sha256":"3d94081016765f3d0dc90e58f8836a5dc33cb2b7959bdc62a0db268f4d50a5ef"},"i18n.js":{"bytes":64729,"sha256":"cef34aed73257e8445e5ce4dc20d80b7c16f1b4774febf70ba1dcc8396523e50"},"index.html":{"bytes":30263,"sha256":"b96db4ef4d9ce0632cf93c6465b426451032714c44aa7622d4f8952431e6273b"},"it/about.html":{"bytes":24291,"sha256":"9d924a4f07cfb0b2492e7a9c79683624a39e48c036159175be913dfc64327235"},"it/budget.html":{"bytes":16332,"sha256":"01eb671e11f675cd5fb452e2d56d0110710cccf4c130e53ffc9b81c00f7dfd4d"},"it/index.html":{"bytes":30408,"sha256":"e8c1243150a15446d7f4941617e8159302727531402bc4d909479541a251ba0f"},"it/law.html":{"bytes":29934,"sha256":"4a226e770fd04e4121bd2e87a3c052c70cfb7d3e2e3252e4bbc1e2a4da6c5d87"},"it/method.html":{"bytes":47333,"sha256":"c33f28f13b49f9835d5e4af22cc8deff42045cbf23780e299e17f2676e07b6aa"},"it/sources.html":{"bytes":13128,"sha256":"9c1249a85f71e65d049d3ad71044c70fe8701d74e05843ea4e6b625b32f2bf97"},"law.html":{"bytes":28285,"sha256":"98c1ea03981462a189b4bfadbfdde2d143c8c17ff2f0ecd32abf9395d6cfd881"},"legal-alerts.js":{"bytes":2495,"sha256":"98f782af37d89a363f19c6e3a9abf7b9bc5226efcb891751f20adad7614f308e"},"method.html":{"bytes":45958,"sha256":"477ac0aa32202d74c096e93291f62dd94590044e7ed9f5e05350f84f16e98c2e"},"og-image.jpg":{"bytes":200325,"sha256":"f6a6cbd88798900d3b584b1e966c764506ddd85e88328d77e17cf77cf89f5144"},"rm/about.html":{"bytes":24615,"sha256":"dfab73d8513f7cbc175221fda88ce7b878f0155dba16f62ee74a21ced39bb498"},"rm/budget.html":{"bytes":16508,"sha256":"cce5de9a642aa905196d6e74b3c22f120dbe3bec6844552903bf367b5a906ea6"},"rm/index.html":{"bytes":30778,"sha256":"bd36e8a6e453f37386bee40c13e7223ce9af9157c2cde49210fcef8b6b085006"},"rm/law.html":{"bytes":30524,"sha256":"6d2473d898c982b622d3b68e2a07772d65b152acbdeb70e23c70a6d49ed436ef"},"rm/method.html":{"bytes":48693,"sha256":"e1c618cc7fdde17828124a0737caa70e845ee5cfb1f17a79ebf0660c115b8383"},"rm/sources.html":{"bytes":13660,"sha256":"ac14f13133e16fbeb48570a6ba3321dbbc7bc47d567a58ea3bfbb41ac1c1fba8"},"robots.txt":{"bytes":80,"sha256":"f8de6fa3cc79f4c7b56023e2618742b16dabde01c2d950dc0a48f71309ed9018"},"site.css":{"bytes":31047,"sha256":"740bdd0fa9bdb2f57b845e55d8e0c3fcf65e6a7b8710846dd893965f146ead21"},"site.js":{"bytes":26027,"sha256":"5a4721e778c5fc63c5c8f1247c911df98e17f46f39a3111a6dc991883a6536c1"},"sitemap.xml":{"bytes":22103,"sha256":"991dbeb8e8c71058e68e3c2effeaf84489bd61616eaded5db8e34d55064d91c6"},"sources.html":{"bytes":12821,"sha256":"7261140aa7e2f457fcf9ac582a4f871edcb307aea98a4f9c1374a60111f6b346"},"style.css":{"bytes":77555,"sha256":"6ec9cff30e31f92325855b57e2dd91720ffe1d30885edd11ff30ac714120846e"},"theme.js":{"bytes":3354,"sha256":"a1811f92d1d08cc87cb3c8f41515a9f0868bdad44782150bd41074af1df06b3a"},"tokens.css":{"bytes":16169,"sha256":"a09dd19c74aa879f8211196eed3ed19b97c6a576985253b4c468e9b52b5b4f7a"}}} \ No newline at end of file +{"schema":3,"built":"2026-10-10T23:34:33.822Z","revision":"sha256:3083ad7bbf20e08fd3653cba7ed5f81354712ec98d1b48ca030fa5dbb28c10ac","publicationDigest":"sha256:3083ad7bbf20e08fd3653cba7ed5f81354712ec98d1b48ca030fa5dbb28c10ac","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":1396,"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":"waterBalance","holder":"BAFU","datenstand":"2024-12-31","live":false,"url":"https://www.bafu.admin.ch/de/wasserhaushalt-heute","links":[{"label":"method","url":"https://www.bafu.admin.ch/dam/de/sd-web/r5wsqRim2y1u/WHH_CH_WEL_2017_3_Methode.pdf"}],"licence":"No licence stated on the file; federal website terms, with source attribution."},{"key":"drinkingWater","holder":"BFS, from SVGW","datenstand":"2024-12-31","live":false,"url":"https://dam-api.bfs.admin.ch/hub/api/dam/assets/36409183/master","links":[],"licence":"BFS terms of use: free use with source 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-09-28","live":false,"url":"https://www.uvek-gis.admin.ch/BFE/ogd/17/ogd17_fuellungsgrad_speicherseen.csv","links":[],"licence":"opendata.swiss, attribution"},{"key":"drought","holder":"BAFU, MeteoSwiss, swisstopo","datenstand":"2026-10-09","live":false,"url":"https://data.geo.admin.ch/ch.bafu.trockenheitsdaten-numerisch","links":[{"label":"drought platform","url":"https://www.trockenheit.admin.ch/"}],"licence":"FSDI general terms of use, free use with source 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":24908,"sha256":"49832308b7b5f29cc114ead7cc16269e38d51daa15b62ba75da439ca7b41b7ce"},"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":15900,"sha256":"92ae244d9d83c10306e8512a72a3ec814eac06230e169573d477ac707304a566"},"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/19-budget.mjs":{"bytes":15850,"sha256":"405675cc891219904162e92b211d1e4d6d3c650d7b0cce2663e4a94cad03e1dc"},"build/20-conditions.mjs":{"bytes":11782,"sha256":"a4509400e1816dd0f7a45e9002c697683c174ba4d9142a50ba89ed515ff2a4b7"},"build/lib-stations.mjs":{"bytes":1501,"sha256":"17d8c00b36f96fba383b430f8f22d37c83e7c5f895fa9f99823dd0ead087b3f5"},"build/lib-zip.mjs":{"bytes":1246,"sha256":"0d54a4b7c4b3a78a444364fde62acaead60e070d20f679663d9bf9d4016ab510"},"build/pages/de.json":{"bytes":156677,"sha256":"4bdd81d5e4b205f3405499adce5583e55ac60ccefe61ffae2f36ba7198bbad17"},"build/pages/fr.json":{"bytes":160270,"sha256":"3624e910cc1ccd58d7e3425b29c364b359a7b47e233d2d589a3203554a464730"},"build/pages/index.en.html":{"bytes":29177,"sha256":"e9042d59dccad87256f8336301043be16a0863672ea8ac0c81fc703e5759d0f1"},"build/pages/it.json":{"bytes":155782,"sha256":"d5e1798bfbec380d6ce9cd29ee0dcf7e0f70a4beb16b29b353ce8decb396d110"},"build/pages/rm.json":{"bytes":158840,"sha256":"d62410dc26fbba22c5ab9ddf8a17554920419de0291c49a41b16695303ed6bf7"},"build/pages/updates.json":{"bytes":308362,"sha256":"0af109fd626ebb4aba0b965ccc238f8f9f7b2094e1bf830124d3baa0975f3f02"},"package-lock.json":{"bytes":63777,"sha256":"c3c32ff1af7525028f4c955f9aadba58f0a252692b04f3ee54958ebcbf268e50"},"package.json":{"bytes":1130,"sha256":"317d86ebd2d5bc91ea7a98b4984daebbbe315dba7a794b8f9baf0dedff16a221"},"scripts/check-external-links.mjs":{"bytes":2533,"sha256":"c2615d0a1bd52c49150888024bdf22493177afc66cc3a07b32fc47fa65ef7ff7"},"scripts/check-performance-budget.mjs":{"bytes":3047,"sha256":"8630fe16197ef7117271018b8b4d26ee8ef05ddc33b2302b1f21567957a41ab9"},"scripts/verify-site.mjs":{"bytes":46685,"sha256":"3817ed5cd502b324364eeafcd14b0f2cae178107488809b40707445de27267b2"}},"artifacts":{"about.html":{"bytes":23673,"sha256":"d7fd28852c163c05444044ba4509d5381d427614bf406ffe7dff8ecf22351635"},"app.js":{"bytes":182745,"sha256":"b43241b425bc0a751b7c42236ffc75120500453789f085346a781759bafcd992"},"budget.html":{"bytes":17223,"sha256":"b341e41224e5a4bbc577f89a2e5d7b2d5c939d6187ea6c9f7dde322b2ca89968"},"budget.js":{"bytes":32882,"sha256":"3ec76e1d81fb5d53017df68d75381a58e5ee06665891de50f6f9b4120c946248"},"data/basins.json":{"bytes":3488,"sha256":"9fc9f8a3f55a42580dafac22eedf9f1090ee6b31873110719bde121ff968c537"},"data/budget.json":{"bytes":9406,"sha256":"c71e68c8028a31c38e1a839800f5b2ffc5ecf53bee68d375a92d3cf92a53006c"},"data/canton-monitoring.json":{"bytes":6601,"sha256":"5a0723e5a87ba9643591c466d653604e0418c364ed4487791c84e26afdbdbb69"},"data/cantons.json":{"bytes":3625,"sha256":"31d0e54c707c1cb511b22dfb263a3edaeeb81f098f5643dab3828e945f8e5b69"},"data/conditions.json":{"bytes":16324,"sha256":"72b0091e022751771ab1a19d5dd831c3a91644ee1664f6dcf874d32ee25126d9"},"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":111095,"sha256":"906cb1f308c7143e3a0ebd7c871c02b04f9613eb35342637fb4732ae7d5501ce"},"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":15692,"sha256":"9054bec62bdacf5dfe5302a32e1659beaae5f262b417b19e8e055d5ab765827f"},"data/wetlands.json":{"bytes":1081150,"sha256":"eee2b59945140fea80178edae6b5bfe973f2a52475c72d0bf268d4a7809170cb"},"de/about.html":{"bytes":24778,"sha256":"441d5536ad331e4dd53f62e693bc870d1fc45b66a4da6c6541574eb07561ea55"},"de/budget.html":{"bytes":17507,"sha256":"2791823d7219b050f271794fc249624d46f65bd581456398812281368b202101"},"de/index.html":{"bytes":30241,"sha256":"a25c6d3822c385bac0735723677ebaf553982594b1d3391c84f111a6869c5fe8"},"de/law.html":{"bytes":29556,"sha256":"1e35d4042ec6c32bd428235a794587ca911fd737bc37d7607d9e0ce624263028"},"de/method.html":{"bytes":47964,"sha256":"612493c30866037547c9620dc3fd4221ed68f31bd853dbc2292a2429b79b7c05"},"de/sources.html":{"bytes":13268,"sha256":"2124f3afbf63a3e3b4d62e42aaa9eada255ff524d8155dbe7b1fd930abc4a3bf"},"en/index.html":{"bytes":29302,"sha256":"9e9a6a5f1ae276306b1a277234256a80cbc1c2d7a358467ff8466eb465162bea"},"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":25163,"sha256":"0edb7d93c091ad3de21ad6eb3618eb83879d8c9a1ed66bb2e5ca8c71275cb3f3"},"fr/budget.html":{"bytes":18145,"sha256":"b545e04707d85c4932c186056ae262c8a2dc7bc06cab41969d18390cf8421e2e"},"fr/index.html":{"bytes":31019,"sha256":"627028fc6ce789462bb507db85ccf0e6537a16c570f9523d0a22e22e6a429b56"},"fr/law.html":{"bytes":30980,"sha256":"b19a2af8a65b82f8cb4925181f7994a0005d1b4aa3af26c75f4155f2608717a6"},"fr/method.html":{"bytes":49564,"sha256":"7d0d5f15092a901ac2c68977d4b595df9d9b42214dd4a876b470f2f7cdc6b081"},"fr/sources.html":{"bytes":13579,"sha256":"73e26c2c7e697c4671377528d88190c19142a060be8f0be873a919c59285c82c"},"gschg31.js":{"bytes":1894,"sha256":"bf4673598fd6936aec1a2eeb2e692b24ea984fb728146324dcf8586f183a9c08"},"i18n-data.js":{"bytes":68245,"sha256":"d66de33cd3386b5249cf6d084f771d1eefb623177fabb6753061e829c5cee26e"},"i18n-map.js":{"bytes":141457,"sha256":"3d94081016765f3d0dc90e58f8836a5dc33cb2b7959bdc62a0db268f4d50a5ef"},"i18n.js":{"bytes":70649,"sha256":"be9dccaf4769a84fc7e4671cfae410eff0f6b78a4fc3bd67abe717f551bb5ebb"},"index.html":{"bytes":30262,"sha256":"5be7aa882a2e365935405520b9074ba673b855a500cb3c57b2602534253f3954"},"it/about.html":{"bytes":24290,"sha256":"5b9ee9c2eef8af5fcc3d41934c6c33448f4ae6cc3421283e3ccc3515da98d1a8"},"it/budget.html":{"bytes":17639,"sha256":"7e03d83a5fd12e3461c63a29cb62a40dd2f6407a04cf24facbf696c999243df2"},"it/index.html":{"bytes":30407,"sha256":"e9af3b2e7533880afeabf1e8d4f7eee19903c3f92214967f1d4d30ddd2de4ba8"},"it/law.html":{"bytes":29933,"sha256":"81724fe3cf125fc25c29259d454675964067957eec274747035b3c46fa11f3fa"},"it/method.html":{"bytes":47332,"sha256":"bd8e1de5b5f40b99d381bee7ead737ba86fb220c2928a74dce4958a2424d49aa"},"it/sources.html":{"bytes":13127,"sha256":"605d6cfef1e05ae22678db5b685b7d7f611efd91e28eb071b3cc566353a6069f"},"law.html":{"bytes":28284,"sha256":"4637d1374391d64f30e07c7045d07a77c55c50384bf1bb71e9a1f8d45cec3c79"},"legal-alerts.js":{"bytes":2495,"sha256":"98f782af37d89a363f19c6e3a9abf7b9bc5226efcb891751f20adad7614f308e"},"method.html":{"bytes":45957,"sha256":"9af4639345db75fb5d99cf1de14cc6bc406bb9fe5e3671021f497d5f51e3000f"},"og-image.jpg":{"bytes":200325,"sha256":"f6a6cbd88798900d3b584b1e966c764506ddd85e88328d77e17cf77cf89f5144"},"rm/about.html":{"bytes":24614,"sha256":"4f9f145b16b2202bef019dcf74fc33be40ae5268c728ae156de3a8afc6c95617"},"rm/budget.html":{"bytes":17812,"sha256":"bd4573b07562ced3e8ae50398757227764eb5ea0291c06eed1802bfab0aa94d4"},"rm/index.html":{"bytes":30777,"sha256":"bc6cdae68d4bfa6ce69039d7f1b1ec779f5f0e45e4def221e2441cf10b7c8867"},"rm/law.html":{"bytes":30523,"sha256":"3259d98ba6c05a4bb55fb705237a7b8ec428b75dfe3d735049dab25fcd05efe9"},"rm/method.html":{"bytes":48692,"sha256":"e334f961bbd3a7d2284aaa1a1d8740c8d2dfb63c8dacd715b47e325ca4d46143"},"rm/sources.html":{"bytes":13659,"sha256":"eb0c9d49dbd5cd4aa4dca8654bebe4431e963ae3cd082ee3119c9b91b05ef151"},"robots.txt":{"bytes":80,"sha256":"f8de6fa3cc79f4c7b56023e2618742b16dabde01c2d950dc0a48f71309ed9018"},"site.css":{"bytes":35690,"sha256":"2237a5d05c6b559630117847f10a6f5e56b627b8dd53c84c73a0fe091bf14d83"},"site.js":{"bytes":26027,"sha256":"5a4721e778c5fc63c5c8f1247c911df98e17f46f39a3111a6dc991883a6536c1"},"sitemap.xml":{"bytes":22273,"sha256":"47a81476d8d3a35050e3645532f142ae8c3feb7718ff1667c948aa80e78ddea0"},"sources.html":{"bytes":12820,"sha256":"a708c4c2deebb32622cf992fcba796550932bcf56c2fcfc7b9733fc61f0f8680"},"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 0975213..8497e08 100644 --- a/site/de/about.html +++ b/site/de/about.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/de/budget.html b/site/de/budget.html index 22df6cb..5105391 100644 --- a/site/de/budget.html +++ b/site/de/budget.html @@ -30,8 +30,8 @@ - - + + @@ -90,17 +90,24 @@

    Wo die Bilanz jetzt steht

    Wasser, das das Land verlässt

    Monatsmittel des Abflusses von Rhein bei Basel und Rhone bei Chancy, den beiden Messstationen, an denen der grösste Teil des Schweizer Wassers die Grenze überquert, als Anteil am Mittel 1991–2020 desselben Monats. Zusammen führen sie etwa fünf Sechstel des nationalen Abflusses; den Rest führen Tessin, Inn, Doubs und kleinere Grenzflüsse.

    -
    +

    Trockenheitsregionen

    Der kombinierte Trockenheitsindex der Trockenheitsplattform des Bundes für ihre 38 Warnregionen, Woche für Woche. Er fasst den Niederschlag über einen, drei und vierundzwanzig Monate, den Abfluss und die modellierte Bodenfeuchte in fünf Stufen zusammen, von 1, nicht trocken, bis 5, extrem trocken.

    -
    +
    +

    Grundwasser und Seen, Messstelle für Messstelle

    +

    Jedes Quadrat ist eine Messstelle, eingeordnet danach, wo ihr jüngstes Monatsmittel in ihrer eigenen Messreihe 1991–2020 für denselben Monat liegt: unter dem 20. Perzentil, zwischen dem 20. und dem 80. oder über dem 80. Zeigen Sie auf ein Quadrat für die Messstelle und ihre Werte.

    +

    Die Jahresbilanz

    Für das ganze Land geht die Bilanz auf: Niederschlag und das Wasser, das aus dem Ausland zufliesst, verdunsten, fliessen über die Grenze ab oder verändern, was in Schnee, Eis, Boden, Grundwasser und Seen gespeichert ist. Das BAFU veröffentlicht die Grössen für die politische Schweiz, 41’285 km², in Millimetern Wasser über dieser Fläche. Hier stehen sie auch in Kubikkilometern; ein Millimeter entspricht 0,041 km³.

    -
    +
    +
    +
    +

    +

    Ein Modell, das an Messungen gebunden ist. Die Zahlen stammen aus dem hydrologischen Modell PREVAH auf einem 200-Meter-Raster. Der gemessene Abfluss gilt als exakt, und der Modellfehler wird dem Niederschlag zugewiesen, der in den Bergen am schwersten zu messen ist. Entnahmen und Nutzung sind nicht Teil dieser natürlichen Bilanz. Eine negative Speicheränderung ist Wasser, das den Speichern des Landes entnommen wurde, vor allem dem Gletschereis.

    @@ -109,7 +116,12 @@

    Die Jahresbilanz

    Nach Einzugsgebiet

    Dieselbe Tabelle enthält die zwölf grossen Einzugsgebiete, die das BAFU einzeln bilanziert. Ihre Zahlen sind Millimeter über der eigenen Fläche jedes Gebiets und werden hier mit dem eigenen Mittel 1991–2020 dieses Gebiets verglichen.

    -
    +
    +
      +
      +
      Zahlen anzeigen
      +
      +

      @@ -122,7 +134,14 @@

      Was gespeichert ist

      Was genutzt wird

      Nur eine Nutzung wird jedes Jahr erfasst: die öffentliche Trinkwasserversorgung, aus einer Hochrechnung des Schweizerischen Vereins des Gas- und Wasserfaches (SVGW), veröffentlicht vom Bundesamt für Statistik. Jede andere nationale Zahl zu Entnahmen beschreibt 2006 oder trägt gar kein Jahr.

      -
      +

      +
      +
      +
        +
        Zahlen anzeigen
        +
        +

        +

        Alle übrigen Nutzungen

        @@ -190,6 +209,6 @@

        Wie diese Seite entsteht

        - + diff --git a/site/de/index.html b/site/de/index.html index 4363795..a0dfb45 100644 --- a/site/de/index.html +++ b/site/de/index.html @@ -34,7 +34,7 @@ - + diff --git a/site/de/law.html b/site/de/law.html index 0ed9f02..93912d0 100644 --- a/site/de/law.html +++ b/site/de/law.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/de/method.html b/site/de/method.html index 68b4b14..944d67c 100644 --- a/site/de/method.html +++ b/site/de/method.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/de/sources.html b/site/de/sources.html index 388acd0..e311935 100644 --- a/site/de/sources.html +++ b/site/de/sources.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/en/index.html b/site/en/index.html index 32f97ee..d77a842 100644 --- a/site/en/index.html +++ b/site/en/index.html @@ -34,7 +34,7 @@ - + diff --git a/site/fr/about.html b/site/fr/about.html index e703c08..f0bbe9a 100644 --- a/site/fr/about.html +++ b/site/fr/about.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/fr/budget.html b/site/fr/budget.html index 74c0854..2f4362d 100644 --- a/site/fr/budget.html +++ b/site/fr/budget.html @@ -30,8 +30,8 @@ - - + + @@ -90,17 +90,24 @@

        Où en est le bilan

        L’eau qui quitte le pays

        Débit moyen mensuel du Rhin à Bâle et du Rhône à Chancy, les deux stations où passe la frontière la plus grande partie de l’eau suisse, en part de la moyenne 1991–2020 du même mois. Ensemble, ils emportent environ cinq sixièmes de l’écoulement national ; le Tessin, l’Inn, le Doubs et de plus petites rivières frontalières emportent le reste.

        -
        +

        Régions de sécheresse

        L’indice de sécheresse combiné de la plateforme fédérale sur la sécheresse pour ses 38 régions d’alerte, semaine après semaine. Il réunit les précipitations sur un, trois et vingt-quatre mois, le débit des cours d’eau et l’humidité du sol modélisée en cinq niveaux, de 1, pas sec, à 5, extrêmement sec.

        -
        +
        +

        Eaux souterraines et lacs, station par station

        +

        Chaque carré est une station de mesure, classée selon la place de sa dernière moyenne mensuelle dans sa propre série 1991–2020 pour le même mois : sous le 20e centile, entre le 20e et le 80e, ou au-dessus du 80e. Pointez un carré pour voir la station et ses valeurs.

        +

        Le bilan annuel

        Pour le pays dans son ensemble, le bilan se ferme : les précipitations et l’eau qui arrive de l’étranger s’évaporent, quittent le pays par la frontière, ou modifient ce qui est stocké dans la neige, la glace, le sol, les eaux souterraines et les lacs. L’OFEV publie les termes pour la Suisse politique, 41’285 km², en millimètres d’eau sur cette surface. Ils sont aussi donnés ici en kilomètres cubes ; un millimètre vaut 0,041 km³.

        -
        +
        +
        +
        +

        +

        Un modèle contraint par la mesure. Les chiffres proviennent du modèle hydrologique PREVAH sur une grille de 200 mètres. Le débit mesuré est tenu pour exact et l’erreur du modèle est attribuée aux précipitations, le terme le plus difficile à mesurer en montagne. Les prélèvements et l’utilisation ne font pas partie de ce bilan naturel. Une variation négative des réserves est de l’eau prise dans les réserves du pays, avant tout dans la glace des glaciers.

        @@ -109,7 +116,12 @@

        Le bilan annuel

        Par bassin versant

        Le même tableau donne les douze grands bassins versants que l’OFEV équilibre séparément. Leurs chiffres sont en millimètres sur la surface propre de chaque bassin et sont comparés ici à la moyenne 1991–2020 de ce bassin.

        -
        +
        +
          +
          +
          Afficher les chiffres
          +
          +

          @@ -122,7 +134,14 @@

          Ce qui est stocké

          Ce qui est utilisé

          Une seule utilisation est comptée chaque année : la distribution publique d’eau potable, d’après une extrapolation de la Société suisse de l’industrie du gaz et des eaux (SSIGE) publiée par l’Office fédéral de la statistique. Tout autre chiffre national sur les prélèvements décrit 2006 ou ne porte aucune année.

          -
          +

          +
          +
          +
            +
            Afficher les chiffres
            +
            +

            +

            Toutes les autres utilisations

            @@ -190,6 +209,6 @@

            Comment cette page est faite

            - + diff --git a/site/fr/index.html b/site/fr/index.html index 60f33dc..2861db3 100644 --- a/site/fr/index.html +++ b/site/fr/index.html @@ -34,7 +34,7 @@ - + diff --git a/site/fr/law.html b/site/fr/law.html index 7134d02..14cd311 100644 --- a/site/fr/law.html +++ b/site/fr/law.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/fr/method.html b/site/fr/method.html index da85765..de699e2 100644 --- a/site/fr/method.html +++ b/site/fr/method.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/fr/sources.html b/site/fr/sources.html index cfaba71..d3f967c 100644 --- a/site/fr/sources.html +++ b/site/fr/sources.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/i18n.js b/site/i18n.js index 1524487..d10f839 100644 --- a/site/i18n.js +++ b/site/i18n.js @@ -529,14 +529,12 @@ Object.assign(STR, { 'bg.periodPick': { en: 'Period', de: 'Zeitraum', fr: 'Période', it: 'Periodo', rm: 'Perioda' }, 'bg.yearN': { en: 'Year {y}', de: 'Jahr {y}', fr: 'Année {y}', it: 'Anno {y}', rm: 'Onn {y}' }, 'bg.meanN': { en: 'Mean {p}', de: 'Mittel {p}', fr: 'Moyenne {p}', it: 'Media {p}', rm: 'Media {p}' }, - 'bg.in': { en: 'In', de: 'Ein', fr: 'Entrées', it: 'Entrate', rm: 'Entradas' }, - 'bg.out': { en: 'Out', de: 'Aus', fr: 'Sorties', it: 'Uscite', rm: 'Sortidas' }, 'bg.balSum': { - en: 'Both bars come to {t}, or {k}, over political Switzerland.', - de: 'Beide Balken ergeben {t} oder {k} über der politischen Schweiz.', - fr: 'Les deux barres totalisent {t}, soit {k}, sur la Suisse politique.', - it: 'Entrambe le barre sommano a {t}, ossia {k}, sulla Svizzera politica.', - rm: 'Omaduas trav fan {t}, u {k}, sur la Svizra politica.', + en: 'What comes in and what goes out each come to {t}, or {k}, over political Switzerland. Point at a band for its share.', + de: 'Was hineinfliesst und was hinausgeht, ergibt je {t} oder {k} über der politischen Schweiz. Zeigen Sie auf ein Band für seinen Anteil.', + fr: 'Les entrées et les sorties totalisent chacune {t}, soit {k}, sur la Suisse politique. Pointez une bande pour voir sa part.', + it: 'Entrate e uscite sommano ciascuna a {t}, ossia {k}, sulla Svizzera politica. Puntate su una banda per la sua quota.', + rm: 'Entradas e sortidas fan mintgamai {t}, u {k}, sur la Svizra politica. Mussai sin ina bindella per sia part.', }, 'bg.thTerm': { en: 'Term', de: 'Grösse', fr: 'Terme', it: 'Termine', rm: 'Termin' }, 'bg.balNote': { @@ -620,4 +618,57 @@ Object.assign(STR, { it: 'UFAM, utilizzo dell’acqua, pagina del {d}. Stime nazionali, non prelievi misurati.', rm: 'UFAM, utilisaziun da l’aua, pagina dals {d}. Stimaziuns naziunalas, betg prelevaziuns mesiradas.', }, + // charts, hover readings and the site-by-site figure + 'bg.meanLine': { en: 'The 1991–2020 mean', de: 'Mittel 1991–2020', fr: 'Moyenne 1991–2020', it: 'Media 1991–2020', rm: 'Media 1991–2020' }, + 'bg.tipShare': { en: '{p} of the 1991–2020 mean for the month', de: '{p} des Monatsmittels 1991–2020', fr: '{p} de la moyenne mensuelle 1991–2020', it: '{p} della media mensile 1991–2020', rm: '{p} da la media mensila 1991–2020' }, + 'bg.tipMean': { en: 'Mean for the month, both rivers: {n} m³/s', de: 'Monatsmittel, beide Flüsse: {n} m³/s', fr: 'Moyenne du mois, les deux fleuves : {n} m³/s', it: 'Media del mese, entrambi i fiumi: {n} m³/s', rm: 'Media dal mais, omadus flums: {n} m³/s' }, + 'bg.tipWeek': { en: 'Week of {d}', de: 'Woche vom {d}', fr: 'Semaine du {d}', it: 'Settimana del {d}', rm: 'Emna dals {d}' }, + 'bg.s.low': { en: 'Low', de: 'Tief', fr: 'Bas', it: 'Basso', rm: 'Bass' }, + 'bg.s.normal': { en: 'Normal', de: 'Normal', fr: 'Normal', it: 'Normale', rm: 'Normal' }, + 'bg.s.high': { en: 'High', de: 'Hoch', fr: 'Haut', it: 'Alto', rm: 'Aut' }, + 'bg.kind.spring': { en: 'Spring discharge', de: 'Quellschüttung', fr: 'Débit de source', it: 'Portata di sorgente', rm: 'Defluss da funtauna' }, + 'bg.kind.level': { en: 'Groundwater level', de: 'Grundwasserstand', fr: 'Niveau de la nappe', it: 'Livello della falda', rm: 'Nivel da l’aua sutterrana' }, + 'bg.kind.lake': { en: 'Lake level', de: 'Seepegel', fr: 'Niveau du lac', it: 'Livello del lago', rm: 'Nivel dal lai' }, + 'bg.unit.masl': { en: 'm a.s.l.', de: 'm ü. M.', fr: 'm s. m.', it: 'm s.l.m.', rm: 'm s. m.' }, + 'bg.unit.lmin': { en: 'l/min', de: 'l/min', fr: 'l/min', it: 'l/min', rm: 'l/min' }, + 'bg.unit.ms': { en: 'm³/s', de: 'm³/s', fr: 'm³/s', it: 'm³/s', rm: 'm³/s' }, + 'bg.tipSite': { en: '{m}: {v} {u}. Normal range {a} to {z}, from {y} years.', de: '{m}: {v} {u}. Normalbereich {a} bis {z}, aus {y} Jahren.', fr: '{m} : {v} {u}. Plage normale {a} à {z}, sur {y} ans.', it: '{m}: {v} {u}. Intervallo normale da {a} a {z}, su {y} anni.', rm: '{m}: {v} {u}. Interval normal {a} fin {z}, da {y} onns.' }, + 'bg.gwSites': { en: 'Groundwater, {n} sites, {m}', de: 'Grundwasser, {n} Messstellen, {m}', fr: 'Eaux souterraines, {n} stations, {m}', it: 'Acque sotterranee, {n} stazioni, {m}', rm: 'Aua sutterrana, {n} staziuns, {m}' }, + 'bg.lakeSites': { en: 'Lakes, {n} sites, {m}', de: 'Seen, {n} Messstellen, {m}', fr: 'Lacs, {n} stations, {m}', it: 'Laghi, {n} stazioni, {m}', rm: 'Lais, {n} staziuns, {m}' }, + 'bg.showSites': { en: 'Show every site', de: 'Alle Messstellen anzeigen', fr: 'Afficher toutes les stations', it: 'Mostra tutte le stazioni', rm: 'Mussar tut las staziuns' }, + 'bg.thSite': { en: 'Site', de: 'Messstelle', fr: 'Station', it: 'Stazione', rm: 'Staziun' }, + 'bg.thKind': { en: 'Measured', de: 'Gemessen', fr: 'Mesure', it: 'Misura', rm: 'Mesira' }, + 'bg.thState': { en: 'State', de: 'Zustand', fr: 'État', it: 'Stato', rm: 'Stadi' }, + 'bg.thRange': { en: 'Normal range', de: 'Normalbereich', fr: 'Plage normale', it: 'Intervallo normale', rm: 'Interval normal' }, + 'bg.thYears': { en: 'Years of record', de: 'Messjahre', fr: 'Années de mesure', it: 'Anni di misura', rm: 'Onns da mesira' }, + 'bg.ofTotal': { en: 'of the total', de: 'des Totals', fr: 'du total', it: 'del totale', rm: 'dal total' }, + 'bg.ch': { en: 'Switzerland', de: 'Schweiz', fr: 'Suisse', it: 'Svizzera', rm: 'Svizra' }, + 'bg.flowAria': { + en: 'The water balance of Switzerland, {p}. In: {ins}. Out: {outs}.', + de: 'Wasserbilanz der Schweiz, {p}. Ein: {ins}. Aus: {outs}.', + fr: 'Bilan hydrique de la Suisse, {p}. Entrées : {ins}. Sorties : {outs}.', + it: 'Bilancio idrico della Svizzera, {p}. Entrate: {ins}. Uscite: {outs}.', + rm: 'Bilantscha d’aua da la Svizra, {p}. Entradas: {ins}. Sortidas: {outs}.', + }, + 'bg.catchAria': { + en: 'Precipitation, runoff and evaporation in {y} for twelve catchments, each as a share of its own 1991–2020 mean.', + de: 'Niederschlag, Abfluss und Verdunstung {y} in zwölf Einzugsgebieten, je als Anteil am eigenen Mittel 1991–2020.', + fr: 'Précipitations, écoulement et évaporation en {y} dans douze bassins versants, chacun en part de sa propre moyenne 1991–2020.', + it: 'Precipitazioni, deflusso ed evaporazione nel {y} in dodici bacini imbriferi, ciascuno come quota della propria media 1991–2020.', + rm: 'Precipitaziun, defluss ed evaporaziun {y} en dudesch bogns da derivaziun, mintgamai sco part da l’atgna media 1991–2020.', + }, + 'bg.useAria': { + en: 'Public drinking-water supply by source, {a} to {b}, in million cubic metres.', + de: 'Öffentliche Trinkwasserversorgung nach Herkunft, {a} bis {b}, in Millionen Kubikmetern.', + fr: 'Approvisionnement public en eau potable par origine, de {a} à {b}, en millions de mètres cubes.', + it: 'Approvvigionamento pubblico di acqua potabile per origine, dal {a} al {b}, in milioni di metri cubi.', + rm: 'Provediment public cun aua da baiver tenor derivanza, {a} fin {b}, en milliuns meters cubics.', + }, + 'bg.useTrend': { + en: 'Between {a} and {b} the total fell by {d} %, and supply per person from {l0} to {l1} litres a day.', + de: 'Zwischen {a} und {b} sank die Menge um {d} % und die Abgabe pro Person von {l0} auf {l1} Liter am Tag.', + fr: 'Entre {a} et {b}, le total a baissé de {d} % et la fourniture par personne de {l0} à {l1} litres par jour.', + it: 'Tra il {a} e il {b} il totale è sceso del {d} % e la fornitura pro capite da {l0} a {l1} litri al giorno.', + rm: 'Tranter {a} e {b} è il total sa sbassà per {d} % e la furniziun per persuna da {l0} sin {l1} liters per di.', + }, }); diff --git a/site/index.html b/site/index.html index c65eb70..6bbcb03 100644 --- a/site/index.html +++ b/site/index.html @@ -34,7 +34,7 @@ - + diff --git a/site/it/about.html b/site/it/about.html index bf677e8..e70e9d0 100644 --- a/site/it/about.html +++ b/site/it/about.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/it/budget.html b/site/it/budget.html index ae34c2d..31f4eb3 100644 --- a/site/it/budget.html +++ b/site/it/budget.html @@ -30,8 +30,8 @@ - - + + @@ -90,17 +90,24 @@

            Dove si trova il bilancio ora

            L’acqua che lascia il Paese

            Portata media mensile del Reno a Basilea e del Rodano a Chancy, le due stazioni dove la maggior parte dell’acqua svizzera attraversa il confine, in quota della media 1991–2020 dello stesso mese. Insieme portano circa cinque sesti del deflusso nazionale; il Ticino, l’Inn, il Doubs e fiumi di confine minori portano il resto.

            -
            +

            Regioni di siccità

            L’indice di siccità combinato della piattaforma federale sulla siccità per le sue 38 regioni d’allerta, settimana per settimana. Riunisce le precipitazioni su uno, tre e ventiquattro mesi, la portata dei corsi d’acqua e l’umidità del suolo modellata in cinque livelli, da 1, non secco, a 5, estremamente secco.

            -
            +
            +

            Acque sotterranee e laghi, stazione per stazione

            +

            Ogni quadrato è una stazione di misura, collocata secondo la posizione della sua ultima media mensile nella propria serie 1991–2020 per lo stesso mese: sotto il 20° percentile, tra il 20° e l’80° o sopra l’80°. Puntate su un quadrato per la stazione e i suoi valori.

            +

            Il bilancio annuale

            Per il Paese nel suo insieme il bilancio si chiude: le precipitazioni e l’acqua che arriva dall’estero evaporano, lasciano il Paese attraverso il confine o modificano ciò che è immagazzinato in neve, ghiaccio, suolo, acque sotterranee e laghi. L’UFAM pubblica i termini per la Svizzera politica, 41’285 km², in millimetri d’acqua su questa superficie. Qui sono dati anche in chilometri cubi; un millimetro vale 0,041 km³.

            -
            +
            +
            +
            +

            +

            Un modello vincolato dalla misura. Le cifre provengono dal modello idrologico PREVAH su una griglia di 200 metri. La portata misurata è considerata esatta e l’errore del modello è attribuito alle precipitazioni, il termine più difficile da misurare in montagna. Prelievi e utilizzo non fanno parte di questo bilancio naturale. Una variazione negativa delle riserve è acqua tolta alle riserve del Paese, soprattutto al ghiaccio dei ghiacciai.

            @@ -109,7 +116,12 @@

            Il bilancio annuale

            Per bacino imbrifero

            La stessa tabella riporta i dodici grandi bacini imbriferi che l’UFAM bilancia separatamente. Le loro cifre sono in millimetri sulla superficie propria di ciascun bacino e sono confrontate qui con la media 1991–2020 di quel bacino.

            -
            +
            +
              +
              +
              Mostra i numeri
              +
              +

              @@ -122,7 +134,14 @@

              Ciò che è immagazzinato

              Ciò che è utilizzato

              Un solo utilizzo è contato ogni anno: l’approvvigionamento pubblico di acqua potabile, da un’estrapolazione della Società svizzera dell’industria del gas e delle acque (SSIGA) pubblicata dall’Ufficio federale di statistica. Ogni altra cifra nazionale sui prelievi descrive il 2006 o non porta alcun anno.

              -
              +

              +
              +
              +
                +
                Mostra i numeri
                +
                +

                +

                Tutti gli altri utilizzi

                @@ -190,6 +209,6 @@

                Come è fatta questa pagina

                - + diff --git a/site/it/index.html b/site/it/index.html index e04f7c5..63a19a7 100644 --- a/site/it/index.html +++ b/site/it/index.html @@ -34,7 +34,7 @@ - + diff --git a/site/it/law.html b/site/it/law.html index 1625a73..25b684e 100644 --- a/site/it/law.html +++ b/site/it/law.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/it/method.html b/site/it/method.html index 1dbe297..8f87794 100644 --- a/site/it/method.html +++ b/site/it/method.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/it/sources.html b/site/it/sources.html index 650e456..62d80ce 100644 --- a/site/it/sources.html +++ b/site/it/sources.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/law.html b/site/law.html index 1a7a533..4190220 100644 --- a/site/law.html +++ b/site/law.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/method.html b/site/method.html index 023bb82..a8c6f69 100644 --- a/site/method.html +++ b/site/method.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/rm/about.html b/site/rm/about.html index 1cafcaa..36195ab 100644 --- a/site/rm/about.html +++ b/site/rm/about.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/rm/budget.html b/site/rm/budget.html index c72944a..70deb01 100644 --- a/site/rm/budget.html +++ b/site/rm/budget.html @@ -30,8 +30,8 @@ - - + + @@ -90,17 +90,24 @@

                Nua che la bilantscha stat ussa

                Aua che banduna il pajais

                Defluss mesaun mensil dal Rain a Basilea e dal Rodan a Chancy, las duas staziuns nua che la gronda part da l’aua svizra passa il cunfin, sco part da la media 1991–2020 dal medem mais. Ensemen portan els var tschintg sisavels dal defluss naziunal; il Tessin, l’En, il Doubs e flums da cunfin pli pitschens portan il rest.

                -
                +

                Regiuns da sitgira

                L’index da sitgira cumbinà da la plattafurma federala da sitgira per sias 38 regiuns d’avertiment, emna per emna. El unescha la precipitaziun sur in, trais e ventgaquatter mais, il defluss dals flums e l’umiditad dal terren modelada en tschintg stgalims, da 1, betg sitg, fin 5, extremamain sitg.

                -
                +
                +

                Aua sutterrana e lais, staziun per staziun

                +

                Mintga quadrat è ina staziun da mesiraziun, ordinada tenor nua che sia ultima media mensila stat en sia atgna seria 1991–2020 per il medem mais: sut il 20avel percentil, tranter il 20avel e l’80avel u sur l’80avel. Mussai sin in quadrat per la staziun e sias valurs.

                +

                La bilantscha annuala

                Per il pajais entir sa serra la bilantscha: la precipitaziun e l’aua che flussescha da l’exteriur evaporeschan, bandunan il pajais sur il cunfin u midan quai ch’è accumulà en naiv, glatsch, terren, aua sutterrana e lais. L’UFAM publitgescha ils termins per la Svizra politica, 41’285 km², en millimeters aua sur questa surfatscha. Qua èn els era inditgads en kilometers cubics; in millimeter munta 0,041 km³.

                -
                +
                +
                +
                +

                +

                In model lià a las mesiraziuns. Las cifras derivan dal model idrologic PREVAH sin ina grilla da 200 meters. Il defluss mesirà vala sco exact, e l’errur dal model vegn attribuida a la precipitaziun, il termin il pli grev da mesirar en las muntognas. Prelevaziuns ed utilisaziun na fan betg part da questa bilantscha natirala. Ina midada negativa da las reservas è aua prendida da las reservas dal pajais, surtut dal glatsch dals glatschers.

                @@ -109,7 +116,12 @@

                La bilantscha annuala

                Tenor bogn da derivaziun

                La medema tabella dat ils dudesch gronds bogns da derivaziun che l’UFAM bilantschescha separadamain. Lur cifras èn en millimeters sur la surfatscha atgna da mintga bogn e vegnan cumparegliadas qua cun la media 1991–2020 da quel bogn.

                -
                +
                +
                  +
                  +
                  Mussar las cifras
                  +
                  +

                  @@ -122,7 +134,14 @@

                  Tge ch’è accumulà

                  Tge che vegn duvrà

                  Mo in’utilisaziun vegn dumbrada mintg’onn: il provediment public d’aua da baiver, ord ina extrapolaziun da la Societad svizra da l’industria da gas e d’aua (SSIGA), publitgada da l’Uffizi federal da statistica. Mintga autra cifra naziunala davart prelevaziuns descriva 2006 u n’ha nagin onn.

                  -
                  +

                  +
                  +
                  +
                    +
                    Mussar las cifras
                    +
                    +

                    +

                    Tut las autras utilisaziuns

                    @@ -190,6 +209,6 @@

                    Co che questa pagina vegn fatga

                    - + diff --git a/site/rm/index.html b/site/rm/index.html index 19ca0fe..65e369e 100644 --- a/site/rm/index.html +++ b/site/rm/index.html @@ -34,7 +34,7 @@ - + diff --git a/site/rm/law.html b/site/rm/law.html index 0d2119d..d228967 100644 --- a/site/rm/law.html +++ b/site/rm/law.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/rm/method.html b/site/rm/method.html index ae8ef74..3caa7a3 100644 --- a/site/rm/method.html +++ b/site/rm/method.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/rm/sources.html b/site/rm/sources.html index 4cfb4ef..d8134c5 100644 --- a/site/rm/sources.html +++ b/site/rm/sources.html @@ -30,8 +30,8 @@ - - + + diff --git a/site/site.css b/site/site.css index 0170e2d..cb7d505 100644 --- a/site/site.css +++ b/site/site.css @@ -529,63 +529,129 @@ body[data-page="about"] { --accent: var(--seq-300); } .liveQ.pending { color: var(--ink-muted); } /* ---- the water budget page ---- - Measured water is blue, as everywhere on the site. The two warm marks are the - two ways the budget runs short: a month below its mean, and a drought level - above 1. The balance bars use one colour per term and print every value in the - key beside them, so no term is read from colour alone. */ -body[data-page="budget"] { --accent: var(--seq-300); } -.bTiles { - display: grid; grid-template-columns: repeat(auto-fit, minmax(176px, 1fr)); - gap: 12px; margin: 26px 0 34px; + Measured water is blue, as everywhere on the site, and amber is the budget + running short: a month below its mean, a site below its normal range, a drought + level above 1, water taken out of storage. The three balance terms that recur + across the page, precipitation, evaporation and runoff, keep one colour and, in + the catchment chart, one shape each; every chart also prints its values or has + a table, so no number is read from colour alone. The palette was checked for + colour-vision separation on both planes. */ +body[data-page="budget"] { + --accent: var(--seq-300); + --t-P: #3987e5; --t-E: #d95926; --t-R: #199e70; --t-in: var(--seq-200); + --t-st: var(--temp-3); --t-gain: var(--seq-600); + --u-spring: var(--seq-200); --u-ground: var(--seq-400); --u-lake: var(--seq-600); + --lo: var(--temp-3); --no: var(--div-5); --hi: var(--seq-400); +} +:root[data-theme="day"] body[data-page="budget"] { + --t-P: #2a78d6; --t-E: #eb6834; --t-R: #199e70; --t-in: #86b6ef; --t-gain: var(--seq-300); } -.bTile { - padding: 14px 16px 15px; border: 1px solid var(--hairline); border-radius: 8px; - background: color-mix(in srgb, var(--ink) 3%, transparent); + +/* The prose keeps its reading measure; figures and tables take the wider column. */ +body[data-page="budget"] .docWrap { grid-template-columns: min(60rem, 100%); } +@media (min-width: 1080px) { + body[data-page="budget"] .docWrap { grid-template-columns: 216px min(60rem, calc(100% - 300px)); } +} +body[data-page="budget"] .doc :is(.docHead, section) > :is(p, ul, ol, h1, h2, h3) { max-width: 42rem; } +body[data-page="budget"] .doc .fine { max-width: 46rem; } +.doc figure { margin: 0; } + +/* ---- tiles */ +.bTiles { + display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 228px), 1fr)); + gap: 1px; margin: 28px 0 40px; border: 1px solid var(--hairline); border-radius: 10px; + overflow: hidden; background: var(--hairline); } -.doc .bTile p { margin: 0; } +.bTile { padding: 16px 18px 18px; background: var(--plane); display: flex; flex-direction: column; } +.doc .bTile p { margin: 0; max-width: none; } .doc .bBig { - font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 27px; - line-height: 1.1; color: var(--ink); letter-spacing: -0.01em; -} -.bBig small { font-size: 0.55em; color: var(--ink-muted); } -.doc .bLabel { margin-top: 6px; font-size: 13.5px; line-height: 1.35; color: var(--ink-2); font-weight: 500; } -.doc .bSub { margin-top: 5px; font-size: 12.5px; line-height: 1.45; color: var(--ink-muted); } - -.bChart, .bFig { margin: 18px 0 26px; } -.bPlot { position: relative; height: 180px; margin-right: 46px; border-bottom: 1px solid var(--ink-muted); } -.bPlot.short { height: 130px; margin-right: 0; } -.bCols { position: absolute; inset: 0; display: flex; align-items: flex-end; gap: 2px; } -.bCol { flex: 1; min-width: 0; border-radius: 3px 3px 0 0; } -.bCol.below, .bKey i.below { background: var(--temp-3); } -.bCol.above, .bKey i.above { background: var(--seq-400); } -.bTick { position: absolute; left: 0; right: -46px; border-top: 1px dashed var(--rule); pointer-events: none; } -.bTick em { - position: absolute; right: 0; top: -8px; font-style: normal; font-family: var(--mono); - font-size: 10.5px; color: var(--ink-muted); background: var(--surface-1); padding-left: 4px; -} -.bStack { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; } -.bStack i { display: block; min-height: 1px; } -.bStack i:first-child { border-radius: 2px 2px 0 0; } -.cdi1 { background: var(--div-5); } -.cdi2 { background: var(--temp-2); } -.cdi3 { background: var(--temp-3); } -.cdi4 { background: var(--temp-4); } -.cdi5 { background: var(--temp-5); } -.bAxis { display: flex; gap: 2px; margin: 5px 46px 0 0; } -.bPlot.short + .bAxis { margin-right: 0; } -.bAxis span { - flex: 1; min-width: 0; overflow: visible; white-space: nowrap; - font-family: var(--mono); font-size: 10.5px; color: var(--ink-muted); -} -/* The last label is anchored at its right edge so it never runs past the plot. */ -.bAxis span:last-child { direction: rtl; } -.bKey { list-style: none; display: flex; flex-wrap: wrap; gap: 6px 18px; margin: 14px 0 6px !important; padding: 0 !important; } -.doc .bKey li { margin: 0; font-size: 13px; color: var(--ink-2); display: flex; align-items: baseline; gap: 7px; } + font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 32px; font-weight: 500; + line-height: 1.05; color: var(--ink); letter-spacing: -0.02em; +} +.bBig small { font-size: 0.5em; color: var(--ink-muted); letter-spacing: 0; } +.doc .bLabel { margin-top: 12px; font-size: 14px; line-height: 1.35; color: var(--ink); font-weight: 600; } +.doc .bSub { margin-top: 5px; font-size: 12.5px; line-height: 1.5; color: var(--ink-muted); } +.bMeter { position: relative; display: block; height: 6px; margin-top: 12px; border-radius: 3px; background: color-mix(in srgb, var(--ink) 10%, transparent); } +.bMeter i { position: absolute; inset: 0 auto 0 0; border-radius: 3px; } +.bMeter b { position: absolute; top: -4px; bottom: -4px; width: 2px; margin-left: -1px; background: var(--ink); border-radius: 1px; } +.bMeter.below i { background: var(--lo); } +.bMeter.above i, .bMeter.store i { background: var(--seq-400); } +.bMeter.ice i { background: var(--ice); } +.bDots { display: grid; grid-template-columns: repeat(var(--cols, 20), 8px); gap: 3px; margin-top: 12px; } +.bDots i { width: 8px; height: 8px; border-radius: 2px; cursor: default; } +.bDots.big { gap: 4px; margin: 10px 0 0; } +.bDots.big { grid-template-columns: repeat(var(--cols, 20), 15px); } +.bDots.big i { width: 15px; height: 15px; border-radius: 3px; } +.bDots i.on { outline: 2px solid var(--ink); outline-offset: 1px; } +i.lo, .bState.lo::before { background: var(--lo); } +i.no, .bState.no::before { background: var(--no); } +i.hi, .bState.hi::before { background: var(--hi); } + +/* ---- charts */ +.bChart, .bFig { margin: 20px 0 30px; } +.bCanvas { position: relative; width: 100%; min-height: 120px; } +.bSvg { display: block; overflow: visible; font-family: var(--sans); } +.bSvg .tick { font-family: var(--mono); font-size: 10.5px; fill: var(--ink-muted); font-variant-numeric: tabular-nums; } +.bSvg .grid { stroke: var(--rule); stroke-width: 1; stroke-dasharray: 2 3; } +.bSvg .ref { stroke: var(--ink-muted); stroke-width: 1.25; } +.bSvg .direct { font-family: var(--mono); font-size: 11.5px; font-weight: 600; fill: var(--ink); } +.bSvg .hit { fill: transparent; } +.bSvg .hit.on { fill: color-mix(in srgb, var(--ink) 8%, transparent); } +.bSvg .below { fill: var(--lo); } +.bSvg .above { fill: var(--seq-400); } +.bSvg .lab { paint-order: stroke; stroke: var(--plane); stroke-width: 3px; stroke-linejoin: round; } +.bSvg .lab.name { font-size: 13px; font-weight: 600; fill: var(--ink); } +.bSvg .lab.val { font-family: var(--mono); font-size: 11.5px; fill: var(--ink-2); font-variant-numeric: tabular-nums; } +.bSvg .lab.rowName { font-size: 12.5px; font-weight: 500; fill: var(--ink-2); } +.bSvg .lab.src { font-size: 12px; fill: var(--ink-2); } +.bSvg .span { stroke: var(--ink-muted); stroke-width: 1.5; opacity: 0.55; } +.bSvg .mk { stroke: var(--plane); stroke-width: 1.5; } +.bSvg .band { opacity: 0.5; transition: opacity 0.15s; } +.bSvg .band.on { opacity: 0.8; } +:root[data-theme="day"] .bSvg .band { opacity: 0.4; } +:root[data-theme="day"] .bSvg .band.on { opacity: 0.65; } +.bSvg .node.core { fill: var(--ink-2); } +.bSvg .t-P, .t-P { fill: var(--t-P); background: var(--t-P); } +.bSvg .t-E, .t-E { fill: var(--t-E); background: var(--t-E); } +.bSvg .t-R, .bSvg .t-outflow, .t-R, .t-outflow { fill: var(--t-R); background: var(--t-R); } +.bSvg .t-inflow, .t-inflow { fill: var(--t-in); background: var(--t-in); } +.bSvg .t-draw, .t-draw { fill: var(--t-st); background: var(--t-st); } +.bSvg .t-gain, .t-gain { fill: var(--t-gain); background: var(--t-gain); } +.bSvg .u-spring, .u-spring { fill: var(--u-spring); background: var(--u-spring); } +.bSvg .u-ground, .u-ground { fill: var(--u-ground); background: var(--u-ground); } +.bSvg .u-lake, .u-lake { fill: var(--u-lake); background: var(--u-lake); } +.cdi1 { fill: var(--div-5); background: var(--div-5); } +.cdi2 { fill: var(--temp-2); background: var(--temp-2); } +.cdi3 { fill: var(--temp-3); background: var(--temp-3); } +.cdi4 { fill: var(--temp-4); background: var(--temp-4); } +.cdi5 { fill: var(--temp-5); background: var(--temp-5); } + +.bKey { list-style: none; display: flex; flex-wrap: wrap; gap: 6px 18px; margin: 14px 0 6px !important; padding: 0 !important; max-width: none !important; } +.bKey.top { margin: 0 0 12px !important; } +.doc .bKey li { margin: 0; font-size: 13px; color: var(--ink-2); display: flex; align-items: center; gap: 7px; } .bKey i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; flex: none; } -.bKey span { font-family: var(--mono); font-size: 12px; color: var(--ink-muted); } -.bData { margin-top: 10px; } -.bData summary { cursor: pointer; font-size: 13px; color: var(--accent); } +.bKey i.below { background: var(--lo); } +.bKey i.above { background: var(--seq-400); } +.bKey i.refKey { width: 14px; height: 0; border-top: 1.5px solid var(--ink-muted); border-radius: 0; } +.bKey i.refKey.vert { width: 0; height: 12px; border-top: 0; border-left: 1.5px solid var(--ink-muted); } +.bKey svg { flex: none; overflow: visible; } +.bKey svg .mk { stroke: none; } +.bData { margin-top: 12px; } +.bData summary { cursor: pointer; font-size: 13px; color: var(--accent); width: max-content; } +.bData[open] summary { margin-bottom: 8px; } +.bTip { + position: fixed; left: 0; top: 0; z-index: 60; pointer-events: none; + max-width: 280px; padding: 9px 11px; border-radius: 8px; + background: var(--surface-1); border: 1px solid var(--hairline); + box-shadow: 0 6px 24px rgba(0,0,0,0.28); color: var(--ink-2); font-size: 12.5px; line-height: 1.45; +} +.bTip b { display: block; color: var(--ink); font-weight: 600; margin-bottom: 2px; } +.bTip span { display: flex; align-items: center; gap: 6px; font-variant-numeric: tabular-nums; } +.bTip span:empty { display: none; } +.bTip .sw { width: 9px; height: 9px; border-radius: 2px; flex: none; } + +/* ---- the balance */ .bSeg { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 18px; } .bSeg button { font: inherit; font-size: 13px; padding: 5px 12px; border-radius: 999px; cursor: pointer; @@ -593,42 +659,42 @@ body[data-page="budget"] { --accent: var(--seq-300); } } .bSeg button[aria-pressed="true"] { border-color: var(--accent); color: var(--ink); background: color-mix(in srgb, var(--accent) 16%, transparent); } .bSeg button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } -.bBalRow { display: grid; grid-template-columns: 4.5rem 1fr; align-items: center; gap: 10px; margin: 8px 0; } -.bBalName { font-size: 12px; font-family: var(--mono); text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-muted); } -.bBand { display: flex; gap: 2px; height: 30px; } -.bBand span { min-width: 2px; } -.bBand span:first-child { border-radius: 4px 0 0 4px; } -.bBand span:last-child { border-radius: 0 4px 4px 0; } -.t-P { background: var(--seq-200); } -.t-inflow { background: var(--seq-500); } -.t-draw { background: var(--temp-3); } -.t-E { background: var(--div-5); } -.t-outflow { background: var(--seq-400); } -.t-gain { background: var(--seq-600); } +#balanceChart { min-height: 330px; } +#balanceSum { margin-top: 10px; } + +/* ---- sites */ +.bSitesGrid { display: grid; gap: 22px 40px; grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); } +.doc .bSitesHead { margin: 0; font-size: 13.5px; font-weight: 600; color: var(--ink); max-width: none; } +.doc .bSitesKey { display: flex; flex-wrap: wrap; gap: 4px 16px; margin: 10px 0 0; font-size: 12.5px; color: var(--ink-muted); max-width: none; } +.bSitesKey span { display: inline-flex; align-items: center; gap: 6px; } +.bSitesKey i { width: 9px; height: 9px; border-radius: 2px; } +.bSitesKey b { font-family: var(--mono); font-weight: 500; color: var(--ink); } +.bState { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; } +.bState::before { content: ''; width: 8px; height: 8px; border-radius: 2px; } +/* ---- stores */ .bStores { margin: 6px 0 4px; } -.bStore { display: grid; grid-template-columns: 1fr auto; gap: 4px 12px; padding: 9px 0; border-bottom: 1px solid var(--rule); } -.bStoreName { font-size: 13px; color: var(--ink-2); } -.bStoreVal { font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 12px; color: var(--ink-muted); text-align: right; } -.bTrack { grid-column: 1 / -1; position: relative; height: 9px; } -.bStoreVal { grid-row: 1; grid-column: 2; } -.bTrack i, .bTrack u { position: absolute; left: 0; top: 0; height: 9px; border-radius: 0 4px 4px 0; min-width: 2px; } +.bStore { display: grid; grid-template-columns: 1fr auto; gap: 4px 12px; padding: 10px 0; border-bottom: 1px solid var(--rule); } +.bStoreName { font-size: 13.5px; color: var(--ink-2); } +.bStoreVal { font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 12px; color: var(--ink-muted); text-align: right; grid-row: 1; grid-column: 2; } +.bTrack { grid-column: 1 / -1; position: relative; height: 10px; } +.bTrack i, .bTrack u { position: absolute; left: 0; top: 0; height: 10px; border-radius: 0 4px 4px 0; min-width: 2px; } .bTrack i.st { background: var(--seq-400); } .bTrack u { background: color-mix(in srgb, var(--seq-400) 28%, transparent); } -.bTrack i.fl { background: transparent; border: 1.5px solid var(--ink-muted); height: 9px; box-sizing: border-box; } +.bTrack i.fl { background: transparent; border: 1.5px solid var(--ink-muted); box-sizing: border-box; } .bNum { font-family: var(--mono); font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--ink); } .bStore.flow .bStoreName { color: var(--ink-muted); } @media (min-width: 700px) { - .bStore { grid-template-columns: 12rem 1fr 6.5rem; align-items: center; gap: 0 14px; } + .bStore { grid-template-columns: 13rem 1fr 7rem; align-items: center; gap: 0 16px; } .bTrack { grid-column: auto; } .bStoreVal { grid-row: auto; grid-column: auto; } } @media (max-width: 480px) { - .bPlot { height: 150px; margin-right: 38px; } - .bTick { right: -38px; } - .bAxis { margin-right: 38px; } - .bAxis span { font-size: 9.5px; } - .doc .bBig { font-size: 24px; } - .bTiles { grid-template-columns: 1fr 1fr; gap: 8px; } - .bTile { padding: 12px; } + .doc .bBig { font-size: 27px; } + .bTiles { grid-template-columns: 1fr 1fr; } + .bTile { padding: 13px 12px 14px; } + .bDots { gap: 2px; grid-template-columns: repeat(var(--cols, 20), 6px); } + .bDots i { width: 6px; height: 6px; } + .bDots.big { grid-template-columns: repeat(var(--cols, 20), 13px); } + .bDots.big i { width: 13px; height: 13px; } } diff --git a/site/sitemap.xml b/site/sitemap.xml index 380a7a2..f325070 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -3,7 +3,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> https://opengovclimate.ch/riverflow/ - 2026-08-22 + 2026-10-10 @@ -13,7 +13,7 @@ https://opengovclimate.ch/riverflow/en/ - 2026-08-22 + 2026-10-10 @@ -23,7 +23,7 @@ https://opengovclimate.ch/riverflow/fr/ - 2026-08-22 + 2026-10-10 @@ -33,7 +33,7 @@ https://opengovclimate.ch/riverflow/it/ - 2026-08-22 + 2026-10-10 @@ -43,7 +43,7 @@ https://opengovclimate.ch/riverflow/rm/ - 2026-08-22 + 2026-10-10 @@ -53,6 +53,7 @@ https://opengovclimate.ch/riverflow/budget.html + 2026-10-10 @@ -62,6 +63,7 @@ https://opengovclimate.ch/riverflow/de/budget.html + 2026-10-10 @@ -71,6 +73,7 @@ https://opengovclimate.ch/riverflow/fr/budget.html + 2026-10-10 @@ -80,6 +83,7 @@ https://opengovclimate.ch/riverflow/it/budget.html + 2026-10-10 @@ -89,6 +93,7 @@ https://opengovclimate.ch/riverflow/rm/budget.html + 2026-10-10 @@ -98,7 +103,7 @@ https://opengovclimate.ch/riverflow/about.html - 2026-08-22 + 2026-10-10 @@ -108,7 +113,7 @@ https://opengovclimate.ch/riverflow/de/about.html - 2026-08-22 + 2026-10-10 @@ -118,7 +123,7 @@ https://opengovclimate.ch/riverflow/fr/about.html - 2026-08-22 + 2026-10-10 @@ -128,7 +133,7 @@ https://opengovclimate.ch/riverflow/it/about.html - 2026-08-22 + 2026-10-10 @@ -138,7 +143,7 @@ https://opengovclimate.ch/riverflow/rm/about.html - 2026-08-22 + 2026-10-10 @@ -148,7 +153,7 @@ https://opengovclimate.ch/riverflow/method.html - 2026-08-22 + 2026-10-10 @@ -158,7 +163,7 @@ https://opengovclimate.ch/riverflow/de/method.html - 2026-08-22 + 2026-10-10 @@ -168,7 +173,7 @@ https://opengovclimate.ch/riverflow/fr/method.html - 2026-08-22 + 2026-10-10 @@ -178,7 +183,7 @@ https://opengovclimate.ch/riverflow/it/method.html - 2026-08-22 + 2026-10-10 @@ -188,7 +193,7 @@ https://opengovclimate.ch/riverflow/rm/method.html - 2026-08-22 + 2026-10-10 @@ -198,7 +203,7 @@ https://opengovclimate.ch/riverflow/law.html - 2026-08-22 + 2026-10-10 @@ -208,7 +213,7 @@ https://opengovclimate.ch/riverflow/de/law.html - 2026-08-22 + 2026-10-10 @@ -218,7 +223,7 @@ https://opengovclimate.ch/riverflow/fr/law.html - 2026-08-22 + 2026-10-10 @@ -228,7 +233,7 @@ https://opengovclimate.ch/riverflow/it/law.html - 2026-08-22 + 2026-10-10 @@ -238,7 +243,7 @@ https://opengovclimate.ch/riverflow/rm/law.html - 2026-08-22 + 2026-10-10 @@ -248,7 +253,7 @@ https://opengovclimate.ch/riverflow/sources.html - 2026-08-22 + 2026-10-10 @@ -258,7 +263,7 @@ https://opengovclimate.ch/riverflow/de/sources.html - 2026-08-22 + 2026-10-10 @@ -268,7 +273,7 @@ https://opengovclimate.ch/riverflow/fr/sources.html - 2026-08-22 + 2026-10-10 @@ -278,7 +283,7 @@ https://opengovclimate.ch/riverflow/it/sources.html - 2026-08-22 + 2026-10-10 @@ -288,7 +293,7 @@ https://opengovclimate.ch/riverflow/rm/sources.html - 2026-08-22 + 2026-10-10 diff --git a/site/sources.html b/site/sources.html index 3f21279..805d5bb 100644 --- a/site/sources.html +++ b/site/sources.html @@ -30,8 +30,8 @@ - - + +