Compare commits
10 Commits
1aedcaf314
...
feature/is
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c0a9a856a | ||
| 4ca48a7445 | |||
| 6b13b95102 | |||
| 9a8776412e | |||
| 127faaffaf | |||
| c6eda36750 | |||
| 336fbc12a6 | |||
|
|
8b73603293 | ||
| d609175b3c | |||
|
|
1fcdca95b7 |
0
.continue/mcpServers/new-mcp-server.yaml
Executable file → Normal file
0
.dockerignore
Executable file → Normal file
0
.gitea/workflows/deploy-test.yml
Executable file → Normal file
0
.gitignore
vendored
Executable file → Normal file
@@ -1,8 +0,0 @@
|
|||||||
# Legacy redirects for old URLs pointing to root
|
|
||||||
RewriteEngine On
|
|
||||||
RewriteRule ^impressum\.html$ /impressum [R=301,L]
|
|
||||||
RewriteRule ^datenschutz\.html$ /datenschutz [R=301,L]
|
|
||||||
RewriteRule ^haus-schleusingen\.html$ / [R=301,L]
|
|
||||||
|
|
||||||
# Everything else goes to public/
|
|
||||||
RewriteRule ^(.*)$ public/$1 [L]
|
|
||||||
0
.htmlhintrc
Executable file → Normal file
0
.husky/pre-commit
Executable file → Normal file
0
.prettierignore
Executable file → Normal file
0
.prettierrc
Executable file → Normal file
0
.stylelintrc.json
Executable file → Normal file
0
Dockerfile
Executable file → Normal file
@@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Controllers;
|
|
||||||
|
|
||||||
use App\Core\View;
|
|
||||||
|
|
||||||
abstract class Controller
|
|
||||||
{
|
|
||||||
protected View $view;
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->view = new View();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function render(string $view, array $data = [], string $layout = 'main'): void
|
|
||||||
{
|
|
||||||
foreach ($data as $key => $value) {
|
|
||||||
$this->view->assign($key, $value);
|
|
||||||
}
|
|
||||||
$this->view->render($view, $layout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Controllers;
|
|
||||||
|
|
||||||
class DatenschutzController extends Controller
|
|
||||||
{
|
|
||||||
public function index(): void
|
|
||||||
{
|
|
||||||
$this->render('datenschutz/index', [
|
|
||||||
'pageTitle' => 'Datenschutzerklärung – Haus Schleusingen',
|
|
||||||
'pageDescription' => 'Datenschutzerklärung der Website haus-schleusingen.de',
|
|
||||||
'robots' => 'noindex',
|
|
||||||
'canonical' => 'https://haus-schleusingen.de/datenschutz',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Controllers;
|
|
||||||
|
|
||||||
class HomeController extends Controller
|
|
||||||
{
|
|
||||||
public function index(): void
|
|
||||||
{
|
|
||||||
session_start();
|
|
||||||
|
|
||||||
// --- Helper functions ---
|
|
||||||
$normalizeContactValue = function (string $value): string {
|
|
||||||
return trim($value);
|
|
||||||
};
|
|
||||||
|
|
||||||
$escapeContactValue = function (string $value): string {
|
|
||||||
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
|
|
||||||
};
|
|
||||||
|
|
||||||
$containsHeaderInjection = function (string $value): bool {
|
|
||||||
return (bool) preg_match('/[\r\n]/', $value);
|
|
||||||
};
|
|
||||||
|
|
||||||
// --- Form processing ---
|
|
||||||
$formErrors = [];
|
|
||||||
$formSuccess = false;
|
|
||||||
if (!empty($_SESSION['form_success'])) {
|
|
||||||
$formSuccess = true;
|
|
||||||
unset($_SESSION['form_success']);
|
|
||||||
}
|
|
||||||
if (!empty($_SESSION['form_errors'])) {
|
|
||||||
$formErrors = $_SESSION['form_errors'];
|
|
||||||
unset($_SESSION['form_errors']);
|
|
||||||
}
|
|
||||||
if (!empty($_SESSION['form_data'])) {
|
|
||||||
$formData = $_SESSION['form_data'];
|
|
||||||
unset($_SESSION['form_data']);
|
|
||||||
} else {
|
|
||||||
$formData = ['fname' => '', 'lname' => '', 'email' => '', 'phone' => '', 'interest' => 'Besichtigung anfragen', 'message' => ''];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
||||||
$formData['fname'] = $normalizeContactValue((string) ($_POST['fname'] ?? ''));
|
|
||||||
$formData['lname'] = $normalizeContactValue((string) ($_POST['lname'] ?? ''));
|
|
||||||
$formData['email'] = $normalizeContactValue((string) ($_POST['email'] ?? ''));
|
|
||||||
$formData['phone'] = $normalizeContactValue((string) ($_POST['phone'] ?? ''));
|
|
||||||
$formData['interest'] = $normalizeContactValue((string) ($_POST['interest'] ?? ''));
|
|
||||||
$formData['message'] = $normalizeContactValue((string) ($_POST['message'] ?? ''));
|
|
||||||
|
|
||||||
$honeypot = $normalizeContactValue((string) ($_POST['website'] ?? ''));
|
|
||||||
if ($honeypot !== '') {
|
|
||||||
header('Location: ' . $_SERVER['REQUEST_URI'] . '#form-result');
|
|
||||||
$_SESSION['form_success'] = true;
|
|
||||||
exit;
|
|
||||||
} else {
|
|
||||||
if ($formData['fname'] === '') {
|
|
||||||
$formErrors[] = 'Bitte geben Sie Ihren Vornamen an.';
|
|
||||||
}
|
|
||||||
if ($formData['lname'] === '') {
|
|
||||||
$formErrors[] = 'Bitte geben Sie Ihren Nachnamen an.';
|
|
||||||
}
|
|
||||||
if ($formData['email'] === '' || !filter_var($formData['email'], FILTER_VALIDATE_EMAIL)) {
|
|
||||||
$formErrors[] = 'Bitte geben Sie eine gültige E-Mail-Adresse an.';
|
|
||||||
}
|
|
||||||
if ($formData['message'] === '') {
|
|
||||||
$formErrors[] = 'Bitte geben Sie eine Nachricht ein.';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($containsHeaderInjection($formData['email']) || $containsHeaderInjection($formData['fname'] . ' ' . $formData['lname'])) {
|
|
||||||
$formErrors[] = 'Ungültige Zeichen in den Eingabefeldern.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$formTime = isset($_POST['form_time']) ? (int) $_POST['form_time'] : 0;
|
|
||||||
if ($formTime > 0 && (time() - $formTime) < 3) {
|
|
||||||
$formErrors[] = 'Das Formular wurde zu schnell abgeschickt. Bitte versuchen Sie es erneut.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$lastSubmit = $_SESSION['last_contact_submit'] ?? 0;
|
|
||||||
if ($lastSubmit && (time() - $lastSubmit) < 60) {
|
|
||||||
$formErrors[] = 'Bitte warten Sie einen Moment vor der nächsten Anfrage.';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($formErrors)) {
|
|
||||||
$to = 'mki@kies-media.de';
|
|
||||||
$subject = 'Kontaktanfrage: ' . $formData['interest'];
|
|
||||||
$body = "Von: {$formData['fname']} {$formData['lname']}\n"
|
|
||||||
. "E-Mail: {$formData['email']}\n";
|
|
||||||
if ($formData['phone'] !== '') {
|
|
||||||
$body .= "Telefon: {$formData['phone']}\n";
|
|
||||||
}
|
|
||||||
$body .= "Anliegen: {$formData['interest']}\n\n"
|
|
||||||
. $formData['message'];
|
|
||||||
|
|
||||||
$headers = "From: {$formData['email']}\r\n";
|
|
||||||
$headers .= "Reply-To: {$formData['email']}\r\n";
|
|
||||||
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";
|
|
||||||
$headers .= "X-Mailer: PHP/" . phpversion();
|
|
||||||
|
|
||||||
$mailSent = mail($to, $subject, $body, $headers);
|
|
||||||
|
|
||||||
if ($mailSent) {
|
|
||||||
$_SESSION['last_contact_submit'] = time();
|
|
||||||
header('Location: ' . $_SERVER['REQUEST_URI'] . '#form-result');
|
|
||||||
$_SESSION['form_success'] = true;
|
|
||||||
exit;
|
|
||||||
} else {
|
|
||||||
$formErrors[] = 'Leider konnte die E-Mail nicht gesendet werden. Bitte versuchen Sie es später erneut oder schreiben Sie uns direkt an mki@kies-media.de.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!empty($formErrors)) {
|
|
||||||
header('Location: ' . $_SERVER['REQUEST_URI'] . '#form-result');
|
|
||||||
$_SESSION['form_errors'] = $formErrors;
|
|
||||||
$_SESSION['form_data'] = $formData;
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->render('home/index', [
|
|
||||||
'formSuccess' => $formSuccess,
|
|
||||||
'formErrors' => $formErrors,
|
|
||||||
'formData' => $formData,
|
|
||||||
'escapeContactValue' => $escapeContactValue,
|
|
||||||
'pageTitle' => 'Einfamilienhaus mieten Schleusingen | 227 m², 6 Zimmer | 1.300 € Kaltmiete',
|
|
||||||
'pageDescription' => 'Einfamilienhaus zur Langzeitmiete in Schleusingen: 227 m² Wohnfläche, 6 Zimmer, 3 Etagen mit Dachterrasse. Kaltmiete 1.300 €. Bahnhofstraße 10, 98553 Schleusingen. Ab sofort verfügbar.',
|
|
||||||
'canonical' => 'https://haus-schleusingen.de/',
|
|
||||||
'openGraph' => [
|
|
||||||
'ogTitle' => 'Einfamilienhaus zur Miete in Schleusingen – 227 m², 6 Zimmer',
|
|
||||||
'ogDescription' => 'Großzügiges Einfamilienhaus zur Langzeitmiete: 227 m², 6 Zimmer, 3 Etagen + Dachterrasse. Kaltmiete 1.300 €. Ab sofort verfügbar in Schleusingen.',
|
|
||||||
'ogImage' => 'https://haus-schleusingen.de/bilder/Außenansicht-2.png',
|
|
||||||
'ogUrl' => 'https://haus-schleusingen.de/',
|
|
||||||
],
|
|
||||||
'structuredData' => json_encode([
|
|
||||||
'@context' => 'https://schema.org',
|
|
||||||
'@type' => 'RealEstateListing',
|
|
||||||
'name' => 'Einfamilienhaus zur Miete in Schleusingen',
|
|
||||||
'description' => 'Großzügiges Einfamilienhaus zur Langzeitmiete: 227 m² Wohnfläche, 6 Zimmer, 3 Etagen mit Dachterrasse. Kaltmiete 1.300 €.',
|
|
||||||
'url' => 'https://haus-schleusingen.de/',
|
|
||||||
'image' => 'https://haus-schleusingen.de/bilder/Außenansicht-2.png',
|
|
||||||
'datePosted' => '2026-05-14',
|
|
||||||
'address' => [
|
|
||||||
'@type' => 'PostalAddress',
|
|
||||||
'streetAddress' => 'Bahnhofstraße 10',
|
|
||||||
'addressLocality' => 'Schleusingen',
|
|
||||||
'postalCode' => '98553',
|
|
||||||
'addressCountry' => 'DE',
|
|
||||||
],
|
|
||||||
'offers' => [
|
|
||||||
'@type' => 'Offer',
|
|
||||||
'price' => '1300',
|
|
||||||
'priceCurrency' => 'EUR',
|
|
||||||
'priceSpecification' => [
|
|
||||||
'@type' => 'UnitPriceSpecification',
|
|
||||||
'price' => '1300',
|
|
||||||
'priceCurrency' => 'EUR',
|
|
||||||
'unitCode' => 'MON',
|
|
||||||
'description' => 'Kaltmiete pro Monat',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'floorSize' => [
|
|
||||||
'@type' => 'QuantitativeValue',
|
|
||||||
'value' => '227',
|
|
||||||
'unitCode' => 'MTK',
|
|
||||||
],
|
|
||||||
'numberOfRooms' => [
|
|
||||||
'@type' => 'QuantitativeValue',
|
|
||||||
'value' => '6',
|
|
||||||
],
|
|
||||||
]),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Controllers;
|
|
||||||
|
|
||||||
class ImpressumController extends Controller
|
|
||||||
{
|
|
||||||
public function index(): void
|
|
||||||
{
|
|
||||||
$this->render('impressum/index', [
|
|
||||||
'pageTitle' => 'Impressum – Haus Schleusingen',
|
|
||||||
'pageDescription' => 'Impressum der Website haus-schleusingen.de',
|
|
||||||
'robots' => 'noindex',
|
|
||||||
'canonical' => 'https://haus-schleusingen.de/impressum',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Core;
|
|
||||||
|
|
||||||
class Router
|
|
||||||
{
|
|
||||||
private array $routes = [];
|
|
||||||
|
|
||||||
public function addRoute(string $path, string $controller, string $action = 'index'): void
|
|
||||||
{
|
|
||||||
$this->routes[$path] = [
|
|
||||||
'controller' => $controller,
|
|
||||||
'action' => $action,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dispatch(string $uri): void
|
|
||||||
{
|
|
||||||
// Normalize: strip query string and trailing slash
|
|
||||||
$path = parse_url($uri, PHP_URL_PATH);
|
|
||||||
$path = rtrim($path, '/') ?: '/';
|
|
||||||
|
|
||||||
// Direct match
|
|
||||||
if (isset($this->routes[$path])) {
|
|
||||||
$this->execute($this->routes[$path]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Legacy .html redirect (301)
|
|
||||||
if (preg_match('#^/(impressum|datenschutz)\.html$#', $path, $m)) {
|
|
||||||
header('Location: /' . $m[1], true, 301);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 404
|
|
||||||
http_response_code(404);
|
|
||||||
echo '<h1>404 – Seite nicht gefunden</h1>';
|
|
||||||
echo '<p><a href="/">Zurück zur Startseite</a></p>';
|
|
||||||
}
|
|
||||||
|
|
||||||
private function execute(array $route): void
|
|
||||||
{
|
|
||||||
$controllerClass = $route['controller'];
|
|
||||||
$action = $route['action'];
|
|
||||||
|
|
||||||
if (!class_exists($controllerClass)) {
|
|
||||||
throw new \RuntimeException("Controller {$controllerClass} nicht gefunden.");
|
|
||||||
}
|
|
||||||
|
|
||||||
$controller = new $controllerClass();
|
|
||||||
|
|
||||||
if (!method_exists($controller, $action)) {
|
|
||||||
throw new \RuntimeException("Action {$action} in {$controllerClass} nicht gefunden.");
|
|
||||||
}
|
|
||||||
|
|
||||||
$controller->$action();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Core;
|
|
||||||
|
|
||||||
class View
|
|
||||||
{
|
|
||||||
private string $viewsPath;
|
|
||||||
private array $data = [];
|
|
||||||
|
|
||||||
public function __construct(?string $viewsPath = null)
|
|
||||||
{
|
|
||||||
$this->viewsPath = $viewsPath ?? dirname(__DIR__) . '/views';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function assign(string $key, mixed $value): void
|
|
||||||
{
|
|
||||||
$this->data[$key] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function render(string $view, string $layout = 'main'): void
|
|
||||||
{
|
|
||||||
$viewFile = $this->viewsPath . '/' . $view . '.php';
|
|
||||||
$layoutFile = $this->viewsPath . '/layouts/' . $layout . '.php';
|
|
||||||
|
|
||||||
if (!file_exists($viewFile)) {
|
|
||||||
throw new \RuntimeException("View {$view} nicht gefunden: {$viewFile}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file_exists($layoutFile)) {
|
|
||||||
throw new \RuntimeException("Layout {$layout} nicht gefunden: {$layoutFile}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract data to variables for the view
|
|
||||||
extract($this->data, EXTR_SKIP);
|
|
||||||
|
|
||||||
// Capture view content
|
|
||||||
ob_start();
|
|
||||||
require $viewFile;
|
|
||||||
$content = ob_get_clean();
|
|
||||||
|
|
||||||
// Render layout with $content
|
|
||||||
require $layoutFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,504 +0,0 @@
|
|||||||
<a href="#main-content" class="skip-link">Zum Inhalt springen</a>
|
|
||||||
<nav id="navbar" role="navigation" aria-label="Hauptnavigation">
|
|
||||||
<div class="nav-logo">Bahnhofstraße 10</div>
|
|
||||||
<button class="nav-hamburger" aria-label="Navigation öffnen" aria-expanded="false">
|
|
||||||
<span></span>
|
|
||||||
</button>
|
|
||||||
<ul class="nav-links">
|
|
||||||
<li><a href="#galerie">Galerie</a></li>
|
|
||||||
<li><a href="#grundriss">Grundriss</a></li>
|
|
||||||
<li><a href="#miete">Miete</a></li>
|
|
||||||
<li><a href="#lage">Lage</a></li>
|
|
||||||
</ul>
|
|
||||||
<button
|
|
||||||
class="nav-cta"
|
|
||||||
onclick="$('html').animate({ scrollTop: $('#kontakt').offset().top }, 700)"
|
|
||||||
>
|
|
||||||
Jetzt anfragen
|
|
||||||
</button>
|
|
||||||
</nav>
|
|
||||||
<div class="nav-mobile-overlay" aria-hidden="true"></div>
|
|
||||||
|
|
||||||
<section class="hero" id="hero">
|
|
||||||
<div
|
|
||||||
class="hero-bg"
|
|
||||||
id="heroBg"
|
|
||||||
style="background-image: url(/bilder/Außenansicht-2.webp)"
|
|
||||||
></div>
|
|
||||||
<div class="hero-overlay"></div>
|
|
||||||
<div class="hero-content" id="heroContent">
|
|
||||||
<div class="hero-tag">Zur Langzeitmiete · Ab sofort verfügbar</div>
|
|
||||||
<h1>
|
|
||||||
Großzügiges
|
|
||||||
<br />
|
|
||||||
<em>Einfamilienhaus</em>
|
|
||||||
<br />
|
|
||||||
in Schleusingen
|
|
||||||
</h1>
|
|
||||||
<div class="hero-meta">
|
|
||||||
<span><strong>Schleusinger Bahnhofstraße 10</strong></span>
|
|
||||||
<span>227 m² Wohnfläche</span>
|
|
||||||
<span>6 Zimmer</span>
|
|
||||||
<span>3 Etagen + Dachterrasse</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="hero-scroll">
|
|
||||||
<span>Entdecken</span>
|
|
||||||
<div class="scroll-line"></div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<main id="main-content">
|
|
||||||
<div class="facts-strip">
|
|
||||||
<div class="fact">
|
|
||||||
<div class="fact-val">227</div>
|
|
||||||
<div class="fact-label">m² Wohnfläche</div>
|
|
||||||
</div>
|
|
||||||
<div class="fact">
|
|
||||||
<div class="fact-val">6</div>
|
|
||||||
<div class="fact-label">Zimmer</div>
|
|
||||||
</div>
|
|
||||||
<div class="fact">
|
|
||||||
<div class="fact-val">3</div>
|
|
||||||
<div class="fact-label">Etagen</div>
|
|
||||||
</div>
|
|
||||||
<div class="fact">
|
|
||||||
<div class="fact-val">1.300</div>
|
|
||||||
<div class="fact-label">€ Kaltmiete</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<section class="intro" id="intro">
|
|
||||||
<div class="intro-text" data-animate>
|
|
||||||
<div class="section-eyebrow">Das Objekt</div>
|
|
||||||
<h2>Wohnen mit Charakter und viel Raum</h2>
|
|
||||||
<p>
|
|
||||||
Vermietet wird ein vollständiges Einfamilienhaus in ruhiger Lage von Schleusingen. Das
|
|
||||||
Haus verbindet historischen Charme mit modernem Wohnkomfort auf drei großzügigen Etagen.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Garage für zwei Fahrzeuge, großzügige Dachterrasse mit 35,8 m², vollausgestattete Küche,
|
|
||||||
Vollbad sowie Abstell- und Nutzräume machen das Haus zu einem außergewöhnlichen
|
|
||||||
Mietobjekt.
|
|
||||||
</p>
|
|
||||||
<div class="intro-stats">
|
|
||||||
<div>
|
|
||||||
<div class="istat-val">154,9 m²</div>
|
|
||||||
<div class="istat-label">Nutzfläche</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div class="istat-val">35,8 m²</div>
|
|
||||||
<div class="istat-label">Dachterrasse</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div class="istat-val">2 Stpl.</div>
|
|
||||||
<div class="istat-label">Garage</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="intro-img" data-animate>
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/wohnzimmer2.webp" type="image/webp">
|
|
||||||
<img src="/bilder/wohnzimmer2.png" alt="Wohnzimmer" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<div class="intro-img-badge">Wohnzimmer · 42,6 m²</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section id="galerie" class="gallery-section" aria-label="Fotogalerie">
|
|
||||||
<div class="gallery-header">
|
|
||||||
<div>
|
|
||||||
<div class="section-eyebrow">Fotogalerie</div>
|
|
||||||
<h2>Einblicke ins Haus</h2>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="masonry-grid">
|
|
||||||
<div class="grid-sizer"></div>
|
|
||||||
|
|
||||||
<div class="grid-item" data-img="/bilder/Außenansicht-2.webp" role="button" tabindex="0" aria-label="Außenansicht – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Außenansicht-2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Außenansicht-2-small.png" alt="Außenansicht des Einfamilienhauses" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Außenansicht</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/wohnzimmer2.webp" role="button" tabindex="0" aria-label="Wohnzimmer – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/wohnzimmer2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/wohnzimmer2-small.png" alt="Wohnzimmer mit 42,6 m² Wohnfläche" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Wohnzimmer · 42,6 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Küche 1.webp" role="button" tabindex="0" aria-label="Küche – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Küche 1-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Küche 1.jpg" alt="Küche mit 18,4 m²" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Küche · 18,4 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/schlafzimmer.webp" role="button" tabindex="0" aria-label="Schlafzimmer – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/schlafzimmer-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/schlafzimmer-small.png" alt="Schlafzimmer mit 18 m²" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Schlafzimmer · 18 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Bad.webp" role="button" tabindex="0" aria-label="Badezimmer – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Bad-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Bad.jpg" alt="Badezimmer mit 9,8 m²" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Badezimmer · 9,8 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Kinderzimmer.webp" role="button" tabindex="0" aria-label="Kinderzimmer 1 – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Kinderzimmer-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Kinderzimmer-small.png" alt="Kinderzimmer 1 mit 21,7 m²" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Kinderzimmer 1 · 21,7 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Kinderzimmer 2.webp" role="button" tabindex="0" aria-label="Kinderzimmer 2 – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Kinderzimmer 2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Kinderzimmer 2-small.png" alt="Kinderzimmer 2 mit 15,7 m²" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Kinderzimmer 2 · 15,7 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/kinderzimmer 2 2.webp" role="button" tabindex="0" aria-label="Kinderzimmer Detail – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/kinderzimmer 2 2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/kinderzimmer 2 2-small.png" alt="Detailansicht Kinderzimmer" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Kinderzimmer Detail</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Kinderzimmer 3.webp" role="button" tabindex="0" aria-label="Gästezimmer – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Kinderzimmer 3-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Kinderzimmer 3-small.png" alt="Gästezimmer mit 11,5 m²" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Gästezimmer · 11,5 m²</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Bad-2.webp" role="button" tabindex="0" aria-label="Zweites Bad – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Bad-2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Bad-2-small.jpg" alt="Zweites Badezimmer im Haus" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Wohnbereich</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Bad-3.webp" role="button" tabindex="0" aria-label="Drittes Bad – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Bad-3-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Bad-3-small.jpg" alt="Drittes Badezimmer im Haus" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Wohnbereich Detail</span>
|
|
||||||
</div>
|
|
||||||
<div class="grid-item" data-img="/bilder/Bad-4.webp" role="button" tabindex="0" aria-label="Wohnbereich Detail – Großansicht öffnen">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/Bad-4-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/Bad-4-small.jpg" alt="Wohnbereich Detail 3" loading="lazy" />
|
|
||||||
</picture>
|
|
||||||
<span class="grid-item-label">Hausansicht</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="floors-section" id="grundriss">
|
|
||||||
<div class="section-eyebrow">Raumaufteilung</div>
|
|
||||||
<h2>Großzügig auf allen Etagen</h2>
|
|
||||||
<div class="floor-accordion">
|
|
||||||
<div class="floor-item">
|
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-0" id="floor-title-0">
|
|
||||||
<span class="floor-title">Erdgeschoss</span>
|
|
||||||
<div class="floor-size">
|
|
||||||
<span>99,5 m²</span>
|
|
||||||
<div class="floor-icon">+</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-body" id="floor-body-0" role="region" aria-labelledby="floor-title-0">
|
|
||||||
<div class="floor-rooms-grid">
|
|
||||||
<div class="room-chip">Flur<span class="room-chip-area">20,1 m²</span></div>
|
|
||||||
<div class="room-chip">WC<span class="room-chip-area">0,8 m²</span></div>
|
|
||||||
<div class="room-chip">Garage / Partykeller<span class="room-chip-area">42,6 m²</span></div>
|
|
||||||
<div class="room-chip">Abstellraum 1<span class="room-chip-area">9,9 m²</span></div>
|
|
||||||
<div class="room-chip">Abstellraum 2<span class="room-chip-area">7,8 m²</span></div>
|
|
||||||
<div class="room-chip">Heizungskeller<span class="room-chip-area">18,3 m²</span></div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-plan floor-plan-multi">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/EG-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/EG-small.jpg" alt="Grundriss Erdgeschoss" loading="lazy" data-img="/bilder/grundrisse/EG.webp" />
|
|
||||||
</picture>
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/EG 3D-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/EG 3D-small.jpg" alt="Grundriss Erdgeschoss" loading="lazy" data-img="/bilder/grundrisse/EG 3D.webp" />
|
|
||||||
</picture>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-item">
|
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-1" id="floor-title-1">
|
|
||||||
<span class="floor-title">1. Obergeschoss</span>
|
|
||||||
<div class="floor-size">
|
|
||||||
<span>120,4 m²</span>
|
|
||||||
<div class="floor-icon">+</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-body" id="floor-body-1" role="region" aria-labelledby="floor-title-1">
|
|
||||||
<div class="floor-rooms-grid">
|
|
||||||
<div class="room-chip">Flur<span class="room-chip-area">20,1 m²</span></div>
|
|
||||||
<div class="room-chip">Wohnzimmer<span class="room-chip-area">42,6 m²</span></div>
|
|
||||||
<div class="room-chip">Gästezimmer<span class="room-chip-area">11,5 m²</span></div>
|
|
||||||
<div class="room-chip">Badezimmer<span class="room-chip-area">9,8 m²</span></div>
|
|
||||||
<div class="room-chip">Küche<span class="room-chip-area">18,4 m²</span></div>
|
|
||||||
<div class="room-chip">Schlafzimmer<span class="room-chip-area">18,0 m²</span></div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-plan floor-plan-multi">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/OG 1 2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/OG 1 2-small.jpg" alt="Grundriss 1. Obergeschoss" loading="lazy" data-img="/bilder/grundrisse/OG 1 2.webp" />
|
|
||||||
</picture>
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/OG 1 3D-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/OG 1 3D-small.jpg" alt="Grundriss 1. Obergeschoss" loading="lazy" data-img="/bilder/grundrisse/OG 1 3D.webp" />
|
|
||||||
</picture>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-item">
|
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-2" id="floor-title-2">
|
|
||||||
<span class="floor-title">2. Obergeschoss</span>
|
|
||||||
<div class="floor-size">
|
|
||||||
<span>68 m²</span>
|
|
||||||
<div class="floor-icon">+</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-body" id="floor-body-2" role="region" aria-labelledby="floor-title-2">
|
|
||||||
<div class="floor-rooms-grid">
|
|
||||||
<div class="room-chip">Flur<span class="room-chip-area">13,9 m²</span></div>
|
|
||||||
<div class="room-chip">Kinderzimmer 1<span class="room-chip-area">21,7 m²</span></div>
|
|
||||||
<div class="room-chip">Kinderzimmer 2<span class="room-chip-area">15,7 m²</span></div>
|
|
||||||
<div class="room-chip">Spielzimmer<span class="room-chip-area">6,3 m²</span></div>
|
|
||||||
<div class="room-chip">Ankleidezimmer<span class="room-chip-area">1,4 m²</span></div>
|
|
||||||
<div class="room-chip">Dachterrasse<span class="room-chip-area">9,0 m²</span> <small>(25% von 35,8 m²)</small></div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-plan floor-plan-multi">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/OG 2 grundriss-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/OG 2 grundriss-small.jpg" alt="Grundriss 2. Obergeschoss" loading="lazy" data-img="/bilder/grundrisse/OG 2 grundriss.webp" />
|
|
||||||
</picture>
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/OG 2 3D-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/OG 2 3D-small.jpg" alt="Grundriss 2. Obergeschoss" loading="lazy" data-img="/bilder/grundrisse/OG 2 3D.webp" />
|
|
||||||
</picture>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-item">
|
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-3" id="floor-title-3">
|
|
||||||
<span class="floor-title">Dachboden</span>
|
|
||||||
<div class="floor-size">
|
|
||||||
<span>94 m² Nutzfläche</span>
|
|
||||||
<div class="floor-icon">+</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-body" id="floor-body-3" role="region" aria-labelledby="floor-title-3">
|
|
||||||
<div class="floor-rooms-grid">
|
|
||||||
<div class="room-chip">Dachboden unten (ungeheizt)<span class="room-chip-area">52 m²</span></div>
|
|
||||||
<div class="room-chip">Dachboden Mitte (ungeheizt)<span class="room-chip-area">31 m²</span></div>
|
|
||||||
<div class="room-chip">Dachboden oben (ungeheizt)<span class="room-chip-area">11 m²</span></div>
|
|
||||||
</div>
|
|
||||||
<div class="floor-plan floor-plan-multi">
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/Dachboden unten 2-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/Dachboden unten 2-small.jpg" alt="Grundriss Dachboden" loading="lazy" data-img="/bilder/grundrisse/Dachboden unten 2.webp" />
|
|
||||||
</picture>
|
|
||||||
<picture>
|
|
||||||
<source srcset="/bilder/grundrisse/Dachboden unten-small.webp" type="image/webp">
|
|
||||||
<img src="/bilder/grundrisse/Dachboden unten-small.jpg" alt="Grundriss Dachboden" loading="lazy" data-img="/bilder/grundrisse/Dachboden unten.webp" />
|
|
||||||
</picture>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="pricing-section" id="miete" aria-label="Mietkonditionen">
|
|
||||||
<div class="pricing-inner">
|
|
||||||
<div class="section-eyebrow">Mietkonditionen</div>
|
|
||||||
<h2>Transparente Preisgestaltung</h2>
|
|
||||||
<div class="price-cards">
|
|
||||||
<div class="price-card">
|
|
||||||
<div class="pc-label">Kaltmiete</div>
|
|
||||||
<div class="pc-val">1.300 €</div>
|
|
||||||
<div class="pc-sub">pro Monat</div>
|
|
||||||
</div>
|
|
||||||
<div class="price-card highlight">
|
|
||||||
<div class="pc-label">Gesamtmiete warm</div>
|
|
||||||
<div class="pc-val">1.600 €</div>
|
|
||||||
<div class="pc-sub">inkl. 300 € Nebenkosten</div>
|
|
||||||
</div>
|
|
||||||
<div class="price-card">
|
|
||||||
<div class="pc-label">Kaution</div>
|
|
||||||
<div class="pc-val">2.600 €</div>
|
|
||||||
<div class="pc-sub">2 Nettokaltmieten</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="price-note">
|
|
||||||
<div class="pn-item">
|
|
||||||
<strong>Verfügbarkeit</strong>
|
|
||||||
Ab sofort · unbefristete Laufzeit
|
|
||||||
</div>
|
|
||||||
<div class="pn-item">
|
|
||||||
<strong>Nebenkosten</strong>
|
|
||||||
Vorauszahlung 300 €/Monat, jährliche Abrechnung
|
|
||||||
</div>
|
|
||||||
<div class="pn-item">
|
|
||||||
<strong>Energieausweis</strong>
|
|
||||||
Wird bei Mietbeginn übergeben · Erdgasheizung
|
|
||||||
</div>
|
|
||||||
<div class="pn-item">
|
|
||||||
<strong>Haustiere</strong>
|
|
||||||
Auf Anfrage
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="lage-section" id="lage">
|
|
||||||
<div class="section-eyebrow">Standort</div>
|
|
||||||
<h2>Zentral und ruhig zugleich</h2>
|
|
||||||
<div class="lage-grid">
|
|
||||||
<div class="lage-item">
|
|
||||||
<div class="lage-icon">🛒</div>
|
|
||||||
<div>
|
|
||||||
<div class="lage-title">Einkaufen & Versorgung</div>
|
|
||||||
<div class="lage-desc">Supermärkte, Ärzte, Apotheken und Schulen sind fußläufig erreichbar</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="lage-item">
|
|
||||||
<div class="lage-icon">🚌</div>
|
|
||||||
<div>
|
|
||||||
<div class="lage-title">Öffentlicher Nahverkehr</div>
|
|
||||||
<div class="lage-desc">Zentrale Bushaltestelle ca. 200 m entfernt — direkte Verbindungen in die Region</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="lage-item">
|
|
||||||
<div class="lage-icon">🏛</div>
|
|
||||||
<div>
|
|
||||||
<div class="lage-title">Innenstadt Schleusingen</div>
|
|
||||||
<div class="lage-desc">Wochenmarkt und Stadtmitte nur ca. 500 m entfernt</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="lage-item">
|
|
||||||
<div class="lage-icon">📍</div>
|
|
||||||
<div>
|
|
||||||
<div class="lage-title">Genaue Adresse</div>
|
|
||||||
<div class="lage-desc">Schleusinger Bahnhofstraße 10<br />98533 Schleusingen, Thüringen</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="lage-map-wrapper">
|
|
||||||
<iframe
|
|
||||||
src="https://maps.google.com/maps?q=50.5090045,10.7473859&t=&z=16&ie=UTF8&iwloc=&output=embed"
|
|
||||||
width="100%" height="450" style="border: 0" allowfullscreen="" loading="lazy"
|
|
||||||
referrerpolicy="no-referrer-when-downgrade"
|
|
||||||
title="Standort Bahnhofstraße 10, Schleusingen"
|
|
||||||
></iframe>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="contact-section" id="kontakt" aria-label="Kontaktformular">
|
|
||||||
<div class="contact-inner">
|
|
||||||
<div class="section-eyebrow">Kontakt</div>
|
|
||||||
<h2>Interesse?<br /><em>Schreiben Sie uns.</em></h2>
|
|
||||||
<p>
|
|
||||||
Wir freuen uns über Ihre Anfrage und melden uns innerhalb von 24 Stunden.
|
|
||||||
Besichtigungstermine sind nach Absprache möglich. Bitte geben Sie bei Ihrer Anfrage ein
|
|
||||||
paar Terminvorschläge an.
|
|
||||||
</p>
|
|
||||||
<div class="contact-form">
|
|
||||||
<?php if ($formSuccess): ?>
|
|
||||||
<div id="form-result" class="form-success" style="display: block">
|
|
||||||
<p>Vielen Dank für Ihre Anfrage!</p>
|
|
||||||
<br />
|
|
||||||
<small>Wir haben Ihre Nachricht erhalten und melden uns innerhalb von 24 Stunden bei Ihnen.</small>
|
|
||||||
</div>
|
|
||||||
<?php else: ?>
|
|
||||||
<?php if (!empty($formErrors)): ?>
|
|
||||||
<div id="form-errors" class="form-errors">
|
|
||||||
<ul>
|
|
||||||
<?php foreach ($formErrors as $error): ?>
|
|
||||||
<li><?= $escapeContactValue($error) ?></li>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<?php endif; ?>
|
|
||||||
<form id="contactForm" method="post">
|
|
||||||
<div class="form-row">
|
|
||||||
<div class="form-field">
|
|
||||||
<label for="fname">Vorname</label>
|
|
||||||
<input type="text" id="fname" name="fname" placeholder="Max" required value="<?= $escapeContactValue($formData['fname']) ?>" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field">
|
|
||||||
<label for="lname">Nachname</label>
|
|
||||||
<input type="text" id="lname" name="lname" placeholder="Mustermann" required value="<?= $escapeContactValue($formData['lname']) ?>" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-row">
|
|
||||||
<div class="form-field">
|
|
||||||
<label for="email">E-Mail</label>
|
|
||||||
<input type="email" id="email" name="email" placeholder="max@beispiel.de" required value="<?= $escapeContactValue($formData['email']) ?>" />
|
|
||||||
</div>
|
|
||||||
<div class="form-field">
|
|
||||||
<label for="phone">Telefon</label>
|
|
||||||
<input type="tel" id="phone" name="phone" placeholder="+49 ..." value="<?= $escapeContactValue($formData['phone']) ?>" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-row">
|
|
||||||
<div class="form-field full">
|
|
||||||
<label for="interest">Anliegen</label>
|
|
||||||
<select id="interest" name="interest">
|
|
||||||
<?php
|
|
||||||
$interestOptions = ['Besichtigung anfragen', 'Allgemeine Informationen', 'Mietbewerbung einreichen'];
|
|
||||||
foreach ($interestOptions as $opt):
|
|
||||||
$selected = ($formData['interest'] === $opt) ? ' selected' : '';
|
|
||||||
?>
|
|
||||||
<option<?= $selected ?>><?= $escapeContactValue($opt) ?></option>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-row">
|
|
||||||
<div class="form-field full">
|
|
||||||
<label for="message">Nachricht</label>
|
|
||||||
<textarea id="message" name="message" rows="4" placeholder="Ihre Nachricht ..." required><?= $escapeContactValue($formData['message']) ?></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="hp-field" aria-hidden="true">
|
|
||||||
<label for="website">Website</label>
|
|
||||||
<input type="text" id="website" name="website" tabindex="-1" autocomplete="off" />
|
|
||||||
</div>
|
|
||||||
<input type="hidden" name="form_time" value="<?= time() ?>" />
|
|
||||||
<button type="submit" class="btn-submit">Anfrage absenden</button>
|
|
||||||
</form>
|
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
|
||||||
<div class="contact-details">
|
|
||||||
<p>Oder schreiben Sie uns direkt: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
</main>
|
|
||||||
<footer role="contentinfo">
|
|
||||||
<div class="footer-logo">Bahnhofstraße 10 · Schleusingen</div>
|
|
||||||
<div class="footer-links">
|
|
||||||
<a href="/impressum">Impressum</a>
|
|
||||||
<a href="/datenschutz">Datenschutz</a>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<div class="lightbox" id="lightbox" role="dialog" aria-modal="true" aria-label="Bildansicht">
|
|
||||||
<button class="lightbox-close" id="lightboxClose" aria-label="Bildansicht schließen">×</button>
|
|
||||||
<img src="" id="lightboxImg" alt="" />
|
|
||||||
</div>
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="de">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<?php if (!isset($pageTitle)) $pageTitle = 'Einfamilienhaus mieten Schleusingen | 227 m², 6 Zimmer | 1.300 € Kaltmiete'; ?>
|
|
||||||
<title><?= htmlspecialchars($pageTitle) ?></title>
|
|
||||||
<?php if (isset($pageDescription)): ?>
|
|
||||||
<meta name="description" content="<?= htmlspecialchars($pageDescription) ?>" />
|
|
||||||
<?php else: ?>
|
|
||||||
<meta name="description" content="Einfamilienhaus zur Langzeitmiete in Schleusingen: 227 m² Wohnfläche, 6 Zimmer, 3 Etagen mit Dachterrasse. Kaltmiete 1.300 €. Bahnhofstraße 10, 98553 Schleusingen. Ab sofort verfügbar." />
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php if (isset($robots)): ?>
|
|
||||||
<meta name="robots" content="<?= htmlspecialchars($robots) ?>" />
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php if (isset($canonical)): ?>
|
|
||||||
<link rel="canonical" href="<?= htmlspecialchars($canonical) ?>" />
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/bilder/favicon/favicon-32x32.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/bilder/favicon/favicon-16x16.png">
|
|
||||||
<link rel="icon" type="image/x-icon" href="/bilder/favicon/favicon.ico">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/bilder/favicon/apple-touch-icon.png">
|
|
||||||
<link rel="manifest" href="/bilder/favicon/site.webmanifest">
|
|
||||||
|
|
||||||
<?php if (isset($openGraph)): extract($openGraph); ?>
|
|
||||||
<meta property="og:type" content="website" />
|
|
||||||
<meta property="og:title" content="<?= htmlspecialchars($ogTitle ?? '') ?>" />
|
|
||||||
<meta property="og:description" content="<?= htmlspecialchars($ogDescription ?? '') ?>" />
|
|
||||||
<meta property="og:image" content="<?= htmlspecialchars($ogImage ?? '') ?>" />
|
|
||||||
<meta property="og:url" content="<?= htmlspecialchars($ogUrl ?? '') ?>" />
|
|
||||||
<meta property="og:locale" content="de_DE" />
|
|
||||||
<meta property="og:site_name" content="Haus Schleusingen" />
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<?php if (isset($structuredData)): ?>
|
|
||||||
<script type="application/ld+json"><?= $structuredData ?></script>
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="/fonts/fonts.css" />
|
|
||||||
<link rel="stylesheet" href="/css/haus-schleusingen.css" />
|
|
||||||
<?php if (isset($extraCss)): ?>
|
|
||||||
<style><?= $extraCss ?></style>
|
|
||||||
<?php endif; ?>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<?= $content ?>
|
|
||||||
|
|
||||||
<script src="/js/haus-schleusingen.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
0
public/bilder/Außenansicht-2-small.png → bilder/Außenansicht-2-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 231 KiB After Width: | Height: | Size: 231 KiB |
0
public/bilder/Außenansicht-2-small.webp → bilder/Außenansicht-2-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
0
public/bilder/Außenansicht-2.png → bilder/Außenansicht-2.png
Executable file → Normal file
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
0
public/bilder/Außenansicht-2.webp → bilder/Außenansicht-2.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
0
public/bilder/Bad-2-small.jpg → bilder/Bad-2-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
0
public/bilder/Bad-2-small.webp → bilder/Bad-2-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
0
public/bilder/Bad-2.jpeg → bilder/Bad-2.jpeg
Executable file → Normal file
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 259 KiB |
0
public/bilder/Bad-2.webp → bilder/Bad-2.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB |
0
public/bilder/Bad-3-small.jpg → bilder/Bad-3-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
0
public/bilder/Bad-3-small.webp → bilder/Bad-3-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
0
public/bilder/Bad-3.jpeg → bilder/Bad-3.jpeg
Executable file → Normal file
|
Before Width: | Height: | Size: 211 KiB After Width: | Height: | Size: 211 KiB |
0
public/bilder/Bad-3.webp → bilder/Bad-3.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 145 KiB |
0
public/bilder/Bad-4-small.jpg → bilder/Bad-4-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
0
public/bilder/Bad-4-small.webp → bilder/Bad-4-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
0
public/bilder/Bad-4.jpeg → bilder/Bad-4.jpeg
Executable file → Normal file
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 220 KiB |
0
public/bilder/Bad-4.webp → bilder/Bad-4.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 159 KiB |
0
public/bilder/Bad-small.jpg → bilder/Bad-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
0
public/bilder/Bad-small.webp → bilder/Bad-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
0
public/bilder/Bad.jpg → bilder/Bad.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 456 KiB |
0
public/bilder/Bad.webp → bilder/Bad.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 290 KiB After Width: | Height: | Size: 290 KiB |
0
public/bilder/Kinderzimmer 2-small.png → bilder/Kinderzimmer 2-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
0
public/bilder/Kinderzimmer 2-small.webp → bilder/Kinderzimmer 2-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.3 KiB |
0
public/bilder/Kinderzimmer 2.jpg → bilder/Kinderzimmer 2.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
0
public/bilder/Kinderzimmer 2.webp → bilder/Kinderzimmer 2.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 132 KiB |
0
public/bilder/Kinderzimmer 3-small.png → bilder/Kinderzimmer 3-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
0
public/bilder/Kinderzimmer 3-small.webp → bilder/Kinderzimmer 3-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
0
public/bilder/Kinderzimmer 3.jpg → bilder/Kinderzimmer 3.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB |
0
public/bilder/Kinderzimmer 3.webp → bilder/Kinderzimmer 3.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
0
public/bilder/Kinderzimmer-small.png → bilder/Kinderzimmer-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 127 KiB |
0
public/bilder/Kinderzimmer-small.webp → bilder/Kinderzimmer-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
0
public/bilder/Kinderzimmer.png → bilder/Kinderzimmer.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
0
public/bilder/Kinderzimmer.webp → bilder/Kinderzimmer.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 104 KiB |
0
public/bilder/Küche 1-small.jpg → bilder/Küche 1-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
0
public/bilder/Küche 1-small.webp → bilder/Küche 1-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
0
public/bilder/Küche 1.jpg → bilder/Küche 1.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 501 KiB |
0
public/bilder/Küche 1.webp → bilder/Küche 1.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 371 KiB After Width: | Height: | Size: 371 KiB |
0
public/bilder/favicon/apple-touch-icon.png → bilder/favicon/apple-touch-icon.png
Executable file → Normal file
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
0
public/bilder/favicon/favicon-16x16.png → bilder/favicon/favicon-16x16.png
Executable file → Normal file
|
Before Width: | Height: | Size: 851 B After Width: | Height: | Size: 851 B |
0
public/bilder/favicon/favicon-32x32.png → bilder/favicon/favicon-32x32.png
Executable file → Normal file
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
0
public/bilder/favicon/favicon.ico → bilder/favicon/favicon.ico
Executable file → Normal file
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
0
public/bilder/favicon/site.webmanifest → bilder/favicon/site.webmanifest
Executable file → Normal file
0
public/bilder/grundrisse/Dachboden unten 2-small.jpg → bilder/grundrisse/Dachboden unten 2-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
0
public/bilder/grundrisse/Dachboden unten 2-small.webp → bilder/grundrisse/Dachboden unten 2-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
0
public/bilder/grundrisse/Dachboden unten 2.png → bilder/grundrisse/Dachboden unten 2.png
Executable file → Normal file
|
Before Width: | Height: | Size: 891 KiB After Width: | Height: | Size: 891 KiB |
0
public/bilder/grundrisse/Dachboden unten 2.webp → bilder/grundrisse/Dachboden unten 2.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
0
public/bilder/grundrisse/Dachboden unten-small.jpg → bilder/grundrisse/Dachboden unten-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
0
public/bilder/grundrisse/Dachboden unten-small.webp → bilder/grundrisse/Dachboden unten-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
0
public/bilder/grundrisse/Dachboden unten.png → bilder/grundrisse/Dachboden unten.png
Executable file → Normal file
|
Before Width: | Height: | Size: 664 KiB After Width: | Height: | Size: 664 KiB |
0
public/bilder/grundrisse/Dachboden unten.webp → bilder/grundrisse/Dachboden unten.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
0
public/bilder/grundrisse/EG 3D-small.jpg → bilder/grundrisse/EG 3D-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
0
public/bilder/grundrisse/EG 3D-small.webp → bilder/grundrisse/EG 3D-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
0
public/bilder/grundrisse/EG 3D.png → bilder/grundrisse/EG 3D.png
Executable file → Normal file
|
Before Width: | Height: | Size: 416 KiB After Width: | Height: | Size: 416 KiB |
0
public/bilder/grundrisse/EG 3D.webp → bilder/grundrisse/EG 3D.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
0
public/bilder/grundrisse/EG-small.jpg → bilder/grundrisse/EG-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
0
public/bilder/grundrisse/EG-small.webp → bilder/grundrisse/EG-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
0
public/bilder/grundrisse/EG.png → bilder/grundrisse/EG.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
0
public/bilder/grundrisse/EG.webp → bilder/grundrisse/EG.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
0
public/bilder/grundrisse/OG 1 2-small.jpg → bilder/grundrisse/OG 1 2-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
0
public/bilder/grundrisse/OG 1 2-small.webp → bilder/grundrisse/OG 1 2-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
0
public/bilder/grundrisse/OG 1 2.png → bilder/grundrisse/OG 1 2.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
0
public/bilder/grundrisse/OG 1 2.webp → bilder/grundrisse/OG 1 2.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
0
public/bilder/grundrisse/OG 1 3D-small.jpg → bilder/grundrisse/OG 1 3D-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
0
public/bilder/grundrisse/OG 1 3D-small.webp → bilder/grundrisse/OG 1 3D-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
0
public/bilder/grundrisse/OG 1 3D.png → bilder/grundrisse/OG 1 3D.png
Executable file → Normal file
|
Before Width: | Height: | Size: 390 KiB After Width: | Height: | Size: 390 KiB |
0
public/bilder/grundrisse/OG 1 3D.webp → bilder/grundrisse/OG 1 3D.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
0
public/bilder/grundrisse/OG 2 3D-small.jpg → bilder/grundrisse/OG 2 3D-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
0
public/bilder/grundrisse/OG 2 3D-small.webp → bilder/grundrisse/OG 2 3D-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
0
public/bilder/grundrisse/OG 2 3D.png → bilder/grundrisse/OG 2 3D.png
Executable file → Normal file
|
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 456 KiB |
0
public/bilder/grundrisse/OG 2 3D.webp → bilder/grundrisse/OG 2 3D.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
0
public/bilder/grundrisse/OG 2 grundriss-small.jpg → bilder/grundrisse/OG 2 grundriss-small.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
0
public/bilder/grundrisse/OG 2 grundriss-small.webp → bilder/grundrisse/OG 2 grundriss-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
0
public/bilder/grundrisse/OG 2 grundriss.png → bilder/grundrisse/OG 2 grundriss.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
0
public/bilder/grundrisse/OG 2 grundriss.webp → bilder/grundrisse/OG 2 grundriss.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB |
0
public/bilder/kinderzimmer 2 2-small.png → bilder/kinderzimmer 2 2-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
0
public/bilder/kinderzimmer 2 2-small.webp → bilder/kinderzimmer 2 2-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
0
public/bilder/kinderzimmer 2 2.jpeg → bilder/kinderzimmer 2 2.jpeg
Executable file → Normal file
|
Before Width: | Height: | Size: 587 KiB After Width: | Height: | Size: 587 KiB |
0
public/bilder/kinderzimmer 2 2.webp → bilder/kinderzimmer 2 2.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
0
public/bilder/schlafzimmer-small.png → bilder/schlafzimmer-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
0
public/bilder/schlafzimmer-small.webp → bilder/schlafzimmer-small.webp
Executable file → Normal file
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |