{{ __('Loading...') }}
{{ __('Saving Changes...') }}
{{ __('Updating systems config, please wait') }}
{{ __('Main Site Setup') }}

{{ __('Master Setup Control Center') }}

{{ __('Manage global settings, layouts, theme customization, payment APIs, and dynamic landing page content.') }}

@php $tabErrorKeys = [ 'identity' => ['data.site_name', 'data.portal_name', 'data.site_title', 'data.site_description', 'data.site_keywords', 'data.site_author', 'data.site_logo', 'data.site_icon', 'data.site_favicon'], 'theme' => ['data.portal_theme_preset', 'data.theme_name', 'data.theme_primary_color', 'data.theme_accent_color', 'data.theme_font_family', 'data.theme_mode', 'data.theme_section_height', 'data.portal_primary_color', 'data.portal_accent_color'], 'contact' => ['data.site_email', 'data.site_phone', 'data.site_address', 'data.site_map', 'data.site_whatsapp', 'data.site_facebook', 'data.site_twitter', 'data.site_instagram', 'data.site_linkedin', 'data.site_youtube', 'data.site_pinterest'], 'billing' => ['data.site_invoice_prefix', 'data.customer_id_prefix', 'data.site_invoice_color', 'data.site_invoice_footer', 'data.site_invoice_notes', 'data.site_invoice_terms', 'data.site_invoice_logo', 'data.site_invoice_signature'], 'payment' => ['data.payment_mpesa_enabled', 'data.payment_mpesa_sandbox', 'data.payment_mpesa_consumer_key', 'data.payment_mpesa_consumer_secret', 'data.payment_mpesa_shortcode', 'data.payment_mpesa_passkey', 'data.payment_mpesa_party_b', 'data.payment_mpesa_transaction_type', 'data.payment_mpesa_account_reference'], 'security' => ['data.site_secret_key', 'data.site_secret_value', 'data.site_secret_validity', 'data.site_secret_url', 'data.site_secret_email'], 'content' => ['data.hero_title', 'data.hero_subtitle', 'data.hero_button_text', 'data.hero_button_link', 'data.registration_link', 'data.about_title', 'data.about_body', 'data.packages_section_title', 'data.testimonial_title', 'data.footer_copyright'], 'logs' => ['data.mysql_binary_path', 'data.log_server_enabled', 'data.log_server_routers', 'data.log_retention_days'] ]; $hasTabError = function($tab) use ($errors, $tabErrorKeys) { if (!isset($tabErrorKeys[$tab])) return false; foreach ($tabErrorKeys[$tab] as $key) { $rawKey = str_replace('data.', '', $key); if ($errors->has($key) || $errors->has($rawKey)) return true; } return false; }; @endphp
@if ($errors->any())
{{ __('Settings Validation Failed') }}

{{ __('Some fields are invalid. Please check the tabs marked with a red dot and correct the errors listed below:') }}

    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif
{{ __('Core Brand Identity') }}
@error('data.site_name') {{ $message }} @enderror
@error('data.portal_name') {{ $message }} @enderror
{{ __('This appears in the browser tab and search results.') }}
@error('data.site_locale') {{ $message }} @enderror
@error('data.main_site_locale') {{ $message }} @enderror
{{ __('Block public website access and show a template warning.') }}
{{ __('Portal Access Settings') }}
{{ __('Allow new signups on portal') }}
{{ __('Allow clients to modify their passwords') }}
{{ __('Brand Assets & Media') }}
{{ $this->form->getComponent('site_logo') }}
{{ $this->form->getComponent('site_icon') }}
{{ $this->form->getComponent('site_favicon') }}
{{ __('Search Engine Optimization (SEO)') }}
{{ __('Separate with commas.') }}
{{-- ── HEADER ── --}}
{{ __('Theme & Color Settings') }}
{{-- ── SECTION 1: CUSTOMER PORTAL ── --}}
{{ __('Customer Portal Theme') }}
{{ __('Controls the color of the customer portal login page and dashboard.') }}
{{-- Custom Portal Color Pickers (only shown when "custom" selected) --}}
{{-- ── SECTION 2: MAIN SITE ── --}}
{{ __('Main Site (Landing Page) Customization') }}
{{-- Theme Preset Selector + Live Color Preview --}}
{{-- Inline Color Dots (hidden for custom) --}}
{{ __('Select a preset or choose Custom to set your own colors.') }}
{{-- Custom Color Pickers — inside same x-data scope so siteTheme is accessible --}} {{-- Font, Dark Mode, Section Height --}}
{{ __('Overrides the default body background/text.') }}
{{ __('Controls the minimum height of all main sections.') }}
{{-- end x-data --}}
{{ __('Office Contact Info') }}
@error('data.site_phone') {{ $message }} @enderror
{{ __('Social Media Links') }}
{{ __('Currency & Global Controls') }}
@error('data.customer_id_prefix') {{ $message }} @enderror
{{ __('Maximum unpaid dues allowed before automatic disable.') }}
{{ __('Dues past invoice date before automatic disable.') }}
{{ __('Mikrotik redirection profile for expired users.') }}
{{ __('Invoice Document Layout Design') }}
{{ $this->form->getComponent('site_invoice_logo') }}
{{ $this->form->getComponent('site_invoice_signature') }}
{{ $data['site_invoice_color'] ?? '#000000' }}
{{ $this->form->getComponent('site_invoice_terms') }}
{{ __('M-Pesa — Lipa na M-Pesa Online (STK Push)') }}

{{ __('Safaricom Daraja credentials. Customers are prompted on their handset and the payment is confirmed automatically.') }}

{{ __('Head office / store number used to sign the request.') }}
{{ __('The number funds actually settle to. Required for Buy Goods.') }}
{{ __('Shown on the customer prompt. Max 12 characters. Customer account numbers override this per payment.') }}
{{ __('Use the Daraja sandbox endpoint instead of live.') }}
@php // Always show the portal host: that is what the app sends to // Daraja at STK push time, regardless of which panel you are on. $mpesaCallbackUrl = 'https://portal.' . (parse_url(config('app.url'), PHP_URL_HOST) ?: config('app.url')) . '/api/payment/mpesa/callback'; @endphp
{{ __('Callback URL') }}
{{ $mpesaCallbackUrl }}
{{ __('Register this exact URL on your Daraja app. It must be publicly reachable over HTTPS — Safaricom cannot post to a .test or localhost address.') }}
{{ __('Site Secret Credentials') }}

{{ __("System-wide credentials used for machine-to-machine integrations, remote server sync, and verifying third-party webhook callbacks (e.g., payment status updates). For standard client-level or user integrations, please utilize Jetstream's built-in personal API tokens instead.") }}

{{ __('Local System Database Binary Path') }}
{{ __('Must include a trailing slash! Required if database backup fails due to missing command in server PATH env.') }}
{{ __('MikroTik Logger Operations') }}
{{ __('Enable log daemon listener on background worker') }}
{{ __('Logs older than this threshold will be deleted automatically.') }}
{{ $this->form->getComponent('log_server_routers') }}
@include('livewire.mikrotik.log-stats-embed')
{{ __('Landing Page Hero Panel') }}
{{ __('Company Modules & Services') }}
{{ __('Show/Hide public frontend site') }}
{{ __('Footer Section Layout') }}
{{-- Filament-managed repeaters & BTCL PDF upload - rendered as a full form for proper Alpine.js context --}}
{{ $this->contentForm }}
{{ __('Router Log Data Archive') }}
@include('livewire.mikrotik.log-table-master-embed')
{{ __('System database Snapshots') }}
@include('livewire.mikrotik.system-utilities-embed')