250 lines
12 KiB
HTML
250 lines
12 KiB
HTML
{{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 /artikel/zwei 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}}
|