@extends('layouts.app') @push('head') @endpush @php $park = $attraction->park; $translation = $attraction->translations->firstWhere('locale', app()->getLocale()) ?? $attraction->translations->firstWhere('locale', 'en'); $attractionName = $translation?->name ?: $attraction->official_name; $parkTranslation = $park->translations->firstWhere('locale', app()->getLocale()) ?? $park->translations->firstWhere('locale', 'en'); $parkName = $parkTranslation?->name ?: $park->official_name; $zoneTranslation = $attraction->zone?->translations?->firstWhere('locale', app()->getLocale()) ?? $attraction->zone?->translations?->firstWhere('locale', 'en'); $zoneName = $zoneTranslation?->name ?: $attraction->zone?->official_name; $live = $attraction->liveStatus; $liveFresh = (bool) ($liveInsight['is_fresh'] ?? false); $liveStatus = $liveInsight['status'] ?? 'unknown'; $displayWait = $liveInsight['display_wait_minutes'] ?? null; $waitKind = $liveInsight['wait_kind'] ?? 'unavailable'; $waitTrend = $liveInsight['trend'] ?? 'unknown'; $waitTrendDelta = $liveInsight['trend_delta_minutes'] ?? null; $singleRiderWait = $liveInsight['single_rider_wait_minutes'] ?? null; $liveObservedAt = $liveInsight['source_observed_at'] ?? $live?->fetched_at; $liveOpen = in_array($liveStatus, ['open', 'operating'], true); $liveClosed = in_array($liveStatus, ['down', 'closed', 'refurbishment'], true); $liveStatusLabel = match ($liveStatus) { 'open', 'operating' => __('ui.live_status_open'), 'down' => __('ui.live_status_down'), 'closed' => __('ui.live_status_closed'), 'refurbishment' => __('ui.live_status_refurbishment'), default => __('ui.live_status_unknown'), }; $typeLabel = ucfirst(str_replace('_', ' ', $attraction->attraction_type ?: 'attraction')); $catalogStatusLabel = ucfirst(str_replace('_', ' ', $attraction->status ?: __('ui.attraction_unknown'))); $parkLocation = collect([$park->city, $park->country?->official_name])->filter()->join(' · '); @endphp @section('title', $attractionName.' — Coaster World') @if($bannerUrl) @push('head') @endpush @endif @section('content')
{{ __('ui.attraction_kicker') }}

{{ $attractionName }}

{{ $parkName }} @if($zoneName){{ $zoneName }}@endif {{ $typeLabel }} @if($attraction->opened_on){{ $attraction->opened_on->format('Y') }}@endif
@auth
@csrf
@csrf
@if(!$isRidden)
user()->is_admin) data-gps-required data-gps-kind="ride" data-gps-loading="{{ __('ui.gps_validating_ride') }}" data-gps-unavailable="{{ __('ui.gps_unavailable') }}" data-gps-denied="{{ __('ui.gps_permission_denied') }}" data-gps-timeout="{{ __('ui.gps_timeout') }}" data-gps-error="{{ __('ui.gps_error') }}" @endif>@csrf
@else ✓ {{ __('ui.collection_done_short') }} @endif {{ __('ui.contribution_propose') }} @include('pages.partials.community-photo-upload', ['photoType' => 'attraction', 'photoId' => $attraction->id]) @if(auth()->user()->is_admin) {{ __('ui.public_admin_attraction') }} @endif
@endauth
{{ __('ui.attraction_live') }} {{ $live ? $liveStatusLabel : __('ui.live_status_unknown') }} single_rider_available)) hidden @endif> {{ __('ui.live_single_rider') }} · {{ $singleRiderWait !== null ? $singleRiderWait.' min' : __('ui.special_queue_available') }} fetched_at) hidden @endif> {{ __('ui.live_checked_prefix') }}
@if(session('community_photo_status') === 'submitted')
{{ __('ui.community_photo_submitted') }}
@endif
{{ __('ui.attraction_type') }} {{ $typeLabel }}
{{ __('ui.attraction_zone') }} {{ $zoneName ?: '—' }}
{{ __('ui.attraction_min_height') }} {{ $attraction->minimum_height_cm ? $attraction->minimum_height_cm.' cm' : '—' }}
{{ __('ui.attraction_opened') }} {{ $attraction->opened_on ? $attraction->opened_on->format('Y') : '—' }}
@if(auth()->check() && auth()->user()->is_admin) @endif {{ __('ui.attraction_profile_kicker') }}

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

{{ $translation?->description ?: $translation?->summary ?: __('ui.attraction_description_empty') }}

{{ __('ui.attraction_park') }} {{ $parkName }}
{{ __('ui.attraction_zone') }} {{ $zoneName ?: __('ui.attraction_unknown') }}
{{ __('ui.attraction_type') }} {{ $typeLabel }}
{{ __('ui.attraction_estimated_budget') }} {{ $attraction->estimated_budget ?: '—' }}
{{ __('ui.attraction_status') }} {{ $catalogStatusLabel }}
{{ __('ui.public_opened_on') }} {{ $attraction->opened_on?->translatedFormat('d F Y') ?: '—' }}
@if($attraction->closed_on)
{{ __('ui.public_closed_on') }} {{ $attraction->closed_on->translatedFormat('d F Y') }}
@endif
@include('pages.partials.attraction-inline-admin-dialogs') @include('pages.partials.wait-forecast', ['waitForecast' => $waitForecast]) @include('pages.partials.wait-history', ['waitHistory' => $waitHistory]) @include('pages.partials.park-context-card', ['parkCard' => $parkCard]) @if($gallery->isNotEmpty())
{{ __('ui.attraction_gallery_kicker') }}

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

@if($communityPhotoCount > 0) @endif
@endif @if($related->isNotEmpty())
{{ __('ui.attraction_related_kicker') }}

{{ __('ui.attraction_related_title', ['park' => $parkName]) }}

@endif @include('pages.partials.community-reviews', ['community' => $community]) @endsection