@php $busy = 'search,gotoPage,previousPage,nextPage,addWord,removeWord'; @endphp
{{-- KPI strip --}}
{{ number_format($counts['total']) }}Words
{{ number_format($counts['seed']) }}Seed (locked)
{{ number_format($counts['added']) }}Admin-added
{{-- ===== Left: add + list ===== --}}
Add a word
@error('newWord')

{{ $message }}

@enderror
Add

Applied whole-word in messages/stories and as a substring (leet-aware) in usernames. Takes effect immediately.

Blocked words {{ number_format($terms->total()) }} {{ \Illuminate\Support\Str::plural('word', $terms->total()) }}
@forelse ($terms as $t) @empty @endforelse
WordOriginAdded
{{ $t->word }} @if ($t->created_by === null) Seed @else {{ $authors[$t->created_by] ?? 'Admin' }} @endif {{ $t->created_at?->format('d M Y') ?: '—' }} @if ($canRemove && $t->created_by !== null) @elseif ($t->created_by === null) @endif
No words match
Nothing matches your search.
@if ($terms->hasPages())
Showing {{ $terms->firstItem() }}–{{ $terms->lastItem() }} of {{ number_format($terms->total()) }}
@endif
{{-- ===== Right: test the filter ===== --}}
Test the filter

See exactly what the current list does. Nothing is saved.

@if ($test['text'])
@if ($test['text']['modified'])
Cleaned: {{ $test['text']['cleaned'] !== '' ? $test['text']['cleaned'] : '—' }}
Removed: {{ implode(', ', $test['text']['terms']) }}
@else Clean — nothing removed. @endif
@endif
@if ($test['username'])
@if ($test['username']['allowed']) Allowed. @else Rejected — matched {{ implode(', ', $test['username']['matches']) }} @endif
@endif