{{-- 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 ──────────────────────────────────────────────────────── --}} {{-- ── Vertrag ────────────────────────────────────────────────────── One column of full-width sections, not a two-column grid with one card spanning both: that produced a short box, a wide one, then a short one again — a staircase with no rhythm to it. Each section here has the same shape (a header row, then its body), so the eye can run down the page instead of tracking sideways. --}} @if ($tab === 'contract')
{{-- Package, cancellation and — while it is open — the withdrawal. --}}

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

@if ($cancellationScheduled) {{ __('settings.cancel_scheduled_title') }} @elseif ($hasActivePackage) {{ __('settings.package_active', ['plan' => $instance ? __('billing.plan.'.$instance->plan) : '—']) }} @else {{ __('settings.no_package') }} @endif

@if ($hasActivePackage && ! $cancellationScheduled) {{ __('settings.cancel_cta') }} @endif
@if ($cancellationScheduled)

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

@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 DSGVO wants a contract wherever personal data is processed on somebody else's behalf. It is concluded WITH the terms at checkout (see the AGB), so this is not a second signing ceremony: the document has to be available, current, and retrievable. An extra confirmation is offered because some customers — a practice, a firm, anybody who gets audited — want one on file, and it costs a click. Nothing renders until an operator has published a version. --}} @if ($dpa !== null)

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

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

{{ __('dpa.version', ['version' => $dpa->version]) }}
{{ __('dpa.read_agreement') }} @if ($dpa->measures_path) {{ __('dpa.read_measures') }} @endif {{-- Keep, not just read: the file carries the version in its name, so which fassung applied is answerable from a downloads folder months later. --}} {{ __('dpa.download_agreement') }} @if ($dpa->measures_path) {{ __('dpa.download_measures') }} @endif
@if ($dpaAcceptance) {{-- 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.in_force_note') }}

{{ __('dpa.accept_cta') }}
@endif
@endif {{-- Closing the account, and the deadlines that close one by itself. --}}

{{ __('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