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