{{-- The customer's own settings. ## What was wrong, three times over First it was one column 768px wide in a 1240px shell, holding everything a customer might ever change, two thousand pixels deep. Then it became four tabs — better — but the cards inside them were still boxes of different heights in a grid, which on the contract tab produced a short one, a wide one and a short one again: a staircase with no rhythm and half the width empty beside it. ## What it is now Panels and rows (x-ui.panel, x-ui.row). A group is a card with a header that names it; a setting is a ROW inside that card — what it is on the left, the control on the right, dividers between. That is the shape every settings page worth copying uses, and it is the shape that uses the width: a label column of 280px with the control beside it fills the line, where a stack of full-width inputs leaves two thirds of it empty. Below `sm` the rows stack, because on a telephone a label belongs above its field. --}}

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

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

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

{{-- The same tab bar the console uses, so one vocabulary holds on both sides of the login. The choice lives in the query string — see the #[Url] attribute on the component. --}}
@foreach ($tabs as $name) @endforeach
{{-- ══ Ihre Daten ═══════════════════════════════════════════════════════ --}} @if ($tab === 'profile')
{{-- Field by field, not a paragraph: what landed in the textarea was whatever somebody typed — a postcode on the street line, a town with no postcode, no country at all — and an invoice has to name its recipient precisely enough to be a document. --}}
{{-- A FACT for a record that has one. 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; this page reports. 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. --}} @if ($customer?->customer_type)

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

@else
@foreach ($customerTypes as $type) @endforeach
@error('customerType')

{{ $message }}

@enderror @endif
{{ __('settings.save') }}
@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_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_button') }}
@elseif ($twoFactorOn)
{{ __('settings.twofa_new_codes') }} {{ __('settings.twofa_disable') }}
@elseif ($twoFactorPending)
{!! $twoFactorQr !!}
{{ __('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. --}}
    @foreach ($recoveryCodes as $code)
  • {{ $code }}
  • @endforeach
@endif
{{-- The devices. It answers the same question two-factor does — who can get into this account — and it is a table of its own. --}} @livewire('sessions')
@endif {{-- ══ Erscheinungsbild ═════════════════════════════════════════════════ --}} @if ($tab === 'branding')
@error('brandPrimary')

{{ $message }}

@enderror
@error('brandAccent')

{{ $message }}

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

{{ $message }}

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

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

@endif {{ __('settings.save') }}
@endif {{-- ══ Vertrag ══════════════════════════════════════════════════════════ --}} @if ($tab === 'contract')
{{-- The package, and the way out of it. --}}

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

@if ($hasActivePackage && ! $cancellationScheduled) {{ __('settings.cancel_cta') }} @elseif (! $hasActivePackage && ! $cancellationScheduled) {{ __('settings.to_packages') }} @endif
{{-- ── Das Widerrufsrecht ──────────────────────────────────── Shown to every CONSUMER with a contract, open or not — not only while it is open. It vanished entirely once the fourteen days ran out, which is indistinguishable from a feature that was never built: the owner went looking for it and reported it missing from an account that has no contract at all, so there was nothing for it to be about. A business never sees it, and the server refuses them again in Settings::withdraw() — a card that is not rendered has never stopped anybody who can post to /livewire/update. Not a variant of the cancellation above: that one ends a contract validly concluded and keeps the term already paid for; this one unwinds the contract, ends the service the same day and sends the whole amount back. --}} @if ($withdrawal->applies)

@if ($withdrawal->open) {{ __('withdrawal.card_sub', [ 'date' => $withdrawal->endsAt->local()->isoFormat('LL'), 'days' => $withdrawal->daysLeft(), ]) }} @else {{ $withdrawal->refusal }} @endif

@if ($withdrawal->open) {{ __('withdrawal.cta') }} @endif
@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. The extra confirmation is offered because a practice or a firm that gets audited often wants one on file. Nothing renders until an operator has published a version. --}} @if ($dpa !== null)
{{ __('dpa.read_agreement') }} {{ __('dpa.download') }} @if ($dpa->measures_path) {{ __('dpa.read_measures') }} {{ __('dpa.download') }} @endif {{ __('dpa.version', ['version' => $dpa->version]) }}
@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. Last row of the panel, where the irreversible things belong. --}}
{{ __('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_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