{{-- The customer's own settings. It was one column 768 pixels wide inside a 1240-pixel shell — a third of the window empty beside it — holding everything a customer might ever change: the company address, the password, two-factor, the signed-in devices, the branding, the contract and the button that closes the account. Two thousand pixels of scroll, and the way to a particular thing was knowing how far down it lived. Four tabs, by what somebody came to do. Inside a tab the short cards sit side by side instead of each taking a full row to hold three lines. The choice is in the query string (see the #[Url] attribute on the component), so a reload, a bookmark and the back button all land where they were. --}}

{{ __('settings.eyebrow') }}

{{ __('settings.title') }}

{{ __('settings.subtitle') }}

{{-- The same tab bar the console uses, so one vocabulary holds on both sides of the login. --}}
@foreach ($tabs as $name) @endforeach
{{-- ── Ihre Daten ───────────────────────────────────────────────────── --}} @if ($tab === 'profile')

{{ __('settings.company_title') }}

{{ __('settings.company_sub') }}

{{-- Field by field, not a paragraph: what landed in the textarea was whatever somebody typed — a postcode on the street line, a city with no postcode, no country at all — and an invoice has to name its recipient precisely enough to be a document. Postcode and town share a row because that is how they are read and written. --}}

{{ __('settings.billing_address') }}

{{ __('settings.save') }}
{{-- Beside the form, and for a record that has one it is a FACT rather than a field. It decides the fourteen-day right of withdrawal: a business able to set itself to "Privatperson" here is a business able to withdraw from a contract it may not withdraw from. Registration asks the question; this page reports the answer. The lock is in Settings::saveProfile, not here — a form that only hides a control has never stopped anybody who can post to /livewire/update. A record created before the question existed has no answer yet, and may be given one here, once. --}}

{{ __('settings.customer_type') }}

@if ($customer?->customer_type)

{{ __('settings.customer_type_'.$customer->customer_type) }}

{{ __('settings.customer_type_locked') }}

@else
@foreach ($customerTypes as $type) @endforeach

{{ __('settings.customer_type_once') }}

@error('customerType')

{{ $message }}

@enderror @endif
@endif {{-- ── Sicherheit ───────────────────────────────────────────────────── --}} @if ($tab === 'security')
{{-- Own password. There was no way to change one at all — Fortify's updatePasswords feature was switched off. --}}

{{ __('admin_settings.password_title') }}

{{ __('admin_settings.password_sub') }}

{{ __('admin_settings.password_save') }}
{{-- Two-factor. Every action is re-checked server-side against a recent password confirmation — hiding the buttons stops nobody who can post to /livewire/update. --}}

{{ __('settings.twofa_title') }}

{{ $twoFactorOn ? __('settings.twofa_state_on') : __('settings.twofa_state_off') }}

{{ __('settings.twofa_sub') }}

@if (! $passwordConfirmed) {{-- The gate. A signed-in session is not enough to change how the account is protected — the risk is an unlocked machine. --}}

{{ __('settings.twofa_confirm_first') }}

{{ __('settings.twofa_confirm_button') }}
@elseif ($twoFactorOn)
{{ __('settings.twofa_new_codes') }} {{ __('settings.twofa_disable') }}
@elseif ($twoFactorPending)
{!! $twoFactorQr !!}

{{ __('settings.twofa_scan') }}

{{ __('settings.twofa_activate') }}
@else {{ __('settings.twofa_enable') }} @endif @if ($recoveryCodes) {{-- Shown once, on purpose: nobody writes down what they were never shown, and these are the way back in when the phone is gone. --}}

{{ __('settings.twofa_codes_title') }}

{{ __('settings.twofa_codes_hint') }}

    @foreach ($recoveryCodes as $code)
  • {{ $code }}
  • @endforeach
@endif
{{-- Under both, across the width: it answers the same question they do — who can get into this account — and it is a table. --}}
@livewire('sessions')
@endif {{-- ── Erscheinungsbild ─────────────────────────────────────────────── --}} @if ($tab === 'branding')

{{ __('settings.branding_title') }}

{{ __('settings.branding_sub') }}

@error('brandPrimary')

{{ $message }}

@enderror
@error('brandAccent')

{{ $message }}

@enderror
{{ __('settings.save') }}
@if ($logo) @elseif ($logoUrl) @else {{ __('settings.brand_default') }} @endif

{{ __('settings.brand_logo_hint') }}

@if ($logoUrl) @endif @error('logo')

{{ $message }}

@enderror @if ($branding['is_default'] ?? false)

{{ __('settings.brand_using_default') }}

@endif
@endif {{-- ── Vertrag ──────────────────────────────────────────────────────── --}} @if ($tab === 'contract')

{{ __('settings.package_title') }}

@if ($cancellationScheduled)

{{ __('settings.cancel_scheduled_title') }}

{{ __('settings.cancel_scheduled_body', ['date' => $instance?->service_ends_at?->local()->isoFormat('LL')]) }}

@elseif ($hasActivePackage)

{{ __('settings.package_active', ['plan' => $instance ? __('billing.plan.'.$instance->plan) : '—']) }}

{{ __('settings.cancel_cta') }}
@else

{{ __('settings.no_package') }}

@endif {{-- The fourteen-day right of withdrawal. Shown only where it exists: a business customer has none and never sees this block — and the server refuses them again in Settings::withdraw(), because a card that is not rendered has never stopped anybody who can post to /livewire/update. Separate from the cancellation above it, and not a variant of it. A cancellation ends a contract that was validly concluded and keeps the term the customer paid for; a withdrawal unwinds the contract itself, ends the service the same day and sends the money back. --}} @if ($withdrawal->applies && $withdrawal->open)

{{ __('withdrawal.card_title') }}

{{ __('withdrawal.card_sub', [ 'date' => $withdrawal->endsAt->local()->isoFormat('LL'), 'days' => $withdrawal->daysLeft(), ]) }}

{{ __('withdrawal.cta') }}
@endif
{{-- ── AV-Vertrag & TOM ────────────────────────────────────── Art. 28(3) DSGVO wants a contract wherever personal data is processed on somebody else's behalf, which is the whole of what this product does. "In writing" there includes electronic form, so the document plus a recorded acceptance is enough — and the customer needs to be able to READ it without asking us for it, because that is what the website promises. Nothing renders until an operator has published a version: a card offering an agreement that does not exist would be worse than the silence. --}} @if ($dpa !== null)

{{ __('dpa.title') }}

{{ __('dpa.sub') }}

@if ($dpaAcceptance) {{ __('dpa.state_accepted') }} @else {{ __('dpa.state_open') }} @endif
{{ __('dpa.read_agreement') }} @if ($dpa->measures_path) {{ __('dpa.read_measures') }} @endif {{ __('dpa.version', ['version' => $dpa->version]) }}
@if ($dpaAcceptance) {{-- What was agreed, when, and by whom — the same three facts the register holds. R19: stored in UTC, read on the wall clock. --}}

{{ __('dpa.accepted_on', [ 'version' => $dpa->version, 'when' => $dpaAcceptance->accepted_at->local()->isoFormat('LL, LT'), ]) }}

@else

{{ __('dpa.accept_hint') }}

{{ __('dpa.accept_cta') }}
@endif
@endif

{{ __('settings.close_account_title') }}

{{ __('settings.close_account_sub') }}

{{ __('settings.close_cta') }}
{{-- The deadlines, said where somebody asks the question. "Nach fünf Tagen gelöscht" on the verification page reads as if it applied to every account; it applies to a registration nobody confirmed. The other rule — a year without a package — was nowhere at all. Both come from the commands that enforce them, so the page cannot drift from what actually happens. --}}

{{ __('settings.lifecycle_title') }}

  • {{ __('settings.lifecycle_unverified', ['days' => App\Console\Commands\PruneUnverifiedAccounts::AFTER_DAYS]) }}
  • {{ __('settings.lifecycle_dormant', ['warn' => App\Console\Commands\PruneDormantAccounts::WARN_DAYS_BEFORE]) }}
  • {{ __('settings.lifecycle_kept') }}
{{ __('settings.lifecycle_terms') }}
@endif