KI-Kennzeichnung (Art. 50 KI-VO): Pflicht-Deklaration für Text & Bilder

Selbstdeklaration des KI-Einsatzes je PM (Text) und je Bild inkl.
Submit-Gate im PressReleaseService, versioniertem Audit-Trail
(press_release_ai_declarations) und öffentlichem KI-Label in
Einreicher-Stimme. Bestätigung im Submit-Modal ist Pflicht.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-07-09 13:54:43 +00:00
parent 74e82eb643
commit 807fbc1b80
16 changed files with 833 additions and 3 deletions

View file

@ -62,7 +62,7 @@
</div>
</div>
@else
<div class="space-y-5" x-data="{ agb: false, images: false, contact: false, waiver: false }">
<div class="space-y-5" x-data="{ agb: false, images: false, contact: false, waiver: false, ai: false }">
<div>
<flux:text class="eyebrow muted">{{ __('Veröffentlichung') }}</flux:text>
<flux:heading size="lg">{{ __('Pressemitteilung zur Prüfung einreichen') }}</flux:heading>
@ -104,13 +104,40 @@
</article>
@endif
{{-- KI-Kennzeichnung (Art. 50 KI-VO, Decision-Update 08.07.2026):
Pflicht-Selbstdeklaration in jedem Veröffentlichungsprozess.
Die Eltern-Komponente stellt die Properties über den Trait
App\Livewire\Concerns\InteractsWithAiDeclaration bereit. --}}
<article class="panel overflow-hidden">
<div class="panel-head" style="padding:10px 16px;">
<span class="section-eyebrow">
{{ __('KI-Kennzeichnung') }}
<span class="text-[color:var(--color-err)]">*</span>
</span>
</div>
<div class="p-4 space-y-3">
<p class="m-0 text-[12.5px] leading-[1.6] text-[color:var(--color-ink-2)]">
{{ __('Wie wurde der Text dieser Pressemitteilung erstellt? Diese Angabe ist gesetzlich verpflichtend (Art. 50 KI-VO).') }}
</p>
<flux:radio.group wire:model="aiTextDeclaration">
@foreach (\App\Enums\AiTextDeclaration::cases() as $aiOption)
<flux:radio :value="$aiOption->value" :label="$aiOption->label()" />
@endforeach
</flux:radio.group>
<flux:error name="aiTextDeclaration" />
<p class="m-0 pt-2 border-t border-[color:var(--color-bg-rule)] text-[11.5px] leading-[1.5] text-[color:var(--color-ink-3)]">
{{ __('Bei überwiegend oder vollständig KI-generierten Texten erscheint an der Veröffentlichung ein neutraler Hinweis in Ihrer Stimme („Nach Angaben des einreichenden Unternehmens …"). KI-generierte oder KI-bearbeitete Bilder kennzeichnen Sie direkt beim Bild-Upload.') }}
</p>
</div>
</article>
{{-- Bestätigungen — Flux-Switches (Einheitlichkeit, 12.06.2026);
der Alpine-State steuert weiterhin den Bestätigen-Button. --}}
<article class="panel overflow-hidden">
<div class="panel-head" style="padding:10px 16px;">
<span class="section-eyebrow">{{ __('Ihre Bestätigungen') }}</span>
<span class="shrink-0 whitespace-nowrap text-[11.5px] tabular-nums text-[color:var(--color-ink-3)]"
x-text="[agb, images, contact, waiver].filter(Boolean).length + ' / 4'"></span>
x-text="[agb, images, contact, waiver, ai].filter(Boolean).length + ' / 5'"></span>
</div>
<div class="divide-y divide-[color:var(--color-bg-rule)]">
<div class="px-4 py-3">
@ -145,6 +172,18 @@
:label="__('Mir ist bekannt, dass veröffentlichte Pressemitteilungen dauerhaft archiviert werden; eine spätere Entfernung ist nur als kostenpflichtige Serviceleistung möglich (gesetzliche Ansprüche bleiben unberührt).')"
/>
</div>
{{-- Verbindliche KI-Bestätigung (Art. 50 KI-VO): wire-gebunden,
weil der Bestätigungszeitpunkt zur Nachweisbarkeit im
Audit-Trail persistiert wird. --}}
<div class="px-4 py-3">
<flux:switch
align="left"
wire:model="aiDeclarationConfirmed"
x-on:change="ai = $event.target.checked"
:label="__('Ich bestätige, dass meine Angaben zum Einsatz generativer KI vollständig und wahrheitsgemäß sind.')"
/>
<flux:error name="aiDeclarationConfirmed" />
</div>
</div>
</article>
@ -154,7 +193,7 @@
</flux:modal.close>
<flux:button variant="primary" wire:click="{{ $action }}"
wire:loading.attr="disabled"
x-bind:disabled="! (agb && images && contact && waiver)">
x-bind:disabled="! (agb && images && contact && waiver && ai)">
{{ $confirmLabel ?? __('Veröffentlichung anfordern') }}
</flux:button>
</div>