Immobilien site 11-05-2026

This commit is contained in:
Kevin Adametz 2026-05-11 10:29:37 +02:00
parent e198d842ce
commit 6799325f71
28 changed files with 16189 additions and 809 deletions

View file

@ -1,4 +1,16 @@
<div>
@if ($syncFromAlpineProject)
<div
x-effect="
if (typeof selectedProject !== 'undefined' && selectedProject) {
$wire.$set('projectSlug', selectedProject.slug || '')
$wire.$set('projectTitle', selectedProject.title || '')
}
"
class="hidden"
aria-hidden="true"></div>
@endif
@if ($success)
<div class="flex flex-col items-center text-center py-6 gap-4">
<div class="flex items-center justify-center w-16 h-16 rounded-full bg-green-100">
@ -20,7 +32,7 @@
<input type="text" id="website_hp" name="website" wire:model="website" tabindex="-1" autocomplete="off">
</div>
@if (!empty($interestOptions))
@if ($showInterest && !empty($interestOptions))
<div>
<label for="interest" class="block text-sm font-medium text-foreground mb-2">{{ __('ui.immobilien_form.interest') }}</label>
<div class="grid grid-cols-1">
@ -141,7 +153,7 @@
wire:loading.attr="disabled"
class="w-full btn-primary-accent"
>
<span wire:loading.remove>{{ __('ui.immobilien_form.submit') }}</span>
<span wire:loading.remove>{{ $submitLabel ?: __('ui.immobilien_form.submit') }}</span>
<span wire:loading>{{ __('ui.immobilien_form.sending') }}</span>
</button>
</form>

View file

@ -1,15 +1,12 @@
@if (!empty($content) && ($content['enabled'] ?? false))
<div x-data="{ dismissed: localStorage.getItem('announcement_dismissed_{{ $content['id'] ?? 'default' }}') === 'true' }"
x-show="!dismissed"
x-transition:leave="transition ease-in duration-200"
x-transition:leave-start="opacity-100 max-h-16"
x-transition:leave-end="opacity-0 max-h-0"
class="bg-secondary text-secondary-foreground overflow-hidden"
id="topbar">
<div x-data="{ dismissed: localStorage.getItem('announcement_dismissed_{{ $content['id'] ?? 'default' }}') === 'true' }" x-show="!dismissed" x-transition:leave="transition ease-in duration-200"
x-transition:leave-start="opacity-100 max-h-16" x-transition:leave-end="opacity-0 max-h-0"
class="bg-primary text-secondary-foreground overflow-hidden" id="topbar">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="relative flex items-center justify-center gap-x-3 gap-y-1 flex-wrap min-h-10 py-2 pr-8 text-sm">
@if (isset($content['badge']))
<span class="hidden sm:inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[10px] font-bold uppercase tracking-wider bg-white/20 shrink-0">
<span
class="hidden sm:inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[10px] font-bold uppercase tracking-wider bg-white/20 shrink-0">
{{ $content['badge'] }}
</span>
@endif
@ -22,8 +19,10 @@
<a href="{{ $content['link_url'] }}"
class="inline-flex items-center gap-1 font-semibold underline underline-offset-2 decoration-white/50 hover:decoration-white transition-colors shrink-0">
{{ $content['link_text'] }}
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3" />
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" stroke-width="2"
viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round"
d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3" />
</svg>
</a>
@endif

View file

@ -1,20 +1,39 @@
@extends('web.layouts.web-master')
@php
$ui = data_get($content, 'ui', []);
$showUi = data_get($ui, 'show_page', []);
$statusClasses = [
'ready' => 'bg-emerald-500',
'construction' => 'bg-sky-500',
'offplan' => 'bg-amber-400 text-zinc-950',
];
$confidenceLabels = [
'green' => 'Direkt belegt',
'yellow' => 'Vor Livegang final pruefen',
'red' => 'Nur als Anfragewert nutzen',
];
$confidenceLabels = data_get($ui, 'confidence_labels', []);
$defaultProjectTitle = data_get($showUi, 'default_title', 'Projekt');
$dev = $dev ?? false;
$devQuery = $devQuery ?? false;
$overviewRouteName = $overviewRouteName ?? ($dev ? 'dev.immobilien-azizi' : 'immobilien');
$overviewUrl = route($overviewRouteName, $devQuery ? ['dev' => 1] : []);
$slug = $project['slug'] ?? '';
$fallbackImage = theme_image_url($project['image'] ?? 'b2in/hero-immobilien.jpg');
$basePath = storage_path('app/public/immobile/dubai/' . $slug);
$imagePaths = collect([
glob($basePath . '/image/*.{webp,jpg,jpeg,png}', GLOB_BRACE) ?: [],
glob($basePath . '/official-website/*.{webp,jpg,jpeg,png}', GLOB_BRACE) ?: [],
])
->flatten()
->all();
sort($imagePaths, SORT_NATURAL);
$galleryImages = collect($imagePaths)
->map(fn(string $path): string => theme_image_url(str_replace(storage_path('app/public') . '/', '', $path)))
->values();
$heroImage = $galleryImages->first() ?? $fallbackImage;
@endphp
@section('title', ($project['title'] ?? 'Projekt') . ' - B2in Dubai Preview')
@section('meta_description', ($project['short'] ?? 'Kuratierte Dubai-Immobilie von Azizi Developments.'))
@section('title', ($project['title'] ?? $defaultProjectTitle) . ' - B2in Dubai Preview')
@section('meta_description', $project['short'] ?? data_get($showUi, 'default_meta_description', ''))
@section('content')
<div class="bg-background">
@ -22,20 +41,19 @@
<main class="variante-glass-flow">
<section class="relative h-[62vh] min-h-[460px] overflow-hidden">
<x-web-picture
src="{{ theme_image_url($project['image'] ?? 'b2in/hero-immobilien.jpg') }}"
alt="{{ $project['title'] ?? '' }}"
class="absolute inset-0 h-full w-full object-cover"
loading="" />
<x-web-picture src="{{ $heroImage }}" alt="{{ $project['title'] ?? '' }}"
class="absolute inset-0 h-full w-full object-cover" loading="" />
<div class="absolute inset-0 bg-gradient-to-t from-black/80 via-black/35 to-black/10"></div>
<div class="absolute inset-x-0 bottom-0 p-8 lg:p-12">
<div class="container-padding">
<a href="{{ route('dev.immobilien-azizi') }}" class="mb-6 inline-flex items-center gap-2 text-sm font-semibold text-white/75 hover:text-white">
<a href="{{ $overviewUrl }}"
class="mb-6 inline-flex items-center gap-2 text-sm font-semibold text-white/75 hover:text-white">
@svg('heroicon-o-arrow-left', 'h-4 w-4')
Zurueck zur Projektuebersicht
{{ data_get($showUi, 'back_to_overview') }}
</a>
<div class="max-w-4xl">
<span class="inline-flex rounded-full px-3 py-1 text-xs font-semibold text-white {{ $statusClasses[$project['status_group'] ?? 'ready'] ?? 'bg-secondary' }}">
<span
class="inline-flex rounded-full px-3 py-1 text-xs font-semibold text-white {{ $statusClasses[$project['status_group'] ?? 'ready'] ?? 'bg-secondary' }}">
{{ $project['status'] ?? '' }}
</span>
<h1 class="mt-4 text-4xl font-bold text-white lg:text-6xl">{{ $project['title'] ?? '' }}</h1>
@ -49,20 +67,29 @@
<div class="container-padding">
<div class="grid gap-5 md:grid-cols-2 lg:grid-cols-4">
<div class="card-elevated rounded-2xl p-5">
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Preis / Verfuegbarkeit</p>
<p class="mt-2 font-semibold text-secondary">{{ $project['price_from'] ?? 'Auf Anfrage' }}</p>
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
{{ data_get($showUi, 'stat_price') }}</p>
<p class="mt-2 font-semibold text-secondary">
{{ $project['price_from'] ?? data_get($showUi, 'stat_price_fallback') }}</p>
</div>
<div class="card-elevated rounded-2xl p-5">
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Uebergabe</p>
<p class="mt-2 font-semibold text-foreground">{{ $project['handover'] ?? 'Phase abhaengig' }}</p>
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
{{ data_get($showUi, 'stat_handover') }}</p>
<p class="mt-2 font-semibold text-foreground">
{{ $project['handover'] ?? data_get($showUi, 'stat_handover_fallback') }}</p>
</div>
<div class="card-elevated rounded-2xl p-5">
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Einheiten</p>
<p class="mt-2 font-semibold text-foreground">{{ $project['units'] ?? 'Aktuell pruefen' }}</p>
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
{{ data_get($showUi, 'stat_units') }}</p>
<p class="mt-2 font-semibold text-foreground">
{{ $project['units'] ?? data_get($showUi, 'stat_units_fallback') }}</p>
</div>
<div class="card-elevated rounded-2xl p-5">
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">Datenstand</p>
<p class="mt-2 font-semibold text-foreground">{{ $confidenceLabels[$project['data_confidence'] ?? 'yellow'] ?? 'Pruefen' }}</p>
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
{{ data_get($showUi, 'stat_data_confidence') }}</p>
<p class="mt-2 font-semibold text-foreground">
{{ $confidenceLabels[$project['data_confidence'] ?? 'yellow'] ?? data_get($showUi, 'stat_data_confidence_fallback') }}
</p>
</div>
</div>
</div>
@ -73,20 +100,60 @@
<div class="grid gap-12 lg:grid-cols-[0.72fr_0.28fr]">
<article>
<p class="mb-4 text-sm font-semibold uppercase tracking-[0.22em] text-secondary">
Investment Case
{{ data_get($showUi, 'section_investment') }}
</p>
<h2 class="text-section-title">{{ $project['short'] ?? '' }}</h2>
<p class="mt-6 text-large leading-relaxed text-muted-foreground">
{{ $project['marcel_take'] ?? '' }}
</p>
@if (!empty($project['official_description_de']))
<div class="mt-8 border-t border-border/70 pt-6">
<p
class="mb-2 text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground/80">
{{ data_get($showUi, 'official_description_label', data_get($ui, 'modal.official_description_label')) }}
</p>
<p class="leading-relaxed text-muted-foreground">
{{ $project['official_description_de'] }}
</p>
</div>
@endif
@if ($galleryImages->isNotEmpty())
<div class="mt-10 space-y-4">
<div class="flex items-end justify-between gap-4">
<h3 class="text-2xl font-semibold text-foreground">
{{ data_get($showUi, 'gallery_heading', data_get($ui, 'modal.gallery_heading')) }}
</h3>
<p class="text-sm text-muted-foreground">
{{ $galleryImages->count() }}
{{ data_get($ui, 'modal.gallery_count_word', 'Bilder') }}
</p>
</div>
<div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
@foreach ($galleryImages->take(6) as $index => $image)
<a href="{{ $image }}" target="_blank" rel="noopener"
class="group overflow-hidden rounded-2xl bg-accent focus:outline-none focus:ring-2 focus:ring-secondary focus:ring-offset-2 focus:ring-offset-background">
<img src="{{ $image }}"
alt="{{ ($project['title'] ?? '') . ' ' . data_get($ui, 'modal.gallery_image_word', 'Galerie Bild') . ' ' . ($index + 1) }}"
class="aspect-[16/9] w-full object-cover transition duration-500 group-hover:scale-105"
loading="lazy">
</a>
@endforeach
</div>
</div>
@endif
<div class="mt-10 rounded-2xl border border-secondary/20 bg-secondary/5 p-6">
<h3 class="text-lg font-semibold text-foreground">Fuer wen eignet sich das Projekt?</h3>
<p class="mt-3 leading-relaxed text-muted-foreground">{{ $project['buyer_profile'] ?? '' }}</p>
<h3 class="text-lg font-semibold text-foreground">{{ data_get($showUi, 'for_whom') }}</h3>
<p class="mt-3 leading-relaxed text-muted-foreground">{{ $project['buyer_profile'] ?? '' }}
</p>
</div>
<div class="mt-10">
<h3 class="text-2xl font-semibold text-foreground">Harte Punkte fuer die Einordnung</h3>
<h3 class="text-2xl font-semibold text-foreground">{{ data_get($showUi, 'hard_facts') }}
</h3>
<ul class="mt-5 grid gap-3">
@foreach ($project['highlights'] ?? [] as $highlight)
<li class="flex gap-3 rounded-xl bg-accent p-4 text-muted-foreground">
@ -99,26 +166,29 @@
</article>
<aside class="space-y-5">
@if ($dev)
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">{{ data_get($showUi, 'source_heading') }}
</h3>
<p class="mt-2 text-sm text-muted-foreground">
{{ data_get($showUi, 'source_text') }}
</p>
@if (!empty($project['official_url']))
<a href="{{ $project['official_url'] }}" target="_blank" rel="noopener"
class="mt-5 inline-flex items-center gap-2 font-semibold text-secondary hover:text-secondary/80">
{{ data_get($showUi, 'azizi_link') }}
@svg('heroicon-o-arrow-up-right', 'h-4 w-4')
</a>
@endif
</div>
@endif
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">Projektquelle</h3>
<h3 class="font-semibold text-foreground">{{ data_get($showUi, 'next_step_heading') }}</h3>
<p class="mt-2 text-sm text-muted-foreground">
Offizieller Azizi-Link als Projektanker. Preise und Verfuegbarkeit werden vor Beratung aktuell geprueft.
</p>
@if (! empty($project['official_url']))
<a href="{{ $project['official_url'] }}" target="_blank" rel="noopener" class="mt-5 inline-flex items-center gap-2 font-semibold text-secondary hover:text-secondary/80">
Azizi-Projektseite
@svg('heroicon-o-arrow-up-right', 'h-4 w-4')
</a>
@endif
</div>
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">Naechster Schritt</h3>
<p class="mt-2 text-sm text-muted-foreground">
Marcel prueft aktive Einheiten, aktuellen Zahlungsplan, Floor Plans und ob Resale oder Off-Plan fuer Ihre Strategie sinnvoller ist.
{{ data_get($showUi, 'next_step_text') }}
</p>
<a href="/contact" class="mt-5 inline-flex w-full justify-center btn-primary-accent">
Verfuegbarkeit anfragen
{{ data_get($showUi, 'request_cta') }}
</a>
</div>
</aside>
@ -129,39 +199,44 @@
<section class="section-padding bg-accent">
<div class="container-padding">
<div class="mx-auto max-w-3xl text-center">
<h2 class="text-section-title">Wie B2in dieses Projekt prueft</h2>
<h2 class="text-section-title">{{ data_get($showUi, 'process_title') }}</h2>
<p class="mt-4 text-large text-muted-foreground">
Diese Preview trennt redaktionelle Einordnung von beweglichen Vertriebsdaten. Der Live-Stand wird immer vor einer konkreten Empfehlung geprueft.
{{ data_get($showUi, 'process_intro') }}
</p>
</div>
<div class="mx-auto mt-10 grid max-w-5xl gap-5 md:grid-cols-3">
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">1. Strategische Passung</h3>
<p class="mt-2 text-sm text-muted-foreground">Cashflow, Eigennutzung, Wertzuwachs oder Trophy Asset.</p>
</div>
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">2. Aktive Verfuegbarkeit</h3>
<p class="mt-2 text-sm text-muted-foreground">Einheiten, Etagen, Views, Zahlungsplan und Resale-Angebote.</p>
</div>
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">3. Exit-Logik</h3>
<p class="mt-2 text-sm text-muted-foreground">Vermietbarkeit, Haltezeit, Zielgruppe und Wiederverkauf.</p>
</div>
@foreach (data_get($showUi, 'process_steps', []) as $step)
<div class="card-elevated rounded-2xl p-6">
<h3 class="font-semibold text-foreground">{{ $step['title'] ?? '' }}</h3>
<p class="mt-2 text-sm text-muted-foreground">{{ $step['text'] ?? '' }}</p>
</div>
@endforeach
</div>
</div>
</section>
<section class="section-padding">
<div class="container-padding">
<div class="mx-auto max-w-3xl rounded-2xl border border-secondary/20 bg-secondary/5 p-8 text-center lg:p-12">
<h2 class="text-section-title">Interesse an {{ $project['title'] ?? 'diesem Projekt' }}?</h2>
<div
class="mx-auto max-w-3xl rounded-2xl border border-secondary/20 bg-secondary/5 p-8 text-center lg:p-12">
<h2 class="text-section-title">
{{ str_replace(':title', $project['title'] ?? data_get($showUi, 'interest_default_title'), data_get($showUi, 'interest_heading', '')) }}
</h2>
<p class="mt-4 text-large text-muted-foreground">
Fragen Sie keine Broschuere an. Fragen Sie eine Einordnung an: Passt dieses Projekt zu Ihrer Strategie, Ihrem Budget und Ihrem Zeithorizont?
{{ data_get($showUi, 'interest_text') }}
</p>
<div class="mt-8 flex flex-col justify-center gap-3 sm:flex-row">
<a href="/contact" class="btn-primary-accent px-8 py-4 text-lg">Beratung anfragen</a>
<a href="{{ route('dev.immobilien-azizi') }}#projekte" class="btn-secondary-accent px-8 py-4 text-lg">Weitere Projekte ansehen</a>
<a href="/contact"
class="btn-primary-accent px-8 py-4 text-lg">{{ data_get($showUi, 'interest_cta_consult') }}</a>
<a href="{{ $overviewUrl }}#projekte"
class="btn-secondary-accent px-8 py-4 text-lg">{{ data_get($showUi, 'interest_cta_more') }}</a>
</div>
<div class="mt-10 text-left">
<livewire:web.components.sections.immobilien-contact-form :projectSlug="$project['slug'] ?? ''" :projectTitle="$project['title'] ?? ''"
:showInterest="false" :submitLabel="data_get($ui, 'modal.request_submit', 'Anfrage absenden')"
wire:key="azizi-project-detail-contact-form-{{ $project['slug'] ?? 'project' }}" />
</div>
</div>
</div>

File diff suppressed because it is too large Load diff