Interior-Feinschliff: Hero-Slideshow, Lektorat, Rechtstexte, Aufräumen und Korrekturen 08.10.
Startseite und Heroes - Hero-Slideshow (11 Motive inkl. Febrü) mit Infokarte, Laufzeit-Linie, größeren Klickflächen, Goldrahmen und mobiler Karte unter dem Bild; Zeile über der Überschrift, neue Vertrauenspunkte - Hero-Stil auf Marken, Über uns und Kontakt übertragen, Breadcrumb entfernt - Gründer-Leiste, Vision-Box auf Ocker, Showroom-Display in Box mit „Größer ansehen“/Vollbild - Akzentfarbe #a8741f, größere Serif-Überschriften in der Interior-Welt - Marken: Bildpause mit Zitat; Vereine aktualisiert und verlinkt Inhalte - Lektorat aller angezeigten Texte, /about-Korrekturen, Rechtstexte (DDG, TDDDG, Hosting Hetzner) - Ablauf Maßanfertigung überall einheitlich, Magazin-Beitrag neu, alte Beiträge offline, deutsches Datum/Lesezeit, FAQ Projektausstattung, Otterpohl - Referenzen-Seite per CMS-Schalter ausblendbar CMS und Technik - Tote Sektionen, Felder, Seiten und Komponenten entfernt und archiviert (dev/2026-08-28/archiv-*) - Entwurf /entwurf, Farb-Schalter und /welcome entfernt; Test-Routen nur noch lokal - Seitenbaum-Beschreibungen geprüft, fehlende CMS-Felder ergänzt, Markenliste aus „Kernmarken“ - Admin-Bildvorschauen repariert, verwendete Bilder in die Mediathek übernommen - Seeder für das Deployment siehe dev/2026-08-28/entwicklungsplan.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
4b07bbdcae
commit
fcb10be120
406 changed files with 22549 additions and 3798 deletions
|
|
@ -915,7 +915,7 @@ section.bg-secondary .text-secondary {
|
|||
hsl(var(--hero-container)) 0%,
|
||||
hsl(var(--hero-container-dark)) 100%
|
||||
);
|
||||
box-shadow: 0 10px 30px -10px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: rgba(0, 0, 0, 0.1) 0px 10px 20px 5px;
|
||||
|
||||
position: relative;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,12 +32,12 @@
|
|||
--primary-foreground: 38 33% 95%; /* Creme auf Tanne */
|
||||
|
||||
/* Akzent: Logo-Bogen, Hervorhebungen, Icons, aktive Navigation */
|
||||
--secondary: 37 62% 55%; /* #d39e46 Ocker */
|
||||
--secondary-light: 37 66% 63%;
|
||||
--secondary-lighter: 37 60% 80%;
|
||||
--secondary-dark: 37 55% 45%;
|
||||
--secondary-deep: 37 50% 36%; /* Ocker als Textfarbe auf hellem Grund */
|
||||
--cta-band-line: 37 62% 55%; /* Haarlinie am Abschlussband in Ocker */
|
||||
--secondary: 37 69% 39%; /* #a8741f Ocker, dunkler (07.10.2026; vorher #d39e46) */
|
||||
--secondary-light: 37 62% 48%;
|
||||
--secondary-lighter: 37 55% 78%;
|
||||
--secondary-dark: 37 70% 32%;
|
||||
--secondary-deep: 37 70% 30%; /* Ocker als Textfarbe auf hellem Grund */
|
||||
--cta-band-line: 37 69% 39%; /* Haarlinie am Abschlussband in Ocker */
|
||||
--secondary-foreground: 38 33% 95%;
|
||||
|
||||
/* Sekundärton für Produkte und ruhige Beschriftungen */
|
||||
|
|
@ -152,13 +152,12 @@
|
|||
--font-secondary: 'IBM Plex Sans', 'Inter', system-ui, -apple-system, sans-serif;
|
||||
}
|
||||
|
||||
/* ── Interior, Variante „Modern“ (Nachtrag 18) ──────────────────────
|
||||
Marcels Rückmeldung vom 23.09.: die Creme-Flächen wirken altbacken. Diese
|
||||
Variante lässt Tanne und Ocker aus dem Logo unangetastet und hellt nur die
|
||||
Flächen auf: Grund fast weiß, Karten weiß, Sektionswechsel in hellem Grau-
|
||||
Beige, Footer in Tanne. Aktiv, sobald der Farb-Schalter (palette-switch)
|
||||
`palette-modern` an <html> setzt; die Wahl liegt im localStorage. */
|
||||
.palette-modern .world-interior {
|
||||
/* ── Interior: helle Flächen (Nachtrag 18, seit 25.09.2026 fest) ─────
|
||||
Marcels Rückmeldung vom 23.09.: die Creme-Flächen wirken altbacken. Tanne und
|
||||
Ocker aus dem Logo bleiben, nur die Flächen werden heller: Grund fast weiß,
|
||||
Karten weiß, Sektionswechsel in hellem Grau-Beige, Footer in Tanne. Die Werte
|
||||
in :root bleiben die Grundlage, die Immobilien-Welt erbt sie. */
|
||||
.world-interior {
|
||||
--background: 40 25% 98%; /* #fbfaf8 fast weiß, leicht warm */
|
||||
--card: 0 0% 100%; /* Karten reinweiß */
|
||||
--popover: 0 0% 100%;
|
||||
|
|
@ -187,71 +186,11 @@
|
|||
--shadow-elevated: 0 24px 48px -20px hsl(var(--foreground) / 0.2);
|
||||
}
|
||||
|
||||
/* ── Interior, Entwurf „Greige“ (Nachtrag 19, Briefing Marcel 24.09.) ─────
|
||||
Heller, leicht kühler Grundton (Greige statt Creme), deutlich präsenteres
|
||||
Tannengrün, Gold nur als feine Linie. Liegt als Klasse am <body> der
|
||||
Entwurfsseite /entwurf – nicht am <html> wie der Browser-Schalter, damit
|
||||
sich beide nicht überlagern. */
|
||||
.world-interior.palette-greige {
|
||||
--background: 45 14% 93%; /* #f0eeeb Greige, Off-White */
|
||||
--foreground: 166 25% 13%; /* Tannengrau für Text */
|
||||
|
||||
--card: 40 20% 97%; /* #f8f7f4 – hell, aber kein steriles Weiß */
|
||||
--card-foreground: 166 25% 13%;
|
||||
--popover: 40 20% 97%;
|
||||
--popover-foreground: 166 25% 13%;
|
||||
|
||||
--primary: 165 44% 14%; /* #14342c Tannengrün, klar und dunkel */
|
||||
--primary-light: 165 32% 22%;
|
||||
--primary-lighter: 165 12% 82%;
|
||||
--primary-dark: 165 50% 10%;
|
||||
--primary-foreground: 45 20% 95%;
|
||||
|
||||
--secondary: 38 45% 46%; /* #aa8341 gedecktes Gold */
|
||||
--secondary-light: 38 45% 56%;
|
||||
--secondary-lighter: 40 40% 80%;
|
||||
--secondary-dark: 38 48% 38%;
|
||||
--secondary-deep: 38 55% 34%; /* Gold als Textfarbe auf hellem Grund */
|
||||
--cta-band-line: 38 45% 46%;
|
||||
--secondary-foreground: 45 20% 95%;
|
||||
|
||||
--clay: 30 8% 50%;
|
||||
|
||||
--muted: 45 12% 90%;
|
||||
--muted-foreground: 160 8% 36%;
|
||||
|
||||
--accent: 45 12% 89%; /* #e8e6e0 Sektionswechsel */
|
||||
--accent-dark: 45 12% 84%;
|
||||
--accent-foreground: 166 25% 13%;
|
||||
|
||||
--dark-bg: 165 44% 14%;
|
||||
--dark-text: 45 20% 95%;
|
||||
--dark-muted: 45 15% 78%;
|
||||
|
||||
/* Footer in Tannengrün, Haarlinie in Gold */
|
||||
--footer-bg: 165 44% 14%;
|
||||
--footer-fg: 45 20% 95%;
|
||||
--footer-muted: 45 15% 78%;
|
||||
--footer-line: 38 45% 46%;
|
||||
|
||||
--cta-band-end: 165 30% 22%;
|
||||
|
||||
--border: 40 10% 84%;
|
||||
--input: 40 20% 98%;
|
||||
--ring: 165 44% 14%;
|
||||
|
||||
--hero-container: 40 20% 97%;
|
||||
--hero-container-dark: 45 12% 90%;
|
||||
--hero-container-light: 40 25% 98%;
|
||||
|
||||
--shadow-card: 0 6px 24px -10px hsl(var(--foreground) / 0.14);
|
||||
--shadow-elevated: 0 30px 60px -28px hsl(var(--primary) / 0.35);
|
||||
}
|
||||
}
|
||||
|
||||
/* Interior: Ocker ist Akzent, kein Flächenton unter Text – Creme auf Ocker erreicht
|
||||
keinen ausreichenden Kontrast. Der zweite Hero-Button wird deshalb zur Kontur in
|
||||
Tanne, und Ocker-Text auf Sand (Footer) nutzt die tiefe Stufe. */
|
||||
Tanne. */
|
||||
.world-interior .btn-secondary-accent {
|
||||
background: transparent !important;
|
||||
color: hsl(var(--primary));
|
||||
|
|
@ -265,17 +204,13 @@
|
|||
border-color: hsl(var(--primary));
|
||||
}
|
||||
|
||||
/* Auf dem dunklen Footer trägt Ocker in voller Stärke. */
|
||||
.world-interior .section-footer .text-secondary {
|
||||
color: hsl(var(--secondary-deep));
|
||||
}
|
||||
|
||||
/* Variante „Modern“: auf dem dunklen Footer trägt Ocker in voller Stärke. */
|
||||
.palette-modern .world-interior .section-footer .text-secondary {
|
||||
color: hsl(var(--secondary));
|
||||
}
|
||||
|
||||
/* Variante „Modern“: Abschlussband und Footer sind beide dunkel – eine helle Haarlinie trennt sie. */
|
||||
.palette-modern .world-interior .section-footer {
|
||||
/* Abschlussband und Footer sind beide dunkel – eine helle Haarlinie trennt sie. */
|
||||
.world-interior .section-footer {
|
||||
border-top: 1px solid hsl(var(--footer-muted) / 0.35);
|
||||
}
|
||||
|
||||
|
|
@ -312,159 +247,65 @@
|
|||
background: linear-gradient(145deg, hsl(var(--primary-light)) 0%, hsl(var(--primary)) 100%);
|
||||
}
|
||||
|
||||
/* Variante „Modern“: der Footer ist dunkel, also das negative Logo statt des positiven. */
|
||||
/* Der Interior-Footer ist dunkel, also das negative Logo statt des positiven. */
|
||||
.footer-logo-dark {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.palette-modern .world-interior .footer-logo-light {
|
||||
.world-interior .footer-logo-light {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.palette-modern .world-interior .footer-logo-dark {
|
||||
.world-interior .footer-logo-dark {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@import "./shared-styles.css";
|
||||
|
||||
/* ── Entwurf „Greige“: Footer dunkel mit Goldlinie und negativem Logo ─────── */
|
||||
.world-interior.palette-greige .section-footer {
|
||||
border-top: 1px solid hsl(var(--secondary) / 0.6);
|
||||
/* Interior: EB Garamond wirkt bei gleicher Größe deutlich kleiner als IBM Plex Sans der
|
||||
Immobilien-Welt. Die kleinen Überschriften (h2/h3 mit text-xl, h4) bekommen deshalb hier eine
|
||||
Stufe mehr (07.10.2026); die Immobilien-Welt bleibt unverändert. */
|
||||
.world-interior :is(h2, h3).text-xl {
|
||||
font-size: 1.5rem;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.world-interior.palette-greige .section-footer .text-secondary {
|
||||
.world-interior h4 {
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
/* Slideshow-Punkte im Hero: die Glass-Flow-Regel für Buttons (Schatten, Anheben, Aufhellen) gilt
|
||||
hier nicht – der Button ist nur eine unsichtbare Klickfläche um den dünnen Balken. */
|
||||
.variante-glass-flow button[data-hero-dot],
|
||||
.variante-glass-flow button[data-hero-dot]:hover {
|
||||
box-shadow: none;
|
||||
transform: none;
|
||||
filter: none;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* Auf Ockerflächen wird `text-secondary` sonst zu Tanne (shared-styles.css) – in der weißen Box der
|
||||
Vision-Section (Startseite) trägt die Hervorhebung wieder Ocker. */
|
||||
section.bg-secondary [data-vision-box] .text-secondary {
|
||||
color: hsl(var(--secondary));
|
||||
}
|
||||
|
||||
.world-interior.palette-greige .footer-logo-light {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.world-interior.palette-greige .footer-logo-dark {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* ── Hero des Entwurfs: Rahmen mit Goldkante, grüne Flanken, Slider ────────
|
||||
Goldkanten als Verlaufs-Border: transparenter Rand, Fläche auf padding-box,
|
||||
Goldverlauf auf border-box. Kein Pseudo-Rand mit Maske mehr – der ließ an
|
||||
der gerundeten Kante eine helle Linie durchscheinen. Die grünen Flanken sind
|
||||
Inline-SVGs (components/web/hero-flank-*), skaliert über die Rahmenhöhe. */
|
||||
.hero-draft .hero-frame {
|
||||
/* Heroes der Interior-Welt (Startseite, Marken, Über uns, Kontakt): Rahmen als Goldverlauf
|
||||
(07.10.2026, Vorbild „Farbwelt und Stil“). Die Immobilien-Welt behält ihren Rahmen.
|
||||
Transparenter Rand, Fläche auf padding-box, Verlauf auf border-box – so folgt die Linie
|
||||
der Rundung ohne Pseudo-Element. Selektor schlägt die Glass-Flow-Regel für den Rahmen. */
|
||||
.world-interior .variante-glass-flow div.hero-frame,
|
||||
.world-interior div.hero-frame {
|
||||
border: 1.5px solid transparent;
|
||||
background:
|
||||
linear-gradient(hsl(var(--hero-container)), hsl(var(--hero-container))) padding-box,
|
||||
linear-gradient(to bottom right, hsl(40, 5.65%, 95.65%), hsl(40, 15.95%, 93.9%)) padding-box,
|
||||
linear-gradient(
|
||||
125deg,
|
||||
hsl(var(--secondary-light)) 0%,
|
||||
hsl(var(--secondary)) 28%,
|
||||
hsl(var(--secondary) / 0.35) 62%,
|
||||
hsl(var(--secondary-light)) 100%
|
||||
hsl(var(--secondary-lighter) / 0.9) 0%,
|
||||
hsl(var(--secondary-light) / 0.75) 22%,
|
||||
hsl(var(--secondary-lighter) / 0.45) 55%,
|
||||
hsl(var(--secondary-light) / 0.75) 82%,
|
||||
hsl(var(--secondary-lighter) / 0.9) 100%
|
||||
) border-box;
|
||||
box-shadow: var(--shadow-elevated);
|
||||
isolation: isolate;
|
||||
}
|
||||
|
||||
.hero-draft .hero-flank {
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.hero-draft .hero-flank-right {
|
||||
top: 0;
|
||||
right: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.hero-draft .hero-flank-left {
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
height: 46%;
|
||||
}
|
||||
|
||||
.hero-draft .hero-image {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* Goldkante um das Bild, gleiche Technik wie am Rahmen */
|
||||
.hero-draft .hero-image-frame {
|
||||
border: 1.5px solid transparent;
|
||||
border-radius: 1.25rem;
|
||||
background:
|
||||
linear-gradient(hsl(var(--card)), hsl(var(--card))) padding-box,
|
||||
linear-gradient(
|
||||
135deg,
|
||||
hsl(var(--secondary-light)) 0%,
|
||||
hsl(var(--secondary)) 40%,
|
||||
hsl(var(--secondary) / 0.4) 100%
|
||||
) border-box;
|
||||
box-shadow: var(--shadow-elevated);
|
||||
}
|
||||
|
||||
.hero-draft .hero-eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
font-size: 0.75rem;
|
||||
letter-spacing: 0.28em;
|
||||
text-transform: uppercase;
|
||||
color: hsl(var(--muted-foreground));
|
||||
}
|
||||
|
||||
.hero-draft .hero-eyebrow::after {
|
||||
content: "";
|
||||
width: 3.5rem;
|
||||
height: 1px;
|
||||
background: hsl(var(--secondary));
|
||||
}
|
||||
|
||||
.hero-draft .hero-title {
|
||||
font-family: var(--font-secondary);
|
||||
font-size: clamp(2rem, 3.1vw, 3.3rem);
|
||||
line-height: 1.12;
|
||||
font-weight: 400;
|
||||
letter-spacing: -0.01em;
|
||||
color: hsl(var(--primary));
|
||||
}
|
||||
|
||||
.hero-draft .hero-title em {
|
||||
font-style: normal;
|
||||
color: hsl(var(--secondary-deep));
|
||||
}
|
||||
|
||||
/* Button: Goldrand rundum, unten kräftiger, Pfeil in Gold */
|
||||
.hero-draft .btn-hero {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
padding: 1rem 1.75rem;
|
||||
border-radius: 0.75rem;
|
||||
font-weight: 500;
|
||||
color: hsl(var(--primary-foreground));
|
||||
background: linear-gradient(145deg, hsl(var(--primary)) 0%, hsl(var(--primary-light)) 100%);
|
||||
border: 1px solid hsl(var(--secondary));
|
||||
border-bottom-width: 3px;
|
||||
box-shadow: 0 14px 30px -14px hsl(var(--primary) / 0.6);
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.hero-draft .btn-hero svg {
|
||||
color: hsl(var(--secondary-light));
|
||||
}
|
||||
|
||||
.hero-draft .btn-hero:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 18px 34px -14px hsl(var(--primary) / 0.7);
|
||||
}
|
||||
|
||||
.hero-draft .hero-slide {
|
||||
transition: opacity 1.4s ease-in-out;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.hero-draft .hero-slide {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -4,7 +4,7 @@ return [
|
|||
'impressum' => [
|
||||
'title' => 'Impressum',
|
||||
'meta_title' => 'Impressum',
|
||||
'subtitle' => 'Angaben gemäß § 5 TMG',
|
||||
'subtitle' => 'Angaben gemäß § 5 DDG',
|
||||
'back_link' => '← Zurück',
|
||||
'content' => '
|
||||
<div>
|
||||
|
|
@ -24,7 +24,7 @@ return [
|
|||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">Kontakt</h2>
|
||||
<p>
|
||||
E-Mail: <a href="mailto:info@b2in.de" class="text-secondary hover:underline">info@b2in.de</a><br>
|
||||
E-Mail: <a href="mailto:info@b2in.eu" class="text-secondary hover:underline">info@b2in.eu</a><br>
|
||||
Telefon: +49 (0) 5221 9255055
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -33,7 +33,7 @@ return [
|
|||
<h2 class="text-lg font-semibold text-foreground mb-2">Registereintrag</h2>
|
||||
<p>
|
||||
Eintragung im Handelsregister.<br>
|
||||
Registergericht: Amtsg. Bad Oeynhausen<br>
|
||||
Registergericht: Amtsgericht Bad Oeynhausen<br>
|
||||
Registernummer: HRB 13068
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -47,7 +47,7 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV</h2>
|
||||
<p>
|
||||
Marcel Scheibe<br>
|
||||
Feldstraße 59<br>
|
||||
|
|
@ -56,7 +56,7 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">EU-Streitschlichtung</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">Verbraucherstreitbeilegung</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
|
||||
</p>
|
||||
|
|
@ -65,7 +65,7 @@ return [
|
|||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">Haftung für Inhalte</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Als Diensteanbieter sind wir gemäß § 7 Abs. 1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.
|
||||
Als Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.
|
||||
</p>
|
||||
<p class="text-muted-foreground">
|
||||
Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.
|
||||
|
|
@ -101,25 +101,25 @@ return [
|
|||
'terms' => [
|
||||
'title' => 'Nutzungsbedingungen',
|
||||
'meta_title' => 'Nutzungsbedingungen',
|
||||
'subtitle' => 'Stand: 13.03.2026',
|
||||
'subtitle' => 'Stand: 06.10.2026',
|
||||
'back_link' => '← Zurück',
|
||||
'content' => '
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">1. Geltungsbereich</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Diese Nutzungsbedingungen gelten für die Nutzung der öffentlich zugänglichen Website und der damit verbundenen Informationsdienste der B2in GmbH („B2in", „wir", „uns"). Mit dem Aufruf und der Nutzung unserer Website erklären Sie sich mit diesen Bedingungen einverstanden.
|
||||
Diese Nutzungsbedingungen gelten für die Nutzung der öffentlich zugänglichen Website und der damit verbundenen Informationsdienste der B2in GmbH („B2in“, „wir“, „uns“). Mit dem Aufruf und der Nutzung unserer Website erklären Sie sich mit diesen Bedingungen einverstanden.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">2. Leistungsbeschreibung</h2>
|
||||
<p class="text-muted-foreground">
|
||||
B2in ist das Netzwerk, das exklusives Design und internationale Immobilien verbindet („Connecting Design and Property"). Über unsere Website bieten wir unverbindliche Informationen zu unseren Dienstleistungen, Immobilienprojekten (z. B. in Dubai oder Lissabon), Supply-Chain-Management und unserem Einrichtungsnetzwerk an. Die konkrete Leistungserbringung, Vermittlung oder Beschaffung erfolgt nicht über die Website, sondern ausschließlich auf Basis gesonderter, individueller Verträge.
|
||||
Unter B2in Interior bieten wir hochwertige Einrichtung mit ausgewählten Marken, Maßanfertigung und persönlicher Beratung für private Räume und Projekte an; ergänzend informieren wir über ausgewählte internationale Immobilienprojekte. Über unsere Website bieten wir unverbindliche Informationen zu unseren Leistungen, Marken, Einrichtungs- und Ausstattungsprojekten sowie zu Immobilienprojekten (z. B. in Dubai) an. Die konkrete Leistungserbringung, Vermittlung oder Beschaffung erfolgt nicht über die Website, sondern ausschließlich auf Basis gesonderter, individueller Verträge.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">3. Unverbindlichkeit von Immobilien- und Investmentinformationen (WICHTIG!)</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">3. Unverbindlichkeit von Immobilien- und Investmentinformationen</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Die auf der Website dargestellten Immobilienprojekte, Exposés, Preisangaben, Grundrisse und Renditeprognosen (z. B. erwartete Mietrenditen) dienen ausschließlich der allgemeinen Information und Inspiration.
|
||||
</p>
|
||||
|
|
@ -148,7 +148,7 @@ return [
|
|||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">6. Haftungsausschluss</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte (insbesondere Projektbeschreibungen von Drittanbietern) können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs. 1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Wir sind jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen.
|
||||
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte (insbesondere Projektbeschreibungen von Drittanbietern) können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Wir sind jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
|
@ -178,7 +178,7 @@ return [
|
|||
'privacy' => [
|
||||
'title' => 'Datenschutzerklärung',
|
||||
'meta_title' => 'Datenschutzerklärung',
|
||||
'subtitle' => 'Stand: 13.03.2026',
|
||||
'subtitle' => 'Stand: 06.10.2026',
|
||||
'back_link' => '← Zurück',
|
||||
'content' => '
|
||||
<div>
|
||||
|
|
@ -196,9 +196,16 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">2. Datenerfassung auf unserer Website (Server-Log-Dateien)</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">2. Hosting</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Beim Aufruf unserer Website werden durch den auf Ihrem Endgerät zum Einsatz kommenden Browser automatisch Informationen an den Server unserer Website gesendet. Diese Informationen werden temporär in einem sogenannten Logfile gespeichert. Folgende Informationen werden dabei ohne Ihr Zutun erfasst und bis zur automatisierten Löschung gespeichert:
|
||||
Unsere Website wird auf einem Cloud-Server der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, betrieben; der Server steht in deren Rechenzentrum in Falkenstein (Sachsen), Deutschland. Alle beim Aufruf der Website anfallenden Daten – insbesondere die unter Ziffer 3 genannten Server-Log-Daten und die Angaben aus dem Kontaktformular – werden auf diesem Server verarbeitet. Rechtsgrundlage ist unser berechtigtes Interesse an einem sicheren und zuverlässigen Betrieb unserer Website (Art. 6 Abs. 1 lit. f DSGVO). Mit Hetzner besteht ein Vertrag über Auftragsverarbeitung nach Art. 28 DSGVO.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">3. Datenerfassung auf unserer Website (Server-Log-Dateien)</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Beim Aufruf unserer Website werden durch den auf Ihrem Endgerät zum Einsatz kommenden Browser automatisch Informationen an den Server unserer Website gesendet. Diese Informationen werden temporär in einem sogenannten Logfile gespeichert. Folgende Informationen werden dabei ohne Ihr Zutun erfasst, höchstens 14 Tage gespeichert und danach automatisch gelöscht:
|
||||
</p>
|
||||
<ul class="list-disc list-inside text-muted-foreground mt-2 space-y-1">
|
||||
<li>IP-Adresse des anfragenden Rechners</li>
|
||||
|
|
@ -213,12 +220,12 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">3. Kontaktformular und E-Mail-Kontakt</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">4. Kontaktformular und E-Mail-Kontakt</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Wenn Sie uns per Kontaktformular oder E-Mail Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten (wie Name, E-Mail-Adresse, Telefonnummer) zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.
|
||||
Wenn Sie uns per Kontaktformular oder E-Mail Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten (wie Name, E-Mail-Adresse, Telefonnummer) zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter. Unsere Domains und unser E-Mail-Postfach liegen bei der united-domains GmbH, Gautinger Straße 10, 82319 Starnberg; E-Mails, die Sie uns schreiben, und unsere Antworten werden über deren Server übertragen und dort gespeichert. Auch mit united-domains besteht ein Vertrag über Auftragsverarbeitung nach Art. 28 DSGVO.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen (z. B. Immobilien-Investment oder Supply-Chain-Management) erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO), sofern diese abgefragt wurde.
|
||||
Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen (z. B. Beratung, Planung und Angebot für Ihre Einrichtung oder Anfragen zu Immobilienprojekten) erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO), sofern diese abgefragt wurde.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
Die von Ihnen im Kontaktformular eingegebenen Daten verbleiben bei uns, bis Sie uns zur Löschung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck für die Datenspeicherung entfällt (z. B. nach abgeschlossener Bearbeitung Ihrer Anfrage). Zwingende gesetzliche Bestimmungen – insbesondere Aufbewahrungsfristen – bleiben unberührt.
|
||||
|
|
@ -226,12 +233,12 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">4. Cookies</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">5. Cookies</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Unsere Website verwendet Cookies. Das sind kleine Textdateien, die Ihr Browser automatisch erstellt und die auf Ihrem Endgerät gespeichert werden.
|
||||
</p>
|
||||
<ul class="list-disc list-inside text-muted-foreground mt-2 space-y-1">
|
||||
<li><strong>Technisch notwendige Cookies:</strong> Diese sind erforderlich, um den Betrieb der Website zu gewährleisten (z. B. das Speichern Ihrer Consent-Einstellungen). Die Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. f DSGVO.</li>
|
||||
<li><strong>Technisch notwendige Cookies:</strong> Diese sind erforderlich, um den Betrieb der Website zu gewährleisten (z. B. das Speichern Ihrer Consent-Einstellungen). Die Rechtsgrundlage hierfür ist § 25 Abs. 2 Nr. 2 TDDDG sowie Art. 6 Abs. 1 lit. f DSGVO.</li>
|
||||
<li><strong>Analyse- und Marketing-Cookies:</strong> Diese Cookies (z. B. Google Analytics) werden nur gesetzt, wenn Sie uns zuvor Ihre ausdrückliche Einwilligung über unser Cookie-Consent-Banner erteilt haben (Art. 6 Abs. 1 lit. a DSGVO).</li>
|
||||
</ul>
|
||||
<p class="text-muted-foreground mt-4">
|
||||
|
|
@ -242,17 +249,17 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">5. Google Analytics</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">6. Google Analytics</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Soweit Sie Ihre Einwilligung erklärt haben, wird auf dieser Website Google Analytics eingesetzt, ein Webanalysedienst der Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland („Google").
|
||||
Soweit Sie Ihre Einwilligung erklärt haben, wird auf dieser Website Google Analytics eingesetzt, ein Webanalysedienst der Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland („Google“).
|
||||
Google Analytics verwendet Cookies, die eine Analyse der Benutzung der Website durch Sie ermöglichen. Die dadurch erzeugten Informationen werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
<strong>IP-Anonymisierung:</strong> Wir haben auf dieser Website die Funktion IP-Anonymisierung aktiviert. Dadurch wird Ihre IP-Adresse von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum vor der Übermittlung in die USA gekürzt.
|
||||
<strong>IP-Adressen:</strong> Wir setzen Google Analytics 4 ein. Dort werden IP-Adressen nicht protokolliert oder gespeichert; Google nutzt sie lediglich, um daraus grobe Standortdaten abzuleiten, und verwirft sie anschließend.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
<strong>Zweck und Rechtsgrundlage:</strong> In unserem Auftrag wird Google diese Informationen benutzen, um Ihre Nutzung der Website auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen.
|
||||
Die Rechtsgrundlage für den Einsatz von Google Analytics ist Ihre freiwillig erteilte Einwilligung gemäß Art. 6 Abs. 1 lit. a DSGVO sowie § 25 Abs. 1 TTDSG/TDDDG.
|
||||
Die Rechtsgrundlage für den Einsatz von Google Analytics ist Ihre freiwillig erteilte Einwilligung gemäß Art. 6 Abs. 1 lit. a DSGVO sowie § 25 Abs. 1 TDDDG.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
<strong>Datenübermittlung in die USA:</strong> Datenübertragungen in die USA stützen sich auf den Angemessenheitsbeschluss der EU-Kommission (EU-US Data Privacy Framework), unter dem Google LLC zertifiziert ist, sowie auf Standardvertragsklauseln.
|
||||
|
|
@ -267,21 +274,21 @@ return [
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">6. Externe Links (z. B. Google Maps)</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">7. Externe Links (z. B. Google Maps)</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Auf unserer Website finden Sie Links zu externen Diensten, wie beispielsweise zu Google Maps, um Ihnen Standorte (z. B. Immobilien-Projekte) zu visualisieren. Wir binden diese Dienste nicht direkt auf unserer Seite ein, sondern verlinken lediglich darauf. Wenn Sie auf einen solchen Link klicken, verlassen Sie unsere Website und werden auf die Server des jeweiligen Anbieters (z. B. Google) weitergeleitet. Erst dort werden Ihre Daten (wie z. B. Ihre IP-Adresse) durch den externen Anbieter erfasst. Es gilt die Datenschutzerklärung des jeweiligen Anbieters.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">7. SSL- bzw. TLS-Verschlüsselung</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">8. SSL- bzw. TLS-Verschlüsselung</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Diese Seite nutzt aus Sicherheitsgründen und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL- bzw. TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://" auf „https://" wechselt und an dem Schloss-Symbol in Ihrer Browserzeile. Wenn die Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.
|
||||
Diese Seite nutzt aus Sicherheitsgründen und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL- bzw. TLS-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://“ auf „https://“ wechselt und an dem Schloss-Symbol in Ihrer Browserzeile. Wenn die Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">8. Ihre Rechte als betroffene Person</h2>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">9. Ihre Rechte als betroffene Person</h2>
|
||||
<p class="text-muted-foreground mb-4">
|
||||
Sie haben das Recht:
|
||||
</p>
|
||||
|
|
@ -307,7 +314,7 @@ return [
|
|||
'cookie_policy' => [
|
||||
'title' => 'Cookie-Richtlinie',
|
||||
'meta_title' => 'Cookie-Richtlinie',
|
||||
'subtitle' => 'Stand: 13.03.2026',
|
||||
'subtitle' => 'Stand: 06.10.2026',
|
||||
'back_link' => '← Zurück',
|
||||
'content' => '
|
||||
<div>
|
||||
|
|
@ -316,7 +323,7 @@ return [
|
|||
Verantwortlich für die Cookie-Nutzung auf dieser Website ist:
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
<strong>B2In GmbH</strong><br>
|
||||
<strong>B2in GmbH</strong><br>
|
||||
Feldstraße 59<br>
|
||||
32120 Hiddenhausen<br>
|
||||
Telefon: +49 (0) 5221 9255055<br>
|
||||
|
|
@ -337,8 +344,8 @@ return [
|
|||
Wir unterscheiden zwischen zwei Kategorien von Cookies:
|
||||
</p>
|
||||
<ul class="list-disc list-inside text-muted-foreground space-y-2">
|
||||
<li><strong>Technisch notwendige Cookies:</strong> Diese sind erforderlich, um den Betrieb der Website zu gewährleisten (z. B. das Speichern Ihrer Consent-Einstellungen). Sie können nicht deaktiviert werden. Die Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. f DSGVO.</li>
|
||||
<li><strong>Analyse- und Marketing-Cookies:</strong> Diese Cookies (z. B. Google Analytics) werden nur gesetzt, wenn Sie uns zuvor Ihre ausdrückliche Einwilligung über unser Cookie-Consent-Banner erteilt haben. Die Rechtsgrundlage ist Art. 6 Abs. 1 lit. a DSGVO sowie § 25 Abs. 1 TTDSG/TDDDG.</li>
|
||||
<li><strong>Technisch notwendige Cookies:</strong> Diese sind erforderlich, um den Betrieb der Website zu gewährleisten (z. B. das Speichern Ihrer Consent-Einstellungen). Sie können nicht deaktiviert werden. Die Rechtsgrundlage hierfür ist § 25 Abs. 2 Nr. 2 TDDDG sowie Art. 6 Abs. 1 lit. f DSGVO.</li>
|
||||
<li><strong>Analyse- und Marketing-Cookies:</strong> Diese Cookies (z. B. Google Analytics) werden nur gesetzt, wenn Sie uns zuvor Ihre ausdrückliche Einwilligung über unser Cookie-Consent-Banner erteilt haben. Die Rechtsgrundlage ist Art. 6 Abs. 1 lit. a DSGVO sowie § 25 Abs. 1 TDDDG.</li>
|
||||
</ul>
|
||||
<p class="text-muted-foreground mt-4">
|
||||
Sie können Ihre Einwilligung jederzeit widerrufen oder anpassen, indem Sie die Cookie-Einstellungen über den folgenden Link aufrufen:
|
||||
|
|
@ -350,11 +357,11 @@ return [
|
|||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">4. Google Analytics</h2>
|
||||
<p class="text-muted-foreground">
|
||||
Soweit Sie Ihre Einwilligung erklärt haben, wird auf dieser Website Google Analytics eingesetzt, ein Webanalysedienst der Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland („Google").
|
||||
Soweit Sie Ihre Einwilligung erklärt haben, wird auf dieser Website Google Analytics eingesetzt, ein Webanalysedienst der Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland („Google“).
|
||||
Google Analytics verwendet Cookies, die eine Analyse der Benutzung der Website durch Sie ermöglichen. Die dadurch erzeugten Informationen werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
<strong>IP-Anonymisierung:</strong> Wir haben auf dieser Website die Funktion IP-Anonymisierung aktiviert. Dadurch wird Ihre IP-Adresse von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum vor der Übermittlung in die USA gekürzt.
|
||||
<strong>IP-Adressen:</strong> Wir setzen Google Analytics 4 ein. Dort werden IP-Adressen nicht protokolliert oder gespeichert; Google nutzt sie lediglich, um daraus grobe Standortdaten abzuleiten, und verwirft sie anschließend.
|
||||
</p>
|
||||
<p class="text-muted-foreground mt-2">
|
||||
<strong>Datenübermittlung in die USA:</strong> Datenübertragungen in die USA stützen sich auf den Angemessenheitsbeschluss der EU-Kommission (EU-US Data Privacy Framework), unter dem Google LLC zertifiziert ist, sowie auf Standardvertragsklauseln.
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@
|
|||
"official_description_label": "Aus dem offiziellen Azizi-Exposé (übersetzt)",
|
||||
"gallery_heading": "Galerie",
|
||||
"gallery_count_word": "Bilder",
|
||||
"gallery_image_word": "Galerie Bild",
|
||||
"gallery_image_word": "Galeriebild",
|
||||
"gallery_zoom_suffix": "groß ansehen",
|
||||
"for_whom": "Für wen eignet sich das Projekt?",
|
||||
"hard_facts": "Wichtige Eckpunkte",
|
||||
|
|
@ -111,11 +111,9 @@
|
|||
"stat_price": "Preis / Verfügbarkeit",
|
||||
"stat_price_fallback": "Auf Anfrage",
|
||||
"stat_handover": "Übergabe",
|
||||
"stat_handover_fallback": "Phase abhängig",
|
||||
"stat_handover_fallback": "Phasenabhängig",
|
||||
"stat_units": "Einheiten",
|
||||
"stat_units_fallback": "Aktuell prüfen",
|
||||
"stat_data_confidence": "Datenstand",
|
||||
"stat_data_confidence_fallback": "Prüfen",
|
||||
"section_investment": "Investment-Einordnung",
|
||||
"for_whom": "Für wen eignet sich das Projekt?",
|
||||
"hard_facts": "Wichtige Eckpunkte",
|
||||
|
|
@ -126,7 +124,7 @@
|
|||
"next_step_text": "Marcel prüft aktive Einheiten, aktuellen Zahlungsplan, Floor Plans und ob Resale oder Off-Plan für Ihre Strategie sinnvoller ist.",
|
||||
"request_cta": "Verfügbarkeit anfragen",
|
||||
"process_title": "Wie B2in dieses Projekt prüft",
|
||||
"process_intro": "Diese Preview trennt redaktionelle Einordnung von beweglichen Vertriebsdaten. Der Live-Stand wird immer vor einer konkreten Empfehlung geprüft.",
|
||||
"process_intro": "Diese Übersicht trennt redaktionelle Einordnung von beweglichen Vertriebsdaten. Der Live-Stand wird immer vor einer konkreten Empfehlung geprüft.",
|
||||
"process_steps": [
|
||||
{
|
||||
"title": "1. Strategische Passung",
|
||||
|
|
@ -152,13 +150,8 @@
|
|||
"construction": "Im Bau",
|
||||
"offplan": "Off-Plan"
|
||||
},
|
||||
"confidence_labels": {
|
||||
"green": "Direkt belegt",
|
||||
"yellow": "Vor Livegang final prüfen",
|
||||
"red": "Nur als Anfragewert nutzen"
|
||||
},
|
||||
"fallbacks": {
|
||||
"handover": "Phase abhängig",
|
||||
"handover": "Phasenabhängig",
|
||||
"project_default": "Projekt"
|
||||
}
|
||||
},
|
||||
|
|
@ -189,11 +182,11 @@
|
|||
"handover": "Übergabe wird aktuell geprüft",
|
||||
"image": "immobile/dubai/azizi-creek-views-4/image/05_kcP9jhA785EDzdKfsUmsGYUrRSq4GLrDxfFKnTqc.webp",
|
||||
"headline": "Aktueller Launch in Al Jaddaf am Dubai Creek.",
|
||||
"text": "Nur 132 Einheiten, 1-BR Apartments und ein einzelnes 3-BR Penthouse direkt am Dubai Creek. Limitiertes Angebot mit Premium-Ausstattung in einer Lage mit klarer Vermietungsstärke.",
|
||||
"text": "Nur 132 Einheiten, 1-BR-Apartments und ein einzelnes 3-BR-Penthouse direkt am Dubai Creek. Limitiertes Angebot mit Premium-Ausstattung in einer Lage mit klarer Vermietungsstärke.",
|
||||
"marcel_take": "Creek Views 4 ist mein aktueller Off-Market-Launch in Dubai. Wer einen kontrollierten, planbaren Einstieg sucht, profitiert von limitiertem Angebot, klarer Lagenlogik am Creek und kurzer Distanz zu Downtown und DXB. Ich begleite die Verfügbarkeit pro Einheit persönlich.",
|
||||
"facts": [
|
||||
"Prime Waterfront Lage am Dubai Creek",
|
||||
"1-BR Apartments ab AED 1.125.000",
|
||||
"Prime-Waterfront-Lage am Dubai Creek",
|
||||
"1-BR-Apartments ab AED 1.125.000",
|
||||
"Einmalig verfügbare 3-BR-Penthouse-Einheit",
|
||||
"Nur 132 Einheiten - bewusst limitiert",
|
||||
"543 - 2.346 sqft Wohnfläche",
|
||||
|
|
@ -343,7 +336,7 @@
|
|||
{
|
||||
"name": "Dubailand / Azizi Milan",
|
||||
"projects": "Azizi Milan",
|
||||
"description": "Azizi Milan ist eine italienisch inspirierte Fashion- und Lifestyle-Adresse nahe IMG Worlds und Global Village. Schwerpunkt sind Grünflächen, Einkaufsstraßen, Retail, Hospitality und ein langfristig angelegter Masterplan. Damit ein Lifestyle- statt reiner Yield-Case."
|
||||
"description": "Azizi Milan ist eine italienisch inspirierte Fashion- und Lifestyle-Adresse nahe IMG Worlds und Global Village. Schwerpunkt sind Grünflächen, Einkaufsstraßen, Retail, Hospitality und ein langfristig angelegter Masterplan. Damit eher ein Lifestyle- als ein reiner Yield-Case."
|
||||
},
|
||||
{
|
||||
"name": "Dubai Healthcare City / Al Jaddaf",
|
||||
|
|
@ -368,7 +361,7 @@
|
|||
{
|
||||
"name": "Al Furjan",
|
||||
"projects": "Al-Furjan-Bestand, Star, ROY Mediterranean, Farishta",
|
||||
"description": "Al Furjan ist der fertige, gut angebundene Yield-Cluster: Metro-Achse, MBZ Road, Nähe zu Al Maktoum International Airport, Expo City, Jebel Ali und Dubai Marina. Studios und 1- bis 2-BR-Apartments mit etabliertem Mietmarkt - vor allem für Cashflow-Käufer interessant."
|
||||
"description": "Al Furjan ist der fertige, gut angebundene Yield-Cluster: Metro-Achse, MBZ Road, Nähe zum Al Maktoum International Airport, Expo City, Jebel Ali und Dubai Marina. Studios und 1- bis 2-BR-Apartments mit etabliertem Mietmarkt - vor allem für Cashflow-Käufer interessant."
|
||||
},
|
||||
{
|
||||
"name": "Dubai Islands",
|
||||
|
|
@ -383,7 +376,7 @@
|
|||
{
|
||||
"name": "Jumeirah Village Circle",
|
||||
"projects": "Azizi Ruby",
|
||||
"description": "JVC ist ein etablierter Wohnkreis im mittleren Dubai mit breitem Mietermarkt und urbaner Alltagslogik. Über Azizi Ruby in der Auswahl vertreten - eher für Cashflow als für Trophy-Asset-Positionierung."
|
||||
"description": "JVC ist ein etablierter Wohnkreis im mittleren Dubai mit breitem Mietmarkt und urbaner Alltagslogik. Über Azizi Ruby in der Auswahl vertreten - eher für Cashflow als für Trophy-Asset-Positionierung."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -451,7 +444,6 @@
|
|||
"Bestandsobjekt mit Verfügbarkeit auf Anfrage",
|
||||
"Prestige-Lage für Eigennutzung oder Vermietung"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "1, 2 Bedrooms & 3 Bedroom Penthouse",
|
||||
"official_headline": "DISCOVER THE BEAUTY OF THE ARABIAN-GULF AT MINA",
|
||||
"official_description": "Revel in beachfront luxury at Mina's contemporary-designed residences, where you can savor breathtaking views from your room and feel the refreshing sea breeze.",
|
||||
|
|
@ -469,21 +461,20 @@
|
|||
"buyer_profile": "Investoren mit Fokus auf Capital Appreciation und planbarem Off-Market-Einstieg",
|
||||
"price_from": "ab AED 1.125.000",
|
||||
"handover": "Übergabe wird aktuell geprüft",
|
||||
"units": "Nur 132 Einheiten (limitiert) - 1-BR und ein 3-BR Penthouse",
|
||||
"units": "Nur 132 Einheiten (limitiert) - 1-BR und ein 3-BR-Penthouse",
|
||||
"image": "immobile/dubai/azizi-creek-views-4/overview-thumbnail/azizi-creek-views-4-overview-thumbnail.webp",
|
||||
"official_url": "/immobilien/azizi-creek-views-4",
|
||||
"short": "Aktueller Off-Market-Launch am Dubai Creek mit nur 132 Einheiten.",
|
||||
"marcel_take": "Creek Views 4 ist mein aktueller Launch in Dubai. Limitiertes Angebot, klare Lagenlogik am Creek und kurze Distanz zu Downtown und DXB. Ich begleite Verfügbarkeit und Auswahl pro Einheit persönlich.",
|
||||
"highlights": [
|
||||
"Prime Waterfront Lage am Dubai Creek",
|
||||
"1-BR Apartments ab AED 1.125.000",
|
||||
"Prime-Waterfront-Lage am Dubai Creek",
|
||||
"1-BR-Apartments ab AED 1.125.000",
|
||||
"Einmalig verfügbare 3-BR-Penthouse-Einheit",
|
||||
"Nur 132 Einheiten - bewusst limitiert",
|
||||
"543 - 2.346 sqft Wohnfläche",
|
||||
"Wenige Minuten bis Downtown Dubai und Burj Khalifa",
|
||||
"Entwickler: Azizi Developments"
|
||||
],
|
||||
"data_confidence": "green"
|
||||
]
|
||||
},
|
||||
{
|
||||
"slug": "royal-bay",
|
||||
|
|
@ -506,7 +497,6 @@
|
|||
"Bewusst kleinere Hausgemeinschaft",
|
||||
"Resale-Verfügbarkeit individuell prüfen"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "1 & 3 BEDROOMS",
|
||||
"official_headline": "A TRANQUIL HAVEN",
|
||||
"official_description": "Bask in the warmth of the sun in your sanctuary at Royal Bay in Palm Jumeirah, a place cleverly angled at 45 degrees with spectacular views of the city’s skyline, the Atlantis Hotel and the Arabian Sea, designed to maximize light and provide stunning views from every room.",
|
||||
|
|
@ -536,7 +526,6 @@
|
|||
"Gebäudehöhe UG+B+G+2P+19",
|
||||
"Nahe Dubai Creek, Downtown, Festival City und DXB"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "STUDIO, 1 & 2 BEDROOMS",
|
||||
"official_headline": "ENCHANTMENT BETWEEN THE SKYLINE AND THE HORIZON",
|
||||
"official_description": "Poised on the edge of the mesmerizing Dubai Creek, Creek Views III unveils a world where tradition meets modernity—offering panoramic vistas that weave Dubai's timeless charm with its futuristic skyline. Situated in the heart of Dubai Healthcare City, this residence seamlessly merges a connected lifestyle with every contemporary comfort, all cradled by nature's tranquility.",
|
||||
|
|
@ -564,15 +553,14 @@
|
|||
"Commercial-Kategorie",
|
||||
"96 Units",
|
||||
"Dubai Healthcare City",
|
||||
"Als eigener Beratungsfall statt normale Wohnkarte behandeln"
|
||||
"Als eigener Beratungsfall statt als normale Wohnkarte behandeln"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "COMMERCIAL SPACES",
|
||||
"official_headline": "YOUR GATEWAY TO SUCCESS IN DUBAI’S DYNAMIC HUB",
|
||||
"official_description": "Azizi Emerald, the first exclusively commercial building from Azizi, is ideally situated in the heart of Dubai Healthcare City. This remarkable environment seamlessly combines luxury with practicality, fostering innovation and collaboration. With its strategic location, Azizi Emerald serves as a vibrant hub where businesses can thrive in a constantly evolving market. It is a premier destination that elevates your business experience to exceptional heights.",
|
||||
"official_unit_type": "COMMERCIAL SPACES",
|
||||
"official_starting_price": "From AED 5.28M",
|
||||
"official_description_de": "Azizi Emerald ist Azizis erstes rein kommerzielles Gebäude und liegt zentral in der Dubai Healthcare City. Office- und Retail-Flächen mit strategischer Positionierung in einem etablierten Geschäftsstandort - eine Adresse für Käufer mit Commercial-These statt klassischer Wohnnutzung."
|
||||
"official_description_de": "Azizi Emerald ist Azizis erstes rein kommerzielles Gebäude und liegt zentral in der Dubai Healthcare City. Office- und Retail-Flächen mit strategischer Positionierung an einem etablierten Geschäftsstandort - eine Adresse für Käufer mit Commercial-These statt klassischer Wohnnutzung."
|
||||
},
|
||||
{
|
||||
"slug": "creek-views",
|
||||
|
|
@ -595,7 +583,6 @@
|
|||
"Downtown Dubai und DXB ca. 7 Minuten",
|
||||
"Studios, 1- und 2-Bedroom-Apartments"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "STUDIO, 1 & 2 BEDROOMS",
|
||||
"official_headline": "DISCOVER MODERN LIVING WHERE DUBAI’S PAST AND FUTURE MEET",
|
||||
"official_description": "Nestled on the banks of the iconic Dubai Creek, Creek Views lays out all the capital has to offer—with panoramic views that connect Dubai’s traditional vista with its futuristic cityscape. Located close to downtown Dubai, the residence harmoniously blends a connected lifestyle with every modern convenience, all wrapped in the calm of nature’s embrace.",
|
||||
|
|
@ -624,7 +611,6 @@
|
|||
"Bestehende Vermietungsnachfrage",
|
||||
"Jüngeres Gebäude als Creek Views"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "STUDIO, 1 & 2 BEDROOMS",
|
||||
"official_headline": "SETTING THE NEW BENCHMARK FOR MODERN LIVING",
|
||||
"official_description": "Experience the next level of convenience, practicality, and modernism in one stunning package at Creek Views II, where every detail is meticulously crafted to redefine your living experience. Elevate your lifestyle and revel in a new standard of luxury living. Are you ready to embrace the extraordinary life at Creek Views II?",
|
||||
|
|
@ -641,7 +627,7 @@
|
|||
"status_group": "construction",
|
||||
"buyer_profile": "Renditeorientierte Erstkäufer und Lifestyle-Familien",
|
||||
"price_from": "From AED 1.22M",
|
||||
"handover": "Phase abhängig",
|
||||
"handover": "Phasenabhängig",
|
||||
"units": "12.285 Apartments",
|
||||
"image": "immobile/dubai/azizi-riviera/overview-thumbnail/azizi-riviera-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/meydan/riviera",
|
||||
|
|
@ -654,7 +640,6 @@
|
|||
"Downtown- und Meydan-Nähe",
|
||||
"Mehrere Phasen und Produktlinien"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "STUDIO, 1 & 3 BEDROOMS",
|
||||
"official_headline": "EVOKE THE MEDITERRANEAN EVERY DAY",
|
||||
"official_description": "Embodying coastal charm, Azizi Riviera offers a unique blend of city life and waterside living. This contemporary haven hosts a wealth of amenities amidst beautifully landscaped spaces. Set against the iconic Dubai skyline, experience Azizi Riviera's cosmopolitan living harmoniously intertwined with tranquil natural beauty.",
|
||||
|
|
@ -671,7 +656,7 @@
|
|||
"status_group": "offplan",
|
||||
"buyer_profile": "Käufer mit Wunsch nach Community plus Exklusivität",
|
||||
"price_from": "From AED 2.35M",
|
||||
"handover": "Phase abhängig",
|
||||
"handover": "Phasenabhängig",
|
||||
"units": "5.061 Homes in 24 Gebäuden",
|
||||
"image": "immobile/dubai/riviera-reve/overview-thumbnail/riviera-reve-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/meydan/riviera-reve",
|
||||
|
|
@ -681,15 +666,14 @@
|
|||
"Preis: From AED 2.35M",
|
||||
"24 Ultra-Luxus-Gebäude",
|
||||
"Studios bis Duplex-Penthouses",
|
||||
"Premium-Positionierung innerhalb Riviera"
|
||||
"Premium-Positionierung innerhalb von Riviera"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "1 & 3 BEDROOMS",
|
||||
"official_headline": "EXPERIENCE LUXURY LIVING IN A DREAMLIKE LANDSCAPE",
|
||||
"official_description": "More than a residence, Riviera Rêve is a destination—one that creates a five-star getaway feel through high-end, hotel-inspired design. Beyond your abode, the amenities promise to tend to your every need. And, because location is everything, this oasis of calm places Dubai’s beating heart right at your fingertips.",
|
||||
"official_unit_type": "1 & 3 BEDROOMS",
|
||||
"official_starting_price": "From AED 2.35M",
|
||||
"official_description_de": "Riviera Rêve ist nicht nur eine Wohnadresse, sondern eine Adresse mit Hotel-Charakter: hochwertige Ausstattung, Resort-orientierte Annehmlichkeiten und die zentrale Lage in Meydan, mit kurzer Distanz zum Herzen der Stadt."
|
||||
"official_description_de": "Riviera Rêve ist nicht nur eine Wohnadresse, sondern eine Adresse mit Hotel-Charakter: hochwertige Ausstattung, resortorientierte Annehmlichkeiten und die zentrale Lage in Meydan, mit kurzer Distanz zum Herzen der Stadt."
|
||||
},
|
||||
{
|
||||
"slug": "riviera-beachfront",
|
||||
|
|
@ -712,13 +696,12 @@
|
|||
"Studios, 1BR, 2BR und Retail",
|
||||
"Pools, Gym, BBQ und Yoga-Spaces"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "1 & 2 BEDROOMS",
|
||||
"official_headline": "GET BEACHFRONT LIVING IN THE CITY",
|
||||
"official_description": "Amplify the resort-like ambiance with our top-tier amenities and services. Fully embrace the feeling of the French coast-inspired life with exclusive access to the pristine beaches of the crystal lagoon. Play a variety of sports, enjoy the leisure facilities and children's play areas. For your convenience, a wide selection of retail outlets, cafes, and restaurants are all within walking distance.",
|
||||
"official_unit_type": "1 & 2 BEDROOMS",
|
||||
"official_starting_price": "From AED 1.26M",
|
||||
"official_description_de": "Riviera Beachfront verstärkt den Resort-Charakter der Riviera-Community: exklusiver Zugang zur Crystal Lagoon, Sport- und Freizeitbereiche, Spielflächen für Kinder, dazu Retail, Cafés und Restaurants in Geh-Distanz."
|
||||
"official_description_de": "Riviera Beachfront verstärkt den Resort-Charakter der Riviera-Community: exklusiver Zugang zur Crystal Lagoon, Sport- und Freizeitbereiche, Spielflächen für Kinder, dazu Retail, Cafés und Restaurants in Gehdistanz."
|
||||
},
|
||||
{
|
||||
"slug": "park-avenue",
|
||||
|
|
@ -741,7 +724,6 @@
|
|||
"Meydan Avenue / MBR City",
|
||||
"Ruhigere Community-Logik in MBR City"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "STUDIO, 1 & 3 BEDROOMS",
|
||||
"official_headline": "EXPERIENCE URBAN LIVING AT ITS BEST",
|
||||
"official_description": "Like its Manhattan namesake, Park Avenue is contemporary, sleek, and offers all the conveniences of modern-day life. This unique residence also gives you the best of both worlds—immersive community living within a beautifully landscaped space located in the heart of city life. The natural design esthetic houses a wide range of facilities backed by the iconic Dubai skyline.",
|
||||
|
|
@ -769,7 +751,6 @@
|
|||
"Dubai Marina und JBR ca. 10 Minuten",
|
||||
"Pool, Gym, Sauna und Parking"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "VENTURE OUT ON A JOURNEY TO THE STARS",
|
||||
"official_description": "Embark on a journey of privacy at Star in Al-Furjan, where every element of a seamless life is just moments away, featuring a choice of 310 studios, 46 one-bedroom, and 102 two-bedroom apartments.",
|
||||
"official_description_de": "Star liegt im Al-Furjan-Cluster und bietet 310 Studios, 46 Ein-Zimmer- und 102 Zwei-Zimmer-Apartments. Eine Adresse mit konzentrierter Yield-Logik und etablierter Mietnachfrage."
|
||||
|
|
@ -794,10 +775,9 @@
|
|||
"Ground-Floor-Retail",
|
||||
"Bestand mit Vermietungslogik"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "THE CHARM OF NATURAL LIVING OR A REALM OF NATURAL WONDERS",
|
||||
"official_description": "Discover the charm of natural living at Roy Mediterranean in Al-Furjan, and awaken your senses with an inspired nature-centric lifestyle and a choice of 224 studios & 47 one-bedroom apartments.",
|
||||
"official_description_de": "Roy Mediterranean kombiniert in Al Furjan 224 Studios und 47 Ein-Zimmer-Apartments mit einem natur-orientierten Ambiente - klassisches Studio-Yield-Konzept in einer eingespielten Wohngegend."
|
||||
"official_description": "Discover the charm of natural living at ROY Mediterranean in Al-Furjan, and awaken your senses with an inspired nature-centric lifestyle and a choice of 224 studios & 47 one-bedroom apartments.",
|
||||
"official_description_de": "ROY Mediterranean kombiniert in Al Furjan 224 Studios und 47 Ein-Zimmer-Apartments mit einem naturorientierten Ambiente - klassisches Studio-Yield-Konzept in einer eingespielten Wohngegend."
|
||||
},
|
||||
{
|
||||
"slug": "farishta",
|
||||
|
|
@ -816,10 +796,8 @@
|
|||
"marcel_take": "Farishta ist für Erstinvestoren interessant, weil hier wenig erklärt werden muss: fertig, angebunden, bestehender Mietmarkt.",
|
||||
"highlights": [
|
||||
"Zwischen SZR und SMBZ Road",
|
||||
"Route-2020-/Metro-Logik",
|
||||
"SharePoint mit Completion Photos und Floor Plans"
|
||||
"Route-2020-/Metro-Logik"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "EXPERIENCE THE UNCONVENTIONAL LIFESTYLE OF FARISHTA",
|
||||
"official_description": "It's time to embrace the modern lifestyle you deserve at Azizi Farishta. Explore our selection of high-end residential apartments, featuring 137 studios, 124 one-bedroom, and 23 two-bedroom options. Each unit embodies modern living with its contemporary design and craftsmanship, offering a luxurious yet comfortable living experience.",
|
||||
"official_description_de": "Azizi Farishta bietet 137 Studios, 124 Ein-Zimmer- und 23 Zwei-Zimmer-Apartments. Modernes Design und ausgewogene Ausstattung machen das Haus zu einer typischen Al-Furjan-Bestandsadresse mit etabliertem Mietmarkt."
|
||||
|
|
@ -845,7 +823,6 @@
|
|||
"Baufortschritt 57-67 Prozent in 2025-Updates",
|
||||
"Gym, zwei Pools, Kinderspielbereiche, BBQ"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "STUDIO, 1 & 2 BEDROOMS"
|
||||
},
|
||||
{
|
||||
|
|
@ -853,11 +830,11 @@
|
|||
"title": "Beach Oasis",
|
||||
"category": "near-handover",
|
||||
"location": "Dubai Studio City",
|
||||
"status": "Im Bau / Phase abhängig",
|
||||
"status": "Im Bau / Phasenabhängig",
|
||||
"status_group": "construction",
|
||||
"buyer_profile": "Junge Investoren und lifestyle-orientierte Erstkäufer",
|
||||
"price_from": "From AED 881K",
|
||||
"handover": "Phase abhängig",
|
||||
"handover": "Phasenabhängig",
|
||||
"units": "1.416 Apartments",
|
||||
"image": "immobile/dubai/beach-oasis/overview-thumbnail/beach-oasis-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/studio-city/beach-oasis",
|
||||
|
|
@ -870,7 +847,6 @@
|
|||
"Dubai Studio City",
|
||||
"Lagoon-style Pool und man-made beach"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "STUDIO, 1 & 2 BEDROOMS",
|
||||
"official_headline": "WHERE BEACH-OASIS TRANQUILITY MEETS URBAN CHIC",
|
||||
"official_description": "Unveil serene living at Beach Oasis in Studio City, where the allure of a beach-inspired retreat seamlessly merges with the vibrancy of city life, offering a contemporary haven designed for modern living with the perfect blend of tranquility and urban chic",
|
||||
|
|
@ -900,13 +876,12 @@
|
|||
"Gebäudehöhe 2B+G+8",
|
||||
"Ergänzt den Beach-Oasis-Cluster"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "1 & 2 BEDROOMS",
|
||||
"official_headline": "LIVE AT THE FOREFRONT OF DUBAI’S EVOLUTION",
|
||||
"official_description": "A vista into the future, this residence in the heart of Dubai Studio City welcomes you. Get access to one of the capital’s fast-flourishing business hubs, a growing home for the creative industry, and the perfect haven for families and professionals who want to balance sleek serenity with connected living.",
|
||||
"official_unit_type": "1 & 2 BEDROOMS",
|
||||
"official_starting_price": "From AED 1.17M",
|
||||
"official_description_de": "Azizi Vista liegt im Herzen der Dubai Studio City - einem stark wachsenden Business-Hub für Kreativ- und Medienindustrie. Der Cluster spricht Familien und Berufstätige an, die ruhige Wohnumgebung und gute Anbindung kombinieren wollen."
|
||||
"official_description_de": "Azizi Vista liegt im Herzen der Dubai Studio City - einem stark wachsenden Business-Hub für Kreativ- und Medienindustrie. Der Cluster spricht Familien und Berufstätige an, die eine ruhige Wohnumgebung und gute Anbindung kombinieren wollen."
|
||||
},
|
||||
{
|
||||
"slug": "monaco-mansions",
|
||||
|
|
@ -917,7 +892,7 @@
|
|||
"status_group": "offplan",
|
||||
"buyer_profile": "HNI-Käufer, Familien, Trophy-Asset-Investoren",
|
||||
"price_from": "From AED 45 M",
|
||||
"handover": "Q4 2026, final prüfen",
|
||||
"handover": "Q4 2026",
|
||||
"units": "109 Villas/Mansions im Azizi-Venice-Kontext",
|
||||
"image": "immobile/dubai/monaco-mansions/overview-thumbnail/monaco-mansions-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/dubai-south/monaco-mansions",
|
||||
|
|
@ -926,11 +901,10 @@
|
|||
"highlights": [
|
||||
"Preis: From AED 45M",
|
||||
"109 Villas/Mansions im Venice-Kontext",
|
||||
"6-, 7- und 8-Bedroom Mansions",
|
||||
"6-, 7- und 8-Bedroom-Mansions",
|
||||
"Teil der Azizi-Venice-Community",
|
||||
"Dubai-South-Wachstumsthese"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "Villas",
|
||||
"official_headline": "MONACO MANSIONS",
|
||||
"official_description": "Introducing Monaco Mansions, where the narrative of lavishness is not merely told; it is vibrantly lived. Here, architectural grandeur marries the tranquil waves of the lagoon, crafting an existence where every moment is celebrated in royal splendour.",
|
||||
|
|
@ -945,28 +919,26 @@
|
|||
"location": "Jumeirah Village Circle",
|
||||
"status": "Residential / Projektübersicht",
|
||||
"status_group": "construction",
|
||||
"buyer_profile": "Käufer mit Fokus auf etablierten Mietermarkt und JVC-Alltagslage",
|
||||
"buyer_profile": "Käufer mit Fokus auf etablierten Mietmarkt und JVC-Alltagslage",
|
||||
"price_from": "From AED 592K",
|
||||
"handover": "Übergabe wird aktuell geprüft",
|
||||
"units": "260 Apartments",
|
||||
"image": "immobile/dubai/azizi-ruby/overview-thumbnail/azizi-ruby-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/jumeirah-village-circle/ruby",
|
||||
"short": "JVC-Adresse mit breitem Mietermarkt im mittleren Dubai.",
|
||||
"short": "JVC-Adresse mit breitem Mietmarkt im mittleren Dubai.",
|
||||
"marcel_take": "Ruby bringt JVC in die Auswahl. Das ist weniger Skyline-Erzählung und mehr Alltagsmarkt: ein etablierter Wohnkreis mit breiter Mietzielgruppe und guter Vergleichbarkeit.",
|
||||
"highlights": [
|
||||
"Preis: From AED 592K",
|
||||
"260 Apartments",
|
||||
"Jumeirah Village Circle",
|
||||
"Gebäudehöhe 3B+G+5P+14",
|
||||
"Als eigener Standortfilter für JVC relevant"
|
||||
"Gebäudehöhe 3B+G+5P+14"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
"official_headline": "A GRACEFUL PLACE TO CALL HOME",
|
||||
"official_description": "Ruby adds to the vibrancy of Dubai's renowned JVC community. This modern residence embodies all the richness of this booming residential hub, complemented by excellent amenities and exceptional convenience of living. The location along the metro line is an added benefit, making it more attractive to residents for easy commute while at a desirable distance from the city",
|
||||
"official_unit_type": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
"official_starting_price": "From AED 592K",
|
||||
"official_description_de": "Azizi Ruby liegt im etablierten Wohnkreis JVC mit guter Metro-Anbindung und breitem Mietermarkt - eine moderne Wohnadresse für klassische Yield-Strategien im mittleren Dubai."
|
||||
"official_description_de": "Azizi Ruby liegt im etablierten Wohnkreis JVC mit guter Metro-Anbindung und breitem Mietmarkt - eine moderne Wohnadresse für klassische Yield-Strategien im mittleren Dubai."
|
||||
},
|
||||
{
|
||||
"slug": "azizi-aura",
|
||||
|
|
@ -990,7 +962,6 @@
|
|||
"Gebäudehöhe B+G+2P+17",
|
||||
"Relevant für JAFZA-/Dubai-South-Achse"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "1 & 2 BEDROOMS",
|
||||
"official_headline": "MIX BUSINESS WITH LEISURE, ELEGANTLY",
|
||||
"official_description": "You split your life across two worlds and you need a home that helps you do so with finesse. Welcome to Aura—a game changer of a residence. This beacon of elevated living, nestled in the vibrant heart of Dubai’s JAFZA effortlessly combines comfort and adventure. With every corner echoing sophistication, Aura is more than a residence—it's the meeting point of work and leisure that ensures you thrive.",
|
||||
|
|
@ -1012,7 +983,7 @@
|
|||
"image": "immobile/dubai/azizi-arian/overview-thumbnail/azizi-arian-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/jebel-ali/arian",
|
||||
"short": "Größere Jebel-Ali-Adresse auf der Achse Richtung Dubai South.",
|
||||
"marcel_take": "Arian ist im Vergleich zu Aura der größere Jebel-Ali-Case. Für B2in sollte hier besonders geprüft werden, welche Einheitstypen aktiv verfügbar sind und wie stark die Mietnachfrage aus JAFZA, Expo City und DWC wirkt.",
|
||||
"marcel_take": "Arian ist im Vergleich zu Aura der größere Jebel-Ali-Case. Entscheidend ist hier, welche Einheitstypen aktiv verfügbar sind und wie stark die Mietnachfrage aus JAFZA, Expo City und DWC wirkt.",
|
||||
"highlights": [
|
||||
"Preis: From AED 571K",
|
||||
"623 Apartments",
|
||||
|
|
@ -1020,7 +991,6 @@
|
|||
"Gebäudehöhe 3B+G+M+5P+17",
|
||||
"Südwestlicher Wachstumskorridor"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
"official_headline": "ASPIRATIONAL LIVING AMID DYNAMIC POSSIBILITIES",
|
||||
"official_description": "Welcome to Arian, where aspirational living meets endless possibilities in one of the few freehold residential properties within JAFZA. Strategically located in Jebel Ali, the UAE’s flagship integrated business hub, Arian places you at the heart of the world’s largest matured free zone and the Middle East’s biggest port. This unparalleled location offers seamless connectivity to Dubai’s prime business, leisure, and retail destinations, supported by outstanding highway and metro access.",
|
||||
|
|
@ -1048,8 +1018,7 @@
|
|||
"Ready to Move In",
|
||||
"Nahe Metro, MBZ Road, Jebel Ali, Dubai Marina, Expo City und Al Maktoum International Airport",
|
||||
"Portfolio-Logik für mehrere fertige Al-Furjan-Projekte"
|
||||
],
|
||||
"data_confidence": "green"
|
||||
]
|
||||
},
|
||||
{
|
||||
"slug": "azizi-venice",
|
||||
|
|
@ -1073,7 +1042,6 @@
|
|||
"Crystal Lagoon, Opera House, Retail Boulevard und Hotels",
|
||||
"Nahe Al Maktoum International Airport"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
"official_headline": "AN OASIS OF DREAMS",
|
||||
"official_description": "Dive into a world of unparalleled water-inspired living, unlike anything you've ever experienced, at Dubai's forthcoming legacy - a truly unparalleled luxury Crystal Lagoon community. Brace yourself to embark on a journey where opulence knows no boundaries, as you step into a haven of lavishness that stretches the limits of imagination. This is not just another destination it's an uncharted masterpiece, waiting to be discovered.",
|
||||
|
|
@ -1090,7 +1058,7 @@
|
|||
"status_group": "offplan",
|
||||
"buyer_profile": "Strategische Investoren und Portfoliodiversifikation",
|
||||
"price_from": "From AED 624K",
|
||||
"handover": "Phase abhängig",
|
||||
"handover": "Phasenabhängig",
|
||||
"units": "100 Buildings und 80.000 Apartments",
|
||||
"image": "immobile/dubai/azizi-milan/overview-thumbnail/azizi-milan-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/dubai-land/azizi-milan",
|
||||
|
|
@ -1101,9 +1069,8 @@
|
|||
"100 Buildings",
|
||||
"80.000 Apartments",
|
||||
"AED 75 Mrd. Masterplan",
|
||||
"Mixed Use: Wohnen, Retail, Hospitality, Lifestyle"
|
||||
"Mixed-Use: Wohnen, Retail, Hospitality, Lifestyle"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"overview_bedrooms": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
"official_headline": "A STATEMENT OF STYLE AND AESTHETIC FLAIR",
|
||||
"official_description": "Immerse yourself in the enchanting Milanese charm of Dubai's most dynamic districts. Dive into a world where rich greenery and high fashion intertwine, creating a paradise where style harmonizes with nature. Experience a destination that captivates your senses with elegance, inviting you to embark on a chic lifestyle among retail boulevards and botanical gardens. Azizi Milan is not just a residence; it’s an everlasting splendor that enriches every moment.",
|
||||
|
|
@ -1120,7 +1087,7 @@
|
|||
"status_group": "offplan",
|
||||
"buyer_profile": "Off-Plan-Investoren mit Insel-These",
|
||||
"price_from": "From AED 1.68M",
|
||||
"handover": "Q2 2027 bis Q1 2028 je Quelle, final prüfen",
|
||||
"handover": "Q2 2027 bis Q1 2028",
|
||||
"units": "221 Apartments",
|
||||
"image": "immobile/dubai/azizi-wasel/overview-thumbnail/azizi-wasel-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/dubai-islands/azizi-wasel",
|
||||
|
|
@ -1133,7 +1100,6 @@
|
|||
"Dubai Islands / Deira Waterfront",
|
||||
"Studios bis 3BR und Penthouses"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"overview_bedrooms": "STUDIO, 1, 2, 3 BEDROOMS & PENTHOUSE",
|
||||
"official_headline": "AN OCEANIC RETREAT ALONG THE SHORES OF THE DUBAI ISLANDS",
|
||||
"official_description": "Azizi’s newest residential marvel, Azizi Wasel on Dubai Islands, offers breathtaking sea views paired with a glimpse of Dubai’s iconic skyline. Immerse yourself in the vibrant culture of the city while enjoying the serenity of waterfront living. Designed for modern comfort and convenience, Azizi Wasel combines elegance with seamless access to Dubai’s major attractions, creating a perfect balance of urban energy and coastal tranquility.",
|
||||
|
|
@ -1155,16 +1121,15 @@
|
|||
"image": "immobile/dubai/azizi-jaddaf-beach-oasis/overview-thumbnail/azizi-jaddaf-beach-oasis-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/dubai-healthcare-city/azizi-jaddaf-beach-oasis",
|
||||
"short": "Al-Jaddaf-Adresse mit eigenem Beach-Pool nahe Downtown Dubai.",
|
||||
"marcel_take": "Jaddaf Beach Oasis setzt das Beach-Oasis-Lagunenkonzept im Creek-Cluster Al Jaddaf fort. Damit ein Lifestyle-Twist auf eine sonst zentral-urbane Lage. Verfügbarkeit und Eckdaten prüfe ich pro Einheit auf Anfrage.",
|
||||
"marcel_take": "Jaddaf Beach Oasis setzt das Beach-Oasis-Lagunenkonzept im Creek-Cluster Al Jaddaf fort. Das bringt einen Lifestyle-Twist in eine sonst zentral-urbane Lage. Verfügbarkeit und Eckdaten prüfe ich pro Einheit auf Anfrage.",
|
||||
"highlights": [
|
||||
"Preisangabe auf offizieller Übersicht noch offen",
|
||||
"New Release"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "CITY LIVING, BEACH FEELING",
|
||||
"official_description": "Azizi Jaddaf Beach Oasis – unlocks a prime address in Al Jaddaf for discerning buyers seeking to invest in one of the most sought-after locations in the city. A modern contemporary design with its own beach pool, nestled within an area rich with the heritage and legacy of old Dubai. A mesmerizing blend of access and exclusivity awaits in this hidden gem of a community, just moments from the business, commercial and leisure hub of Downtown Dubai.",
|
||||
"official_unit_type": "STUDIO, 1 BEDROOM & PENTHOUSES",
|
||||
"official_description_de": "Jaddaf Beach Oasis bringt das Beach-Pool-Konzept ins zentrale Al Jaddaf - in Geh-Distanz zu Downtown Dubai. Modernes Design trifft auf eine traditionsreiche Lage; eine Adresse für Käufer, die zentrale Mietbarkeit mit Lifestyle-Twist suchen."
|
||||
"official_description_de": "Jaddaf Beach Oasis bringt das Beach-Pool-Konzept ins zentrale Al Jaddaf - in Gehdistanz zu Downtown Dubai. Modernes Design trifft auf eine traditionsreiche Lage; eine Adresse für Käufer, die zentrale Vermietbarkeit mit Lifestyle-Twist suchen."
|
||||
},
|
||||
{
|
||||
"slug": "azizi-rose",
|
||||
|
|
@ -1179,18 +1144,17 @@
|
|||
"units": "STUDIO & 1 BEDROOM",
|
||||
"image": "immobile/dubai/azizi-rose/overview-thumbnail/azizi-rose-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/jebel-ali/azizi-rose",
|
||||
"short": "Studio- und 1-BR-Adresse im Downtown Jebel Ali nahe JAFZA.",
|
||||
"marcel_take": "Rose ist eine Freehold-Position direkt an JAFZA, einer der größten Free Zones der Region. Damit klar an Business-Mieter und langfristige Connectivity-These adressiert. Phase und Einstiegspreis kommuniziere ich pro Einheit.",
|
||||
"short": "Studio- und 1-BR-Adresse in Downtown Jebel Ali nahe JAFZA.",
|
||||
"marcel_take": "Rose ist eine Freehold-Position direkt an JAFZA, einer der größten Free Zones der Region. Damit richtet sich das Projekt klar an Business-Mieter und eine langfristige Connectivity-These. Phase und Einstiegspreis kommuniziere ich pro Einheit.",
|
||||
"highlights": [
|
||||
"Freehold direkt neben JAFZA",
|
||||
"Studio- und 1-BR-Schwerpunkt",
|
||||
"Sheikh Zayed Road und Metro nah"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "THE FOCAL POINT OF OPPORTUNITY",
|
||||
"official_description": "Azizi Rose is your gateway to the hyper-connected, thriving community of Downtown Jebel Ali, where leading global companies have strategically established themselves at the heart of Asia-Europe trade routes. It represents a rare freehold investment opportunity on the doorstep of the world’s largest free trade zone, JAFZA, and the Middle East’s busiest port. With Sheikh Zayed Road and the metro in close proximity, residents enjoy seamless access to Dubai’s foremost business, retail, and leisure destinations.",
|
||||
"official_unit_type": "STUDIO & 1 BEDROOM",
|
||||
"official_description_de": "Azizi Rose liegt im Downtown Jebel Ali - direkt an JAFZA, einer der größten Free Zones weltweit, und am größten Hafen des Nahen Ostens. Eine Freehold-Position mit klarem Business-Mieter-Profil, gut angebunden an Sheikh Zayed Road und die Metro."
|
||||
"official_description_de": "Azizi Rose liegt in Downtown Jebel Ali - direkt an JAFZA, einer der größten Free Zones weltweit, und am größten Hafen des Nahen Ostens. Eine Freehold-Position mit klarem Business-Mieter-Profil, gut angebunden an Sheikh Zayed Road und die Metro."
|
||||
},
|
||||
{
|
||||
"slug": "azizi-farishta-ii",
|
||||
|
|
@ -1212,7 +1176,6 @@
|
|||
"Studio bis 1-BR plus Penthouses",
|
||||
"Metro- und Highway-Anbindung"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "TIMELESS LIVING, AT THE CENTER OF EVERYTHING.",
|
||||
"official_description": "Azizi Farishta II in Al Jaddaf defines elevated creekside living. Set where rich cultural heritage and traditions meet the city’s contemporary architectural prowess, just steps from the Dubai Creek, this sophisticated residential development offers effortless metro and highway connectivity, placing Downtown Dubai and the city’s iconic landmarks within easy reach. With a curated collection of premium residences, including stylish studios, one-bedroom apartments, and lavish penthouses, each home is crafted with meticulous attention to detail, offers panoramic views, and delivers a prestigious, unrivaled lifestyle.",
|
||||
"official_unit_type": "STUDIO, 1 BEDROOM & PENTHOUSES",
|
||||
|
|
@ -1232,17 +1195,16 @@
|
|||
"image": "immobile/dubai/azizi-gabriel/overview-thumbnail/azizi-gabriel-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/jebel-ali/azizi-gabriel",
|
||||
"short": "Downtown-Jebel-Ali-Adresse mit Studio bis 2-BR direkt an der JAFZA.",
|
||||
"marcel_take": "Gabriel positioniert sich mit Studio- bis 2-BR-Apartments im Downtown Jebel Ali und damit für Business-Pendler und JAFZA-Mieter. Verfügbarkeit und Einstiegspreis aktuell auf Anfrage.",
|
||||
"marcel_take": "Gabriel positioniert sich mit Studio- bis 2-BR-Apartments in Downtown Jebel Ali und damit für Business-Pendler und JAFZA-Mieter. Verfügbarkeit und Einstiegspreis aktuell auf Anfrage.",
|
||||
"highlights": [
|
||||
"Studio bis 2-BR-Apartments",
|
||||
"Downtown Jebel Ali",
|
||||
"JAFZA und SZR direkt erreichbar"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "THE APEX OF AMBITION",
|
||||
"official_description": "Azizi Gabriel is an exciting new residential opportunity in the center of the vibrant and growing community of Downtown Jebel Ali, an unparalleled global business hub. Enjoy a freehold investment opportunity on the doorstep of the world’s largest free trade zone - JAFZA - and the biggest port in the Middle East. And with quick access to Sheik Zayed Road, the rest of Dubai’s business, retail, and leisure landmarks are within easy reach. Build your future in the center of a thriving community that gives you direct access to Dubai’s best business, retail and entertainment offerings. Unlock a life of modern elegance with a home that enables your potential with style. With easy access to Sheik Zayed Road and the metro, the whole city is on your doorstep.",
|
||||
"official_unit_type": "STUDIO, 1, 2 BEDROOMS",
|
||||
"official_description_de": "Azizi Gabriel ist eine Freehold-Adresse im Downtown Jebel Ali, direkt am Eingang zur JAFZA. Mit guter Anbindung an die wichtigsten Achsen Dubais ein klassischer Yield-Case mit Business-Mieter-Profil."
|
||||
"official_description_de": "Azizi Gabriel ist eine Freehold-Adresse in Downtown Jebel Ali, direkt am Eingang zur JAFZA. Mit guter Anbindung an die wichtigsten Achsen Dubais ein klassischer Yield-Case mit Business-Mieter-Profil."
|
||||
},
|
||||
{
|
||||
"slug": "azizi-leily",
|
||||
|
|
@ -1264,7 +1226,6 @@
|
|||
"Creek-Cluster Al Jaddaf",
|
||||
"Einstieg ab AED 828K"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "TIMELESS ROOTS, MODERN HORIZONS",
|
||||
"official_description": "In the heart of Al Jaddaf, where the Dubai Creek shimmers beneath the skyline, Azizi Leily rises with distinction and grace. From chic studios and spacious one- and two-bedroom residences to two signature penthouses, every home embodies refined contemporary living.",
|
||||
"official_unit_type": "STUDIO, 1, 2 BEDROOMS & PENTHOUSE",
|
||||
|
|
@ -1285,17 +1246,16 @@
|
|||
"image": "immobile/dubai/azizi-lina/overview-thumbnail/azizi-lina-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/jebel-ali/azizi-lina",
|
||||
"short": "Jebel-Ali-Adresse direkt neben JAFZA ab AED 572K.",
|
||||
"marcel_take": "Lina ist mit ab AED 572K eine der zugänglichsten Jebel-Ali-Optionen direkt neben JAFZA. Klares Yield-Profil mit Business-Mieterprofil. Phase und konkrete Einheiten prüfe ich auf Anfrage.",
|
||||
"marcel_take": "Lina ist mit ab AED 572K eine der zugänglichsten Jebel-Ali-Optionen direkt neben JAFZA. Klares Yield-Profil für Business-Mieter. Phase und konkrete Einheiten prüfe ich auf Anfrage.",
|
||||
"highlights": [
|
||||
"Einstieg ab AED 572K",
|
||||
"Lage direkt an JAFZA",
|
||||
"Yield-Case für Business-Mieter"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "WHERE CONNECTIVITY FUELS OPPORTUNITY",
|
||||
"official_description": "Azizi Lina rises in Downtown Jebel Ali, alongside the famed JAFZA — one of the world’s largest free zones and the Middle East’s biggest port. Effortless metro and highway connectivity, contemporary residences, thoughtfully designed amenities, and 100+ Fortune Global 500 companies in immediate vicinity bring global opportunity within reach, creating a lifestyle that perfectly balances ambition and comfort.",
|
||||
"official_starting_price": "From AED 572K",
|
||||
"official_description_de": "Azizi Lina liegt im Downtown Jebel Ali, unmittelbar neben der JAFZA und dem größten Hafen des Nahen Ostens. Direkter Zugang zu Metro und Highway, moderne Wohnungen und mehr als 100 Fortune-Global-500-Unternehmen im direkten Umfeld machen das Haus zu einer Adresse für Berufstätige mit internationalem Geschäftsbezug."
|
||||
"official_description_de": "Azizi Lina liegt in Downtown Jebel Ali, unmittelbar neben der JAFZA und dem größten Hafen des Nahen Ostens. Direkter Zugang zu Metro und Highway, moderne Wohnungen und mehr als 100 Fortune-Global-500-Unternehmen im direkten Umfeld machen das Haus zu einer Adresse für Berufstätige mit internationalem Geschäftsbezug."
|
||||
},
|
||||
{
|
||||
"slug": "milan-heights",
|
||||
|
|
@ -1317,7 +1277,6 @@
|
|||
"Eigenes Lagunenkonzept",
|
||||
"Studio- bis 3-BR-Mix"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "THE PINNACLE OF ITALIAN-INSPIRED LIVING",
|
||||
"official_description": "Milan Heights, set within the famed Azizi Milan, epitomizes modern elegance infused with Milanese-Italian charm. Crafted as a refined sanctuary, it meets every lifestyle need with effortless grace. Boasting exceptional amenities and the allure of its signature blue lagoon, this enclave harmonizes sophistication with convenience.",
|
||||
"official_unit_type": "STUDIO, 1, 2, 3 BEDROOMS",
|
||||
|
|
@ -1343,12 +1302,11 @@
|
|||
"Einstieg ab AED 1,83M",
|
||||
"Direkter Vergleich zu Azizi Emerald"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "THE EMIRATE’S BUSINESS HUB OF CONNECTIVITY",
|
||||
"official_description": "Azizi Tower 1 is a modern commercial landmark in Al Jaddaf, offering flexible layouts and thoughtfully designed interiors that support productivity and growth. With a contemporary façade and direct links to the city’s key destinations, it provides an ideal address for businesses of every scale — from agile startups to established enterprises.",
|
||||
"official_unit_type": "COMMERCIAL SPACES",
|
||||
"official_starting_price": "From AED 1.83M",
|
||||
"official_description_de": "Azizi Tower 1 ist ein modernes kommerzielles Gebäude in Al Jaddaf. Flexibel zuschneidbare Flächen und durchdachte Innenräume sprechen sowohl Startups als auch etablierte Unternehmen an - eine Office-Adresse mit guter Anbindung an die zentralen Achsen der Stadt."
|
||||
"official_description_de": "Azizi Tower 1 ist ein modernes kommerzielles Gebäude in Al Jaddaf. Flexibel zuschneidbare Flächen und durchdachte Innenräume sprechen sowohl Start-ups als auch etablierte Unternehmen an - eine Office-Adresse mit guter Anbindung an die zentralen Achsen der Stadt."
|
||||
},
|
||||
{
|
||||
"slug": "azizi-wares",
|
||||
|
|
@ -1364,13 +1322,12 @@
|
|||
"image": "immobile/dubai/azizi-wares/overview-thumbnail/azizi-wares-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/jebel-ali/azizi-wares",
|
||||
"short": "Freehold-Adresse in Jebel Ali mit Studio bis 3-BR.",
|
||||
"marcel_take": "Wares deckt mit Studio- bis 3-BR den breiten Mix in Jebel Ali ab und ist damit weniger reiner Yield-Case als Lina oder Rose. Eignet sich auch für Eigennutzer mit Connectivity-Fokus. Eckdaten auf Anfrage.",
|
||||
"marcel_take": "Wares deckt mit Studios bis 3-BR-Apartments den breiten Mix in Jebel Ali ab und ist damit weniger reiner Yield-Case als Lina oder Rose. Eignet sich auch für Eigennutzer mit Connectivity-Fokus. Eckdaten auf Anfrage.",
|
||||
"highlights": [
|
||||
"Studio bis 3-BR-Mix",
|
||||
"Freehold-Position in Jebel Ali",
|
||||
"JAFZA und Metro nah"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "YOUR GATEWAY TO A WORLD OF OPPORTUNITY",
|
||||
"official_description": "Azizi Wares, a distinctive address beside JAFZA in Jebel Ali, combines contemporary elegance with unmatched connectivity. This exclusive freehold residence features meticulously designed studios and one-, two-, and three-bedroom apartments that elevate everyday living. With seamless access to Sheikh Zayed Road and the metro, Dubai’s key destinations are effortlessly within reach.",
|
||||
"official_unit_type": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
|
|
@ -1396,7 +1353,6 @@
|
|||
"Creek-Lage in Al Jaddaf",
|
||||
"Eckdaten und Phase auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "WHERE HERITAGE SHAPES THE FUTURE",
|
||||
"official_description": "In the heart of Al Jaddaf, surrounded by culture, connected to opportunity, and framed by sweeping creek views, Azizi David rises as a celebration of a tradition-rich past, seamlessly woven with modernity. Offering an exceptional selection of residences — from elegant studios and stylish one- and two-bedroom apartments to opulent penthouses — it embodies contemporary living while honoring Dubai’s timeless legacy.",
|
||||
"official_unit_type": "STUDIO, 1, 2 BEDROOMS & PENTHOUSE",
|
||||
|
|
@ -1422,7 +1378,6 @@
|
|||
"Studio- bis 2-BR-Mix",
|
||||
"Aktiv vermarktet ab AED 586K"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "EMBRACE THE CONTEMPORARY LIFESTYLE",
|
||||
"official_description": "Azizi Sikander presents itself as a distinguished destination within Al Furjan community, boasting breathtaking city vistas and a refined architectural design. Residents are immersed in a lively atmosphere enriched with high-end amenities and convenient access to essential attractions. This exquisite building harmoniously blends contemporary living with the advantages of a well-connected neighborhood, making it the perfect place to call home.",
|
||||
"official_unit_type": "STUDIO, 1 & 2 BEDROOMS",
|
||||
|
|
@ -1443,13 +1398,12 @@
|
|||
"image": "immobile/dubai/azizi-amir/overview-thumbnail/azizi-amir-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/al-furjan/azizi-amir",
|
||||
"short": "Familienorientierte Al-Furjan-Adresse mit 1- bis 3-Zimmer-Apartments.",
|
||||
"marcel_take": "Amir setzt auf größeres Wohnflächensegment in Al Furjan und richtet sich damit eher an Familienhaushalte als an Studio-Mieter. Preis und Verfügbarkeit aktuell auf Anfrage; Eckdaten gleiche ich gegen Sikander, Raffi und Zain individuell ab.",
|
||||
"marcel_take": "Amir setzt auf ein größeres Wohnflächensegment in Al Furjan und richtet sich damit eher an Familienhaushalte als an Studio-Mieter. Preis und Verfügbarkeit aktuell auf Anfrage; Eckdaten gleiche ich gegen Sikander, Raffi und Zain individuell ab.",
|
||||
"highlights": [
|
||||
"Family-Layouts mit 1- bis 3-BR",
|
||||
"Lage in der Al-Furjan-Community",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "REDEFINE MODERN LIFESTYLE AT AZIZI AMIR",
|
||||
"official_description": "Located in the vibrant heart of Al Furjan, Azizi Amir is a remarkable addition to this flourishing community in Dubai. This stylish residence combines elegance with the energy of city living. Offering premium amenities and leisure activities tailored to your needs, Azizi Amir ensures an exceptional living experience. Its strategic location along the metro line provides convenient commuting, allowing you to enjoy the perfect balance of excitement and comfort in your luxurious new home.",
|
||||
"official_unit_type": "1, 2 & 3 BEDROOMS",
|
||||
|
|
@ -1475,7 +1429,6 @@
|
|||
"Einstieg ab AED 618K",
|
||||
"Lage entlang der Metro-Achse"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "A SEAMLESS BLEND OF ART AND ARCHITECTURE AWAITS YOU",
|
||||
"official_description": "Welcome to Azizi Raffi in Al Furjan, where modern design meets unparalleled convenience. This newly launched residential building offers contemporary living spaces crafted for comfort, complemented by a range of amenities that elevate urban life. Ideally located in Al Furjan, Azizi Raffi provides seamless access to key areas in Dubai, blending vibrant city life with the tranquillity of a well-connected community",
|
||||
"official_unit_type": "STUDIO, 1, 2 & 3 BEDROOMS",
|
||||
|
|
@ -1502,7 +1455,6 @@
|
|||
"Yield-Profil ab AED 1,26M",
|
||||
"Al-Furjan-Lage mit Metro-Nähe"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "YOUR DISTINCTIVE RESIDENCE AWAITS AT AZIZI NEILA",
|
||||
"official_description": "Revel in exceptional connectivity and find the perfect equilibrium between the dynamism of the city and serene tranquility at NEILA-Azizi's latest jewel in Al Furjan.",
|
||||
"official_unit_type": "STUDIO & 1 BEDROOM",
|
||||
|
|
@ -1529,7 +1481,6 @@
|
|||
"Familien-Adresse ab AED 1,72M",
|
||||
"Metro-Anbindung in Al Furjan"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "A GRACEFUL PLACE TO CALL HOME",
|
||||
"official_description": "Azizi Zain adds to the vibrancy of Dubai's renowned Al Furjan community. This modern residence embodies all the richness of this booming residential hub, complemented by excellent amenities and exceptional convenience of living. The location along the metro line is an added benefit, making it more attractive to residents for easy commute while at a desirable distance from the city",
|
||||
"official_unit_type": "1, 2 & 3 BEDROOMS",
|
||||
|
|
@ -1549,14 +1500,13 @@
|
|||
"units": "STUDIO, 1 & 2 BEDROOMS",
|
||||
"image": "immobile/dubai/beach-oasis-ii/overview-thumbnail/beach-oasis-ii-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/studio-city/beach-oasis-ii",
|
||||
"short": "Lagunen-Erweiterung von Beach Oasis im Dubai Studio City ab AED 604K.",
|
||||
"short": "Lagunen-Erweiterung von Beach Oasis in Dubai Studio City ab AED 604K.",
|
||||
"marcel_take": "Beach Oasis II ergänzt das ursprüngliche Beach-Oasis-Konzept in Studio City: zwei Gebäude um eine Lagunen-Pool-Anlage. Einstieg ab AED 604K macht es zur zugänglichsten Lifestyle-Option im Cluster.",
|
||||
"highlights": [
|
||||
"Lagunen-Pool und künstlicher Strand",
|
||||
"Zwei Gebäude rund um Innenhof",
|
||||
"Zwei Gebäude rund um einen Innenhof",
|
||||
"Einstieg ab AED 604K"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "WHERE SERENITY MEETS VIBRANCY IN DUBAI STUDIO CITY",
|
||||
"official_description": "Experience a serene lifestyle amidst the vibrancy of Dubai Studio City. Beach Oasis II is an elegant urban neighbourhood comprising two buildings surrounding a lagoon-style pool and a man-made beach. Featuring spacious homes, it offers studio, 1 & 2-bedroom apartments. The captivating pool is surrounded by lush greenery, offering a tranquil ambiance complemented by a host of amenities, like gym and play areas. The location provides excellent connectivity to a range of sports & leisure options along with easy access to Dubai's largest highways. Here, life finds joy in full swing, offering the perfect work-life balance.",
|
||||
"official_unit_type": "STUDIO, 1 & 2 BEDROOMS",
|
||||
|
|
@ -1583,7 +1533,6 @@
|
|||
"Einstieg ab AED 1,01M",
|
||||
"Al-Furjan-Lage entlang der Metro"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "YOUR DISTINCTIVE RESIDENCE AWAITS AT AZIZI JEWEL",
|
||||
"official_description": "Step into Azizi Jewel, where the next generation of strategic urban connectivity is brought to life at Al-Furjan, with masterful craftsmanship, effortlessly blending chic aesthetics with functional design.",
|
||||
"official_unit_type": "STUDIO & 1 BEDROOM",
|
||||
|
|
@ -1610,7 +1559,6 @@
|
|||
"Familien-Profil ab AED 1,73M",
|
||||
"Lage entlang der Metro-Achse"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "DISCOVER CONTEMPORARY LIVING AT ITS FINEST",
|
||||
"official_description": "Experience the epitome of contemporary elegance at Azizi Central, an exquisite addition to the Al Furjan Community in new Dubai, nestled along the prestigious metro line. Central stands as a pinnacle among Azizi's distinguished residential projects, offering a haven for families seeking refined urban living with the dynamic vitality of the city.",
|
||||
"official_unit_type": "1, 2 & 3 BEDROOMS",
|
||||
|
|
@ -1631,13 +1579,12 @@
|
|||
"image": "immobile/dubai/amber/overview-thumbnail/amber-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/al-furjan/amber",
|
||||
"short": "Al-Furjan-Adresse mit 1- bis 3-Bedroom-Apartments ab AED 1,51M.",
|
||||
"marcel_take": "Amber gehört zur jüngeren Welle Al-Furjan-Adressen mit Familien-Layouts. Ab AED 1,51M ein vergleichbar positioniertes Ticket wie Central. Verfügbarkeit und Phase pro Einheit prüfe ich auf Anfrage.",
|
||||
"marcel_take": "Amber gehört zur jüngeren Welle von Al-Furjan-Adressen mit Familien-Layouts. Ab AED 1,51M ein vergleichbar positioniertes Ticket wie Central. Verfügbarkeit und Phase pro Einheit prüfe ich auf Anfrage.",
|
||||
"highlights": [
|
||||
"1- bis 3-BR-Apartments",
|
||||
"Einstieg ab AED 1,51M",
|
||||
"Aktiv vermarktete Al-Furjan-Phase"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "YOUR DISTINCTIVE RESIDENCE AWAITS AT AMBER",
|
||||
"official_description": "Revel in exceptional connectivity and find the perfect equilibrium between the dynamism of the city and serene tranquility at Amber-Azizi's latest jewel in Al Furjan.",
|
||||
"official_unit_type": "1, 2 & 3 BEDROOMS",
|
||||
|
|
@ -1658,13 +1605,12 @@
|
|||
"image": "immobile/dubai/park-avenue-iii/overview-thumbnail/park-avenue-iii-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/meydan/park-avenue-iii",
|
||||
"short": "Dritte Phase der Park-Avenue-Boutique-Community in MBR City.",
|
||||
"marcel_take": "Park Avenue III ist die jüngste Phase der Park-Avenue-Reihe in MBR City: 89 Wohneinheiten und 13 Premium-Retail. Damit kleinformatiger und exklusiver positioniert als die großen Riviera-Türme. Einstiegspreis und Phase auf Anfrage.",
|
||||
"marcel_take": "Park Avenue III ist die jüngste Phase der Park-Avenue-Reihe in MBR City: 89 Wohneinheiten und 13 Premium-Retail-Flächen. Damit kleinformatiger und exklusiver positioniert als die großen Riviera-Türme. Einstiegspreis und Phase auf Anfrage.",
|
||||
"highlights": [
|
||||
"89 Wohneinheiten plus 13 Premium-Retail",
|
||||
"89 Wohneinheiten plus 13 Premium-Retail-Flächen",
|
||||
"Kleinformatige MBR-City-Erweiterung",
|
||||
"Einstiegspreis auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "REIMAGINE URBAN LIVING",
|
||||
"official_description": "Park Avenue III is the newest addition to Azizi's success in developing superior craftsmanship and modern living, which is nestled in Medyan, a prestigious neighborhood in Dubai, offering the best of both worlds. Azizi Park Avenue III features 89 high-end residential units and 13 premium retail stores, making it an exclusive window into prime real estate. From refined luxury interiors to breathtaking landscaped outdoor areas—you'll get it all here.",
|
||||
"official_unit_type": "STUDIO, 1 & 3 BEDROOMS",
|
||||
|
|
@ -1683,14 +1629,13 @@
|
|||
"units": "1 BEDROOM",
|
||||
"image": "immobile/dubai/pearl/overview-thumbnail/pearl-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/al-furjan/pearl",
|
||||
"short": "Studio-getriebene Al-Furjan-Residenz mit 192 Studios und 1-BR-Anteil.",
|
||||
"short": "studiogetriebene Al-Furjan-Residenz mit 192 Studios und 1-BR-Anteil.",
|
||||
"marcel_take": "Pearl ist von der Einheitenstruktur klar studio-getrieben (192 Studios) und damit eine reine Yield-Adresse für Investoren mit Cashflow-Fokus. Einstieg ab AED 694K macht es zur zugänglichsten Al-Furjan-Variante.",
|
||||
"highlights": [
|
||||
"192 Studios als Yield-Schwerpunkt",
|
||||
"54 1-BR und 14 2-BR-Einheiten",
|
||||
"54 1-BR- und 14 2-BR-Einheiten",
|
||||
"Einstieg ab AED 694K"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "PEARL RESIDENCES, AL-FURJAN'S CROWN JEWEL",
|
||||
"official_description": "Elevate your living experience to new heights at Pearl, the prestigious residential complex soaring gracefully across 7 floors with a selection of 192 studios, 54 lavish one-bedroom apartments, and 14 exquisite two-bedroom residences.",
|
||||
"official_unit_type": "1 BEDROOM",
|
||||
|
|
@ -1717,7 +1662,6 @@
|
|||
"Studio-, 1- und 3-BR-Mix",
|
||||
"Einstieg ab AED 1,74M"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "FOLLOW YOUR WANDER-MUST AT PARK AVENUE II",
|
||||
"official_description": "Every journey has its destination. And ours is one of a kind: Park Avenue II at Medyan, where exclusivity meets distinction! You're invited to join us in this remarkable journey. With impeccable design, a perfect mix of residential experiences, and unique amenities, experience life in a naturally relaxing environment surrounded by beautiful homes, lush greenery, and soothing water features. Choose from 1 & 2 bedroom apartments, each offering magnificent views. Experience the highest standard of cosmopolitan living that celebrates the beauty of our natural world",
|
||||
"official_unit_type": "STUDIO, 1 & 3 BEDROOMS",
|
||||
|
|
@ -1744,7 +1688,6 @@
|
|||
"Nähe Sheikh Zayed Road",
|
||||
"Bestand in Al Furjan"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "INTERTWINING URBAN HARMONY AT BERTON",
|
||||
"official_description": "Step into Berton, where the next generation of strategic urban connectivity is brought to life at Al-Furjan, with masterful craftsmanship, effortlessly blending chic aesthetics with functional design. Berton offers direct access to the Route 2020 metro line and Sheikh Mohammed bin Zayed Road.",
|
||||
"official_description_de": "Berton steht in Al Furjan für strategisch angebundenes Wohnen: präzises Design, durchdachte Grundrisse und der direkte Zugang zur Route-2020-Metrolinie sowie zur Sheikh Mohammed bin Zayed Road. Eine Adresse für Bewohner mit Pendelfokus."
|
||||
|
|
@ -1768,8 +1711,7 @@
|
|||
"Studio bis 2-BR-Apartments",
|
||||
"Creek-Cluster Al Jaddaf",
|
||||
"Off-Plan-Einstieg ab AED 1,14M"
|
||||
],
|
||||
"data_confidence": "green"
|
||||
]
|
||||
},
|
||||
{
|
||||
"slug": "samia",
|
||||
|
|
@ -1791,7 +1733,6 @@
|
|||
"Acht Duplex-Penthouses als USP",
|
||||
"14-stöckiges Bestandsobjekt"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "LIVE AT EASE AT SAMIA",
|
||||
"official_description": "Explore the exceptional lifestyle at Samia by Azizi – a sophisticated 14-storey residence nestled in the heart of Al Furjan. With 292 meticulously furnished apartments ranging from studios to spacious 2-bedroom layouts, alongside eight luxurious duplex penthouses, Samia seamlessly blends convenience with unmatched sophistication, setting a new standard for refined living in Al Furjan.",
|
||||
"official_description_de": "Samia ist eine 14-stöckige Wohnadresse im Herzen von Al Furjan. 292 möblierte Apartments von Studios bis 2-Zimmer-Layouts, ergänzt um acht Duplex-Penthouses, kombinieren Komfort mit gehobener Ausstattung in einem überschaubaren Gebäude."
|
||||
|
|
@ -1810,13 +1751,12 @@
|
|||
"image": "immobile/dubai/plaza/overview-thumbnail/plaza-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/al-furjan/plaza",
|
||||
"short": "Etablierte Al-Furjan-Adresse mit Studios, 1- und 2-BR-Apartments.",
|
||||
"marcel_take": "Plaza ist ein Bestandsprojekt mit klassischer Al-Furjan-Logik: 286 Studios, 46 1-BR und 102 2-BR. Vermietungsstark, Resale-Markt etabliert. Wer Al Furjan auf Cashflow spielt, sollte Plaza neben Star und Roy Mediterranean kennen.",
|
||||
"marcel_take": "Plaza ist ein Bestandsprojekt mit klassischer Al-Furjan-Logik: 286 Studios, 46 1-BR und 102 2-BR. Vermietungsstark, Resale-Markt etabliert. Wer Al Furjan auf Cashflow spielt, sollte Plaza neben Star und ROY Mediterranean kennen.",
|
||||
"highlights": [
|
||||
"286 Studios, 46 1-BR und 102 2-BR",
|
||||
"Bestand mit etabliertem Mietmarkt",
|
||||
"Resale-Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "LIVE LAVISHLY AT AZIZI PLAZA",
|
||||
"official_description": "Experience the essence of urban living at Azizi Plaza, where style seamlessly intertwine with convenience. Nestled in a well-connected urban enclave, a various collection of 286 studios, 46 one-bedroom apartments, and 102 two-bedroom apartments, embodying a fresh perspective on contemporary urban lifestyles.",
|
||||
"official_description_de": "Azizi Plaza liegt in einer gut angebundenen Al-Furjan-Lage und bietet 286 Studios, 46 Ein-Zimmer- und 102 Zwei-Zimmer-Apartments. Eine moderne, zeitgemäß geplante Wohnadresse für klassische urbane Lifestyles."
|
||||
|
|
@ -1841,7 +1781,6 @@
|
|||
"Etabliertes Al-Furjan-Bestandsobjekt",
|
||||
"Resale-Verfügbarkeit individuell"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "UNVEILING A CHAPTER OF REFINEMENT AT SHAISTA",
|
||||
"official_description": "A new chapter of refinement unfolds at Shaista, a place positioned conveniently in the heart of the Al-Furjan neighborhood, with a selection of 137 studios, 124 one-bedroom, and 23 two-bedroom apartments, crafting an enclave that encapsulates the essence of true living.",
|
||||
"official_description_de": "Shaista liegt zentral im Al-Furjan-Quartier und umfasst 137 Studios, 124 Ein-Zimmer- und 23 Zwei-Zimmer-Apartments. Eine Adresse, die kompakte Grundrisse mit ausgewogener Wohnqualität verbindet."
|
||||
|
|
@ -1866,7 +1805,6 @@
|
|||
"Reine Yield-Konfiguration",
|
||||
"Resale-Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "MONTRELL TRANSCENDS THE ORDINARY",
|
||||
"official_description": "Montrell is a meticulously crafted mid-rise development, featuring 168 studios and 54 one-bedroom apartments, each a masterpiece of contemporary design and laid-back luxury, allowing you to embrace a lifestyle of your own creation.",
|
||||
"official_description_de": "Montrell ist eine sorgfältig geplante Mid-Rise-Adresse mit 168 Studios und 54 Ein-Zimmer-Apartments. Zeitgemäßes Design und entspannte Wohnatmosphäre prägen das Haus - klassische Al-Furjan-Yield-Logik."
|
||||
|
|
@ -1891,7 +1829,6 @@
|
|||
"Einstieg ab AED 1,33M",
|
||||
"Etablierter Al-Furjan-Cluster"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "ELEVATE YOUR LIFESTYLE AT ACACIA RESIDENCES",
|
||||
"official_description": "Discover a sanctuary where lavishness meets convenience. Azizi's Acacia Residences redefine living, providing you with a dream home that perfectly complements your aspirations. Explore more of what awaits you.",
|
||||
"official_unit_type": "STUDIO, 1 & 3 BEDROOMS",
|
||||
|
|
@ -1918,7 +1855,6 @@
|
|||
"160 Studios und 58 1-BR-Apartments",
|
||||
"Einstieg ab AED 1,71M"
|
||||
],
|
||||
"data_confidence": "green",
|
||||
"official_headline": "A HAVEN OF COMFORT & SOPHISTICATION",
|
||||
"official_description": "Explore the extraordinary that awaits you at Aster, where 160 studios, 58 one-bedroom apartments, and 9 two-bedroom apartments redefine living with meticulous designs that harmonize elegance with everyday convenience.",
|
||||
"official_unit_type": "1 BEDROOM",
|
||||
|
|
@ -1945,7 +1881,6 @@
|
|||
"Familienorientierte Al-Furjan-Adresse",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "DWELL IN DISTINCTION AT AZIZI TULIP",
|
||||
"official_description": "Azizi Tulip stands as a housing gem, presenting a collection of one, two, and three-bedroom apartments that epitomize the essence of refined living. This haven is a sanctuary for families in search of a home that exudes distinction and sophistication, inviting you to indulge in a lifestyle of opulence",
|
||||
"official_description_de": "Azizi Tulip umfasst 1-, 2- und 3-Zimmer-Apartments und positioniert sich als Adresse für Familien und Bewohner mit höherem Flächenbedarf - klar familienorientiert statt reiner Yield-Adresse."
|
||||
|
|
@ -1970,7 +1905,6 @@
|
|||
"Etabliertes Al-Furjan-Bestandsobjekt",
|
||||
"Resale-Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "YOUR ALL-YEAR GETAWAY TO SMART LIVING",
|
||||
"official_description": "Introducing Al Freesia, a residential haven nestled in the vibrant heart of Al Furjan–it sets the stage for a life of sophistication and ease in a prime location, with impeccable amenities and plush living spaces.",
|
||||
"official_description_de": "Al Freesia liegt mitten in Al Furjan und kombiniert hochwertige Annehmlichkeiten mit komfortablen Wohnflächen. Eine Adresse mit Fokus auf Ausstattung und Wohnqualität in einer eingespielten Lage."
|
||||
|
|
@ -1995,7 +1929,6 @@
|
|||
"Europäisch ausgestattete Küchen",
|
||||
"Resale-Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "EMBARK ON NEW BEGINNINGS AT DAISY.",
|
||||
"official_description": "At Daisy, new beginnings intertwine seamlessly with the allure of nature, nestled in the serene embrace of Al Furjan, where you can choose from one, two, and three-bedroom apartments, each adorned with fully-fitted, European-style kitchens boasting high-end finishes.",
|
||||
"official_description_de": "Daisy in Al Furjan bietet 1-, 2- und 3-Zimmer-Apartments mit voll ausgestatteten Küchen im europäischen Stil und hochwertigen Materialien. Eine Adresse für Bewohner, die Wert auf Ausstattung und Wohnqualität legen."
|
||||
|
|
@ -2020,7 +1953,6 @@
|
|||
"Lifestyle-orientierte Al-Furjan-Adresse",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "WHERE EVERY SUNRISE UNVEILS THE BEAUTY OF DUBAI MARINA",
|
||||
"official_description": "Imagine waking up to breathtaking views of Dubai Marina every day, while being surrounded by tasteful and elegant design. This is your chance to elevate your living standards and make a statement with Orchid. Invest in more than just a property, invest in a lifestyle that others will envy.",
|
||||
"official_description_de": "Orchid in Al Furjan bietet Sichtachsen Richtung Dubai Marina und kombiniert sie mit hochwertigem Design. Eine Adresse, die mehr Lifestyle-Charakter trägt als die reinen Yield-Häuser des Quartiers."
|
||||
|
|
@ -2045,7 +1977,6 @@
|
|||
"Etablierter Al-Furjan-Bestand",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "YOUR IDEAL PLACE TO CALL HOME",
|
||||
"official_description": "Indulge in the real gem of Al-Furjan at Feirouz, where each family member will find their perfect sanctuary within our spacious apartments, surrounded by a myriad of amenities and breathtaking views that redefine everyday luxury.",
|
||||
"official_description_de": "Feirouz in Al Furjan ist eine familienorientierte Adresse mit großzügigen Apartments. Die Kombination aus zahlreichen Annehmlichkeiten und ausgewählten Sichtachsen positioniert das Haus als komfortable Wohnadresse für unterschiedliche Familiensituationen."
|
||||
|
|
@ -2070,7 +2001,6 @@
|
|||
"Mehrere Wohnungsgrößen vergleichbar",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "TURNING YOUR NEEDS TO YASAMINE",
|
||||
"official_description": "At Yasamine, we understand that every resident has unique desires and needs. That's why we've designed our apartments to cater to a variety of lifestyles, with different sizes and layouts available to suit your preferences. And with stunning views from every apartment, you'll never tire of the breathtaking scenery. Experience the uniqueness of Yasamine for yourself and discover your perfect home.",
|
||||
"official_description_de": "Yasamine in Al Furjan setzt auf Layout-Vielfalt: unterschiedliche Wohnungsgrößen und Grundrisse, dazu ausgewählte Sichtachsen aus jedem Apartment. Eine Adresse, die unterschiedliche Wohnbedürfnisse innerhalb desselben Hauses abdeckt."
|
||||
|
|
@ -2088,17 +2018,16 @@
|
|||
"units": "Einheitentypen prüfen",
|
||||
"image": "immobile/dubai/iris/overview-thumbnail/iris-overview-thumbnail.webp",
|
||||
"official_url": "https://www.azizidevelopments.com/dubai/al-furjan/iris",
|
||||
"short": "Al-Furjan-Adresse mit Apartments inklusive privater Terrasse oder Balkon.",
|
||||
"short": "Al-Furjan-Adresse mit Apartments inklusive privater Terrasse oder privatem Balkon.",
|
||||
"marcel_take": "Iris hebt sich im Al-Furjan-Bestand durch private Terrassen oder Balkone in jeder Einheit ab. Das spricht eher Eigennutzer an als reine Yield-Investoren. Verfügbarkeit individuell prüfen.",
|
||||
"highlights": [
|
||||
"Apartments mit privater Terrasse oder Balkon",
|
||||
"Apartments mit privater Terrasse oder privatem Balkon",
|
||||
"Eigennutzer-affines Profil",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "DISCOVER THE SERENE LIFE OF IRIS",
|
||||
"official_description": "At Iris, your dreams become reality with an array of exquisite apartments, each featuring a private terrace or balcony providing a tranquil retreat with stunning city views for you to enjoy the convenience of coming home to your own private sanctuary without any stress.",
|
||||
"official_description_de": "Iris in Al Furjan kombiniert exquisit ausgestattete Apartments mit privater Terrasse oder Balkon je Einheit - eine Adresse mit klarem Eigennutzer-Fokus innerhalb einer urbanen Lage."
|
||||
"official_description_de": "Iris in Al Furjan kombiniert exquisit ausgestattete Apartments mit privater Terrasse oder privatem Balkon je Einheit - eine Adresse mit klarem Eigennutzer-Fokus innerhalb einer urbanen Lage."
|
||||
},
|
||||
{
|
||||
"slug": "liatris",
|
||||
|
|
@ -2120,7 +2049,6 @@
|
|||
"Lifestyle-Charakter",
|
||||
"Verfügbarkeit auf Anfrage"
|
||||
],
|
||||
"data_confidence": "yellow",
|
||||
"official_headline": "INDULGE IN MESMERIZING PANORAMIC VIEWS",
|
||||
"official_description": "Discover a life of exquisite luxury at Azizi Liatris, where each residence offers enchanting vistas of the iconic Dubai Marina high-rises, elevating your way of living to new heights as you indulge in the epitome of sophistication with opulent interiors.",
|
||||
"official_description_de": "Azizi Liatris bietet aus jeder Wohnung Sichtachsen in Richtung Dubai-Marina-Skyline. Eine Adresse mit Lifestyle-Charakter und gehobener Ausstattung im Al-Furjan-Bestand."
|
||||
|
|
@ -2158,7 +2086,7 @@
|
|||
{
|
||||
"icon": "building-office-2",
|
||||
"title": "Projektqualität zählt",
|
||||
"description": "Nicht \"Dubai\" entscheidet über Ihre Rendite, sondern Lage, Entwickler, Baufortschritt, Zahlungsplan und Exit-Strategie auf Einheitenebene. Genau dort setzt die persönliche Einordnung von Marcel an - statt einer austauschbaren Empfehlung."
|
||||
"description": "Nicht „Dubai“ entscheidet über Ihre Rendite, sondern Lage, Entwickler, Baufortschritt, Zahlungsplan und Exit-Strategie auf Einheitenebene. Genau dort setzt die persönliche Einordnung von Marcel an - statt einer austauschbaren Empfehlung."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -16,26 +16,22 @@ return [
|
|||
'menu_close' => 'Menü schließen',
|
||||
'menu_open' => 'Menü öffnen',
|
||||
|
||||
// Welten-Wechsler (Interior / Immobilien)
|
||||
// Farb-Schalter für die Abstimmung der Palette (Nachtrag 18)
|
||||
'palette' => [
|
||||
'label' => 'Farbwelt',
|
||||
'classic' => 'Bisher',
|
||||
'modern' => 'Neu',
|
||||
'draft' => 'Entwurf',
|
||||
],
|
||||
// Slideshow im Hero des Entwurfs (Nachtrag 19)
|
||||
// Slideshow im Hero der Startseite (Nachtrag 23)
|
||||
'hero_slider' => [
|
||||
'label' => 'Einblicke in unsere Marken',
|
||||
'dots' => 'Bild wählen',
|
||||
'dot' => 'Bild :n von :total: :label',
|
||||
'empty' => 'Noch keine Bilder hinterlegt.',
|
||||
],
|
||||
// Welten-Wechsler (Interior / Immobilien)
|
||||
'worlds_label' => 'Bereich wechseln',
|
||||
'world_interior' => 'Interior',
|
||||
'world_immobilien' => 'Immobilien',
|
||||
|
||||
'display_feed_title' => 'Live-Ansicht des Showroom-Displays',
|
||||
'display_feed_enlarge' => 'Größer ansehen',
|
||||
'display_feed_fullscreen' => 'Vollbild',
|
||||
'display_feed_close' => 'Schließen',
|
||||
'opens_new_tab' => '(öffnet in neuem Tab)',
|
||||
'references_empty' => 'Die ersten Projekte erscheinen hier, sobald wir sie zeigen dürfen.',
|
||||
|
||||
// Terminanfrage-Widget
|
||||
|
|
@ -61,7 +57,6 @@ return [
|
|||
|
||||
// Kernmarken
|
||||
'all_brands_cta' => 'Alle Marken ansehen',
|
||||
'brands' => 'Marken',
|
||||
'whatsapp' => 'Per WhatsApp schreiben',
|
||||
'all_brands' => 'Alle Marken',
|
||||
'brand_services' => 'Leistungen und Besonderheiten',
|
||||
|
|
@ -106,7 +101,7 @@ return [
|
|||
'announcement_close' => 'Schließen',
|
||||
|
||||
// Hero Slider
|
||||
'show_slide' => 'Slide :number anzeigen',
|
||||
'show_slide' => 'Bild :number anzeigen',
|
||||
'previous_image' => 'Vorheriges Bild',
|
||||
'next_image' => 'Nächstes Bild',
|
||||
|
||||
|
|
@ -121,15 +116,15 @@ return [
|
|||
'first_name' => 'Vorname *',
|
||||
'last_name' => 'Nachname *',
|
||||
'company' => 'Firma (optional)',
|
||||
'email' => 'Email *',
|
||||
'email' => 'E-Mail *',
|
||||
'phone' => 'Telefon (optional)',
|
||||
'subject' => 'Betreff *',
|
||||
'message' => 'Nachricht *',
|
||||
'message_placeholder' => 'Ihre Nachricht...',
|
||||
'message_placeholder' => 'Ihre Nachricht …',
|
||||
'privacy_prefix' => 'Ich habe die',
|
||||
'privacy_suffix' => 'gelesen und stimme der Verarbeitung meiner Daten zu. *',
|
||||
'send' => 'Senden',
|
||||
'sending' => 'Wird gesendet...',
|
||||
'sending' => 'Wird gesendet …',
|
||||
],
|
||||
|
||||
// Immobilien Contact Form
|
||||
|
|
@ -137,7 +132,7 @@ return [
|
|||
'success_title' => 'Anfrage erfolgreich gesendet!',
|
||||
'success_message' => 'Vielen Dank für Ihr Interesse. Wir melden uns so schnell wie möglich bei Ihnen.',
|
||||
'interest' => 'Interesse',
|
||||
'please_select' => 'Bitte wählen...',
|
||||
'please_select' => 'Bitte wählen …',
|
||||
'first_name' => 'Vorname *',
|
||||
'first_name_placeholder' => 'Ihr Vorname',
|
||||
'last_name' => 'Nachname *',
|
||||
|
|
@ -146,11 +141,11 @@ return [
|
|||
'email_placeholder' => 'ihre@email.com',
|
||||
'phone' => 'Telefon (optional)',
|
||||
'message' => 'Nachricht (optional)',
|
||||
'message_placeholder' => 'Ihre Nachricht...',
|
||||
'message_placeholder' => 'Ihre Nachricht …',
|
||||
'privacy_prefix' => 'Ich habe die',
|
||||
'privacy_suffix' => 'gelesen und stimme der Verarbeitung meiner Daten zu. *',
|
||||
'submit' => 'Exposé & Verfügbarkeit anfragen',
|
||||
'sending' => 'Wird gesendet...',
|
||||
'sending' => 'Wird gesendet …',
|
||||
],
|
||||
|
||||
// Portfolio
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -24,7 +24,7 @@ return [
|
|||
<div>
|
||||
<h2 class="text-lg font-semibold text-foreground mb-2">Contact</h2>
|
||||
<p>
|
||||
Email: <a href="mailto:info@b2in.de" class="text-secondary hover:underline">info@b2in.de</a><br>
|
||||
Email: <a href="mailto:info@b2in.eu" class="text-secondary hover:underline">info@b2in.eu</a><br>
|
||||
Phone: +49 (0) 5221 9255055
|
||||
</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -16,26 +16,22 @@ return [
|
|||
'menu_close' => 'Close menu',
|
||||
'menu_open' => 'Open menu',
|
||||
|
||||
// World switcher (Interior / Real estate)
|
||||
// Farb-Schalter für die Abstimmung der Palette (Nachtrag 18)
|
||||
'palette' => [
|
||||
'label' => 'Colour scheme',
|
||||
'classic' => 'Current',
|
||||
'modern' => 'New',
|
||||
'draft' => 'Draft',
|
||||
],
|
||||
// Slideshow in the draft hero (Nachtrag 19)
|
||||
// Slideshow in the home page hero (Nachtrag 23)
|
||||
'hero_slider' => [
|
||||
'label' => 'Glimpses of our brands',
|
||||
'dots' => 'Choose image',
|
||||
'dot' => 'Image :n of :total: :label',
|
||||
'empty' => 'No images yet.',
|
||||
],
|
||||
// World switcher (Interior / Real estate)
|
||||
'worlds_label' => 'Switch area',
|
||||
'world_interior' => 'Interior',
|
||||
'world_immobilien' => 'Real estate',
|
||||
|
||||
'display_feed_title' => 'Live view of the showroom display',
|
||||
'display_feed_enlarge' => 'View larger',
|
||||
'display_feed_fullscreen' => 'Full screen',
|
||||
'display_feed_close' => 'Close',
|
||||
'opens_new_tab' => '(opens in a new tab)',
|
||||
'references_empty' => 'The first projects will appear here as soon as we are allowed to show them.',
|
||||
|
||||
// Appointment widget
|
||||
|
|
@ -61,7 +57,6 @@ return [
|
|||
|
||||
// Kernmarken
|
||||
'all_brands_cta' => 'View all brands',
|
||||
'brands' => 'Brands',
|
||||
'whatsapp' => 'Message us on WhatsApp',
|
||||
'all_brands' => 'All brands',
|
||||
'brand_services' => 'Services and specialities',
|
||||
|
|
|
|||
23
resources/lang/vendor/cookie-consent/de/cookie-consent.php
vendored
Normal file
23
resources/lang/vendor/cookie-consent/de/cookie-consent.php
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Projektseitige Anpassungen der Texte aus acme/cookie-consent (06.10.2026).
|
||||
*
|
||||
* Die Website nutzt Google Analytics 4: Dort gibt es keine Einstellung „IP-Anonymisierung“ mehr,
|
||||
* IP-Adressen werden nicht gespeichert. Alle übrigen Texte kommen weiter aus dem Paket.
|
||||
*/
|
||||
return [
|
||||
'google_analytics' => [
|
||||
'intro' => 'Diese Website nutzt Google Analytics, einen Webanalysedienst der Google Ireland Limited („Google“), Gordon House, Barrow Street, Dublin 4, Irland.',
|
||||
|
||||
'technical_details' => [
|
||||
'ip_anonymization' => 'IP-Adressen',
|
||||
'ip_anonymization_value' => 'Werden in Google Analytics 4 nicht gespeichert',
|
||||
],
|
||||
|
||||
'ip_anonymization' => [
|
||||
'title' => 'IP-Adressen',
|
||||
'text' => 'Wir setzen Google Analytics 4 ein. Dort werden IP-Adressen nicht protokolliert oder gespeichert; Google nutzt sie lediglich, um daraus grobe Standortdaten abzuleiten, und verwirft sie anschließend.',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
|
||||
<head>
|
||||
@include('partials.head')
|
||||
</head>
|
||||
<body class="min-h-screen bg-white dark:bg-zinc-800">
|
||||
<flux:header container class="border-b border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900">
|
||||
<flux:sidebar.toggle class="lg:hidden" icon="bars-2" inset="left" />
|
||||
|
||||
<a href="{{ route('dashboard') }}" class="ms-2 me-5 flex items-center space-x-2 rtl:space-x-reverse lg:ms-0" wire:navigate>
|
||||
<x-app-logo />
|
||||
</a>
|
||||
|
||||
<flux:navbar class="-mb-px max-lg:hidden">
|
||||
<flux:navbar.item icon="layout-grid" :href="route('dashboard')" :current="request()->routeIs('dashboard')" wire:navigate>
|
||||
{{ __('Dashboard') }}
|
||||
</flux:navbar.item>
|
||||
</flux:navbar>
|
||||
|
||||
<flux:spacer />
|
||||
|
||||
<flux:navbar class="me-1.5 space-x-0.5 rtl:space-x-reverse py-0!">
|
||||
<flux:tooltip :content="__('Search')" position="bottom">
|
||||
<flux:navbar.item class="!h-10 [&>div>svg]:size-5" icon="magnifying-glass" href="#" :label="__('Search')" />
|
||||
</flux:tooltip>
|
||||
<flux:tooltip :content="__('Repository')" position="bottom">
|
||||
<flux:navbar.item
|
||||
class="h-10 max-lg:hidden [&>div>svg]:size-5"
|
||||
icon="folder-git-2"
|
||||
href="https://github.com/laravel/livewire-starter-kit"
|
||||
target="_blank"
|
||||
:label="__('Repository')"
|
||||
/>
|
||||
</flux:tooltip>
|
||||
<flux:tooltip :content="__('Documentation')" position="bottom">
|
||||
<flux:navbar.item
|
||||
class="h-10 max-lg:hidden [&>div>svg]:size-5"
|
||||
icon="book-open-text"
|
||||
href="https://laravel.com/docs/starter-kits#livewire"
|
||||
target="_blank"
|
||||
label="Documentation"
|
||||
/>
|
||||
</flux:tooltip>
|
||||
</flux:navbar>
|
||||
|
||||
<!-- Desktop User Menu -->
|
||||
<flux:dropdown position="top" align="end">
|
||||
<flux:profile
|
||||
class="cursor-pointer"
|
||||
:initials="auth()->user()->initials()"
|
||||
/>
|
||||
|
||||
<flux:menu>
|
||||
<flux:menu.radio.group>
|
||||
<div class="p-0 text-sm font-normal">
|
||||
<div class="flex items-center gap-2 px-1 py-1.5 text-start text-sm">
|
||||
<span class="relative flex h-8 w-8 shrink-0 overflow-hidden rounded-lg">
|
||||
<span
|
||||
class="flex h-full w-full items-center justify-center rounded-lg bg-neutral-200 text-black dark:bg-neutral-700 dark:text-white"
|
||||
>
|
||||
{{ auth()->user()->initials() }}
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<div class="grid flex-1 text-start text-sm leading-tight">
|
||||
<span class="truncate font-semibold">{{ auth()->user()->name }}</span>
|
||||
<span class="truncate text-xs">{{ auth()->user()->email }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</flux:menu.radio.group>
|
||||
|
||||
<flux:menu.separator />
|
||||
|
||||
<flux:menu.radio.group>
|
||||
<flux:menu.item :href="route('settings.profile')" icon="cog" wire:navigate>{{ __('Settings') }}</flux:menu.item>
|
||||
</flux:menu.radio.group>
|
||||
|
||||
<flux:menu.separator />
|
||||
|
||||
<form method="POST" action="{{ route('auth.logout') }}" class="w-full">
|
||||
@csrf
|
||||
<flux:menu.item as="button" type="submit" icon="arrow-right-start-on-rectangle" class="w-full">
|
||||
{{ __('Log Out') }}
|
||||
</flux:menu.item>
|
||||
</form>
|
||||
</flux:menu>
|
||||
</flux:dropdown>
|
||||
</flux:header>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<flux:sidebar stashable sticky class="lg:hidden border-e border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900">
|
||||
<flux:sidebar.toggle class="lg:hidden" icon="x-mark" />
|
||||
|
||||
<a href="{{ route('dashboard') }}" class="ms-1 flex items-center space-x-2 rtl:space-x-reverse" wire:navigate>
|
||||
<x-app-logo />
|
||||
</a>
|
||||
|
||||
<flux:navlist variant="outline">
|
||||
<flux:navlist.group :heading="__('Platform')">
|
||||
<flux:navlist.item icon="layout-grid" :href="route('dashboard')" :current="request()->routeIs('dashboard')" wire:navigate>
|
||||
{{ __('Dashboard') }}
|
||||
</flux:navlist.item>
|
||||
</flux:navlist.group>
|
||||
</flux:navlist>
|
||||
|
||||
<flux:spacer />
|
||||
|
||||
<flux:navlist variant="outline">
|
||||
<flux:navlist.item icon="folder-git-2" href="https://github.com/laravel/livewire-starter-kit" target="_blank">
|
||||
{{ __('Repository') }}
|
||||
</flux:navlist.item>
|
||||
|
||||
<flux:navlist.item icon="book-open-text" href="https://laravel.com/docs/starter-kits#livewire" target="_blank">
|
||||
{{ __('Documentation') }}
|
||||
</flux:navlist.item>
|
||||
</flux:navlist>
|
||||
</flux:sidebar>
|
||||
|
||||
{{ $slot }}
|
||||
|
||||
@livewireScripts
|
||||
@fluxScripts
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
|
||||
<head>
|
||||
@include('partials.head')
|
||||
@include('partials.theme-init-script')
|
||||
</head>
|
||||
<body class="min-h-screen bg-zinc-50 antialiased dark:bg-gradient-to-b dark:from-zinc-950 dark:to-zinc-900">
|
||||
<div class="bg-background flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10">
|
||||
<div class="flex w-full max-w-sm flex-col gap-2">
|
||||
<a href="{{ route('home') }}" class="flex flex-col items-center gap-2 font-medium" wire:navigate>
|
||||
<span class="flex h-12 w-12 mb-1 items-center justify-center rounded-md">
|
||||
<x-app-logo-icon />
|
||||
</span>
|
||||
<span class="sr-only">{{ config('app.name', 'Laravel') }}</span>
|
||||
</a>
|
||||
<div class="flex flex-col gap-6">
|
||||
{{ $slot }}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex justify-center mt-6">
|
||||
<x-theme-toggle />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@livewireScripts
|
||||
@fluxScripts
|
||||
@include('partials.theme-toggle-script')
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
|
||||
<head>
|
||||
@include('partials.head')
|
||||
@include('partials.theme-init-script')
|
||||
</head>
|
||||
<body class="min-h-screen bg-zinc-50 antialiased dark:bg-gradient-to-b dark:from-zinc-950 dark:to-zinc-900">
|
||||
<div class="relative grid h-dvh flex-col items-center justify-center px-8 sm:px-0 lg:max-w-none lg:grid-cols-2 lg:px-0">
|
||||
<div class="bg-muted relative hidden h-full flex-col p-10 text-white lg:flex dark:border-e dark:border-neutral-800">
|
||||
<div class="absolute inset-0 bg-neutral-900"></div>
|
||||
<a href="{{ route('home') }}" class="relative z-20 flex items-center text-lg font-medium" wire:navigate>
|
||||
<span class="flex h-10 w-10 items-center justify-center rounded-md">
|
||||
<x-app-logo-icon class="me-2 h-7" />
|
||||
</span>
|
||||
{{ config('app.name', 'Laravel') }}
|
||||
</a>
|
||||
|
||||
@php
|
||||
[$message, $author] = str(Illuminate\Foundation\Inspiring::quotes()->random())->explode('-');
|
||||
@endphp
|
||||
|
||||
<div class="relative z-20 mt-auto">
|
||||
<blockquote class="space-y-2">
|
||||
<flux:heading size="lg">“{{ trim($message) }}”</flux:heading>
|
||||
<footer><flux:heading>{{ trim($author) }}</flux:heading></footer>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="w-full lg:p-8">
|
||||
<div class="mx-auto flex w-full flex-col justify-center space-y-6 sm:w-[350px]">
|
||||
<a href="{{ route('home') }}" class="z-20 flex flex-col items-center gap-2 font-medium lg:hidden" wire:navigate>
|
||||
<span class="flex h-9 w-9 items-center justify-center rounded-md">
|
||||
<x-app-logo-icon />
|
||||
</span>
|
||||
|
||||
<span class="sr-only">{{ config('app.name', 'Laravel') }}</span>
|
||||
</a>
|
||||
{{ $slot }}
|
||||
|
||||
<div class="flex justify-center mt-6">
|
||||
<x-theme-toggle />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@livewireScripts
|
||||
@fluxScripts
|
||||
@include('partials.theme-toggle-script')
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
{{-- Farb-Schalter für die Abstimmung (Nachtrag 18 + 19): bisherige Creme-Palette, die hellere
|
||||
Variante „Neu“ und der Entwurf vom 24.09. Schwimmt am linken Rand in der Mitte – unten links
|
||||
sitzt der Cookie-Button, unten rechts die Terminanfrage.
|
||||
„Bisher“ und „Neu“ schalten im Browser um (localStorage b2in-palette, im <head> gesetzt,
|
||||
?palette=modern|classic per Link). „Entwurf“ ist eine eigene Seite (/entwurf) mit fester
|
||||
Palette; von dort führen die beiden anderen Einträge zurück auf die Startseite. --}}
|
||||
@props(['draft' => false])
|
||||
|
||||
<div class="fixed left-3 top-1/2 z-40 -translate-y-1/2 print:hidden" data-palette-switch
|
||||
@unless ($draft)
|
||||
x-data="{
|
||||
palette: document.documentElement.classList.contains('palette-modern') ? 'modern' : 'classic',
|
||||
choose(value) {
|
||||
this.palette = value;
|
||||
document.documentElement.classList.toggle('palette-modern', value === 'modern');
|
||||
try { localStorage.setItem('b2in-palette', value); } catch (e) {}
|
||||
},
|
||||
}"
|
||||
@endunless>
|
||||
<div class="flex flex-col items-stretch gap-1 rounded-full border border-border bg-card/95 p-1 text-[11px] font-medium shadow-lg backdrop-blur-sm"
|
||||
role="group" aria-label="{{ __('ui.palette.label') }}">
|
||||
<span class="px-2 pt-1 text-center text-[10px] uppercase tracking-wide text-muted-foreground" aria-hidden="true">
|
||||
{{ __('ui.palette.label') }}
|
||||
</span>
|
||||
|
||||
@if ($draft)
|
||||
<a href="{{ url('/?palette=classic') }}"
|
||||
class="rounded-full px-3 py-1.5 text-center text-muted-foreground transition-colors duration-200 hover:text-foreground">
|
||||
{{ __('ui.palette.classic') }}
|
||||
</a>
|
||||
<a href="{{ url('/?palette=modern') }}"
|
||||
class="rounded-full px-3 py-1.5 text-center text-muted-foreground transition-colors duration-200 hover:text-foreground">
|
||||
{{ __('ui.palette.modern') }}
|
||||
</a>
|
||||
<span aria-current="page" class="rounded-full bg-primary px-3 py-1.5 text-center text-primary-foreground">
|
||||
{{ __('ui.palette.draft') }}
|
||||
</span>
|
||||
@else
|
||||
<button type="button" x-on:click="choose('classic')" x-bind:aria-pressed="(palette === 'classic').toString()"
|
||||
x-bind:class="palette === 'classic' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'"
|
||||
class="cursor-pointer rounded-full px-3 py-1.5 transition-colors duration-200">
|
||||
{{ __('ui.palette.classic') }}
|
||||
</button>
|
||||
<button type="button" x-on:click="choose('modern')" x-bind:aria-pressed="(palette === 'modern').toString()"
|
||||
x-bind:class="palette === 'modern' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'"
|
||||
class="cursor-pointer rounded-full px-3 py-1.5 transition-colors duration-200">
|
||||
{{ __('ui.palette.modern') }}
|
||||
</button>
|
||||
<a href="{{ route('home.draft') }}"
|
||||
class="rounded-full px-3 py-1.5 text-center text-muted-foreground transition-colors duration-200 hover:text-foreground">
|
||||
{{ __('ui.palette.draft') }}
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
@props([
|
||||
'id' => uniqid(),
|
||||
])
|
||||
|
||||
<svg {{ $attributes }} fill="none">
|
||||
<defs>
|
||||
<pattern id="pattern-{{ $id }}" x="0" y="0" width="8" height="8" patternUnits="userSpaceOnUse">
|
||||
<path d="M-1 5L5 -1M3 9L8.5 3.5" stroke-width="0.5"></path>
|
||||
</pattern>
|
||||
</defs>
|
||||
<rect stroke="none" fill="url(#pattern-{{ $id }})" width="100%" height="100%"></rect>
|
||||
</svg>
|
||||
10
resources/views/components/web/hero-eyebrow.blade.php
Normal file
10
resources/views/components/web/hero-eyebrow.blade.php
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{{-- Zeile über der Hero-Überschrift (07.10.2026, Vorbild „Farbwelt und Stil“): leicht gesperrt,
|
||||
mit kurzer Akzentlinie. Ohne Text bleibt sie weg. --}}
|
||||
@props(['text' => null])
|
||||
|
||||
@if (filled($text))
|
||||
<p {{ $attributes->class('flex items-center gap-4 text-sm font-medium tracking-wide text-muted-foreground') }} data-hero-eyebrow>
|
||||
{{ $text }}
|
||||
<span class="h-px w-16 bg-[hsl(var(--secondary))]" aria-hidden="true"></span>
|
||||
</p>
|
||||
@endif
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
{{-- Linke Flanke des Entwurfs-Heros (Nachtrag 19): schmaler Haken unten links, oben gerundet,
|
||||
mit Goldlinie. Höhe rund 46 % des Rahmens, Breite aus dem viewBox-Verhältnis. --}}
|
||||
<svg class="hero-flank hero-flank-left hidden lg:block" viewBox="0 0 80 480" preserveAspectRatio="xMinYMax meet"
|
||||
aria-hidden="true" focusable="false" data-hero-flank="left">
|
||||
<defs>
|
||||
<linearGradient id="hero-flank-left-green" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" style="stop-color: hsl(var(--primary-light))" />
|
||||
<stop offset="1" style="stop-color: hsl(var(--primary-dark))" />
|
||||
</linearGradient>
|
||||
<linearGradient id="hero-flank-left-gold" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" style="stop-color: hsl(var(--secondary-light))" />
|
||||
<stop offset="1" style="stop-color: hsl(var(--secondary)); stop-opacity: 0.5" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path d="M0 480V56C0 25 25 0 56 0H80V480Z" fill="url(#hero-flank-left-green)" />
|
||||
<path d="M14 480V60C14 35 35 14 60 14H80" fill="none" stroke="url(#hero-flank-left-gold)" stroke-width="1.5"
|
||||
vector-effect="non-scaling-stroke" />
|
||||
</svg>
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
{{-- Rechte Flanke des Entwurfs-Heros (Nachtrag 19): tannengrüner Block mit gerundeter Innenkante,
|
||||
Goldlinie mit Verlauf entlang der Rundung und einer kurzen Zierlinie wie in der Visualisierung.
|
||||
Skaliert über die Rahmenhöhe (height: 100 %, Breite aus dem viewBox-Verhältnis). Farben
|
||||
kommen aus den Tokens, damit die Flanke jede Palette mitmacht. Kann später 1:1 gegen eine
|
||||
gelieferte SVG-Datei getauscht werden. --}}
|
||||
<svg class="hero-flank hero-flank-right hidden lg:block" viewBox="0 0 140 1000" preserveAspectRatio="xMaxYMid meet"
|
||||
aria-hidden="true" focusable="false" data-hero-flank="right">
|
||||
<defs>
|
||||
<linearGradient id="hero-flank-right-green" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" style="stop-color: hsl(var(--primary-light))" />
|
||||
<stop offset="1" style="stop-color: hsl(var(--primary-dark))" />
|
||||
</linearGradient>
|
||||
<linearGradient id="hero-flank-right-gold" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0" style="stop-color: hsl(var(--secondary-light))" />
|
||||
<stop offset="0.5" style="stop-color: hsl(var(--secondary)); stop-opacity: 0.45" />
|
||||
<stop offset="1" style="stop-color: hsl(var(--secondary-light))" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path d="M140 0H72C32 0 0 32 0 72V928C0 968 32 1000 72 1000H140Z" fill="url(#hero-flank-right-green)" />
|
||||
<path d="M140 14H74C41 14 14 41 14 74V926C14 959 41 986 74 986H140" fill="none"
|
||||
stroke="url(#hero-flank-right-gold)" stroke-width="1.5" vector-effect="non-scaling-stroke" />
|
||||
<path d="M124 330V600" fill="none" stroke="url(#hero-flank-right-gold)" stroke-width="1.5"
|
||||
vector-effect="non-scaling-stroke" />
|
||||
</svg>
|
||||
14
resources/views/components/web/hero-trust.blade.php
Normal file
14
resources/views/components/web/hero-trust.blade.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{{-- Vertrauenspunkte unten im Hero (Startseite, Marken): Häkchen in Akzentfarbe, getrennt durch
|
||||
eine feine Linie vom Text darüber. Ohne Einträge bleibt die Leiste weg. --}}
|
||||
@props(['items' => []])
|
||||
|
||||
@if (filled(array_filter((array) $items)))
|
||||
<div {{ $attributes->class('flex flex-wrap items-center gap-6 border-t border-border/80 pt-8 slide-right delay-300') }} data-hero-trust>
|
||||
@foreach (array_filter((array) $items) as $item)
|
||||
<div class="flex items-center gap-2 text-md text-muted-foreground font-light">
|
||||
@svg('heroicon-o-check-circle', 'w-6 h-6 text-secondary')
|
||||
<span>{{ $item }}</span>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
|
|
@ -1,149 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>@yield('title', $domainName ?? 'Admin - ' . config('app.name'))</title>
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" href="{{ asset('img/favicons/admin-favicon.ico') }}">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600,700" rel="stylesheet" />
|
||||
|
||||
<!-- Styles -->
|
||||
@vite(['resources/css/admin.css', 'resources/js/app.js'])
|
||||
|
||||
<!-- Additional Styles -->
|
||||
@stack('styles')
|
||||
</head>
|
||||
<body class="antialiased bg-gray-50 dark:bg-gray-900">
|
||||
<div class="min-h-screen flex">
|
||||
<!-- Sidebar Navigation -->
|
||||
<aside class="w-64 bg-white dark:bg-gray-800 shadow-md hidden md:block">
|
||||
<div class="p-6">
|
||||
<a href="{{ route('admin.home') }}" class="text-xl font-bold text-gray-900 dark:text-white">
|
||||
{{ $domainName ?? config('app.name') . ' Admin' }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<nav class="mt-10 px-6">
|
||||
<a href="{{ route('admin.dashboard') }}" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-100 dark:hover:bg-gray-700 {{ request()->routeIs('admin.dashboard') ? 'bg-gray-100 dark:bg-gray-700' : '' }}">
|
||||
Dashboard
|
||||
</a>
|
||||
<a href="{{ route('admin.settings.profile') }}" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-100 dark:hover:bg-gray-700 {{ request()->routeIs('admin.settings.profile') ? 'bg-gray-100 dark:bg-gray-700' : '' }}">
|
||||
Profil
|
||||
</a>
|
||||
<!-- Weitere Navigationspunkte hier -->
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<div class="flex-1 flex flex-col">
|
||||
<!-- Top Navigation -->
|
||||
<header class="bg-white dark:bg-gray-800 shadow-sm">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex items-center md:hidden">
|
||||
<!-- Mobile menu button -->
|
||||
<button type="button" class="text-gray-500 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" id="mobile-menu-button">
|
||||
<span class="sr-only">Menu öffnen</span>
|
||||
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
@if(app()->environment('local'))
|
||||
<!-- Domain-Informationsanzeige (nur in local) -->
|
||||
<div class="mr-4 text-xs px-2 py-1 rounded bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-200">
|
||||
{{ Request::getHost() }}
|
||||
@if(config('domains.dev_settings.simulate_domain'))
|
||||
<span class="inline-flex items-center ml-1 px-1.5 py-0.5 rounded-full text-xs bg-yellow-100 text-yellow-800">
|
||||
Simuliert
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- User Dropdown -->
|
||||
<div class="ml-3 relative">
|
||||
<div>
|
||||
<button type="button" class="flex text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" id="user-menu-button">
|
||||
<span class="sr-only">Benutzermenü öffnen</span>
|
||||
<div class="h-8 w-8 rounded-full bg-gray-200 flex items-center justify-center">
|
||||
<span class="text-xs font-medium">{{ Auth::user()->name[0] ?? 'U' }}</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Dropdown menu -->
|
||||
<div class="hidden origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg py-1 bg-white dark:bg-gray-700 ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" id="user-menu">
|
||||
<a href="{{ route('admin.settings.profile') }}" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600" role="menuitem">Profil</a>
|
||||
<a href="{{ route('admin.settings.appearance') }}" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600" role="menuitem">Einstellungen</a>
|
||||
<form method="POST" action="{{ route('auth.logout') }}">
|
||||
@csrf
|
||||
<button type="submit" class="block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600" role="menuitem">Abmelden</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Mobile menu (off-canvas) -->
|
||||
<div class="md:hidden hidden" id="mobile-menu">
|
||||
<div class="px-2 pt-2 pb-3 space-y-1 bg-white dark:bg-gray-800 shadow-lg">
|
||||
<a href="{{ route('admin.dashboard') }}" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700">Dashboard</a>
|
||||
<a href="{{ route('admin.settings.profile') }}" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700">Profil</a>
|
||||
<!-- Weitere mobile Navigationspunkte hier -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Page Content -->
|
||||
<main class="flex-1 py-10">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
@yield('content')
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script>
|
||||
// Toggle user dropdown
|
||||
const userMenuButton = document.getElementById('user-menu-button');
|
||||
const userMenu = document.getElementById('user-menu');
|
||||
|
||||
if (userMenuButton && userMenu) {
|
||||
userMenuButton.addEventListener('click', function() {
|
||||
userMenu.classList.toggle('hidden');
|
||||
});
|
||||
|
||||
// Close the dropdown when clicked outside
|
||||
document.addEventListener('click', function(event) {
|
||||
if (!userMenuButton.contains(event.target) && !userMenu.contains(event.target)) {
|
||||
userMenu.classList.add('hidden');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Mobile menu toggle
|
||||
const mobileMenuButton = document.getElementById('mobile-menu-button');
|
||||
const mobileMenu = document.getElementById('mobile-menu');
|
||||
|
||||
if (mobileMenuButton && mobileMenu) {
|
||||
mobileMenuButton.addEventListener('click', function() {
|
||||
mobileMenu.classList.toggle('hidden');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Additional Scripts -->
|
||||
@stack('scripts')
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,165 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>@yield('title', $domainName ?? config('app.name', 'Laravel'))</title>
|
||||
|
||||
<!-- Domain-spezifisches Favicon -->
|
||||
<link rel="icon" href="{{ asset('img/favicons/' . $theme . '-favicon.ico') }}">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
|
||||
@if($theme === 'landing1')
|
||||
<link href="https://fonts.bunny.net/css?family=inter:400,500,600,700" rel="stylesheet" />
|
||||
@elseif($theme === 'landing2')
|
||||
<link href="https://fonts.bunny.net/css?family=poppins:400,500,600,700" rel="stylesheet" />
|
||||
@else
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600,700" rel="stylesheet" />
|
||||
@endif
|
||||
|
||||
<!-- Dynamisches CSS basierend auf Domain-Konfiguration -->
|
||||
@if($theme === 'landing1')
|
||||
@vite('resources/css/web/theme-landing1.css')
|
||||
@elseif($theme === 'landing2')
|
||||
@vite('resources/css/web/theme-landing2.css')
|
||||
@else
|
||||
@vite('resources/css/web/theme-main.css')
|
||||
@endif
|
||||
|
||||
@vite('resources/js/app.js')
|
||||
|
||||
<!-- Additional Styles -->
|
||||
@stack('styles')
|
||||
|
||||
<!-- Domain-spezifische Inline-Styles -->
|
||||
{{-- @if(isset($domainConfig['color_scheme']))
|
||||
<style>
|
||||
:root {
|
||||
@if(isset($domainConfig['color_scheme']['primary']))
|
||||
--primary-color: {{ $domainConfig['color_scheme']['primary'] }};
|
||||
@endif
|
||||
@if(isset($domainConfig['color_scheme']['accent']))
|
||||
--accent-color: {{ $domainConfig['color_scheme']['accent'] }};
|
||||
@endif
|
||||
}
|
||||
</style>
|
||||
@endif --}}
|
||||
</head>
|
||||
<body class="antialiased">
|
||||
<div class="min-h-screen bg-gray-100 dark:bg-gray-900 flex flex-col">
|
||||
<!-- Header -->
|
||||
<header class="bg-white dark:bg-gray-800 shadow">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex items-center">
|
||||
<a href="{{ url('/') }}" class="text-xl font-bold text-primary-800 dark:text-primary-200">
|
||||
{{ $domainName ?? config('app.name', 'Laravel') }}
|
||||
</a>
|
||||
|
||||
<nav class="ml-10 space-x-4">
|
||||
<a href="{{ url('/') }}" class="text-primary-600 hover:text-primary-900 dark:text-primary-300 dark:hover:text-primary-100">Home</a>
|
||||
<a href="{{ url('/welcome') }}" class="text-primary-600 hover:text-primary-900 dark:text-primary-300 dark:hover:text-primary-100">Welcome</a>
|
||||
<a href="https://portal.b2in.test" class="text-primary-600 hover:text-primary-900 dark:text-primary-300 dark:hover:text-primary-100">Portal</a>
|
||||
|
||||
<!-- Weitere Navigationspunkte hier -->
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
<!-- Theme-Switcher -->
|
||||
<button id="theme-toggle" type="button" class="text-accent-600 dark:text-accent-400 hover:text-accent-800 dark:hover:text-accent-200 rounded-lg text-sm p-2.5">
|
||||
<svg id="theme-toggle-dark-icon" class="hidden w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path></svg>
|
||||
<svg id="theme-toggle-light-icon" class="hidden w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
||||
</button>
|
||||
|
||||
@if(app()->environment('local'))
|
||||
<!-- Domain-Simulationsanzeige (nur in local) -->
|
||||
<div class="ml-4 text-xs px-2 py-1 rounded bg-accent-100 text-accent-800 dark:bg-accent-800 dark:text-accent-100">
|
||||
{{ $theme }} / {{ Request::getHost() }}
|
||||
@if(config('domains.dev_settings.simulate_domain'))
|
||||
<span class="inline-flex items-center ml-1 px-1.5 py-0.5 rounded-full text-xs bg-yellow-100 text-yellow-800">
|
||||
Simuliert
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Page Content -->
|
||||
<main class="flex-grow py-10">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
@yield('content')
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="bg-white dark:bg-gray-800 shadow py-6">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between">
|
||||
<div>
|
||||
<p class="text-gray-500 dark:text-gray-400">
|
||||
© {{ date('Y') }} {{ $domainName ?? config('app.name', 'Laravel') }}. Alle Rechte vorbehalten.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<!-- Footer-Links -->
|
||||
<div class="flex space-x-4">
|
||||
<a href="#" class="text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">Impressum</a>
|
||||
<a href="#" class="text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300">Datenschutz</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Dark Mode Toggle Script -->
|
||||
<script>
|
||||
const themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon');
|
||||
const themeToggleLightIcon = document.getElementById('theme-toggle-light-icon');
|
||||
|
||||
// Set initial icon state
|
||||
if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||
themeToggleLightIcon.classList.remove('hidden');
|
||||
document.documentElement.classList.add('dark');
|
||||
} else {
|
||||
themeToggleDarkIcon.classList.remove('hidden');
|
||||
document.documentElement.classList.remove('dark');
|
||||
}
|
||||
|
||||
// Toggle theme
|
||||
document.getElementById('theme-toggle').addEventListener('click', function() {
|
||||
themeToggleDarkIcon.classList.toggle('hidden');
|
||||
themeToggleLightIcon.classList.toggle('hidden');
|
||||
|
||||
if (localStorage.getItem('color-theme')) {
|
||||
if (localStorage.getItem('color-theme') === 'light') {
|
||||
document.documentElement.classList.add('dark');
|
||||
localStorage.setItem('color-theme', 'dark');
|
||||
} else {
|
||||
document.documentElement.classList.remove('dark');
|
||||
localStorage.setItem('color-theme', 'light');
|
||||
}
|
||||
} else {
|
||||
if (document.documentElement.classList.contains('dark')) {
|
||||
document.documentElement.classList.remove('dark');
|
||||
localStorage.setItem('color-theme', 'light');
|
||||
} else {
|
||||
document.documentElement.classList.add('dark');
|
||||
localStorage.setItem('color-theme', 'dark');
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- Additional Scripts -->
|
||||
@stack('scripts')
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -2,10 +2,11 @@
|
|||
|
||||
use App\Models\CmsBrand;
|
||||
use App\Models\CmsReference;
|
||||
use App\Models\Setting;
|
||||
use Flux\Flux;
|
||||
use FluxCms\Core\Models\CmsMedia;
|
||||
|
||||
use function Livewire\Volt\{computed, layout, on, state, title};
|
||||
use function Livewire\Volt\{computed, layout, on, state, title, updated};
|
||||
|
||||
layout('components.layouts.app');
|
||||
title('Referenzen verwalten');
|
||||
|
|
@ -24,8 +25,22 @@ state([
|
|||
'brandSlugs' => [],
|
||||
'is_published' => true,
|
||||
'order' => 0,
|
||||
'pageEnabled' => fn () => references_page_enabled(),
|
||||
]);
|
||||
|
||||
// Seite /referenzen samt Menüpunkt ein- oder ausblenden (Einstellung pages.referenzen_enabled).
|
||||
updated(['pageEnabled' => function (bool $value) {
|
||||
Setting::query()->updateOrCreate(
|
||||
['group' => 'pages', 'key' => 'referenzen_enabled'],
|
||||
['value' => $value ? '1' : '0', 'type' => 'boolean', 'description' => 'Seite /referenzen und Menüpunkt „Referenzen“ anzeigen'],
|
||||
);
|
||||
|
||||
Flux::toast(
|
||||
heading: $value ? 'Referenzen sichtbar' : 'Referenzen ausgeblendet',
|
||||
text: $value ? 'Die Seite /referenzen und der Menüpunkt sind online.' : 'Die Seite /referenzen und der Menüpunkt sind offline.',
|
||||
);
|
||||
}]);
|
||||
|
||||
on(['media-selected' => function ($mediaId, $url, $field) {
|
||||
$media = $mediaId ? CmsMedia::find($mediaId) : null;
|
||||
|
||||
|
|
@ -201,6 +216,11 @@ $cancelForm = function () {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<flux:card class="mb-6">
|
||||
<flux:switch wire:model.live="pageEnabled" label="Seite „Referenzen“ auf der Website anzeigen"
|
||||
description="Ausgeschaltet verschwindet der Menüpunkt, die Seite /referenzen ist nicht mehr erreichbar und der Button „Referenzen“ unter dem Showroom-Feed entfällt. Die gepflegten Referenzen bleiben erhalten." />
|
||||
</flux:card>
|
||||
|
||||
<div class="mb-4">
|
||||
<flux:input wire:model.live.debounce.300ms="search" placeholder="Referenz suchen..." icon="magnifying-glass"
|
||||
size="sm" class="w-64" />
|
||||
|
|
|
|||
|
|
@ -1,719 +0,0 @@
|
|||
<?php
|
||||
|
||||
use App\Models\Partner;
|
||||
use App\Models\Brand;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\Models\RegistrationCode;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Attributes\Layout;
|
||||
use Livewire\Attributes\Title;
|
||||
use Livewire\WithFileUploads;
|
||||
use Livewire\Volt\Component;
|
||||
|
||||
new #[Layout('components.layouts.guest'), Title('Setup-Wizard')] class extends Component {
|
||||
use WithFileUploads;
|
||||
|
||||
public Partner $partner;
|
||||
public string $partnerType;
|
||||
public int $currentStep = 1;
|
||||
public int $totalSteps;
|
||||
public array $steps = [];
|
||||
|
||||
// Schritt 1: Stammdaten (alle Rollen)
|
||||
public string $companyName = '';
|
||||
public string $displayName = '';
|
||||
public string $salutation = '';
|
||||
public string $firstName = '';
|
||||
public string $lastName = '';
|
||||
public string $description = '';
|
||||
public string $street = '';
|
||||
public string $houseNumber = '';
|
||||
public string $zip = '';
|
||||
public string $city = '';
|
||||
public string $country = 'Deutschland';
|
||||
public string $phone = '';
|
||||
public string $website = '';
|
||||
public $logo = null;
|
||||
|
||||
// Schritt 2: Retailer - Liefergebiete
|
||||
public ?int $deliveryRadius = null;
|
||||
public ?int $assemblyRadius = null;
|
||||
|
||||
// Schritt 2: Manufacturer - Marke
|
||||
public string $brandName = '';
|
||||
public $brandLogo = null;
|
||||
public string $brandDescription = '';
|
||||
|
||||
public string $roleIcon = 'shield-check';
|
||||
public string $roleName = '-';
|
||||
protected ?RegistrationCode $registrationCode = null;
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
if (!$user->partner_id) {
|
||||
$this->redirect(route('dashboard'), navigate: true);
|
||||
return;
|
||||
}
|
||||
|
||||
$role = $user->roles->first();
|
||||
if ($role) {
|
||||
$this->roleIcon = $role->icon ?? 'shield-check';
|
||||
$this->roleName = $role->display_name ?? $role->name;
|
||||
}
|
||||
|
||||
$this->partner = Partner::with('users')->findOrFail($user->partner_id);
|
||||
$this->partnerType = $this->partner->type;
|
||||
|
||||
// Vorausfüllen: Partner-Daten
|
||||
$this->companyName = $this->partner->company_name ?? '';
|
||||
$this->displayName = $this->partner->display_name ?? '';
|
||||
$this->salutation = $this->partner->salutation ?? '';
|
||||
$this->firstName = $this->partner->first_name ?? '';
|
||||
$this->lastName = $this->partner->last_name ?? '';
|
||||
$this->description = $this->partner->description ?? '';
|
||||
$this->street = $this->partner->street ?? '';
|
||||
$this->houseNumber = $this->partner->house_number ?? '';
|
||||
$this->zip = $this->partner->zip ?? '';
|
||||
$this->city = $this->partner->city ?? '';
|
||||
$this->country = $this->partner->country ?? 'Deutschland';
|
||||
$this->phone = $this->partner->phone ?? '';
|
||||
$this->website = $this->partner->website ?? '';
|
||||
|
||||
// Namen aus User übernehmen, falls Partner-Felder leer sind
|
||||
if (empty($this->firstName) && empty($this->lastName)) {
|
||||
$nameParts = explode(' ', $user->name, 2);
|
||||
$this->firstName = $nameParts[0] ?? '';
|
||||
$this->lastName = $nameParts[1] ?? '';
|
||||
}
|
||||
// Definiere Schritte basierend auf Rolle
|
||||
$this->defineSteps();
|
||||
}
|
||||
|
||||
protected function defineSteps(): void
|
||||
{
|
||||
$normalizedType = strtolower(str_replace('-', '', $this->partnerType));
|
||||
|
||||
switch ($normalizedType) {
|
||||
case 'retailer':
|
||||
$this->steps = ['Stammdaten', 'Liefergebiete', 'Fertig'];
|
||||
$this->totalSteps = 3;
|
||||
break;
|
||||
case 'manufacturer':
|
||||
$this->steps = ['Stammdaten', 'Marke anlegen', 'Fertig'];
|
||||
$this->totalSteps = 3;
|
||||
break;
|
||||
case 'broker':
|
||||
case 'estateagent':
|
||||
$this->steps = ['Stammdaten', 'Fertig'];
|
||||
$this->totalSteps = 2;
|
||||
break;
|
||||
case 'customer':
|
||||
$this->steps = ['Stammdaten', 'Fertig'];
|
||||
$this->totalSteps = 2;
|
||||
break;
|
||||
default:
|
||||
$this->steps = ['Stammdaten', 'Fertig'];
|
||||
$this->totalSteps = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function saveStep1(): void
|
||||
{
|
||||
$normalizedType = strtolower(str_replace('-', '', $this->partnerType));
|
||||
$isCustomer = $normalizedType === 'customer';
|
||||
$isBroker = $normalizedType === 'broker' || $normalizedType === 'estateagent';
|
||||
$rules = [
|
||||
'salutation' => 'required|in:Herr,Frau,Divers',
|
||||
'firstName' => 'required|string|max:255',
|
||||
'lastName' => 'required|string|max:255',
|
||||
'street' => 'required|string|max:255',
|
||||
'houseNumber' => 'required|string|max:20',
|
||||
'zip' => 'required|string|max:10',
|
||||
'city' => 'required|string|max:255',
|
||||
'country' => 'required|string|max:255',
|
||||
'phone' => 'nullable|string|max:50',
|
||||
];
|
||||
|
||||
if (!$isCustomer) {
|
||||
$rules['companyName'] = 'required|string|max:255';
|
||||
$rules['description'] = 'nullable|string|max:1000';
|
||||
$rules['website'] = 'nullable|url|max:255';
|
||||
}
|
||||
|
||||
// Für Broker ist displayName Pflicht
|
||||
if ($isBroker) {
|
||||
$rules['displayName'] = 'required|string|max:255';
|
||||
}
|
||||
|
||||
$this->validate($rules, [
|
||||
'salutation.required' => __('Bitte wählen Sie eine Anrede.'),
|
||||
'firstName.required' => __('Bitte geben Sie einen Vornamen ein.'),
|
||||
'lastName.required' => __('Bitte geben Sie einen Nachnamen ein.'),
|
||||
'companyName.required' => __('Bitte geben Sie einen Firmennamen ein.'),
|
||||
'displayName.required' => __('Bitte geben Sie einen Anzeigenamen ein.'),
|
||||
'street.required' => __('Bitte geben Sie eine Straße ein.'),
|
||||
'houseNumber.required' => __('Bitte geben Sie eine Hausnummer ein.'),
|
||||
'zip.required' => __('Bitte geben Sie eine Postleitzahl ein.'),
|
||||
'city.required' => __('Bitte geben Sie eine Stadt ein.'),
|
||||
'country.required' => __('Bitte wählen Sie ein Land.'),
|
||||
'website.url' => __('Bitte geben Sie eine gültige URL ein.'),
|
||||
]);
|
||||
|
||||
// Update Partner
|
||||
$updateData = [
|
||||
'salutation' => $this->salutation,
|
||||
'first_name' => $this->firstName,
|
||||
'last_name' => $this->lastName,
|
||||
'street' => $this->street,
|
||||
'house_number' => $this->houseNumber,
|
||||
'zip' => $this->zip,
|
||||
'city' => $this->city,
|
||||
'country' => $this->country,
|
||||
'phone' => $this->phone,
|
||||
];
|
||||
|
||||
if (!$isCustomer) {
|
||||
$updateData['company_name'] = $this->companyName;
|
||||
$updateData['description'] = $this->description;
|
||||
$updateData['website'] = $this->website;
|
||||
}
|
||||
|
||||
if ($isBroker) {
|
||||
$updateData['display_name'] = $this->displayName;
|
||||
}
|
||||
|
||||
$this->partner->update($updateData);
|
||||
|
||||
// Für Broker und Kunden: Direkt zum Erfolg
|
||||
if ($isBroker || $isCustomer) {
|
||||
$this->completeSetup();
|
||||
} else {
|
||||
$this->currentStep = 2;
|
||||
}
|
||||
}
|
||||
|
||||
public function saveStep2Retailer(): void
|
||||
{
|
||||
$this->validate(
|
||||
[
|
||||
'deliveryRadius' => 'required|integer|min:1|max:500',
|
||||
'assemblyRadius' => 'required|integer|min:1|max:500',
|
||||
],
|
||||
[
|
||||
'deliveryRadius.required' => __('Bitte geben Sie einen Lieferradius ein.'),
|
||||
'deliveryRadius.min' => __('Der Lieferradius muss mindestens 1 km betragen.'),
|
||||
'assemblyRadius.required' => __('Bitte geben Sie einen Montageradius ein.'),
|
||||
'assemblyRadius.min' => __('Der Montageradius muss mindestens 1 km betragen.'),
|
||||
],
|
||||
);
|
||||
|
||||
$this->partner->update([
|
||||
'delivery_radius_km' => $this->deliveryRadius,
|
||||
'assembly_radius_km' => $this->assemblyRadius,
|
||||
]);
|
||||
|
||||
$this->completeSetup();
|
||||
}
|
||||
|
||||
public function saveStep2Manufacturer(): void
|
||||
{
|
||||
$this->validate(
|
||||
[
|
||||
'brandName' => 'required|string|max:255',
|
||||
'brandDescription' => 'nullable|string|max:1000',
|
||||
'brandLogo' => 'nullable|image|mimes:jpeg,png,jpg,webp|max:2048',
|
||||
],
|
||||
[
|
||||
'brandName.required' => __('Bitte geben Sie einen Markennamen ein.'),
|
||||
'brandLogo.image' => __('Das Marken-Logo muss eine Bilddatei sein.'),
|
||||
'brandLogo.mimes' => __('Das Marken-Logo muss im Format JPG, PNG oder WebP sein.'),
|
||||
'brandLogo.max' => __('Das Marken-Logo darf maximal 2 MB groß sein.'),
|
||||
],
|
||||
);
|
||||
|
||||
// Speichere Brand-Logo falls hochgeladen
|
||||
$brandLogoPath = null;
|
||||
if ($this->brandLogo) {
|
||||
$brandLogoPath = $this->brandLogo->store('brand-logos', 'public');
|
||||
}
|
||||
|
||||
// Erstelle Brand
|
||||
Brand::create([
|
||||
'partner_id' => $this->partner->id,
|
||||
'name' => $this->brandName,
|
||||
'slug' => Str::slug($this->brandName),
|
||||
'description' => $this->brandDescription,
|
||||
'logo_url' => $brandLogoPath,
|
||||
'is_active' => true,
|
||||
]);
|
||||
|
||||
$this->completeSetup();
|
||||
}
|
||||
|
||||
|
||||
protected function completeSetup(): void
|
||||
{
|
||||
$this->partner->update([
|
||||
'is_active' => true,
|
||||
'setup_completed' => true,
|
||||
'setup_completed_at' => now(),
|
||||
]);
|
||||
|
||||
// Markiere Registrierungscode als verbraucht, falls vorhanden
|
||||
if ($this->registrationCode && $this->registrationCode->isAvailable()) {
|
||||
$this->registrationCode->markUsed(Auth::user());
|
||||
session()->forget(['registration_code_id', 'registration_role']);
|
||||
}
|
||||
|
||||
$this->currentStep = $this->totalSteps;
|
||||
}
|
||||
|
||||
public function goToDashboard(): void
|
||||
{
|
||||
$this->redirect(route('dashboard'), navigate: true);
|
||||
}
|
||||
|
||||
public function handleLogout(): void
|
||||
{
|
||||
|
||||
Auth::guard('web')->logout();
|
||||
|
||||
session()->invalidate();
|
||||
session()->regenerateToken();
|
||||
|
||||
$this->redirect(route('home'), navigate: false);
|
||||
}
|
||||
|
||||
protected function loadRegistrationCode(): void
|
||||
{
|
||||
$codeId = session('registration_code_id');
|
||||
$role = session('registration_role');
|
||||
|
||||
if (!$codeId || !$role) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->registrationCode = RegistrationCode::where('id', $codeId)
|
||||
->where('role', $role)
|
||||
->first();
|
||||
|
||||
if (!$this->registrationCode || !$this->registrationCode->isAvailable()) {
|
||||
// Ungültig/verbraucht -> Session aufräumen
|
||||
session()->forget(['registration_code_id', 'registration_role']);
|
||||
$this->registrationCode = null;
|
||||
}
|
||||
}
|
||||
}; ?>
|
||||
|
||||
{{-- Konfetti Script laden --}}
|
||||
<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.6.0/dist/confetti.browser.min.js"></script>
|
||||
|
||||
<div class="w-full max-w-3xl">
|
||||
{{-- Header --}}
|
||||
<div class="text-center mb-8">
|
||||
@include('partials.logo-head')
|
||||
<h1 class="text-3xl font-bold text-zinc-900 dark:text-white mb-2">
|
||||
{{ __('Vervollständigen Sie Ihr Profil') }}
|
||||
</h1>
|
||||
|
||||
</div>
|
||||
|
||||
{{-- Progress Indicator --}}
|
||||
<x-wizard-progress :currentStep="$currentStep" :totalSteps="$totalSteps" :steps="$steps" />
|
||||
|
||||
{{-- Wizard Content --}}
|
||||
<flux:card class="shadow-2xl">
|
||||
{{-- Step 1: Stammdaten (für alle Rollen) --}}
|
||||
@if ($currentStep === 1)
|
||||
@php
|
||||
$isCustomer = strtolower(str_replace('-', '', $partnerType)) === 'customer';
|
||||
@endphp
|
||||
<form wire:submit.prevent="saveStep1" class="space-y-6">
|
||||
<div>
|
||||
<flux:heading size="lg" class="mb-2">
|
||||
<div class="flex items-center gap-2">
|
||||
@svg('heroicon-o-'.$roleIcon, 'w-5 h-5')
|
||||
{{ __('Ihre Stammdaten') }} / {{ $roleName }}
|
||||
</div>
|
||||
</flux:heading>
|
||||
<flux:subheading>
|
||||
{{ __('Diese Informationen helfen uns, Ihr Profil zu vervollständigen.') }}
|
||||
</flux:subheading>
|
||||
</div>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
{{-- Firmenname (nur für Nicht-Kunden) --}}
|
||||
@if (!$isCustomer)
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Firmenname') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="companyName" name="companyName" icon="building-office" placeholder="{{ __('z.B. Müller GmbH') }}" />
|
||||
@error('companyName')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
@php
|
||||
$isBroker = strtolower(str_replace('-', '', $partnerType)) === 'broker' || strtolower(str_replace('-', '', $partnerType)) === 'estateagent';
|
||||
@endphp
|
||||
|
||||
@if ($isBroker)
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Anzeigename') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:description>{{ __('Der Name, der Ihren Kunden angezeigt wird (kann vom Firmennamen abweichen)') }}</flux:description>
|
||||
<flux:input wire:model="displayName" name="displayName" icon="user" placeholder="{{ __('z.B. Max Schmidt oder Immobilien Schmidt') }}" />
|
||||
@error('displayName')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
@endif
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Kurzbeschreibung') }}</flux:label>
|
||||
<flux:textarea wire:model="description" name="description" rows="3" placeholder="{{ __('Ein kurzer Text über Ihr Unternehmen...') }}" />
|
||||
@error('description')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:separator />
|
||||
@endif
|
||||
|
||||
{{-- Persönliche Daten --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Anrede') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:select wire:model="salutation" name="salutation">
|
||||
<flux:select.option value="">{{ __('Bitte wählen') }}</flux:select.option>
|
||||
<flux:select.option value="Herr">{{ __('Herr') }}</flux:select.option>
|
||||
<flux:select.option value="Frau">{{ __('Frau') }}</flux:select.option>
|
||||
<flux:select.option value="Divers">{{ __('Divers') }}</flux:select.option>
|
||||
</flux:select>
|
||||
@error('salutation')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Vorname') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="firstName" name="firstName" icon="user" value="{{ $firstName }}" />
|
||||
@error('firstName')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Nachname') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="lastName" name="lastName" icon="user" value="{{ $lastName }}" />
|
||||
@error('lastName')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
</div>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
{{-- Adresse --}}
|
||||
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
|
||||
<flux:field class="md:col-span-3">
|
||||
<flux:label>{{ __('Straße') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="street" name="street" icon="map-pin" placeholder="{{ __('Musterstraße') }}" />
|
||||
@error('street')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Hausnummer') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="houseNumber" name="houseNumber" placeholder="{{ __('123a') }}" />
|
||||
@error('houseNumber')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Postleitzahl') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="zip" name="zip" icon="map" placeholder="{{ __('12345') }}" />
|
||||
@error('zip')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field class="md:col-span-2">
|
||||
<flux:label>{{ __('Ort') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="city" name="city" icon="building-office" placeholder="{{ __('Musterstadt') }}" />
|
||||
@error('city')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
</div>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Land') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:select wire:model="country" name="country">
|
||||
<flux:select.option value="Deutschland">{{ __('Deutschland') }}</flux:select.option>
|
||||
<flux:select.option value="Österreich">{{ __('Österreich') }}</flux:select.option>
|
||||
<flux:select.option value="Schweiz">{{ __('Schweiz') }}</flux:select.option>
|
||||
</flux:select>
|
||||
@error('country')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Telefon') }}</flux:label>
|
||||
<flux:input wire:model="phone" name="phone" type="tel" icon="phone" placeholder="{{ __('optional') }}" />
|
||||
@error('phone')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
@if (!$isCustomer)
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Website') }}</flux:label>
|
||||
<flux:input wire:model="website" name="website" type="url" icon="globe-alt" placeholder="https://..." />
|
||||
@error('website')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
@endif
|
||||
|
||||
<flux:separator />
|
||||
|
||||
<x-error-alert />
|
||||
|
||||
<div class="flex justify-end">
|
||||
@php
|
||||
$normalized = strtolower(str_replace('-', '', $partnerType));
|
||||
$isBrokerOrCustomer = $normalized === 'broker' || $normalized === 'estateagent' || $isCustomer;
|
||||
@endphp
|
||||
<flux:button type="submit" variant="primary" icon="{{ $isBrokerOrCustomer ? 'check-circle' : 'arrow-right' }}" class="cursor-pointer" wire:target="saveStep1">
|
||||
@if ($normalized === 'retailer')
|
||||
{{ __('Weiter zu Liefergebiete') }}
|
||||
@elseif($normalized === 'manufacturer')
|
||||
{{ __('Weiter zu Marke') }}
|
||||
@else
|
||||
{{ __('Setup abschließen') }}
|
||||
@endif
|
||||
</flux:button>
|
||||
</div>
|
||||
</form>
|
||||
@endif
|
||||
|
||||
{{-- Step 2: Retailer - Liefergebiete --}}
|
||||
@if ($currentStep === 2 && $partnerType === 'Retailer')
|
||||
<form wire:submit.prevent="saveStep2Retailer" class="space-y-6">
|
||||
<div>
|
||||
<flux:heading size="lg" class="mb-2">
|
||||
🚚 {{ __('Ihre Liefergebiete') }}
|
||||
</flux:heading>
|
||||
<flux:subheading>
|
||||
{{ __('Wie weit liefern und montieren Sie von Ihrer Adresse (:zip :city) aus?', ['zip' => $zip, 'city' => $city]) }}
|
||||
</flux:subheading>
|
||||
</div>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Lieferradius') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:description>{{ __('Ich liefere im Umkreis von ... km') }}</flux:description>
|
||||
<div class="flex items-center gap-4">
|
||||
<flux:input wire:model="deliveryRadius" name="deliveryRadius" type="number" min="1" max="500"
|
||||
class="flex-1" />
|
||||
<span class="text-sm text-zinc-600 dark:text-zinc-400">km</span>
|
||||
</div>
|
||||
@error('deliveryRadius')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Montageradius') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:description>{{ __('Ich montiere im Umkreis von ... km') }}</flux:description>
|
||||
<div class="flex items-center gap-4">
|
||||
<flux:input wire:model="assemblyRadius" name="assemblyRadius" type="number" min="1" max="500"
|
||||
class="flex-1" />
|
||||
<span class="text-sm text-zinc-600 dark:text-zinc-400">km</span>
|
||||
</div>
|
||||
@error('assemblyRadius')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
<x-error-alert />
|
||||
|
||||
<div class="flex justify-end">
|
||||
<flux:button type="submit" variant="primary" icon="check-circle">
|
||||
{{ __('Setup abschließen') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</form>
|
||||
@endif
|
||||
|
||||
{{-- Step 2: Manufacturer - Marke anlegen --}}
|
||||
@if ($currentStep === 2 && $partnerType === 'Manufacturer')
|
||||
<form wire:submit.prevent="saveStep2Manufacturer" class="space-y-6">
|
||||
<div>
|
||||
<flux:heading size="lg" class="mb-2">
|
||||
™️ {{ __('Ihre Marke') }}
|
||||
</flux:heading>
|
||||
<flux:subheading>
|
||||
{{ __('Unter dieser Marke werden Ihre Produkte auf B2in gelistet. (Sie können später weitere Marken hinzufügen)') }}
|
||||
</flux:subheading>
|
||||
</div>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Markenname') }} <span class="text-red-500">*</span></flux:label>
|
||||
<flux:input wire:model="brandName" name="brandName" icon="tag"
|
||||
placeholder="{{ __('z.B. Möbelwerke Premium') }}" />
|
||||
@error('brandName')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Marken-Logo (optional)') }}</flux:label>
|
||||
<flux:description>{{ __('Laden Sie Ihr Marken-Logo hoch (max. 2 MB, JPG/PNG)') }}</flux:description>
|
||||
|
||||
<div class="space-y-2">
|
||||
<input type="file" wire:model.live="brandLogo" name="brandLogo" accept="image/jpeg,image/png,image/jpg,image/webp"
|
||||
class="block w-full text-sm text-zinc-500 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-accent-50 file:text-accent-700 hover:file:bg-accent-100 dark:text-zinc-400 dark:file:bg-accent-900/20 dark:file:text-accent-400" />
|
||||
|
||||
@error('brandLogo')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
|
||||
<div wire:loading wire:target="brandLogo" class="text-sm text-accent-600 dark:text-accent-400">
|
||||
<flux:icon.arrow-path class="inline-block h-4 w-4 animate-spin mr-2" />
|
||||
{{ __('Wird hochgeladen...') }}
|
||||
</div>
|
||||
|
||||
@if ($brandLogo)
|
||||
<div wire:loading.remove wire:target="brandLogo">
|
||||
@try
|
||||
<div class="p-2 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg">
|
||||
<div class="flex items-center gap-3">
|
||||
<img src="{{ $brandLogo->temporaryUrl() }}"
|
||||
class="h-16 w-16 object-contain rounded border" alt="Brand Logo Preview">
|
||||
<div class="flex-1">
|
||||
<p class="text-sm font-medium text-green-800 dark:text-green-200">{{ __('Logo erfolgreich hochgeladen') }}</p>
|
||||
<p class="text-xs text-green-600 dark:text-green-400">{{ $brandLogo->getClientOriginalName() }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@catch(\Exception $e)
|
||||
<div class="p-2 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg">
|
||||
<p class="text-sm text-red-800 dark:text-red-200">{{ __('Fehler beim Laden der Vorschau') }}</p>
|
||||
</div>
|
||||
@endtry
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</flux:field>
|
||||
|
||||
<flux:field>
|
||||
<flux:label>{{ __('Marken-Beschreibung') }}</flux:label>
|
||||
<flux:textarea wire:model="brandDescription" name="brandDescription" rows="4"
|
||||
placeholder="{{ __('Ein kurzer Text über Ihre Marke...') }}" />
|
||||
@error('brandDescription')
|
||||
<flux:error>{{ $message }}</flux:error>
|
||||
@enderror
|
||||
</flux:field>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
<x-error-alert />
|
||||
|
||||
<div class="flex justify-end">
|
||||
<flux:button type="submit" variant="primary" icon="check-circle">
|
||||
{{ __('Setup abschließen') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
</form>
|
||||
@endif
|
||||
|
||||
{{-- Final Step: Fertig! --}}
|
||||
@if ($currentStep === $totalSteps)
|
||||
<div class="text-center space-y-6 py-8" x-data x-init="
|
||||
// Konfetti-Effekt
|
||||
const duration = 3 * 1000;
|
||||
const end = Date.now() + duration;
|
||||
|
||||
(function frame() {
|
||||
confetti({
|
||||
particleCount: 5,
|
||||
angle: 60,
|
||||
spread: 55,
|
||||
origin: { x: 0 },
|
||||
colors: ['#10b981', '#3b82f6', '#f59e0b', '#ef4444', '#8b5cf6']
|
||||
});
|
||||
confetti({
|
||||
particleCount: 5,
|
||||
angle: 120,
|
||||
spread: 55,
|
||||
origin: { x: 1 },
|
||||
colors: ['#10b981', '#3b82f6', '#f59e0b', '#ef4444', '#8b5cf6']
|
||||
});
|
||||
|
||||
if (Date.now() < end) {
|
||||
requestAnimationFrame(frame);
|
||||
}
|
||||
}());
|
||||
">
|
||||
<div class="flex justify-center">
|
||||
<div
|
||||
class="flex items-center justify-center w-20 h-20 rounded-full bg-green-100 dark:bg-green-900/20 animate-bounce">
|
||||
<flux:icon.check-circle class="h-12 w-12 text-green-600 dark:text-green-400" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<flux:heading size="xl" class="mb-2">
|
||||
✅ {{ __('Einrichtung abgeschlossen!') }}
|
||||
</flux:heading>
|
||||
<flux:subheading>
|
||||
@if ($partnerType === 'Retailer')
|
||||
{{ __('Sie sind nun ein aktiver Händler. Sie können jetzt Ihr Sortiment pflegen.') }}
|
||||
@elseif($partnerType === 'Manufacturer')
|
||||
{{ __('Sie sind nun ein aktiver Hersteller. Sie können jetzt Ihre Produkte anlegen.') }}
|
||||
@else
|
||||
{{ __('Ihr Profil ist aktiv. In Ihrem Dashboard finden Sie Ihre persönlichen Einladungslinks.') }}
|
||||
@endif
|
||||
</flux:subheading>
|
||||
</div>
|
||||
|
||||
<flux:separator />
|
||||
|
||||
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
|
||||
<button type="button" wire:click="goToDashboard"
|
||||
class="inline-flex items-center justify-center gap-2 px-6 py-3 text-base font-semibold text-white bg-accent-600 hover:bg-accent-700 dark:bg-accent-500 dark:hover:bg-accent-600 rounded-lg transition-colors">
|
||||
@svg('heroicon-o-home', 'w-5 h-5')
|
||||
{{ __('Zum Dashboard') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</flux:card>
|
||||
|
||||
<div class="mt-4 text-center">
|
||||
<form method="POST" action="{{ route('auth.logout') }}" class="inline">
|
||||
@csrf
|
||||
<button type="submit"
|
||||
class="inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-zinc-700 dark:text-zinc-300 hover:text-zinc-900 dark:hover:text-white transition-colors cursor-pointer rounded-lg">
|
||||
@svg('heroicon-o-arrow-left-start-on-rectangle', 'w-5 h-5')
|
||||
{{ __('Logout') }}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,7 +1,8 @@
|
|||
<section id="seitenkopf" class="section-padding flex items-center relative border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-[hsl(var(--hero-container))] rounded-[20px] w-[95%]">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 lg:py-12 bg-hero-container hero-frame rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8 slide-right delay-200">
|
||||
<x-web.hero-eyebrow :text="$content['eyebrow'] ?? null" />
|
||||
<h1 class="text-hero">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
|
|
@ -20,7 +21,7 @@
|
|||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated slide-left delay-300">
|
||||
<div class="relative rounded-3xl overflow-hidden border border-white! shadow-elevated slide-left delay-300">
|
||||
<img src="{{ theme_image_url($content['image']) }}"
|
||||
alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-[600px] object-cover" />
|
||||
|
|
|
|||
|
|
@ -1,146 +0,0 @@
|
|||
<section class="section-padding {{ $bg }}" id="{{ $content['id'] }}">
|
||||
<div class="container-padding">
|
||||
@if(isset($content['title']))
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
{{ $content['title'] }}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-3xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="grid lg:grid-cols-12 gap-16">
|
||||
@if ($layout === 'right')
|
||||
{{-- Layout Right: Bild zuerst, dann Text --}}
|
||||
{{-- Bild --}}
|
||||
<div class="space-y-8 col-span-8 lg:col-span-4 order-2 lg:order-1">
|
||||
<div class="relative h-full">
|
||||
<div class="sticky top-8">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated slide-right delay-300">
|
||||
@if(isset($content['image']))
|
||||
<img src="{{ theme_image_url($content['image']) }}"
|
||||
alt="{{ $content['image_alt'] ?? 'Benefits Image' }}"
|
||||
class="w-full h-[400px] md:h-[500px] lg:h-[600px] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="bg-secondary/5 rounded-xl p-6 mt-6">
|
||||
<div class="text-center">
|
||||
<div class="text-3xl font-bold text-secondary mb-2">{{ $content['highlight']['value'] }}</div>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
{{ $content['highlight']['text'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Text --}}
|
||||
<div class="space-y-8 col-span-8 order-1 lg:order-2">
|
||||
<div class="text-center lg:text-left slide-left delay-400">
|
||||
<div
|
||||
class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-md font-medium mb-6">
|
||||
@svg('heroicon-o-'.$content['tag_icon'], 'w-4 h-4')
|
||||
{{ $content['tag'] }}
|
||||
</div>
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
{!! $content['tag_title'] !!}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach ($content['features'] as $index => $feature)
|
||||
<div class="card-elevated p-6 rounded-xl slide-left delay-{{ 500 + ($index * 100) }}">
|
||||
<div class="flex gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center">
|
||||
@if (isset($feature['icon']))
|
||||
@svg('heroicon-o-'.$feature['icon'], 'w-6 h-6 text-secondary')
|
||||
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $feature['title'] }}
|
||||
</h4>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $feature['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
{{-- Layout Left (Standard): Text zuerst, dann Bild --}}
|
||||
{{-- Text --}}
|
||||
<div class="space-y-8 col-span-8 order-1 lg:order-1">
|
||||
<div class="text-center lg:text-left slide-right delay-300">
|
||||
<div
|
||||
class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-md font-medium mb-6">
|
||||
@svg('heroicon-o-'.$content['tag_icon'], 'w-4 h-4')
|
||||
{{ $content['tag'] }}
|
||||
</div>
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
{!! $content['tag_title'] !!}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach ($content['features'] as $index => $feature)
|
||||
<div class="card-elevated p-6 rounded-xl slide-right delay-{{ 400 + ($index * 100) }}">
|
||||
<div class="flex gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center">
|
||||
@if (isset($feature['icon']))
|
||||
@svg('heroicon-o-'.$feature['icon'], 'w-6 h-6 text-secondary')
|
||||
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $feature['title'] }}
|
||||
</h4>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $feature['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Bild --}}
|
||||
<div class="space-y-8 col-span-8 lg:col-span-4 order-2 lg:order-2">
|
||||
<div class="relative h-full">
|
||||
<div class="sticky top-8">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated slide-left delay-300">
|
||||
@if(isset($content['image']))
|
||||
<img src="{{ theme_image_url($content['image']) }}"
|
||||
alt="{{ $content['image_alt'] ?? 'Benefits Image' }}"
|
||||
class="w-full h-[400px] md:h-[500px] lg:h-[600px] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="bg-secondary/5 rounded-xl p-6 mt-6">
|
||||
<div class="text-center">
|
||||
<div class="text-3xl font-bold text-secondary mb-2">{{ $content['highlight']['value'] }}</div>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
{{ $content['highlight']['text'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
<section class="section-padding bg-background">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="relative order-2 lg:order-1">
|
||||
<div class="card-elevated rounded-3xl p-12">
|
||||
<div class="text-center mb-8">
|
||||
<div class="w-20 h-20 mx-auto rounded-full bg-gradient-to-br from-secondary to-secondary/60 flex items-center justify-center mb-6">
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"/>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-2xl font-semibold text-foreground mb-4">
|
||||
{{ $content['card_title'] }}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
<div class="bg-accent/30 rounded-xl p-6">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-sm text-muted-foreground">Erstverkauf</span>
|
||||
<span class="text-lg font-semibold text-secondary">{{ $content['compensation']['initial_sale'] }}</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-secondary h-2 rounded-full w-[35%]"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-accent/30 rounded-xl p-6">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-sm text-muted-foreground">Folgegeschäfte</span>
|
||||
<span class="text-lg font-semibold text-secondary">{{ $content['compensation']['follow_up'] }}</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-secondary h-2 rounded-full w-[15%]"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center pt-4">
|
||||
<p class="text-sm text-muted-foreground">
|
||||
{{ $content['compensation_text'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-8 order-1 lg:order-2">
|
||||
<div>
|
||||
<div class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"/>
|
||||
</svg>
|
||||
Für Makler
|
||||
</div>
|
||||
|
||||
<h2 class="text-section-title mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
|
||||
<p class="text-large text-muted-foreground leading-relaxed">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach($content['benefits'] as $benefit)
|
||||
<div class="flex gap-4">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center">
|
||||
@if($benefit['icon'] === 'trending-up')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'clock')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'target')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 1.657-2.657 1.657-2.657A8 8 0 0118.657 17.657zM12 12l1 1"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h3>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
<section class="section-padding {{ $bg }}">
|
||||
<div class="container-padding">
|
||||
{{-- Section Title --}}
|
||||
<div class="text-center mb-16 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $content['title'] !!}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-3xl mx-auto">
|
||||
{!! $content['subtitle'] !!}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{{-- Brand Cards --}}
|
||||
<div class="grid md:grid-cols-2 gap-8">
|
||||
@foreach ($content['cards'] as $index => $card)
|
||||
<div class="card-elevated overflow-hidden group hover:shadow-elevated transition-all duration-300 flex flex-col slide-up delay-{{ $index * 200 }}">
|
||||
|
||||
@if(isset($card['image']))
|
||||
<div class="relative">
|
||||
<img src="{{ theme_image_url($card['image']) }}" alt="{{ $card['title'] }}"
|
||||
class="w-full h-64 object-cover group-hover:scale-105 transition-transform duration-500" />
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(isset($card['icon']))
|
||||
<div class="relative pt-12 pb-8">
|
||||
<div class="mx-auto w-20 h-20 icon-secondary-linear glow-soft group-hover:glow-medium rounded-2xl flex items-center justify-center transition-colors duration-300">
|
||||
@svg('heroicon-o-'.$card['icon'], 'w-10 h-10 text-secondary-foreground')
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="p-6 spacing-small flex flex-col justify-between flex-grow">
|
||||
<div class="mb-4">
|
||||
@if (isset($card['logo']))
|
||||
<img src="{{ asset($card['logo']) }}" alt="{{ $card['title'] }}"
|
||||
class="{{ $card['logo_width'] }} h-18 object-contain" />
|
||||
@endif
|
||||
@if(isset($card['title']))
|
||||
<h3 class="text-xl font-medium text-center">{{ $card['title'] }}</h3>
|
||||
@endif
|
||||
@if(isset($card['description']))
|
||||
<p class="text-muted-foreground leading-relaxed mt-2 text-center">
|
||||
{{ $card['description'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if(isset($card['button']))
|
||||
<div class="flex flex-col sm:flex-row gap-4 slide-right delay-300 mx-auto pt-4">
|
||||
<a href="{{ $card['button'] }}" class="btn-primary-accent">
|
||||
{{ $card['button_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
@if(isset($card['link']))
|
||||
<a href="{{ $card['link'] }}"
|
||||
class="inline-flex items-center gap-2 text-secondary font-medium hover:gap-3 transition-all duration-300">
|
||||
{{ __('ui.learn_more') }}
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7">
|
||||
</path>
|
||||
</svg>
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
<section class="section-padding text-center">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16 slide-up delay-300">
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-2xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
@foreach($content['testimonials'] as $index => $testimonial)
|
||||
<div class="card-elevated rounded-2xl p-8 text-left space-y-6 slide-up delay-{{ $index * 200 }}">
|
||||
<div class="flex items-center gap-4">
|
||||
<img src="{{ theme_image_url($testimonial['image']) }}" alt="{{ $testimonial['author'] }}" class="w-16 h-16 rounded-full object-cover">
|
||||
<div>
|
||||
<h4 class="font-bold text-foreground">{{ $testimonial['author'] }}</h4>
|
||||
<p class="text-sm text-muted-foreground">{{ $testimonial['author_title'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
@for ($i = 0; $i < 5; $i++)
|
||||
<svg class="w-5 h-5 {{ $i < $testimonial['rating'] ? 'text-secondary' : 'text-muted/20' }}" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
|
||||
</svg>
|
||||
@endfor
|
||||
</div>
|
||||
<blockquote class="text-muted-foreground italic leading-relaxed">
|
||||
"{{ $testimonial['quote'] }}"
|
||||
</blockquote>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-12">
|
||||
<div class="grid grid-cols-2 gap-8">
|
||||
@foreach($content['stats'] as $stat)
|
||||
<div>
|
||||
<div class="text-6xl font-light text-foreground mb-2">{{ $stat['number'] }}</div>
|
||||
<p class="text-muted-foreground text-sm">{{ $stat['text'] }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
<h3 class="text-section-title">
|
||||
{!! $content['title'] !!}
|
||||
</h3>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $content['description'] }}
|
||||
</p>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 pt-8">
|
||||
@foreach($content['features'] as $feature)
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-8 h-8 bg-secondary rounded-full flex items-center justify-center">
|
||||
<span class="text-primary text-sm">✓</span>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-foreground font-medium text-sm">{{ $feature['title'] }}</p>
|
||||
<p class="text-muted-foreground text-xs">{{ $feature['subtitle'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated bg-muted p-0 overflow-hidden rounded-3xl">
|
||||
<img src="{{ theme_image_url($content['image']) }}" alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-96 object-cover" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
<section class="section-padding bg-background">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16 slide-up delay-300">
|
||||
<h2 class="text-section-title mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-3xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
@foreach($content['features'] as $index => $feature)
|
||||
<div class="group h-full {{ $index === 4 ? 'md:col-span-2 lg:col-span-1 lg:col-start-2' : '' }}">
|
||||
<div class="card-elevated p-8 overflow-hidden group hover:shadow-elevated transition-all duration-300 flex flex-col h-full slide-up delay-{{ $index * 200 }}">
|
||||
<div class="text-center space-y-6">
|
||||
<div class="mx-auto w-16 h-16 icon-secondary-linear glow-soft group-hover:glow-medium rounded-2xl flex items-center justify-center transition-colors duration-300">
|
||||
@if($feature['icon'])
|
||||
@svg('heroicon-o-'.$feature['icon'], 'w-8 h-8 text-secondary-foreground')
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<h3 class="text-xl font-semibold text-foreground">
|
||||
{{ $feature['title'] }}
|
||||
</h3>
|
||||
|
||||
<div class="w-12 h-px bg-secondary mx-auto"></div>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $feature['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-secondary/20 via-secondary to-secondary/20 transform scale-x-0 group-hover:scale-x-100 transition-transform duration-300"></div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,10 +1,27 @@
|
|||
{{-- Livewire braucht ein Wurzelelement. Solange kein Display veröffentlicht ist, bleibt es leer –
|
||||
lieber gar keine Sektion als ein Rahmen mit ewigem Ladebalken. --}}
|
||||
lieber gar keine Sektion als ein Rahmen mit ewigem Ladebalken.
|
||||
Seit 07.10.2026 in einer weißen Box; „Größer ansehen“ öffnet das Display in einem Overlay über
|
||||
die volle Fensterhöhe, dort lässt es sich (wo der Browser es kann) in den Vollbildmodus schalten.
|
||||
Das große Display lädt erst beim Öffnen, damit nicht zwei Player parallel laufen. --}}
|
||||
<div id="displays">
|
||||
@if ($displayId !== null)
|
||||
<section class="section-padding {{ $bg }}">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
|
||||
<div class="grid items-center gap-10 rounded-3xl border border-border/60 bg-white p-6 shadow-[0_24px_60px_-28px_rgba(0,0,0,0.3)] sm:p-10 lg:grid-cols-2 lg:gap-16 lg:p-14"
|
||||
data-display-box
|
||||
x-data="{
|
||||
open: false,
|
||||
canFullscreen: document.fullscreenEnabled === true,
|
||||
show() { this.open = true; document.body.classList.add('overflow-hidden'); this.$nextTick(() => this.$refs.close?.focus()); },
|
||||
hide() {
|
||||
if (document.fullscreenElement) { document.exitFullscreen(); }
|
||||
this.open = false;
|
||||
document.body.classList.remove('overflow-hidden');
|
||||
this.$nextTick(() => this.$refs.trigger?.focus());
|
||||
},
|
||||
fullscreen() { this.$refs.stage?.requestFullscreen?.(); },
|
||||
}"
|
||||
x-on:keydown.escape.window="open && hide()">
|
||||
<div>
|
||||
<h2 class="text-section-title">{!! $content['title'] ?? '' !!}</h2>
|
||||
<p class="text-large text-muted-foreground leading-relaxed mt-6">{{ $content['text'] ?? '' }}</p>
|
||||
|
|
@ -22,14 +39,47 @@
|
|||
</div>
|
||||
|
||||
{{-- 9:16 wie das physische Display im Showroom --}}
|
||||
<div class="flex justify-center">
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<div class="w-full max-w-[320px] aspect-[9/16] overflow-hidden rounded-2xl shadow-elevated bg-black">
|
||||
<iframe src="{{ route('display.embed', ['display' => $displayId]) }}"
|
||||
title="{{ $content['iframe_title'] ?? __('ui.display_feed_title') }}"
|
||||
loading="lazy" scrolling="no"
|
||||
class="h-full w-full border-0"></iframe>
|
||||
</div>
|
||||
<button type="button" x-ref="trigger" x-on:click="show()" data-display-enlarge
|
||||
class="inline-flex items-center gap-2 rounded-full border border-border/70 bg-white px-5 py-2.5 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground">
|
||||
@svg('heroicon-o-arrows-pointing-out', 'h-5 w-5 text-secondary')
|
||||
{{ __('ui.display_feed_enlarge') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{-- Overlay: Display über die volle Fensterhöhe im Format 9:16 --}}
|
||||
<template x-teleport="body">
|
||||
<div x-show="open" x-cloak x-transition.opacity
|
||||
class="fixed inset-0 z-50 flex flex-col items-center justify-center gap-4 bg-black/90 p-4"
|
||||
role="dialog" aria-modal="true" aria-label="{{ $content['iframe_title'] ?? __('ui.display_feed_title') }}"
|
||||
x-on:click.self="hide()">
|
||||
<div class="flex items-center gap-3">
|
||||
<button type="button" x-show="canFullscreen" x-on:click="fullscreen()"
|
||||
class="inline-flex items-center gap-2 rounded-full bg-white/10 px-4 py-2 text-sm text-white transition-colors hover:bg-white/20">
|
||||
@svg('heroicon-o-arrows-pointing-out', 'h-5 w-5')
|
||||
{{ __('ui.display_feed_fullscreen') }}
|
||||
</button>
|
||||
<button type="button" x-ref="close" x-on:click="hide()"
|
||||
class="inline-flex items-center gap-2 rounded-full bg-white/10 px-4 py-2 text-sm text-white transition-colors hover:bg-white/20">
|
||||
@svg('heroicon-o-x-mark', 'h-5 w-5')
|
||||
{{ __('ui.display_feed_close') }}
|
||||
</button>
|
||||
</div>
|
||||
<div x-ref="stage" class="aspect-[9/16] h-[calc(100dvh-6rem)] max-w-full overflow-hidden rounded-2xl bg-black">
|
||||
<template x-if="open">
|
||||
<iframe src="{{ route('display.embed', ['display' => $displayId]) }}"
|
||||
title="{{ $content['iframe_title'] ?? __('ui.display_feed_title') }}"
|
||||
scrolling="no" allow="fullscreen" class="h-full w-full border-0"></iframe>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,79 +0,0 @@
|
|||
<section class="section-padding flex items-center relative border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<h1 class="text-hero">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
|
||||
<p class="text-large text-muted-foreground leading-relaxed">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
|
||||
<div class="grid grid-cols-2 gap-6">
|
||||
@foreach ($content['features'] as $feature)
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-12 h-12 rounded-full bg-secondary/10 flex items-center justify-center">
|
||||
@if ($feature['icon'] === 'users')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13.5-9a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z" />
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'building-2')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'network')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.367 2.684 3 3 0 00-5.367-2.684z" />
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 10V3L4 14h7v7l9-11h-7z" />
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<p class="font-semibold text-foreground">{{ $feature['title'] }}</p>
|
||||
<p class="text-sm text-muted-foreground">{{ $feature['description'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['image']) }}"
|
||||
alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-[600px] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
|
||||
{{-- Floating info card --}}
|
||||
<div
|
||||
class="absolute bottom-6 left-6 bg-card/95 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-border/50">
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-24 h-24 mx-auto rounded-full bg-secondary flex items-center justify-center mb-4">
|
||||
<svg class="w-12 h-12 text-white" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-xl font-semibold text-foreground">{{ $content['hub']['title'] }}</h3>
|
||||
<p class="text-sm text-muted-foreground">{{ $content['hub']['subtitle'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
<section class="section-padding bg-background">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $content['title'] !!}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-3xl mx-auto">
|
||||
{!! $content['subtitle'] !!}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
@foreach ($content['stats'] as $index => $stat)
|
||||
|
||||
<div class="card-elevated p-8 text-center overflow-hidden group hover:shadow-elevated transition-all duration-300 flex flex-col slide-up delay-{{ $index * 200 }}">
|
||||
<h2 class="text-4xl lg:text-5xl font-bold text-secondary mb-4">
|
||||
{{ $stat['number'] }}
|
||||
</h2>
|
||||
<h3 class="text-xl lg:text-2xl font-semibold text-foreground mb-3">
|
||||
{{ $stat['label'] }}
|
||||
</h3>
|
||||
<p class="text-md text-muted-foreground leading-relaxed">
|
||||
{{ $stat['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
<section class="section-padding {{ $bg }}">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<div>
|
||||
<div class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/>
|
||||
</svg>
|
||||
{{ $content['tag'] }}
|
||||
</div>
|
||||
|
||||
<h2 class="text-section-title mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
|
||||
<p class="text-large text-muted-foreground leading-relaxed">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach($content['benefits'] as $benefit)
|
||||
<div class="flex gap-4">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center">
|
||||
@if($benefit['icon'] === 'credit-card')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'star')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'home')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h3>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="relative">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['image']) }}"
|
||||
alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-[600px] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
|
||||
{{-- Floating info card --}}
|
||||
<div
|
||||
class="absolute bottom-6 left-6 bg-card/95 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-border/50">
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-24 h-24 mx-auto rounded-full bg-secondary flex items-center justify-center mb-4">
|
||||
<svg class="w-12 h-12 text-white" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-xl font-semibold text-foreground">{{ $content['card_title'] }}</h3>
|
||||
<p class="text-sm text-muted-foreground">{{ $content['card_title'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
<section class="section-padding text-center">
|
||||
<div class="container-narrow">
|
||||
<h2 class="text-section-title text-foreground leading-tight mb-8">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
|
||||
<div class="flex justify-center mb-8">
|
||||
<div class="w-16 h-px bg-secondary"></div>
|
||||
</div>
|
||||
|
||||
<p class="text-large text-muted-foreground">
|
||||
{{ $content['author'] }} <br />
|
||||
<span class="text-sm">{{ $content['author_title'] }}</span>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
<section id="gruender" class="py-8 bg-background border-b border-border/30">
|
||||
<section id="gruender" class="py-8 {{ $bg }} border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex flex-col sm:flex-row items-center gap-6 sm:gap-8">
|
||||
@if(isset($content['image']))
|
||||
|
|
|
|||
|
|
@ -1,49 +0,0 @@
|
|||
<section class="section-padding relative">
|
||||
<div class="container-padding">
|
||||
{{-- Header Content --}}
|
||||
<div class="text-center mb-12 max-w-4xl mx-auto">
|
||||
<h1 class="text-hero mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-3xl mx-auto">
|
||||
{!! $content['subtitle'] !!}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{{-- CTA Buttons --}}
|
||||
@if(isset($content['cta1_text']) && isset($content['cta2_text']))
|
||||
<div class="flex flex-col sm:flex-row gap-4 justify-center mb-16">
|
||||
<a href="{{ $content['cta1_link'] }}" class="btn-primary-accent">
|
||||
{{ $content['cta1_text'] }}
|
||||
</a>
|
||||
<a href="{{ $content['cta2_link'] }}" class="btn-secondary-accent">
|
||||
{{ $content['cta2_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Full Width Hero Image --}}
|
||||
<div class="relative w-full">
|
||||
<div class="relative rounded-2xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['hero_image'] ?? $content['tiles'][0]['image']) }}"
|
||||
alt="{{ $content['hero_image_alt'] ?? $content['tiles'][0]['alt'] ?? '' }}"
|
||||
class="w-full h-64 md:h-80 lg:h-96 object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/30 via-black/10 to-transparent"></div>
|
||||
|
||||
{{-- Optional overlay content --}}
|
||||
@if(isset($content['stats']) && count($content['stats']) > 0)
|
||||
<div class="absolute bottom-0 left-0 right-0 p-8">
|
||||
<div class="flex items-center justify-center space-x-8 text-white/90 text-sm">
|
||||
@foreach ($content['stats'] as $stat)
|
||||
<span class="font-medium">{{ $stat }}</span>
|
||||
@if (!$loop->last)
|
||||
<span class="opacity-60">•</span>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,102 +1,141 @@
|
|||
{{-- Hero des Entwurfs (Nachtrag 19): Rahmen mit feiner Goldkante und grünen Flanken, links
|
||||
Text mit einem Button, rechts die Slideshow. Das Bild hat ein festes Seitenverhältnis –
|
||||
das Motiv wird auf großen Bildschirmen nicht mehr unten beschnitten (Briefing Punkt 2).
|
||||
Der Wechsel läuft langsam (Überblendung 1,4 s, Standard alle 7 s), pausiert bei Hover und
|
||||
bleibt bei „reduzierter Bewegung“ stehen. --}}
|
||||
<section id="hero" class="hero-draft section-padding relative">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"
|
||||
x-data="{
|
||||
active: 0,
|
||||
count: {{ count($slides) }},
|
||||
interval: {{ $this->intervalMs }},
|
||||
timer: null,
|
||||
paused: false,
|
||||
reduced: window.matchMedia('(prefers-reduced-motion: reduce)').matches,
|
||||
start() {
|
||||
if (this.reduced || this.count < 2) { return; }
|
||||
this.stop();
|
||||
this.timer = setInterval(() => { if (!this.paused && !document.hidden) { this.next(); } }, this.interval);
|
||||
},
|
||||
stop() { if (this.timer) { clearInterval(this.timer); this.timer = null; } },
|
||||
go(i) { this.active = (i + this.count) % this.count; this.start(); },
|
||||
next() { this.go(this.active + 1); },
|
||||
prev() { this.go(this.active - 1); },
|
||||
}"
|
||||
x-init="start()" x-on:keydown.arrow-right.prevent="next()" x-on:keydown.arrow-left.prevent="prev()">
|
||||
|
||||
<div class="hero-frame relative overflow-hidden rounded-[28px]">
|
||||
<x-web.hero-flank-right />
|
||||
<x-web.hero-flank-left />
|
||||
|
||||
{{-- Rechts wenig Innenabstand: das Bild liegt über der grünen Flanke, wie in der Visualisierung. --}}
|
||||
<div class="relative grid items-center gap-10 p-6 sm:p-10 lg:grid-cols-12 lg:gap-10 lg:py-5 lg:pl-16 lg:pr-12">
|
||||
{{-- Text --}}
|
||||
<div class="space-y-6 lg:col-span-5 lg:py-10 lg:pr-4">
|
||||
@if (!empty($content['eyebrow']))
|
||||
<p class="hero-eyebrow">{{ $content['eyebrow'] }}</p>
|
||||
@endif
|
||||
|
||||
<h1 class="hero-title">{!! $content['title'] ?? '' !!}</h1>
|
||||
|
||||
@if (!empty($content['subtitle']))
|
||||
<p class="max-w-md text-base leading-relaxed text-muted-foreground">{!! $content['subtitle'] !!}</p>
|
||||
@endif
|
||||
|
||||
<div>
|
||||
<a href="{{ $content['cta_link'] ?? '/marken' }}" class="btn-hero">
|
||||
{{ $content['cta_text'] ?? __('ui.all_brands_cta') }}
|
||||
<svg class="h-4 w-4" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24"
|
||||
aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Slideshow --}}
|
||||
<div class="hero-image lg:col-span-7">
|
||||
<div class="hero-image-frame">
|
||||
<div class="relative aspect-[4/3] overflow-hidden rounded-[calc(1.25rem-1.5px)] bg-muted lg:aspect-[5/4]"
|
||||
role="group" aria-roledescription="carousel" aria-label="{{ __('ui.hero_slider.label') }}"
|
||||
x-on:mouseenter="paused = true" x-on:mouseleave="paused = false"
|
||||
x-on:focusin="paused = true" x-on:focusout="paused = false" tabindex="0">
|
||||
@forelse ($slides as $index => $slide)
|
||||
<figure wire:key="hero-slide-{{ $index }}" data-hero-slide="{{ $index }}"
|
||||
class="hero-slide absolute inset-0 m-0 {{ $index === 0 ? 'opacity-100' : 'opacity-0' }}"
|
||||
x-bind:class="active === {{ $index }} ? 'opacity-100' : 'opacity-0 pointer-events-none'"
|
||||
x-bind:aria-hidden="(active !== {{ $index }}).toString()">
|
||||
<img src="{{ theme_image_url($slide['image']) }}" alt="{{ $slide['alt'] }}"
|
||||
class="h-full w-full object-cover" @if ($index > 0) loading="lazy" @endif />
|
||||
@if ($slide['label'] !== '')
|
||||
<figcaption
|
||||
class="absolute bottom-5 left-5 rounded-full bg-card/85 px-3 py-1 text-[10px] font-medium uppercase tracking-[0.18em] text-foreground/80 backdrop-blur-sm">
|
||||
{{ $slide['label'] }}
|
||||
</figcaption>
|
||||
@endif
|
||||
</figure>
|
||||
@empty
|
||||
<div class="flex h-full items-center justify-center text-sm text-muted-foreground">
|
||||
{{ __('ui.hero_slider.empty') }}
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Punkte unter dem Rahmen --}}
|
||||
@if (count($slides) > 1)
|
||||
<div class="mt-6 flex items-center justify-center gap-3" role="tablist" aria-label="{{ __('ui.hero_slider.dots') }}">
|
||||
@foreach ($slides as $index => $slide)
|
||||
<button type="button" role="tab" wire:key="hero-dot-{{ $index }}" x-on:click="go({{ $index }})"
|
||||
x-bind:aria-selected="(active === {{ $index }}).toString()"
|
||||
x-bind:class="active === {{ $index }} ? 'bg-primary w-14' : 'bg-border w-10 hover:bg-muted-foreground/40'"
|
||||
class="h-1 cursor-pointer rounded-full transition-all duration-500 {{ $index === 0 ? 'bg-primary w-14' : 'bg-border w-10' }}"
|
||||
aria-label="{{ __('ui.hero_slider.dot', ['n' => $index + 1, 'total' => count($slides), 'label' => $slide['label']]) }}">
|
||||
</button>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
<div x-data="heroSlider()" x-init="init()">
|
||||
@if (filled($content['title'] ?? null))
|
||||
<section class="relative mb-10">
|
||||
<!-- Slider Container -->
|
||||
<div class="absolute inset-0 overflow-hidden">
|
||||
@if(!empty($content['slides']))
|
||||
@foreach($content['slides'] as $index => $slide)
|
||||
<div
|
||||
class="absolute inset-0 transition-opacity duration-1000 ease-in-out"
|
||||
:class="currentSlide === {{ $index }} ? 'opacity-100' : 'opacity-0'"
|
||||
>
|
||||
<img
|
||||
src="{{ theme_image_url($slide['image']) }}"
|
||||
alt="{{ $slide['image_alt'] }}"
|
||||
class="size-full object-cover"
|
||||
/>
|
||||
<div class="absolute inset-0 bg-gray-900 opacity-20"></div>
|
||||
</div>
|
||||
@endforeach
|
||||
@endif
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="relative mx-auto flex max-w-3xl flex-col items-center px-6 py-32 text-center sm:py-64 lg:px-0">
|
||||
<h1 class="text-hero text-white">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
<p class="mt-4 text-xl text-white">{!! $content['subtitle'] !!}</p>
|
||||
<a href="{{ $content['cta1_link'] }}" class="mt-8 inline-block btn-secondary-accent">{{ $content['cta1_text'] }}</a>
|
||||
</div>
|
||||
|
||||
<!-- Navigation Dots -->
|
||||
@if(!empty($content['slides']) && count($content['slides']) > 1)
|
||||
<div class="absolute bottom-8 left-1/2 transform -translate-x-1/2">
|
||||
<div class="flex space-x-3">
|
||||
@foreach($content['slides'] as $index => $slide)
|
||||
<button
|
||||
@click="setSlide({{ $index }})"
|
||||
class="w-3 h-3 rounded-full border-2 border-white/50 transition-all duration-300"
|
||||
:class="currentSlide === {{ $index }} ? 'bg-white border-white' : 'bg-transparent hover:border-white/80'"
|
||||
aria-label="{{ __('ui.show_slide', ['number' => $index + 1]) }}"
|
||||
></button>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Arrow Navigation (Optional) -->
|
||||
@if(!empty($content['slides']) && count($content['slides']) > 1)
|
||||
<button
|
||||
@click="previousSlide()"
|
||||
class="absolute left-6 top-1/2 transform -translate-y-1/2 text-white/70 hover:text-white transition-colors duration-300 focus:outline-none focus:ring-2 focus:ring-white/50 rounded-full p-2"
|
||||
aria-label="{{ __('ui.previous_image') }}"
|
||||
>
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<button
|
||||
@click="nextSlide()"
|
||||
class="absolute right-6 top-1/2 transform -translate-y-1/2 text-white/70 hover:text-white transition-colors duration-300 focus:outline-none focus:ring-2 focus:ring-white/50 rounded-full p-2"
|
||||
aria-label="{{ __('ui.next_image') }}"
|
||||
>
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||
</svg>
|
||||
</button>
|
||||
@endif
|
||||
</section>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function heroSlider() {
|
||||
return {
|
||||
currentSlide: 0,
|
||||
totalSlides: {{ !empty($content['slides']) ? count($content['slides']) : 0 }},
|
||||
autoplayInterval: null,
|
||||
autoplayTimeout: null,
|
||||
|
||||
init() {
|
||||
if (this.totalSlides > 1) {
|
||||
this.startAutoplay();
|
||||
}
|
||||
},
|
||||
|
||||
// Automatischer Wechsel (nur für Intervall)
|
||||
autoNextSlide() {
|
||||
this.currentSlide = (this.currentSlide + 1) % this.totalSlides;
|
||||
},
|
||||
|
||||
// Manuelle Navigation
|
||||
nextSlide() {
|
||||
this.currentSlide = (this.currentSlide + 1) % this.totalSlides;
|
||||
this.resetAutoplay();
|
||||
},
|
||||
|
||||
previousSlide() {
|
||||
this.currentSlide = (this.currentSlide - 1 + this.totalSlides) % this.totalSlides;
|
||||
this.resetAutoplay();
|
||||
},
|
||||
|
||||
setSlide(index) {
|
||||
this.currentSlide = index;
|
||||
this.resetAutoplay();
|
||||
},
|
||||
|
||||
startAutoplay() {
|
||||
// Zuerst alle bestehenden Timer löschen
|
||||
this.stopAutoplay();
|
||||
|
||||
this.autoplayInterval = setInterval(() => {
|
||||
this.autoNextSlide();
|
||||
}, 5000); // Wechsel alle 5 Sekunden
|
||||
},
|
||||
|
||||
stopAutoplay() {
|
||||
if (this.autoplayInterval) {
|
||||
clearInterval(this.autoplayInterval);
|
||||
this.autoplayInterval = null;
|
||||
}
|
||||
if (this.autoplayTimeout) {
|
||||
clearTimeout(this.autoplayTimeout);
|
||||
this.autoplayTimeout = null;
|
||||
}
|
||||
},
|
||||
|
||||
resetAutoplay() {
|
||||
// Alle Timer stoppen
|
||||
this.stopAutoplay();
|
||||
|
||||
// Nach 5 Sekunden Pause wieder starten
|
||||
this.autoplayTimeout = setTimeout(() => {
|
||||
this.startAutoplay();
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -1,84 +0,0 @@
|
|||
<section class="section-padding flex items-center relative border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
|
||||
{{-- Left Content --}}
|
||||
<div class="space-y-8">
|
||||
<div class="space-y-6">
|
||||
<h1 class="text-hero">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
<p class="text-lg text-muted-foreground max-w-md leading-relaxed">
|
||||
{!! $content['subtitle'] !!}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col sm:flex-row gap-4">
|
||||
<a href="{{ $content['cta1_link'] }}" class="btn-primary-accent">
|
||||
{{ $content['cta1_text'] }}
|
||||
</a>
|
||||
<a href="{{ $content['cta2_link'] }}" class="btn-secondary-accent">
|
||||
{{ $content['cta2_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center space-x-8 text-sm text-muted-foreground">
|
||||
@foreach ($content['stats'] as $stat)
|
||||
<span>{{ $stat }}</span>
|
||||
@if (!$loop->last)
|
||||
<span>•</span>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Right Image Tiles --}}
|
||||
<div class="relative">
|
||||
<div class="flex justify-end gap-8 sm:-mt-44 sm:justify-start sm:pl-20 lg:mt-0 lg:pl-0">
|
||||
{{-- First Column --}}
|
||||
<div class="ml-auto w-44 flex-none space-y-8 pt-32 sm:ml-0 sm:pt-80 lg:order-last lg:pt-36 xl:order-0 xl:pt-80">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['tiles'][0]['image']) }}"
|
||||
alt="{{ $content['tiles'][0]['alt'] ?? '' }}"
|
||||
class="aspect-2/3 w-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Second Column --}}
|
||||
<div class="mr-auto w-44 flex-none space-y-8 sm:mr-0 sm:pt-52 lg:pt-36">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['tiles'][1]['image']) }}"
|
||||
alt="{{ $content['tiles'][1]['alt'] ?? '' }}"
|
||||
class="aspect-2/3 w-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['tiles'][2]['image']) }}"
|
||||
alt="{{ $content['tiles'][2]['alt'] ?? '' }}"
|
||||
class="aspect-2/3 w-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Third Column --}}
|
||||
<div class="w-44 flex-none space-y-8 pt-32 sm:pt-0">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['tiles'][3]['image']) }}"
|
||||
alt="{{ $content['tiles'][3]['alt'] ?? '' }}"
|
||||
class="aspect-2/3 w-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated">
|
||||
<img src="{{ theme_image_url($content['tiles'][4]['image']) }}"
|
||||
alt="{{ $content['tiles'][4]['alt'] ?? '' }}"
|
||||
class="aspect-2/3 w-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,9 +1,46 @@
|
|||
<section id="hero" class="section-padding flex items-center relative border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
|
||||
{{-- Left Content --}}
|
||||
<div class="space-y-8">
|
||||
{{-- Hero der Startseite (07.10.2026, Vorbild „Farbwelt und Stil“): Die Slideshow ist das Hauptelement
|
||||
des Rahmens und reicht oben, unten und rechts fast an die Kante. Die Infokarte über dem Bild wechselt
|
||||
mit: Marke und Motiv der jeweiligen Slide. Die Punkte stehen mittig unter dem ganzen Block.
|
||||
Ruhige Überblendung (1,4 s, Standard alle 7 s), Pause bei Hover/Fokus, Pfeiltasten, bei
|
||||
„reduzierter Bewegung“ kein Autowechsel. Eine feine Linie unten im Bild zeigt, wie lange das
|
||||
Bild noch steht; der Zähler läuft über requestAnimationFrame und hält bei Pause wirklich an. --}}
|
||||
<section id="hero" class="section-padding relative border-b border-border/30">
|
||||
<div class="mx-auto w-[95%] max-w-7xl"
|
||||
x-data="{
|
||||
active: 0,
|
||||
count: {{ count($slides) }},
|
||||
interval: {{ $this->intervalMs }},
|
||||
elapsed: 0,
|
||||
last: 0,
|
||||
frame: null,
|
||||
paused: false,
|
||||
reduced: window.matchMedia('(prefers-reduced-motion: reduce)').matches,
|
||||
start() {
|
||||
if (this.reduced || this.count < 2) { return; }
|
||||
this.stop();
|
||||
this.last = performance.now();
|
||||
const tick = (now) => {
|
||||
{{-- Höchstens 100 ms pro Schritt: nach einem Tab-Wechsel springt die Zeit nicht. --}}
|
||||
const step = Math.min(now - this.last, 100);
|
||||
this.last = now;
|
||||
if (!this.paused && !document.hidden) { this.elapsed += step; }
|
||||
if (this.elapsed >= this.interval) { this.next(); return; }
|
||||
this.frame = requestAnimationFrame(tick);
|
||||
};
|
||||
this.frame = requestAnimationFrame(tick);
|
||||
},
|
||||
stop() { if (this.frame) { cancelAnimationFrame(this.frame); this.frame = null; } },
|
||||
go(i) { this.active = (i + this.count) % this.count; this.elapsed = 0; this.start(); },
|
||||
next() { this.go(this.active + 1); },
|
||||
prev() { this.go(this.active - 1); },
|
||||
}"
|
||||
x-init="start()" x-on:keydown.arrow-right.prevent="next()" x-on:keydown.arrow-left.prevent="prev()">
|
||||
|
||||
<div class="bg-hero-container hero-frame grid overflow-hidden rounded-[20px] lg:grid-cols-12">
|
||||
{{-- Text --}}
|
||||
<div class="flex flex-col justify-center space-y-8 px-6 py-10 sm:px-10 lg:col-span-5 lg:py-12 lg:pl-14 lg:pr-8">
|
||||
<div class="space-y-6 slide-right delay-200">
|
||||
<x-web.hero-eyebrow :text="$content['eyebrow'] ?? null" />
|
||||
<h1 class="text-hero-alt">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
|
|
@ -24,34 +61,76 @@
|
|||
@endif
|
||||
</div>
|
||||
|
||||
@if(isset($content['stats']))
|
||||
<div class="flex flex-wrap items-center gap-6 pt-10 mt-10 border-t border-border/80 slide-right delay-300">
|
||||
@foreach ($content['stats'] as $stat)
|
||||
<div class="flex items-center gap-2 text-md text-muted-foreground font-light">
|
||||
@svg('heroicon-o-check-circle', 'w-6 h-6 text-secondary')
|
||||
<span>{{ $stat }}</span>
|
||||
</div>
|
||||
<x-web.hero-trust :items="$content['stats'] ?? []" />
|
||||
</div>
|
||||
|
||||
{{-- Slideshow: wenige Pixel Luft zum Rahmen, auf großen Bildschirmen mindestens 560 px hoch.
|
||||
Mobil (08.10.2026): Bild 4:3 oben, die Infokarte fest als Streifen darunter – sie verdeckt
|
||||
das Bild nicht. Ab lg schwebt die Karte wie gehabt unten links über dem Bild. --}}
|
||||
<div class="p-3 pt-0 sm:p-4 sm:pt-0 lg:col-span-7 lg:pl-0 lg:pt-4">
|
||||
<div class="flex h-full flex-col overflow-hidden rounded-2xl border border-white! bg-muted shadow-elevated slide-left delay-300 lg:relative lg:block lg:min-h-[560px]"
|
||||
@if (count($slides) > 1) role="group" aria-roledescription="carousel" aria-label="{{ __('ui.hero_slider.label') }}" tabindex="0" @endif
|
||||
x-on:mouseenter="paused = true" x-on:mouseleave="paused = false"
|
||||
x-on:focusin="paused = true" x-on:focusout="paused = false">
|
||||
<div class="relative aspect-[4/3] w-full shrink-0 lg:absolute lg:inset-0 lg:aspect-auto" data-hero-stage>
|
||||
{{-- Zustand über data-active statt Klassen: Alpine ersetzt das Attribut vollständig,
|
||||
fest im HTML stehende Klassen würde es dagegen stehen lassen. --}}
|
||||
@foreach ($slides as $index => $slide)
|
||||
<figure wire:key="hero-slide-{{ $index }}" data-hero-slide="{{ $index }}"
|
||||
data-active="{{ $index === 0 ? 'true' : 'false' }}" x-bind:data-active="(active === {{ $index }}).toString()"
|
||||
class="pointer-events-none absolute inset-0 m-0 opacity-0 transition-opacity duration-[1400ms] ease-in-out motion-reduce:transition-none data-[active=true]:pointer-events-auto data-[active=true]:opacity-100"
|
||||
x-bind:aria-hidden="(active !== {{ $index }}).toString()">
|
||||
<img src="{{ theme_image_url($slide['image']) }}" alt="{{ $slide['alt'] }}"
|
||||
class="h-full w-full object-cover" @if ($index > 0) loading="lazy" @endif />
|
||||
</figure>
|
||||
@endforeach
|
||||
<div class="pointer-events-none absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
|
||||
{{-- Laufzeit des aktuellen Bildes: füllt sich von links, bis das nächste kommt --}}
|
||||
@if (count($slides) > 1)
|
||||
<div class="pointer-events-none absolute inset-x-0 bottom-0 z-20 h-[3px] bg-white/25" data-hero-progress
|
||||
x-show="!reduced" aria-hidden="true">
|
||||
<div class="h-full origin-left bg-white" style="transform: scaleX(0)"
|
||||
x-bind:style="`transform: scaleX(${Math.min(elapsed / interval, 1)})`"></div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
{{-- Right Image --}}
|
||||
<div class="relative">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated slide-left delay-300">
|
||||
<img src="{{ theme_image_url($content['image']) }}" alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-[600px] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
{{-- Infokarte: wechselt mit der Slide (Marke + Motiv), sonst die festen Kartentexte.
|
||||
Alle Fassungen liegen übereinander, die Karte ist so groß wie die längste. Der alte
|
||||
Text blendet erst aus, dann der neue ein, damit sich nichts überlagert.
|
||||
Weiß statt `bg-card`: Klassen mit „card“ greift die Glass-Flow-Regel `[class*="card"]` ab. --}}
|
||||
<div class="relative bg-white px-5 py-4 slide-left delay-400 lg:absolute lg:bottom-6 lg:left-6 lg:z-10 lg:max-w-[80%] lg:rounded-xl lg:border lg:border-border/50 lg:bg-white/95 lg:p-4 lg:shadow-lg lg:backdrop-blur-sm" data-hero-info>
|
||||
<div class="grid">
|
||||
@foreach ($slides as $index => $slide)
|
||||
<div wire:key="hero-card-{{ $index }}" data-hero-card="{{ $index }}"
|
||||
data-active="{{ $index === 0 ? 'true' : 'false' }}" x-bind:data-active="(active === {{ $index }}).toString()"
|
||||
class="col-start-1 row-start-1 opacity-0 transition-opacity duration-300 ease-in-out motion-reduce:transition-none data-[active=true]:opacity-100 data-[active=true]:delay-500 data-[active=true]:duration-500"
|
||||
x-bind:aria-hidden="(active !== {{ $index }}).toString()">
|
||||
<div class="text-base font-medium text-secondary lg:text-xl">{{ $slide['label'] !== '' ? $slide['label'] : $content['card_title'] }}</div>
|
||||
<div class="text-base font-medium font-secondary lg:text-lg">{!! $slide['caption'] !== '' ? e($slide['caption']) : $content['card_text'] !!}</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Floating info card --}}
|
||||
<div
|
||||
class="absolute bottom-6 left-6 bg-card/95 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-border/50 slide-left delay-400">
|
||||
<div class="text-xl font-medium text-muted-foreground">{{ $content['card_title'] }}</div>
|
||||
<div class="text-lg font-medium font-secondary">{!! $content['card_text'] !!}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Steuerung mittig unter dem ganzen Block --}}
|
||||
@if (count($slides) > 1)
|
||||
<div class="mt-3 flex items-center justify-center gap-1" role="tablist" aria-label="{{ __('ui.hero_slider.dots') }}">
|
||||
@foreach ($slides as $index => $slide)
|
||||
{{-- Unsichtbare Klickfläche (py-4) um den dünnen Balken – der Balken selbst ist das Span. --}}
|
||||
<button type="button" role="tab" wire:key="hero-dot-{{ $index }}" x-on:click="go({{ $index }})" data-hero-dot
|
||||
x-bind:aria-selected="(active === {{ $index }}).toString()"
|
||||
class="group cursor-pointer px-1 py-4"
|
||||
aria-label="{{ __('ui.hero_slider.dot', ['n' => $index + 1, 'total' => count($slides), 'label' => implode(' – ', array_filter([$slide['label'], $slide['caption']]))]) }}">
|
||||
<span data-active="{{ $index === 0 ? 'true' : 'false' }}" x-bind:data-active="(active === {{ $index }}).toString()"
|
||||
class="block h-1 w-10 rounded-full bg-[hsl(var(--muted-foreground)/0.25)] transition-all duration-500 data-[active=false]:group-hover:bg-[hsl(var(--muted-foreground)/0.45)] data-[active=true]:w-14 data-[active=true]:bg-[hsl(var(--primary))]"></span>
|
||||
</button>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,49 +0,0 @@
|
|||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-2xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8">
|
||||
@foreach($content['team'] as $member)
|
||||
<div class="group">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden hover:scale-105 transition-all duration-300">
|
||||
<div class="relative">
|
||||
<img
|
||||
src="{{ theme_image_url($member['image']) }}"
|
||||
alt="{{ $member['name'] }} - {{ $member['position'] }}"
|
||||
class="w-full h-80 object-cover"
|
||||
/>
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent"></div>
|
||||
</div>
|
||||
|
||||
<div class="p-6 space-y-4">
|
||||
<div>
|
||||
<h3 class="text-xl font-semibold text-foreground mb-1">
|
||||
{{ $member['name'] }}
|
||||
</h3>
|
||||
<p class="text-secondary font-medium text-sm">
|
||||
{{ $member['position'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="text-muted-foreground text-sm leading-relaxed">
|
||||
{{ $member['expertise'] }}
|
||||
</p>
|
||||
|
||||
<div class="flex items-center gap-2 pt-2">
|
||||
<div class="w-8 h-px bg-secondary"></div>
|
||||
<span class="text-xs text-secondary font-medium">{{ $content['team_tag'] }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -49,51 +49,27 @@
|
|||
<!-- Main Content -->
|
||||
<div class="md:col-span-4">
|
||||
<div class="prose prose-lg max-w-none">
|
||||
<p class="text-lg text-muted-foreground leading-relaxed mb-8 slide-up delay-200">
|
||||
{{ $article['content']['intro'] }}
|
||||
</p>
|
||||
{{-- Leerzeilen im Text trennen Absätze (08.10.2026) --}}
|
||||
<div class="mb-8 space-y-4 slide-up delay-200">
|
||||
@foreach (preg_split('/\R\s*\R/u', trim((string) $article['content']['intro'])) as $paragraph)
|
||||
<p class="text-lg text-muted-foreground leading-relaxed">{{ $paragraph }}</p>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@foreach($article['content']['sections'] as $index => $section)
|
||||
<section class="mb-10 bg-light-muted shadow-md p-6 rounded-lg slide-up delay-400" id="section-{{ $index }}">
|
||||
<h2 class="text-2xl font-medium text-foreground mb-4">
|
||||
{{ $index + 1 }}. {{ $section['title'] }}
|
||||
</h2>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $section['content'] }}
|
||||
</p>
|
||||
<div class="space-y-4">
|
||||
@foreach (preg_split('/\R\s*\R/u', trim((string) $section['content'])) as $paragraph)
|
||||
<p class="text-muted-foreground leading-relaxed">{{ $paragraph }}</p>
|
||||
@endforeach
|
||||
</div>
|
||||
</section>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
{{-- <div class="md:col-span-1">
|
||||
<div class="sticky top-24">
|
||||
|
||||
<div class="card-elevated rounded-lg p-2 slide-left delay-400">
|
||||
<h3 class="font-medium text-foreground mb-4 text-center font-2xl py-2">{{ $content['share_article'] }}</h3>
|
||||
<div class="space-y-3">
|
||||
<button class="btn-secondary-accent w-full">
|
||||
<div class="flex items-center justify-center gap-2">
|
||||
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
||||
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
||||
</svg>
|
||||
<span class="font-medium text-sm">LinkedIn</span>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<button class="btn-secondary-accent w-full">
|
||||
<div class="flex items-center justify-center gap-2">
|
||||
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
||||
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
|
||||
</svg>
|
||||
<span class="font-medium text-sm">Facebook</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> --}}
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
|
|
|||
|
|
@ -64,11 +64,5 @@
|
|||
</article>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
{{-- <div class="text-center mt-16">
|
||||
<a href="/magazin?page=2" class="btn-primary-accent">
|
||||
{{ $content['load_more'] }}
|
||||
</a>
|
||||
</div> --}}
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,25 +1,18 @@
|
|||
{{-- Seitenkopf für Unterseiten – abgesetzte graue Fläche wie der Hero auf Startseite und
|
||||
Netzwerkseite, damit er sich klar von den Blöcken darunter absetzt. --}}
|
||||
<section id="seitenkopf" class="section-padding flex items-center relative border-b border-border/30 {{ $bg }}">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16 lg:py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
{{-- Breadcrumb: Home → Marken --}}
|
||||
<nav aria-label="Breadcrumb" class="mb-8">
|
||||
<ol class="flex items-center gap-2 text-sm text-muted-foreground">
|
||||
<li><a href="{{ route('home') }}" class="hover:text-foreground transition-colors">Home</a></li>
|
||||
<li aria-hidden="true">/</li>
|
||||
<li class="text-foreground" aria-current="page">{{ $breadcrumb }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 lg:py-12 bg-hero-container hero-frame rounded-[20px] w-[95%]">
|
||||
@if (!empty($content['image']))
|
||||
{{-- 3:2 statt hälftig geteilt – der Text bleibt der Hauptdarsteller, das Bild begleitet ihn nur. --}}
|
||||
<div class="grid lg:grid-cols-5 gap-10 lg:gap-14 items-center">
|
||||
<div class="lg:col-span-3 slide-right delay-200">
|
||||
<x-web.hero-eyebrow :text="$content['eyebrow'] ?? null" class="mb-6" />
|
||||
<h1 class="text-hero-alt">{!! $content['title'] ?? '' !!}</h1>
|
||||
<p class="text-large text-muted-foreground leading-relaxed mt-6">{{ $content['text'] ?? '' }}</p>
|
||||
<x-web.hero-trust :items="$content['stats'] ?? []" class="mt-8" />
|
||||
</div>
|
||||
|
||||
<div class="lg:col-span-2 relative rounded-2xl overflow-hidden shadow-elevated slide-left delay-300">
|
||||
<div class="lg:col-span-2 relative rounded-2xl overflow-hidden border border-white! shadow-elevated slide-left delay-300">
|
||||
<img src="{{ theme_image_url($content['image']) }}" alt="{{ $content['image_alt'] ?? '' }}"
|
||||
class="w-full aspect-[4/3] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/15 to-transparent"></div>
|
||||
|
|
@ -28,8 +21,10 @@
|
|||
@else
|
||||
{{-- Ohne Motiv bleibt der Textblock allein stehen – kein leerer Platzhalterrahmen. --}}
|
||||
<div class="max-w-3xl slide-right delay-200">
|
||||
<x-web.hero-eyebrow :text="$content['eyebrow'] ?? null" class="mb-6" />
|
||||
<h1 class="text-hero-alt">{!! $content['title'] ?? '' !!}</h1>
|
||||
<p class="text-large text-muted-foreground leading-relaxed mt-6">{{ $content['text'] ?? '' }}</p>
|
||||
<x-web.hero-trust :items="$content['stats'] ?? []" class="mt-8" />
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,154 +0,0 @@
|
|||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
{{ $content['title'] }}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-3xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid lg:grid-cols-2 gap-16">
|
||||
{{-- Für Makler --}}
|
||||
<div class="space-y-8">
|
||||
<div class="text-center lg:text-left">
|
||||
<div
|
||||
class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
||||
</svg>
|
||||
{{ $content['broker']['tag'] }}
|
||||
</div>
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
{!! $content['broker']['title'] !!}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach ($content['broker']['benefits'] as $index => $benefit)
|
||||
<div class="card-elevated p-6 rounded-xl">
|
||||
<div class="flex gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center">
|
||||
@if ($benefit['icon'] === 'trending-up')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'target')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z">
|
||||
</path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h4>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="bg-secondary/5 rounded-xl p-6">
|
||||
<div class="text-center">
|
||||
<div class="text-3xl font-bold text-secondary mb-2">{{ $content['broker']['highlight']['value'] }}</div>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
{{ $content['broker']['highlight']['text'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Für Lieferanten --}}
|
||||
<div class="space-y-8">
|
||||
<div class="text-center lg:text-left">
|
||||
<div class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
||||
</path>
|
||||
</svg>
|
||||
{{ $content['supplier']['tag'] }}
|
||||
</div>
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
{!! $content['supplier']['title'] !!}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach ($content['supplier']['benefits'] as $index => $benefit)
|
||||
<div class="card-elevated p-6 rounded-xl">
|
||||
<div class="flex gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-12 h-12 rounded-xl bg-accent/20 flex items-center justify-center">
|
||||
@if ($benefit['icon'] === 'globe')
|
||||
<svg class="w-6 h-6 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
||||
</path>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'handshake')
|
||||
<svg class="w-6 h-6 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.367 2.684 3 3 0 00-5.367-2.684z">
|
||||
</path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z">
|
||||
</path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h4>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated p-0 overflow-hidden rounded-xl">
|
||||
<img src="{{ theme_image_url($content['supplier']['highlight']['image']) }}" alt="{{ $content['supplier']['highlight']['alt'] }}"
|
||||
class="w-full h-48 object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/60 to-transparent flex items-end">
|
||||
<div class="p-6 text-white">
|
||||
<div class="text-2xl font-bold mb-1">{{ $content['supplier']['highlight']['value'] }}</div>
|
||||
<p class="text-sm opacity-90">{{ $content['supplier']['highlight']['text'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
<section class="section-padding flex items-center relative border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<div class="slide-right delay-300">
|
||||
<h1 class="text-hero mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h1>
|
||||
|
||||
<p class="text-lg text-muted-foreground max-w-md leading-relaxed">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
@if(isset($content['partner_types']))
|
||||
<div class="grid grid-cols-2 gap-6 mt-8 border-t border-border/50 pt-8">
|
||||
@foreach ($content['partner_types'] as $index => $partner)
|
||||
<div class="flex gap-4 slide-up delay-{{ $index * 200 }}">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-full bg-secondary/10 flex items-center justify-center">
|
||||
@svg('heroicon-o-'.$partner['icon'], 'w-6 h-6 text-secondary')
|
||||
</div>
|
||||
<div>
|
||||
<p class="font-semibold text-foreground">{{ $partner['title'] }}</p>
|
||||
<p class="text-sm text-muted-foreground">{{ $partner['description'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
@if(isset($content['stats']))
|
||||
<div class="flex flex-wrap items-center gap-6 pt-10 border-t border-border/80 slide-right delay-300">
|
||||
@foreach ($content['stats'] as $stat)
|
||||
<div class="flex items-center gap-2 text-md text-muted-foreground">
|
||||
@svg('heroicon-o-check-circle', 'w-6 h-6 text-secondary')
|
||||
<span>{{ $stat }}</span>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
|
||||
<div class="relative">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated slide-left delay-300">
|
||||
<img src="{{ theme_image_url($content['image']) }}"
|
||||
alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-[600px] object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
|
||||
{{-- Floating info card --}}
|
||||
|
||||
<div
|
||||
class="absolute bottom-6 left-6 bg-card/95 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-border/50 slide-left delay-400">
|
||||
<div class="text-xl font-medium text-muted-foreground">{!! $content['hub']['title'] !!}</div>
|
||||
<div class="text-lg font-medium font-secondary">{!! $content['hub']['subtitle'] !!}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16 slide-up delay-300">
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-3xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 mb-16">
|
||||
@foreach ($content['steps'] as $index => $step)
|
||||
<div class="card-elevated p-0 overflow-hidden group hover:shadow-elevated transition-all duration-300 slide-up delay-{{ $index * 200 }}">
|
||||
@if(isset($step['icon']))
|
||||
<div class="relative pt-12 pb-8">
|
||||
<div class="mx-auto w-20 h-20 icon-secondary-linear glow-soft group-hover:glow-medium rounded-2xl flex items-center justify-center transition-colors duration-300">
|
||||
@svg('heroicon-o-'.$step['icon'], 'w-10 h-10 text-secondary-foreground')
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="p-8">
|
||||
<div class="flex items-center gap-3 mb-4">
|
||||
<div class="w-10 h-10 rounded-lg bg-secondary/10 flex items-center justify-center">
|
||||
<span class="text-lg font-bold text-secondary">{{ $index + 1 }}</span>
|
||||
</div>
|
||||
<h3 class="text-2xl font-medium text-foreground">
|
||||
{{ $step['title'] }}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed mb-6">
|
||||
{{ $step['description'] }}
|
||||
</p>
|
||||
|
||||
@if ($index === count($content['steps']) - 1)
|
||||
<a href="{{ $content['cta']['button_link'] }}">
|
||||
<button class="btn-secondary-accent w-full cursor-pointer">
|
||||
{{ $content['cta']['button_text'] }}
|
||||
</button>
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,299 +0,0 @@
|
|||
|
||||
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<!-- Header -->
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-hero mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
<p class="text-large text-muted-foreground max-w-2xl mx-auto">
|
||||
{!! $content['subtitle'] !!}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Filter Navigation -->
|
||||
<div class="flex flex-wrap justify-center gap-3 mb-12">
|
||||
|
||||
|
||||
@foreach($this->filters as $filterKey => $filterLabel)
|
||||
<button
|
||||
wire:click="filterBy('{{ $filterKey }}')"
|
||||
class="{{ $activeFilter === $filterKey
|
||||
? 'btn-primary-accent'
|
||||
: 'btn-secondary-accent' }}"
|
||||
>
|
||||
{{ $filterLabel }}
|
||||
</button>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<!-- Portfolio Grid -->
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"
|
||||
x-data
|
||||
x-init="$nextTick(() => {
|
||||
// Smooth animation for grid changes
|
||||
$el.style.opacity = '0';
|
||||
setTimeout(() => { $el.style.opacity = '1'; }, 100);
|
||||
})">
|
||||
|
||||
@foreach($this->getFilteredProjects() as $index => $project)
|
||||
<div class="group card-elevated rounded-3xl overflow-hidden h-full hover:scale-[1.02] transition-all duration-300"
|
||||
x-data="{ loaded: false }"
|
||||
x-init="setTimeout(() => loaded = true, {{ $index * 100 }})"
|
||||
x-show="loaded"
|
||||
x-transition:enter="transition ease-out duration-700"
|
||||
x-transition:enter-start="opacity-0 transform translate-y-8"
|
||||
x-transition:enter-end="opacity-100 transform translate-y-0">
|
||||
|
||||
<!-- Image Container -->
|
||||
<div class="relative aspect-[4/3] overflow-hidden cursor-pointer"
|
||||
wire:click="openModal({{ json_encode($project) }})">
|
||||
<img src="{{ theme_image_url($project['image']) }}"
|
||||
alt="{{ $project['title'] }}"
|
||||
class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110">
|
||||
|
||||
<!-- Overlay -->
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
|
||||
|
||||
<!-- View Button -->
|
||||
<div class="absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-all duration-300">
|
||||
<button class="btn-primary-accent">
|
||||
<div class="flex items-center justify-center">
|
||||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
|
||||
</svg>
|
||||
<span class="font-medium"> {{ __('ui.view') }}</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Category Badge -->
|
||||
<div class="absolute top-4 left-4">
|
||||
<span class="bg-primary text-white px-3 py-1 rounded-full text-xs font-medium">
|
||||
{{ $project['category'] }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="p-6 lg:p-8 flex flex-col justify-between">
|
||||
<div class="space-y-4">
|
||||
<h3 class="text-2xl lg:text-3xl font-semibold text-foreground leading-tight group-hover:text-secondary transition-colors duration-200">
|
||||
{{ $project['title'] }}
|
||||
</h3>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed text-base line-clamp-2">
|
||||
{{ $project['description'] }}
|
||||
</p>
|
||||
|
||||
<!-- Features -->
|
||||
<div class="flex flex-wrap gap-2">
|
||||
@foreach($project['features'] as $feature)
|
||||
<span class="text-xs bg-muted text-muted-foreground px-2 py-1 rounded">
|
||||
{{ $feature }}
|
||||
</span>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Location and Price -->
|
||||
<div class="flex items-center justify-between mt-6">
|
||||
<div class="flex items-center text-sm text-muted-foreground gap-4">
|
||||
@if(isset($project['location']) && $project['location'] != '')
|
||||
<div class="flex items-center gap-1">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
{{ $project['location'] }}
|
||||
</div>
|
||||
@endif
|
||||
@if(isset($project['price']) && $project['price'] != '')
|
||||
<span class="w-1 h-1 bg-muted-foreground rounded-full"></span>
|
||||
<span class="font-medium text-secondary">{{ $project['price'] }}</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@if(empty($this->getFilteredProjects()))
|
||||
<div class="text-center py-16">
|
||||
<div class="w-24 h-24 mx-auto mb-4 bg-muted rounded-full flex items-center justify-center">
|
||||
<svg class="w-12 h-12 text-muted-foreground" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-lg font-medium text-foreground mb-2">{{ __('ui.portfolio.no_projects') }}</h3>
|
||||
<p class="text-muted-foreground">{{ __('ui.portfolio.try_other_filter') }}</p>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<!-- Modal -->
|
||||
<div x-data="{ show: @entangle('showModal').live }"
|
||||
x-show="show"
|
||||
x-cloak
|
||||
class="fixed inset-0 z-50 overflow-y-auto"
|
||||
x-transition:enter="transition ease-out duration-300"
|
||||
x-transition:enter-start="opacity-0"
|
||||
x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="transition ease-in duration-200"
|
||||
x-transition:leave-start="opacity-100"
|
||||
x-transition:leave-end="opacity-0"
|
||||
@click="$wire.closeModal()">
|
||||
|
||||
<!-- Backdrop -->
|
||||
<div class="fixed inset-0 bg-black/70 backdrop-blur-sm"></div>
|
||||
|
||||
<!-- Modal Content -->
|
||||
<div class="relative min-h-screen flex items-center justify-center p-4">
|
||||
<div class="relative card-elevated rounded-3xl max-w-4xl w-full max-h-[90vh] overflow-hidden"
|
||||
x-show="show"
|
||||
x-transition:enter="transition ease-out duration-300 transform"
|
||||
x-transition:enter-start="opacity-0 scale-95"
|
||||
x-transition:enter-end="opacity-100 scale-100"
|
||||
x-transition:leave="transition ease-in duration-200 transform"
|
||||
x-transition:leave-start="opacity-100 scale-100"
|
||||
x-transition:leave-end="opacity-0 scale-95"
|
||||
@click.stop>
|
||||
|
||||
@if($selectedProject)
|
||||
<!-- Close Button -->
|
||||
<button @click="$wire.closeModal()"
|
||||
class="absolute top-4 right-4 z-20 bg-secondary text-white rounded-full p-2 hover:bg-secondary/80 transition-colors duration-200">
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<!-- Scrollable Content Area -->
|
||||
<div class="h-full max-h-[90vh] overflow-y-auto">
|
||||
<!-- Image -->
|
||||
<div class="aspect-[16/10] relative overflow-hidden rounded-t-2xl">
|
||||
<img src="{{ theme_image_url($selectedProject['image']) }}"
|
||||
alt="{{ $selectedProject['title'] }}"
|
||||
class="w-full h-full object-cover">
|
||||
|
||||
<!-- Category Badge -->
|
||||
<div class="absolute top-6 left-6">
|
||||
<span class="bg-primary text-white px-4 py-2 rounded-full text-sm font-medium">
|
||||
{{ $selectedProject['category'] }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="p-8">
|
||||
<div class="flex flex-col lg:flex-row lg:items-start lg:justify-between gap-6">
|
||||
<div class="flex-1">
|
||||
<h2 class="text-section-title mb-4">
|
||||
{{ $selectedProject['title'] }}
|
||||
</h2>
|
||||
<p class="text-muted-foreground mb-6 leading-relaxed text-base lg:text-lg">
|
||||
{{ $selectedProject['description'] }}
|
||||
</p>
|
||||
|
||||
<!-- Features -->
|
||||
<div class="mb-6">
|
||||
<h4 class="font-semibold text-foreground mb-3">{{ __('ui.portfolio.amenities') }}</h4>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
@foreach($selectedProject['features'] as $feature)
|
||||
<span class="bg-muted text-muted-foreground px-3 py-1 rounded-full text-sm">
|
||||
{{ $feature }}
|
||||
</span>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Details Sidebar -->
|
||||
<div class="lg:w-80 card-elevated rounded-lg p-6">
|
||||
<h4 class="font-semibold text-foreground mb-4">{{ __('ui.portfolio.project_details') }}</h4>
|
||||
|
||||
<div class="space-y-4">
|
||||
@if(isset($selectedProject['location']) && $selectedProject['location'] != '')
|
||||
<div class="flex items-start gap-3">
|
||||
<svg class="w-5 h-5 text-muted-foreground mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
<div>
|
||||
<span class="text-sm text-muted-foreground">{{ __('ui.portfolio.location') }}</span>
|
||||
<div class="font-medium text-foreground">{{ $selectedProject['location'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(isset($selectedProject['price']) && $selectedProject['price'] != '')
|
||||
<div class="flex items-start gap-3">
|
||||
<svg class="w-5 h-5 text-muted-foreground mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1"></path>
|
||||
</svg>
|
||||
<div>
|
||||
<span class="text-sm text-muted-foreground">{{ __('ui.portfolio.price') }}</span>
|
||||
<div class="font-bold text-lg text-secondary">{{ $selectedProject['price'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if(isset($selectedProject['size']) && $selectedProject['size'] != '')
|
||||
<div class="flex items-start gap-3">
|
||||
<svg class="w-5 h-5 text-muted-foreground mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 8V4a1 1 0 011-1h4m0 0V4m0-1h6m0 1v3M4 8h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V8z"></path>
|
||||
</svg>
|
||||
<div>
|
||||
<span class="text-sm text-muted-foreground">{{ __('ui.portfolio.size') }}</span>
|
||||
<div class="font-medium text-foreground">{{ $selectedProject['size'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<!-- CTA Button -->
|
||||
<button class="btn-primary-accent w-full mt-6">
|
||||
{{ __('ui.contact') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
.line-clamp-2 {
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Custom scrollbar for modal */
|
||||
.overflow-y-auto::-webkit-scrollbar {
|
||||
width: 6px;
|
||||
}
|
||||
|
||||
.overflow-y-auto::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
.overflow-y-auto::-webkit-scrollbar-thumb {
|
||||
background: hsl(var(--muted-foreground) / 0.3);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.overflow-y-auto::-webkit-scrollbar-thumb:hover {
|
||||
background: hsl(var(--muted-foreground) / 0.5);
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
|
@ -8,10 +8,14 @@
|
|||
</div>
|
||||
|
||||
{{-- Kachel je Verein: Logo oben auf Weiß (die Logos sind für weißen Grund gemacht),
|
||||
darunter ein kurzer Text. Bewusst ohne Verlinkung – reine Nennung. --}}
|
||||
<div class="grid sm:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto slide-up delay-400">
|
||||
darunter ein kurzer Text. Ist eine Website (url) gepflegt, öffnet die Kachel sie in
|
||||
einem neuen Tab (08.10.2026). --}}
|
||||
<div class="grid sm:grid-cols-2 lg:grid-cols-4 gap-6 max-w-6xl mx-auto slide-up delay-400">
|
||||
@foreach ($content['logos'] ?? [] as $index => $logo)
|
||||
<div class="card-elevated rounded-2xl overflow-hidden" wire:key="sponsor-{{ $index }}">
|
||||
@php $url = preg_match('#^https?://#i', (string) ($logo['url'] ?? '')) ? $logo['url'] : null; @endphp
|
||||
<{{ $url ? 'a' : 'div' }} wire:key="sponsor-{{ $index }}" data-sponsor
|
||||
@if ($url) href="{{ $url }}" target="_blank" rel="noopener" @endif
|
||||
class="card-elevated rounded-2xl overflow-hidden flex flex-col">
|
||||
{{-- Feste Bühnenhöhe und Deckel in beide Richtungen: die Logos haben sehr
|
||||
unterschiedliche Seitenverhältnisse (1:1 bis 3,3:1) und wirken sonst
|
||||
unterschiedlich groß. --}}
|
||||
|
|
@ -20,13 +24,19 @@
|
|||
loading="lazy" class="max-h-20 max-w-[85%] w-auto object-contain" />
|
||||
</div>
|
||||
|
||||
<div class="p-6 border-t border-border/60">
|
||||
<h3 class="font-medium">{{ $logo['name'] ?? '' }}</h3>
|
||||
<div class="p-6 border-t border-border/60 grow">
|
||||
<h3 class="font-medium inline-flex items-center gap-1.5">
|
||||
{{ $logo['name'] ?? '' }}
|
||||
@if ($url)
|
||||
@svg('heroicon-o-arrow-top-right-on-square', 'w-4 h-4 text-secondary shrink-0')
|
||||
<span class="sr-only">{{ __('ui.opens_new_tab') }}</span>
|
||||
@endif
|
||||
</h3>
|
||||
@if (!empty($logo['text']))
|
||||
<p class="text-sm text-muted-foreground leading-relaxed mt-2">{{ $logo['text'] }}</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</{{ $url ? 'a' : 'div' }}>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,52 +0,0 @@
|
|||
<section class="section-padding bg-muted/20">
|
||||
<div class="container-padding">
|
||||
{{-- Section Title --}}
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title">{{ $content['title'] }}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{{-- Spotlights Grid --}}
|
||||
<div class="grid md:grid-cols-3 gap-8 lg:gap-12">
|
||||
@foreach ($content['spotlights'] as $index => $spotlight)
|
||||
<div class="text-center space-y-6 group">
|
||||
<div
|
||||
class="mx-auto w-20 h-20 bg-secondary/10 rounded-2xl flex items-center justify-center group-hover:bg-secondary/20 transition-colors duration-300">
|
||||
@if ($spotlight['icon'] === 'map-pin')
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z">
|
||||
</path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
@elseif($spotlight['icon'] === 'star')
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z">
|
||||
</path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
<h3 class="text-xl font-medium">{{ $spotlight['title'] }}</h3>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $spotlight['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<div>
|
||||
<div class="inline-flex items-center gap-2 bg-secondary/10 text-secondary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
|
||||
</svg>
|
||||
{{ $content['tag'] }}
|
||||
</div>
|
||||
|
||||
<h2 class="text-section-title mb-6">
|
||||
{!! $content['title'] !!}
|
||||
</h2>
|
||||
|
||||
<p class="text-large text-muted-foreground leading-relaxed">
|
||||
{{ $content['subtitle'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach($content['benefits'] as $benefit)
|
||||
<div class="flex gap-4">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-xl bg-secondary/10 flex items-center justify-center">
|
||||
@if($benefit['icon'] === 'store')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'settings')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'check-circle')
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h3>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl p-8">
|
||||
<div class="space-y-8">
|
||||
<div class="text-center">
|
||||
<div class="w-20 h-20 mx-auto rounded-full bg-gradient-to-br from-secondary/20 to-secondary/5 flex items-center justify-center mb-6">
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z"/>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-2xl font-semibold text-foreground mb-4">
|
||||
{{ $content['dashboard']['title'] }}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
@foreach($content['dashboard']['stats'] as $stat)
|
||||
<div class="bg-accent/30 rounded-xl p-4">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-foreground">{{ $stat['label'] }}</span>
|
||||
<span class="text-xs text-secondary">{{ $stat['value'] }}</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-secondary h-2 rounded-full" style="width: {{ $stat['value'] }}"></div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,24 +1,36 @@
|
|||
{{-- „Gebaut auf Expertise und Vertrauen“. Mit `boxed` (Startseite, 07.10.2026): Inhalt in einer weißen
|
||||
Box mit Schatten auf der Ockerfläche, das Porträt deutlich kleiner neben dem Text. --}}
|
||||
<section id="vision" class="section-padding {{ $bg }}">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
|
||||
|
||||
<div @class([
|
||||
'grid items-center',
|
||||
'gap-12 lg:grid-cols-2 lg:gap-16' => ! $boxed,
|
||||
'gap-10 rounded-3xl bg-white p-6 shadow-[0_30px_60px_-24px_rgba(0,0,0,0.35)] sm:p-10 lg:grid-cols-12 lg:gap-14 lg:p-14' => $boxed,
|
||||
]) @if ($boxed) data-vision-box @endif>
|
||||
|
||||
{{-- Image --}}
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden slide-left delay-400">
|
||||
<div @class(['relative', 'mx-auto w-full max-w-xs lg:col-span-4 lg:max-w-none' => $boxed])>
|
||||
<div @class([
|
||||
'card-elevated rounded-3xl overflow-hidden slide-left delay-400',
|
||||
'aspect-[4/5]' => $boxed,
|
||||
])>
|
||||
<img src="{{ theme_image_url($content['image']) }}" alt="{{ $content['image_alt'] }}"
|
||||
class="w-full h-full object-cover" />
|
||||
|
||||
<div
|
||||
class="absolute bottom-6 left-6 bg-card/95 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-border/50">
|
||||
{{-- `absolute!`: die Glass-Flow-Regel `[class*="card"]` setzt sonst `position: relative`. --}}
|
||||
<div @class([
|
||||
'absolute! bg-card/95 backdrop-blur-sm rounded-xl shadow-lg border border-border/50',
|
||||
'bottom-6 left-6 p-4' => ! $boxed,
|
||||
'bottom-4 inset-x-4 p-3 text-sm' => $boxed,
|
||||
])>
|
||||
{{ $content['image_caption'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Content --}}
|
||||
<div class="spacing-section">
|
||||
<div @class(['spacing-section', 'lg:col-span-8' => $boxed])>
|
||||
<div class="spacing-content slide-right delay-300">
|
||||
<h2 class="text-section-title">{{ $content['title'] }}</h2>
|
||||
<h2 class="text-section-title">{!! $content['title'] !!}</h2>
|
||||
<div class="spacing-small text-large text-muted-foreground leading-relaxed">
|
||||
@foreach ($content['paragraphs'] as $paragraph)
|
||||
<p>{!! $paragraph !!}</p>
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
<section class="min-h-screen flex items-center relative overflow-hidden">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-[hsl(var(--hero-container))] rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<h1 class="text-5xl lg:text-6xl font-light text-foreground">
|
||||
Über <span class="text-secondary">B2in</span>
|
||||
</h1>
|
||||
|
||||
<blockquote class="text-xl lg:text-2xl text-muted-foreground italic leading-relaxed border-l-4 border-secondary pl-6">
|
||||
"Unsere Vision ist es, Unternehmen durch innovative Konnektivitätslösungen zu verbinden
|
||||
und nachhaltiges Wachstum in der digitalen Welt zu ermöglichen. Bei B2in schaffen wir
|
||||
nicht nur Verbindungen – wir bauen Brücken in die Zukunft."
|
||||
</blockquote>
|
||||
|
||||
<div class="flex items-center gap-4">
|
||||
<div class="w-16 h-px bg-secondary"></div>
|
||||
<div>
|
||||
<p class="font-semibold text-foreground">Marcel Scheibe</p>
|
||||
<p class="text-sm text-muted-foreground">Gründer & CEO, B2in</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden">
|
||||
<img
|
||||
src="{{ asset('img/assets/marcel-scheibe.jpg') }}"
|
||||
alt="Marcel Scheibe, Gründer und CEO von B2in"
|
||||
class="w-full h-96 lg:h-[500px] object-cover" />
|
||||
</div>
|
||||
<div class="absolute -bottom-6 -right-6 bg-secondary text-secondary-foreground p-6 rounded-2xl">
|
||||
<div class="text-3xl font-bold">2019</div>
|
||||
<p class="text-sm opacity-90">Gründungsjahr</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
<section class="py-20 px-4 bg-background">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="relative order-2 lg:order-1">
|
||||
<div class="card-elevated rounded-3xl p-12">
|
||||
<div class="text-center mb-8">
|
||||
<div class="w-20 h-20 mx-auto rounded-full bg-gradient-to-br from-primary to-primary/60 flex items-center justify-center mb-6">
|
||||
<svg class="w-10 h-10 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"/>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-2xl font-semibold text-foreground mb-4">
|
||||
Lifetime-Vergütung
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
<div class="bg-accent/30 rounded-xl p-6">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-sm text-muted-foreground">Erstverkauf</span>
|
||||
<span class="text-lg font-semibold text-primary">3.5%</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-primary h-2 rounded-full w-[35%]"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-accent/30 rounded-xl p-6">
|
||||
<div class="flex justify-between items-center mb-2">
|
||||
<span class="text-sm text-muted-foreground">Folgegeschäfte</span>
|
||||
<span class="text-lg font-semibold text-primary">1.5%</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-primary h-2 rounded-full w-[15%]"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center pt-4">
|
||||
<p class="text-sm text-muted-foreground">
|
||||
Kontinuierliche Erträge über die gesamte Kundenbeziehung
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-8 order-1 lg:order-2">
|
||||
<div>
|
||||
<div class="inline-flex items-center gap-2 bg-primary/10 text-primary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"/>
|
||||
</svg>
|
||||
Für Makler
|
||||
</div>
|
||||
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Lifetime <span class="text-primary">Vergütung</span> für Makler
|
||||
</h2>
|
||||
|
||||
<p class="text-xl text-muted-foreground leading-relaxed">
|
||||
Profitieren Sie von einem revolutionären Vergütungsmodell, das über
|
||||
den einmaligen Verkauf hinausgeht. Bauen Sie langfristige Kundenbeziehungen
|
||||
auf und generieren Sie kontinuierliche Erträge.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach($this->benefits as $benefit)
|
||||
<div class="flex gap-4">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center">
|
||||
@if($benefit['icon'] === 'trending-up')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'clock')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'target')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 1.657-2.657 1.657-2.657A8 8 0 0118.657 17.657zM12 12l1 1"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h3>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
<section class="py-16 px-4 text-center">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="mb-8">
|
||||
<div
|
||||
class="inline-flex items-center gap-2 bg-primary text-primary-foreground px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
★ 4.9 Rating
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
Committed to excellence, ensuring <br />
|
||||
<span class="text-secondary">enduring comfort</span> and creating lasting <br />
|
||||
memories
|
||||
</h2>
|
||||
|
||||
<p class="text-muted-foreground text-lg">
|
||||
Robert Wilson
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
<section class="section-dark py-20 px-4">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-12">
|
||||
<div class="grid grid-cols-2 gap-8">
|
||||
<div>
|
||||
<div class="text-6xl font-light text-dark-text mb-2">17+</div>
|
||||
<p class="text-dark-muted text-sm">Years of Experience</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-6xl font-light text-dark-text mb-2">2M</div>
|
||||
<p class="text-dark-muted text-sm">Happy Guests</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
<h3 class="text-3xl font-light text-dark-text">
|
||||
Economically Sound and Well-<br />
|
||||
<span class="text-secondary">Friendly Service</span> for<br />
|
||||
Families and Their<br />
|
||||
Precious Belongings
|
||||
</h3>
|
||||
|
||||
<p class="text-dark-muted leading-relaxed">
|
||||
We understand that every family is unique, which is why we offer personalized
|
||||
services tailored to meet your specific needs. From luxury amenities to
|
||||
budget-friendly options, we ensure every guest feels valued and comfortable.
|
||||
</p>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 pt-8">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-8 h-8 bg-secondary rounded-full flex items-center justify-center">
|
||||
<span class="text-primary text-sm">✓</span>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-dark-text font-medium text-sm">Top Consultation</p>
|
||||
<p class="text-dark-muted text-xs">Expert guidance</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-8 h-8 bg-secondary rounded-full flex items-center justify-center">
|
||||
<span class="text-primary text-sm">✓</span>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-dark-text font-medium text-sm">Finest Meal</p>
|
||||
<p class="text-dark-muted text-xs">Gourmet dining</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-8 h-8 bg-secondary rounded-full flex items-center justify-center">
|
||||
<span class="text-primary text-sm">✓</span>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-dark-text font-medium text-sm">Easy Tax Reduction</p>
|
||||
<p class="text-dark-muted text-xs">Cost-effective</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated bg-dark-muted p-0 overflow-hidden rounded-3xl">
|
||||
<img src="{{ asset('img/assets/accommodation-2.jpg') }}" alt="Luxury interior design"
|
||||
class="w-full h-96 object-cover" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
<section class="py-20 px-4 bg-background">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Digitales <span class="text-primary">Herzstück</span>
|
||||
</h2>
|
||||
<p class="text-xl text-muted-foreground max-w-3xl mx-auto">
|
||||
Modernste Technologie-Infrastruktur, die alle Ecosystem-Teilnehmer
|
||||
nahtlos miteinander verbindet und außergewöhnliche Nutzererfahrungen ermöglicht.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
@foreach($this->features as $index => $feature)
|
||||
<div class="group {{ $index === 4 ? 'md:col-span-2 lg:col-span-1 lg:col-start-2' : '' }}">
|
||||
<div class="card-elevated p-8 rounded-3xl h-full hover:scale-105 transition-all duration-300 relative overflow-hidden">
|
||||
<div class="text-center space-y-6">
|
||||
<div class="w-16 h-16 mx-auto rounded-xl bg-primary/10 flex items-center justify-center mb-6">
|
||||
@if($feature['icon'] === 'cloud')
|
||||
<svg class="w-8 h-8 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"/>
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'shield')
|
||||
<svg class="w-8 h-8 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'layers')
|
||||
<svg class="w-8 h-8 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/>
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'database')
|
||||
<svg class="w-8 h-8 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-8 h-8 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<h3 class="text-xl font-semibold text-foreground">
|
||||
{{ $feature['title'] }}
|
||||
</h3>
|
||||
|
||||
<div class="w-12 h-px bg-primary mx-auto"></div>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $feature['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-primary/20 via-primary to-primary/20 transform scale-x-0 group-hover:scale-x-100 transition-transform duration-300"></div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
<section class="min-h-screen flex items-center relative overflow-hidden">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-[hsl(var(--hero-container))] rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<h1 class="text-5xl lg:text-7xl font-light text-foreground">
|
||||
B2in <span class="text-primary">Ecosystem</span>
|
||||
</h1>
|
||||
|
||||
<p class="text-xl lg:text-2xl text-muted-foreground leading-relaxed">
|
||||
Ein intelligentes Netzwerk, das Endkunden, Makler, Lieferanten und
|
||||
Technologie nahtlos miteinander verbindet. Jeder Teilnehmer profitiert
|
||||
vom gesamten System und schafft gemeinsam außergewöhnliche Immobilienerlebnisse.
|
||||
</p>
|
||||
|
||||
<div class="grid grid-cols-2 gap-6">
|
||||
@foreach ($this->features as $feature)
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center">
|
||||
@if ($feature['icon'] === 'users')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13.5-9a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z" />
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'building-2')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
|
||||
</svg>
|
||||
@elseif($feature['icon'] === 'network')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.367 2.684 3 3 0 00-5.367-2.684z" />
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 10V3L4 14h7v7l9-11h-7z" />
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<p class="font-semibold text-foreground">{{ $feature['title'] }}</p>
|
||||
<p class="text-sm text-muted-foreground">{{ $feature['description'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl p-12 bg-background/80 backdrop-blur-sm">
|
||||
<div class="space-y-8">
|
||||
<!-- Central Hub -->
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-24 h-24 mx-auto rounded-full bg-primary flex items-center justify-center mb-4">
|
||||
<svg class="w-12 h-12 text-white" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.367 2.684 3 3 0 00-5.367-2.684z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-xl font-semibold text-foreground">B2in Portal</h3>
|
||||
<p class="text-sm text-muted-foreground">Zentrale Plattform</p>
|
||||
</div>
|
||||
|
||||
<!-- Connection Points -->
|
||||
<div class="grid grid-cols-2 gap-8">
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13.5-9a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Endkunden</p>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Makler</p>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.367 2.684 3 3 0 00-5.367-2.684z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Lieferanten</p>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 10V3L4 14h7v7l9-11h-7z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">B2A</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<section class="py-20 px-4 bg-background">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Unser <span class="text-primary">Ecosystem</span> in Zahlen
|
||||
</h2>
|
||||
<p class="text-xl text-muted-foreground max-w-3xl mx-auto">
|
||||
Zahlen, die die Stärke und das Vertrauen in unser vernetztes
|
||||
Geschäftsmodell widerspiegeln.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
@foreach ($this->stats as $stat)
|
||||
<div class="card-elevated rounded-2xl p-8 text-center">
|
||||
<div class="text-4xl lg:text-5xl font-bold text-primary mb-4">
|
||||
{{ $stat['number'] }}
|
||||
</div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-3">
|
||||
{{ $stat['label'] }}
|
||||
</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">
|
||||
{{ $stat['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
<section class="py-20 px-4 bg-accent/30">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<div>
|
||||
<div class="inline-flex items-center gap-2 bg-primary/10 text-primary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/>
|
||||
</svg>
|
||||
Für Endkunden
|
||||
</div>
|
||||
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Exklusive <span class="text-primary">Erlebnisse</span> für Sie
|
||||
</h2>
|
||||
|
||||
<p class="text-xl text-muted-foreground leading-relaxed">
|
||||
Mit Ihrer persönlichen Login-Karte erhalten Sie Zugang zu einer
|
||||
einzigartigen Erlebniswelt, die speziell auf Ihre Wohnwünsche
|
||||
und Lebensstil abgestimmt ist. Entdecken Sie kuratierte Immobilien
|
||||
und Services, die sonst nicht verfügbar sind.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach($this->benefits as $benefit)
|
||||
<div class="flex gap-4">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center">
|
||||
@if($benefit['icon'] === 'credit-card')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'star')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'home')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h3>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden">
|
||||
<div class="bg-gradient-to-br from-primary/20 to-primary/5 p-12 h-96 flex flex-col justify-center items-center text-center">
|
||||
<div class="w-24 h-24 rounded-full bg-primary/20 backdrop-blur-sm flex items-center justify-center mb-6">
|
||||
<svg class="w-12 h-12 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z"/>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-2xl font-semibold text-foreground mb-4">
|
||||
Login-Karte
|
||||
</h3>
|
||||
<p class="text-muted-foreground mb-6">
|
||||
Ihr Schlüssel zu exklusiven Immobilienerlebnissen
|
||||
</p>
|
||||
<div class="bg-background/80 backdrop-blur-sm rounded-xl p-4 w-full max-w-xs">
|
||||
<div class="text-sm text-muted-foreground mb-2">Mitgliedsnummer</div>
|
||||
<div class="font-mono text-lg">B2IN-2024-VIP</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
<section class="section-dark py-20 px-4 text-center">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<h2 class="text-5xl md:text-6xl font-light text-dark-text leading-tight mb-8">
|
||||
Were committed to <br />
|
||||
your <span class="text-secondary">comfort</span> and <br />
|
||||
<span class="text-secondary">satisfaction</span> for <br />
|
||||
unforgettable <br />
|
||||
experiences
|
||||
</h2>
|
||||
|
||||
<div class="flex justify-center mb-8">
|
||||
<div class="w-16 h-px bg-secondary"></div>
|
||||
</div>
|
||||
|
||||
<p class="text-dark-muted text-lg">
|
||||
Robert Wilson <br />
|
||||
<span class="text-sm">General Manager</span>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
<section class="py-20 px-4 bg-background">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Das <span class="text-secondary">Führungsteam</span>
|
||||
</h2>
|
||||
<p class="text-muted-foreground text-lg max-w-2xl mx-auto">
|
||||
Unser erfahrenes Team bringt jahrzehntelange Expertise in den Bereichen
|
||||
Technologie, Operations und Geschäftsentwicklung mit.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8">
|
||||
@foreach($this->team as $member)
|
||||
<div class="group">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden hover:scale-105 transition-all duration-300">
|
||||
<div class="relative">
|
||||
<img
|
||||
src="{{ asset('img/assets/' . $member['image']) }}"
|
||||
alt="{{ $member['name'] }} - {{ $member['position'] }}"
|
||||
class="w-full h-80 object-cover"
|
||||
/>
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent"></div>
|
||||
</div>
|
||||
|
||||
<div class="p-6 space-y-4">
|
||||
<div>
|
||||
<h3 class="text-xl font-semibold text-foreground mb-1">
|
||||
{{ $member['name'] }}
|
||||
</h3>
|
||||
<p class="text-secondary font-medium text-sm">
|
||||
{{ $member['position'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p class="text-muted-foreground text-sm leading-relaxed">
|
||||
{{ $member['expertise'] }}
|
||||
</p>
|
||||
|
||||
<div class="flex items-center gap-2 pt-2">
|
||||
<div class="w-8 h-px bg-secondary"></div>
|
||||
<span class="text-xs text-secondary font-medium">B2IN TEAM</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,116 +0,0 @@
|
|||
<div>
|
||||
<!-- Back Navigation -->
|
||||
<div class="pt-20 pb-4">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<a href="/magazin" class="inline-flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"/>
|
||||
</svg>
|
||||
Zurück zum Magazin
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Article Header -->
|
||||
<article class="pb-16">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<header class="text-center mb-12">
|
||||
<h1 class="text-4xl md:text-5xl font-light text-foreground mb-6 leading-tight">
|
||||
{{ $article['title'] }}
|
||||
</h1>
|
||||
<p class="text-xl text-muted-foreground mb-8 max-w-3xl mx-auto">
|
||||
{{ $article['subtitle'] }}
|
||||
</p>
|
||||
<div class="flex items-center justify-center gap-6 text-sm text-muted-foreground">
|
||||
<div class="flex items-center gap-2">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
||||
</svg>
|
||||
<span>{{ $article['date'] }}</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
<span>{{ $article['readTime'] }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Featured Image -->
|
||||
<div class="mb-12 overflow-hidden rounded-lg">
|
||||
<img
|
||||
src="{{ asset('images/' . $article['image']) }}"
|
||||
alt="{{ $article['title'] }}"
|
||||
class="w-full h-64 md:h-96 object-cover"
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-4 gap-12">
|
||||
<!-- Main Content -->
|
||||
<div class="md:col-span-3">
|
||||
<div class="prose prose-lg max-w-none">
|
||||
<p class="text-lg text-muted-foreground leading-relaxed mb-8">
|
||||
{{ $article['content']['intro'] }}
|
||||
</p>
|
||||
|
||||
@foreach($article['content']['sections'] as $index => $section)
|
||||
<section class="mb-10" id="section-{{ $index }}">
|
||||
<h2 class="text-2xl font-medium text-foreground mb-4">
|
||||
{{ $index + 1 }}. {{ $section['title'] }}
|
||||
</h2>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $section['content'] }}
|
||||
</p>
|
||||
</section>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<div class="md:col-span-1">
|
||||
<div class="sticky top-24">
|
||||
|
||||
<div class="card-elevated rounded-lg p-6">
|
||||
<h3 class="font-medium text-foreground mb-4">Artikel teilen</h3>
|
||||
<div class="space-y-3">
|
||||
<button class="w-full bg-[#0077B5] hover:bg-[#0095e5] text-white rounded-lg py-3 px-4 flex items-center justify-center gap-3 transition-colors duration-200">
|
||||
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
||||
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
||||
</svg>
|
||||
<span class="font-medium">LinkedIn</span>
|
||||
</button>
|
||||
|
||||
<button class="w-full bg-[#3b5998] hover:bg-[#5077cc] text-white rounded-lg py-3 px-4 flex items-center justify-center gap-3 transition-colors duration-200">
|
||||
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
||||
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
|
||||
</svg>
|
||||
<span class="font-medium text-sm">Facebook</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
|
||||
<!-- Bottom CTA -->
|
||||
<section class="bg-secondary text-secondary-foreground section-padding">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
||||
<div class="max-w-2xl mx-auto">
|
||||
<h2 class="text-3xl font-light mb-6 text-[hsl(var(--dark-text))]">
|
||||
Entdecken Sie mehr über
|
||||
<span class="text-primary font-medium">Luxus</span> und
|
||||
<span class="text-primary font-medium">Komfort</span>
|
||||
für unvergessliche Erlebnisse.
|
||||
</h2>
|
||||
|
||||
<a href="/magazin" class="btn-accent px-8 py-3 rounded-lg">
|
||||
Weitere Artikel entdecken
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
<section class="py-20 px-4">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
B2in <span class="text-secondary">Magazin</span>
|
||||
</h2>
|
||||
<p class="text-muted-foreground text-lg max-w-2xl mx-auto">
|
||||
Entdecken Sie die neuesten Trends, Insights und Geschichten aus der Welt
|
||||
der Business-Konnektivität und Innovation.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-8">
|
||||
@foreach($this->posts as $post)
|
||||
<article class="group">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden h-full hover:scale-[1.02] transition-all duration-300">
|
||||
<div class="flex flex-col md:flex-row">
|
||||
<div class="relative md:w-3/4 aspect-[2/1] md:aspect-[2/1]">
|
||||
<img
|
||||
src="{{ asset('images/' . $post['image']) }}"
|
||||
alt="{{ $post['title'] }}"
|
||||
class="w-full h-full object-cover">
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
|
||||
<div class="lg:w-2/3 p-6 lg:p-8 flex flex-col justify-between">
|
||||
<div class="space-y-4">
|
||||
<div class="flex items-center gap-4 text-sm text-muted-foreground">
|
||||
<time>{{ $post['date'] }}</time>
|
||||
<span class="w-1 h-1 bg-muted-foreground rounded-full"></span>
|
||||
<span>{{ $post['readTime'] }}</span>
|
||||
</div>
|
||||
|
||||
<h3 class="text-xl lg:text-2xl font-semibold text-foreground leading-tight group-hover:text-secondary transition-colors duration-200">
|
||||
<a href="/magazin/{{ $post['id'] }}" class="stretched-link">
|
||||
{{ $post['title'] }}
|
||||
</a>
|
||||
</h3>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed text-base lg:text-lg">
|
||||
{{ $post['excerpt'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-between mt-6">
|
||||
<div class="flex items-center text-secondary font-medium group-hover:text-secondary-dark transition-colors duration-200">
|
||||
<a href="/magazin/{{ $post['id'] }}" class="text-sm">Weiterlesen</a>
|
||||
<svg class="w-4 h-4 ml-2 transform group-hover:translate-x-1 transition-transform duration-200" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="w-10 h-10 bg-primary rounded-full flex items-center justify-center group-hover:bg-secondary transition-colors duration-200">
|
||||
<a href="/magazin/{{ $post['id'] }}">
|
||||
<svg class="w-4 h-4 text-white transform group-hover:translate-x-1 transition-transform duration-200" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-16">
|
||||
<a href="/magazin?page=2" class="btn-primary px-8 py-4 rounded-2xl">
|
||||
Weitere Artikel laden
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
<section class="section-dark section-padding">
|
||||
<div class="container-narrow text-center">
|
||||
<h2 class="text-section-title text-[hsl(var(--dark-text))] mb-12">
|
||||
Unsere <span class="text-secondary">Geschichte</span>
|
||||
</h2>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 mb-16">
|
||||
@foreach($this->timeline as $item)
|
||||
<div class="spacing-small">
|
||||
<div class="w-12 h-12 mx-auto bg-secondary/20 rounded-full flex items-center justify-center">
|
||||
<div class="w-6 h-6 bg-secondary rounded-full"></div>
|
||||
</div>
|
||||
<h3 class="text-xl font-semibold text-[hsl(var(--dark-text))]">{{ $item['title'] }}</h3>
|
||||
<p class="text-dark-muted text-sm leading-relaxed">
|
||||
{{ $item['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<p class="text-large text-dark-muted leading-relaxed max-w-3xl mx-auto">
|
||||
Was als Vision begann, traditionelle Geschäftsprozesse zu revolutionieren, ist heute eine
|
||||
bewährte Plattform für digitale Innovation. B2in schließt die Lücke zwischen
|
||||
traditionellen Unternehmen und modernen, digitalen Lösungen durch maßgeschneiderte
|
||||
Konnektivitätsservices, die Effizienz steigern und nachhaltiges Wachstum fördern.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<section class="py-20 px-4">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Unsere <span class="text-secondary">Werte</span>
|
||||
</h2>
|
||||
<p class="text-muted-foreground text-lg max-w-2xl mx-auto">
|
||||
Diese fünf Grundpfeiler leiten unser tägliches Handeln und definieren,
|
||||
wer wir als Unternehmen sind und wofür wir stehen.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
@foreach($this->values as $index => $value)
|
||||
<div class="group {{ $index === 4 ? 'md:col-span-2 lg:col-span-1 lg:col-start-2' : '' }}">
|
||||
<div class="card-elevated p-8 rounded-3xl h-full hover:scale-105 transition-all duration-300 relative overflow-hidden">
|
||||
<div class="text-center space-y-6">
|
||||
<div class="text-5xl mb-4">{{ $value['icon'] }}</div>
|
||||
|
||||
<h3 class="text-2xl font-semibold text-foreground">
|
||||
{{ $value['title'] }}
|
||||
</h3>
|
||||
|
||||
<div class="w-12 h-px bg-secondary mx-auto"></div>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $value['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-secondary/20 via-secondary to-secondary/20 transform scale-x-0 group-hover:scale-x-100 transition-transform duration-300"></div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,156 +0,0 @@
|
|||
<section class="py-16 px-4">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
Warum Partner werden?
|
||||
</h2>
|
||||
<p class="text-muted-foreground text-lg max-w-3xl mx-auto">
|
||||
Entdecken Sie die Vorteile einer Partnerschaft mit B2in und
|
||||
wie Sie von unserem innovativen Ecosystem profitieren können.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid lg:grid-cols-2 gap-16">
|
||||
{{-- Für Makler --}}
|
||||
<div class="space-y-8">
|
||||
<div class="text-center lg:text-left">
|
||||
<div
|
||||
class="inline-flex items-center gap-2 bg-primary/10 text-primary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
||||
</svg>
|
||||
Für Makler
|
||||
</div>
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
Revolutionäres <span class="text-primary">Provisionsmodell</span>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach ($this->brokerBenefits as $index => $benefit)
|
||||
<div class="card-elevated p-6 rounded-xl">
|
||||
<div class="flex gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center">
|
||||
@if ($benefit['icon'] === 'trending-up')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'target')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z">
|
||||
</path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h4>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="bg-primary/5 rounded-xl p-6">
|
||||
<div class="text-center">
|
||||
<div class="text-3xl font-bold text-primary mb-2">3.5% - ∞</div>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
Erstprovision bis Lifetime-Vergütung
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Für Lieferanten --}}
|
||||
<div class="space-y-8">
|
||||
<div class="text-center lg:text-left">
|
||||
<div
|
||||
class="inline-flex items-center gap-2 bg-accent/50 text-accent-foreground px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
||||
</path>
|
||||
</svg>
|
||||
Für Lieferanten
|
||||
</div>
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
Globale <span class="text-primary">Marktchancen</span>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach ($this->supplierBenefits as $index => $benefit)
|
||||
<div class="card-elevated p-6 rounded-xl">
|
||||
<div class="flex gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-12 h-12 rounded-xl bg-accent/20 flex items-center justify-center">
|
||||
@if ($benefit['icon'] === 'globe')
|
||||
<svg class="w-6 h-6 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z">
|
||||
</path>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'handshake')
|
||||
<svg class="w-6 h-6 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.367 2.684 3 3 0 00-5.367-2.684z">
|
||||
</path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z">
|
||||
</path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h4 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h4>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated p-0 overflow-hidden rounded-xl">
|
||||
<img src="{{ asset('img/assets/accommodation-1.jpg') }}" alt="Partner success visualization"
|
||||
class="w-full h-48 object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/60 to-transparent flex items-end">
|
||||
<div class="p-6 text-white">
|
||||
<div class="text-2xl font-bold mb-1">500+</div>
|
||||
<p class="text-sm opacity-90">Erfolgreiche Partner</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
<section class="section-dark section-padding">
|
||||
<div class="container-narrow text-center">
|
||||
<div class="spacing-section">
|
||||
<h2 class="text-5xl lg:text-6xl font-light text-[hsl(var(--dark-text))] leading-tight">
|
||||
Wachsen Sie <br />
|
||||
<span class="text-secondary">mit uns</span>
|
||||
</h2>
|
||||
|
||||
<div class="w-16 h-px bg-secondary mx-auto"></div>
|
||||
|
||||
<p class="text-large text-dark-muted leading-relaxed max-w-2xl mx-auto">
|
||||
Werden Sie Teil des B2in-Partnernetzwerks und erschließen Sie neue
|
||||
Geschäftsmöglichkeiten durch innovative Konnektivitätslösungen.
|
||||
</p>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 py-8">
|
||||
@foreach($this->stats as $stat)
|
||||
<div class="text-center space-y-3">
|
||||
<div class="text-4xl font-light text-secondary">{{ $stat['number'] }}</div>
|
||||
<p class="text-dark-muted text-sm">{{ $stat['label'] }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="spacing-content">
|
||||
<a href="/contact" class="btn-accent px-12 py-6 rounded-2xl text-lg">
|
||||
Werden Sie B2in Partner
|
||||
</a>
|
||||
|
||||
<p class="text-dark-muted text-sm">
|
||||
Entdecken Sie die Vorteile einer strategischen Partnerschaft mit B2in
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,131 +0,0 @@
|
|||
<section class="min-h-screen flex items-center relative overflow-hidden">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<h1 class="text-hero">
|
||||
Wachsen Sie mit uns.<br />
|
||||
Werden Sie <span class="text-secondary">B2in Partner</span>.
|
||||
</h1>
|
||||
|
||||
<p class="text-lg text-muted-foreground max-w-md leading-relaxed">
|
||||
Werden Sie Teil des B2in Ecosystems und profitieren Sie von innovativen
|
||||
Geschäftsmodellen, die nachhaltiges Wachstum und langfristigen Erfolg ermöglichen.
|
||||
Gemeinsam gestalten wir die Zukunft der Immobilienbranche.
|
||||
</p>
|
||||
|
||||
<div class="grid grid-cols-2 gap-6">
|
||||
@foreach ($this->partnerTypes as $partner)
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center">
|
||||
@if ($partner['icon'] === 'trending-up')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" />
|
||||
</svg>
|
||||
@elseif($partner['icon'] === 'globe')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
@elseif($partner['icon'] === 'handshake')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z" />
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" />
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<p class="font-semibold text-foreground">{{ $partner['title'] }}</p>
|
||||
<p class="text-sm text-muted-foreground">{{ $partner['description'] }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl p-12 bg-background/80 backdrop-blur-sm">
|
||||
<div class="space-y-8">
|
||||
<!-- Central Partnership Hub -->
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-24 h-24 mx-auto rounded-full bg-primary flex items-center justify-center mb-4">
|
||||
<svg class="w-12 h-12 text-white" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-xl font-semibold text-foreground">Partner Network</h3>
|
||||
<p class="text-sm text-muted-foreground">Werden Sie Teil unseres Ecosystems</p>
|
||||
</div>
|
||||
|
||||
<!-- Partner Types -->
|
||||
<div class="grid grid-cols-2 gap-8">
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Makler</p>
|
||||
<p class="text-xs text-muted-foreground">Lifetime-Modell</p>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Lieferanten</p>
|
||||
<p class="text-xs text-muted-foreground">Global Markets</p>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 1.657-2.657 1.657-2.657A8 8 0 0118.657 17.657zM12 12l1 1" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Erfolg</p>
|
||||
<p class="text-xs text-muted-foreground">Messbare Ziele</p>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<div
|
||||
class="w-16 h-16 mx-auto rounded-full bg-accent flex items-center justify-center mb-3">
|
||||
<svg class="w-8 h-8 text-accent-foreground" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p class="font-medium text-sm">Qualität</p>
|
||||
<p class="text-xs text-muted-foreground">Premium Standards</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
<section class="py-16 px-4 bg-accent">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title text-foreground mb-6">
|
||||
So werden Sie <span class="text-primary">Partner</span>
|
||||
</h2>
|
||||
<p class="text-muted-foreground text-lg max-w-3xl mx-auto">
|
||||
In nur drei einfachen Schritten werden Sie Teil des B2in Ecosystems
|
||||
und können von allen Vorteilen unserer Partnerschaft profitieren.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 mb-16">
|
||||
@foreach ($this->steps as $index => $step)
|
||||
<div class="card-elevated p-0 overflow-hidden group hover:shadow-elevated transition-all duration-300">
|
||||
<div class="relative overflow-hidden">
|
||||
<img src="{{ asset('img/assets/' . $step['image']) }}" alt="{{ $step['title'] }}"
|
||||
class="w-full h-64 object-cover group-hover:scale-105 transition-transform duration-300" />
|
||||
<div
|
||||
class="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300">
|
||||
</div>
|
||||
|
||||
{{-- Step Number Badge --}}
|
||||
<div
|
||||
class="absolute top-4 left-4 w-12 h-12 rounded-full bg-primary text-white flex items-center justify-center font-bold text-lg">
|
||||
{{ $step['step'] }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-8">
|
||||
<div class="flex items-center gap-3 mb-4">
|
||||
<div class="w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center">
|
||||
@if ($step['icon'] === 'file-text')
|
||||
<svg class="w-5 h-5 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z">
|
||||
</path>
|
||||
</svg>
|
||||
@elseif($step['icon'] === 'search')
|
||||
<svg class="w-5 h-5 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-5 h-5 text-primary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M13 10V3L4 14h7v7l9-11h-7z"></path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<h3 class="text-2xl font-medium text-foreground">
|
||||
{{ $step['title'] }}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<p class="text-muted-foreground leading-relaxed mb-6">
|
||||
{{ $step['description'] }}
|
||||
</p>
|
||||
|
||||
@if ($index === count($steps) - 1)
|
||||
<a href="/contact">
|
||||
<button class="btn-secondary w-full">
|
||||
Jetzt starten
|
||||
</button>
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
{{-- CTA Section --}}
|
||||
<div class="text-center">
|
||||
<div class="card-elevated p-12 rounded-3xl bg-gradient-to-br from-primary/10 to-primary/5">
|
||||
<h3 class="text-3xl font-light text-foreground mb-6">
|
||||
Bereit für den nächsten <span class="text-primary">Schritt</span>?
|
||||
</h3>
|
||||
<p class="text-muted-foreground text-lg mb-8 max-w-2xl mx-auto">
|
||||
Werden Sie noch heute Teil des B2in Ecosystems und profitieren Sie
|
||||
von innovativen Geschäftsmodellen und nachhaltigen Erfolgsstrategien.
|
||||
</p>
|
||||
<a href="/contact">
|
||||
<button class="btn-primary text-lg px-8 py-4">
|
||||
Jetzt Partner werden
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
<section class="py-16 lg:py-24 bg-muted/20">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
{{-- Section Title --}}
|
||||
<div class="text-center mb-16">
|
||||
<h2 class="text-section-title">spotlights</h2>
|
||||
<p class="text-muted-foreground text-lg mt-4 max-w-2xl mx-auto">
|
||||
Discover what makes our accommodation service stand out from the rest
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{{-- Spotlights Grid --}}
|
||||
<div class="grid md:grid-cols-3 gap-8 lg:gap-12">
|
||||
@foreach ($this->spotlights as $index => $spotlight)
|
||||
<div class="text-center space-y-6 group">
|
||||
<div
|
||||
class="mx-auto w-20 h-20 bg-secondary/10 rounded-2xl flex items-center justify-center group-hover:bg-secondary/20 transition-colors duration-300">
|
||||
@if ($spotlight['icon'] === 'map-pin')
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z">
|
||||
</path>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
</svg>
|
||||
@elseif($spotlight['icon'] === 'star')
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z">
|
||||
</path>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-10 h-10 text-secondary" fill="none" stroke="currentColor"
|
||||
viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||||
d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
<h3 class="text-xl font-medium">{{ $spotlight['title'] }}</h3>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $spotlight['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
<section class="py-20 px-4 bg-muted/30">
|
||||
<div class="max-w-7xl mx-auto">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<div>
|
||||
<div class="inline-flex items-center gap-2 bg-primary/10 text-primary px-4 py-2 rounded-full text-sm font-medium mb-6">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
|
||||
</svg>
|
||||
Für Lieferanten
|
||||
</div>
|
||||
|
||||
<h2 class="text-4xl lg:text-5xl font-light text-foreground mb-6">
|
||||
Kuratierte <span class="text-primary">Plattform</span> für Anbieter
|
||||
</h2>
|
||||
|
||||
<p class="text-xl text-muted-foreground leading-relaxed">
|
||||
Werden Sie Teil eines exklusiven Netzwerks hochwertiger Anbieter.
|
||||
Präsentieren Sie Ihre Produkte und Services einer vorqualifizierten,
|
||||
kaufkräftigen Zielgruppe mit höchsten Qualitätsansprüchen.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6">
|
||||
@foreach($this->benefits as $benefit)
|
||||
<div class="flex gap-4">
|
||||
<div class="flex-shrink-0 w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center">
|
||||
@if($benefit['icon'] === 'store')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'settings')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"/>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
||||
</svg>
|
||||
@elseif($benefit['icon'] === 'check-circle')
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
@else
|
||||
<svg class="w-6 h-6 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/>
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">
|
||||
{{ $benefit['title'] }}
|
||||
</h3>
|
||||
<p class="text-muted-foreground">
|
||||
{{ $benefit['description'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="card-elevated rounded-3xl p-8">
|
||||
<div class="space-y-8">
|
||||
<div class="text-center">
|
||||
<div class="w-20 h-20 mx-auto rounded-full bg-gradient-to-br from-primary/20 to-primary/5 flex items-center justify-center mb-6">
|
||||
<svg class="w-10 h-10 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z"/>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-2xl font-semibold text-foreground mb-4">
|
||||
Anbieter-Dashboard
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
<div class="bg-accent/30 rounded-xl p-4">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-foreground">Produktsichtbarkeit</span>
|
||||
<span class="text-xs text-primary">94%</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-primary h-2 rounded-full w-[94%]"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-accent/30 rounded-xl p-4">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<span class="text-sm font-medium text-foreground">Qualitätsbewertung</span>
|
||||
<span class="text-xs text-primary">98%</span>
|
||||
</div>
|
||||
<div class="w-full bg-accent/50 rounded-full h-2">
|
||||
<div class="bg-primary h-2 rounded-full w-[98%]"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -1,10 +1,11 @@
|
|||
<div>
|
||||
<!-- Hero Section with Contact Form -->
|
||||
<section id="kontakt" class="py-10 flex items-center relative overflow-hidden">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-[hsl(var(--hero-container))] rounded-[20px] w-[95%]">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-10 lg:py-12 bg-hero-container hero-frame rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<!-- Left Side - Hero Text -->
|
||||
<div class="">
|
||||
<x-web.hero-eyebrow :text="$content['hero']['eyebrow'] ?? null" class="mb-6" />
|
||||
<h1 class="text-hero mb-6 tracking-wide">
|
||||
{!! $content['hero']['title'] ?? 'Send us a<br /><span class="text-secondary font-medium">message.</span>' !!}
|
||||
</h1>
|
||||
|
|
@ -233,35 +234,4 @@
|
|||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Social Media Section -->
|
||||
{{-- <section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div class="slide-right delay-200">
|
||||
<h2 class="text-section-title mb-6">
|
||||
{!! $content['social_media']['title'] ?? 'Follow for<br /><span class="text-secondary font-medium">exclusives</span>' !!}
|
||||
</h2>
|
||||
<p class="text-muted-foreground mb-8 max-w-md">
|
||||
{{ $content['social_media']['subtitle'] ?? 'Bleiben Sie auf dem Laufenden mit exklusiven Angeboten und News.' }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
@foreach($this->socialMedia as $index => $social)
|
||||
<div class="flex items-center justify-between p-4 border border-border rounded-lg hover:bg-muted/50 transition-colors slide-left delay-{{ $index * 200 }} cursor-pointer">
|
||||
<div>
|
||||
<h3 class="text-xl text-foreground">{{ $social['name'] }}</h3>
|
||||
<p class="text-sm text-muted-foreground">{{ $social['handle'] }}</p>
|
||||
</div>
|
||||
<svg class="w-4 h-4 text-muted-foreground" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"/>
|
||||
</svg>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
--}}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<title>{{ $title ?? config('app.name') }}</title>
|
||||
|
||||
<link rel="icon" href="/favicon.ico" sizes="any">
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
|
||||
|
||||
@vite(['resources/css/admin.css', 'resources/js/app.js'])
|
||||
@livewireStyles
|
||||
<link rel="stylesheet" href="{{ asset('vendor/livewire/livewire.css') }}">
|
||||
@fluxAppearance
|
||||
|
||||
<!-- Debug: Asset-Status -->
|
||||
<script>
|
||||
console.log('Admin Head geladen');
|
||||
console.log('Vite Assets:', {{ file_exists(public_path('build/admin/manifest.json')) ? 'true' : 'false' }});
|
||||
console.log('Livewire CSS:', {{ file_exists(public_path('vendor/livewire/livewire.css')) ? 'true' : 'false' }});
|
||||
</script>
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
{{ __('Bitte kontaktieren Sie Ihren Ansprechpartner, um eine neue Einladung zu erhalten.') }}
|
||||
</p>
|
||||
|
||||
<flux:button variant="primary" href="mailto:support@b2in.de" icon="envelope">
|
||||
<flux:button variant="primary" href="mailto:info@b2in.eu" icon="envelope">
|
||||
{{ __('Support kontaktieren') }}
|
||||
</flux:button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.about-hero />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.founder-bar bg="bg-accent" />
|
||||
<livewire:web.components.sections.our-story />
|
||||
<livewire:web.components.sections.image-break section="about_image_break" />
|
||||
<livewire:web.components.sections.our-values />
|
||||
|
|
|
|||
|
|
@ -1,32 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Über B2IN - Unser Team & Geschichte')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.about-hero />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.our-story />
|
||||
<livewire:web.components.sections.leadership-team />
|
||||
<livewire:web.components.sections.our-values />
|
||||
<livewire:web.components.sections.partner-c-t-a />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'B2IN - Connecting Design and Property')
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main>
|
||||
<livewire:web.components.sections.hero />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.content-section section="synergie_section" layout="left" />
|
||||
<livewire:web.components.sections.vision-section bg="bg-accent" />
|
||||
<livewire:web.components.sections.ecosystem-core />
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -8,7 +8,6 @@
|
|||
'construction' => 'bg-sky-500',
|
||||
'offplan' => 'bg-amber-400 text-zinc-950',
|
||||
];
|
||||
$confidenceLabels = data_get($ui, 'confidence_labels', []);
|
||||
$defaultProjectTitle = data_get($showUi, 'default_title', 'Projekt');
|
||||
$dev = $dev ?? false;
|
||||
$devQuery = $devQuery ?? false;
|
||||
|
|
@ -65,7 +64,7 @@
|
|||
|
||||
<section class="bg-accent py-8">
|
||||
<div class="container-padding">
|
||||
<div class="grid gap-5 md:grid-cols-2 lg:grid-cols-4">
|
||||
<div class="grid gap-5 md:grid-cols-3">
|
||||
<div class="card-elevated rounded-2xl p-5">
|
||||
<p class="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
||||
{{ data_get($showUi, 'stat_price') }}</p>
|
||||
|
|
@ -84,13 +83,6 @@
|
|||
<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">
|
||||
{{ 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>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,134 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Internationale Immobilien - B2in')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.partner-hero section="immobilien_hero" />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
|
||||
{{-- Aktuelle Projekte --}}
|
||||
@php
|
||||
$projects = cms_theme_section('immobilien_projects');
|
||||
$moebelVorteil = cms_theme_section('immobilien_moebel_vorteil');
|
||||
@endphp
|
||||
|
||||
@if (!empty($projects))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $projects['title'] ?? '' !!}</h2>
|
||||
@if (isset($projects['subtitle']))
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
{{ $projects['subtitle'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-1 lg:grid-cols-2 gap-8 slide-up delay-400">
|
||||
@foreach ($projects['projects'] ?? [] as $project)
|
||||
<div class="card-elevated rounded-2xl overflow-hidden">
|
||||
@if (isset($project['image']))
|
||||
<div class="relative h-56 overflow-hidden">
|
||||
<img src="{{ theme_image_url($project['image']) }}"
|
||||
alt="{{ $project['title'] }}"
|
||||
class="w-full h-full object-cover" />
|
||||
@if (isset($project['status']))
|
||||
<div class="absolute top-4 left-4">
|
||||
<span class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-semibold bg-secondary text-white">
|
||||
{{ $project['status'] }}
|
||||
@if (isset($project['launch_date']))
|
||||
<span class="opacity-80">({{ $project['launch_date'] }})</span>
|
||||
@endif
|
||||
</span>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="p-6 lg:p-8">
|
||||
<div class="mb-4">
|
||||
<h3 class="text-xl font-semibold text-foreground">{{ $project['title'] }}</h3>
|
||||
@if (isset($project['location']))
|
||||
<p class="text-sm text-muted-foreground mt-1">{{ $project['location'] }}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if (isset($project['price_from']))
|
||||
<p class="text-lg font-medium text-secondary mb-4">{{ $project['price_from'] }}</p>
|
||||
@endif
|
||||
|
||||
@if (isset($project['highlights']))
|
||||
<ul class="space-y-2 mb-6">
|
||||
@foreach ($project['highlights'] as $highlight)
|
||||
<li class="flex items-start gap-2 text-sm text-muted-foreground">
|
||||
<svg class="w-4 h-4 text-secondary mt-0.5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
{{ $highlight }}
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
|
||||
<a href="{{ isset($project['slug']) ? route('immobilien.show', $project['slug']) : ($projects['cta_link'] ?? '/contact') }}"
|
||||
class="inline-flex items-center gap-2 btn-primary-accent">
|
||||
{{ isset($project['slug']) ? 'Exposé ansehen' : ($projects['cta_text'] ?? 'Anfragen') }}
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Möbel-Vorteil Banner --}}
|
||||
@if (!empty($moebelVorteil))
|
||||
<section class="section-padding bg-secondary/5">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $moebelVorteil['title'] ?? '' !!}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4">
|
||||
{{ $moebelVorteil['text'] ?? '' }}
|
||||
</p>
|
||||
@if (isset($moebelVorteil['button_text']))
|
||||
<div class="mt-8">
|
||||
<a href="{{ $moebelVorteil['button_link'] ?? '/partner' }}"
|
||||
class="btn-secondary-accent">
|
||||
{{ $moebelVorteil['button_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Trust & Kontakt --}}
|
||||
<livewire:web.components.sections.content-section section="immobilien_trust" layout="right" />
|
||||
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Einrichtungsnetzwerk - B2in Interior')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.partner-hero section="interior_hero" />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
|
||||
{{-- Local-for-Local Konzept --}}
|
||||
<livewire:web.components.sections.content-section section="interior_concept" layout="left" />
|
||||
|
||||
{{-- Zwei Marken --}}
|
||||
@php
|
||||
$brands = cms_theme_section('interior_brands');
|
||||
$zielgruppen = cms_theme_section('interior_zielgruppen');
|
||||
$process = cms_theme_section('interior_process');
|
||||
@endphp
|
||||
|
||||
@if (!empty($brands))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $brands['title'] ?? '' !!}</h2>
|
||||
@if (isset($brands['subtitle']))
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
{{ $brands['subtitle'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 gap-8 max-w-4xl mx-auto slide-up delay-400">
|
||||
@foreach ($brands['brands'] ?? [] as $brand)
|
||||
<div class="card-elevated rounded-2xl overflow-hidden">
|
||||
<div class="p-8 lg:p-10">
|
||||
@if (isset($brand['logo']))
|
||||
<div class="mb-6">
|
||||
<img src="{{ asset($brand['logo']) }}"
|
||||
alt="{{ $brand['name'] }}"
|
||||
class="{{ $brand['logo_width'] ?? 'w-32' }}" />
|
||||
</div>
|
||||
@endif
|
||||
<p class="text-xs font-semibold uppercase tracking-wider text-secondary mb-3">
|
||||
{{ $brand['tagline'] ?? '' }}
|
||||
</p>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $brand['description'] ?? '' }}
|
||||
</p>
|
||||
@if (isset($brand['audience']))
|
||||
<p class="text-sm font-medium text-foreground mt-4">
|
||||
{{ $brand['audience'] }}
|
||||
</p>
|
||||
@endif
|
||||
@if (isset($brand['link']))
|
||||
<div class="mt-6">
|
||||
<a href="{{ $brand['link'] }}"
|
||||
target="_blank" rel="noopener"
|
||||
class="inline-flex items-center gap-2 text-sm font-medium text-secondary hover:text-secondary/80 transition-colors">
|
||||
{{ $brand['name'] }} entdecken
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Für wen? Zielgruppen --}}
|
||||
@if (!empty($zielgruppen))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $zielgruppen['title'] ?? '' !!}</h2>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto slide-up delay-400">
|
||||
@foreach ($zielgruppen['groups'] ?? [] as $group)
|
||||
<div class="text-center p-6">
|
||||
<div class="inline-flex items-center justify-center w-14 h-14 rounded-full bg-secondary/10 text-secondary mb-5">
|
||||
<svg class="w-7 h-7" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
|
||||
@switch($group['icon'] ?? '')
|
||||
@case('home')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25" />
|
||||
@break
|
||||
@case('building-office-2')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 21h19.5m-18-18v18m10.5-18v18m6-13.5V21M6.75 6.75h.75m-.75 3h.75m-.75 3h.75m3-6h.75m-.75 3h.75m-.75 3h.75M6.75 21v-3.375c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21M3 3h12m-.75 4.5H21m-3.75 3.75h.008v.008h-.008v-.008zm0 3h.008v.008h-.008v-.008zm0 3h.008v.008h-.008v-.008z" />
|
||||
@break
|
||||
@case('clipboard-document-check')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75" />
|
||||
@break
|
||||
@endswitch
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-3">{{ $group['title'] ?? '' }}</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">{{ $group['description'] ?? '' }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- So funktioniert es - Prozess --}}
|
||||
@if (!empty($process))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $process['title'] ?? '' !!}</h2>
|
||||
</div>
|
||||
|
||||
<div class="max-w-3xl mx-auto slide-up delay-400">
|
||||
<div class="space-y-8">
|
||||
@foreach ($process['steps'] ?? [] as $step)
|
||||
<div class="flex gap-6 items-start">
|
||||
<div class="shrink-0 w-14 h-14 rounded-full bg-secondary text-white flex items-center justify-center text-lg font-bold">
|
||||
{{ $step['number'] ?? '' }}
|
||||
</div>
|
||||
<div class="pt-2">
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">{{ $step['title'] ?? '' }}</h3>
|
||||
<p class="text-muted-foreground leading-relaxed">{{ $step['description'] ?? '' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Trust / Marcel Scheibe --}}
|
||||
<livewire:web.components.sections.content-section section="interior_trust" layout="right" />
|
||||
|
||||
{{-- CTA --}}
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Für Entwickler & Partner - B2in')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.partner-hero />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.content-section section="supply_chain_intro" layout="left" bg="bg-accent" />
|
||||
<livewire:web.components.sections.card-section section="partner_card_section" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_developer" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_retailer" layout="right" bg="bg-accent" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_supplier" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_broker" layout="right" bg="bg-accent" />
|
||||
<livewire:web.components.sections.partner-process />
|
||||
<livewire:web.components.sections.commitment-section />
|
||||
<livewire:web.components.sections.partner-c-t-a />
|
||||
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -29,9 +29,10 @@
|
|||
['url' => '/', 'label' => 'Home', 'description' => 'Startseite B2in'],
|
||||
['url' => '/immobilien', 'label' => 'Immobilien', 'description' => 'Dubai Investments – Hauptseite'],
|
||||
['url' => '/immobilien/azizi-creek-views-4', 'label' => 'Azizi Creek Views 4', 'description' => 'Projekt-Exposé'],
|
||||
['url' => '/netzwerk', 'label' => 'Netzwerk', 'description' => 'B2in Ökosystem – Teaser (Soft Launch)'],
|
||||
['url' => '/marken', 'label' => 'Marken', 'description' => 'Kernmarken und Netzwerk'],
|
||||
['url' => '/referenzen', 'label' => 'Referenzen', 'description' => 'Realisierte Projekte'],
|
||||
['url' => '/magazin', 'label' => 'Magazin', 'description' => 'Artikel & Insights'],
|
||||
['url' => '/about', 'label' => 'Über B2in', 'description' => 'Über uns & Team'],
|
||||
['url' => '/about', 'label' => 'Über B2in', 'description' => 'Über uns'],
|
||||
['url' => '/contact', 'label' => 'Kontakt', 'description' => 'Kontaktformular'],
|
||||
['url' => '/faq', 'label' => 'FAQ', 'description' => 'Häufige Fragen'],
|
||||
];
|
||||
|
|
@ -48,34 +49,6 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Archiv-Seiten --}}
|
||||
<div class="mb-12">
|
||||
<h2 class="text-xl font-semibold text-foreground mb-6 flex items-center gap-2">
|
||||
<span class="inline-flex items-center justify-center w-8 h-8 rounded-full bg-amber-500/10 text-amber-600">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5M10 11.25h4M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z" /></svg>
|
||||
</span>
|
||||
Archiv (Pre-Soft-Launch Versionen)
|
||||
</h2>
|
||||
<div class="grid gap-3">
|
||||
@php
|
||||
$archivePages = [
|
||||
['url' => '/dev/immobilien-v1', 'label' => 'Immobilien (v1)', 'description' => 'Originalversion vor Soft Launch'],
|
||||
['url' => '/dev/interior-v1', 'label' => 'Interior / Einrichtungsnetzwerk (v1)', 'description' => 'Originalversion vor Soft Launch'],
|
||||
['url' => '/dev/partner-v1', 'label' => 'Für Entwickler & Partner (v1)', 'description' => 'Originalversion vor Soft Launch'],
|
||||
];
|
||||
@endphp
|
||||
@foreach ($archivePages as $page)
|
||||
<a href="{{ $page['url'] }}" class="flex items-center justify-between p-4 rounded-xl border border-border/50 hover:border-amber-500/50 hover:bg-amber-500/5 transition-all group">
|
||||
<div>
|
||||
<span class="font-medium text-foreground group-hover:text-amber-600 transition-colors">{{ $page['label'] }}</span>
|
||||
<span class="text-sm text-muted-foreground ml-3">{{ $page['description'] }}</span>
|
||||
</div>
|
||||
<code class="text-xs text-muted-foreground bg-accent px-2 py-1 rounded">{{ $page['url'] }}</code>
|
||||
</a>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Dev-Tools --}}
|
||||
<div>
|
||||
<h2 class="text-xl font-semibold text-foreground mb-6 flex items-center gap-2">
|
||||
|
|
|
|||
|
|
@ -1,36 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'B2in Ecosystem - Intelligentes Netzwerk')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.partner-hero section="ecosystem_hero" />
|
||||
<livewire:web.components.sections.ecosystem-stats />
|
||||
<livewire:web.components.sections.content-section layout="right" bg="bg-accent"
|
||||
section="ecosystem_start" />
|
||||
<livewire:web.components.sections.content-section layout="left" bg=""
|
||||
section="ecosystem_hub" />
|
||||
<livewire:web.components.sections.content-section layout="right" bg="bg-accent"
|
||||
section="ecosystem_result" />
|
||||
<livewire:web.components.sections.digital-core />
|
||||
<livewire:web.components.sections.partner-c-t-a />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
{{-- Entwurf der Startseite in der Farbwelt vom 24.09.2026 (Nachtrag 19). Nur zur Abstimmung:
|
||||
Palette „greige“ am Body, Gold-Logo, neuer Hero mit Slideshow, keine Ankündigungsleiste.
|
||||
Der Rest der Seite ist die reguläre Startseite – die Sektionen färben sich über die Tokens. --}}
|
||||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Entwurf – B2in Interior')
|
||||
@section('meta_description', 'Entwurf der Startseite in der neuen Farbwelt – nur zur Abstimmung.')
|
||||
@section('announcement_bar', 'off')
|
||||
|
||||
@push('meta')
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
@endpush
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.hero-slider />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.audience-switch />
|
||||
<livewire:web.components.sections.core-brands bg="bg-accent" />
|
||||
<livewire:web.components.sections.origin-section />
|
||||
<livewire:web.components.sections.vision-section />
|
||||
<livewire:web.components.sections.sponsoring bg="bg-accent" />
|
||||
<livewire:web.components.sections.display-feed />
|
||||
<livewire:web.components.sections.immobilien-teaser />
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -9,11 +9,11 @@
|
|||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.hero />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.founder-bar bg="bg-accent" />
|
||||
<livewire:web.components.sections.audience-switch />
|
||||
<livewire:web.components.sections.core-brands bg="bg-accent" />
|
||||
<livewire:web.components.sections.origin-section />
|
||||
<livewire:web.components.sections.vision-section />
|
||||
<livewire:web.components.sections.vision-section bg="bg-secondary" :boxed="true" />
|
||||
<livewire:web.components.sections.sponsoring bg="bg-accent" />
|
||||
<livewire:web.components.sections.display-feed />
|
||||
<livewire:web.components.sections.immobilien-teaser />
|
||||
|
|
|
|||
|
|
@ -1,70 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Home - ' . config('app.name'))
|
||||
|
||||
@section('content')
|
||||
<div class="min-h-screen bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main>
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-16">
|
||||
<h1 class="text-section-title">Willkommen bei {{ config('app.name') }}</h1>
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
Dies ist die Home-Seite mit dem {{ ucfirst(config('app.theme')) }} Theme.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="bg-card/95 backdrop-blur-sm rounded-xl p-8 shadow-lg border border-border/50 spacing-content">
|
||||
<h2 class="text-2xl font-medium mb-6 text-primary">Features</h2>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="space-y-4">
|
||||
<div class="flex items-center space-x-3">
|
||||
<div class="w-2 h-2 bg-secondary rounded-full"></div>
|
||||
<span class="text-muted-foreground">Responsive Design</span>
|
||||
</div>
|
||||
<div class="flex items-center space-x-3">
|
||||
<div class="w-2 h-2 bg-secondary rounded-full"></div>
|
||||
<span class="text-muted-foreground">Mehrere Themes</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="space-y-4">
|
||||
<div class="flex items-center space-x-3">
|
||||
<div class="w-2 h-2 bg-secondary rounded-full"></div>
|
||||
<span class="text-muted-foreground">Dark Mode Unterstützung</span>
|
||||
</div>
|
||||
<div class="flex items-center space-x-3">
|
||||
<div class="w-2 h-2 bg-secondary rounded-full"></div>
|
||||
<span class="text-muted-foreground">Adaptive Farbschemata</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-center mt-8">
|
||||
<a href="{{ url('/welcome') }}" class="btn-primary-accent">
|
||||
Zur Willkommensseite
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,363 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', ($project['title'] ?? 'Exposé') . ' - B2in Immobilien')
|
||||
@section('meta_description', ($project['investment_case']['text'] ?? 'Exklusives Off-Market-Immobilienprojekt in Dubai – jetzt Exposé ansehen.'))
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
|
||||
{{-- 1. Hero --}}
|
||||
<section class="relative h-[50vh] min-h-[400px] overflow-hidden">
|
||||
<x-web-picture
|
||||
src="{{ theme_image_url($project['image'] ?? '') }}"
|
||||
alt="{{ $project['title'] ?? '' }}"
|
||||
class="absolute inset-0 w-full h-full object-cover"
|
||||
loading="" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/70 via-black/30 to-transparent"></div>
|
||||
<div class="absolute bottom-0 left-0 right-0 p-8 lg:p-12">
|
||||
<div class="container-padding">
|
||||
@if (isset($project['status']))
|
||||
<span class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-semibold bg-secondary text-white mb-4">
|
||||
{{ $project['status'] }}
|
||||
@if (isset($project['launch_date']))
|
||||
<span class="opacity-80">({{ $project['launch_date'] }})</span>
|
||||
@endif
|
||||
</span>
|
||||
@endif
|
||||
<h1 class="text-3xl lg:text-4xl font-bold text-white">{{ $project['title'] ?? '' }}</h1>
|
||||
@if (isset($project['location']))
|
||||
<p class="text-lg text-white/80 mt-2">{{ $project['location'] }}</p>
|
||||
@endif
|
||||
@if (isset($project['price_from']))
|
||||
<p class="text-xl font-semibold text-white mt-3">{{ $project['price_from'] }}</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{-- 2. Quick Facts --}}
|
||||
{{-- Editierbar über CMS je Projekt --}}
|
||||
|
||||
@if (!empty($project['quick_facts']))
|
||||
<section class=" bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="grid grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
@foreach ($project['quick_facts'] as $fact)
|
||||
<div class="text-center p-4">
|
||||
<div class="inline-flex items-center justify-center w-12 h-12 rounded-full bg-secondary/10 text-secondary mb-3">
|
||||
@if (isset($fact['icon']))
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
|
||||
@switch($fact['icon'])
|
||||
@case('home-modern')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 21v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21m0 0h4.5V3.545M12.75 21h7.5V10.75M2.25 21h1.5m18 0h-18M2.25 9l4.5-1.636M18.75 3l-1.5.545m0 6.205l3 1m1.5.5l-1.5-.5M6.75 7.364V3h-3v18m3-13.636l10.5-3.819" />
|
||||
@break
|
||||
@case('squares-2x2')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z" />
|
||||
@break
|
||||
@case('building-office-2')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 21h19.5m-18-18v18m10.5-18v18m6-13.5V21M6.75 6.75h.75m-.75 3h.75m-.75 3h.75m3-6h.75m-.75 3h.75m-.75 3h.75M6.75 21v-3.375c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21M3 3h12m-.75 4.5H21m-3.75 3.75h.008v.008h-.008v-.008zm0 3h.008v.008h-.008v-.008zm0 3h.008v.008h-.008v-.008z" />
|
||||
@break
|
||||
@case('user')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z" />
|
||||
@break
|
||||
@endswitch
|
||||
</svg>
|
||||
@endif
|
||||
</div>
|
||||
<p class="text-xs text-muted-foreground uppercase tracking-wider mb-1">{{ $fact['label'] ?? '' }}</p>
|
||||
<p class="text-sm font-semibold text-foreground">{{ $fact['value'] ?? '' }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- 3. Investment Case --}}
|
||||
|
||||
@if (!empty($project['investment_case']))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto">
|
||||
<h2 class="text-section-title text-left">{{ $project['investment_case']['title'] ?? '' }}</h2>
|
||||
<p class="text-large text-muted-foreground mt-6 leading-relaxed">
|
||||
{{ $project['investment_case']['text'] ?? '' }}
|
||||
</p>
|
||||
|
||||
@if (!empty($project['investment_case']['views']))
|
||||
<div class="mt-8">
|
||||
<p class="text-sm font-semibold text-foreground mb-3">Verfügbare Views:</p>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
@foreach ($project['investment_case']['views'] as $view)
|
||||
<span class="inline-flex items-center px-3 py-1.5 rounded-full text-xs font-medium bg-secondary/10 text-secondary">
|
||||
{{ $view }}
|
||||
</span>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (!empty($project['highlights']))
|
||||
<ul class="mt-8 space-y-3">
|
||||
@foreach ($project['highlights'] as $highlight)
|
||||
<li class="flex items-start gap-3 text-muted-foreground">
|
||||
<svg class="w-5 h-5 text-secondary mt-0.5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
{{ $highlight }}
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- 4. Bildergalerie --}}
|
||||
|
||||
@if (!empty($project['gallery']))
|
||||
<div x-data="{ lightbox: false, current: 0 }">
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<h2 class="text-section-title text-center mb-8">Galerie</h2>
|
||||
|
||||
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-3 gap-4">
|
||||
@foreach ($project['gallery'] as $index => $image)
|
||||
<div class="relative aspect-[4/3] rounded-xl overflow-hidden cursor-pointer group"
|
||||
@click="lightbox = true; current = {{ $index }}">
|
||||
<x-web-picture
|
||||
src="{{ theme_image_url($image) }}"
|
||||
alt="{{ $project['title'] ?? '' }} – Bild {{ $index + 1 }}"
|
||||
class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" />
|
||||
<div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300"></div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{-- Lightbox (via x-teleport ins body, umgeht alle Eltern-Constraints) --}}
|
||||
<template x-teleport="body">
|
||||
<div x-show="lightbox" x-cloak
|
||||
x-transition:enter="transition ease-out duration-300"
|
||||
x-transition:enter-start="opacity-0"
|
||||
x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="transition ease-in duration-200"
|
||||
x-transition:leave-start="opacity-100"
|
||||
x-transition:leave-end="opacity-0"
|
||||
class="fixed inset-0 z-50 isolate bg-black/90"
|
||||
@keydown.escape.window="lightbox = false"
|
||||
@keydown.arrow-right.window="current = (current + 1) % {{ count($project['gallery']) }}"
|
||||
@keydown.arrow-left.window="current = (current - 1 + {{ count($project['gallery']) }}) % {{ count($project['gallery']) }}">
|
||||
|
||||
{{-- Bildbereich (eigene Ebene, dahinter) --}}
|
||||
<div class="absolute inset-0 flex items-center justify-center p-4 z-0">
|
||||
@foreach ($project['gallery'] as $index => $image)
|
||||
<x-web-picture x-show="current === {{ $index }}"
|
||||
x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 scale-95"
|
||||
x-transition:enter-end="opacity-100 scale-100"
|
||||
src="{{ theme_image_url($image) }}"
|
||||
alt="{{ $project['title'] ?? '' }} – Bild {{ $index + 1 }}"
|
||||
class="max-h-[85vh] max-w-[90vw] object-contain rounded-lg"
|
||||
loading="" />
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
{{-- Close Button (oben rechts mit Abstand) --}}
|
||||
<button @click="lightbox = false"
|
||||
class="cursor-pointer absolute top-6 left-auto right-6 z-10 flex items-center justify-center w-12 h-12 rounded-full bg-white/10 hover:bg-white/20 text-white/90 hover:text-white border border-white/20 transition-all">
|
||||
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
{{-- Previous (links, vertikal mittig) --}}
|
||||
<button @click="current = (current - 1 + {{ count($project['gallery']) }}) % {{ count($project['gallery']) }}"
|
||||
class="cursor-pointer absolute left-6 top-1/2 -translate-y-1/2 z-10 flex items-center justify-center w-14 h-14 rounded-full bg-white/10 hover:bg-white/20 text-white/90 hover:text-white border border-white/20 transition-all">
|
||||
<svg class="w-7 h-7" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
{{-- Next (rechts, vertikal mittig) --}}
|
||||
<button @click="current = (current + 1) % {{ count($project['gallery']) }}"
|
||||
class="cursor-pointer absolute left-auto right-6 top-1/2 -translate-y-1/2 z-10 flex items-center justify-center w-14 h-14 rounded-full bg-white/10 hover:bg-white/20 text-white/90 hover:text-white border border-white/20 transition-all">
|
||||
<svg class="w-7 h-7" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
{{-- Counter --}}
|
||||
<div class="absolute bottom-4 left-1/2 -translate-x-1/2 z-10 text-white/60 text-sm">
|
||||
<span x-text="current + 1"></span> / {{ count($project['gallery']) }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- 5. Trust-Block: Investorenschutz (pro Projekt im CMS, siehe investor_trust) --}}
|
||||
@php
|
||||
$trust = $project['investor_trust'] ?? [];
|
||||
$trustColumns = $trust['columns'] ?? [];
|
||||
@endphp
|
||||
@if (! empty($trust['title']) || count($trustColumns) > 0)
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
@if (! empty($trust['title']) || ! empty($trust['intro']))
|
||||
<div class="text-center mb-10">
|
||||
@if (! empty($trust['title']))
|
||||
<h2 class="text-section-title">{{ $trust['title'] }}</h2>
|
||||
@endif
|
||||
@if (! empty($trust['intro']))
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
{{ $trust['intro'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (count($trustColumns) > 0)
|
||||
<div class="grid md:grid-cols-3 gap-6 mb-10">
|
||||
@foreach ($trustColumns as $col)
|
||||
<div class="card-elevated rounded-2xl p-6 text-center">
|
||||
<div class="inline-flex items-center justify-center w-14 h-14 rounded-full bg-secondary/10 text-secondary mb-5">
|
||||
@if (! empty($col['icon']))
|
||||
@svg($col['icon'], 'w-7 h-7')
|
||||
@endif
|
||||
</div>
|
||||
<h3 class="text-base font-semibold text-foreground mb-3">{{ $col['title'] ?? '' }}</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">
|
||||
{{ $col['text'] ?? '' }}
|
||||
</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (! empty($trust['cta_url']) && ! empty($trust['cta_label']))
|
||||
<div class="text-center">
|
||||
<a href="{{ $trust['cta_url'] }}" class="btn-secondary-accent transition-colors duration-200">
|
||||
<span class="flex items-center justify-center gap-2">
|
||||
@svg('heroicon-o-book-open', 'w-4 h-4')
|
||||
<span>{{ $trust['cta_label'] }}</span>
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
||||
</svg>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- 6. Location & Map --}}
|
||||
@if (!empty($project['location_info']))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto">
|
||||
<h2 class="text-section-title text-left">{{ $project['location_info']['title'] ?? '' }}</h2>
|
||||
|
||||
@if (!empty($project['location_info']['points']))
|
||||
<ul class="mt-8 space-y-4">
|
||||
@foreach ($project['location_info']['points'] as $point)
|
||||
<li class="flex items-start gap-3 text-muted-foreground">
|
||||
<svg class="w-5 h-5 text-secondary mt-0.5 shrink-0 inline-block" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 10.5a3 3 0 11-6 0 3 3 0 016 0z" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z" />
|
||||
</svg>
|
||||
{{ $point }}
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
|
||||
@if (isset($project['location_info']['map_url']))
|
||||
<div class="mt-8 text-center">
|
||||
<a href="{{ $project['location_info']['map_url'] }}"
|
||||
target="_blank" rel="noopener"
|
||||
class="inline-flex items-center gap-2 btn-secondary-accent">
|
||||
<svg class="w-4 h-4 inline-block mr-2 mb-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7" />
|
||||
</svg>
|
||||
Auf Google Maps ansehen
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Möbel-Vorteil / Synergie (pro Projekt: furniture_benefit; Fallback: Theme-Config) --}}
|
||||
@php
|
||||
$moebelVorteil = $project['furniture_benefit'] ?? [];
|
||||
if (empty($moebelVorteil) || (empty($moebelVorteil['title'] ?? null) && empty($moebelVorteil['text'] ?? null))) {
|
||||
$moebelVorteil = cms_theme_section('immobilien_moebel_vorteil');
|
||||
}
|
||||
@endphp
|
||||
@if (! empty($moebelVorteil))
|
||||
<section class="section-padding bg-secondary/5">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center">
|
||||
<h2 class="text-section-title">{!! $moebelVorteil['title'] ?? '' !!}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4">
|
||||
{{ $moebelVorteil['text'] ?? '' }}
|
||||
</p>
|
||||
@if (! empty($moebelVorteil['button_text'] ?? null))
|
||||
<div class="mt-8">
|
||||
<a href="{{ $moebelVorteil['button_link'] ?? '/partner' }}"
|
||||
class="btn-secondary-accent">
|
||||
{{ $moebelVorteil['button_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- 7. Lead-Generierung / Kontakt --}}
|
||||
@if (!empty($project['contact']))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-2xl mx-auto text-center">
|
||||
<h2 class="text-section-title">{{ $project['contact']['title'] ?? '' }}</h2>
|
||||
@if (isset($project['contact']['subtitle']))
|
||||
<p class="text-large text-muted-foreground mt-3">{{ $project['contact']['subtitle'] }}</p>
|
||||
@endif
|
||||
|
||||
<div class="mt-8 card-elevated rounded-2xl p-8 text-left">
|
||||
<livewire:web.components.sections.immobilien-contact-form
|
||||
:projectSlug="$project['slug'] ?? ''"
|
||||
:projectTitle="$project['title'] ?? ''"
|
||||
:interestOptions="$project['contact']['options'] ?? []"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
|
|
@ -1,314 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Immobilien Dubai - B2in')
|
||||
@section('meta_description', 'Exklusive Off-Market-Immobilien in Dubai. Persönliche Beratung, steuerfreie Renditen & Turnkey-Einrichtung aus einer Hand.')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
@php
|
||||
$heroV2 = cms_theme_section('immobilien_hero_v2');
|
||||
$warumDubai = cms_theme_section('immobilien_warum_dubai');
|
||||
$kaufprozess = cms_theme_section('immobilien_kaufprozess');
|
||||
$bruecke = cms_theme_section('immobilien_bruecke');
|
||||
$mindset = cms_theme_section('immobilien_mindset');
|
||||
$projects = cms_theme_section('immobilien_projects');
|
||||
$moebelVorteil = cms_theme_section('immobilien_moebel_vorteil');
|
||||
@endphp
|
||||
|
||||
{{-- Sektion 1: Hero --}}
|
||||
@if (!empty($heroV2))
|
||||
<section class="relative min-h-[70vh] flex items-center overflow-hidden">
|
||||
<x-web-picture
|
||||
src="{{ theme_image_url($heroV2['image'] ?? '') }}"
|
||||
alt="{{ $heroV2['image_alt'] ?? 'Immobilien Investment Dubai' }}"
|
||||
class="absolute inset-0 w-full h-full object-cover"
|
||||
loading="" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-black/80 via-black/60 to-black/30"></div>
|
||||
<div class="relative z-10 container-padding py-24 lg:py-32">
|
||||
<div class="max-w-3xl slide-right delay-300">
|
||||
<h1 class="text-4xl lg:text-5xl xl:text-6xl font-bold text-white leading-tight">
|
||||
{!! $heroV2['title'] !!}
|
||||
</h1>
|
||||
<p class="text-lg lg:text-xl text-white/80 mt-6 max-w-2xl leading-relaxed">
|
||||
{{ $heroV2['subtitle'] ?? '' }}
|
||||
</p>
|
||||
@if (isset($heroV2['cta_text']))
|
||||
<div class="mt-10">
|
||||
<a href="{{ $heroV2['cta_link'] ?? '#projekte' }}"
|
||||
class="btn-primary-accent px-8 py-4 text-lg">
|
||||
{{ $heroV2['cta_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
|
||||
{{-- Sektion 2: Warum Dubai? --}}
|
||||
@if (!empty($warumDubai))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $warumDubai['title'] !!}</h2>
|
||||
@if (isset($warumDubai['intro']))
|
||||
<p class="text-large text-muted-foreground mt-4 leading-relaxed">
|
||||
{{ $warumDubai['intro'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="grid sm:grid-cols-2 lg:grid-cols-3 gap-6 max-w-5xl mx-auto">
|
||||
@foreach ($warumDubai['facts'] ?? [] as $index => $fact)
|
||||
<div class="card-elevated rounded-2xl p-6 lg:p-8 text-center slide-up delay-{{ 300 + $index * 100 }}">
|
||||
<div class="inline-flex items-center justify-center w-14 h-14 rounded-full bg-secondary/10 text-secondary mb-5">
|
||||
@svg('heroicon-o-' . ($fact['icon'] ?? 'check'), 'w-7 h-7')
|
||||
</div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">{{ $fact['title'] ?? '' }}</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">{{ $fact['description'] ?? '' }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
<livewire:web.components.sections.image-break section="immobilien_image_break" />
|
||||
|
||||
{{-- Sektion 3: Kaufprozess --}}
|
||||
@if (!empty($kaufprozess))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $kaufprozess['title'] !!}</h2>
|
||||
@if (isset($kaufprozess['intro']))
|
||||
<p class="text-large text-muted-foreground mt-4 leading-relaxed">
|
||||
{{ $kaufprozess['intro'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="grid md:grid-cols-2 gap-6">
|
||||
@foreach ($kaufprozess['steps'] ?? [] as $index => $step)
|
||||
<div class="relative card-elevated rounded-2xl p-6 lg:p-8 slide-up delay-{{ 300 + $index * 100 }}">
|
||||
<div class="flex gap-5 items-start">
|
||||
<div class="shrink-0 w-12 h-12 rounded-full bg-secondary text-white flex items-center justify-center text-lg font-bold">
|
||||
{{ $step['number'] ?? '' }}
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">{{ $step['title'] ?? '' }}</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">{{ $step['description'] ?? '' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Sektion 4: Die Brücke – Marcels Pitch --}}
|
||||
@if (!empty($bruecke))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
|
||||
<div class="relative lg:order-1">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden slide-left delay-400">
|
||||
<x-web-picture
|
||||
src="{{ theme_image_url($bruecke['image'] ?? '') }}"
|
||||
alt="{{ $bruecke['image_alt'] ?? 'Marcel Scheibe – Ihre Brücke nach Dubai' }}"
|
||||
class="w-full h-[500px] object-cover" />
|
||||
@if (isset($bruecke['image_caption']))
|
||||
<div class="absolute bottom-6 left-6 bg-card/95 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-border/50 slide-left delay-500">
|
||||
{{ $bruecke['image_caption'] }}
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="spacing-section lg:order-2">
|
||||
<div class="spacing-content slide-right delay-300">
|
||||
<h2 class="text-section-title">{!! $bruecke['title'] !!}</h2>
|
||||
<div class="spacing-small text-large text-muted-foreground leading-relaxed">
|
||||
@foreach ($bruecke['paragraphs'] ?? [] as $paragraph)
|
||||
<p>{!! $paragraph !!}</p>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@if (isset($bruecke['advantage_title']))
|
||||
<div class="mt-8 p-6 rounded-2xl bg-secondary/5 border border-secondary/20">
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">{{ $bruecke['advantage_title'] }}</h3>
|
||||
<p class="text-muted-foreground leading-relaxed">{{ $bruecke['advantage_text'] ?? '' }}</p>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if (isset($bruecke['cta_text']))
|
||||
<div class="mt-8">
|
||||
<a href="{{ $bruecke['cta_link'] ?? '/contact' }}"
|
||||
class="btn-primary-accent px-6 py-3">
|
||||
{{ $bruecke['cta_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Aktuelle Projekte --}}
|
||||
@if (!empty($projects))
|
||||
<section id="projekte" class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $projects['title'] ?? '' !!}</h2>
|
||||
@if (isset($projects['subtitle']))
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
{{ $projects['subtitle'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@php
|
||||
$projectCount = count($projects['projects'] ?? []);
|
||||
@endphp
|
||||
<div class="grid md:grid-cols-1 lg:grid-cols-2 gap-8 slide-up delay-400">
|
||||
@foreach ($projects['projects'] ?? [] as $project)
|
||||
<div class="card-elevated rounded-2xl overflow-hidden {{ $projectCount === 1 ? 'lg:col-span-2 lg:max-w-[calc((100%-2rem)/2)] lg:mx-auto' : '' }}">
|
||||
@if (isset($project['image']))
|
||||
<div class="relative h-56 overflow-hidden">
|
||||
<x-web-picture
|
||||
src="{{ theme_image_url($project['image']) }}"
|
||||
alt="{{ $project['title'] }}"
|
||||
class="w-full h-full object-cover" />
|
||||
@if (isset($project['status']))
|
||||
<div class="absolute top-4 left-4">
|
||||
<span class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-semibold bg-secondary text-white">
|
||||
{{ $project['status'] }}
|
||||
@if (isset($project['launch_date']))
|
||||
<span class="opacity-80">({{ $project['launch_date'] }})</span>
|
||||
@endif
|
||||
</span>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="p-6 lg:p-8">
|
||||
<div class="mb-4">
|
||||
<h3 class="text-xl font-semibold text-foreground">{{ $project['title'] }}</h3>
|
||||
@if (isset($project['location']))
|
||||
<p class="text-sm text-muted-foreground mt-1">{{ $project['location'] }}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if (isset($project['price_from']))
|
||||
<p class="text-lg font-medium text-secondary mb-4">{{ $project['price_from'] }}</p>
|
||||
@endif
|
||||
|
||||
@if (isset($project['highlights']))
|
||||
<ul class="space-y-2 mb-6">
|
||||
@foreach ($project['highlights'] as $highlight)
|
||||
<li class="flex items-start gap-2 text-sm text-muted-foreground">
|
||||
<svg class="w-4 h-4 text-secondary mt-0.5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
{{ $highlight }}
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
|
||||
<a href="{{ isset($project['slug']) ? route('immobilien.show', $project['slug']) : ($projects['cta_link'] ?? '/contact') }}"
|
||||
class="inline-flex items-center gap-2 whitespace-nowrap btn-primary-accent">
|
||||
<span>{{ isset($project['slug']) ? 'Exposé ansehen' : ($projects['cta_text'] ?? 'Anfragen') }}</span>
|
||||
<svg class="w-4 h-4 shrink-0 inline-block ml-2 mb-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Sektion 5: Mindset-Check --}}
|
||||
@if (!empty($mindset))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-4xl mx-auto">
|
||||
<div class="rounded-2xl border-2 border-secondary/20 bg-secondary/5 p-8 lg:p-12 slide-up delay-300">
|
||||
<h2 class="text-section-title text-center">{!! $mindset['title'] !!}</h2>
|
||||
|
||||
<div class="mt-8 space-y-6 text-large leading-relaxed">
|
||||
@if (isset($mindset['text_positive']))
|
||||
<p class="text-foreground">{!! $mindset['text_positive'] !!}</p>
|
||||
@endif
|
||||
@if (isset($mindset['text_negative']))
|
||||
<p class="text-muted-foreground">{{ $mindset['text_negative'] }}</p>
|
||||
@endif
|
||||
@if (isset($mindset['closing']))
|
||||
<p class="text-foreground pt-4 border-t border-secondary/20">{!! $mindset['closing'] !!}</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if (isset($mindset['cta_text']))
|
||||
<div class="mt-8 text-center">
|
||||
<a href="{{ $mindset['cta_link'] ?? '/contact' }}"
|
||||
class="btn-primary-accent px-8 py-4 text-lg">
|
||||
{{ $mindset['cta_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Möbel-Vorteil Banner (Teaser) --}}
|
||||
@if (!empty($moebelVorteil))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $moebelVorteil['title'] ?? '' !!}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4">
|
||||
{{ $moebelVorteil['text'] ?? '' }}
|
||||
</p>
|
||||
@if (isset($moebelVorteil['button_text']))
|
||||
<div class="mt-8">
|
||||
<a href="{{ $moebelVorteil['button_link'] ?? '/netzwerk' }}"
|
||||
class="btn-secondary-accent">
|
||||
{{ $moebelVorteil['button_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Einrichtungsnetzwerk - B2in Interior')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.partner-hero section="interior_hero" />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
|
||||
{{-- Local-for-Local Konzept --}}
|
||||
<livewire:web.components.sections.content-section section="interior_concept" layout="left" />
|
||||
|
||||
{{-- Zwei Marken --}}
|
||||
@php
|
||||
$brands = cms_theme_section('interior_brands');
|
||||
$zielgruppen = cms_theme_section('interior_zielgruppen');
|
||||
$process = cms_theme_section('interior_process');
|
||||
@endphp
|
||||
|
||||
@if (!empty($brands))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $brands['title'] ?? '' !!}</h2>
|
||||
@if (isset($brands['subtitle']))
|
||||
<p class="text-large text-muted-foreground mt-4 max-w-2xl mx-auto">
|
||||
{{ $brands['subtitle'] }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-2 gap-8 max-w-4xl mx-auto slide-up delay-400">
|
||||
@foreach ($brands['brands'] ?? [] as $brand)
|
||||
<div class="card-elevated rounded-2xl overflow-hidden">
|
||||
<div class="p-8 lg:p-10">
|
||||
@if (isset($brand['logo']))
|
||||
<div class="mb-6">
|
||||
<img src="{{ asset($brand['logo']) }}"
|
||||
alt="{{ $brand['name'] }}"
|
||||
class="{{ $brand['logo_width'] ?? 'w-32' }}" />
|
||||
</div>
|
||||
@endif
|
||||
<p class="text-xs font-semibold uppercase tracking-wider text-secondary mb-3">
|
||||
{{ $brand['tagline'] ?? '' }}
|
||||
</p>
|
||||
<p class="text-muted-foreground leading-relaxed">
|
||||
{{ $brand['description'] ?? '' }}
|
||||
</p>
|
||||
@if (isset($brand['audience']))
|
||||
<p class="text-sm font-medium text-foreground mt-4">
|
||||
{{ $brand['audience'] }}
|
||||
</p>
|
||||
@endif
|
||||
@if (isset($brand['link']))
|
||||
<div class="mt-6">
|
||||
<a href="{{ $brand['link'] }}"
|
||||
target="_blank" rel="noopener"
|
||||
class="inline-flex items-center gap-2 text-sm font-medium text-secondary hover:text-secondary/80 transition-colors">
|
||||
{{ $brand['name'] }} entdecken
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Für wen? Zielgruppen --}}
|
||||
@if (!empty($zielgruppen))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $zielgruppen['title'] ?? '' !!}</h2>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto slide-up delay-400">
|
||||
@foreach ($zielgruppen['groups'] ?? [] as $group)
|
||||
<div class="text-center p-6">
|
||||
<div class="inline-flex items-center justify-center w-14 h-14 rounded-full bg-secondary/10 text-secondary mb-5">
|
||||
<svg class="w-7 h-7" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
|
||||
@switch($group['icon'] ?? '')
|
||||
@case('home')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25" />
|
||||
@break
|
||||
@case('building-office-2')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 21h19.5m-18-18v18m10.5-18v18m6-13.5V21M6.75 6.75h.75m-.75 3h.75m-.75 3h.75m3-6h.75m-.75 3h.75m-.75 3h.75M6.75 21v-3.375c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21M3 3h12m-.75 4.5H21m-3.75 3.75h.008v.008h-.008v-.008zm0 3h.008v.008h-.008v-.008zm0 3h.008v.008h-.008v-.008z" />
|
||||
@break
|
||||
@case('clipboard-document-check')
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M11.35 3.836c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m8.9-4.414c.376.023.75.05 1.124.08 1.131.094 1.976 1.057 1.976 2.192V16.5A2.25 2.25 0 0118 18.75h-2.25m-7.5-10.5H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V18.75m-7.5-10.5h6.375c.621 0 1.125.504 1.125 1.125v9.375m-8.25-3l1.5 1.5 3-3.75" />
|
||||
@break
|
||||
@endswitch
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-3">{{ $group['title'] ?? '' }}</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed">{{ $group['description'] ?? '' }}</p>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- So funktioniert es - Prozess --}}
|
||||
@if (!empty($process))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $process['title'] ?? '' !!}</h2>
|
||||
</div>
|
||||
|
||||
<div class="max-w-3xl mx-auto slide-up delay-400">
|
||||
<div class="space-y-8">
|
||||
@foreach ($process['steps'] ?? [] as $step)
|
||||
<div class="flex gap-6 items-start">
|
||||
<div class="shrink-0 w-14 h-14 rounded-full bg-secondary text-white flex items-center justify-center text-lg font-bold">
|
||||
{{ $step['number'] ?? '' }}
|
||||
</div>
|
||||
<div class="pt-2">
|
||||
<h3 class="text-lg font-semibold text-foreground mb-2">{{ $step['title'] ?? '' }}</h3>
|
||||
<p class="text-muted-foreground leading-relaxed">{{ $step['description'] ?? '' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Trust / Marcel Scheibe --}}
|
||||
<livewire:web.components.sections.content-section section="interior_trust" layout="right" />
|
||||
|
||||
{{-- CTA --}}
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,154 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="dark">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
|
||||
<title>@yield('title', $domainName ?? 'Admin - ' . config('app.name'))</title>
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" href="{{ asset('img/favicons/admin-favicon.ico') }}">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600,700" rel="stylesheet" />
|
||||
|
||||
<!-- Styles -->
|
||||
@vite([
|
||||
\App\Helpers\ThemeHelper::getThemeCssPath(),
|
||||
'resources/js/app.js'
|
||||
], 'build/' . $theme)
|
||||
|
||||
{{-- @vite(['resources/css/admin.css', 'resources/js/app.js']) --}}
|
||||
|
||||
<!-- Additional Styles -->
|
||||
@stack('styles')
|
||||
</head>
|
||||
<body class="antialiased bg-gray-50 dark:bg-gray-900">
|
||||
<div class="min-h-screen flex">
|
||||
<!-- Sidebar Navigation -->
|
||||
<aside class="w-64 bg-white dark:bg-gray-800 shadow-md hidden md:block">
|
||||
<div class="p-6">
|
||||
<a href="{{ route('admin.home') }}" class="text-xl font-bold text-gray-900 dark:text-white">
|
||||
{{ $domainName ?? config('app.name') . ' Admin' }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<nav class="mt-10 px-6">
|
||||
<a href="{{ route('admin.dashboard') }}" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-100 dark:hover:bg-gray-700 {{ request()->routeIs('admin.dashboard') ? 'bg-gray-100 dark:bg-gray-700' : '' }}">
|
||||
Dashboard
|
||||
</a>
|
||||
<a href="{{ route('admin.settings.profile') }}" class="block py-2.5 px-4 rounded transition duration-200 hover:bg-gray-100 dark:hover:bg-gray-700 {{ request()->routeIs('admin.settings.profile') ? 'bg-gray-100 dark:bg-gray-700' : '' }}">
|
||||
Profil
|
||||
</a>
|
||||
<!-- Weitere Navigationspunkte hier -->
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<div class="flex-1 flex flex-col">
|
||||
<!-- Top Navigation -->
|
||||
<header class="bg-white dark:bg-gray-800 shadow-sm">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between h-16">
|
||||
<div class="flex items-center md:hidden">
|
||||
<!-- Mobile menu button -->
|
||||
<button type="button" class="text-gray-500 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" id="mobile-menu-button">
|
||||
<span class="sr-only">Menu öffnen</span>
|
||||
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
@if(app()->environment('local'))
|
||||
<!-- Domain-Informationsanzeige (nur in local) -->
|
||||
<div class="mr-4 text-xs px-2 py-1 rounded bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-200">
|
||||
{{ Request::getHost() }}
|
||||
@if(config('domains.dev_settings.simulate_domain'))
|
||||
<span class="inline-flex items-center ml-1 px-1.5 py-0.5 rounded-full text-xs bg-yellow-100 text-yellow-800">
|
||||
Simuliert
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- User Dropdown -->
|
||||
<div class="ml-3 relative">
|
||||
<div>
|
||||
<button type="button" class="flex text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" id="user-menu-button">
|
||||
<span class="sr-only">Benutzermenü öffnen</span>
|
||||
<div class="h-8 w-8 rounded-full bg-gray-200 flex items-center justify-center">
|
||||
<span class="text-xs font-medium">{{ Auth::user()->name[0] ?? 'U' }}</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Dropdown menu -->
|
||||
<div class="hidden origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg py-1 bg-white dark:bg-gray-700 ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" id="user-menu">
|
||||
<a href="{{ route('admin.settings.profile') }}" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600" role="menuitem">Profil</a>
|
||||
<a href="{{ route('admin.settings.appearance') }}" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600" role="menuitem">Einstellungen</a>
|
||||
<form method="POST" action="{{ route('auth.logout') }}">
|
||||
@csrf
|
||||
<button type="submit" class="block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-600" role="menuitem">Abmelden</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Mobile menu (off-canvas) -->
|
||||
<div class="md:hidden hidden" id="mobile-menu">
|
||||
<div class="px-2 pt-2 pb-3 space-y-1 bg-white dark:bg-gray-800 shadow-lg">
|
||||
<a href="{{ route('admin.dashboard') }}" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700">Dashboard</a>
|
||||
<a href="{{ route('admin.settings.profile') }}" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700">Profil</a>
|
||||
<!-- Weitere mobile Navigationspunkte hier -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Page Content -->
|
||||
<main class="flex-1 py-10">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
@yield('content')
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script>
|
||||
// Toggle user dropdown
|
||||
const userMenuButton = document.getElementById('user-menu-button');
|
||||
const userMenu = document.getElementById('user-menu');
|
||||
|
||||
if (userMenuButton && userMenu) {
|
||||
userMenuButton.addEventListener('click', function() {
|
||||
userMenu.classList.toggle('hidden');
|
||||
});
|
||||
|
||||
// Close the dropdown when clicked outside
|
||||
document.addEventListener('click', function(event) {
|
||||
if (!userMenuButton.contains(event.target) && !userMenu.contains(event.target)) {
|
||||
userMenu.classList.add('hidden');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Mobile menu toggle
|
||||
const mobileMenuButton = document.getElementById('mobile-menu-button');
|
||||
const mobileMenu = document.getElementById('mobile-menu');
|
||||
|
||||
if (mobileMenuButton && mobileMenu) {
|
||||
mobileMenuButton.addEventListener('click', function() {
|
||||
mobileMenu.classList.toggle('hidden');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<!-- Additional Scripts -->
|
||||
@stack('scripts')
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
<footer class="bg-white">
|
||||
<div class="mx-auto max-w-7xl px-6 pt-12 pb-8 sm:pt-16 lg:px-8 lg:pt-16">
|
||||
<div class="xl:grid xl:grid-cols-3 xl:gap-8">
|
||||
<img class="h-9" src="https://tailwindcss.com/plus-assets/img/logos/mark.svg?color=indigo&shade=600" alt="Company name">
|
||||
<div class="mt-16 grid grid-cols-2 gap-8 xl:col-span-2 xl:mt-0">
|
||||
<div class="md:grid md:grid-cols-2 md:gap-8">
|
||||
<div>
|
||||
<h3 class="text-sm/6 font-semibold text-gray-900">Solutions</h3>
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Marketing</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Analytics</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Automation</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Commerce</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Insights</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="mt-10 md:mt-0">
|
||||
<h3 class="text-sm/6 font-semibold text-gray-900">Support</h3>
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Submit ticket</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Documentation</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Guides</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md:grid md:grid-cols-2 md:gap-8">
|
||||
<div>
|
||||
<h3 class="text-sm/6 font-semibold text-gray-900">Company</h3>
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">About</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Blog</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Jobs</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Press</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="mt-10 md:mt-0">
|
||||
<h3 class="text-sm/6 font-semibold text-gray-900">Legal</h3>
|
||||
<ul role="list" class="mt-6 space-y-4">
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Terms of service</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">Privacy policy</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" class="text-sm/6 text-gray-600 hover:text-gray-900">License</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-16 border-t border-gray-900/10 pt-8 sm:mt-20 lg:mt-24 lg:flex lg:items-center lg:justify-between">
|
||||
<div>
|
||||
<h3 class="text-sm/6 font-semibold text-gray-900">Subscribe to our newsletter</h3>
|
||||
<p class="mt-2 text-sm/6 text-gray-600">The latest news, articles, and resources, sent to your inbox weekly.</p>
|
||||
</div>
|
||||
<form class="mt-6 sm:flex sm:max-w-md lg:mt-0">
|
||||
<label for="email-address" class="sr-only">Email address</label>
|
||||
<input type="email" name="email-address" id="email-address" autocomplete="email" required class="w-full min-w-0 rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline-2 focus:-outline-offset-2 focus:outline-indigo-600 sm:w-56 sm:text-sm/6" placeholder="Enter your email">
|
||||
<div class="mt-4 sm:mt-0 sm:ml-4 sm:shrink-0">
|
||||
<button type="submit" class="flex w-full items-center justify-center rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-indigo-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Subscribe</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="mt-8 border-t border-gray-900/10 pt-8 md:flex md:items-center md:justify-between">
|
||||
<div class="flex gap-x-6 md:order-2">
|
||||
<a href="#" class="text-gray-600 hover:text-gray-800">
|
||||
<span class="sr-only">Facebook</span>
|
||||
<svg class="size-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="text-gray-600 hover:text-gray-800">
|
||||
<span class="sr-only">Instagram</span>
|
||||
<svg class="size-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="text-gray-600 hover:text-gray-800">
|
||||
<span class="sr-only">X</span>
|
||||
<svg class="size-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M13.6823 10.6218L20.2391 3H18.6854L12.9921 9.61788L8.44486 3H3.2002L10.0765 13.0074L3.2002 21H4.75404L10.7663 14.0113L15.5685 21H20.8131L13.6819 10.6218H13.6823ZM11.5541 13.0956L10.8574 12.0991L5.31391 4.16971H7.70053L12.1742 10.5689L12.8709 11.5655L18.6861 19.8835H16.2995L11.5541 13.096V13.0956Z" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="text-gray-600 hover:text-gray-800">
|
||||
<span class="sr-only">GitHub</span>
|
||||
<svg class="size-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="text-gray-600 hover:text-gray-800">
|
||||
<span class="sr-only">YouTube</span>
|
||||
<svg class="size-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path fill-rule="evenodd" d="M19.812 5.418c.861.23 1.538.907 1.768 1.768C21.998 8.746 22 12 22 12s0 3.255-.418 4.814a2.504 2.504 0 0 1-1.768 1.768c-1.56.419-7.814.419-7.814.419s-6.255 0-7.814-.419a2.505 2.505 0 0 1-1.768-1.768C2 15.255 2 12 2 12s0-3.255.417-4.814a2.507 2.507 0 0 1 1.768-1.768C5.744 5 11.998 5 11.998 5s6.255 0 7.814.418ZM15.194 12 10 15V9l5.194 3Z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
<p class="mt-8 text-sm/6 text-gray-600 md:order-1 md:mt-0">© 2024 Your Company, Inc. All rights reserved.</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
@ -1,232 +0,0 @@
|
|||
<!--
|
||||
Mobile menu
|
||||
|
||||
Off-canvas menu for mobile, show/hide based on off-canvas menu state.
|
||||
-->
|
||||
<div class="relative z-40 lg:hidden" role="dialog" aria-modal="true" x-show="mobileMenuOpen" x-cloak>
|
||||
<!--
|
||||
Off-canvas menu backdrop, show/hide based on off-canvas menu state.
|
||||
|
||||
Entering: "transition-opacity ease-linear duration-300"
|
||||
From: "opacity-0"
|
||||
To: "opacity-100"
|
||||
Leaving: "transition-opacity ease-linear duration-300"
|
||||
From: "opacity-100"
|
||||
To: "opacity-0"
|
||||
-->
|
||||
<div class="fixed inset-0 bg-black/50" aria-hidden="true"
|
||||
x-show="mobileMenuOpen"
|
||||
@click.stop="mobileMenuOpen = false"
|
||||
x-transition:enter="transition-opacity ease-linear duration-300"
|
||||
x-transition:enter-start="opacity-0"
|
||||
x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="transition-opacity ease-linear duration-300"
|
||||
x-transition:leave-start="opacity-100"
|
||||
x-transition:leave-end="opacity-0"></div>
|
||||
|
||||
<div class="fixed inset-0 z-40 flex" x-show="mobileMenuOpen" @mousedown.away="mobileMenuOpen = false">
|
||||
<!--
|
||||
Off-canvas menu, show/hide based on off-canvas menu state.
|
||||
|
||||
Entering: "transition ease-in-out duration-300 transform"
|
||||
From: "-translate-x-full"
|
||||
To: "translate-x-0"
|
||||
Leaving: "transition ease-in-out duration-300 transform"
|
||||
From: "translate-x-0"
|
||||
To: "-translate-x-full"
|
||||
-->
|
||||
<div class="relative flex w-full max-w-xs flex-col overflow-y-auto bg-white pb-12 shadow-xl"
|
||||
x-show="mobileMenuOpen"
|
||||
@click.away="mobileMenuOpen = false"
|
||||
x-transition:enter="transition ease-in-out duration-300 transform"
|
||||
x-transition:enter-start="-translate-x-full"
|
||||
x-transition:enter-end="translate-x-0"
|
||||
x-transition:leave="transition ease-in-out duration-300 transform"
|
||||
x-transition:leave-start="translate-x-0"
|
||||
x-transition:leave-end="-translate-x-full">
|
||||
<div class="flex px-4 pt-5 pb-2">
|
||||
<button type="button" class="-m-2 inline-flex items-center justify-center rounded-md p-2 text-gray-400 pointer-events-auto cursor-pointer" @click="mobileMenuOpen = false">
|
||||
<span class="sr-only">Close menu</span>
|
||||
<svg class="size-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Links -->
|
||||
<div class="space-y-6 border-t border-gray-200 px-4 py-4">
|
||||
<div class="flow-root">
|
||||
<a href="#" class="-m-2 block p-3 font-medium text-gray-900 hover:text-gray-900 hover:bg-gray-100 rounded-md">Start</a>
|
||||
</div>
|
||||
<div class="flow-root">
|
||||
<a href="#" class="-m-2 block p-3 font-medium text-gray-900 hover:text-gray-900 hover:bg-gray-100 rounded-md">About</a>
|
||||
</div>
|
||||
<div class="flow-root">
|
||||
<a href="#" class="-m-2 block p-3 font-medium text-gray-900 hover:text-gray-900 hover:bg-gray-100 rounded-md">Company</a>
|
||||
</div>
|
||||
<div class="flow-root">
|
||||
<a href="#" class="-m-2 block p-3 font-medium text-gray-900 hover:text-gray-900 hover:bg-gray-100 rounded-md">Stores</a>
|
||||
</div>
|
||||
<div class="flow-root">
|
||||
<a href="#" class="-m-2 block p-3 font-medium text-gray-900 hover:text-gray-900 hover:bg-gray-100 rounded-md">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6 border-t border-gray-200 px-4 py-6">
|
||||
<div class="flow-root">
|
||||
<a href="#" class="-m-2 block p-2 font-semibold text-white rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm shadow-xs hover:bg-indigo-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Create an account</a>
|
||||
</div>
|
||||
<div class="flow-root">
|
||||
<a href="{{ config('domains.domain_admin_url') }}/login" class="-m-2 block p-2 font-semibold text-white rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm shadow-xs hover:bg-indigo-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Sign in</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="space-y-6 border-t border-gray-200 px-4 py-6">
|
||||
<!-- Currency selector -->
|
||||
<form>
|
||||
<div class="-ml-2 inline-grid grid-cols-1">
|
||||
<div class="flex items-center">
|
||||
<svg class="size-6 text-gray-500 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
<select id="mobile-currency" name="currency" aria-label="Currency" class="w-full appearance-none rounded-md bg-white py-0.5 pr-7 pl-2 text-base font-medium text-gray-700 group-hover:text-gray-800 focus:outline-2 sm:text-sm/6">
|
||||
<option>DE</option>
|
||||
<option>EN</option>
|
||||
</select>
|
||||
<svg class="pointer-events-none -ml-6 size-5 fill-gray-500" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<header class="relative z-10">
|
||||
<nav aria-label="Top">
|
||||
<!-- Top navigation -->
|
||||
<div class="bg-gray-900">
|
||||
<div class="mx-auto flex h-10 max-w-7xl items-center justify-between px-4 sm:px-6 lg:px-8">
|
||||
<!-- Currency selector -->
|
||||
<form class="hidden lg:block lg:flex-1">
|
||||
<div class="-ml-2 inline-grid grid-cols-1">
|
||||
<div class="flex items-center">
|
||||
<svg class="size-6 text-gray-300 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
<select id="desktop-currency" name="currency" aria-label="Currency" class="w-full appearance-none rounded-md bg-gray-900 py-0.5 pr-7 pl-2 text-left text-base font-medium text-white focus:outline-2 focus:-outline-offset-1 focus:outline-white sm:text-sm/6">
|
||||
<option>DE</option>
|
||||
<option>EN</option>
|
||||
</select>
|
||||
<svg class="pointer-events-none -ml-6 size-5 fill-gray-300" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd" />
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<p class="flex-1 text-center text-sm font-medium text-white lg:flex-none">Get free delivery on orders over $100</p>
|
||||
|
||||
<div class="hidden lg:flex lg:flex-1 lg:items-center lg:justify-end lg:space-x-6">
|
||||
<a href="#" class="text-sm font-medium text-white hover:text-gray-100">Create an account</a>
|
||||
<span class="h-6 w-px bg-gray-600" aria-hidden="true"></span>
|
||||
<a href="{{ config('domains.domain_admin_url') }}" class="text-sm font-medium text-white hover:text-gray-100">Sign in</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Secondary navigation -->
|
||||
<div class="bg-white">
|
||||
<div class="border-b border-gray-200">
|
||||
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex h-16 items-center justify-between">
|
||||
<!-- Logo (lg+) -->
|
||||
<div class="hidden lg:flex lg:items-center">
|
||||
<a href="#">
|
||||
<span class="sr-only">Your Company</span>
|
||||
<img class="h-8 w-auto" src="https://tailwindcss.com/plus-assets/img/logos/mark.svg?color=indigo&shade=600" alt="">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="hidden h-full lg:flex">
|
||||
<!-- Mega menus -->
|
||||
<div class="ml-8 my-2">
|
||||
<div class="flex h-full justify-center space-x-8">
|
||||
<a href="#" class="flex items-center text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-md px-2 py-1">Start</a>
|
||||
<a href="#" class="flex items-center text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-md px-2 py-1">About</a>
|
||||
<a href="#" class="flex items-center text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-md px-2 py-1">Company</a>
|
||||
<a href="#" class="flex items-center text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-md px-2 py-1">Stores</a>
|
||||
<a href="#" class="flex items-center text-base font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-100 rounded-md px-2 py-1">Contact</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile menu and search (lg-) -->
|
||||
<div class="flex flex-1 items-center lg:hidden">
|
||||
<!-- Mobile menu toggle, controls the 'mobileMenuOpen' state. -->
|
||||
<button type="button" class="-ml-2 rounded-md bg-white p-2 text-gray-400 pointer-events-auto cursor-pointer" @click="mobileMenuOpen = true">
|
||||
<span class="sr-only">Open menu</span>
|
||||
<svg class="size-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<!-- Search -->
|
||||
<a href="#" class="ml-2 p-2 text-gray-400 hover:text-gray-500">
|
||||
<span class="sr-only">Search</span>
|
||||
<svg class="size-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Logo (lg-) -->
|
||||
<a href="#" class="lg:hidden">
|
||||
<span class="sr-only">Your Company</span>
|
||||
<img src="https://tailwindcss.com/plus-assets/img/logos/mark.svg?color=indigo&shade=600" alt="" class="h-8 w-auto">
|
||||
</a>
|
||||
|
||||
<div class="flex flex-1 items-center justify-end">
|
||||
<div class="flex items-center lg:ml-8">
|
||||
<div class="flex space-x-8">
|
||||
<div class="hidden lg:flex">
|
||||
<a href="#" class="-m-2 p-2 text-gray-400 hover:text-gray-500">
|
||||
<span class="sr-only">Search</span>
|
||||
<svg class="size-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="flex">
|
||||
<a href="#" class="-m-2 p-2 text-gray-400 hover:text-gray-500">
|
||||
<span class="sr-only">Account</span>
|
||||
<svg class="size-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<span class="mx-4 h-6 w-px bg-gray-200 lg:mx-6" aria-hidden="true"></span>
|
||||
|
||||
<div class="flow-root">
|
||||
<a href="#" class="group -m-2 flex items-center p-2">
|
||||
<svg class="size-6 shrink-0 text-gray-400 group-hover:text-gray-500" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 0 0-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 0 0-16.536-1.84M7.5 14.25 5.106 5.272M6 20.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm12.75 0a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z" />
|
||||
</svg>
|
||||
<span class="ml-2 text-sm font-medium text-gray-700 group-hover:text-gray-800">0</span>
|
||||
<span class="sr-only">items in cart, view bag</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
|
@ -1,14 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
@php
|
||||
// Farbpalette der Interior-Welt (Nachtrag 18): ohne Schalter setzt der Server die Klasse aus
|
||||
// config('app.palette'); mit Schalter entscheidet das Skript im <head> anhand des localStorage.
|
||||
$paletteFixed = config('app.theme', 'b2in') === 'b2in'
|
||||
&& b2in_world() === 'interior'
|
||||
&& ! config('app.palette_switch')
|
||||
&& b2in_palette() === ''
|
||||
&& config('app.palette') === 'modern';
|
||||
@endphp
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}"{!! $paletteFixed ? ' class="palette-modern"' : '' !!}>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
|
@ -60,40 +51,10 @@
|
|||
|
||||
@php
|
||||
$theme = config('app.theme', 'b2in');
|
||||
// Farb-Schalter nur auf den Interior-Seiten von b2in, solange die Palette abgestimmt wird.
|
||||
$showPaletteSwitch = $theme === 'b2in' && b2in_world() === 'interior' && config('app.palette_switch');
|
||||
// Entwurf /entwurf (Nachtrag 19): feste Palette „greige“ am Body, kein Browser-Schalter.
|
||||
$paletteDraft = b2in_palette() === 'greige';
|
||||
// Global per B2IN_ANNOUNCEMENT_BAR, einzeln per @section('announcement_bar', 'off').
|
||||
$hideAnnouncementBar = ! config('app.announcement_bar') || trim($__env->yieldContent('announcement_bar', 'on')) === 'off';
|
||||
@endphp
|
||||
|
||||
@if ($showPaletteSwitch && ! $paletteDraft)
|
||||
{{-- Läuft vor dem Stylesheet: setzt die gemerkte Palette, bevor die Seite gezeichnet wird.
|
||||
?palette=modern|classic in der URL überschreibt und merkt sich die Wahl; ohne
|
||||
gemerkte Wahl gilt config('app.palette'). --}}
|
||||
<script>
|
||||
(function () {
|
||||
var fromUrl = new URLSearchParams(window.location.search).get('palette');
|
||||
var palette = null;
|
||||
try {
|
||||
if (fromUrl === 'modern' || fromUrl === 'classic') {
|
||||
localStorage.setItem('b2in-palette', fromUrl);
|
||||
}
|
||||
palette = localStorage.getItem('b2in-palette');
|
||||
} catch (e) {
|
||||
palette = fromUrl;
|
||||
}
|
||||
if (palette === null) {
|
||||
palette = @js(config('app.palette'));
|
||||
}
|
||||
if (palette === 'modern') {
|
||||
document.documentElement.classList.add('palette-modern');
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
@endif
|
||||
|
||||
@vite([
|
||||
\App\Helpers\ThemeHelper::getThemeCssPath(),
|
||||
'resources/js/app.js'
|
||||
|
|
@ -154,7 +115,7 @@
|
|||
@stack('styles')
|
||||
</head>
|
||||
|
||||
<body class="antialiased bg-background text-foreground world-{{ b2in_world() }}{{ $paletteDraft ? ' palette-greige' : '' }}">
|
||||
<body class="antialiased bg-background text-foreground world-{{ b2in_world() }}">
|
||||
|
||||
{{-- GTM noscript (nur bei GTM-Nutzung) --}}
|
||||
<x-cookie-consent::gtm-noscript />
|
||||
|
|
@ -164,18 +125,11 @@
|
|||
<livewire:web.components.ui.announcement-bar />
|
||||
@endunless
|
||||
|
||||
{{-- TopBar (Backup: Sprachwechsel & Social Icons – folgt später) --}}
|
||||
{{-- <livewire:web.components.ui.top-bar /> --}}
|
||||
|
||||
@yield('content')
|
||||
|
||||
{{-- Terminanfrage: schwebend unten rechts, auf allen Seiten --}}
|
||||
<livewire:web.components.ui.appointment-widget />
|
||||
|
||||
@if ($showPaletteSwitch)
|
||||
<x-palette-switch :draft="$paletteDraft" />
|
||||
@endif
|
||||
|
||||
{{-- Cookie Consent Manager (vor Livewire-Scripts) --}}
|
||||
<x-cookie-consent::manager />
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@
|
|||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.page-hero section="marken_hero" />
|
||||
<livewire:web.components.sections.founder-bar bg="bg-accent" />
|
||||
<livewire:web.components.sections.brand-overview />
|
||||
<livewire:web.components.sections.image-break section="marken_image_break" />
|
||||
<livewire:web.components.sections.origin-section />
|
||||
<livewire:web.components.sections.marken-network bg="bg-accent" />
|
||||
<livewire:web.components.sections.marken-growth />
|
||||
|
|
|
|||
|
|
@ -1,183 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Netzwerk – regionale Fachexperten und starke Marken | B2in Interior')
|
||||
@section('meta_description', 'Das B2in-Netzwerk: Europäisches Einrichtungsnetzwerk, Fachhändler-Partnerschaften & Marken-Kooperationen – in Entwicklung.')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
@php
|
||||
$hero = cms_theme_section('netzwerk_hero');
|
||||
$teasers = cms_theme_section('netzwerk_teasers');
|
||||
$cta = cms_theme_section('netzwerk_cta');
|
||||
$cabinet = cms_theme_section('netzwerk_cabinet_partner');
|
||||
$immobilienHint = cms_theme_section('netzwerk_immobilien_hint');
|
||||
@endphp
|
||||
|
||||
{{-- Hero --}}
|
||||
@if (!empty($hero))
|
||||
<section class="section-padding flex items-center relative border-b border-border/30">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-20 bg-hero-container rounded-[20px] w-[95%]">
|
||||
<div class="grid lg:grid-cols-2 gap-16 items-center">
|
||||
<div class="space-y-8">
|
||||
<div class="slide-right delay-300">
|
||||
<h1 class="text-hero mb-6">
|
||||
{!! $hero['title'] !!}
|
||||
</h1>
|
||||
<p class="text-lg text-muted-foreground max-w-md leading-relaxed">
|
||||
{{ $hero['subtitle'] ?? '' }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relative">
|
||||
<div class="relative rounded-3xl overflow-hidden shadow-elevated slide-left delay-300">
|
||||
<x-web-picture
|
||||
src="{{ theme_image_url($hero['image'] ?? '') }}"
|
||||
alt="{{ $hero['image_alt'] ?? 'B2in Netzwerk – regionale Fachexperten' }}"
|
||||
class="w-full h-[500px] object-cover"
|
||||
loading="" />
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
|
||||
{{-- Teaser-Kacheln --}}
|
||||
@if (!empty($teasers))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="text-center mb-12 slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $teasers['title'] !!}</h2>
|
||||
</div>
|
||||
|
||||
<div class="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto">
|
||||
@foreach ($teasers['cards'] ?? [] as $index => $card)
|
||||
<div class="card-elevated rounded-2xl p-8 text-center slide-up delay-{{ 300 + $index * 100 }}">
|
||||
<div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-secondary/10 text-secondary mb-6">
|
||||
@svg('heroicon-o-' . ($card['icon'] ?? 'squares-2x2'), 'w-8 h-8')
|
||||
</div>
|
||||
<h3 class="text-lg font-semibold text-foreground mb-3">{{ $card['title'] ?? '' }}</h3>
|
||||
<p class="text-sm text-muted-foreground leading-relaxed mb-6">{{ $card['description'] ?? '' }}</p>
|
||||
@if (isset($card['status']))
|
||||
<span class="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full text-xs font-semibold bg-secondary/10 text-secondary">
|
||||
<span class="w-1.5 h-1.5 rounded-full bg-secondary animate-pulse"></span>
|
||||
{{ $card['status'] }}
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
<livewire:web.components.sections.image-break section="netzwerk_image_break" />
|
||||
|
||||
{{-- CABINET Premiumpartner --}}
|
||||
@if (! empty($cabinet))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-6xl mx-auto">
|
||||
<div class="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div class="space-y-6 slide-right delay-300">
|
||||
@if (! empty($cabinet['badge'] ?? null))
|
||||
<div class="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-secondary/10 text-secondary text-sm font-semibold">
|
||||
<span class="w-2 h-2 rounded-full bg-secondary"></span>
|
||||
{{ $cabinet['badge'] }}
|
||||
</div>
|
||||
@endif
|
||||
@if (! empty($cabinet['title'] ?? null))
|
||||
<h2 class="text-section-title">
|
||||
{!! $cabinet['title'] !!}
|
||||
</h2>
|
||||
@endif
|
||||
@if (! empty($cabinet['lead'] ?? null))
|
||||
<p class="text-lg font-medium text-foreground">{{ $cabinet['lead'] }}</p>
|
||||
@endif
|
||||
@foreach ($cabinet['paragraphs'] ?? [] as $paragraph)
|
||||
<p class="text-muted-foreground leading-relaxed">{{ $paragraph }}</p>
|
||||
@endforeach
|
||||
</div>
|
||||
<div class="relative slide-left delay-300">
|
||||
<div class="card-elevated rounded-3xl overflow-hidden p-10 flex items-center justify-center bg-white min-h-[300px]">
|
||||
<img
|
||||
src="{{ theme_image_url($cabinet['image'] ?? 'b2in/cabinet_logo.png') }}"
|
||||
alt="{{ $cabinet['image_alt'] ?? 'CABINET' }}"
|
||||
class="max-w-xs w-full object-contain"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- Immobilien-Vorteil Hinweis --}}
|
||||
@if (! empty($immobilienHint))
|
||||
<section class="section-padding bg-accent">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center slide-up delay-300">
|
||||
<div class="inline-flex items-center justify-center w-14 h-14 rounded-full bg-secondary/10 text-secondary mb-6">
|
||||
@svg('heroicon-o-building-office-2', 'w-7 h-7')
|
||||
</div>
|
||||
@if (! empty($immobilienHint['title'] ?? null))
|
||||
<h2 class="text-section-title">{!! $immobilienHint['title'] !!}</h2>
|
||||
@endif
|
||||
@if (! empty($immobilienHint['description'] ?? null))
|
||||
<p class="text-large text-muted-foreground mt-4 leading-relaxed">
|
||||
{{ $immobilienHint['description'] }}
|
||||
</p>
|
||||
@endif
|
||||
@if (! empty($immobilienHint['button_text'] ?? null))
|
||||
<div class="mt-8">
|
||||
<a href="{{ url($immobilienHint['button_link'] ?? '/immobilien') }}" class="btn-primary-accent px-8 py-4 text-lg">
|
||||
{{ $immobilienHint['button_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
|
||||
{{-- CTA --}}
|
||||
@if (!empty($cta))
|
||||
<section class="section-padding">
|
||||
<div class="container-padding">
|
||||
<div class="max-w-3xl mx-auto text-center slide-up delay-300">
|
||||
<h2 class="text-section-title">{!! $cta['title'] !!}</h2>
|
||||
<p class="text-large text-muted-foreground mt-4 leading-relaxed">
|
||||
{{ $cta['text'] ?? '' }}
|
||||
</p>
|
||||
@if (isset($cta['button_text']))
|
||||
<div class="mt-8">
|
||||
<a href="{{ $cta['button_link'] ?? '/contact' }}"
|
||||
class="btn-primary-accent px-8 py-4 text-lg">
|
||||
{{ $cta['button_text'] }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@endif
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Für Entwickler & Partner - B2in')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.partner-hero />
|
||||
<livewire:web.components.sections.founder-bar />
|
||||
<livewire:web.components.sections.content-section section="supply_chain_intro" layout="left" bg="bg-accent" />
|
||||
<livewire:web.components.sections.card-section section="partner_card_section" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_developer" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_retailer" layout="right" bg="bg-accent" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_supplier" />
|
||||
<livewire:web.components.sections.benefits-section section="partner_benefits_broker" layout="right" bg="bg-accent" />
|
||||
<livewire:web.components.sections.partner-process />
|
||||
<livewire:web.components.sections.commitment-section />
|
||||
<livewire:web.components.sections.partner-c-t-a />
|
||||
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'B2in Magazin - Insights & Trends')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.portfolio />
|
||||
<livewire:web.components.sections.c-t-a-section section="cta_section_portfolio" />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.page-hero section="referenzen_hero" breadcrumb="Referenzen" />
|
||||
<livewire:web.components.sections.page-hero section="referenzen_hero" />
|
||||
<livewire:web.components.sections.reference-projects />
|
||||
<livewire:web.components.sections.display-feed bg="bg-accent" :showLink="false" />
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
|
|
|
|||
|
|
@ -1,32 +0,0 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@section('title', 'Stileigentum - Premium Immobilien & Zeitlose Eleganz')
|
||||
|
||||
@section('content')
|
||||
<div class="bg-background">
|
||||
<livewire:web.components.ui.header />
|
||||
|
||||
<main class="variante-glass-flow">
|
||||
<livewire:web.components.sections.hero-image />
|
||||
<livewire:web.components.sections.content-section layout="left" bg="bg-white" section="content_section_left" />
|
||||
<livewire:web.components.sections.content-section layout="right" bg="bg-accent" section="content_section_right" />
|
||||
|
||||
<livewire:web.components.sections.ecosystem-stats />
|
||||
<livewire:web.components.sections.c-t-a-section />
|
||||
</main>
|
||||
|
||||
<livewire:web.components.ui.footer />
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('styles')
|
||||
<style>
|
||||
[x-cloak] {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
{{-- Alpine.js wird zentral im Layout geladen --}}
|
||||
@endpush
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue