Files
ai-disclosure-standard/bulkweb/templates/index.html
T
groot ec58fc30f8
release-tag / release-image (push) Successful in 1m40s
1.8.2 - Anpassungen am Bulk-System
2026-07-23 08:49:28 +02:00

250 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "index.html"}}
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{{.Name}}</title>
<meta name="description" content="Mehrere AI-Disclosure-Kennzeichnungen aus einer gemeinsamen Vorlage erzeugen.">
<link rel="stylesheet" href="/static/bulk.css">
</head>
<body>
<header class="site-header">
<a class="brand" href="/">{{.Name}}</a>
<nav>
<a href="{{.GeneratorURL}}">Generator</a>
<a href="{{.DisclosureBaseURL}}/datenschutz">Datenschutz</a>
<a href="{{.DisclosureBaseURL}}/impressum">Impressum</a>
</nav>
</header>
<main>
<section class="hero">
<p class="eyebrow">Bulk Generator</p>
<h1>Einmal definieren.<br>Viele Inhalte kennzeichnen.</h1>
<p class="lead">Übernimm eine Kennzeichnung aus dem normalen Generator, ergänze wiederkehrende Website-Daten und erzeuge HTML, Markdown und JSON-LD für bis zu {{.MaxURLs}} Inhalts-URLs in einem Lauf.</p>
<div class="notice privacy-note"><strong>Datensparsam:</strong> Inhalts-URLs werden nicht abgerufen. Website-Profile und gespeicherte Vorlagen bleiben ausschließlich im Browser-Speicher dieses Geräts. URL-Listen und Ergebnisse werden nicht dauerhaft gespeichert.</div>
</section>
<section class="panel workflow" aria-labelledby="workflow-title">
<div class="section-heading">
<p class="eyebrow">1 · Kennzeichnung</p>
<h2 id="workflow-title">Vorlage festlegen</h2>
<p>Am sichersten ist die Übernahme direkt aus dem bestehenden Generator. Alternativ kannst du eine Declaration-URL oder deren Query-String einfügen.</p>
</div>
<div class="toolbar wrap">
<a class="button secondary" id="open-generator" href="{{.GeneratorURL}}" target="_blank" rel="noopener">Kennzeichnung im Generator definieren</a>
<select id="saved-template-select" aria-label="Gespeicherte Vorlage">
<option value="">Gespeicherte Vorlage wählen …</option>
</select>
<button type="button" class="button subtle" id="delete-template">Vorlage löschen</button>
</div>
<label class="field wide">Declaration-URL oder Query-String
<textarea id="template-input" rows="5" spellcheck="false" placeholder="https://…/declaration?mode=article&textExtent=partial&…"></textarea>
<small>`subject` wird beim Laden entfernt; die jeweilige Inhalts-URL setzt der Bulk-Lauf später selbst.</small>
</label>
<div class="toolbar wrap">
<button type="button" id="load-template">Vorlage laden</button>
<label class="inline-field">Vorlagenname
<input id="template-name" maxlength="80" placeholder="z. B. Artikel – redaktionell geprüft">
</label>
<button type="button" class="button secondary" id="save-template">Im Browser speichern</button>
</div>
<div id="template-status" class="status" role="status" aria-live="polite">Noch keine Vorlage geladen.</div>
<details class="details-box">
<summary>Aktive Parameter anzeigen</summary>
<dl id="template-params" class="parameter-list"></dl>
</details>
</section>
<section class="panel" aria-labelledby="profile-title">
<div class="section-heading">
<p class="eyebrow">2 · Wiederkehrende Daten</p>
<h2 id="profile-title">Website-Profil</h2>
<p>Hier gehören Angaben hinein, die du nicht bei jedem Batch erneut eingeben möchtest. Nicht ausgefüllte Profilfelder verändern die geladene Kennzeichnungsvorlage nicht.</p>
</div>
<div class="toolbar wrap">
<select id="profile-select" aria-label="Website-Profil">
<option value="">Website-Profil wählen …</option>
</select>
<button type="button" class="button subtle" id="new-profile">Neues Profil</button>
<button type="button" class="button subtle danger" id="delete-profile">Profil löschen</button>
</div>
<div class="profile-grid">
<label>Profilname
<input id="profile-name" maxlength="80" placeholder="z. B. example.org">
</label>
<label>Sprache
<select id="profile-lang">
<option value="">Aus Vorlage übernehmen</option>
<option value="de">Deutsch</option><option value="en">English</option><option value="fr">Français</option>
<option value="es">Español</option><option value="it">Italiano</option><option value="nl">Nederlands</option>
<option value="pt">Português</option><option value="pl">Polski</option>
</select>
</label>
<label>AI-Act-Rolle
<select id="profile-role">
<option value="">Aus Vorlage übernehmen</option>
<option value="deployer">Deployer</option>
<option value="provider">Provider</option>
<option value="both">Beides</option>
<option value="unsure">Unklar</option>
</select>
</label>
<label>Nutzungskontext
<select id="profile-use-context">
<option value="">Aus Vorlage übernehmen</option>
<option value="professional">Beruflich / organisatorisch</option>
<option value="personalNonProfessional">Rein persönlich / nicht beruflich</option>
<option value="unsure">Unklar</option>
</select>
</label>
<label>Nachweisgrundlage
<select id="profile-assurance">
<option value="">Aus Vorlage übernehmen</option>
<option value="selfDeclared">Selbstauskunft</option>
<option value="technicallyRecorded">Technisch erfasst</option>
<option value="signed">Signiert</option>
<option value="verified">Verifiziert</option>
</select>
</label>
<div class="subsection wide">
<h3>Autor / Byline <span>optional</span></h3>
<div class="profile-grid nested">
<label>Autor/in
<input id="profile-author" maxlength="200" placeholder="Name">
</label>
<label>Autoren-URL
<input id="profile-author-url" type="url" placeholder="https://example.org/autor">
</label>
</div>
</div>
<div class="subsection wide">
<h3>Redaktionelle Verantwortung <span>nur eintragen, wenn sie zur Vorlage passt</span></h3>
<div class="profile-grid nested">
<label>Rolle
<select id="profile-responsible-role">
<option value="">Aus Vorlage übernehmen / keine</option>
<option value="publisher">Publisher</option>
<option value="other">Andere verantwortliche Stelle</option>
</select>
</label>
<label>Name / Organisation
<input id="profile-responsible" maxlength="200" placeholder="Redaktion / Organisation">
</label>
<label class="wide">Impressum / Verantwortlichkeits-URL
<input id="profile-responsible-url" type="url" placeholder="https://example.org/impressum">
</label>
</div>
</div>
<div class="subsection wide">
<h3>Beschwerde- / Rückmeldestelle <span>Best Practice</span></h3>
<div class="profile-grid nested">
<label>Name
<input id="profile-complaint-name" maxlength="200" placeholder="Redaktion / Ombudsstelle">
</label>
<label>E-Mail
<input id="profile-complaint-email" type="email" placeholder="feedback@example.org">
</label>
<label class="wide">Kontakt-URL
<input id="profile-complaint-url" type="url" placeholder="https://example.org/kontakt">
</label>
</div>
</div>
</div>
<div class="toolbar wrap">
<button type="button" id="save-profile">Profil speichern</button>
<button type="button" class="button secondary" id="export-browser-data">Profile & Vorlagen exportieren</button>
<label class="button secondary file-button">Importieren<input id="import-browser-data" type="file" accept="application/json,.json"></label>
<button type="button" class="button subtle danger" id="clear-browser-data">Alle lokalen Daten löschen</button>
</div>
<p class="help">Gespeichert werden nur die von dir angelegten Profile und Vorlagen in <code>localStorage</code>. Eine Synchronisierung zum Server findet nicht statt.</p>
</section>
<section class="panel" aria-labelledby="urls-title">
<div class="section-heading">
<p class="eyebrow">3 · Inhalte</p>
<h2 id="urls-title">URLs oder Pfade einfügen</h2>
<p>Eine URL bzw. ein Pfad pro Zeile. Bei relativen Pfaden wird die optionale Basis-URL verwendet. Eine einspaltige CSV-Datei mit der Überschrift <code>url</code> kann ebenfalls direkt eingefügt werden.</p>
</div>
<div class="url-grid">
<label>Basis-URL für relative Pfade
<input id="base-url" type="url" placeholder="https://example.org">
</label>
<div class="counter-card" id="url-counter" aria-live="polite"><strong>0</strong><span>gültige URLs</span></div>
</div>
<label class="field wide">URL-Liste
<textarea id="url-input" rows="12" spellcheck="false" placeholder="/artikel/eins&#10;/artikel/zwei&#10;https://other.example/artikel/drei"></textarea>
</label>
<div id="url-messages" class="messages" aria-live="polite"></div>
<div class="toolbar wrap">
<button type="button" id="generate">Kennzeichnungen erzeugen</button>
<button type="button" class="button subtle" id="clear-urls">URL-Liste leeren</button>
</div>
</section>
<section class="panel results-panel" id="results-section" aria-labelledby="results-title" hidden>
<div class="section-heading">
<p class="eyebrow">4 · Ausgabe</p>
<h2 id="results-title">Ergebnisse</h2>
<p id="result-summary"></p>
</div>
<div class="toolbar wrap export-buttons">
<button type="button" data-copy="html">Komplettes HTML kopieren</button>
<button type="button" class="button secondary" data-download="html">HTML + JSON-LD herunterladen</button>
<button type="button" data-copy="markdown">Markdown kopieren</button>
<button type="button" class="button secondary" data-download="markdown">Markdown herunterladen</button>
<button type="button" data-copy="json">JSON-LD kopieren</button>
<button type="button" class="button secondary" data-download="json">JSON-LD herunterladen</button>
<button type="button" class="button secondary" data-download="jsonl">JSONL herunterladen</button>
<button type="button" class="button secondary" data-download="csv">CSV herunterladen</button>
</div>
<p class="embed-note">Der HTML-Export ist die empfohlene Ein-Schritt-Integration: sichtbarer, tastaturerreichbarer Hinweis mit Text neben dem Badge plus eingebettetes JSON-LD. Die Vorschau unten zeigt genau diese sichtbare Kennzeichnung. Der Link „SVG (nur Grafik)“ dient nur zum separaten Abruf der Bilddatei und ist nicht die empfohlene alleinstehende Integration.</p>
<div class="result-table-wrap">
<table class="result-table">
<thead><tr><th>Inhalt</th><th>Kennzeichnung</th><th>Status</th><th>Links</th></tr></thead>
<tbody id="result-rows"></tbody>
</table>
</div>
<div class="output-grid">
<label>Komplettes HTML inkl. JSON-LD<textarea id="output-html" rows="12" readonly></textarea></label>
<label>Markdown<textarea id="output-markdown" rows="12" readonly></textarea></label>
<label>JSON-LD<textarea id="output-json" rows="12" readonly></textarea></label>
<label>CSV<textarea id="output-csv" rows="8" readonly></textarea></label>
</div>
</section>
<section class="panel compact-panel">
<h2>Was dieser Container bewusst nicht tut</h2>
<ul class="plain-list">
<li>keine Benutzerkonten und keine Datenbank</li>
<li>kein Crawling und kein Abruf der eingegebenen Inhalts-URLs</li>
<li>keine eigene rechtliche Entscheidungslogik</li>
<li>keine dauerhafte Speicherung von URL-Listen oder Ergebnissen</li>
</ul>
</section>
</main>
<footer>
<span>AI Disclosure Bulk · {{.Version}} · Core-Ausgabe über {{.DisclosureBaseURL}}</span>
<nav><a href="{{.DisclosureBaseURL}}/datenschutz">Datenschutz</a><a href="{{.DisclosureBaseURL}}/impressum">Impressum</a></nav>
</footer>
<script src="/static/bulk.js" defer></script>
</body>
</html>
{{end}}