Add an info control that credits the app and links the DTK25 sources.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-09 14:50:50 +02:00
co-authored by Cursor
parent 1a865330fe
commit 426a86d0dd
7 changed files with 88 additions and 56 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="theme-color" content="#1e3328" /> <meta name="theme-color" content="#1e3328" />
<title>Karte</title> <title>Karte</title>
<script type="module" crossorigin src="/assets/index-DjxrnCdH.js"></script> <script type="module" crossorigin src="/assets/index-BRvZR5R_.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BIwdVEBe.css"> <link rel="stylesheet" crossorigin href="/assets/index-BfT1SDCl.css">
<link rel="manifest" href="/manifest.webmanifest"></head> <link rel="manifest" href="/manifest.webmanifest"></head>
<body> <body>
<div id="app"></div> <div id="app"></div>
+1 -1
View File
@@ -1 +1 @@
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()}).then(()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(s,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(i[o])return;let t={};const c=e=>n(e,o),l={module:{uri:o},exports:t,require:c};i[o]=Promise.all(s.map(e=>l[e]||c(e))).then(e=>(r(...e),t))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"c7a61eb7e4c6389e27e974a5f79dc66e"},{url:"assets/workbox-window.prod.es5-Bd17z0YL.js",revision:null},{url:"assets/index-DjxrnCdH.js",revision:null},{url:"assets/index-BIwdVEBe.css",revision:null},{url:"icon-192.png",revision:"b9806dfbc0396e0ce5c1934273075639"},{url:"icon-512.png",revision:"847487db4af2d4a5e51e9b3e1fdcb649"},{url:"uebersicht.json",revision:"04c71c9ace32f1fbd7eaf16a9b5c8512"},{url:"manifest.webmanifest",revision:"2a757cea886716141758fc7b936d45c2"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))}); if(!self.define){let e,i={};const s=(s,n)=>(s=new URL(s+".js",n).href,i[s]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()}).then(()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e}));self.define=(n,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(i[o])return;let t={};const c=e=>s(e,o),l={module:{uri:o},exports:t,require:c};i[o]=Promise.all(n.map(e=>l[e]||c(e))).then(e=>(r(...e),t))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"70dde2d51ee41730c4cb9750452d07a3"},{url:"assets/workbox-window.prod.es5-Bd17z0YL.js",revision:null},{url:"assets/index-BfT1SDCl.css",revision:null},{url:"assets/index-BRvZR5R_.js",revision:null},{url:"icon-192.png",revision:"b9806dfbc0396e0ce5c1934273075639"},{url:"icon-512.png",revision:"847487db4af2d4a5e51e9b3e1fdcb649"},{url:"uebersicht.json",revision:"04c71c9ace32f1fbd7eaf16a9b5c8512"},{url:"manifest.webmanifest",revision:"2a757cea886716141758fc7b936d45c2"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});
+8
View File
@@ -136,6 +136,14 @@ button.icon-button[aria-expanded="true"] .strike {
gap: 8px; gap: 8px;
} }
.info p {
margin: 0;
}
.info a {
color: #1d4e89;
}
h1 { h1 {
margin: 0; margin: 0;
font-size: 20px; font-size: 20px;
+18
View File
@@ -19,6 +19,7 @@ export function mountScreen(
<div class="head-actions"> <div class="head-actions">
<button type="button" class="secondary icon-button fold-toggle" aria-expanded="false" aria-controls="ziele" aria-label="Ziele" title="Ziele">${flagIcon}${strikeIcon}</button> <button type="button" class="secondary icon-button fold-toggle" aria-expanded="false" aria-controls="ziele" aria-label="Ziele" title="Ziele">${flagIcon}${strikeIcon}</button>
<button type="button" class="secondary icon-button einstellungen-toggle" aria-expanded="false" aria-controls="einstellungen" aria-label="Einstellungen" title="Einstellungen">${gearIcon}${strikeIcon}</button> <button type="button" class="secondary icon-button einstellungen-toggle" aria-expanded="false" aria-controls="einstellungen" aria-label="Einstellungen" title="Einstellungen">${gearIcon}${strikeIcon}</button>
<button type="button" class="secondary icon-button info-toggle" aria-expanded="false" aria-controls="info" aria-label="Info" title="Info">${infoIcon}${strikeIcon}</button>
</div> </div>
</div> </div>
<div id="ziele" class="fold" hidden> <div id="ziele" class="fold" hidden>
@@ -43,6 +44,11 @@ export function mountScreen(
</div> </div>
<button type="button" class="secondary wipe">Ganzen Cache löschen</button> <button type="button" class="secondary wipe">Ganzen Cache löschen</button>
</div> </div>
<div id="info" class="fold info" hidden>
<p><a href="https://gitea.neitzel.de/konrad/karten" target="_blank" rel="noopener noreferrer">Karten</a> © 2026 <a href="mailto:konrad@neitzel.de" target="_blank" rel="noopener noreferrer">Konrad Neitzel</a></p>
<p>Karten: <a href="https://hvbg.hessen.de/landesvermessung/geotopographie/karten/dtk25" target="_blank" rel="noopener noreferrer">DTK25 Karten von Hessen</a></p>
<p><a href="https://hvbg.hessen.de/geoinformation/open-data" target="_blank" rel="noopener noreferrer">Open Data Hinweis der Karten</a></p>
</div>
<p class="notice" role="status" hidden></p> <p class="notice" role="status" hidden></p>
`; `;
@@ -62,6 +68,8 @@ export function mountScreen(
const foldToggle = panel.querySelector<HTMLButtonElement>(".fold-toggle"); const foldToggle = panel.querySelector<HTMLButtonElement>(".fold-toggle");
const einstellungenFold = panel.querySelector<HTMLElement>("#einstellungen"); const einstellungenFold = panel.querySelector<HTMLElement>("#einstellungen");
const einstellungenToggle = panel.querySelector<HTMLButtonElement>(".einstellungen-toggle"); const einstellungenToggle = panel.querySelector<HTMLButtonElement>(".einstellungen-toggle");
const infoFold = panel.querySelector<HTMLElement>("#info");
const infoToggle = panel.querySelector<HTMLButtonElement>(".info-toggle");
const form = panel.querySelector("form"); const form = panel.querySelector("form");
const gitter = panel.querySelector<HTMLInputElement>('input[name="gitter"]'); const gitter = panel.querySelector<HTMLInputElement>('input[name="gitter"]');
const rechtswert = panel.querySelector<HTMLInputElement>('input[name="rechtswert"]'); const rechtswert = panel.querySelector<HTMLInputElement>('input[name="rechtswert"]');
@@ -84,6 +92,8 @@ export function mountScreen(
!foldToggle || !foldToggle ||
!einstellungenFold || !einstellungenFold ||
!einstellungenToggle || !einstellungenToggle ||
!infoFold ||
!infoToggle ||
!form || !form ||
!gitter || !gitter ||
!rechtswert || !rechtswert ||
@@ -141,6 +151,12 @@ export function mountScreen(
einstellungenToggle.setAttribute("aria-expanded", open ? "true" : "false"); einstellungenToggle.setAttribute("aria-expanded", open ? "true" : "false");
}); });
infoToggle.addEventListener("click", () => {
const open = infoFold.hasAttribute("hidden");
infoFold.toggleAttribute("hidden", !open);
infoToggle.setAttribute("aria-expanded", open ? "true" : "false");
});
standortButton.addEventListener("click", () => session.centerOnStandort()); standortButton.addEventListener("click", () => session.centerOnStandort());
downloadKnopf.addEventListener("change", () => { downloadKnopf.addEventListener("change", () => {
session.setDownloadKnopf(downloadKnopf.checked); session.setDownloadKnopf(downloadKnopf.checked);
@@ -245,4 +261,6 @@ const gearIcon = `<svg class="glyph" viewBox="0 0 24 24" aria-hidden="true"><pat
const downloadIcon = `<svg class="glyph" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M11 2.5h2v9.1l2.9-2.9 1.4 1.4L12 15.9 6.7 10.1l1.4-1.4 2.9 2.9V2.5zM4.2 18.2h15.6V21H4.2z"/></svg>`; const downloadIcon = `<svg class="glyph" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M11 2.5h2v9.1l2.9-2.9 1.4 1.4L12 15.9 6.7 10.1l1.4-1.4 2.9 2.9V2.5zM4.2 18.2h15.6V21H4.2z"/></svg>`;
const infoIcon = `<svg class="glyph" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="8.25" fill="none" stroke="currentColor" stroke-width="1.8"/><circle cx="12" cy="8.2" r="1.15" fill="currentColor"/><rect x="11.1" y="10.55" width="1.8" height="5.7" fill="currentColor"/></svg>`;
const strikeIcon = `<svg class="strike" viewBox="0 0 24 24" aria-hidden="true"><line x1="3" y1="21" x2="21" y2="3" stroke="#e7e1d4" stroke-width="4.5" stroke-linecap="round"/><line x1="3" y1="21" x2="21" y2="3" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>`; const strikeIcon = `<svg class="strike" viewBox="0 0 24 24" aria-hidden="true"><line x1="3" y1="21" x2="21" y2="3" stroke="#e7e1d4" stroke-width="4.5" stroke-linecap="round"/><line x1="3" y1="21" x2="21" y2="3" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>`;