@extends('layouts.app') @php $countryTranslation = $user->country?->translations?->firstWhere('locale', app()->getLocale()) ?? $user->country?->translations?->firstWhere('locale', 'en'); $countryName = $countryTranslation?->name ?: $user->country?->official_name; $displayName = '@'.$user->username; $rankingMetrics = [ 'xp' => '✦', 'coasters' => '🎢', 'parks' => '🎡', 'badges' => '🏅', 'challenges' => '🏆', ]; @endphp @section('title', $displayName.' — Coaster World') @section('content')
{{ mb_strtoupper(mb_substr($user->username, 0, 1)) }}
{{ __('ui.public_profile_v2_kicker') }}

{{ $displayName }}

{{ __('ui.public_profile_v2_intro') }}

@if($countryName)@endif {{ __('ui.profile_member_since', ['year' => $user->created_at?->format('Y')]) }} {{ __('ui.public_profile_visibility_label') }}: {{ __('ui.public_profile_visibility_'.$profileVisibility) }}
{{ __('ui.progression_explorer_rank_'.$explorerRankKey) }} {{ __('ui.progression_level', ['level' => $explorerLevel]) }} {{ number_format($totalXp, 0, ',', ' ') }} XP @if($isFriend)✓ {{ __('ui.friends_state_friends') }}@endif
@if($isOwner) {{ __('ui.public_profile_back_private') }} @endif @if($friendState === 'available')
@csrf
@endif @if($friendState === 'friends') ✓ {{ __('ui.friends_state_friends') }} @endif @if($friendState === 'outgoing') {{ __('ui.friends_state_sent') }} @endif @if($friendState === 'incoming') {{ __('ui.public_profile_friend_request_received') }} @endif @if($friendState === 'closed') {{ __('ui.friends_state_closed') }} @endif @if($canSafetyActions) @endif
@if(session('friend_status'))
✓ {{ session('friend_status') }}
@endif @if(session('friend_error'))
{{ session('friend_error') }}
@endif @if(session('social_report_status'))
✓ {{ session('social_report_status') }}
@endif
{{ $visitedParks->count() }}{{ __('ui.profile_parks') }}
{{ $coasterRides->count() }}{{ __('ui.profile_coasters') }}
{{ $countries->count() }}{{ __('ui.profile_countries') }}
{{ $achievementCount }}{{ __('ui.progression_hub_badges') }}
{{ $challengeCount }}{{ __('ui.progression_hub_challenges') }}
{{ $roadTripCount }}{{ __('ui.road_trips_nav') }}
{{ __('ui.public_profile_season_kicker') }}

{{ __('ui.public_profile_season_title', ['year' => $seasonYear]) }}

{{ $seasonYear }}

{{ __('ui.public_profile_season_intro') }}

🎢{{ $seasonCoasters }}{{ __('ui.profile_coasters') }}
🎡{{ $seasonParks }}{{ __('ui.profile_parks') }}
🎟️{{ $seasonRides->count() }}{{ __('ui.public_profile_rides_count') }}
🏆{{ $seasonChallenges }}{{ __('ui.progression_hub_challenges') }}
{{ number_format($seasonXp, 0, ',', ' ') }}{{ __('ui.public_profile_xp_this_year') }}
{{ __('ui.public_profile_passport_kicker') }}

{{ __('ui.public_profile_passport_title') }}

{{ $explorerLevel }}

{{ __('ui.public_profile_passport_intro') }}

{{ __('ui.progression_explorer_rank_'.$explorerRankKey) }} {{ number_format($totalXp, 0, ',', ' ') }} / {{ number_format($explorerNextLevelXp, 0, ',', ' ') }} XP
{{ __('ui.public_profile_level_progress', ['percent' => $explorerLevelPercent]) }}
@if($rankingPositions)
{{ __('ui.public_profile_rankings_kicker') }}

{{ __('ui.public_profile_rankings_title') }}

{{ __('ui.public_profile_rankings_intro', ['count' => $communityRanking['eligibleCount'] ?? 0]) }}

@auth {{ __('ui.rankings_nav') }} @endauth
@foreach($rankingMetrics as $metric => $icon)
{{ $icon }} {{ __('ui.rankings_metric_'.$metric) }} @if(data_get($rankingPositions, $metric.'.position')) #{{ number_format((int) data_get($rankingPositions, $metric.'.position'), 0, ',', ' ') }} {{ number_format((int) data_get($rankingPositions, $metric.'.value', 0), 0, ',', ' ') }} @endif @if(! data_get($rankingPositions, $metric.'.position')) {{ __('ui.public_profile_rank_unranked') }} @endif
@endforeach
@endif @if(! $rankingPositions)
🔒
{{ __('ui.public_profile_rankings_private_title') }}

{{ __('ui.public_profile_rankings_private_text') }}

@endif @if($skills->isNotEmpty())
{{ __('ui.public_profile_skills_kicker') }}

{{ __('ui.public_profile_skills_title') }}

{{ __('ui.public_profile_skills_intro') }}

@foreach($skills as $userSkill) @php $skillTranslation = $userSkill->skill?->translations?->firstWhere('locale', app()->getLocale()) ?? $userSkill->skill?->translations?->firstWhere('locale', 'en'); @endphp
{{ data_get($userSkill->skill?->metadata, 'icon', '✦') }} {{ __('ui.rankings_level_value', ['level' => $userSkill->level]) }}
{{ $skillTranslation?->name ?: $userSkill->skill?->key }}

{{ $skillTranslation?->description }}

{{ number_format((int) $userSkill->xp_total, 0, ',', ' ') }} XP
@endforeach
@endif @include('pages.partials.local-experts-profile', ['localExpertise' => $localExpertise]) @if($recentActivity->isNotEmpty())
{{ __('ui.public_profile_activity_kicker') }}

{{ __('ui.public_profile_activity_title') }}

{{ __('ui.public_profile_activity_intro') }}

@foreach($recentActivity as $event)
@if($event['kind'] === 'ride')🎢@endif @if($event['kind'] === 'attraction')🎠@endif @if($event['kind'] === 'visit')🎡@endif @if($event['kind'] === 'badge')🏅@endif @if($event['kind'] === 'challenge')🏆@endif @if($event['kind'] === 'road_trip')🧭@endif
{{ __('ui.public_profile_activity_'.$event['kind']) }} @if($event['url']) {{ $event['title'] }} @endif @if(! $event['url']) {{ $event['title'] }} @endif @if($event['subtitle']){{ $event['subtitle'] }}@endif
@endforeach
@endif
{{ __('ui.public_profile_records_kicker') }}

{{ __('ui.public_profile_records_title') }}

{{ __('ui.public_profile_records_intro') }}

{{ __('ui.profile_fastest') }} @if($fastest) {{ rtrim(rtrim((string)$fastest->attraction->coaster->speed_kmh, '0'), '.') }} km/h {{ $fastest->attraction->official_name }} @endif @if(! $fastest){{ __('ui.profile_no_record') }}@endif
{{ __('ui.profile_highest') }} @if($highest) {{ rtrim(rtrim((string)$highest->attraction->coaster->height_m, '0'), '.') }} m {{ $highest->attraction->official_name }} @endif @if(! $highest){{ __('ui.profile_no_record') }}@endif
{{ __('ui.profile_longest') }} @if($longest) {{ rtrim(rtrim((string)$longest->attraction->coaster->length_m, '0'), '.') }} m {{ $longest->attraction->official_name }} @endif @if(! $longest){{ __('ui.profile_no_record') }}@endif
@if($achievements->isNotEmpty())
{{ __('ui.public_profile_trophies_kicker') }}

{{ __('ui.public_profile_trophies_title') }}

{{ __('ui.public_profile_trophies_intro') }}

@foreach($achievements as $unlock) @php $translation = $unlock->achievement?->translations?->firstWhere('locale', app()->getLocale()) ?? $unlock->achievement?->translations?->firstWhere('locale', 'en'); @endphp
{{ data_get($unlock->achievement?->metadata, 'icon', '✦') }}
{{ __('ui.progression_category_'.($unlock->achievement?->category ?? 'coaster')) }} {{ $translation?->name ?: $unlock->achievement?->key }}

{{ $translation?->description }}

@endforeach
@endif @if($challengeShowcase->isNotEmpty())
{{ __('ui.public_profile_challenges_kicker') }}

{{ __('ui.public_profile_challenges_title') }}

{{ __('ui.public_profile_challenges_intro') }}

@foreach($challengeShowcase as $participant) @php $challenge = $participant->challenge; $parkTranslation = $challenge?->park?->translations?->firstWhere('locale', app()->getLocale()) ?? $challenge?->park?->translations?->firstWhere('locale', 'en'); $target = (int) data_get($challenge?->rules, 'target_score', 0); @endphp
🏆 {{ __('ui.public_profile_challenge_completed') }} {{ $challenge?->name }} @if($challenge?->park){{ $parkTranslation?->name ?: $challenge->park->official_name }}@endif
{{ number_format((int) $participant->score, 0, ',', ' ') }} @if($target > 0)/ {{ $target }}@endif
@if($participant->completed_at)@endif
@endforeach
@endif @if($roadTripShowcase->isNotEmpty())
{{ __('ui.public_profile_road_trips_kicker') }}

{{ __('ui.public_profile_road_trips_title') }}

{{ __('ui.public_profile_road_trips_intro') }}

@foreach($roadTripShowcase as $roadTripData)
🧭
{{ __('ui.road_trip_status_completed') }} {{ $roadTripData['trip']->title }}
{{ $roadTripData['park_count'] }}{{ __('ui.profile_parks') }} {{ $roadTripData['country_count'] }}{{ __('ui.profile_countries') }} {{ $roadTripData['completed_stops'] }}{{ __('ui.public_profile_completed_stops') }}
@if($roadTripData['trip']->ends_on) @endif
@endforeach
@endif @if($coasterCards->isNotEmpty())
{{ __('ui.progression_cards_kicker') }}

{{ __('ui.public_profile_cards_title') }}

{{ __('ui.public_profile_cards_intro') }}

@foreach($coasterCards as $ownedCard) @php $card = $ownedCard->card; $coaster = $card?->coaster; $attraction = $coaster?->attraction; $translation = $attraction?->translations?->firstWhere('locale', app()->getLocale()) ?? $attraction?->translations?->firstWhere('locale', 'en'); $parkTranslation = $attraction?->park?->translations?->firstWhere('locale', app()->getLocale()) ?? $attraction?->park?->translations?->firstWhere('locale', 'en'); @endphp @if($coaster && $attraction)
{{ __('ui.progression_tier_'.$card->visual_tier) }}
🎢
{{ $parkTranslation?->name ?: $attraction->park?->official_name }} {{ $translation?->name ?: $attraction->official_name }} {{ $coaster->manufacturer?->name ?: __('ui.coaster_unknown') }}
@endif @endforeach
@endif @if($manufacturerStats->isNotEmpty())
{{ __('ui.profile_manufacturers_kicker') }}

{{ __('ui.public_profile_manufacturers_title') }}

@foreach($manufacturerStats as $manufacturer => $count)
{{ $manufacturer }} {{ trans_choice('ui.profile_manufacturer_count', $count, ['count' => $count]) }}
@endforeach
@endif

{{ __('ui.public_profile_privacy_note_v2') }}

@endsection