From 45ccee642398006de6beeb606d11e1583866c7e7 Mon Sep 17 00:00:00 2001 From: Jonas Hertner Date: Sat, 22 Aug 2026 17:01:53 +0200 Subject: [PATCH] Make evidence text a full-screen reading mode --- build/pages/index.en.html | 6 +- scripts/verify-site.mjs | 17 +++++- site/app.js | 78 +++++++++++++++++++++++++- site/data/provenance.json | 2 +- site/de/index.html | 6 +- site/en/index.html | 6 +- site/fr/index.html | 6 +- site/i18n-map.js | 12 ++++ site/index.html | 6 +- site/it/index.html | 6 +- site/rm/index.html | 6 +- site/style.css | 113 ++++++++++++++++++++++++++++++-------- 12 files changed, 217 insertions(+), 47 deletions(-) diff --git a/build/pages/index.en.html b/build/pages/index.en.html index f009130..9d50e84 100644 --- a/build/pages/index.en.html +++ b/build/pages/index.en.html @@ -33,10 +33,10 @@ - + - + @@ -466,6 +466,6 @@

Follow the water. Protect its pathways.

- + diff --git a/scripts/verify-site.mjs b/scripts/verify-site.mjs index 1167261..3b9a13e 100644 --- a/scripts/verify-site.mjs +++ b/scripts/verify-site.mjs @@ -230,8 +230,12 @@ for (const [label, pattern] of [ ['sidebar map readout', /#workspace #tooltip\s*\{[^}]*position:\s*static;[^}]*border-bottom:/s], ['sidebar legal screen', /#workspace #liveAlerts\s*\{[^}]*flex:\s*none;[^}]*border-bottom:/s], ['touch-sized legal screen', /#workspace #liveAlertsToggle\s*\{[^}]*min-height:\s*44px/s], - ['viewport-bound legal details', /#workspace #liveAlertsBody\s*\{[^}]*max-height:\s*clamp\(100px,\s*18dvh,\s*180px\);[^}]*overflow-y:\s*auto/s], - ['smallest-phone legal details', /@media \(max-width:\s*480px\) and \(max-height:\s*650px\) and \(orientation:\s*portrait\)[\s\S]*?#workspace #liveAlertsBody\s*\{[^}]*max-height:\s*70px/s], + ['single-scroll legal details', /#workspace #liveAlertsBody\s*\{[^}]*max-height:\s*none;[^}]*overflow-y:\s*visible/s], + ['readable legal explanation', /#workspace \.liveAlertLimit\s*\{[^}]*font-size:\s*13px;[^}]*line-height:\s*1\.55/s], + ['full-screen reading mode', /body\.workspaceReading #workspace\s*\{[^}]*inset:\s*0;[^}]*width:\s*100vw;[^}]*height:\s*100dvh/s], + ['persistent map return', /#workspaceBack\s*\{[^}]*min-height:\s*38px/s], + ['full reading detail surface', /body\.workspaceReading #workspace #panel\s*\{[^}]*inset:\s*var\(--workspace-head-h,\s*99px\) 0 0/s], + ['adaptive phone reading height', /body:is\(\.readingLegal, \.readingDetail, \.readingBrief\)\s*\{\s*--workspace-h:\s*72dvh/s], ['persistent project navigation', /#workspaceHead #siteNav\s*\{[^}]*flex-wrap:\s*nowrap;[^}]*overflow-x:\s*auto/s], ['high-contrast control boundary token', /--control-border:\s*#[0-9a-f]{6}/i], ]) if (!pattern.test(responsiveCss)) fail(responsiveCssFile, `missing responsive contract: ${label}`); @@ -267,6 +271,15 @@ if (!/workspaceScroll\.tabIndex\s*=\s*0/.test(appSource) || !/workspaceScroll\.setAttribute\(['"]aria-labelledby['"],\s*['"]workspaceTitle['"]\)/.test(appSource)) { fail(join(site, 'app.js'), 'the evidence scroller is not keyboard focusable and labelled'); } +if (!/function syncWorkspaceReading\(\)/.test(appSource) || + !/workspaceBack\.onclick\s*=\s*leaveWorkspaceReading/.test(appSource) || + !/workspaceRead\.setAttribute\(['"]aria-expanded['"]/.test(appSource)) { + fail(join(site, 'app.js'), 'full-screen reading mode lacks a persistent, stateful return to the map'); +} +if (!/panel\.scrollTop\s*=\s*0/.test(appSource) || + !/new ResizeObserver\(syncWorkspaceHeadHeight\)\.observe\(workspaceHead\)/.test(appSource)) { + fail(join(site, 'app.js'), 'detail reading does not start at the top or respect the live navigation height'); +} const siteSource = readFileSync(join(site, 'site.js'), 'utf8'); if (!/function restoreDeepLink\(\)[\s\S]*?target\.scrollIntoView\(\{ block: 'start' \}\)[\s\S]*?new ResizeObserver\(align\)/.test(siteSource)) { fail(join(site, 'site.js'), 'late data layout can displace direct section links'); diff --git a/site/app.js b/site/app.js index 4182573..6040708 100644 --- a/site/app.js +++ b/site/app.js @@ -36,6 +36,15 @@ if (themeControl) workspaceUtility.append(themeControl); workspaceHead.append(workspaceUtility); if (siteNav) workspaceHead.append(siteNav); +// Detail reading occupies the whole evidence surface below the persistent +// project navigation. Measure that navigation instead of duplicating its height +// in breakpoint-specific CSS; safe-area insets and translated labels can change it. +const syncWorkspaceHeadHeight = () => { + workspace.style.setProperty('--workspace-head-h', `${workspaceHead.offsetHeight}px`); +}; +syncWorkspaceHeadHeight(); +new ResizeObserver(syncWorkspaceHeadHeight).observe(workspaceHead); + const workspaceScroll = document.createElement('div'); workspaceScroll.id = 'workspaceScroll'; workspaceScroll.tabIndex = 0; @@ -77,6 +86,60 @@ for (const [side, arrow] of [['start', '\u2039'], ['end', '\u203a']]) { modeRail.append(cue); } +// The map remains the working surface; prose can become a reading surface on +// demand. The same full-screen mode is used for legal review, selected features +// and the first-visit brief, so users learn one way in and one way back. +let manualReading = false; +const workspaceBack = document.createElement('button'); +workspaceBack.type = 'button'; +workspaceBack.id = 'workspaceBack'; +workspaceBack.hidden = true; +workspaceBack.textContent = `\u2190 ${T('m.backToMap')}`; +workspaceBack.setAttribute('aria-label', T('m.backToMapAria')); +workspaceUtility.insertBefore(workspaceBack, languageSwitch || themeControl || null); + +const workspaceRead = document.createElement('button'); +workspaceRead.type = 'button'; +workspaceRead.id = 'workspaceRead'; +workspaceRead.textContent = T('m.readEvidence'); +workspaceRead.setAttribute('aria-label', T('m.readEvidenceAria')); +workspaceRead.setAttribute('aria-expanded', 'false'); +document.getElementById('dataViewOpen')?.before(workspaceRead); + +function syncWorkspaceReading() { + const active = manualReading || document.body.classList.contains('readingLegal') || + document.body.classList.contains('readingDetail') || + document.body.classList.contains('readingBrief'); + document.body.classList.toggle('workspaceReading', active); + workspaceBack.hidden = !active; + workspaceRead.setAttribute('aria-expanded', String(active)); +} + +function leaveWorkspaceReading() { + manualReading = false; + if (legalAlertToggle?.getAttribute('aria-expanded') === 'true') { + legalAlertToggle.setAttribute('aria-expanded', 'false'); + legalAlertBody.hidden = true; + } + document.body.classList.remove('readingLegal'); + if (!panel.hidden) closePanel(false); + const brief = document.getElementById('intro'); + if (brief?.open) document.getElementById('introClose')?.click(); + document.body.classList.remove('readingDetail', 'readingBrief'); + syncWorkspaceReading(); + cv.focus({ preventScroll: true }); +} + +workspaceRead.onclick = () => { + manualReading = true; + syncWorkspaceReading(); + requestAnimationFrame(() => { + workspaceScroll.scrollTo({ top: 0 }); + workspaceScroll.focus({ preventScroll: true }); + }); +}; +workspaceBack.onclick = leaveWorkspaceReading; + const ENDPOINT = 'https://lindas.admin.ch/query'; /* ---- the palette ----------------------------------------------------------- @@ -831,6 +894,9 @@ legalAlertToggle?.addEventListener('click', () => { const open = legalAlertToggle.getAttribute('aria-expanded') === 'true'; legalAlertToggle.setAttribute('aria-expanded', String(!open)); legalAlertBody.hidden = open; + document.body.classList.toggle('readingLegal', !open); + syncWorkspaceReading(); + if (!open) requestAnimationFrame(() => legalAlertRoot.scrollIntoView({ block: 'nearest' })); }); /* =========================================================================== @@ -1802,11 +1868,16 @@ function tip(mx, my) { const panel = document.getElementById('panel'); let panelReturnFocus = null; function revealPanel(moveFocus) { + panel.scrollTop = 0; panel.hidden = false; - if (moveFocus) requestAnimationFrame(() => panel.focus({ preventScroll: true })); + document.body.classList.add('readingDetail'); + syncWorkspaceReading(); + requestAnimationFrame(() => panel.focus({ preventScroll: true })); } function closePanel(returnFocus = true) { panel.hidden = true; + document.body.classList.remove('readingDetail'); + syncWorkspaceReading(); selected = null; dirty = true; const target = panelReturnFocus; @@ -2358,6 +2429,7 @@ dataNext.onclick = () => { dataPage++; renderDataView(); }; window.addEventListener('keydown', e => { if (e.key !== 'Escape') return; if (!panel.hidden) closePanel(); + else if (document.body.classList.contains('workspaceReading')) leaveWorkspaceReading(); }); /* =========================================================================== @@ -3861,11 +3933,15 @@ function setLiveOnly(v) { const show = () => { if (!dialog.open) dialog.show(); dialog.scrollTop = 0; + document.body.classList.add('readingBrief'); + syncWorkspaceReading(); document.getElementById('introClose').focus({ preventScroll: true }); }; const close = () => { try { localStorage.setItem(KEY, '1'); } catch (e) { /* private mode */ } if (dialog.open) dialog.close(); + document.body.classList.remove('readingBrief'); + syncWorkspaceReading(); cv.focus({ preventScroll: true }); }; if (open) open.onclick = show; diff --git a/site/data/provenance.json b/site/data/provenance.json index 9f7d740..031ef1c 100644 --- a/site/data/provenance.json +++ b/site/data/provenance.json @@ -1 +1 @@ -{"schema":3,"built":"2026-08-22T14:27:31.276Z","revision":"sha256:29121aebee1fe3ac8ae0f1b3f09d0509cffe6e5a8fa038c3af6c634ea71e77b4","publicationDigest":"sha256:29121aebee1fe3ac8ae0f1b3f09d0509cffe6e5a8fa038c3af6c634ea71e77b4","sourceRevision":null,"scope":"The publication digest identifies the exact public artifacts and generators. sourceRevision is added by the deployment workflow. Reviewed archive hashes survive partial API refreshes; mutable API responses are identified by their published source state.","archiveEvidence":"unavailable","facts":{"stations":233,"uniqueStationIds":233,"boundStations":227,"dischargeStations":187,"unresolvedDischargeUnits":5,"dischargeReaches":173,"eligibleDischargeReaches":168,"reaches":8711,"uniqueReachIds":8711,"q347Points":1041,"reservoirWeeks":1390,"qualityRows":1543996,"qualityStations":144,"qualityParameters":724,"monitoringCantons":26,"monitoringCantonsWithNawa":25},"sources":[{"key":"q347","holder":"BAFU","datenstand":"2000-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.hydrologie-q347","links":[],"licence":"opendata.swiss, attribution"},{"key":"abstraction","holder":"BAFU and the cantons","datenstand":"2004-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-entnahme","links":[],"licence":"opendata.swiss, attribution"},{"key":"ara","holder":"BAFU and the cantons","datenstand":"2014-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.gewaesserschutz-klaeranlagen_anteilq347","links":[],"licence":"opendata.swiss, attribution"},{"key":"groundwater","holder":"BAFU","datenstand":"2017-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.grundwasserkoerper","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"wet_auen","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-auen","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_moorl","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-moorlandschaften","links":[],"licence":"opendata.swiss, attribution"},{"key":"rivers","holder":"HydroSHEDS / WWF, HydroRIVERS v1.0","datenstand":"2019-01-01","live":false,"url":"https://www.hydrosheds.org/products/hydrorivers","links":[],"licence":"Free for non-commercial and commercial use with attribution"},{"key":"npp","holder":"BFE","datenstand":"2019-12-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.kernkraftwerke","links":[],"licence":"opendata.swiss, attribution"},{"key":"context","holder":"Natural Earth 10m","datenstand":"2022-05-01","live":false,"url":"https://www.naturalearthdata.com/","links":[{"label":"10m lakes","url":"https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-lakes/"},{"label":"10m countries","url":"https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/"}],"licence":"Public domain"},{"key":"zones","holder":"the 26 cantons via geodienste.ch","datenstand":"2023-05-16","live":false,"url":"https://geodienste.ch/services/planerischer_gewaesserschutz","links":[],"licence":"per canton; all 26 currently publish this model freely"},{"key":"ice","holder":"GLAMOS","datenstand":"2023-09-01","live":false,"url":"https://doi.glamos.ch/","links":[{"label":"SGI1850","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1850_r1992.html"},{"label":"SGI1931","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1931_r2022.html"},{"label":"SGI1973","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1973_r1976.html"},{"label":"SGI2010","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2010_r2010.html"},{"label":"SGI2016","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2016_r2020.html"},{"label":"SGI2023","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2023_r2026.html"},{"label":"length change","url":"https://doi.glamos.ch/data/lengthchange/lengthchange_2025_r2025.html"}],"licence":"CC BY 4.0 per the DOI index; the length-change file header adds \"scientific and non-commercial use\". Both statements stand."},{"key":"dams","holder":"BFE","datenstand":"2023-11-28","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.stauanlagen-bundesaufsicht","links":[],"licence":"opendata.swiss, attribution"},{"key":"catchments","holder":"BAFU","datenstand":"2024-06-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-teileinzugsgebiete_2","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"quality","holder":"BAFU and the cantons","datenstand":"2024-12-31","live":false,"url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend","links":[{"label":"NAWA programme","url":"https://www.bafu.admin.ch/de/nawa"},{"label":"dataset and field definitions","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend"},{"label":"prepared annual files","url":"https://data.bafu.admin.ch/download?list-type=2&prefix=water/nawa-trend/"},{"label":"licence and source","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/lizenz-und-quelle"}],"licence":"Open use. Must provide the source. Commercial and non-commercial use permitted with attribution."},{"key":"wet_hoch","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-hochmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_flach","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-flachmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"hydro","holder":"BFE","datenstand":"2025-12-31","live":false,"url":"https://www.bfe.admin.ch/de/wasserkraft","links":[],"licence":"opendata.swiss, attribution"},{"key":"names","holder":"swisstopo, swissNAMES3D 2026","datenstand":"2026-03-09","live":false,"url":"https://data.geo.admin.ch/ch.swisstopo.swissnames3d/","links":[],"licence":"Open data, free use with source attribution"},{"key":"wet_amphi","holder":"BAFU","datenstand":"2026-05-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-amphibien","links":[],"licence":"opendata.swiss, attribution"},{"key":"reservoirFill","holder":"BFE","datenstand":"2026-08-17","live":false,"url":"https://www.uvek-gis.admin.ch/BFE/ogd/17/ogd17_fuellungsgrad_speicherseen.csv","links":[],"licence":"opendata.swiss, attribution"},{"key":"gauges","holder":"BAFU","datenstand":null,"live":true,"url":"https://lindas.admin.ch/query","links":[{"label":"LINDAS observations","url":"https://lindas.admin.ch/query"},{"label":"hydrodaten station plots and units","url":"https://www.hydrodaten.admin.ch/"}],"licence":"Open government data, no key"},{"key":"basemap","holder":"swisstopo","datenstand":null,"live":false,"url":"https://docs.geo.admin.ch/visualize-data/wms.html","links":[],"licence":"FSDI general terms of use, free use with source attribution"}],"upstreamArchives":[],"generators":{".github/workflows/pages.yml":{"bytes":3319,"sha256":"db641bc9404c15c8ea4305ab9700998d4cd390d5d0dffa255c75979819c431bc"},"build/00-sources.sh":{"bytes":8872,"sha256":"8ec73140ecc00c2b7cb44f17115706cb0f3a520927c4c452b9c2858a90b37f28"},"build/01-stations.mjs":{"bytes":5719,"sha256":"4d81f143d263c84c05ef541b732d6e2dcee6aa60a59971b543faf04a77bc2a1e"},"build/02-network.mjs":{"bytes":3111,"sha256":"394b73f8e36e98d8d09bea66fcaf42883bfd7bfe228000341ba72444047975d8"},"build/03-context.mjs":{"bytes":1641,"sha256":"9061bfb755f87b78e3a52d0d080c19845f3cd131c173683131610613b0188038"},"build/04-glaciers.mjs":{"bytes":8309,"sha256":"b02d1e76ddfddb9ae2c2100c0f6d9d1c388afa23268ad29a052ec99080423320"},"build/05-users.mjs":{"bytes":11468,"sha256":"7a4bdf9fd2b521e19641b34cb74b4a3b720a569a88fd2b3f36570273b2dccb5c"},"build/06-reservoirs.mjs":{"bytes":12702,"sha256":"a6188f5c0c11a1a2822f4f9f9100750123442dde6a9d6ae1b983e3971fee9635"},"build/07-residual.mjs":{"bytes":13124,"sha256":"85991e1825ff9f027c0d9147616941ef4505c9dd25fa291826884650b135ff80"},"build/08-vintage.mjs":{"bytes":21960,"sha256":"10d0191fa478023043555fcd592ef6efcfdebcedd9941b431e65e7339d342fe3"},"build/09-icehistory.mjs":{"bytes":6719,"sha256":"24bd4e2d658b2169f0864aa4475e0d8b976462c1598051f43c4e266ef0ef2e57"},"build/10-names.mjs":{"bytes":16681,"sha256":"70313e9fad336e981fd14affd094e9dec2214d1d5dbf9facb1d408c28f31749b"},"build/11-cantons.mjs":{"bytes":3034,"sha256":"9f88c2f7b8bef1bc9901e17b1075a520ce4061984ebf9a672349d2d8659045b4"},"build/12-wetlands.mjs":{"bytes":13776,"sha256":"9703b964901932b5382212f207c0570c0a1033b3d3d6dbd7aabf70019a4195e5"},"build/13-basins.mjs":{"bytes":13142,"sha256":"c89b0a6797b4b824c62119b9ddbd6f260d29fac0041757d904acef81c34158fc"},"build/14-pages.py":{"bytes":15802,"sha256":"81ceecd1cce2150f86fcde46dcadd58cfbe147ef0f4b113a23f4b71b2e8f0b95"},"build/15-social-card.mjs":{"bytes":6144,"sha256":"51414e2510d58ea5af4373264efcbb937984443e826e5b5a71fbd067f44bc6c1"},"build/16-provenance.mjs":{"bytes":5320,"sha256":"08e31dc626be2c9809191bc7d0fd8b20d63446c41444788b9d26f46bc3026c07"},"build/17-quality.mjs":{"bytes":12969,"sha256":"80cdb035bb96541066904c02ef7f33bf60719d4550d51d49a3cd465d13effa7a"},"build/18-monitoring.mjs":{"bytes":7703,"sha256":"8c4bb64641562a77fb6dd22940b4c607e2f1da245ac453cb09c283ecefc24550"},"build/lib-stations.mjs":{"bytes":1501,"sha256":"17d8c00b36f96fba383b430f8f22d37c83e7c5f895fa9f99823dd0ead087b3f5"},"build/pages/de.json":{"bytes":155594,"sha256":"662f1344c6991313e33d9b6a73ea166681e300d5ccf35de9f9672bd151913ce2"},"build/pages/fr.json":{"bytes":159142,"sha256":"cf4d1a4ed1cd09c18c0346b58654b192180f8932105379943a1883186f18b0c5"},"build/pages/index.en.html":{"bytes":28908,"sha256":"062d006aebd080699f99f6435b258337d61208924023f8c18f59a66520e337e4"},"build/pages/it.json":{"bytes":154686,"sha256":"6bbfbbec18f06c0536bf4cbd3d668d856b04fa3f84917567e6887acf81fc9fd2"},"build/pages/rm.json":{"bytes":157695,"sha256":"33b229bacffbee7c5c8f788bcec8023c3ebf7bda5b3187a90e974140e9c2fe7f"},"build/pages/updates.json":{"bytes":258015,"sha256":"18e5a6fe6f779ef4000e5c6f7f00ce47f04d274eed4987865fcc23724649836d"},"package-lock.json":{"bytes":63777,"sha256":"c3c32ff1af7525028f4c955f9aadba58f0a252692b04f3ee54958ebcbf268e50"},"package.json":{"bytes":1070,"sha256":"53caf42b0f271b8567a224f37d229fb516257d30cfe536661cc96433f8d75bfe"},"scripts/check-external-links.mjs":{"bytes":2337,"sha256":"0d23a491568eec07b7830c5598f7ae6478e376e82ded972dade923ccf8d70352"},"scripts/check-performance-budget.mjs":{"bytes":3003,"sha256":"5217493c384f55470b32c94a15e359742a1aecb6371b87bbf9e469e553101cfd"},"scripts/verify-site.mjs":{"bytes":41960,"sha256":"129ef025ddfe7a710f0b1cb90cdb95376053c36747255bdea756b4ed35df4785"}},"artifacts":{"about.html":{"bytes":23427,"sha256":"c9cdbf33863172bf8a6ce3954ed12cd618bca5e85cb815b76230792dc720dba2"},"app.js":{"bytes":175555,"sha256":"9af7be4c6fef11d4ce4745fab8321d280327702ba2a9ebe284a9069e5a37caaf"},"data/basins.json":{"bytes":3488,"sha256":"9fc9f8a3f55a42580dafac22eedf9f1090ee6b31873110719bde121ff968c537"},"data/canton-monitoring.json":{"bytes":6601,"sha256":"5a0723e5a87ba9643591c466d653604e0418c364ed4487791c84e26afdbdbb69"},"data/cantons.json":{"bytes":3625,"sha256":"31d0e54c707c1cb511b22dfb263a3edaeeb81f098f5643dab3828e945f8e5b69"},"data/context.json":{"bytes":23094,"sha256":"274f0a40245933156cb8daa994f1e9188fbe6f99db0be2e3cea80925f2368007"},"data/glaciers.json":{"bytes":1115131,"sha256":"2ab15ef0c109995bd740902856eb6b3c6d12f82899d2af39e893e28e5b0dc35f"},"data/icehistory.json":{"bytes":625151,"sha256":"9ceb75bab89879565bfd13e2d7614f0bd25c6a63d92733cd27f841931e63e5ab"},"data/names.json":{"bytes":365854,"sha256":"97c91c4a7b74685ab81752617c2db1399408ece0d3f0e11683f621711dcf2192"},"data/network.json":{"bytes":1105368,"sha256":"4b04980eb3a2f4385d783af8da41eb15bcc28ad2e5f22f94d6c3ced7938ba12c"},"data/quality.json":{"bytes":4624338,"sha256":"47cfd9b0e50d22baa268280250401d3af2bc2e70af08455a053addde2ee94084"},"data/reservoirs.json":{"bytes":110597,"sha256":"26de75b0047008cdd94c563c78f67eb737f4f450763ef11cab3c140a48320bef"},"data/residual.json":{"bytes":235789,"sha256":"614e5f00f726148d30a23b5debe508561ae0163ce60002ef3723b48f9aece406"},"data/social-card.json":{"bytes":184,"sha256":"ce6711de7c2883ace6daf796e4044124b104c1392d553374af08a178b1782172"},"data/stations.json":{"bytes":41444,"sha256":"9f55491b1b1aa992a79e2568bcb3363e6daf02cc9f121e8a82afdc8d005f53c8"},"data/users.json":{"bytes":346478,"sha256":"1399cdf3eabed26a519f609db326cecdb99ea4a9146aa640630fbd45d2c7f4bf"},"data/vintage.json":{"bytes":13903,"sha256":"c98fcc5bf4a509aba37cc804945bbc931ad843e3913ccaf24aebd01c45a83db0"},"data/wetlands.json":{"bytes":1081150,"sha256":"eee2b59945140fea80178edae6b5bfe973f2a52475c72d0bf268d4a7809170cb"},"de/about.html":{"bytes":24620,"sha256":"372507f5ef64267f723483d26e0050fec4f67529c598275aa0809282277284f6"},"de/index.html":{"bytes":29972,"sha256":"d28ce59037d8357b360d0624e21e3c4546a5ba3c0547a19372dd207594c42e8c"},"de/law.html":{"bytes":29481,"sha256":"bded7ab11a750a94a6ee3e73256c71b1302464107375f607bdfa0e49672cca05"},"de/method.html":{"bytes":47288,"sha256":"116f2f1db59ebb7e7efaddf64cdb990e6e0289eb2464603e255958663328afd7"},"de/sources.html":{"bytes":13193,"sha256":"cdfe2baeaf397d7a9632615b6247294bf6d18721395b8e3cf0da8bd1d7c089d7"},"en/index.html":{"bytes":29027,"sha256":"24401146cc7d62dc9f1cb53e956df66aeaaf2e76fc3b30e5e3276851b939bf94"},"favicon.svg":{"bytes":598,"sha256":"ffb7394f49c0ac90daa0203d9ce45bfafbf7d3d9cac1f0fdafc561f797f9195f"},"fmt.js":{"bytes":2388,"sha256":"eb50d45ea49aa0b8ef4d434d6dce3ece9537965a44948b350ce8b99b1c03cb66"},"fonts.css":{"bytes":4631,"sha256":"a919c516ef820d854333516658188efaa463cb5535277a12a14c5afd9e2d3be8"},"fonts/OFL-Archivo.txt":{"bytes":4387,"sha256":"1778201b7bd33e8c08a2eda32a4ad2f69bc38ced9731b01cc3fc47f268c8ef3c"},"fonts/OFL-IBM-Plex-Mono.txt":{"bytes":4362,"sha256":"d741e57d5f865e294df801f96b7b5161a88b211df65887e4358d271c9fc5fb4f"},"fonts/OFL-Source-Serif-4.txt":{"bytes":4399,"sha256":"0fd8b796c1c6220a559a5682cfd00d1c8488b428369f7cb70deb671888cef85f"},"fonts/archivo-italic-latin-ext.woff2":{"bytes":35208,"sha256":"71d5c4e5da1cc99cf78fe92f2fb9880dfc03dfef7122b0d1ed1d56f25452e824"},"fonts/archivo-italic-latin.woff2":{"bytes":39132,"sha256":"e1989a5727374fcd299979407c8087669ca223f5281f8645891e5400f3e61aeb"},"fonts/archivo-normal-latin-ext.woff2":{"bytes":32672,"sha256":"a999e009fdcd0f939c138e04043b3b2ad083b26252b644e8f94c083d48b77af0"},"fonts/archivo-normal-latin.woff2":{"bytes":34940,"sha256":"7150c0ec5ad356453013d11affec1fbab95de0dd2dcecb043b4f1cb7f87c4ba4"},"fonts/ibm-plex-mono-400-latin-ext.woff2":{"bytes":8860,"sha256":"f1050dc5317b43434c0aeda599d4624c774ffc162e87a8cf204b949b6a85816d"},"fonts/ibm-plex-mono-400-latin.woff2":{"bytes":10052,"sha256":"c36f509c0a8f9f85f29cb44bc8701d8a9e0b14c499e77a884f789ead7093a7ac"},"fonts/ibm-plex-mono-500-latin-ext.woff2":{"bytes":8848,"sha256":"77f03e26f981c582bdba3a7abed4baa2d3149211c01366bb3ab3ba7622ec4ae5"},"fonts/ibm-plex-mono-500-latin.woff2":{"bytes":10060,"sha256":"a76f53ca6612e7b3828eec2311098675b7f9849ae4169a8bcef6302aec02a6c0"},"fonts/source-serif-italic-latin-ext.woff2":{"bytes":43964,"sha256":"3eff7682cb08de3fbd2f411e05dc3f68fbd3ce721ec554ffafa7b0397214e76f"},"fonts/source-serif-italic-latin.woff2":{"bytes":50584,"sha256":"419703e180143eb9033e02651331fcf3cc8558d42f1041140a0b24e5be0933bb"},"fonts/source-serif-normal-latin-ext.woff2":{"bytes":100772,"sha256":"a0cd390d017200f91327781204458ff918999584bece8902497ba6c08472178d"},"fonts/source-serif-normal-latin.woff2":{"bytes":122168,"sha256":"2a24bad466f09b88b8e9cbc488bf774117c912e66374c57bf4716855849143f8"},"fr/about.html":{"bytes":24923,"sha256":"ac47a6d084732808b54eda1b5f3b916b8055197cba9c44e4c8124b2f00986d19"},"fr/index.html":{"bytes":30749,"sha256":"ea475040dedc07ea022e751e9ba8bd56687896239b2a540bb09af1709280725c"},"fr/law.html":{"bytes":30904,"sha256":"0d98194a8d1a713aac792b78ed703a5475564f6d90951bebcb08e99d70a53fad"},"fr/method.html":{"bytes":48880,"sha256":"36420c14e14c829821df1cea9a905e401f0078ea4e87a1813aa4818493b62623"},"fr/sources.html":{"bytes":13503,"sha256":"9af06471f88ca99963010b8ec4b966fb9a07c8ab65ab274332aa94c00ac7bae8"},"gschg31.js":{"bytes":1894,"sha256":"bf4673598fd6936aec1a2eeb2e692b24ea984fb728146324dcf8586f183a9c08"},"i18n-data.js":{"bytes":59884,"sha256":"e416f44065e452e52f810fc76c3df633853c6ae8604517d79d6b61453789f129"},"i18n-map.js":{"bytes":137112,"sha256":"540c144e7c01f4bd6c6aaf8e0b38572bb339f8b964647f65fb22594b6d48f2d0"},"i18n.js":{"bytes":38264,"sha256":"260d45c429e32b77efffbeb1fb84f2fad55de31654e8df2a36e8b2ec6fb828c5"},"index.html":{"bytes":29987,"sha256":"badc5fea496c2fa2df5a4770db53c1c3c534e9a77197a4e38bf7b8bb131efcfa"},"it/about.html":{"bytes":24042,"sha256":"9ba8bcf6f6356ea56cabd09125a3beb0688b50331f716cd94f9531c8d1606b3a"},"it/index.html":{"bytes":30136,"sha256":"038432cff4731c542de82ef45233ab9131a98f214def669fe8aa221b3aa9b5b1"},"it/law.html":{"bytes":29853,"sha256":"09a959830d532da47f5cea0c00d9eb1e38e5e5c2eeccbaf812f5ade159f08495"},"it/method.html":{"bytes":46646,"sha256":"ba0365bb655e8df2d7b7f60eeca5f435f661473bff444deec147d55d3b2ff3f0"},"it/sources.html":{"bytes":13047,"sha256":"fad144aecd3287538bfc8eb6d6cc4c6ddd2abbaa41fb3ccdbf16bffa9bfe6919"},"law.html":{"bytes":28203,"sha256":"598750873da8ccd057b548ce24bc5e9672f1b66f36639493b071ada1da185cd6"},"legal-alerts.js":{"bytes":2495,"sha256":"98f782af37d89a363f19c6e3a9abf7b9bc5226efcb891751f20adad7614f308e"},"method.html":{"bytes":45355,"sha256":"f4974a62358a9918a2742be8c5528274877ce655821db7d905fd72cad2e7824d"},"og-image.jpg":{"bytes":200325,"sha256":"f6a6cbd88798900d3b584b1e966c764506ddd85e88328d77e17cf77cf89f5144"},"rm/about.html":{"bytes":24338,"sha256":"89115acfa934e73afe239ac00e60cade069efbaacd28ce5c4b4cd7e9d0dfb800"},"rm/index.html":{"bytes":30491,"sha256":"ab742cf96ae22a0ba5b8379b095afa370ca6be33c05f48bea449020ed868c581"},"rm/law.html":{"bytes":30438,"sha256":"65fb4b599cf0f406718ae4416bc195d81d439887b30b2f89f95bb87a1ed97e39"},"rm/method.html":{"bytes":47987,"sha256":"88801d72275dc950d38a7c3882288f939932f9a906d684341757e07974e8de3a"},"rm/sources.html":{"bytes":13574,"sha256":"4662b473b82ba86eddaffa07036f1a42945437017d25ab8859a8f4a520bf04f4"},"robots.txt":{"bytes":80,"sha256":"f8de6fa3cc79f4c7b56023e2618742b16dabde01c2d950dc0a48f71309ed9018"},"site.css":{"bytes":25213,"sha256":"46432b270e3187a66f0517ab77df107c4ff6a4f8012871aa4fedf2fabd7ff289"},"site.js":{"bytes":25768,"sha256":"caa0b3b41eb1027aca3f6ffbf3aa56b2e09ad96c32aac89268902cc298645875"},"sitemap.xml":{"bytes":18506,"sha256":"862dd487e520d4006c55150f2e4c7c42c7a93366f3fc01b8dfb27f68fe2b94a6"},"sources.html":{"bytes":12739,"sha256":"216652d9550aa70d9fbfd67869324298b08ec28c12ee2c03cc58c1ff196b01ff"},"style.css":{"bytes":72461,"sha256":"1da0ec1843f51cd3802f9c54c00d6d306b655806270d9d85d92742c35065e8fa"},"theme.js":{"bytes":3354,"sha256":"a1811f92d1d08cc87cb3c8f41515a9f0868bdad44782150bd41074af1df06b3a"},"tokens.css":{"bytes":16169,"sha256":"a09dd19c74aa879f8211196eed3ed19b97c6a576985253b4c468e9b52b5b4f7a"}}} \ No newline at end of file +{"schema":3,"built":"2026-08-22T14:59:44.021Z","revision":"sha256:f71cbd4b40488517ade31857e0e1640672a44241d4954798dd301309bf9cc1d1","publicationDigest":"sha256:f71cbd4b40488517ade31857e0e1640672a44241d4954798dd301309bf9cc1d1","sourceRevision":null,"scope":"The publication digest identifies the exact public artifacts and generators. sourceRevision is added by the deployment workflow. Reviewed archive hashes survive partial API refreshes; mutable API responses are identified by their published source state.","archiveEvidence":"unavailable","facts":{"stations":233,"uniqueStationIds":233,"boundStations":227,"dischargeStations":187,"unresolvedDischargeUnits":5,"dischargeReaches":173,"eligibleDischargeReaches":168,"reaches":8711,"uniqueReachIds":8711,"q347Points":1041,"reservoirWeeks":1390,"qualityRows":1543996,"qualityStations":144,"qualityParameters":724,"monitoringCantons":26,"monitoringCantonsWithNawa":25},"sources":[{"key":"q347","holder":"BAFU","datenstand":"2000-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.hydrologie-q347","links":[],"licence":"opendata.swiss, attribution"},{"key":"abstraction","holder":"BAFU and the cantons","datenstand":"2004-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-entnahme","links":[],"licence":"opendata.swiss, attribution"},{"key":"ara","holder":"BAFU and the cantons","datenstand":"2014-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.gewaesserschutz-klaeranlagen_anteilq347","links":[],"licence":"opendata.swiss, attribution"},{"key":"groundwater","holder":"BAFU","datenstand":"2017-01-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.grundwasserkoerper","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"wet_auen","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-auen","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_moorl","holder":"BAFU","datenstand":"2017-11-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-moorlandschaften","links":[],"licence":"opendata.swiss, attribution"},{"key":"rivers","holder":"HydroSHEDS / WWF, HydroRIVERS v1.0","datenstand":"2019-01-01","live":false,"url":"https://www.hydrosheds.org/products/hydrorivers","links":[],"licence":"Free for non-commercial and commercial use with attribution"},{"key":"npp","holder":"BFE","datenstand":"2019-12-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.kernkraftwerke","links":[],"licence":"opendata.swiss, attribution"},{"key":"context","holder":"Natural Earth 10m","datenstand":"2022-05-01","live":false,"url":"https://www.naturalearthdata.com/","links":[{"label":"10m lakes","url":"https://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-lakes/"},{"label":"10m countries","url":"https://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/"}],"licence":"Public domain"},{"key":"zones","holder":"the 26 cantons via geodienste.ch","datenstand":"2023-05-16","live":false,"url":"https://geodienste.ch/services/planerischer_gewaesserschutz","links":[],"licence":"per canton; all 26 currently publish this model freely"},{"key":"ice","holder":"GLAMOS","datenstand":"2023-09-01","live":false,"url":"https://doi.glamos.ch/","links":[{"label":"SGI1850","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1850_r1992.html"},{"label":"SGI1931","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1931_r2022.html"},{"label":"SGI1973","url":"https://doi.glamos.ch/data/inventory/inventory_sgi1973_r1976.html"},{"label":"SGI2010","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2010_r2010.html"},{"label":"SGI2016","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2016_r2020.html"},{"label":"SGI2023","url":"https://doi.glamos.ch/data/inventory/inventory_sgi2023_r2026.html"},{"label":"length change","url":"https://doi.glamos.ch/data/lengthchange/lengthchange_2025_r2025.html"}],"licence":"CC BY 4.0 per the DOI index; the length-change file header adds \"scientific and non-commercial use\". Both statements stand."},{"key":"dams","holder":"BFE","datenstand":"2023-11-28","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bfe.stauanlagen-bundesaufsicht","links":[],"licence":"opendata.swiss, attribution"},{"key":"catchments","holder":"BAFU","datenstand":"2024-06-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.wasser-teileinzugsgebiete_2","links":[],"licence":"FSDI general terms of use, free use with source attribution"},{"key":"quality","holder":"BAFU and the cantons","datenstand":"2024-12-31","live":false,"url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend","links":[{"label":"NAWA programme","url":"https://www.bafu.admin.ch/de/nawa"},{"label":"dataset and field definitions","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/dataproduct-water-nawa-trend"},{"label":"prepared annual files","url":"https://data.bafu.admin.ch/download?list-type=2&prefix=water/nawa-trend/"},{"label":"licence and source","url":"https://api.data-platform-stg.cloud.bafu.admin.ch/en/lizenz-und-quelle"}],"licence":"Open use. Must provide the source. Commercial and non-commercial use permitted with attribution."},{"key":"wet_hoch","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-hochmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"wet_flach","holder":"BAFU","datenstand":"2025-12-01","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-flachmoore","links":[],"licence":"opendata.swiss, attribution"},{"key":"hydro","holder":"BFE","datenstand":"2025-12-31","live":false,"url":"https://www.bfe.admin.ch/de/wasserkraft","links":[],"licence":"opendata.swiss, attribution"},{"key":"names","holder":"swisstopo, swissNAMES3D 2026","datenstand":"2026-03-09","live":false,"url":"https://data.geo.admin.ch/ch.swisstopo.swissnames3d/","links":[],"licence":"Open data, free use with source attribution"},{"key":"wet_amphi","holder":"BAFU","datenstand":"2026-05-20","live":false,"url":"https://map.geo.admin.ch/?layers=ch.bafu.bundesinventare-amphibien","links":[],"licence":"opendata.swiss, attribution"},{"key":"reservoirFill","holder":"BFE","datenstand":"2026-08-17","live":false,"url":"https://www.uvek-gis.admin.ch/BFE/ogd/17/ogd17_fuellungsgrad_speicherseen.csv","links":[],"licence":"opendata.swiss, attribution"},{"key":"gauges","holder":"BAFU","datenstand":null,"live":true,"url":"https://lindas.admin.ch/query","links":[{"label":"LINDAS observations","url":"https://lindas.admin.ch/query"},{"label":"hydrodaten station plots and units","url":"https://www.hydrodaten.admin.ch/"}],"licence":"Open government data, no key"},{"key":"basemap","holder":"swisstopo","datenstand":null,"live":false,"url":"https://docs.geo.admin.ch/visualize-data/wms.html","links":[],"licence":"FSDI general terms of use, free use with source attribution"}],"upstreamArchives":[],"generators":{".github/workflows/pages.yml":{"bytes":3319,"sha256":"db641bc9404c15c8ea4305ab9700998d4cd390d5d0dffa255c75979819c431bc"},"build/00-sources.sh":{"bytes":8872,"sha256":"8ec73140ecc00c2b7cb44f17115706cb0f3a520927c4c452b9c2858a90b37f28"},"build/01-stations.mjs":{"bytes":5719,"sha256":"4d81f143d263c84c05ef541b732d6e2dcee6aa60a59971b543faf04a77bc2a1e"},"build/02-network.mjs":{"bytes":3111,"sha256":"394b73f8e36e98d8d09bea66fcaf42883bfd7bfe228000341ba72444047975d8"},"build/03-context.mjs":{"bytes":1641,"sha256":"9061bfb755f87b78e3a52d0d080c19845f3cd131c173683131610613b0188038"},"build/04-glaciers.mjs":{"bytes":8309,"sha256":"b02d1e76ddfddb9ae2c2100c0f6d9d1c388afa23268ad29a052ec99080423320"},"build/05-users.mjs":{"bytes":11468,"sha256":"7a4bdf9fd2b521e19641b34cb74b4a3b720a569a88fd2b3f36570273b2dccb5c"},"build/06-reservoirs.mjs":{"bytes":12702,"sha256":"a6188f5c0c11a1a2822f4f9f9100750123442dde6a9d6ae1b983e3971fee9635"},"build/07-residual.mjs":{"bytes":13124,"sha256":"85991e1825ff9f027c0d9147616941ef4505c9dd25fa291826884650b135ff80"},"build/08-vintage.mjs":{"bytes":21960,"sha256":"10d0191fa478023043555fcd592ef6efcfdebcedd9941b431e65e7339d342fe3"},"build/09-icehistory.mjs":{"bytes":6719,"sha256":"24bd4e2d658b2169f0864aa4475e0d8b976462c1598051f43c4e266ef0ef2e57"},"build/10-names.mjs":{"bytes":16681,"sha256":"70313e9fad336e981fd14affd094e9dec2214d1d5dbf9facb1d408c28f31749b"},"build/11-cantons.mjs":{"bytes":3034,"sha256":"9f88c2f7b8bef1bc9901e17b1075a520ce4061984ebf9a672349d2d8659045b4"},"build/12-wetlands.mjs":{"bytes":13776,"sha256":"9703b964901932b5382212f207c0570c0a1033b3d3d6dbd7aabf70019a4195e5"},"build/13-basins.mjs":{"bytes":13142,"sha256":"c89b0a6797b4b824c62119b9ddbd6f260d29fac0041757d904acef81c34158fc"},"build/14-pages.py":{"bytes":15802,"sha256":"81ceecd1cce2150f86fcde46dcadd58cfbe147ef0f4b113a23f4b71b2e8f0b95"},"build/15-social-card.mjs":{"bytes":6144,"sha256":"51414e2510d58ea5af4373264efcbb937984443e826e5b5a71fbd067f44bc6c1"},"build/16-provenance.mjs":{"bytes":5320,"sha256":"08e31dc626be2c9809191bc7d0fd8b20d63446c41444788b9d26f46bc3026c07"},"build/17-quality.mjs":{"bytes":12969,"sha256":"80cdb035bb96541066904c02ef7f33bf60719d4550d51d49a3cd465d13effa7a"},"build/18-monitoring.mjs":{"bytes":7703,"sha256":"8c4bb64641562a77fb6dd22940b4c607e2f1da245ac453cb09c283ecefc24550"},"build/lib-stations.mjs":{"bytes":1501,"sha256":"17d8c00b36f96fba383b430f8f22d37c83e7c5f895fa9f99823dd0ead087b3f5"},"build/pages/de.json":{"bytes":155594,"sha256":"662f1344c6991313e33d9b6a73ea166681e300d5ccf35de9f9672bd151913ce2"},"build/pages/fr.json":{"bytes":159142,"sha256":"cf4d1a4ed1cd09c18c0346b58654b192180f8932105379943a1883186f18b0c5"},"build/pages/index.en.html":{"bytes":28909,"sha256":"56bf69c9d85d19427d009f96d1e7a426370f98ec4250dc990263288741079c54"},"build/pages/it.json":{"bytes":154686,"sha256":"6bbfbbec18f06c0536bf4cbd3d668d856b04fa3f84917567e6887acf81fc9fd2"},"build/pages/rm.json":{"bytes":157695,"sha256":"33b229bacffbee7c5c8f788bcec8023c3ebf7bda5b3187a90e974140e9c2fe7f"},"build/pages/updates.json":{"bytes":258015,"sha256":"18e5a6fe6f779ef4000e5c6f7f00ce47f04d274eed4987865fcc23724649836d"},"package-lock.json":{"bytes":63777,"sha256":"c3c32ff1af7525028f4c955f9aadba58f0a252692b04f3ee54958ebcbf268e50"},"package.json":{"bytes":1070,"sha256":"53caf42b0f271b8567a224f37d229fb516257d30cfe536661cc96433f8d75bfe"},"scripts/check-external-links.mjs":{"bytes":2337,"sha256":"0d23a491568eec07b7830c5598f7ae6478e376e82ded972dade923ccf8d70352"},"scripts/check-performance-budget.mjs":{"bytes":3003,"sha256":"5217493c384f55470b32c94a15e359742a1aecb6371b87bbf9e469e553101cfd"},"scripts/verify-site.mjs":{"bytes":42919,"sha256":"45cd772857029165e29a3c29b350a5e5952df6525fa5e128ddf28b9273cf5b73"}},"artifacts":{"about.html":{"bytes":23427,"sha256":"c9cdbf33863172bf8a6ce3954ed12cd618bca5e85cb815b76230792dc720dba2"},"app.js":{"bytes":178811,"sha256":"97ab7b8677bc8b50ad946180ac0eeae9efb953a8d3066ca5ada102107cbac185"},"data/basins.json":{"bytes":3488,"sha256":"9fc9f8a3f55a42580dafac22eedf9f1090ee6b31873110719bde121ff968c537"},"data/canton-monitoring.json":{"bytes":6601,"sha256":"5a0723e5a87ba9643591c466d653604e0418c364ed4487791c84e26afdbdbb69"},"data/cantons.json":{"bytes":3625,"sha256":"31d0e54c707c1cb511b22dfb263a3edaeeb81f098f5643dab3828e945f8e5b69"},"data/context.json":{"bytes":23094,"sha256":"274f0a40245933156cb8daa994f1e9188fbe6f99db0be2e3cea80925f2368007"},"data/glaciers.json":{"bytes":1115131,"sha256":"2ab15ef0c109995bd740902856eb6b3c6d12f82899d2af39e893e28e5b0dc35f"},"data/icehistory.json":{"bytes":625151,"sha256":"9ceb75bab89879565bfd13e2d7614f0bd25c6a63d92733cd27f841931e63e5ab"},"data/names.json":{"bytes":365854,"sha256":"97c91c4a7b74685ab81752617c2db1399408ece0d3f0e11683f621711dcf2192"},"data/network.json":{"bytes":1105368,"sha256":"4b04980eb3a2f4385d783af8da41eb15bcc28ad2e5f22f94d6c3ced7938ba12c"},"data/quality.json":{"bytes":4624338,"sha256":"47cfd9b0e50d22baa268280250401d3af2bc2e70af08455a053addde2ee94084"},"data/reservoirs.json":{"bytes":110597,"sha256":"26de75b0047008cdd94c563c78f67eb737f4f450763ef11cab3c140a48320bef"},"data/residual.json":{"bytes":235789,"sha256":"614e5f00f726148d30a23b5debe508561ae0163ce60002ef3723b48f9aece406"},"data/social-card.json":{"bytes":184,"sha256":"ce6711de7c2883ace6daf796e4044124b104c1392d553374af08a178b1782172"},"data/stations.json":{"bytes":41444,"sha256":"9f55491b1b1aa992a79e2568bcb3363e6daf02cc9f121e8a82afdc8d005f53c8"},"data/users.json":{"bytes":346478,"sha256":"1399cdf3eabed26a519f609db326cecdb99ea4a9146aa640630fbd45d2c7f4bf"},"data/vintage.json":{"bytes":13903,"sha256":"c98fcc5bf4a509aba37cc804945bbc931ad843e3913ccaf24aebd01c45a83db0"},"data/wetlands.json":{"bytes":1081150,"sha256":"eee2b59945140fea80178edae6b5bfe973f2a52475c72d0bf268d4a7809170cb"},"de/about.html":{"bytes":24620,"sha256":"372507f5ef64267f723483d26e0050fec4f67529c598275aa0809282277284f6"},"de/index.html":{"bytes":29973,"sha256":"e95da0048d649c76f8b481545b74fc474f2698e23d1b7871d6edc303c333f409"},"de/law.html":{"bytes":29481,"sha256":"bded7ab11a750a94a6ee3e73256c71b1302464107375f607bdfa0e49672cca05"},"de/method.html":{"bytes":47288,"sha256":"116f2f1db59ebb7e7efaddf64cdb990e6e0289eb2464603e255958663328afd7"},"de/sources.html":{"bytes":13193,"sha256":"cdfe2baeaf397d7a9632615b6247294bf6d18721395b8e3cf0da8bd1d7c089d7"},"en/index.html":{"bytes":29028,"sha256":"0389597dcd1cd80d3455db973d05874df2972a1a91983c1a7efca5c7c1a79fef"},"favicon.svg":{"bytes":598,"sha256":"ffb7394f49c0ac90daa0203d9ce45bfafbf7d3d9cac1f0fdafc561f797f9195f"},"fmt.js":{"bytes":2388,"sha256":"eb50d45ea49aa0b8ef4d434d6dce3ece9537965a44948b350ce8b99b1c03cb66"},"fonts.css":{"bytes":4631,"sha256":"a919c516ef820d854333516658188efaa463cb5535277a12a14c5afd9e2d3be8"},"fonts/OFL-Archivo.txt":{"bytes":4387,"sha256":"1778201b7bd33e8c08a2eda32a4ad2f69bc38ced9731b01cc3fc47f268c8ef3c"},"fonts/OFL-IBM-Plex-Mono.txt":{"bytes":4362,"sha256":"d741e57d5f865e294df801f96b7b5161a88b211df65887e4358d271c9fc5fb4f"},"fonts/OFL-Source-Serif-4.txt":{"bytes":4399,"sha256":"0fd8b796c1c6220a559a5682cfd00d1c8488b428369f7cb70deb671888cef85f"},"fonts/archivo-italic-latin-ext.woff2":{"bytes":35208,"sha256":"71d5c4e5da1cc99cf78fe92f2fb9880dfc03dfef7122b0d1ed1d56f25452e824"},"fonts/archivo-italic-latin.woff2":{"bytes":39132,"sha256":"e1989a5727374fcd299979407c8087669ca223f5281f8645891e5400f3e61aeb"},"fonts/archivo-normal-latin-ext.woff2":{"bytes":32672,"sha256":"a999e009fdcd0f939c138e04043b3b2ad083b26252b644e8f94c083d48b77af0"},"fonts/archivo-normal-latin.woff2":{"bytes":34940,"sha256":"7150c0ec5ad356453013d11affec1fbab95de0dd2dcecb043b4f1cb7f87c4ba4"},"fonts/ibm-plex-mono-400-latin-ext.woff2":{"bytes":8860,"sha256":"f1050dc5317b43434c0aeda599d4624c774ffc162e87a8cf204b949b6a85816d"},"fonts/ibm-plex-mono-400-latin.woff2":{"bytes":10052,"sha256":"c36f509c0a8f9f85f29cb44bc8701d8a9e0b14c499e77a884f789ead7093a7ac"},"fonts/ibm-plex-mono-500-latin-ext.woff2":{"bytes":8848,"sha256":"77f03e26f981c582bdba3a7abed4baa2d3149211c01366bb3ab3ba7622ec4ae5"},"fonts/ibm-plex-mono-500-latin.woff2":{"bytes":10060,"sha256":"a76f53ca6612e7b3828eec2311098675b7f9849ae4169a8bcef6302aec02a6c0"},"fonts/source-serif-italic-latin-ext.woff2":{"bytes":43964,"sha256":"3eff7682cb08de3fbd2f411e05dc3f68fbd3ce721ec554ffafa7b0397214e76f"},"fonts/source-serif-italic-latin.woff2":{"bytes":50584,"sha256":"419703e180143eb9033e02651331fcf3cc8558d42f1041140a0b24e5be0933bb"},"fonts/source-serif-normal-latin-ext.woff2":{"bytes":100772,"sha256":"a0cd390d017200f91327781204458ff918999584bece8902497ba6c08472178d"},"fonts/source-serif-normal-latin.woff2":{"bytes":122168,"sha256":"2a24bad466f09b88b8e9cbc488bf774117c912e66374c57bf4716855849143f8"},"fr/about.html":{"bytes":24923,"sha256":"ac47a6d084732808b54eda1b5f3b916b8055197cba9c44e4c8124b2f00986d19"},"fr/index.html":{"bytes":30750,"sha256":"dc0db5057565bbccec3bbe303d90924060107c21de27dbc211fba96db965e4a1"},"fr/law.html":{"bytes":30904,"sha256":"0d98194a8d1a713aac792b78ed703a5475564f6d90951bebcb08e99d70a53fad"},"fr/method.html":{"bytes":48880,"sha256":"36420c14e14c829821df1cea9a905e401f0078ea4e87a1813aa4818493b62623"},"fr/sources.html":{"bytes":13503,"sha256":"9af06471f88ca99963010b8ec4b966fb9a07c8ab65ab274332aa94c00ac7bae8"},"gschg31.js":{"bytes":1894,"sha256":"bf4673598fd6936aec1a2eeb2e692b24ea984fb728146324dcf8586f183a9c08"},"i18n-data.js":{"bytes":59884,"sha256":"e416f44065e452e52f810fc76c3df633853c6ae8604517d79d6b61453789f129"},"i18n-map.js":{"bytes":137697,"sha256":"264eef4fe58af15364a4461e11789b6b64dbb1b1e6145d07f2283da8747eb464"},"i18n.js":{"bytes":38264,"sha256":"260d45c429e32b77efffbeb1fb84f2fad55de31654e8df2a36e8b2ec6fb828c5"},"index.html":{"bytes":29988,"sha256":"e33b8eb060d0f6ed1345500997ebcf65bdd5c3a4a319a841f0fce657dff81c94"},"it/about.html":{"bytes":24042,"sha256":"9ba8bcf6f6356ea56cabd09125a3beb0688b50331f716cd94f9531c8d1606b3a"},"it/index.html":{"bytes":30137,"sha256":"768610b811666947a16c84ea0e296153d99398dc78a483181f3b8d51166c35d9"},"it/law.html":{"bytes":29853,"sha256":"09a959830d532da47f5cea0c00d9eb1e38e5e5c2eeccbaf812f5ade159f08495"},"it/method.html":{"bytes":46646,"sha256":"ba0365bb655e8df2d7b7f60eeca5f435f661473bff444deec147d55d3b2ff3f0"},"it/sources.html":{"bytes":13047,"sha256":"fad144aecd3287538bfc8eb6d6cc4c6ddd2abbaa41fb3ccdbf16bffa9bfe6919"},"law.html":{"bytes":28203,"sha256":"598750873da8ccd057b548ce24bc5e9672f1b66f36639493b071ada1da185cd6"},"legal-alerts.js":{"bytes":2495,"sha256":"98f782af37d89a363f19c6e3a9abf7b9bc5226efcb891751f20adad7614f308e"},"method.html":{"bytes":45355,"sha256":"f4974a62358a9918a2742be8c5528274877ce655821db7d905fd72cad2e7824d"},"og-image.jpg":{"bytes":200325,"sha256":"f6a6cbd88798900d3b584b1e966c764506ddd85e88328d77e17cf77cf89f5144"},"rm/about.html":{"bytes":24338,"sha256":"89115acfa934e73afe239ac00e60cade069efbaacd28ce5c4b4cd7e9d0dfb800"},"rm/index.html":{"bytes":30492,"sha256":"dc66b228ed23e5f214ea3473c78e2a7aff29c7e1ea2634de56eb501904c101f9"},"rm/law.html":{"bytes":30438,"sha256":"65fb4b599cf0f406718ae4416bc195d81d439887b30b2f89f95bb87a1ed97e39"},"rm/method.html":{"bytes":47987,"sha256":"88801d72275dc950d38a7c3882288f939932f9a906d684341757e07974e8de3a"},"rm/sources.html":{"bytes":13574,"sha256":"4662b473b82ba86eddaffa07036f1a42945437017d25ab8859a8f4a520bf04f4"},"robots.txt":{"bytes":80,"sha256":"f8de6fa3cc79f4c7b56023e2618742b16dabde01c2d950dc0a48f71309ed9018"},"site.css":{"bytes":25213,"sha256":"46432b270e3187a66f0517ab77df107c4ff6a4f8012871aa4fedf2fabd7ff289"},"site.js":{"bytes":25768,"sha256":"caa0b3b41eb1027aca3f6ffbf3aa56b2e09ad96c32aac89268902cc298645875"},"sitemap.xml":{"bytes":18506,"sha256":"862dd487e520d4006c55150f2e4c7c42c7a93366f3fc01b8dfb27f68fe2b94a6"},"sources.html":{"bytes":12739,"sha256":"216652d9550aa70d9fbfd67869324298b08ec28c12ee2c03cc58c1ff196b01ff"},"style.css":{"bytes":75714,"sha256":"0f934fcdd39ed7546dc18fba486217a3698dcb441bed28fb2452d4614c02ad69"},"theme.js":{"bytes":3354,"sha256":"a1811f92d1d08cc87cb3c8f41515a9f0868bdad44782150bd41074af1df06b3a"},"tokens.css":{"bytes":16169,"sha256":"a09dd19c74aa879f8211196eed3ed19b97c6a576985253b4c468e9b52b5b4f7a"}}} \ No newline at end of file diff --git a/site/de/index.html b/site/de/index.html index 732b0e3..df31c8a 100644 --- a/site/de/index.html +++ b/site/de/index.html @@ -33,10 +33,10 @@ - + - + @@ -407,6 +407,6 @@

Dem Wasser folgen. Seine Wege schützen.

- + diff --git a/site/en/index.html b/site/en/index.html index 1f8c2ba..45beeed 100644 --- a/site/en/index.html +++ b/site/en/index.html @@ -33,10 +33,10 @@ - + - + @@ -466,6 +466,6 @@

Follow the water. Protect its pathways.

- + diff --git a/site/fr/index.html b/site/fr/index.html index 34112d8..7062a1c 100644 --- a/site/fr/index.html +++ b/site/fr/index.html @@ -33,10 +33,10 @@ - + - + @@ -407,6 +407,6 @@

Suivre l’eau. Protéger ses voies.

- + diff --git a/site/i18n-map.js b/site/i18n-map.js index 795ada1..0ee945e 100644 --- a/site/i18n-map.js +++ b/site/i18n-map.js @@ -28,6 +28,18 @@ Object.assign(STR, { it: 'Ingrandire con i pulsanti della carta, la rotellina o il gesto a due dita. Trascinare o usare i tasti freccia per spostarsi. Home ripristina la vista e Invio apre l’oggetto più vicino al centro.', rm: 'Zoomar cun ils buttuns da la charta, cun la roda da la mieur u cun dus dets. Trer u duvrar las tastas cun frizzas per spustar. Home restabilescha la vista ed Enter avra l’object il pli datiers dal center.', }, + 'm.readEvidence': { + en: 'Read', de: 'Lesen', fr: 'Lire', it: 'Leggi', rm: 'Leger', + }, + 'm.readEvidenceAria': { + en: 'Read the evidence full screen', de: 'Evidenz im Vollbild lesen', fr: 'Lire les éléments de preuve en plein écran', it: 'Leggi le evidenze a schermo intero', rm: 'Leger las cumprovas sin l’entir visur', + }, + 'm.backToMap': { + en: 'Map', de: 'Karte', fr: 'Carte', it: 'Carta', rm: 'Charta', + }, + 'm.backToMapAria': { + en: 'Back to map', de: 'Zurück zur Karte', fr: 'Retour à la carte', it: 'Torna alla carta', rm: 'Enavos a la charta', + }, // ---- the layers that can fail to arrive ---- 'm.failBase': { diff --git a/site/index.html b/site/index.html index 66007ca..10e3adb 100644 --- a/site/index.html +++ b/site/index.html @@ -33,10 +33,10 @@ - + - + @@ -407,6 +407,6 @@

Dem Wasser folgen. Seine Wege schützen.

- + diff --git a/site/it/index.html b/site/it/index.html index da74b98..375fb12 100644 --- a/site/it/index.html +++ b/site/it/index.html @@ -33,10 +33,10 @@ - + - + @@ -407,6 +407,6 @@

Seguire l’acqua. Proteggere i suoi percorsi.

- + diff --git a/site/rm/index.html b/site/rm/index.html index 22c8ec5..9cf76d7 100644 --- a/site/rm/index.html +++ b/site/rm/index.html @@ -33,10 +33,10 @@ - + - + @@ -407,6 +407,6 @@

Suandar l’aua. Proteger sias vias.

- + diff --git a/site/style.css b/site/style.css index 5e9b86c..8278a03 100644 --- a/site/style.css +++ b/site/style.css @@ -1027,7 +1027,7 @@ body.hasRibbon #credits { display: none; } portrait phone or tablet. Nothing in this workspace obscures geography. ============================================================ */ :root { - --workspace-w: clamp(340px, 28vw, 440px); + --workspace-w: clamp(380px, 31vw, 480px); --workspace-h: 52dvh; } @@ -1064,6 +1064,13 @@ body.hasRibbon #credits { display: none; } display: grid; place-items: center; min-width: 28px; min-height: 38px; padding: 0 2px; } #workspaceHead .themeBtn { width: 38px; height: 38px; margin-left: 5px; } +#workspaceBack { + display: inline-flex; align-items: center; min-height: 38px; margin-right: auto; + padding: 5px 8px; color: var(--ink); background: transparent; + border: 0; border-radius: 5px; font: 650 13px/1.2 var(--sans); cursor: pointer; +} +#workspaceBack:hover { background: color-mix(in srgb, var(--ink) 7%, transparent); } +#workspaceBack[hidden] { display: none; } #workspaceHead #siteNav { display: flex; flex-wrap: nowrap; align-items: center; gap: 0; margin: 0; padding: 2px calc(8px + var(--safe-r)) 7px calc(8px + var(--safe-l)); @@ -1083,12 +1090,12 @@ body.hasRibbon #credits { display: none; } flex: 1 1 auto; min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; scrollbar-width: thin; - scrollbar-color: color-mix(in srgb, var(--ink-muted) 58%, transparent) transparent; + scrollbar-color: color-mix(in srgb, var(--ink-muted) 82%, transparent) transparent; } -#workspaceScroll::-webkit-scrollbar { width: 7px; } +#workspaceScroll::-webkit-scrollbar { width: 11px; } #workspaceScroll::-webkit-scrollbar-thumb { - background: color-mix(in srgb, var(--ink-muted) 48%, transparent); - border: 2px solid transparent; border-radius: 8px; background-clip: padding-box; + background: color-mix(in srgb, var(--ink-muted) 72%, transparent); + border: 3px solid transparent; border-radius: 10px; background-clip: padding-box; } #workspaceScroll:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; @@ -1186,6 +1193,7 @@ body.hasRibbon #credits { display: none; } } #workspace .zoomGroup, #workspace #zoomFit, +#workspace #workspaceRead, #workspace #dataViewOpen { background: transparent; backdrop-filter: none; border: 1px solid var(--control-border); border-radius: 6px; box-shadow: none; @@ -1193,12 +1201,15 @@ body.hasRibbon #credits { display: none; } #workspace .zoomGroup { display: flex; } #workspace .zoomGroup button, #workspace #zoomFit, +#workspace #workspaceRead, #workspace #dataViewOpen { min-width: 44px; min-height: 44px; } #workspace #zoomLevel { min-width: 44px; min-height: 44px; border-block: 0; border-inline: 1px solid var(--rule); } #workspace #dataViewOpen { margin-left: auto; padding-inline: 10px; } +#workspace #workspaceRead { margin-left: auto; padding-inline: 10px; } +#workspace #workspaceRead + #dataViewOpen { margin-left: 0; } /* A flat status row on the evidence surface—not another card over the map. The compact line is always visible; the legal basis and station list open in the @@ -1244,13 +1255,12 @@ body.hasRibbon #credits { display: none; } } #workspace #liveAlerts[data-state="alert"] #liveAlertsSummary { color: var(--critical); font-weight: 650; } #workspace #liveAlertsBody { - max-height: clamp(100px, 18dvh, 180px); padding: 12px 16px 14px; overflow-y: auto; + max-height: none; padding: 14px 18px 17px; overflow-y: visible; color: var(--ink-2); border-top: 1px solid var(--rule); - scrollbar-gutter: stable; } #workspace #liveAlertsBody[hidden] { display: none; } #workspace .liveAlertScope, -#workspace .liveAlertLimit { margin: 0; font-size: 11.5px; line-height: 1.48; } +#workspace .liveAlertLimit { margin: 0; font-size: 13px; line-height: 1.55; } #workspace .liveAlertLimit { margin-top: 11px; color: var(--ink-muted); } #workspace #liveAlertsList { margin: 10px 0 0; padding: 0; list-style: none; } #workspace #liveAlertsList:empty { display: none; } @@ -1265,8 +1275,8 @@ body.hasRibbon #credits { display: none; } #workspace #liveAlertsList button:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; } #workspace #liveAlertsList strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; } #workspace .liveAlertValue { color: var(--critical); font: 11px/1.35 var(--mono); white-space: nowrap; } -#workspace .liveAlertReason { grid-column: 1 / -1; color: var(--ink-muted); font-size: 10.5px; line-height: 1.35; } -#workspace .liveAlertLinks { display: flex; flex-wrap: wrap; gap: 6px 14px; margin: 12px 0 0; font-size: 11.5px; } +#workspace .liveAlertReason { grid-column: 1 / -1; color: var(--ink-muted); font-size: 12px; line-height: 1.4; } +#workspace .liveAlertLinks { display: flex; flex-wrap: wrap; gap: 8px 16px; margin: 14px 0 0; font-size: 13px; } #workspace .liveAlertLinks a { color: var(--law); text-underline-offset: 3px; } #workspace #tooltip { @@ -1288,7 +1298,7 @@ body.hasRibbon #credits { display: none; } #workspace #legend h2 { display: block; font-size: 12px; } #workspace #legendBody { padding: 0; overflow: visible; } #workspace #legendBody .notes, -#workspace #legendBody .lgNote { line-height: 1.5; } +#workspace #legendBody .lgNote { font-size: 13px; line-height: 1.55; } #workspace #credits { position: static; display: block; max-width: none; @@ -1297,6 +1307,7 @@ body.hasRibbon #credits { display: none; } color: var(--ink-muted); background: transparent; border-top: 1px solid var(--rule); border-radius: 0; } +#workspace #credits { font-size: 12.5px; line-height: 1.55; } body.hasRibbon #workspace #credits { display: block; } #workspace #ribbon { @@ -1309,13 +1320,30 @@ body.hasRibbon #workspace #credits { display: block; } #workspace #ribbonCv { height: 64px; } #workspace #panel { - position: absolute; inset: auto 0 0 0; z-index: 12; - width: auto; max-height: min(76%, 660px); - padding: 18px 18px calc(18px + var(--safe-b)); - overflow-y: auto; background: var(--surface-1); backdrop-filter: none; + position: absolute; inset: var(--workspace-head-h, 99px) 0 0; z-index: 12; + width: auto; max-height: none; + padding: 22px 22px calc(24px + var(--safe-b)); + overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; + background: var(--surface-1); backdrop-filter: none; border: 0; border-top: 1px solid var(--control-border); border-radius: 0; - box-shadow: 0 -16px 34px rgba(0,0,0,.22); -} + box-shadow: none; +} +#workspace #panelClose { + position: sticky; top: 0; z-index: 2; display: grid; place-items: center; + margin: -10px -10px -34px auto; + color: var(--ink-2); background: color-mix(in srgb, var(--surface-1) 94%, transparent); + border: 1px solid var(--control-border); border-radius: 50%; +} +#workspace #panel h2 { font-size: 18px; line-height: 1.3; } +#workspace #panel dt { font-size: 13px; line-height: 1.4; } +#workspace #panel dd { font-size: 13.5px; line-height: 1.4; } +#workspace .panelNote, +#workspace .aside, +#workspace .flag, +#workspace .statute { font-size: 13px; line-height: 1.55; } +#workspace .qualitySamples time, +#workspace .qualitySamples small, +#workspace .qualityApi { font-size: 12px; line-height: 1.45; } #workspace #intro { position: absolute; inset: 0; z-index: 15; @@ -1342,6 +1370,7 @@ body.hasRibbon #workspace #credits { display: block; } /* A portrait phone or tablet uses the same two surfaces, stacked. The map keeps the upper viewport and the workspace scrolls independently below it. */ @media (max-width: 900px) and (orientation: portrait) { + body:is(.readingLegal, .readingDetail, .readingBrief) { --workspace-h: 72dvh; } #workspace { inset: auto 0 0; width: auto; height: var(--workspace-h); border-right: 0; border-top: 1px solid var(--control-border); @@ -1388,17 +1417,18 @@ body.hasRibbon #workspace #credits { display: block; } #workspace #liveAlertsToggle { min-height: 44px; padding: 6px 11px; } #workspace .liveAlertHeading { font-size: 9px; } #workspace #liveAlertsSummary { font-size: 10.5px; } - #workspace #liveAlertsBody { max-height: min(150px, 18dvh); padding: 10px 12px 12px; } + #workspace #liveAlertsBody { padding: 12px 14px 15px; } #workspace .zoomGroup button, #workspace #zoomLevel, #workspace #zoomFit, + #workspace #workspaceRead, #workspace #dataViewOpen { min-height: 44px; } #workspace #legend { padding: 11px 13px calc(13px + var(--safe-b)); } #workspace #legendBody .notes, - #workspace #legendBody .lgNote { font-size: 12.5px; } + #workspace #legendBody .lgNote { font-size: 13px; } #workspace #ribbon { max-height: min(190px, 32dvh); } #workspace #ribbonCv { height: 54px; } - #workspace #panel { max-height: 100%; } + #workspace #panel { padding: 18px 16px calc(20px + var(--safe-b)); } #workspace #intro { padding: 20px 18px calc(20px + var(--safe-b)); } #workspace #introTitle { font-size: clamp(31px, 9vw, 43px); } #workspace .introLangs [lang] { min-width: 40px; min-height: 44px; } @@ -1409,7 +1439,6 @@ body.hasRibbon #workspace #credits { display: block; } #workspace #titlebar .stamp { font-size: 9.5px; line-height: 1.25; letter-spacing: -.01em; } - #workspace #liveAlertsBody { max-height: 70px; } } @media (max-width: 360px) { #workspaceHead #siteNav { gap: 0; padding-inline: 4px; } @@ -1449,10 +1478,11 @@ body.hasRibbon #workspace #credits { display: block; } #workspace #liveAlertsToggle { min-height: 44px; padding: 6px 10px; } #workspace .liveAlertHeading { font-size: 9px; } #workspace #liveAlertsSummary { font-size: 10px; } - #workspace #liveAlertsBody { max-height: min(150px, 18dvh); padding: 9px 11px 11px; } + #workspace #liveAlertsBody { padding: 11px 13px 14px; } #workspace .zoomGroup button, #workspace #zoomLevel, #workspace #zoomFit, + #workspace #workspaceRead, #workspace #dataViewOpen { min-height: 44px; } #workspace #legend { padding: 10px 12px 12px; } #workspace #ribbon { max-height: 58%; } @@ -1460,3 +1490,42 @@ body.hasRibbon #workspace #credits { display: block; } #workspace #introTitle { font-size: 32px; } #workspace .cycleViz svg { max-height: 110px; } } + +/* Reading mode is a deliberate change of task, not a larger floating box. The + map gives the whole viewport to evidence and leaves one persistent way back. + Main evidence keeps a book-like measure; selected-feature and project text use + the same measure even though they sit above the scroller. */ +body.workspaceReading #workspace { + inset: 0; z-index: 40; width: 100vw; height: 100dvh; + border: 0; box-shadow: none; +} +body.workspaceReading #map, +body.workspaceReading #flow { visibility: hidden; } +body.workspaceReading .workspaceBrand { display: none; } +body.workspaceReading #workspaceRead { display: none; } +body.workspaceReading #dataViewOpen { margin-left: auto; } +body.workspaceReading #workspaceScroll > #titlebar, +body.workspaceReading #workspaceScroll > #modeRail, +body.workspaceReading #workspaceScroll > #mapControls, +body.workspaceReading #workspaceScroll > #liveAlerts, +body.workspaceReading #workspaceScroll > #tooltip, +body.workspaceReading #workspaceScroll > #legend, +body.workspaceReading #workspaceScroll > #ribbon { + box-sizing: border-box; width: min(760px, 100%); margin-right: auto; margin-left: auto; +} +body.workspaceReading #workspace #panel { + inset: var(--workspace-head-h, 99px) 0 0; + padding-right: max(22px, calc((100vw - 760px) / 2)); + padding-left: max(22px, calc((100vw - 760px) / 2)); +} +body.workspaceReading #workspace #intro { + inset: var(--workspace-head-h, 99px) 0 0; height: auto; + padding-right: max(24px, calc((100vw - 760px) / 2)); + padding-left: max(24px, calc((100vw - 760px) / 2)); +} +@media (max-width: 520px) { + body.workspaceReading #workspace #panel, + body.workspaceReading #workspace #intro { padding-right: 18px; padding-left: 18px; } + body.workspaceReading #workspace #titlebar, + body.workspaceReading #workspace #legend { padding-right: 16px; padding-left: 16px; } +}