@extends('layouts.app') @push('head') @endpush @php $park = $visit->park; $parkTranslation = $park->translations->firstWhere('locale', app()->getLocale()) ?? $park->translations->firstWhere('locale', 'en'); $parkName = $parkTranslation?->name ?: $park->official_name; $openCount = $attractions->where('visit_mode_is_open', true)->count(); $doneCount = $riddenIds->count(); $todayOpen = $todayHours?->opens_at?->timezone($park->timezone); $todayClose = $todayHours?->closes_at?->timezone($park->timezone); $isGroupMode = $group !== null; $programTypeIcons = ['attraction' => '๐ŸŽข', 'meal' => '๐Ÿ”', 'break' => 'โ˜•', 'meetup' => '๐Ÿ“', 'custom' => 'โœจ']; $programStatusIcons = ['todo' => 'โ—‹', 'in_progress' => 'โ–ถ', 'done' => 'โœ“', 'skipped' => 'โ€“']; $pendingProgramCount = $visibleProgramItems->whereIn('status', ['todo', 'in_progress'])->count(); $rideTogetherDefaultTime = now($park->timezone ?: config('app.timezone'))->addMinutes(15)->format('Y-m-d\TH:i'); $advisorStrategy = data_get($advisorContext, 'strategy', 'balanced'); $advisorWeather = data_get($advisorContext, 'weather', []); $advisorWeatherState = data_get($advisorWeather, 'state', 'normal'); $advisorWeatherCondition = data_get($advisorWeather, 'condition'); $advisorWeatherIcon = \App\Support\WeatherCondition::icon($advisorWeatherCondition); $advisorWeatherLabel = \App\Support\WeatherCondition::label($advisorWeatherCondition); $advisorMinutesToClose = data_get($advisorContext, 'minutes_to_close'); @endphp @section('title', __('ui.visit_mode_title').' ยท '.$parkName.' โ€” Coaster World') @section('content')
@if($isGroupMode) โ† {{ $group->name }} @else โ† {{ $parkName }} @endif LIVE
{{ __('ui.visit_mode_kicker') }}

{{ $parkName }}

{{ $isGroupMode ? __('ui.visit_v2_group_intro', ['group' => $group->name]) : __('ui.visit_mode_intro') }}

@if($isGroupMode)
๐Ÿ‘ฅ {{ $group->name }} @if($currentTeamAssignment?->team) {{ $currentTeamAssignment->team->icon ?: 'โ—†' }} {{ $currentTeamAssignment->team->name }} @else โ—Ž {{ __('ui.visit_v2_no_team') }} @endif โ˜ท {{ trans_choice('ui.visit_v2_program_steps', $pendingProgramCount, ['count' => $pendingProgramCount]) }}
@endif
{{ __('ui.visit_open_map') }} @if($isGroupMode) {{ __('ui.visit_v2_open_roadbook') }} @endif
@csrf
@if(session('gps_status'))
{{ session('gps_status') }}
@endif @if($errors->has('gps'))
{{ $errors->first('gps') }}
@endif @if(session('ride_together_status'))
{{ session('ride_together_status') }}
@endif @if($errors->has('ride_together') || $errors->has('scheduled_for') || $errors->has('visibility_scope'))
{{ $errors->first() }}
@endif
{{ __('ui.visit_open_now') }}{{ $openCount }}
{{ __('ui.visit_done_today') }}{{ $doneCount }}
{{ __('ui.visit_hours') }}{{ $todayOpen && $todayClose ? $todayOpen->format('H:i').'โ€“'.$todayClose->format('H:i') : 'โ€”' }}
{{ __('ui.visit_weather') }}{{ $weather?->temperature_c !== null ? rtrim(rtrim(number_format((float)$weather->temperature_c,1,',',''),'0'),',').'ยฐC' : 'โ€”' }}
{{ __('ui.wishlist_title_short') }}{{ $wishlistCount }}
@if($isGroupMode)
{{ __('ui.visit_v2_roadbook_short') }}{{ $pendingProgramCount }}
@endif
{{ __('ui.visit_advisor_kicker') }}

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

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

{{ __('ui.visit_advisor_strategy_'.$advisorStrategy) }}
โšก
{{ __('ui.visit_advisor_actionable') }}{{ data_get($advisorContext, 'actionable_count', 0) }}
๐Ÿงญ
{{ __('ui.visit_advisor_walk_limit') }}{{ data_get($advisorContext, 'max_walk_distance_m') ? data_get($advisorContext, 'max_walk_distance_m').' m' : __('ui.visit_advisor_unlimited') }}
โณ
{{ __('ui.visit_advisor_closing') }}{{ $advisorMinutesToClose !== null && $advisorMinutesToClose >= 0 ? trans_choice('ui.visit_advisor_minutes_left', $advisorMinutesToClose, ['count' => $advisorMinutesToClose]) : 'โ€”' }}
{{ $advisorWeatherIcon }}
{{ __('ui.visit_weather') }}{{ data_get($advisorWeather, 'enabled') ? $advisorWeatherLabel : __('ui.visit_advisor_weather_off') }}
@if(data_get($advisorWeather, 'enabled') && $advisorWeatherState !== 'normal')
{{ $advisorWeatherState === 'severe' ? 'โš ๏ธ' : '๐ŸŒฆ๏ธ' }}
{{ __('ui.visit_advisor_weather_'.$advisorWeatherState.'_title') }}

{{ __('ui.visit_advisor_weather_'.$advisorWeatherState.'_text') }}

@endif
โ—Œ {{ __('ui.visit_advisor_no_gps_note') }}
@if($activeChallenges->isNotEmpty())
โšก {{ __('ui.challenge_nav') }}{{ __('ui.visit_challenge_title') }}
{{ __('ui.visit_challenge_all') }} โ†’
@foreach($activeChallenges as $challengeParticipant) @php $activeChallenge = $challengeParticipant->challenge; $challengeTarget = max(1, (int) data_get($activeChallenge?->rules, 'target_score', 1)); $challengeScore = (int) $challengeParticipant->score; $challengeProgress = min(100, (int) round(($challengeScore / $challengeTarget) * 100)); $challengeSystemKey = 'challenge_official_'.$activeChallenge?->period_kind.'_'.$activeChallenge?->challenge_type.'_title'; $challengeTitle = $activeChallenge?->is_system && __($challengeSystemKey) !== $challengeSystemKey ? __($challengeSystemKey) : $activeChallenge?->name; @endphp
{{ $activeChallenge?->challenge_type === 'coasters' || $activeChallenge?->challenge_type === 'new_coasters' ? '๐ŸŽข' : ($activeChallenge?->challenge_type === 'manufacturers' ? 'โš™๏ธ' : ($activeChallenge?->challenge_type === 'parks' ? '๐Ÿฐ' : '๐ŸŽก')) }}{{ $challengeTitle }}
{{ $challengeScore }} / {{ $challengeTarget }}
@endforeach
@endif @if($proximityReference)
{{ __('ui.visit_v3_proximity_kicker') }} {{ $proximityReference['name'] }}

{{ $proximityReference['type'] === 'last_ride' ? __('ui.visit_v3_proximity_last_ride') : __('ui.visit_v3_proximity_roadbook') }}

โ—Œ {{ __('ui.visit_v3_no_gps') }}
@endif @if($isGroupMode && $nextProgramItem) @php $nextProgramAttraction = $nextProgramItem->attraction; $nextProgramLive = $nextProgramAttraction?->liveStatus; $nextProgramInsight = $nextProgramAttraction ? ($liveInsights->get((int) $nextProgramAttraction->id) ?? []) : []; $nextProgramFresh = (bool) ($nextProgramInsight['is_fresh'] ?? false); $nextProgramWait = $nextProgramInsight['display_wait_minutes'] ?? null; $nextProgramWaitKind = $nextProgramInsight['wait_kind'] ?? 'unavailable'; $nextProgramTrend = $nextProgramInsight['trend'] ?? 'unknown'; $nextProgramStatus = $nextProgramInsight['status'] ?? 'unknown'; $nextProgramStatusLabel = match($nextProgramStatus) { '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'), }; @endphp
{{ __('ui.visit_v2_next_step_kicker') }}{{ $programStatusIcons[$nextProgramItem->status] ?? 'โ—‹' }} {{ __('ui.group_visit_program_status_'.$nextProgramItem->status) }}
{{ $programTypeIcons[$nextProgramItem->item_type] ?? 'โœจ' }}
{{ $nextProgramItem->scheduled_at ? $nextProgramItem->scheduled_at->timezone($park->timezone)->format('H:i') : __('ui.group_visit_program_flexible') }} ยท {{ $nextProgramItem->team?->name ?: __('ui.group_visit_program_everyone') }}

{{ $nextProgramItem->title }}

@if($nextProgramItem->note)

{{ $nextProgramItem->note }}

@endif @if($nextProgramAttraction)
{{ $nextProgramStatusLabel }}
@endif
@if($nextProgramAttraction) @endif
@endif @if($nextSuggested) @php $nextSuggestedTranslation = $nextSuggested->translations->firstWhere('locale', app()->getLocale()) ?? $nextSuggested->translations->firstWhere('locale', 'en'); $nextSuggestedName = $nextSuggestedTranslation?->name ?: $nextSuggested->official_name; $nextSuggestedDistance = $nextSuggested->visit_mode_distance_m; $nextSuggestedDistanceLabel = $nextSuggestedDistance === null ? null : ($nextSuggestedDistance < 1000 ? ((int) round($nextSuggestedDistance / 10) * 10).' m' : number_format($nextSuggestedDistance / 1000, 1, app()->getLocale() === 'fr' ? ',' : '.', '').' km'); $nextSuggestedForecast = $nextSuggested->visit_mode_wait_forecast ?? []; $nextSuggestedForecastBest = ($nextSuggestedForecast['recommendation'] ?? null) === 'wait' ? ($nextSuggestedForecast['best_later_window'] ?? $nextSuggestedForecast['best_remaining_window'] ?? $nextSuggestedForecast['best_window'] ?? null) : ($nextSuggestedForecast['best_remaining_window'] ?? $nextSuggestedForecast['best_window'] ?? null); @endphp
{{ __('ui.visit_advisor_primary_kicker') }} {{ __('ui.visit_advisor_action_'.$nextSuggested->visit_mode_advisor_action) }}

{{ $nextSuggestedName }}

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

{{ __('ui.visit_advisor_confidence') }} ยท {{ __('ui.visit_advisor_confidence_'.$nextSuggested->visit_mode_advisor_confidence) }}
@if(in_array('roadbook_now',$nextSuggested->visit_mode_suggestion_reasons,true))โ˜ท {{ __('ui.visit_reason_roadbook_now') }}@endif @if(in_array('roadbook',$nextSuggested->visit_mode_suggestion_reasons,true))โ˜ท {{ __('ui.visit_reason_roadbook') }}@endif @if(in_array('wishlist',$nextSuggested->visit_mode_suggestion_reasons,true))โ˜… {{ __('ui.wishlist_priority') }}@endif @if(in_array('new_coaster',$nextSuggested->visit_mode_suggestion_reasons,true))โœฆ {{ __('ui.visit_reason_new_coaster') }}@endif @if(in_array('personal',$nextSuggested->visit_mode_suggestion_reasons,true)){{ __('ui.visit_reason_personal') }}@endif @if(in_array('low_wait',$nextSuggested->visit_mode_suggestion_reasons,true) && $nextSuggested->visit_mode_wait !== null){{ __('ui.visit_reason_low_wait') }}@endif @if(in_array('wait_dropping',$nextSuggested->visit_mode_suggestion_reasons,true))โ†˜ {{ __('ui.visit_reason_wait_dropping') }}@endif @if(in_array('wait_stable',$nextSuggested->visit_mode_suggestion_reasons,true))โ†’ {{ __('ui.visit_reason_wait_stable') }}@endif @if(in_array('historical_good_time',$nextSuggested->visit_mode_suggestion_reasons,true))โ—ด {{ __('ui.visit_reason_historical_good_time') }}@endif @if(in_array('roadbook_soon',$nextSuggested->visit_mode_suggestion_reasons,true))โ—ท {{ __('ui.visit_reason_roadbook_soon') }}@endif @if(in_array('weather_shelter',$nextSuggested->visit_mode_suggestion_reasons,true))โ˜‚ {{ __('ui.visit_reason_weather_shelter') }}@endif @if(in_array('closing_window',$nextSuggested->visit_mode_suggestion_reasons,true))โณ {{ __('ui.visit_reason_closing_window') }}@endif @if(in_array('nearby',$nextSuggested->visit_mode_suggestion_reasons,true))โŒ– {{ __('ui.visit_reason_nearby') }}@endif
visit_mode_wait === null) hidden @endif> {{ __('ui.visit_v2_current_wait') }}{{ $nextSuggested->visit_mode_wait_kind === 'walk_on' ? __('ui.live_walk_on_short') : ($nextSuggested->visit_mode_wait ?? 'โ€”') }}visit_mode_wait_kind === 'walk_on') hidden @endif>min visit_mode_wait_trend === 'unknown') hidden @endif>@if($nextSuggested->visit_mode_wait_trend === 'up') โ†— @elseif($nextSuggested->visit_mode_wait_trend === 'down') โ†˜ @else โ†’ @endif {{ __('ui.live_trend_'.$nextSuggested->visit_mode_wait_trend) }}visit_mode_wait_trend_delta === null || $nextSuggested->visit_mode_wait_trend === 'stable') hidden @endif>{{ ($nextSuggested->visit_mode_wait_trend_delta ?? 0) > 0 ? '+' : '' }}{{ $nextSuggested->visit_mode_wait_trend_delta ?? '' }} min
visit_mode_wait !== null) hidden @endif> {{ __('ui.visit_v2_current_wait') }}โ€”{{ $nextSuggested->visit_mode_wait_kind === 'unconfirmed_zero' ? __('ui.live_wait_unconfirmed') : __('ui.live_no_wait') }}
@if($nextSuggestedDistanceLabel !== null)
{{ __('ui.visit_v3_distance_label') }} {{ $nextSuggestedDistanceLabel }} {{ $nextSuggested->visit_mode_walk_minutes ? trans_choice('ui.visit_advisor_walk_minutes', $nextSuggested->visit_mode_walk_minutes, ['count' => $nextSuggested->visit_mode_walk_minutes]) : __('ui.visit_v3_distance_approx') }}
@endif @if(($nextSuggestedForecast['available'] ?? false) && ($nextSuggestedForecast['current_typical_minutes'] ?? null) !== null)
{{ __('ui.wait_forecast_kicker') }} {{ __('ui.visit_forecast_typical', ['minutes' => $nextSuggestedForecast['current_typical_minutes']]) }} @if(($nextSuggestedForecast['recommendation'] ?? null) === 'wait' && $nextSuggestedForecastBest) {{ __('ui.visit_forecast_best_later', ['time' => $nextSuggestedForecastBest['label'], 'minutes' => $nextSuggestedForecastBest['median']]) }} @else {{ __('ui.wait_forecast_recommendation_'.$nextSuggestedForecast['recommendation']) }} @endif
@endif
@endif @if($isGroupMode && $visibleProgramItems->isNotEmpty())
{{ __('ui.visit_v2_roadbook_kicker') }}

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

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

{{ __('ui.visit_v2_full_roadbook') }}
@foreach($visibleProgramItems->take(8) as $programItem) @php $programAttraction = $programItem->attraction; $programLive = $programAttraction?->liveStatus; $programInsight = $programAttraction ? ($liveInsights->get((int) $programAttraction->id) ?? []) : []; $programFresh = (bool) ($programInsight['is_fresh'] ?? false); $programWait = $programInsight['display_wait_minutes'] ?? null; $programWaitKind = $programInsight['wait_kind'] ?? 'unavailable'; @endphp
{{ $loop->iteration }}
{{ $programTypeIcons[$programItem->item_type] ?? 'โœจ' }}
{{ $programItem->scheduled_at ? $programItem->scheduled_at->timezone($park->timezone)->format('H:i') : __('ui.group_visit_program_flexible') }} ยท {{ $programItem->team?->name ?: __('ui.group_visit_program_everyone') }} {{ $programItem->title }} {{ $programStatusIcons[$programItem->status] ?? 'โ—‹' }} {{ __('ui.group_visit_program_status_'.$programItem->status) }}
@if($programAttraction)
โ†’ @endif
@endforeach
@endif
{{ __('ui.ride_together_v2_kicker') }}

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

{{ $isGroupMode ? __('ui.ride_together_v2_visit_group_intro') : __('ui.ride_together_v2_visit_intro') }}

has('attraction_id') || $errors->has('scheduled_for')) open @endif> {{ __('ui.ride_together_v2_quick_create') }}
@csrf
@if($rideTogetherPosts->isNotEmpty())
@foreach($rideTogetherPosts->take(8) as $ridePost) @php $rideTranslation = $ridePost->attraction?->translations?->firstWhere('locale', app()->getLocale()) ?? $ridePost->attraction?->translations?->firstWhere('locale', 'en'); $rideName = $rideTranslation?->name ?: $ridePost->attraction?->official_name ?: __('ui.ride_together_attraction'); $rideTime = $ridePost->scheduled_for?->timezone($park->timezone ?: config('app.timezone')); $rideJoined = $ridePost->participants->where('status', 'joined'); $rideIsJoined = $rideJoined->contains('user_id', auth()->id()); $rideIsOwner = $ridePost->created_by_user_id === auth()->id(); $rideIsFull = $ridePost->max_participants && $rideJoined->count() >= $ridePost->max_participants; $rideScope = in_array($ridePost->visibility_scope, ['public', 'group', 'team'], true) ? $ridePost->visibility_scope : 'public'; @endphp
{{ __('ui.ride_together_v2_scope_'.$rideScope) }}@if($rideScope === 'team' && $ridePost->team) ยท {{ $ridePost->team->emoji }} {{ $ridePost->team->name }}@endif{{ $rideTime?->format('H:i') ?: 'โ€”' }}

{{ $rideName }}

๐Ÿ‘ฅ {{ $rideJoined->count() }}/{{ $ridePost->max_participants ?: 'โˆž' }} @if($ridePost->meeting_point) ๐Ÿ“ {{ $ridePost->meeting_point }} @endif @if($ridePost->programItem) โ˜ท {{ __('ui.ride_together_v2_from_roadbook') }} @endif
@if($ridePost->note)

{{ $ridePost->note }}

@endif {{ __('ui.ride_together_by', ['name' => $ridePost->creator?->username ? '@'.$ridePost->creator->username : ($ridePost->creator?->name ?: 'โ€”')]) }}
@if($rideIsOwner) โœ“ {{ __('ui.ride_together_yours') }}
@csrf @method('DELETE')
@elseif($rideIsJoined)
@csrf @method('DELETE')
@elseif(!$rideIsFull)
@csrf
@else{{ __('ui.ride_together_full_label') }}@endif
@endforeach
@else
๐ŸŽข
{{ __('ui.ride_together_v2_empty_title') }}

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

@endif
@if($suggested->isNotEmpty())
{{ __('ui.visit_suggested_kicker') }}

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

@foreach($suggested as $attraction) @php $tr=$attraction->translations->firstWhere('locale',app()->getLocale()) ?? $attraction->translations->firstWhere('locale','en'); $name=$tr?->name ?: $attraction->official_name; @endphp
{{ __('ui.visit_advisor_action_'.$attraction->visit_mode_advisor_action) }}@if($attraction->visit_mode_is_wishlisted)โ˜… {{ __('ui.wishlist_priority') }}@endif
{{ $attraction->zone?->official_name ?: $parkName }}{{ $name }}
@if(in_array('roadbook_now',$attraction->visit_mode_suggestion_reasons,true))โ˜ท {{ __('ui.visit_reason_roadbook_now') }}@endif @if(in_array('roadbook',$attraction->visit_mode_suggestion_reasons,true))โ˜ท {{ __('ui.visit_reason_roadbook') }}@endif @if(in_array('new_coaster',$attraction->visit_mode_suggestion_reasons,true))โœฆ {{ __('ui.visit_reason_new_coaster') }}@endif @if(in_array('personal',$attraction->visit_mode_suggestion_reasons,true)){{ __('ui.visit_reason_personal') }}@endif @if(in_array('low_wait',$attraction->visit_mode_suggestion_reasons,true) && $attraction->visit_mode_wait !== null){{ __('ui.visit_reason_low_wait') }}@endif @if(in_array('wait_dropping',$attraction->visit_mode_suggestion_reasons,true))โ†˜ {{ __('ui.visit_reason_wait_dropping') }}@endif @if(in_array('historical_good_time',$attraction->visit_mode_suggestion_reasons,true))โ—ด {{ __('ui.visit_reason_historical_good_time') }}@endif @if(in_array('roadbook_soon',$attraction->visit_mode_suggestion_reasons,true))โ—ท {{ __('ui.visit_reason_roadbook_soon') }}@endif @if(in_array('weather_shelter',$attraction->visit_mode_suggestion_reasons,true))โ˜‚ {{ __('ui.visit_reason_weather_shelter') }}@endif @if(in_array('closing_window',$attraction->visit_mode_suggestion_reasons,true))โณ {{ __('ui.visit_reason_closing_window') }}@endif @if(in_array('nearby',$attraction->visit_mode_suggestion_reasons,true))โŒ– {{ __('ui.visit_reason_nearby') }}@endif
โฑ {{ $attraction->visit_mode_wait !== null ? ($attraction->visit_mode_wait_kind === 'walk_on' ? __('ui.live_walk_on_short') : $attraction->visit_mode_wait.' min') : ($attraction->visit_mode_wait_kind === 'unconfirmed_zero' ? __('ui.live_wait_unconfirmed') : __('ui.live_no_wait')) }} @if($attraction->visit_mode_distance_m !== null) โŒ– {{ $attraction->visit_mode_distance_m < 1000 ? ((int) round($attraction->visit_mode_distance_m / 10) * 10).' m' : number_format($attraction->visit_mode_distance_m / 1000, 1, app()->getLocale() === 'fr' ? ',' : '.', '').' km' }} @if($attraction->visit_mode_walk_minutes)๐Ÿšถ ~{{ $attraction->visit_mode_walk_minutes }} min@endif @endif
@endforeach
@endif @if($advisorWatchlist->isNotEmpty())
{{ __('ui.visit_advisor_watch_kicker') }}

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

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

@endif
{{ __('ui.visit_advisor_settings_kicker') }}

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

@csrf
{{ __('ui.visit_all_attractions') }}

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

@if($isGroupMode)@endif
@foreach($attractions as $attraction) @php $tr = $attraction->translations->firstWhere('locale', app()->getLocale()) ?? $attraction->translations->firstWhere('locale', 'en'); $name = $tr?->name ?: $attraction->official_name; $live = $attraction->liveStatus; $isFresh = $attraction->visit_mode_live_fresh; $status = $attraction->visit_mode_is_open ? 'open' : (($isFresh && $live) ? ($live->operational_status ?: 'unknown') : 'unknown'); $statusLabel = match($status) { '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'), }; $trendSymbol = match($attraction->visit_mode_wait_trend) { 'up' => 'โ†—', 'down' => 'โ†˜', default => 'โ†’', }; $distanceLabel = null; if ($attraction->visit_mode_distance_m !== null) { $distanceLabel = $attraction->visit_mode_distance_m < 1000 ? ((int) round($attraction->visit_mode_distance_m / 10) * 10).' m' : number_format($attraction->visit_mode_distance_m / 1000, 1, app()->getLocale() === 'fr' ? ',' : '.', '').' km'; } $rideTogetherPost = $attraction->visit_mode_ride_together_post; $rideTogetherCount = $attraction->visit_mode_ride_together_posts->count(); $cardForecast = $attraction->visit_mode_wait_forecast ?? []; $cardForecastBest = ($cardForecast['recommendation'] ?? null) === 'wait' ? ($cardForecast['best_later_window'] ?? $cardForecast['best_remaining_window'] ?? $cardForecast['best_window'] ?? null) : ($cardForecast['best_remaining_window'] ?? $cardForecast['best_window'] ?? null); @endphp
{{ $attraction->coaster ? 'โ†—' : 'โ—†' }}
{{ $attraction->zone?->official_name ?: $parkName }}

{{ $name }}

@if(isset($attraction->visit_mode_advisor_action)) {{ __('ui.visit_advisor_action_'.$attraction->visit_mode_advisor_action) }} @endif @if($attraction->visit_mode_is_wishlisted) โ˜… {{ __('ui.wishlist_priority') }} @endif @if($attraction->visit_mode_is_in_program) โ˜ท {{ __('ui.visit_v2_in_roadbook') }} @endif @if($attraction->visit_mode_is_personal_match) โœฆ {{ __('ui.reco_for_you') }} @endif @if($attraction->visit_mode_is_new_for_user) ๏ผ‹ {{ __('ui.visit_new_for_collection') }} @endif @if($distanceLabel !== null) โŒ– {{ $distanceLabel }} @if($attraction->visit_mode_walk_minutes) ยท ~{{ $attraction->visit_mode_walk_minutes }} min @endif @endif @if(($cardForecast['available'] ?? false) && ($cardForecast['current_typical_minutes'] ?? null) !== null) โ—ด {{ __('ui.visit_forecast_typical', ['minutes' => $cardForecast['current_typical_minutes']]) }} @if(($cardForecast['recommendation'] ?? null) === 'wait' && $cardForecastBest) ยท {{ __('ui.visit_forecast_best_later', ['time' => $cardForecastBest['label'], 'minutes' => $cardForecastBest['median']]) }} @endif @endif @if($rideTogetherPost) ๐ŸŽข {{ $rideTogetherCount }} {{ __('ui.ride_together_v2_live_badge') }} @endif {{ $statusLabel }}
visit_mode_wait === null ? 'hidden' : '' }}> {{ $attraction->visit_mode_wait_kind === 'walk_on' ? __('ui.live_walk_on_short') : ($attraction->visit_mode_wait ?? 'โ€”') }} visit_mode_wait_kind === 'walk_on' ? 'hidden' : '' }}>min visit_mode_wait_trend === 'unknown' ? 'hidden' : '' }}> {{ $trendSymbol }} {{ __('ui.live_trend_'.$attraction->visit_mode_wait_trend) }} visit_mode_wait_trend_delta === null || $attraction->visit_mode_wait_trend === 'stable' ? 'hidden' : '' }}>{{ ($attraction->visit_mode_wait_trend_delta ?? 0) > 0 ? '+' : '' }}{{ $attraction->visit_mode_wait_trend_delta ?? '' }} min
visit_mode_wait !== null ? 'hidden' : '' }} class="visit-no-wait"> {{ $attraction->visit_mode_wait_kind === 'unconfirmed_zero' ? __('ui.live_wait_unconfirmed') : ($isFresh ? __('ui.live_no_wait') : __('ui.live_data_stale_short')) }}
@if($attraction->visit_mode_has_map_point) โŒ– {{ __('ui.visit_v3_map_focus') }} @endif {{ __('ui.visit_details') }} @if($rideTogetherPost) ๐ŸŽข {{ __('ui.ride_together_v2_join_short') }} @endif @if($attraction->visit_mode_is_done) โœ“ {{ __('ui.visit_done') }} ยท {{ $attraction->visit_mode_ride_count }}ร— @endif
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
@endforeach
@endsection