{!! favicon_html() !!} @vite(['resources/css/app.css', 'resources/js/app.js']) @php // Highlighted headline fragment (rendered inside a coloured span). $headline = (string) ($cms['hero.headline'] ?? 'Nurturing Knowledge. Empowering Schools. Cultivating Futures.'); $highlight = (string) ($cms['hero.highlight'] ?? ''); $escapedHeadline = e($headline); if ($highlight !== '' && str_contains($headline, $highlight)) { $escapedHeadline = str_replace(e($highlight), ''.e($highlight).'', e($headline)); } // ----- Orbit layout ---------------------------------------------------- // Distribute orbit features across three concentric rings. $ringCapacity = [4, 8, 10]; $rings = []; $remaining = $orbitFeatures; $ringIndex = 0; foreach ($ringCapacity as $capacity) { $take = min($capacity, $remaining->count()); if ($take === 0) { continue; } $rings[] = [ 'n' => $ringIndex, 'count' => $take, 'items' => $remaining->take($take)->values(), ]; $remaining = $remaining->slice($take); $ringIndex++; if ($remaining->isEmpty()) { break; } } // Fall back to a single ring of the text-based CMS features when no // LandingFeature records exist (e.g. very early deployments). if ($rings === [] && isset($cms['features.list']) && count($cms['features.list']) > 0) { $slots = collect($cms['features.list'])->take(10)->map(fn ($f) => (object) [ 'title' => $f[0], 'description' => $f[1] ?? '', 'icon' => null, 'link' => null, ]); $rings = [[ 'n' => 0, 'count' => $slots->count(), 'items' => $slots, ]]; } $baseSpeed = max(30, (int) ($cms['hero.animation_speed'] ?? 70)); $ringDurations = [1.0, 1.35, 1.7]; $heroEnabled = ($cms['hero.enabled'] ?? '1') === '1'; $orbitEnabled = ($cms['hero.orbit_enabled'] ?? '1') === '1'; $animationEnabled = ($cms['hero.animation_enabled'] ?? '1') === '1'; $whatsappEnabled = ($cms['whatsapp.enabled'] ?? '0') === '1' && $whatsappUrl !== ''; $whatsappPosition = ($cms['whatsapp.position'] ?? 'bottom-right') === 'bottom-left' ? 'bottom-left' : 'bottom-right'; $whatsappShowLabel = ($cms['whatsapp.show_label'] ?? '1') === '1'; $statsEnabled = ($cms['stats.enabled'] ?? '0') === '1'; $statsItems = $cms['stats.items'] ?? []; $bannerEnabled = ($cms['banner.enabled'] ?? '0') === '1' && trim((string) ($cms['banner.text'] ?? '')) !== ''; $pricingEnabled = ($cms['pricing.enabled'] ?? '1') === '1'; $featureGridEnabled = ($cms['features.grid_enabled'] ?? '1') === '1'; $featuresSectionItems = $features->isNotEmpty() ? $features : collect($cms['features.list'] ?? []); // ----- Feature-section brand colours (admin-controlled, Pishon defaults) -- $featureDefaults = \App\Services\Platform\PlatformSettings::featureColorDefaults(); $featureVarMap = [ 'features.section_bg' => 'bg', 'features.heading_color' => 'heading', 'features.eyebrow_color' => 'eyebrow', 'features.subtitle_color' => 'subtitle', 'features.card_bg' => 'card-bg', 'features.card_title_color' => 'card-title', 'features.card_text_color' => 'card-text', 'features.icon_bg' => 'icon-bg', 'features.icon_color' => 'icon-color', 'features.border_color' => 'border', ]; $featureVars = []; foreach ($featureVarMap as $colorKey => $cssVar) { $featureVars['--fb-' . $cssVar] = \App\Services\Platform\PlatformSettings::hexColor( $cms[$colorKey] ?? null, $featureDefaults[$colorKey] ?? '#000000' ); } $featureStyle = implode('; ', array_map( fn ($name, $value) => $name . ': ' . $value, array_keys($featureVars), $featureVars )); $social = [ 'facebook' => (string) ($cms['social.facebook'] ?? ''), 'twitter' => (string) ($cms['social.twitter'] ?? ''), 'linkedin' => (string) ($cms['social.linkedin'] ?? ''), 'instagram' => (string) ($cms['social.instagram'] ?? ''), ]; $spotlightDefault = $orbitFeatures->firstWhere(fn ($f) => $f->is_highlighted) ?? $orbitFeatures->first(); @endphp {{-- Announcement banner --}} @if($bannerEnabled)
{{ $cms['banner.text'] }} @if(trim((string) ($cms['banner.link_text'] ?? '')) !== '') {{ $cms['banner.link_text'] }} @endif
@endif {{-- Navbar --}}
{{ config('app.name') }} logo {{ config('app.name') }}
@auth('platform') @else Get Started @endauth
@if($heroEnabled) {{-- Hero / School Management Orbit --}}
{{-- Ambient background --}}
{{-- Left: copy --}}
{{ $cms['hero.eyebrow'] ?? 'Now multi-tenant ready' }}

{!! $escapedHeadline !!}

{{ $cms['hero.subtitle'] ?? ':appName gives each school its own subdomain, public website, dashboards, portals and CMS — all managed from a single cloud.' }}

@if($statsEnabled && $statsItems->isNotEmpty())
@foreach($statsItems as $stat)
{{ is_array($stat) ? ($stat[1] ?? '') : '' }}
{{ is_array($stat) ? $stat[0] : '' }}
@endforeach
@endif
{{-- Right: School Management Orbit --}} @if($orbitEnabled && $rings !== [])
{{-- Feature spotlight (non-orbit users can read this) --}}
{{ $spotlightDefault->title ?? (config('app.name').' ') }} {{ $spotlightDefault->description ?? 'Every school-management capability in one secure platform.' }}
@else {{-- Fallback visual when the orbit is disabled --}}
{{ config('app.name') }} dashboard preview
@endif
@endif {{-- Trusted strip --}}

Homeroom

Admissions & records

Academics

Teaching & assessment

Finance

Fees & payments

Communication

Messages & announcements

@if($featureGridEnabled) {{-- Features --}}

Features

{{ $cms['features.headline'] ?? 'Everything a school needs' }}

{{ $cms['features.subtitle'] ?? 'Each tenant gets a complete, self-contained school system.' }}

@forelse($featuresSectionItems as $feature) @php $isRecord = is_object($feature) && method_exists($feature, 'iconSvg'); $title = $isRecord ? $feature->title : $feature[0]; $desc = $isRecord ? ($feature->description ?? '') : ($feature[1] ?? ''); $featureLink = $isRecord ? trim((string) ($feature->link ?? '')) : ''; $highlighted = $isRecord ? $feature->is_highlighted : false; @endphp @if($isRecord && $featureLink !== '') @else @endif @empty
Feature cards are being prepared.
@endforelse
@endif {{-- Solutions --}}

Solutions

Built for every member of the community

Four dedicated portals, one shared source of truth.

{{ config('app.name') }} portal preview
@php $roles = [ ['Admin', 'Run the whole school from a single dashboard — classes, staff, finance, website and reports.', 'bg-primary-50 text-primary-600'], ['Teacher', 'Plan lessons, take attendance, enter marks and publish result sheets in minutes.', 'bg-accent-50 text-accent-600'], ['Student', 'Check results, view timetables and stay on top of assignments and announcements.', 'bg-emerald-50 text-emerald-600'], ['Parent', 'Track fees, follow attendance and get result updates the moment they are published.', 'bg-indigo-50 text-indigo-600'], ]; @endphp @foreach($roles as [$role, $text, $chip])
{{ substr($role, 0, 1) }}

{{ $role }}

{{ $text }}

@endforeach
@if($pricingEnabled) {{-- Pricing --}}

Pricing

{{ $cms['pricing.headline'] ?? 'Simple, scalable pricing' }}

{{ $cms['pricing.subtitle'] ?? 'Start free, upgrade as your school grows.' }}

@php $popularIndex = (int) floor($plans->count() / 2); $trialDays = (int) ($cms['trial.duration_days'] ?? 14); $featureLabels = [ 'basic' => 'Full website & dashboard', 'academics' => 'Results & report cards', 'attendance' => 'Attendance tracking', 'fees' => 'Fees & payments', 'reports' => 'Administrative reports', 'cms' => 'Website content manager', 'communications' => 'Messages & announcements', 'admissions' => 'Online admissions', 'website' => 'Premium website theme', 'custom_domain' => 'Custom domain support', ]; @endphp @forelse($plans as $plan)
@if($loop->index === $popularIndex) Popular @endif

{{ $plan->name }}

{{ $plan->description }}

@if($plan->billingType() === 'trial') Free @elseif($plan->billingType() === 'per_student') ₦{{ number_format((float) ($plan->per_student_price ?? 0), 0) }} @else ₦{{ number_format($plan->price, 0) }} @endif

@if($plan->billingType() === 'trial') for {{ $trialDays }} days @elseif($plan->billingType() === 'per_student') per student / month @else per school / {{ $plan->billing_period === 'yearly' ? 'year' : 'month' }} @endif

  • Up to {{ number_format($plan->max_students) }} students
  • @foreach(($plan->features ?? []) as $feature) @if($feature === 'cbt') @continue @endif
  • {!! $featureLabels[$feature] ?? ucwords(str_replace('_', ' ', $feature)) !!}
  • @endforeach
Get started
@empty

Our pricing plans are being prepared. Create your school to get started.

@endforelse
@endif {{-- About --}}

About

{{ $cms['about.headline'] ?? ('About '.config('app.name')) }}

{{ $cms['about.body'] ?? (config('app.name').' is a modern multi-tenant school platform built for schools, teachers, students and parents. It brings the public website, management dashboard and all portals together in one secure place — so every member of the school community stays connected.') }}

Start your school on {{ config('app.name') }}
{{ config('app.name') }} platform preview
{{-- CTA --}}

{{ $cms['cta.headline'] ?? 'Ready to simplify your school?' }}

{{ $cms['cta.subtitle'] ?? 'Launch your school website, dashboards and portals on '.config('app.name').' in minutes — no setup fees, no tech team.' }}

{{-- Contact --}}

Contact

Get in touch

Questions about the platform? We're here to help.

@if(trim((string) ($cms['contact.phone'] ?? '')) !== '' || trim((string) ($cms['contact.address'] ?? '')) !== '')
@if(trim((string) ($cms['contact.phone'] ?? '')) !== '')

{{ $cms['contact.phone'] }}

@endif @if(trim((string) ($cms['contact.address'] ?? '')) !== '')

{{ $cms['contact.address'] }}

@endif
@endif
{{-- Footer --}} {{-- WhatsApp floating button --}} @if($whatsappEnabled)
@if($whatsappShowLabel && trim((string) ($cms['whatsapp.greeting'] ?? '')) !== '') @endif {{ $cms['whatsapp.label'] ?? 'Chat with us' }}
@endif