From dcaa0064ebaca3946619b7480d576cd83d9c3949 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Aug 2026 22:21:19 +0000 Subject: [PATCH] feat(home): Marke vom Claim getrennt, zwei Einstiege, DatenGraf-Bruecke (v67) Drei Punkte, alle am ersten Bildschirm. (1) Titel und Aussage standen als ein Satz mit Doppelpunkt in einer Farbe und einer Groesse - die Marke "DatenLotse" ging in ihrer eigenen Ueberschrift unter. Jetzt 46 px in der Akzentfarbe, der Claim kleiner und in der Textfarbe darunter, durch eine duenne Linie abgesetzt. Der Test misst Groesse und Farbe: eine Pruefung auf Klassennamen bliebe gruen, wenn beide wieder gleich aussaehen. (2) Der Hero bot nur "Daten-Kompass starten". Wer sich erst orientieren wollte, fand dort keinen Weg zum Rundgang - der lag im wegklickbaren Hinweis und in der Seitenleiste, also an den zwei Stellen, an denen ein Erstnutzer nicht sucht. Jetzt stehen beide nebeneinander: "Sofort loslegen" und "Rundgang starten". (3) Die DatenGraf-Zeile stand als graues Kleingedrucktes unter dem Hauptknopf - an der prominentesten Stelle der Seite, fuer eine Minderheit, und ohne zu erklaeren, was die Bruecke leistet. Jetzt ein eigener Abschnitt unterhalb der Modul-Karten mit Erklaerung und zwei Wegen: Import direkt in den Dateidialog (ohne das Erklaer-Modal, das hier niemand mehr braucht) und ein Verweis auf DatenGraf fuer alle, die noch nicht kartiert haben. 3 neue Tests (379 gesamt), drei Mutationen einzeln geprueft. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011QxDJcLg9h8zdL9ZpTTty7 --- CLAUDE.md | 19 +++- README.md | 4 +- .../webfonts/fa-regular-400.subset.woff2 | Bin 2332 -> 2332 bytes .../fonts/webfonts/fa-solid-900.subset.woff2 | Bin 9956 -> 9952 bytes css/styles.css | 98 ++++++++++++++++-- datenschutz/index.html | 2 +- index.html | 43 ++++++-- js/app.js | 6 +- tests/smoke.spec.js | 57 ++++++++++ tools/generate-wissen.js | 2 +- wissen/glossar/index.html | 2 +- wissen/index.html | 2 +- wissen/kommunale-satzungen/index.html | 2 +- wissen/lizenzen/index.html | 2 +- wissen/pruefwerkzeuge/index.html | 2 +- wissen/rechtsgrundlagen-laender/index.html | 2 +- wissen/rechtsgrundlagen/index.html | 2 +- wissen/reifegrad-modelle/index.html | 2 +- 18 files changed, 209 insertions(+), 38 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 17c0ee9..2d3776d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,7 +11,7 @@ Dieses Dokument beschreibt Architektur, Konventionen und wichtige Implementierun - **Einstiegspunkt:** `index.html` - **Styles:** `css/styles.css` (Layout & Komponenten) + `css/tokens.css` (Design-Tokens) - **Logik:** `js/app.js` (eine einzige Datei) -- **Aktuelle Version:** `v66` (Script-Tag: ` + ``` ### Externe Aufrufe @@ -66,7 +66,7 @@ Die App hat keinen Build-Schritt – getestet wird **die ausgelieferte App**, al ```bash npm install # nur Dev: @playwright/test (exakt gepinnt) npx playwright install chromium # einmalig -npm test # 376 Tests, ~150 s +npm test # 379 Tests, ~150 s npm run test:ui # interaktiver Modus ``` @@ -509,13 +509,21 @@ Alles Übrige – Portal, Harvesting, DCAT-AP.de, Lizenzen, Clearing, Datenschut --- +### Die DatenGraf-Brücke (`#graf-bridge`) + +Eigener Startseiten-Abschnitt **unterhalb der Modul-Karten** (`.graf-bridge`/`.graf-bridge-panel`, `.home-only`). Bis v66 war das eine graue Zeile direkt unter dem Hero-Button („Schon kartiert? DatenGraf-CSV importieren"). Sie richtet sich an eine Minderheit, stand aber an der prominentesten Stelle der Seite – und wer schon kartiert hat, sucht dort gar nicht mehr nach dem Einstieg. + +Der Abschnitt erklärt jetzt auch, **was** die Brücke leistet (`GRAF_COLUMNS` 1:1, Vorbelegung von `accessRights` und `accrualPeriodicity` aus der Kartierung, nachzuerfassen bleiben Lizenz, Schlagwörter und Adresse) und bietet zwei Wege: `#graf-bridge-import` → **direkt** `pickAndImport()` (nicht über `openInventoryModal()` – wer kartiert hat, braucht das Erklär-Modal nicht mehr) und einen Verweis auf DatenGraf für alle, die noch nicht kartiert haben. + ### Hero je Ansicht (`.view-hero`, `.hero-panel`) Jede Unterseite trägt ihren Kopf in einem eigenen weißen Container; die Startseite ebenso (`.hero-panel`). Vorher folgten Badge, Titel, Untertitel, Aktionsbutton und Einleitungstext ohne Abstand auf die Topbar – fünf Bausteine in fünf Formaten direkt untereinander. - **`.view-hero`** umschließt `.inventory-header` **und** den direkt folgenden `.inventory-hint`. Der Hinweis verliert darin seinen eigenen Kasten (sonst stünde Weiß in Weiß) und wird nur durch eine Linie abgesetzt. - **Die Aktionsbuttons bekommen im Hero eine eigene Zeile** (`flex-direction: column`). Nebeneinander hingen sie je nach Länge des Untertitels auf halber Höhe – jede Unterseite sah anders aus. Der Rhythmus ist jetzt überall: Badge → Titel → Untertitel → Aktionen → Einleitung. -- **Der Hero der Startseite trägt seit v66 nur noch den Einstieg**: Logo, Titel, Einleitung, Aktion und die Import-Zeile. Die vier Schritt-Chips und die Local-First-Zusage stehen darunter in einem **eigenen Abschnitt** (`#hero-steps`, `.steps-section`/`.steps-panel`, Überschrift als `

` – je Ansicht bleibt genau eine `

`). Vorher waren es sieben Bausteine in einem Container, die einander die Aufmerksamkeit nahmen. +- **Der Hero der Startseite trägt nur noch den Einstieg**: Logo, Marke, Claim, Einleitung und zwei Aktionen. Die vier Schritt-Chips und die Local-First-Zusage stehen seit v66 in einem **eigenen Abschnitt** (`#hero-steps`, `.steps-section`/`.steps-panel`, Überschrift als `

` – je Ansicht bleibt genau eine `

`), die DatenGraf-Zeile seit v67 in einem weiteren (`#graf-bridge`, siehe unten). Vorher waren es sieben Bausteine in einem Container, die einander die Aufmerksamkeit nahmen. +- **Marke und Claim sind seit v67 getrennt ausgezeichnet.** Die `

` enthält `.hero-brand` (46 px, `--c-accent`) und darunter `.hero-claim` (21 px, `--c-text`, abgesetzt durch eine dünne Linie) – vorher stand beides als *ein* Satz mit Doppelpunkt in einer Farbe und einer Größe, und „DatenLotse" ging darin unter. Ein Test **misst** den Unterschied (Schriftgröße und Farbe), statt ihn über Klassennamen zu behaupten; eine reine Klassenprüfung bliebe grün, wenn beide wieder gleich aussähen. +- **Zwei Einstiege im Hero** (`.hero-actions`): `#hero-kompass-btn` („Sofort loslegen" → `navTo('kompass')`) und `#hero-tour-btn` („Rundgang starten" → `startTour()`). Der Rundgang lag bis v66 nur im wegklickbaren Hinweis und in der Seitenleiste – wer sich erst orientieren wollte, fand im Hero keinen Weg dorthin. - **Titel und Einleitung benennen den Zweck.** Bis v65 stand dort „Datenmanagement verstehen, aufbauen, vertiefen" – wofür das Werkzeug gebaut ist, nämlich Daten zu **öffnen**, kam weder in der Überschrift noch im Einleitungssatz vor. Beides sagt es jetzt ausdrücklich (und die Meta-Beschreibungen ebenso); ein Test hält Titel *und* Einleitungssatz fest, weil eine Überschrift ohne den Satz darunter nur die halbe Aussage wäre. - **Die statischen Seiten teilen den Kopf** (`.static-hero`, erzeugt in `tools/generate-wissen.js`) – und seit v66 auch den **Fuß**: der Generator schrieb `class="footer"`, wofür es gar keine Regel gibt, die Linkzeile stand also ungestylt am unteren Rand. Es ist dieselbe Leiste wie in der App, also dieselbe Klasse `.site-footer` samt Marke, Trennern und GitHub-Zeichen. Ein Test prüft je Seite Grundfarbe, obere Linie und die Marke.: Brotkrumen, Titel und Lead stehen im selben weißen Container. Sie sind aus dem Fuß und aus dem Wissens-Center verlinkt und sollen wie dasselbe Produkt aussehen, nicht wie ein angehängtes Dokument. Ein Test prüft den Container je Seite. - Der Seitentitel bleibt das **einzige `

`** der Ansicht (ein Test prüft genau eine sichtbare `h1` je View) – der Hero ist ein Container, keine zusätzliche Überschrift. @@ -642,6 +650,8 @@ Nach Änderungen an `app.js` `?v=N` im Script-Tag **und** die `v{N}` im Footer e | Prüfwerkzeuge & Normtexte | `PRUEF_WERKZEUGE`, `renderWissen()` | `#wissen-sec-tools`, `#wissen-tools` | | Hero je Ansicht | `.view-hero` (App), `.hero-panel` (Start), `.static-hero` (erzeugte Seiten) | `.inventory-header`, `.inventory-hint`, `.static-crumbs` | | Startseite: Hero + Schritte getrennt | `showView()` über `.home-only` | `#hero`, `#hero-steps`, `.steps-panel`, `.steps-title`, `.hero-steps`, `.hero-trust` | +| Hero: Marke, Claim, zwei Einstiege | `startTour()`, `navTo('kompass')` | `.hero-brand`, `.hero-claim`, `.hero-actions`, `#hero-kompass-btn`, `#hero-tour-btn` | +| DatenGraf-Brücke | `pickAndImport()` | `#graf-bridge`, `#graf-bridge-import`, `.graf-bridge-panel`, `.graf-bridge-text` | | Statische Seiten & Datenschutz | `tools/generate-wissen.js`: `seite()`, `seiten()`, `eigenstaendigeSeiten()` | `/wissen/…`, `/datenschutz/`, `sitemap.xml` | | Anonyme Seitenzählung | GoatCounter – einziger externer Aufruf, im Test abgeklemmt | `gc.zgo.at`, `datenlotse.goatcounter.com` | | Persistenz | `saveState()`, `loadState()`, `clearState()` | `datenlotse_*`, `#reset-data-btn` | @@ -686,6 +696,7 @@ Nach Änderungen an `app.js` `?v=N` im Script-Tag **und** die `v{N}` im Footer e | v16 | Daten-Kompass (Herzstück) – eigene View + Hero-Haupt-CTA (Topbar-„Loslegen" zeigt ebenfalls darauf): ausführliche Open-Data-Reifegrad-Checkliste nach ODRA / EU Open Data Maturity / 5-Sterne / DCAT-AP.de / DSGVO·FAIR (7 Dimensionen, Quellenangaben), Status je Item mit Score & Ampel, Vorbelegung aus dem App-Stand, adaptive Sprünge in die passenden Bausteine, Persistenz (`datenlotse_kompass`) und PDF-Export; leeres „Loslegen"-Platzhalter-Modal entfernt | | v17 | Weiterer Ausbau (1/4) – Inventar Suche, Filter & Sortierung: `renderInventory()` in `renderInventory()` + `renderInventoryBody()` aufgeteilt; `.inv-controls` (Volltextsuche + Schutzbedarf-/Clearing-Ampel-Filter + Sortierung Titel/Vollständigkeit) über `invFilter`-State und `filteredInventory()`; der echte `idx` wird durch den Filter mitgeführt, sodass Editieren über gefilterten Teilmengen weiterhin den richtigen Datensatz trifft; Live-Meta „X von Y" + Empty-State | | v18 | Weiterer Ausbau (2/4) – Pseudonymisierung erweitert: drei neue Muster (Sozialversicherungsnummer, Steuer-ID *kontextgetriggert*, Kfz-Kennzeichen), Aktenzeichen um Geschäftszeichen/„Gz." und buchstabenhaltige Kerne erweitert, zusätzliche Geburtsdatum-Trigger („Geburtsdatum"/„Geburtstag"); Mapping-Export als CSV (`buildPseudoMappingCSV` + Button im Mapping-Kopf); Demo-Text und Grenzen-Liste aktualisiert; verifiziert auf Determinismus, Platzhalter-Konsistenz und Null-Falschtreffer auf neutralem Verwaltungstext | +| v67 | **Der Einstieg sagte nicht, wer hier spricht – und der Hauptknopf nur die Hälfte.** Drei gemeldete Punkte, alle am ersten Bildschirm. **(1)** Titel und Aussage standen als *ein* Satz mit Doppelpunkt in einer Farbe und einer Größe; die Marke „DatenLotse" ging in ihrer eigenen Überschrift unter. Jetzt trägt sie 46 px in der Akzentfarbe, der Claim steht kleiner und in der Textfarbe darunter, durch eine dünne Linie abgesetzt. Der Test **misst** Größe und Farbe – eine Prüfung auf Klassennamen bliebe grün, wenn beide wieder gleich aussähen, und genau das ist die Regression, um die es geht. **(2)** Der Hero bot nur „Daten-Kompass starten". Wer sich erst orientieren wollte, fand dort keinen Weg zum Rundgang – der lag im wegklickbaren Hinweis und in der Seitenleiste, also genau an den zwei Stellen, an denen ein Erstnutzer nicht sucht. Jetzt stehen beide Einstiege nebeneinander: „Sofort loslegen" und „Rundgang starten". **(3)** Die DatenGraf-Zeile stand als graues Kleingedrucktes unter dem Hauptknopf – an der prominentesten Stelle der Seite, für eine Minderheit, und ohne zu erklären, was die Brücke eigentlich leistet. Sie ist jetzt ein eigener Abschnitt **unterhalb der Modul-Karten** mit Erklärung (Schema 1:1, Vorbelegung aus der Kartierung, was nachzuerfassen bleibt) und zwei Wegen – Import direkt in den Dateidialog, ohne das Erklär-Modal, das hier niemand mehr braucht, und ein Verweis auf DatenGraf für alle, die noch nicht kartiert haben. 3 neue Tests, drei Mutationen einzeln geprüft. | | v66 | **Ein Darstellungs-Durchgang – und dreimal dieselbe Lehre: eine Regel, die nicht greift, fällt niemandem auf.** Der auffälligste Fund kam aus der Benutzung: im Rundgang zeichnete das hervorgehobene Zielelement **in die Karte hinein** – bei Schritt 3 stand der Fragebogentext über Titel und Knöpfen, und Klicks dort trafen den Fragebogen statt „Weiter". Ursache ist eine Eigenheit von `position: fixed`: der Layer bildet einen **eigenen Stapelkontext**, die Karte darin kann dessen `z-index` also nie überbieten, egal welchen Wert man ihr gibt. Ein höherer Wert an der Karte wäre wirkungslos geblieben – das Abdunkeln musste **aus dem Layer heraus** (jetzt `body.tour-on::before`), damit die Reihenfolge Abdunkeln < Hervorhebung < Karte überhaupt darstellbar ist. Zweiter Fund derselben Art: der Wissens-Generator schrieb `
`, und **eine solche Regel gibt es im Stylesheet gar nicht** – die App heißt `site-footer`. Die neun statischen Seiten trugen ihre Linkzeile also seit jeher ungestylt und ohne Grund am unteren Rand. Dritter: `showView()` führte eine **Liste von IDs** plus einen Sonderfall für `.consult-cta`; der neue Startseiten-Abschnitt wäre auf allen sechs Unterseiten stehen geblieben, ohne dass etwas rot geworden wäre – jetzt entscheidet die Klasse `.home-only`, und ein Test geht alle Unterseiten durch. Dazu der inhaltliche Teil: der Hero trug sieben Bausteine (Logo, Titel, Einleitung, Chips, Zusage, Aktion, Import-Zeile) und sagte in Titel wie Einleitung „Datenmanagement" – **wofür das Werkzeug gebaut ist, nämlich Daten zu öffnen, kam nirgends vor**. Die vier Schritte stehen jetzt in einem eigenen Abschnitt, Titel, Einleitung und die drei Meta-Beschreibungen benennen Open Data. 5 neue Tests, sechs Mutationen einzeln geprüft. | | v65 | **Die Initiative Transparente Zivilgesellschaft – mit sichtbar gemachter Quellenlage.** Nachgezogen auf Wunsch: die freiwillige Selbstverpflichtung ist strukturell dasselbe wie ein Transparenzgesetz – ein fester Katalog, den man abarbeitet, nur eben freiwillig – und damit der passendste Anker für gemeinnützige Organisationen. Dazu der Praxisleitfaden von Bernhard Krabina (Bertelsmann Stiftung), der ausdrücklich für zivilgesellschaftliche Akteure geschrieben ist. **Beide haben die schwächste Quellenlage im ganzen Werkzeug:** die Angaben stammen aus Suchergebnissen, nicht aus dem Volltext, weil die Netzwerkrichtlinie beide Seiten sperrt. Belegt sind fünf der zehn Punkte. Der Eintrag behauptet deshalb keine Vollständigkeit, sondern nennt sie als Ausschnitt und verweist für den Wortlaut auf die Quelle – und **drei Tests halten genau diese Zurückhaltung fest**, damit sie beim nächsten Bearbeiten nicht verlorengeht. Beim Schreiben fiel auf, dass ich die Lizenz des Leitfadens in einer früheren Auswertung mit „CC BY 4.0" angegeben hatte, obwohl die Suche das nie hergab; der Eintrag führt deshalb keine Lizenzangabe, und ein Test verbietet sie. **Dazu ein Doku-Abgleich gegen den Code** nach der Methode aus v52 (Zahlen im Browser ausgelesen, nicht aus dem Gedächtnis geschrieben): die Zählwerte stimmten alle, die *Beschreibungen* nicht. In CLAUDE.md stand die Sektion „Vollständigkeit (Ampel)" seit v63 im Widerspruch zur MQA-Sektion drei Absätze darüber – sie behauptete weiter das Zählen gefüllter Pflichtfelder; die Rechtspflicht-Sektion kündigte „genau zwei" Stellen an und führte dann drei auf (v56 hatte die dritte ergänzt, ohne den Satz mitzuziehen); die Feature-Tabelle hatte keine MQA-Zeile. Im README fehlten `sample-verein.csv` (v58) sowie `risiko.spec.js` und `tour.spec.js` in der Dateistruktur, Font Awesome stand noch mit „solid, regular, brands", obwohl v45 die Brands-Familie ganz entfernt hat, an drei Stellen war von „Verwaltungstexten" die Rede, die v58 gerade aufgelöst hatte, und die Prüfwerkzeuge nannten vier von neun. Nebenbei kam heraus, dass **`REQUIRED_FIELDS` von der App gar nicht mehr gelesen wird** – seit v63 greift die Qualitätsprüfung direkt auf `DCAT_REQUIRED` zu, die Konstante steht nur noch als Handgriff für `tests/inventory.spec.js`; das ist jetzt an der Stelle vermerkt, statt als stille Falle liegen zu bleiben. | | v64 | **Der zivilgesellschaftliche Anknüpfungspunkt – aus den Quellen, die wirklich vorlagen.** Die auffälligste Lücke war keine fehlende Liste, sondern eine fehlende Leserichtung: die 16 Landesgesetze standen nur als Pflicht der informationspflichtigen Stelle da. Für einen Verein sind dieselben Gesetze das Werkzeug, um an Daten zu kommen – der Lead benennt jetzt beide Richtungen und verweist auf FragDenStaat. Dazu drei Werkzeuge aus dem Bericht: der **Musterdatenkatalog** als Antwort auf „was veröffentlichen andere?", **ARX** als das, was DatenLotse bewusst nicht tut (generalisieren und unterdrücken statt nur messen), und **OParl 1.1** für Ratsinformationen. **DigComp** kommt als frei lizenzierte Ergänzung zu Data Orchard dazu – ausdrücklich nicht als Ersatz, denn es beschreibt einzelne Personen, während die Dimension nach der Organisation fragt. Nicht übernommen: die geplante IFG-Einschränkung (im Bericht selbst nur advocacy-belegt, kein amtlicher Entwurf) und die Initiative Transparente Zivilgesellschaft (stammte aus einer eigenen Suche, nicht aus dem Bericht). Beim Einfügen fiel auf, dass der Bestandstest für die Werkzeugliste eine **Host-Liste** kodierte; die eigentliche Regel ist „jede Adresse zeigt auf die herausgebende Stelle selbst" – der Test führt jetzt eine Zuordnung Name → Host, sodass ein neuer Eintrag eine Entscheidung erzwingt. 6 neue Tests. Ein Mutationslauf lief zunächst wirkungslos durch, weil das deutsche Schlusszeichen den Python-String beendete, ein zweiter blieb grün, weil mein Test auf „ergänzt" prüfte – das steht auch im mutierten Text. Erst die Prüfung auf „statt sie zu ersetzen" machte ihn rot. | diff --git a/README.md b/README.md index bc2960b..e554dab 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Die App selbst bleibt abhängigkeitsfrei; für die Tests wird einmalig Playwrigh ```bash npm install # nur Dev: @playwright/test npx playwright install chromium -npm test # 376 Tests, ~150 s +npm test # 379 Tests, ~150 s npm run test:ui # interaktiver Modus ``` @@ -309,7 +309,7 @@ datenlotse/ │ ├── sample-landesbehoerde.csv # Beispiel: fiktive Landesebene (12 Datensätze) │ ├── sample-verein.csv # Beispiel: fiktiver gemeinnütziger Träger (12 Datensätze) │ └── template.csv # Leere Vorlage zum eigenen Befüllen -├── tests/ # Playwright-End-to-End-Tests (376 Tests in 14 Dateien) +├── tests/ # Playwright-End-to-End-Tests (379 Tests in 14 Dateien) │ ├── helpers.js # openApp/loadSample/Download-Helfer │ ├── smoke.spec.js # Views, Routing, Dashboard, HTML-Validität, Anrede │ ├── import.spec.js # CSV-Parser, Ableitung, Formel-Injection diff --git a/assets/fonts/webfonts/fa-regular-400.subset.woff2 b/assets/fonts/webfonts/fa-regular-400.subset.woff2 index 34f373821cbfb598ae500b3f83dc06322a19ff07..b37989f50d6ac25c6d28e600e6bcb6f5ab743ce5 100644 GIT binary patch delta 2241 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 P;OmU>WQ$j?zySaN;S5C^ diff --git a/assets/fonts/webfonts/fa-solid-900.subset.woff2 b/assets/fonts/webfonts/fa-solid-900.subset.woff2 index 94386dd283e5e6df14cd3e0cd7dd5c018b0fb4ef..dccddcc7c85d5761f2c0eef0357a4dac8a68dcbc 100644 GIT binary patch delta 9817 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 delta 9860 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 diff --git a/css/styles.css b/css/styles.css index cd7cdba..62684cc 100644 --- a/css/styles.css +++ b/css/styles.css @@ -132,14 +132,42 @@ a { color: var(--c-accent); } border: 2px solid rgba(66, 0, 147, 0.15); box-shadow: var(--shadow-md); } +/* Marke und Aussage sind zwei verschiedene Dinge und standen bis v66 als ein + Satz mit Doppelpunkt in einer Farbe und einer Größe – „DatenLotse" ging darin + unter. Jetzt trägt die Marke die Akzentfarbe und das volle Gewicht, der Claim + steht kleiner und in der Textfarbe darunter. */ .hero-headline { - font-size: 34px; - font-weight: 800; - letter-spacing: -1px; - line-height: 1.15; margin-bottom: 16px; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; +} +.hero-brand { + font-size: 46px; + font-weight: 800; + letter-spacing: -1.6px; + line-height: 1.05; color: var(--c-accent); } +.hero-claim { + font-size: 21px; + font-weight: 600; + letter-spacing: -0.3px; + line-height: 1.3; + color: var(--c-text); + max-width: 620px; + /* setzt die Marke optisch ab, ohne eine zweite Überschrift zu behaupten */ + padding-top: 12px; + border-top: 2px solid rgba(66, 0, 147, 0.12); +} +.hero-actions { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 12px; + margin-top: 28px; +} .hero-sub { font-size: 16px; color: var(--c-muted); @@ -236,12 +264,57 @@ a { color: var(--c-accent); } padding: 6px 14px; border-radius: 999px; } -.hero-from-graf { - margin-top: 22px; - font-size: 13px; +/* ── Die DatenGraf-Brücke ──────────────────────────────────────── + Eigener Abschnitt weit unten statt einer grauen Zeile unter dem Hero-Button: + sie richtet sich an eine Minderheit, und wer schon kartiert hat, sucht nicht + mehr nach dem Einstieg. */ +.graf-bridge { + max-width: 980px; + margin: var(--home-gap) auto 0; + padding: 0 24px; +} +.graf-bridge-panel { + background: #fff; + border: 1px solid var(--glass-border); + border-left: 4px solid var(--c-accent); + border-radius: 18px; + box-shadow: var(--shadow-md); + padding: 26px 28px; + display: flex; + gap: 20px; + align-items: flex-start; +} +.graf-bridge-icon { + width: 46px; height: 46px; + flex-shrink: 0; + border-radius: 12px; + display: flex; align-items: center; justify-content: center; + background: linear-gradient(135deg, #420093 0%, #6c2fbf 100%); + color: #fff; + font-size: 18px; +} +.graf-bridge-body { min-width: 0; } +.graf-bridge-title { + margin: 0 0 8px; + font-size: 19px; + font-weight: 800; + letter-spacing: -0.3px; + color: var(--c-accent); +} +.graf-bridge-text { + margin: 0; + font-size: 14px; + line-height: 1.65; color: var(--c-muted); } -.hero-from-graf a { font-weight: 600; } +.graf-bridge-text strong { color: var(--c-text); } +.graf-bridge-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 18px; +} +.graf-bridge-actions .btn { text-decoration: none; } /* ── Status-Dashboard (Startseite) ─────────────────────────────── Eigenes Panel statt frei stehender Kartenreihe: die Startseite zeigte @@ -2463,7 +2536,7 @@ details[open] > .about-summary .about-caret { transform: rotate(180deg); } .gov-note i { color: var(--c-accent); margin-right: 4px; } /* ── Daten-Kompass ───────────────────────────────────────────── */ -.hero-cta { font-size: 15px; padding: 14px 28px; margin: 28px 0 0; } +.hero-cta { font-size: 15px; padding: 14px 28px; margin: 0; } .kompass-view { max-width: 1040px; margin: 28px auto 0; padding: 0 24px 48px; } .kompass-view.hidden { display: none; } .kompass-score { @@ -2574,7 +2647,6 @@ details[open] > .about-summary .about-caret { transform: rotate(180deg); } :root { --home-gap: 30px; } .hero-logo { width: 132px; } .dashboard-panel { padding: 20px 16px 22px; } - .hero-headline { font-size: 26px; } .module-grid { padding: 0 16px 48px; } .inventory-view, .wissen-view, .vorlagen-view, .dashboard { padding-left: 16px; padding-right: 16px; } .inv-tabs { flex-wrap: wrap; } @@ -2595,6 +2667,12 @@ details[open] > .about-summary .about-caret { transform: rotate(180deg); } .steps-section { padding: 0 16px; } .steps-panel { padding: 22px 18px 22px; border-radius: 14px; } .steps-title { font-size: 18px; } + .hero-brand { font-size: 34px; letter-spacing: -1px; } + .hero-claim { font-size: 17px; } + .hero-actions .btn { flex: 1 1 auto; justify-content: center; } + .graf-bridge { padding: 0 16px; } + .graf-bridge-panel { padding: 20px 18px; flex-direction: column; gap: 14px; border-radius: 14px; } + .graf-bridge-actions .btn { flex: 1 1 auto; justify-content: center; } .view-hero { padding: 22px 18px 20px; margin: 22px 0 22px; border-radius: 14px; } .view-hero .inventory-title { font-size: 27px; } .view-hero .inventory-hint { padding-top: 14px; margin-top: 16px; } diff --git a/datenschutz/index.html b/datenschutz/index.html index 18245f6..49d481a 100644 --- a/datenschutz/index.html +++ b/datenschutz/index.html @@ -42,7 +42,7 @@ } - + diff --git a/index.html b/index.html index 24c3679..ee2f7c7 100644 --- a/index.html +++ b/index.html @@ -125,10 +125,10 @@ - + - - + + @@ -184,14 +184,16 @@
-

DatenLotse: Daten verstehen, ordnen und als Open Data veröffentlichen

+

+ DatenLotse + Daten verstehen, ordnen und als Open Data veröffentlichen +

Vom Ist-Zustand Ihrer Datenlandschaft bis zur Veröffentlichung als Open Data: Welche Bestände lassen sich öffnen, wie werden sie nach dem Standard DCAT-AP.de beschrieben – und was muss vorher geklärt oder geschützt werden?

- -

- - Schon kartiert? DatenGraf-CSV importieren und direkt mit dem Inventar starten. -

+
+ + +
@@ -324,6 +326,25 @@

Risiko & Pseudonymisierung

+ +
+
+
+
+

Schon mit DatenGraf kartiert?

+

Dann brauchen Sie hier nicht von vorn anzufangen. DatenLotse liest genau das CSV-Schema, das DatenGraf exportiert: Aus jeder Kombination aus Quelle und Datentyp wird ein Datensatz-Kandidat nach DCAT-AP.de – samt Vorbelegung von Zugriffsrechten und Aktualisierungszyklus aus Ihrer Kartierung. Sie ergänzen nur noch, was DatenGraf nicht kennt: Lizenz, Schlagwörter und die Adresse, unter der die Daten liegen.

+
+ + Noch nicht kartiert? Zu DatenGraf +
+
+
+
+
@@ -1118,7 +1139,7 @@

Lizenz-Wegweiser

- +