Compare commits
6 Commits
1aedcaf314
...
feature/is
| Author | SHA1 | Date | |
|---|---|---|---|
| 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.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/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.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-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.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-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.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-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.jpg → bilder/Bad.jpg
Executable file → Normal file
|
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 456 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.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 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.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-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.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/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.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/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.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-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.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/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.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-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.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/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.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 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.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 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.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 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.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/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.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/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.png → bilder/schlafzimmer.png
Executable file → Normal file
|
Before Width: | Height: | Size: 552 KiB After Width: | Height: | Size: 552 KiB |
0
public/bilder/wohnzimmer2-small.png → bilder/wohnzimmer2-small.png
Executable file → Normal file
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
0
public/bilder/wohnzimmer2.png → bilder/wohnzimmer2.png
Executable file → Normal file
|
Before Width: | Height: | Size: 619 KiB After Width: | Height: | Size: 619 KiB |
5
public/css/haus-schleusingen.css → css/haus-schleusingen.css
Executable file → Normal file
@@ -1216,7 +1216,7 @@ footer {
|
|||||||
gap: 0;
|
gap: 0;
|
||||||
z-index: 95;
|
z-index: 95;
|
||||||
border-bottom: 1px solid var(--warm);
|
border-bottom: 1px solid var(--warm);
|
||||||
animation: slide-down 0.3s ease;
|
animation: slideDown 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav.mobile-open .nav-links a {
|
nav.mobile-open .nav-links a {
|
||||||
@@ -1239,12 +1239,11 @@ footer {
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes slide-down {
|
@keyframes slideDown {
|
||||||
from {
|
from {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateY(-10px);
|
transform: translateY(-10px);
|
||||||
}
|
}
|
||||||
|
|
||||||
to {
|
to {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
@@ -1,12 +1,110 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Datenschutzerklärung – Haus Schleusingen</title>
|
||||||
|
<meta name="description" content="Datenschutzerklärung der Website haus-schleusingen.de" />
|
||||||
|
<meta name="robots" content="noindex" />
|
||||||
|
<link rel="canonical" href="https://haus-schleusingen.de/datenschutz.html" />
|
||||||
|
<link rel="stylesheet" href="fonts/fonts.css" />
|
||||||
|
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
||||||
|
<style>
|
||||||
|
.legal-page {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 8rem 3rem 6rem;
|
||||||
|
min-height: 70vh;
|
||||||
|
}
|
||||||
|
.legal-page .section-eyebrow { margin-bottom: 0.75rem; }
|
||||||
|
.legal-page h1 {
|
||||||
|
font-family: "Cormorant Garamond", serif;
|
||||||
|
font-size: clamp(2rem, 4vw, 3rem);
|
||||||
|
font-weight: 300;
|
||||||
|
color: var(--charcoal);
|
||||||
|
margin-bottom: 2.5rem;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
.legal-page h2 {
|
||||||
|
font-family: "Cormorant Garamond", serif;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--charcoal);
|
||||||
|
margin-top: 2.5rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.legal-page h3 {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--dark);
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
.legal-page p, .legal-page ul {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
line-height: 1.85;
|
||||||
|
color: var(--stone);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.legal-page ul { padding-left: 1.25rem; }
|
||||||
|
.legal-page ul li { margin-bottom: 0.4rem; }
|
||||||
|
.legal-page a {
|
||||||
|
color: var(--accent);
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
.legal-page a:hover { color: var(--accent-light); }
|
||||||
|
.legal-page address {
|
||||||
|
font-style: normal;
|
||||||
|
line-height: 1.85;
|
||||||
|
color: var(--stone);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
.legal-back {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
margin-top: 3rem;
|
||||||
|
padding: 0.8rem 2rem;
|
||||||
|
font-family: "DM Sans", sans-serif;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: var(--accent);
|
||||||
|
color: var(--white);
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: background 0.3s, transform 0.2s;
|
||||||
|
}
|
||||||
|
.legal-back:hover {
|
||||||
|
background: var(--accent-light);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
color: var(--white);
|
||||||
|
}
|
||||||
|
.legal-divider {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid var(--warm);
|
||||||
|
margin: 2rem 0;
|
||||||
|
}
|
||||||
|
@media (width <= 768px) {
|
||||||
|
.legal-page { padding: 6rem 1.5rem 4rem; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
<nav id="navbar" class="scrolled">
|
<nav id="navbar" class="scrolled">
|
||||||
<div class="nav-logo">Bahnhofstraße 10</div>
|
<div class="nav-logo">Bahnhofstraße 10</div>
|
||||||
<ul class="nav-links">
|
<ul class="nav-links">
|
||||||
<li><a href="/#galerie">Galerie</a></li>
|
<li><a href="haus-schleusingen.html#galerie">Galerie</a></li>
|
||||||
<li><a href="/#grundriss">Grundriss</a></li>
|
<li><a href="haus-schleusingen.html#grundriss">Grundriss</a></li>
|
||||||
<li><a href="/#miete">Miete</a></li>
|
<li><a href="haus-schleusingen.html#miete">Miete</a></li>
|
||||||
<li><a href="/#lage">Lage</a></li>
|
<li><a href="haus-schleusingen.html#lage">Lage</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="/#kontakt" class="nav-cta" style="text-decoration:none;">Jetzt anfragen</a>
|
<a href="haus-schleusingen.html#kontakt" class="nav-cta" style="text-decoration:none;">Jetzt anfragen</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<main class="legal-page">
|
<main class="legal-page">
|
||||||
@@ -111,13 +209,15 @@
|
|||||||
Zur Ausübung Ihrer Rechte wenden Sie sich bitte an: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a>
|
Zur Ausübung Ihrer Rechte wenden Sie sich bitte an: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a href="/" class="legal-back">← Zurück zum Objekt</a>
|
<a href="haus-schleusingen.html" class="legal-back">← Zurück zum Objekt</a>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer-logo">Bahnhofstraße 10 · Schleusingen</div>
|
<div class="footer-logo">Bahnhofstraße 10 · Schleusingen</div>
|
||||||
<div class="footer-links">
|
<div class="footer-links">
|
||||||
<a href="/impressum">Impressum</a>
|
<a href="impressum.html">Impressum</a>
|
||||||
<a href="/datenschutz">Datenschutz</a>
|
<a href="datenschutz.html">Datenschutz</a>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
0
docker-preview.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
0
eslint.config.js
Executable file → Normal file
0
public/fonts/CormorantGaramond-Light.ttf → fonts/CormorantGaramond-Light.ttf
Executable file → Normal file
0
public/fonts/CormorantGaramond-Regular.ttf → fonts/CormorantGaramond-Regular.ttf
Executable file → Normal file
0
public/fonts/CormorantGaramond-SemiBold.ttf → fonts/CormorantGaramond-SemiBold.ttf
Executable file → Normal file
0
public/fonts/DMSans-Light.ttf → fonts/DMSans-Light.ttf
Executable file → Normal file
0
public/fonts/DMSans-Medium.ttf → fonts/DMSans-Medium.ttf
Executable file → Normal file
0
public/fonts/DMSans-Regular.ttf → fonts/DMSans-Regular.ttf
Executable file → Normal file
0
public/fonts/fonts.css → fonts/fonts.css
Executable file → Normal file
@@ -1,12 +1,110 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Impressum – Haus Schleusingen</title>
|
||||||
|
<meta name="description" content="Impressum der Website haus-schleusingen.de" />
|
||||||
|
<meta name="robots" content="noindex" />
|
||||||
|
<link rel="canonical" href="https://haus-schleusingen.de/impressum.html" />
|
||||||
|
<link rel="stylesheet" href="fonts/fonts.css" />
|
||||||
|
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
||||||
|
<style>
|
||||||
|
.legal-page {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 8rem 3rem 6rem;
|
||||||
|
min-height: 70vh;
|
||||||
|
}
|
||||||
|
.legal-page .section-eyebrow { margin-bottom: 0.75rem; }
|
||||||
|
.legal-page h1 {
|
||||||
|
font-family: "Cormorant Garamond", serif;
|
||||||
|
font-size: clamp(2rem, 4vw, 3rem);
|
||||||
|
font-weight: 300;
|
||||||
|
color: var(--charcoal);
|
||||||
|
margin-bottom: 2.5rem;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
.legal-page h2 {
|
||||||
|
font-family: "Cormorant Garamond", serif;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--charcoal);
|
||||||
|
margin-top: 2.5rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.legal-page h3 {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--dark);
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
.legal-page p, .legal-page ul {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
line-height: 1.85;
|
||||||
|
color: var(--stone);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.legal-page ul { padding-left: 1.25rem; }
|
||||||
|
.legal-page ul li { margin-bottom: 0.4rem; }
|
||||||
|
.legal-page a {
|
||||||
|
color: var(--accent);
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
.legal-page a:hover { color: var(--accent-light); }
|
||||||
|
.legal-page address {
|
||||||
|
font-style: normal;
|
||||||
|
line-height: 1.85;
|
||||||
|
color: var(--stone);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
.legal-back {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
margin-top: 3rem;
|
||||||
|
padding: 0.8rem 2rem;
|
||||||
|
font-family: "DM Sans", sans-serif;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
background: var(--accent);
|
||||||
|
color: var(--white);
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: background 0.3s, transform 0.2s;
|
||||||
|
}
|
||||||
|
.legal-back:hover {
|
||||||
|
background: var(--accent-light);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
color: var(--white);
|
||||||
|
}
|
||||||
|
.legal-divider {
|
||||||
|
border: none;
|
||||||
|
border-top: 1px solid var(--warm);
|
||||||
|
margin: 2rem 0;
|
||||||
|
}
|
||||||
|
@media (width <= 768px) {
|
||||||
|
.legal-page { padding: 6rem 1.5rem 4rem; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
<nav id="navbar" class="scrolled">
|
<nav id="navbar" class="scrolled">
|
||||||
<div class="nav-logo">Bahnhofstraße 10</div>
|
<div class="nav-logo">Bahnhofstraße 10</div>
|
||||||
<ul class="nav-links">
|
<ul class="nav-links">
|
||||||
<li><a href="/#galerie">Galerie</a></li>
|
<li><a href="haus-schleusingen.html#galerie">Galerie</a></li>
|
||||||
<li><a href="/#grundriss">Grundriss</a></li>
|
<li><a href="haus-schleusingen.html#grundriss">Grundriss</a></li>
|
||||||
<li><a href="/#miete">Miete</a></li>
|
<li><a href="haus-schleusingen.html#miete">Miete</a></li>
|
||||||
<li><a href="/#lage">Lage</a></li>
|
<li><a href="haus-schleusingen.html#lage">Lage</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="/#kontakt" class="nav-cta" style="text-decoration:none;">Jetzt anfragen</a>
|
<a href="haus-schleusingen.html#kontakt" class="nav-cta" style="text-decoration:none;">Jetzt anfragen</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<main class="legal-page">
|
<main class="legal-page">
|
||||||
@@ -73,13 +171,15 @@
|
|||||||
Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.
|
Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a href="/" class="legal-back">← Zurück zum Objekt</a>
|
<a href="haus-schleusingen.html" class="legal-back">← Zurück zum Objekt</a>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer-logo">Bahnhofstraße 10 · Schleusingen</div>
|
<div class="footer-logo">Bahnhofstraße 10 · Schleusingen</div>
|
||||||
<div class="footer-links">
|
<div class="footer-links">
|
||||||
<a href="/impressum">Impressum</a>
|
<a href="impressum.html">Impressum</a>
|
||||||
<a href="/datenschutz">Datenschutz</a>
|
<a href="datenschutz.html">Datenschutz</a>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
767
index.php
Normal file
@@ -0,0 +1,767 @@
|
|||||||
|
<?php
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
// --- Helper functions ---
|
||||||
|
function normalizeContactValue(string $value): string
|
||||||
|
{
|
||||||
|
return trim($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeContactValue(string $value): string
|
||||||
|
{
|
||||||
|
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
function containsHeaderInjection(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') {
|
||||||
|
// Collect and normalize input
|
||||||
|
$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 check – hidden field must be empty
|
||||||
|
$honeypot = normalizeContactValue((string) ($_POST['website'] ?? ''));
|
||||||
|
if ($honeypot !== '') {
|
||||||
|
// Bot detected – pretend success
|
||||||
|
header('Location: ' . $_SERVER['REQUEST_URI'] . '#form-result');
|
||||||
|
$_SESSION['form_success'] = true;
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
// Server-side validation
|
||||||
|
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.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Header injection check
|
||||||
|
if (containsHeaderInjection($formData['email']) || containsHeaderInjection($formData['fname'] . ' ' . $formData['lname'])) {
|
||||||
|
$formErrors[] = 'Ungültige Zeichen in den Eingabefeldern.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Minimum time check – form submitted too fast (< 3 seconds)
|
||||||
|
$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.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Session rate limit – max 1 submission per 60 seconds
|
||||||
|
$lastSubmit = $_SESSION['last_contact_submit'] ?? 0;
|
||||||
|
if ($lastSubmit && (time() - $lastSubmit) < 60) {
|
||||||
|
$formErrors[] = 'Bitte warten Sie einen Moment vor der nächsten Anfrage.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send email if no errors
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<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">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Einfamilienhaus mieten Schleusingen | 227 m², 6 Zimmer | 1.300 € Kaltmiete</title>
|
||||||
|
<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." />
|
||||||
|
<link rel="canonical" href="https://haus-schleusingen.de/haus-schleusingen.html" />
|
||||||
|
|
||||||
|
<!-- Open Graph -->
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:title" content="Einfamilienhaus zur Miete in Schleusingen – 227 m², 6 Zimmer" />
|
||||||
|
<meta property="og:description" content="Großzügiges Einfamilienhaus zur Langzeitmiete: 227 m², 6 Zimmer, 3 Etagen + Dachterrasse. Kaltmiete 1.300 €. Ab sofort verfügbar in Schleusingen." />
|
||||||
|
<meta property="og:image" content="https://haus-schleusingen.de/bilder/Außenansicht-2.png" />
|
||||||
|
<meta property="og:url" content="https://haus-schleusingen.de/haus-schleusingen.html" />
|
||||||
|
<meta property="og:locale" content="de_DE" />
|
||||||
|
<meta property="og:site_name" content="Haus Schleusingen" />
|
||||||
|
|
||||||
|
<!-- Schema.org Structured Data -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@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/haus-schleusingen.html",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="fonts/fonts.css" />
|
||||||
|
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<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.png)"
|
||||||
|
></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>
|
||||||
|
<img src="bilder/wohnzimmer2.png" alt="Wohnzimmer" />
|
||||||
|
<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.png" role="button" tabindex="0" aria-label="Außenansicht – Großansicht öffnen">
|
||||||
|
<img src="bilder/Außenansicht-2-small.png" alt="Außenansicht des Einfamilienhauses" />
|
||||||
|
<span class="grid-item-label">Außenansicht</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/wohnzimmer2.png" role="button" tabindex="0" aria-label="Wohnzimmer – Großansicht öffnen">
|
||||||
|
<img src="bilder/wohnzimmer2-small.png" alt="Wohnzimmer mit 42,6 m² Wohnfläche" />
|
||||||
|
<span class="grid-item-label">Wohnzimmer · 42,6 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/Küche 1.jpg" role="button" tabindex="0" aria-label="Küche – Großansicht öffnen">
|
||||||
|
<img src="bilder/Küche 1.jpg" alt="Küche mit 18,4 m²" />
|
||||||
|
<span class="grid-item-label">Küche · 18,4 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/schlafzimmer.png" role="button" tabindex="0" aria-label="Schlafzimmer – Großansicht öffnen">
|
||||||
|
<img src="bilder/schlafzimmer-small.png" alt="Schlafzimmer mit 18 m²" />
|
||||||
|
<span class="grid-item-label">Schlafzimmer · 18 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/Bad.jpg" role="button" tabindex="0" aria-label="Badezimmer – Großansicht öffnen">
|
||||||
|
<img src="bilder/Bad.jpg" alt="Badezimmer mit 9,8 m²" />
|
||||||
|
<span class="grid-item-label">Badezimmer · 9,8 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/Kinderzimmer.png" role="button" tabindex="0" aria-label="Kinderzimmer 1 – Großansicht öffnen">
|
||||||
|
<img src="bilder/Kinderzimmer-small.png" alt="Kinderzimmer 1 mit 21,7 m²" />
|
||||||
|
<span class="grid-item-label">Kinderzimmer 1 · 21,7 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/Kinderzimmer 2.jpg" role="button" tabindex="0" aria-label="Kinderzimmer 2 – Großansicht öffnen">
|
||||||
|
<img src="bilder/Kinderzimmer 2-small.png" alt="Kinderzimmer 2 mit 15,7 m²" />
|
||||||
|
<span class="grid-item-label">Kinderzimmer 2 · 15,7 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/kinderzimmer 2 2.jpeg" role="button" tabindex="0" aria-label="Kinderzimmer Detail – Großansicht öffnen">
|
||||||
|
<img src="bilder/kinderzimmer 2 2-small.png" alt="Detailansicht Kinderzimmer" />
|
||||||
|
<span class="grid-item-label">Kinderzimmer Detail</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/Kinderzimmer 3.jpg" role="button" tabindex="0" aria-label="Gästezimmer – Großansicht öffnen">
|
||||||
|
<img src="bilder/Kinderzimmer 3-small.png" alt="Gästezimmer mit 11,5 m²" />
|
||||||
|
<span class="grid-item-label">Gästezimmer · 11,5 m²</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/Bad-2.jpg" role="button" tabindex="0" aria-label="Zweites Bad – Großansicht öffnen">
|
||||||
|
<img src="bilder/Bad-2-small.jpg" alt="Zweites Badezimmer im Haus" />
|
||||||
|
<span class="grid-item-label">Wohnbereich</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/bad3.jpg" role="button" tabindex="0" aria-label="Drittes Bad – Großansicht öffnen">
|
||||||
|
<img src="bilder/Bad-3-small.jpg" alt="Drittes Badezimmer im Haus" />
|
||||||
|
<span class="grid-item-label">Wohnbereich Detail</span>
|
||||||
|
</div>
|
||||||
|
<div class="grid-item" data-img="bilder/WhatsApp Image 2026-03-30 at 07.50.42 (2).jpeg" role="button" tabindex="0" aria-label="Hausansicht – Großansicht öffnen">
|
||||||
|
<img
|
||||||
|
src="bilder/WhatsApp Image 2026-03-30 at 07.50.42 (2).jpeg"
|
||||||
|
alt="Weitere Außenansicht des Einfamilienhauses"
|
||||||
|
/>
|
||||||
|
<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">
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/EG-small.jpg"
|
||||||
|
alt="Grundriss Erdgeschoss"
|
||||||
|
data-img="bilder/grundrisse/EG.png"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/EG 3D-small.jpg"
|
||||||
|
alt="Grundriss Erdgeschoss"
|
||||||
|
data-img="bilder/grundrisse/EG 3D.png"
|
||||||
|
/>
|
||||||
|
</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">
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/OG 1 2-small.jpg"
|
||||||
|
alt="Grundriss 1. Obergeschoss"
|
||||||
|
data-img="bilder/grundrisse/OG 1 2.png"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/OG 1 3D-small.jpg"
|
||||||
|
alt="Grundriss 1. Obergeschoss"
|
||||||
|
data-img="bilder/grundrisse/OG 1 3D.png"
|
||||||
|
/>
|
||||||
|
</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">
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/OG 2 grundriss-small.jpg"
|
||||||
|
alt="Grundriss 2. Obergeschoss (1)"
|
||||||
|
data-img="bilder/grundrisse/OG 2 grundriss.png"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/OG 2 3D-small.jpg"
|
||||||
|
alt="Grundriss 2. Obergeschoss (1)"
|
||||||
|
data-img="bilder/grundrisse/OG 2 3D.png"
|
||||||
|
/>
|
||||||
|
</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">
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/Dachboden unten 2-small.jpg"
|
||||||
|
alt="Grundriss Dachboden"
|
||||||
|
data-img="bilder/grundrisse/Dachboden unten 2.png"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
src="bilder/grundrisse/Dachboden unten-small.jpg"
|
||||||
|
alt="Grundriss Dachboden"
|
||||||
|
data-img="bilder/grundrisse/Dachboden unten.png"
|
||||||
|
/>
|
||||||
|
</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-result" 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>
|
||||||
|
<!-- Honeypot: hidden field for spam bots -->
|
||||||
|
<div class="hp-field" aria-hidden="true">
|
||||||
|
<label for="website">Website</label>
|
||||||
|
<input type="text" id="website" name="website" tabindex="-1" autocomplete="off" />
|
||||||
|
</div>
|
||||||
|
<!-- Form load timestamp for minimum-submit-time check -->
|
||||||
|
<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.html">Impressum</a>
|
||||||
|
<a href="datenschutz.html">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>
|
||||||
|
|
||||||
|
<script src="js/haus-schleusingen.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
47
public/js/haus-schleusingen.js → js/haus-schleusingen.js
Executable file → Normal file
@@ -81,6 +81,10 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
this.click();
|
this.click();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if (e.key === "Enter" || e.key === " ") {
|
||||||
|
e.preventDefault();
|
||||||
|
$(this).trigger("click");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Lightbox – track last focused element for focus return
|
// Lightbox – track last focused element for focus return
|
||||||
@@ -88,33 +92,27 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
|
|
||||||
function openLightbox(src) {
|
function openLightbox(src) {
|
||||||
lightboxTrigger = document.activeElement;
|
lightboxTrigger = document.activeElement;
|
||||||
var img = document.getElementById("lightboxImg");
|
$("#lightboxImg").attr("src", src).attr("alt", "");
|
||||||
// WebP fallback: if .webp fails, try original format
|
$("#lightbox").addClass("open");
|
||||||
img.onerror = function () {
|
$("body").css("overflow", "hidden");
|
||||||
if (img.getAttribute('src').endsWith('.webp')) {
|
|
||||||
img.setAttribute('src', src.replace(/\.webp$/, '.png'));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
img.setAttribute("src", src);
|
|
||||||
img.setAttribute("alt", "");
|
|
||||||
document.getElementById("lightbox").classList.add("open");
|
|
||||||
document.body.style.overflow = "hidden";
|
|
||||||
// Set focus to close button
|
// Set focus to close button
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
document.getElementById("lightboxClose").focus();
|
$("#lightboxClose").focus();
|
||||||
}, 50);
|
}, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeLightbox() {
|
function closeLightbox() {
|
||||||
document.getElementById("lightbox").classList.remove("open");
|
$("#lightbox").removeClass("open");
|
||||||
document.body.style.overflow = "";
|
$("body").css("overflow", "");
|
||||||
// Return focus to trigger
|
// Return focus to trigger
|
||||||
if (lightboxTrigger) {
|
if (lightboxTrigger) {
|
||||||
lightboxTrigger.focus();
|
$(lightboxTrigger).focus();
|
||||||
lightboxTrigger = null;
|
lightboxTrigger = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lightbox – gallery grid items
|
||||||
|
|
||||||
// Lightbox – gallery grid items
|
// Lightbox – gallery grid items
|
||||||
document.querySelectorAll(".grid-item").forEach(function (item) {
|
document.querySelectorAll(".grid-item").forEach(function (item) {
|
||||||
item.addEventListener("click", function () {
|
item.addEventListener("click", function () {
|
||||||
@@ -141,7 +139,26 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function openLightbox(src) {
|
||||||
|
lightboxTrigger = document.activeElement;
|
||||||
|
document.getElementById("lightboxImg").setAttribute("src", src);
|
||||||
|
document.getElementById("lightbox").classList.add("open");
|
||||||
|
document.body.style.overflow = "hidden";
|
||||||
|
// Focus close button
|
||||||
|
setTimeout(function () {
|
||||||
|
document.getElementById("lightboxClose").focus();
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeLightbox() {
|
||||||
|
document.getElementById("lightbox").classList.remove("open");
|
||||||
|
document.body.style.overflow = "";
|
||||||
|
// Return focus to trigger
|
||||||
|
if (lightboxTrigger) {
|
||||||
|
lightboxTrigger.focus();
|
||||||
|
lightboxTrigger = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
document.getElementById("lightboxClose").addEventListener("click", closeLightbox);
|
document.getElementById("lightboxClose").addEventListener("click", closeLightbox);
|
||||||
document.getElementById("lightbox").addEventListener("click", function (e) {
|
document.getElementById("lightbox").addEventListener("click", function (e) {
|
||||||
15
nginx.conf
Executable file → Normal file
@@ -5,20 +5,7 @@ server {
|
|||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index haus-schleusingen.html;
|
index haus-schleusingen.html;
|
||||||
|
|
||||||
# Gzip aktivieren
|
|
||||||
gzip on;
|
|
||||||
gzip_types text/css application/javascript image/svg+xml application/json text/xml;
|
|
||||||
gzip_min_length 256;
|
|
||||||
gzip_vary on;
|
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /haus-schleusingen.html;
|
try_files $uri $uri/ /haus-schleusingen.html;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
# Lange Cache-Dauer für Bilder und statische Assets
|
|
||||||
location ~* \.(jpg|jpeg|png|webp|gif|ico|svg|css|js|woff2?)$ {
|
|
||||||
expires 30d;
|
|
||||||
add_header Cache-Control "public, immutable";
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
0
package.json
Executable file → Normal file
0
page-preview.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
@@ -1,15 +0,0 @@
|
|||||||
# Enable rewrite engine
|
|
||||||
RewriteEngine On
|
|
||||||
|
|
||||||
# Legacy redirects (301) – must be before the catch-all
|
|
||||||
RewriteRule ^impressum\.html$ /impressum [R=301,L]
|
|
||||||
RewriteRule ^datenschutz\.html$ /datenschutz [R=301,L]
|
|
||||||
RewriteRule ^haus-schleusingen\.html$ / [R=301,L]
|
|
||||||
|
|
||||||
# Serve existing files/directories directly (css, js, images, fonts, etc.)
|
|
||||||
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
|
||||||
RewriteCond %{REQUEST_FILENAME} -d
|
|
||||||
RewriteRule ^ - [L]
|
|
||||||
|
|
||||||
# Route everything else through the front controller
|
|
||||||
RewriteRule ^(.*)$ index.php [QSA,L]
|
|
||||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 290 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 104 KiB |