{{-- 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') }}

@error('billingAddress')

{{ $message }}

@enderror
{{ __('settings.save') }}
{{-- Beside the form rather than inside it: it is one question, it decides the fourteen-day right of withdrawal and whether reverse charge can ever apply, and people mistake it for the VAT field when the two sit in the same row. Nothing is preselected for a customer nobody has asked yet. --}}
{{ __('settings.customer_type') }}
@foreach ($customerTypes as $type) @endforeach

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

@error('customerType')

{{ $message }}

@enderror
@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

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