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:
parent
1822dcbcd1
commit
c387048d7e
16 changed files with 833 additions and 3 deletions
17
resources/views/components/portal/ai-public-label.blade.php
Normal file
17
resources/views/components/portal/ai-public-label.blade.php
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{{--
|
||||
Öffentliches KI-Label (Art. 50 KI-VO) in Einreicher-Stimme.
|
||||
|
||||
Neutrales ℹ-Icon, bewusst KEIN grünes Häkchen — das würde als redaktionelle
|
||||
Prüfung/Freigabe durch das Portal gelesen. Rendert nichts, wenn kein
|
||||
Pflicht-Label fällig ist (label = null).
|
||||
|
||||
Verwendung: <x-portal.ai-public-label :label="$pr->aiTextPublicLabel()" />
|
||||
--}}
|
||||
@props(['label'])
|
||||
|
||||
@if ($label)
|
||||
<div {{ $attributes->merge(['class' => 'flex items-start gap-2 rounded-[4px] border border-[color:var(--color-bg-rule)] bg-[color:var(--color-bg-elev)] px-3 py-2.5 text-[12px] leading-[1.5] text-[color:var(--color-ink-2)]']) }}>
|
||||
<flux:icon name="information-circle" variant="mini" class="size-4 shrink-0 mt-0.5 text-[color:var(--color-ink-3)]" />
|
||||
<span>{{ $label }}</span>
|
||||
</div>
|
||||
@endif
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -463,8 +463,16 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends
|
|||
<article class="panel">
|
||||
<div class="panel-head">
|
||||
<span class="section-eyebrow">{{ __('Inhalt') }}</span>
|
||||
@if ($pr->ai_text_declaration)
|
||||
<span class="text-[11px] text-[color:var(--color-ink-3)]">
|
||||
{{ __('KI-Deklaration:') }} {{ $pr->ai_text_declaration->label() }}
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="p-5">
|
||||
{{-- KI-Label (Art. 50 KI-VO): erscheint so auch in der
|
||||
Veröffentlichung — am Anfang des Inhalts, in Einreicher-Stimme. --}}
|
||||
<x-portal.ai-public-label :label="$pr->aiTextPublicLabel()" class="mb-4 max-w-[760px]" />
|
||||
<div class="pr-content max-w-[760px]">
|
||||
{!! $pr->renderedText() !!}
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue