From f520755d88563146635c134d4d832147c98cc084 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Aug 2026 18:40:16 +0000 Subject: [PATCH] feat(qualitaet): Metadaten-Guete nach dem MQA-Schema (v63) completeness() zaehlte gefuellte Pflichtfelder. Ein Datensatz mit allen Pflichtangaben stand damit auf 100 % - auch ohne Schlagwoerter, ohne Zeitraum und nur als PDF. Genau dagegen richtet sich der Leitgedanke der Metadata Quality Assurance von data.europa.eu: "filling the DCAT-AP mandatory fields alone is not sufficient". Die Zahl folgt jetzt deren Schema: fuenf FAIR-Dimensionen, 405 Punkte, 18 Einzelpruefungen. Auffindbarkeit 100 Schlagwoerter, Kategorie, Raum, Zeit Zugaenglichkeit 100 Zugriffs-URL, Info-Seite, Zugriffsrechte Interoperabilitaet 110 Format, maschinenlesbar, offen, Zyklus Nachnutzbarkeit 75 Lizenz je Verteilung, offen, Herausgeber, Kontakt Kontext 20 Beschreibung, Titel, Datum ERSATZ STATT DRITTES MASS: der Funktionsname bleibt, damit Badge, Durchschnitt, Sortierung, Dashboard, Status-Einseiter und PDF-Bericht weiter an genau EINER graduellen Zahl haengen. Ein frischer Import faellt damit von ~83 % auf ~46 % - das ist der Zweck, nicht ein Nebeneffekt. Die Bestnote bleibt erreichbar (ein rundum gepflegter Datensatz erreicht 100 %), sonst waere die 80-%-Schwelle eine Schikane; ein Test haelt das fest. SAUBER GETRENNT, WAS UEBERNOMMEN IST: die fuenf Dimensionen und ihre Gewichte stammen aus der Methodik (Quelle: Recherchebericht des Nutzers). Die Zuordnung der Einzelpruefungen und ihre Punkte innerhalb einer Dimension sind eigene Zutat - die Aufteilung im Original lag nicht vor. Ein Test pinnt die Gewichte woertlich und prueft, dass jede Dimension genau ihr Maximum ausschoepft. AUSDRUECKLICH BENANNT, WAS DER WERT NICHT IST: die MQA ruft URLs tatsaechlich ab und prueft, ob sie antworten. DatenLotse macht keine Netzaufrufe und prueft deshalb nur, ob eine Angabe da und wohlgeformt ist. Der Kasten im Qualitaets-Tab sagt das. MQA_OFFENE_FORMATE ist eine Positivliste: "nicht herstellergebunden" laesst sich nicht aus dem Fehlen von etwas ableiten, unbekannte Formate zaehlen deshalb nicht mit. renderMqaSummary() zeigt die Dimensionen ueber den ganzen Bestand gemittelt plus die drei schwaechsten Einzelpruefungen - "Auffindbarkeit 20 %" ist ein Arbeitsauftrag, ein Durchschnitt ist nur eine Zahl. Nebenbei: empty() existierte zweimal wortgleich als lokale Hilfe in validateDataset() und inventoryIssues(); jetzt einmal modulweit. 8 neue Tests (361 gesamt), drei bestehende auf die neue Semantik umgeschrieben statt gelockert. Der staerkste Test geht die 18 Pruefungen einzeln durch und misst, ob jede ihre vollen Punkte ausmacht. Ein erster Mutationsversuch war zu schwach gewaehlt und lief gruen durch - erst die schaerfere Fassung machte ihn rot. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011QxDJcLg9h8zdL9ZpTTty7 --- CLAUDE.md | 32 +++- README.md | 5 +- assets/fonts/fa/icons.min.css | 2 +- .../webfonts/fa-regular-400.subset.woff2 | Bin 2332 -> 2332 bytes .../fonts/webfonts/fa-solid-900.subset.woff2 | Bin 9692 -> 9908 bytes css/styles.css | 25 +++ datenschutz/index.html | 2 +- index.html | 13 +- js/app.js | 138 ++++++++++++++- tests/inventory.spec.js | 157 ++++++++++++++++-- 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 +- 19 files changed, 352 insertions(+), 40 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e1e7f22..da8461a 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:** `v62` (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 # 355 Tests, ~140 s +npm test # 361 Tests, ~145 s npm run test:ui # interaktiver Modus ``` @@ -253,6 +253,31 @@ d.distributions = [{ title, format, accessURL, license }, …] // mindestens e **CSV:** die flache Liste zeigt bewusst nur die **erste** Verteilung (Spalten `format`/`license`) plus die Spalte `verteilungen` (Anzahl). Der Rückimport führt entsprechend nur die erste zusammen und lässt weitere unangetastet – dieselbe Merge-Logik wie bei den Clearing-Antworten. Vollständig sind alle Verteilungen in JSON-LD, Turtle und der Projektdatei. +### Metadaten-Güte nach MQA (`mqaScore`, ersetzt die alte Vollständigkeit) + +Bis v62 zählte `completeness(d)` schlicht die gefüllten `REQUIRED_FIELDS`. Der Leitgedanke der **Metadata Quality Assurance** von data.europa.eu ist aber gerade, dass die Pflichtfelder allein noch keine gute Beschreibung ergeben – ein Datensatz mit allen Pflichtangaben, aber ohne Schlagwörter, ohne Zeitraum und nur als PDF ist schwer zu finden und kaum nachnutzbar. + +`MQA_DIMENSIONEN` trägt fünf FAIR-Dimensionen mit **405 Punkten**: + +| Dimension | Punkte | Prüfungen | +|---|---|---| +| Auffindbarkeit | 100 | Schlagwörter (30), Kategorie (30), räumliche (20) und zeitliche Abdeckung (20) | +| Zugänglichkeit | 100 | Zugriffs-URL je Verteilung (50), Info-Seite (20), Zugriffsrechte (30) | +| Interoperabilität | 110 | Format je Verteilung (30), maschinenlesbar (40), nicht herstellergebunden (20), Zyklus (20) | +| Nachnutzbarkeit | 75 | Lizenz je Verteilung (25), Lizenz offen (20), Herausgeber (15), Kontakt mit E-Mail (15) | +| Kontext | 20 | Beschreibung (8), Titel (6), Datum (6) | + +> ⚠️ **Was übernommen ist und was nicht.** Die **fünf Dimensionen und ihre Gewichte** stammen aus der MQA-Methodik (Quelle: Recherchebericht des Nutzers). Die **Zuordnung der Einzelprüfungen und ihre Punkte innerhalb einer Dimension sind eigene Zutat** – die Aufteilung im Original lag nicht vor. Ein Test hält beides auseinander: er pinnt die fünf Dimensionsgewichte wörtlich und prüft, dass jede Dimension genau ihr Maximum ausschöpft. Wer eine Prüfung ergänzt, muss innerhalb der Dimension umverteilen. + +> ⚠️ **Nicht dasselbe wie der Wert des Portals.** Die MQA ruft URLs tatsächlich ab und prüft, ob sie antworten. DatenLotse macht **keine Netzaufrufe** – geprüft wird nur, ob eine Angabe da und wohlgeformt ist. Der Kasten im Qualitäts-Tab sagt das ausdrücklich. + +- **`completeness(d)` behält seinen Namen** und liefert `mqaScore(d).prozent`. Damit gibt es weiterhin genau **eine** graduelle Zahl: Badge, Ø im Inventar, Sortierung, Dashboard, Status-Einseiter und PDF-Bericht hängen alle daran. Die Ampelschwellen (≥ 80 / ≥ 50) bleiben. +- **Die Bestnote ist erreichbar** – ein rundum gepflegter Datensatz erreicht 100 %. Ein Test hält das fest; ohne ihn wäre die 80-%-Schwelle eine Schikane. +- **Ein frischer Import fällt von ~83 % auf ~46 %.** Das ist beabsichtigt und der eigentliche Zweck: die alte Zahl war zu freundlich. +- `MQA_OFFENE_FORMATE` ist eine **Positivliste**. „Nicht herstellergebunden" lässt sich nicht aus dem Fehlen von etwas ableiten; unbekannte Formate zählen deshalb **nicht** mit, statt großzügig durchgewunken zu werden. +- `renderMqaSummary()` zeigt im Qualitäts-Tab (`#quality-mqa`) die Dimensionen **über den ganzen Bestand gemittelt** plus die drei schwächsten Einzelprüfungen. Der Einzelwert steht schon auf der Karte; hier interessiert, **wo** das Inventar schwach ist. +- `empty(v)` liegt seit v63 **modulweit** – vorher stand dieselbe Definition zweimal lokal in `validateDataset()` und `inventoryIssues()`. + ### Vollständigkeit (Ampel) `completeness(d)` misst den Anteil gefüllter `REQUIRED_FIELDS` (`title, description, publisher, contactPoint, accrualPeriodicity, license, accessRights`) als 0–100 %. Schwellen für die Badge-Farbe: ≥ 80 % `--ampel-gruen`, ≥ 50 % `--ampel-gelb`, sonst `--ampel-rot`. Eingaben werden per `input`-Listener live in `inventory[idx]` zurückgeschrieben und Badge + Durchschnitt sofort aktualisiert. @@ -632,6 +657,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 | +| v63 | **Die Vollständigkeits-Zahl war zu freundlich.** `completeness()` zählte gefüllte Pflichtfelder – ein Datensatz mit allen Pflichtangaben stand auf 100 %, auch ohne Schlagwörter, ohne Zeitraum und nur als PDF. Genau dagegen richtet sich der Leitgedanke der Metadata Quality Assurance von data.europa.eu. Die Zahl folgt jetzt deren Schema: fünf FAIR-Dimensionen, 405 Punkte, 18 Einzelprüfungen. **Ersatz statt drittes Maß** – der Funktionsname bleibt, damit Badge, Durchschnitt, Sortierung, Dashboard und Bericht weiter an genau einer graduellen Zahl hängen. Ein frischer Import fällt damit von ~83 % auf ~46 %; das ist der Zweck. Sauber getrennt ist, was übernommen wurde: die **Dimensionsgewichte** stammen aus der Methodik, die **Zuordnung der Einzelprüfungen** ist eigene Zutat – ein Test pinnt die Gewichte wörtlich und prüft, dass jede Dimension ihr Maximum ausschöpft. Ausdrücklich benannt ist auch, was der Wert **nicht** ist: die MQA ruft URLs ab, DatenLotse macht keine Netzaufrufe und prüft nur Vorhandensein und Wohlgeformtheit. Der stärkste Test geht die 18 Prüfungen einzeln durch und misst, ob jede ihre vollen Punkte ausmacht – eine wirkungslose Prüfung fällt sofort auf. Beim Bauen zeigte sich nebenbei, dass `empty()` zweimal wortgleich als lokale Hilfe existierte; jetzt einmal modulweit. 8 neue Tests, drei bestehende auf die neue Semantik umgeschrieben statt gelockert. Ein erster Mutationsversuch war zu schwach gewählt und lief grün durch – erst die schärfere Fassung (Positivliste akzeptiert alles) machte ihn rot. | | v62 | **Rechtslage nachgezogen – mit offengelegter Herkunft.** `LEGAL_BASIS` kannte weder den **Data Act** noch den **Data Governance Act**, obwohl beide inzwischen anwendbar sind, und der Eintrag zu § 12a EGovG stand noch auf dem Stand vor dem OZG-Änderungsgesetz (Ausweitung auf die „Behörden des Bundes", Open-Data-Koordinatoren, Berichtspflicht). Der interessanteste Zugewinn ist **DGG Kapitel II**: das Statistische Bundesamt ist dort zentrale Informationsstelle für die Weiterverwendung geschützter Verwaltungsdaten und unterstützt ausdrücklich bei Anonymisierung und Pseudonymisierung – das ist der amtliche Anknüpfungspunkt zu Modul 3a und 3b. Beim Data Act war die Formulierung heikel: Kapitel V verpflichtet nur bei **außergewöhnlicher Notwendigkeit**, und ein Eintrag, der das verschweigt, weckt die Erwartung eines allgemeinen Datenzugangs; ein Test hält den Vorbehalt fest. **Zur Herkunft:** die Angaben stammen aus einem Recherchebericht des Nutzers, nicht aus eigener Prüfung an der amtlichen Quelle – die Netzwerkrichtlinie sperrt EUR-Lex und gesetze-im-internet.de. Verlinkt wurde deshalb nur, was sich aus dem dokumentierten CELEX-Schema sicher bilden lässt; DADG und DGG stehen im Text, aber ohne Link, damit keine geratene Fundstelle als amtliche Quelle erscheint. Dazu: die Prüfwerkzeuge nannten die **DCAT-AP.de-Spezifikation 2.0**, aktuell ist 3.0 – das Konventionenhandbuch bleibt dagegen ausdrücklich bei 2.0. 6 neue Tests, drei Mutationen geprüft. | | v61 | **Derselbe Fehler, zwei Tabs weiter.** Nachdem v57 im Risiko-Tab drei Fehlerklassen behoben hatte, lag die Frage nahe, ob die Schwester-Tabs sie auch tragen. Eine gezielte Probe sagte: ja, alle drei. Am schwersten wiegt die Spaltenbereinigung, weil dort ein **Download** daran hängt: wer nach dem Bereinigen eine zweite Spalte auf „ganze Spalte ersetzen" stellt, sah weiterhin das alte Ergebnis – und der Knopf „Bereinigte CSV" lieferte eine Datei, in der der Wert noch im Klartext stand, obwohl die Konfiguration daneben etwas anderes behauptete. Nachgemessen: Konfiguration `{0: ganz, 1: ganz}`, Datei `Name,Ort\n[PERSON_1],Leipzig`. Im Freitext-Tab dasselbe Muster – die bereinigte Fassung blieb nach einer Textänderung stehen, samt Download. Dazu der Fokusverlust beim Umschalten einer Spaltenbehandlung, weil `renderPseudoCsv()` die ganze Box neu baute. Alle drei behoben; die Regel steht jetzt als Konvention in der Doku, weil sie zum dritten Mal aufgetreten ist. 5 neue Tests, drei Mutationen einzeln geprüft. | | v60 | **Die Ampel war nicht lesbar – gemessen, nicht vermutet.** Beim Kontrast-Nachmessen in v57 war aufgefallen, dass die bestehenden Badges dieselbe Schwäche haben wie der damals neue Kasten; dieser Schnitt zieht es nach. Ein Durchgang über alle Ampelnutzungen förderte **zwei** Muster zutage, beide betroffen: Ampeltext auf der 12-%-Tönung derselben Farbe (`--ampel-gelb` **2,66 : 1**, `--ampel-gruen` 2,98) und weiße Schrift auf dem Vollton (3,00 bzw. 3,40). Rot bestand mit 4,54 / 5,44 – die beiden anderen nicht. Statt Einzelfarben zu korrigieren gibt es jetzt je Stufe **zwei Token**: der Vollton für Flächen, Balken und Punkte, eine dunklere Variante für Text und bedeutungstragende Icons. Die Regel ist mechanisch (`color:` → Text-Token) und per Test abgesichert, sodass eine neue Textfarbe auf dem Vollton rot wird. **Dazu der dritte Fund derselben Art beim `hidden`-Attribut:** nach `.quality-panel` (v28) und `.pseudo-mini-btn` (v29) war es in v58 `.sample-card` – jedes Mal gewinnt eine Klasse mit eigenem `display` gegen die UA-Regel mit Specificity 0-0-1. Statt eines vierten Einzelfalls jetzt **eine** globale Regel plus ein Test, der für jede der rund 180 Klassen mit eigenem `display` eine Probe anlegt und prüft, ob `hidden` greift. Der erste Lauf meldete 176 Verstöße – die Regel schließt sie alle. Nebenbei: mein erster Kontrast-Scanner meldete für viele Elemente exakt 1,00 : 1, weil die DOM-Suche bei Verläufen keinen Hintergrund findet und auf Weiß zurückfällt – gemessen wurde am Ende an den Token-Werten. | diff --git a/README.md b/README.md index 22e196e..5ea537c 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ | 📥 | **DCAT-AP.de-Katalog einlesen** | Wer bereits veröffentlicht, braucht kein Erstinventar, sondern eine Prüfung des Bestands: einen vorhandenen JSON-LD-Katalog einlesen, gegen die Qualitätsprüfung halten und mit Clearing und Governance verbinden. Zusammengeführt über die `id` – bereits gegebene Clearing-Antworten bleiben | | ♻️ | **Rückimport der Inventar-CSV** | Die exportierte Liste außerhalb bearbeiten (Tabellenkalkulation, Zuarbeit aus den Fachbereichen) und wieder einlesen. Der Import **führt über die `id` zusammen statt zu ersetzen** – bereits gegebene Clearing-Antworten bleiben erhalten | | 🗂️ | **Verteilungen je Datensatz** | Ein Datensatz kann in mehreren Formaten vorliegen – CSV *und* JSON *und* GeoJSON, je mit eigener Zugriffs-URL und Lizenz. Genau so modelliert es DCAT-AP.de; die Vollständigkeit verlangt entsprechend eine Lizenz **je** Verteilung | +| 📐 | **Metadaten-Güte (MQA)** | Statt gefüllte Pflichtfelder zu zählen, bewertet DatenLotse die Beschreibung graduell nach dem Schema der **Metadata Quality Assurance** von data.europa.eu: fünf FAIR-Dimensionen, 405 Punkte, 18 Prüfungen. Der Qualitäts-Tab zeigt, **wo** das Inventar schwach ist – „Auffindbarkeit 20 %" ist ein Arbeitsauftrag, ein Durchschnitt ist nur eine Zahl. ⚠️ Nicht identisch mit dem Wert des Portals: dort werden Adressen tatsächlich abgerufen, DatenLotse macht keine Netzaufrufe und prüft nur Vorhandensein und Wohlgeformtheit | | 🔍 | **Suche, Filter & Sortierung** | Inventar live durchsuchen (Titel/Publisher/Quellsystem), nach Schutzbedarf, Clearing-Ampel oder **Publikationsreife** filtern und nach Titel, Vollständigkeit oder **Publikationsreife** sortieren – Editieren bleibt auch über gefilterten Teilmengen korrekt | | 📊 | **Status-Dashboard** | Startseite zeigt – sobald Daten vorliegen – Live-Kennzahlen über alle Bausteine (Kompass-Reifegrad, Inventar-Anzahl & Ø-Vollständigkeit, Clearing-Ampelverteilung, Governance-Reifegrad) mit Schnellsprung direkt zum Weiterarbeiten | | 📤 | **DCAT-Export (JSON-LD, RDF/Turtle, CSV)** | DCAT-AP.de-konformes JSON-LD (`dcat:Catalog`/`dcat:Dataset` mit `@context`) zum Harvesting durch GovData/CKAN, dieselbe Ausgabe als **RDF/Turtle** (`.ttl`, für Portale die RDF direkt harvesten) sowie eine flache CSV-Liste | @@ -115,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 # 355 Tests, ~140 s +npm test # 361 Tests, ~145 s npm run test:ui # interaktiver Modus ``` @@ -305,7 +306,7 @@ datenlotse/ │ ├── sample-landkreis.csv # Beispiel: fiktive Kreisverwaltung (12 Datensätze) │ ├── sample-landesbehoerde.csv # Beispiel: fiktive Landesebene (12 Datensätze) │ └── template.csv # Leere Vorlage zum eigenen Befüllen -├── tests/ # Playwright-End-to-End-Tests (355 Tests) +├── tests/ # Playwright-End-to-End-Tests (361 Tests) │ ├── helpers.js # openApp/loadSample/Download-Helfer │ ├── smoke.spec.js # Views, Routing, Dashboard, HTML-Validität │ ├── import.spec.js # CSV-Parser, Ableitung, Formel-Injection diff --git a/assets/fonts/fa/icons.min.css b/assets/fonts/fa/icons.min.css index f8d0e30..8b57222 100644 --- a/assets/fonts/fa/icons.min.css +++ b/assets/fonts/fa/icons.min.css @@ -8,5 +8,5 @@ */ @font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:swap;src:url(../webfonts/fa-regular-400.subset.woff2) format("woff2")} @font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:swap;src:url(../webfonts/fa-solid-900.subset.woff2) format("woff2")} -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-trash-can{--fa:"\f2ed"}.fa-file-lines{--fa:"\f15c"}.fa-file-csv{--fa:"\f6dd"}.fa-gavel{--fa:"\f0e3"}.fa-table{--fa:"\f0ce"}.fa-compass{--fa:"\f14e"}.fa-bars{--fa:"\f0c9"}.fa-lightbulb{--fa:"\f0eb"}.fa-circle-exclamation{--fa:"\f06a"}.fa-square-check{--fa:"\f14a"}.fa-lock{--fa:"\f023"}.fa-share-nodes{--fa:"\f1e0"}.fa-bookmark{--fa:"\f02e"}.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-globe{--fa:"\f0ac"}.fa-spell-check{--fa:"\f891"}.fa-city{--fa:"\f64f"}.fa-file-arrow-up{--fa:"\f574"}.fa-map-location-dot{--fa:"\f5a0"}.fa-table-columns{--fa:"\f0db"}.fa-handshake{--fa:"\f2b5"}.fa-circle-check{--fa:"\f058"}.fa-file-import{--fa:"\f56f"}.fa-scroll{--fa:"\f70e"}.fa-shield-halved{--fa:"\f3ed"}.fa-square{--fa:"\f0c8"}.fa-question{--fa:"\3f"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-arrow-up-right-from-square{--fa:"\f08e"}.fa-chart-pie{--fa:"\f200"}.fa-chart-line{--fa:"\f201"}.fa-arrow-right{--fa:"\f061"}.fa-recycle{--fa:"\f1b8"}.fa-clipboard-check{--fa:"\f46c"}.fa-circle-question{--fa:"\f059"}.fa-route{--fa:"\f4d7"}.fa-pen{--fa:"\f304"}.fa-cubes{--fa:"\f1b3"}.fa-arrow-left{--fa:"\f060"}.fa-align-left{--fa:"\f036"}.fa-circle-nodes{--fa:"\e4e2"}.fa-circle-info{--fa:"\f05a"}.fa-landmark{--fa:"\f66f"}.fa-check-double{--fa:"\f560"}.fa-minus{--fa:"\f068"}.fa-flask{--fa:"\f0c3"}.fa-download{--fa:"\f019"}.fa-file-circle-check{--fa:"\e5a0"}.fa-id-card{--fa:"\f2c2"}.fa-house{--fa:"\f015"}.fa-file-arrow-down{--fa:"\f56d"}.fa-book-open-reader{--fa:"\f5da"}.fa-gauge-high{--fa:"\f625"}.fa-boxes-stacked{--fa:"\f468"}.fa-link{--fa:"\f0c1"}.fa-play{--fa:"\f04b"}.fa-chevron-down{--fa:"\f078"}.fa-code-compare{--fa:"\e13a"}.fa-list-check{--fa:"\f0ae"}.fa-user-shield{--fa:"\f505"}.fa-diagram-project{--fa:"\f542"}.fa-plus{--fa:"\2b"}.fa-xmark{--fa:"\f00d"}.fa-ruler-combined{--fa:"\f546"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-arrow-trend-up{--fa:"\e098"}.fa-traffic-light{--fa:"\f637"}.fa-rotate{--fa:"\f2f1"}.fa-gears{--fa:"\f085"}.fa-award{--fa:"\f559"}.fa-file-export{--fa:"\f56e"}.fa-arrow-trend-down{--fa:"\e097"}.fa-scale-balanced{--fa:"\f24e"}.fa-table-list{--fa:"\f00b"}.fa-book{--fa:"\f02d"}.fa-diagram-successor{--fa:"\e47a"}.fa-triangle-exclamation{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-circle-xmark{--fa:"\f057"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-users-gear{--fa:"\f509"}.fa-building-columns{--fa:"\f19c"}.fa-graduation-cap{--fa:"\f19d"} +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-trash-can{--fa:"\f2ed"}.fa-file-lines{--fa:"\f15c"}.fa-file-csv{--fa:"\f6dd"}.fa-gavel{--fa:"\f0e3"}.fa-table{--fa:"\f0ce"}.fa-compass{--fa:"\f14e"}.fa-bars{--fa:"\f0c9"}.fa-lightbulb{--fa:"\f0eb"}.fa-circle-exclamation{--fa:"\f06a"}.fa-square-check{--fa:"\f14a"}.fa-lock{--fa:"\f023"}.fa-share-nodes{--fa:"\f1e0"}.fa-bookmark{--fa:"\f02e"}.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-globe{--fa:"\f0ac"}.fa-spell-check{--fa:"\f891"}.fa-city{--fa:"\f64f"}.fa-file-arrow-up{--fa:"\f574"}.fa-map-location-dot{--fa:"\f5a0"}.fa-table-columns{--fa:"\f0db"}.fa-handshake{--fa:"\f2b5"}.fa-circle-check{--fa:"\f058"}.fa-file-import{--fa:"\f56f"}.fa-scroll{--fa:"\f70e"}.fa-shield-halved{--fa:"\f3ed"}.fa-square{--fa:"\f0c8"}.fa-question{--fa:"\3f"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-arrow-up-right-from-square{--fa:"\f08e"}.fa-chart-pie{--fa:"\f200"}.fa-chart-line{--fa:"\f201"}.fa-arrow-right{--fa:"\f061"}.fa-recycle{--fa:"\f1b8"}.fa-clipboard-check{--fa:"\f46c"}.fa-circle-question{--fa:"\f059"}.fa-route{--fa:"\f4d7"}.fa-pen{--fa:"\f304"}.fa-cubes{--fa:"\f1b3"}.fa-arrow-left{--fa:"\f060"}.fa-align-left{--fa:"\f036"}.fa-circle-nodes{--fa:"\e4e2"}.fa-circle-info{--fa:"\f05a"}.fa-landmark{--fa:"\f66f"}.fa-check-double{--fa:"\f560"}.fa-minus{--fa:"\f068"}.fa-flask{--fa:"\f0c3"}.fa-download{--fa:"\f019"}.fa-file-circle-check{--fa:"\e5a0"}.fa-id-card{--fa:"\f2c2"}.fa-house{--fa:"\f015"}.fa-file-arrow-down{--fa:"\f56d"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-book-open-reader{--fa:"\f5da"}.fa-gauge-high{--fa:"\f625"}.fa-boxes-stacked{--fa:"\f468"}.fa-link{--fa:"\f0c1"}.fa-play{--fa:"\f04b"}.fa-magnifying-glass{--fa:"\f002"}.fa-chevron-down{--fa:"\f078"}.fa-code-compare{--fa:"\e13a"}.fa-list-check{--fa:"\f0ae"}.fa-user-shield{--fa:"\f505"}.fa-diagram-project{--fa:"\f542"}.fa-plus{--fa:"\2b"}.fa-xmark{--fa:"\f00d"}.fa-ruler-combined{--fa:"\f546"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-arrow-trend-up{--fa:"\e098"}.fa-traffic-light{--fa:"\f637"}.fa-rotate{--fa:"\f2f1"}.fa-gears{--fa:"\f085"}.fa-award{--fa:"\f559"}.fa-file-export{--fa:"\f56e"}.fa-arrow-trend-down{--fa:"\e097"}.fa-scale-balanced{--fa:"\f24e"}.fa-table-list{--fa:"\f00b"}.fa-book{--fa:"\f02d"}.fa-diagram-successor{--fa:"\e47a"}.fa-triangle-exclamation{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-circle-xmark{--fa:"\f057"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-users-gear{--fa:"\f509"}.fa-building-columns{--fa:"\f19c"}.fa-graduation-cap{--fa:"\f19d"} .fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}.fa-brands,.fab{font-weight:400}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}.fa-solid,.fas{font-weight:900} diff --git a/assets/fonts/webfonts/fa-regular-400.subset.woff2 b/assets/fonts/webfonts/fa-regular-400.subset.woff2 index 4004a6029a33a4ef7c1e90deef05e8a1f65b246b..6558aeaf066948ea1f60abc38bc255db48faca1b 100644 GIT binary patch delta 2266 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 OKzocwTexxs4gdhcwmpde diff --git a/assets/fonts/webfonts/fa-solid-900.subset.woff2 b/assets/fonts/webfonts/fa-solid-900.subset.woff2 index 3ed36fe5ec7af2645dbce47385027a10f9c54504..0fb99928cdcd9973a598f67c547f57e5b8438175 100644 GIT binary patch literal 9908 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 mnvAL{P040$F2L%8C00000000000000000000 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 diff --git a/css/styles.css b/css/styles.css index 52fc071..c127d4f 100644 --- a/css/styles.css +++ b/css/styles.css @@ -1120,6 +1120,31 @@ a { color: var(--c-accent); } /* ── Bestandsprüfung (übergreifend) ───────────────────────────── */ .quality-inventory { min-width: 0; } + +/* ── Metadaten-Güte nach dem MQA-Schema ── */ +.quality-mqa { min-width: 0; } +.quality-mqa:not(:empty) { + background: var(--glass-bg); border: 1px solid var(--c-border-s); + border-radius: var(--radius); padding: 16px 18px; margin-bottom: 16px; +} +.qual-mqa-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 14px; margin-bottom: 14px; } +.qual-mqa-head strong { font-size: 15px; color: var(--c-accent); } +.qual-mqa-score { margin-left: auto; font-size: 20px; font-weight: 800; font-variant-numeric: tabular-nums; } +.qual-mqa-score span { font-size: 12px; font-weight: 500; color: var(--c-muted); } +.qual-mqa-dims { display: flex; flex-direction: column; gap: 8px; } +.qual-mqa-dim { display: grid; grid-template-columns: minmax(0, 160px) 1fr 44px; align-items: center; gap: 10px; } +.qual-mqa-dim-lbl { font-size: 12px; color: var(--c-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.qual-mqa-dim-lbl i { color: var(--c-accent); margin-right: 5px; } +.qual-mqa-bar { height: 8px; border-radius: 4px; background: rgba(122,117,145,0.16); overflow: hidden; } +.qual-mqa-bar > span { display: block; height: 100%; border-radius: 4px; background: var(--c-accent); transition: width 0.25s var(--ease-fluid); } +.qual-mqa-pct { font-size: 12px; font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; } +.qual-mqa-hint { font-size: 12.5px; margin-top: 14px; } +.qual-mqa-anteil { color: var(--c-muted); } +.qual-mqa-note { font-size: 11.5px; color: var(--c-muted); margin-top: 10px; line-height: 1.5; } +@media (max-width: 600px) { + .qual-mqa-dim { grid-template-columns: 1fr 44px; } + .qual-mqa-bar { grid-column: 1 / -1; order: 3; } +} .qual-cross { margin: 0 0 18px; padding: 14px 16px; diff --git a/datenschutz/index.html b/datenschutz/index.html index 83b4b5c..3b2d6ee 100644 --- a/datenschutz/index.html +++ b/datenschutz/index.html @@ -42,7 +42,7 @@ } - + diff --git a/index.html b/index.html index 537261b..c0c7837 100644 --- a/index.html +++ b/index.html @@ -125,10 +125,10 @@ - + - - + + @@ -392,8 +392,9 @@

Dateninventar n - +