Compare commits
3 Commits
feature/is
...
f84f4ed42d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f84f4ed42d | ||
|
|
dd6b816cab | ||
|
|
938e7018b8 |
@@ -1,71 +0,0 @@
|
|||||||
name: Deploy Feature Branch to Test
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- "feature/**"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
deploy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
volumes:
|
|
||||||
- /var/www/test/html:/deploy
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Show branch info
|
|
||||||
run: |
|
|
||||||
echo "=== Deploying branch: ${{ gitea.ref_name }} ==="
|
|
||||||
echo "=== Commit: ${{ gitea.sha }} ==="
|
|
||||||
echo "=== By: ${{ gitea.actor }} ==="
|
|
||||||
date
|
|
||||||
|
|
||||||
- name: Deploy to test environment
|
|
||||||
run: |
|
|
||||||
echo "Syncing files to test environment..."
|
|
||||||
apt-get update -qq && apt-get install -y -qq rsync > /dev/null 2>&1 || true
|
|
||||||
|
|
||||||
rsync -av --delete \
|
|
||||||
--exclude='.git' \
|
|
||||||
--exclude='.gitea' \
|
|
||||||
--exclude='.husky' \
|
|
||||||
--exclude='.prettierrc' \
|
|
||||||
--exclude='.prettierignore' \
|
|
||||||
--exclude='.stylelintrc.json' \
|
|
||||||
--exclude='.htmlhintrc' \
|
|
||||||
--exclude='.gitignore' \
|
|
||||||
--exclude='.dockerignore' \
|
|
||||||
--exclude='Dockerfile' \
|
|
||||||
--exclude='nginx.conf' \
|
|
||||||
--exclude='eslint.config.js' \
|
|
||||||
--exclude='package.json' \
|
|
||||||
--exclude='docker-preview.png' \
|
|
||||||
--exclude='page-preview.png' \
|
|
||||||
--exclude='screenshot-landingpage*' \
|
|
||||||
--exclude='AGENTS.md' \
|
|
||||||
--exclude='README.md' \
|
|
||||||
./ /deploy/
|
|
||||||
|
|
||||||
# Set haus-schleusingen.html as index
|
|
||||||
cp /deploy/haus-schleusingen.html /deploy/index.html 2>/dev/null || true
|
|
||||||
|
|
||||||
echo "✅ Deployment complete!"
|
|
||||||
|
|
||||||
- name: Set permissions
|
|
||||||
run: |
|
|
||||||
chown -R 33:33 /deploy/ 2>/dev/null || true
|
|
||||||
chmod -R 755 /deploy/ 2>/dev/null || true
|
|
||||||
echo "✅ Permissions set"
|
|
||||||
|
|
||||||
- name: Deployment summary
|
|
||||||
run: |
|
|
||||||
echo "=========================================="
|
|
||||||
echo " 🚀 Deployment Summary"
|
|
||||||
echo "=========================================="
|
|
||||||
echo " Branch: ${{ gitea.ref_name }}"
|
|
||||||
echo " Commit: ${{ gitea.sha }}"
|
|
||||||
echo " Target: http://178.104.150.0/"
|
|
||||||
echo " Time: $(date)"
|
|
||||||
echo "=========================================="
|
|
||||||
BIN
bilder/Außenansicht-2-small.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
bilder/Außenansicht-2.webp
Normal file
|
After Width: | Height: | Size: 153 KiB |
BIN
bilder/Bad-2-small.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
bilder/Bad-2.webp
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
bilder/Bad-3-small.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
bilder/Bad-3.webp
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
bilder/Bad-4-small.webp
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
bilder/Bad-4.webp
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
bilder/Bad-small.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
bilder/Bad.webp
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
bilder/Kinderzimmer 2-small.webp
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
bilder/Kinderzimmer 2.webp
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
bilder/Kinderzimmer 3-small.webp
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
bilder/Kinderzimmer 3.webp
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
bilder/Kinderzimmer-small.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
bilder/Kinderzimmer.webp
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
bilder/Küche 1-small.webp
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
bilder/Küche 1.webp
Normal file
|
After Width: | Height: | Size: 371 KiB |
BIN
bilder/grundrisse/Dachboden unten 2-small.webp
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
bilder/grundrisse/Dachboden unten 2.webp
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
bilder/grundrisse/Dachboden unten-small.webp
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
bilder/grundrisse/Dachboden unten.webp
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
bilder/grundrisse/EG 3D-small.webp
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
bilder/grundrisse/EG 3D.webp
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
bilder/grundrisse/EG-small.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
bilder/grundrisse/EG.webp
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
bilder/grundrisse/OG 1 2-small.webp
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
bilder/grundrisse/OG 1 2.webp
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
bilder/grundrisse/OG 1 3D-small.webp
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
bilder/grundrisse/OG 1 3D.webp
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
bilder/grundrisse/OG 2 3D-small.webp
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
bilder/grundrisse/OG 2 3D.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
bilder/grundrisse/OG 2 grundriss-small.webp
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
bilder/grundrisse/OG 2 grundriss.webp
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
bilder/kinderzimmer 2 2-small.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
bilder/kinderzimmer 2 2.webp
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
bilder/schlafzimmer-small.webp
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
bilder/schlafzimmer.webp
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
bilder/wohnzimmer2-small.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
bilder/wohnzimmer2.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
@@ -1,55 +1,7 @@
|
|||||||
/* SKIP LINK */
|
|
||||||
.skip-link {
|
|
||||||
position: absolute;
|
|
||||||
left: -9999px;
|
|
||||||
top: 0;
|
|
||||||
background: var(--accent);
|
|
||||||
color: var(--white);
|
|
||||||
padding: 0.75rem 1.5rem;
|
|
||||||
font-size: 0.85rem;
|
|
||||||
font-weight: 500;
|
|
||||||
z-index: 200;
|
|
||||||
text-decoration: none;
|
|
||||||
transition: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.skip-link:focus {
|
|
||||||
left: 0;
|
|
||||||
outline: 2px solid var(--white);
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FOCUS VISIBLE */
|
|
||||||
*:focus-visible {
|
|
||||||
outline: 2px solid var(--accent);
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lightbox-close:focus-visible {
|
|
||||||
outline: 2px solid var(--white);
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
button:focus-visible,
|
|
||||||
a:focus-visible {
|
|
||||||
outline: 2px solid var(--accent);
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-item:focus-visible {
|
|
||||||
outline: 2px solid var(--accent);
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.floor-header:focus-visible {
|
|
||||||
outline: 2px solid var(--accent);
|
|
||||||
outline-offset: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--cream: #f5f0e8;
|
--cream: #f5f0e8;
|
||||||
--warm: #e8dfd0;
|
--warm: #e8dfd0;
|
||||||
--stone: #7a7062;
|
--stone: #9e9485;
|
||||||
--dark: #1c1a17;
|
--dark: #1c1a17;
|
||||||
--charcoal: #2e2b26;
|
--charcoal: #2e2b26;
|
||||||
--accent: #8b6914;
|
--accent: #8b6914;
|
||||||
@@ -140,105 +92,23 @@ nav.scrolled .nav-links a:hover {
|
|||||||
|
|
||||||
.nav-cta {
|
.nav-cta {
|
||||||
font-family: "DM Sans", sans-serif;
|
font-family: "DM Sans", sans-serif;
|
||||||
font-size: 0.82rem;
|
font-size: 0.78rem;
|
||||||
font-weight: 600;
|
font-weight: 500;
|
||||||
letter-spacing: 0.12em;
|
letter-spacing: 0.1em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
background: var(--accent);
|
background: var(--accent);
|
||||||
color: var(--white);
|
color: var(--white);
|
||||||
border: none;
|
border: none;
|
||||||
padding: 0.8rem 2rem;
|
padding: 0.65rem 1.5rem;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
border-radius: 2px;
|
|
||||||
box-shadow: 0 2px 12px rgb(139 105 20 / 35%);
|
|
||||||
transition:
|
transition:
|
||||||
background 0.3s,
|
background 0.3s,
|
||||||
transform 0.2s,
|
transform 0.2s;
|
||||||
box-shadow 0.3s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-cta:hover {
|
.nav-cta:hover {
|
||||||
background: var(--accent-light);
|
background: var(--accent-light);
|
||||||
transform: translateY(-2px);
|
transform: translateY(-1px);
|
||||||
box-shadow: 0 4px 20px rgb(139 105 20 / 50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* HAMBURGER */
|
|
||||||
.nav-hamburger {
|
|
||||||
display: none;
|
|
||||||
width: 44px;
|
|
||||||
height: 44px;
|
|
||||||
background: none;
|
|
||||||
border: none;
|
|
||||||
cursor: pointer;
|
|
||||||
position: relative;
|
|
||||||
z-index: 110;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger span,
|
|
||||||
.nav-hamburger span::before,
|
|
||||||
.nav-hamburger span::after {
|
|
||||||
display: block;
|
|
||||||
width: 22px;
|
|
||||||
height: 2px;
|
|
||||||
background: var(--white);
|
|
||||||
border-radius: 1px;
|
|
||||||
transition:
|
|
||||||
transform 0.3s ease,
|
|
||||||
opacity 0.3s ease,
|
|
||||||
background 0.4s;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger span::before,
|
|
||||||
.nav-hamburger span::after {
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger span::before {
|
|
||||||
transform: translateY(-7px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger span::after {
|
|
||||||
transform: translateY(7px);
|
|
||||||
}
|
|
||||||
|
|
||||||
nav.scrolled .nav-hamburger span,
|
|
||||||
nav.scrolled .nav-hamburger span::before,
|
|
||||||
nav.scrolled .nav-hamburger span::after {
|
|
||||||
background: var(--dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger.active span {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger.active span::before {
|
|
||||||
transform: rotate(45deg);
|
|
||||||
background: var(--dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-hamburger.active span::after {
|
|
||||||
transform: rotate(-45deg);
|
|
||||||
background: var(--dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-mobile-overlay {
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background: rgb(28 26 23 / 50%);
|
|
||||||
z-index: 90;
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-mobile-overlay.active {
|
|
||||||
display: block;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* HERO */
|
/* HERO */
|
||||||
@@ -1039,36 +909,6 @@ nav.scrolled .nav-hamburger span::after {
|
|||||||
transform: translateY(-1px);
|
transform: translateY(-1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-errors {
|
|
||||||
background: #fdf2f2;
|
|
||||||
border: 1px solid #e8a0a0;
|
|
||||||
padding: 1rem 1.2rem;
|
|
||||||
margin-bottom: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-errors ul {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 0 0 1.2rem;
|
|
||||||
list-style: disc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-errors li {
|
|
||||||
font-size: 0.85rem;
|
|
||||||
color: #9e2c2c;
|
|
||||||
line-height: 1.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hp-field {
|
|
||||||
position: absolute;
|
|
||||||
left: -9999px;
|
|
||||||
top: -9999px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
opacity: 0;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-success {
|
.form-success {
|
||||||
display: none;
|
display: none;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -1198,58 +1038,6 @@ footer {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-hamburger {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mobile slide-down nav */
|
|
||||||
nav.mobile-open .nav-links {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
background: rgb(253 252 250 / 98%);
|
|
||||||
backdrop-filter: blur(12px);
|
|
||||||
padding: 5rem 1.5rem 2rem;
|
|
||||||
gap: 0;
|
|
||||||
z-index: 95;
|
|
||||||
border-bottom: 1px solid var(--warm);
|
|
||||||
animation: slideDown 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav.mobile-open .nav-links a {
|
|
||||||
color: var(--charcoal);
|
|
||||||
font-size: 1rem;
|
|
||||||
padding: 1rem 0;
|
|
||||||
border-bottom: 1px solid var(--warm);
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
min-height: 44px;
|
|
||||||
}
|
|
||||||
|
|
||||||
nav.mobile-open .nav-hamburger span,
|
|
||||||
nav.mobile-open .nav-hamburger span::before,
|
|
||||||
nav.mobile-open .nav-hamburger span::after {
|
|
||||||
background: var(--dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
nav.mobile-open .nav-hamburger.active span {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes slideDown {
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-10px);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-content {
|
.hero-content {
|
||||||
padding: 0 1.5rem 4rem;
|
padding: 0 1.5rem 4rem;
|
||||||
}
|
}
|
||||||
|
|||||||
223
datenschutz.html
@@ -1,223 +0,0 @@
|
|||||||
<!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">
|
|
||||||
<div class="nav-logo">Bahnhofstraße 10</div>
|
|
||||||
<ul class="nav-links">
|
|
||||||
<li><a href="haus-schleusingen.html#galerie">Galerie</a></li>
|
|
||||||
<li><a href="haus-schleusingen.html#grundriss">Grundriss</a></li>
|
|
||||||
<li><a href="haus-schleusingen.html#miete">Miete</a></li>
|
|
||||||
<li><a href="haus-schleusingen.html#lage">Lage</a></li>
|
|
||||||
</ul>
|
|
||||||
<a href="haus-schleusingen.html#kontakt" class="nav-cta" style="text-decoration:none;">Jetzt anfragen</a>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<main class="legal-page">
|
|
||||||
<div class="section-eyebrow">Datenschutz</div>
|
|
||||||
<h1>Datenschutzerklärung</h1>
|
|
||||||
|
|
||||||
<h2>1. Verantwortliche Stelle</h2>
|
|
||||||
<address>
|
|
||||||
Martin Kiesewetter<br />
|
|
||||||
Am Schaftalsgraben 4<br />
|
|
||||||
98529 Suhl<br />
|
|
||||||
Telefon: 0176 – 45853923<br />
|
|
||||||
E-Mail: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a>
|
|
||||||
</address>
|
|
||||||
<p>
|
|
||||||
Diese Datenschutzerklärung informiert Sie über die Art, den Umfang und den Zweck der Erhebung und Verwendung personenbezogener Daten auf dieser Website.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>2. Erhebung und Speicherung personenbezogener Daten</h2>
|
|
||||||
|
|
||||||
<h3>a) Beim Besuch der Website</h3>
|
|
||||||
<p>
|
|
||||||
Beim Aufrufen dieser Website werden durch den Hosting-Anbieter automatisch Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles) beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres Internet-Service-Providers, Ihre IP-Adresse und Ähnliches. Sie werden insbesondere zu einem sicheren und reibungslosen Betrieb der Website benötigt.
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>IP-Adresse</li>
|
|
||||||
<li>Datum und Uhrzeit der Anfrage</li>
|
|
||||||
<li>Zeitzonenunterschied zur Greenwich Mean Time (GMT)</li>
|
|
||||||
<li>Inhalt der Anforderung (konkrete Seite)</li>
|
|
||||||
<li>Zugriffsstatus/HTTP-Statuscode</li>
|
|
||||||
<li>Jeweils übertragene Datenmenge</li>
|
|
||||||
<li>Website, von der die Anforderung kommt (Referrer-URL)</li>
|
|
||||||
<li>Verwendeter Browser</li>
|
|
||||||
<li>Verwendetes Betriebssystem</li>
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Die Daten werden nicht mit anderen Datenquellen zusammengeführt und nach 30 Tagen automatisch gelöscht.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>b) Kontakt per E-Mail</h3>
|
|
||||||
<p>
|
|
||||||
Auf dieser Website wird die Kontaktaufnahme über einen E-Mail-Link (mailto:) angeboten. Wenn Sie uns per E-Mail kontaktieren, werden Ihre Angaben (E-Mail-Adresse, ggf. Name und Nachricht) zwecks Bearbeitung Ihrer Anfrage gespeichert. Die Daten werden ausschließlich zur Beantwortung Ihrer Anfrage verwendet und nach Abschluss der Kommunikation gelöscht.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Rechtsgrundlage ist Art. 6 Abs. 1 lit. a DSGVO (Ihre Einwilligung) oder Art. 6 Abs. 1 lit. b DSGVO (zur Erfüllung eines Vertrags bzw. vorvertraglicher Maßnahmen).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>3. Cookies</h2>
|
|
||||||
<p>
|
|
||||||
Diese Website verwendet <strong>keine Cookies</strong>. Es werden keine Tracking-Cookies, Werbe-Cookies oder sonstige Cookies gesetzt.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>4. Tracking & Analyse</h2>
|
|
||||||
<p>
|
|
||||||
Diese Website setzt <strong>keine Tracking- oder Analyse-Tools</strong> ein. Es werden keine Besucherstatistiken erstellt, kein Google Analytics, kein Facebook Pixel und keine ähnlichen Dienste verwendet.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>5. Social-Media-Plugins</h2>
|
|
||||||
<p>
|
|
||||||
Diese Website verwendet <strong>keine Social-Media-Plugins</strong> (Facebook, Twitter, Instagram etc.).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>6. Google Maps</h2>
|
|
||||||
<p>
|
|
||||||
Auf dieser Website wird ein Google Maps-Embed (Kartenansicht) eingebunden. Beim Laden der Karte werden Daten an Google übertragen, darunter möglicherweise Ihre IP-Adresse. Google Maps wird ausschließlich genutzt, um Ihnen die Lage des Mietobjekts anzuzeigen.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Weitere Informationen zum Datenschutz bei Google finden Sie unter: <a href="https://policies.google.com/privacy" target="_blank" rel="noopener">https://policies.google.com/privacy</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO (berechtigte Interessen an der Darstellung des Objektstandorts).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>7. SSL-Verschlüsselung</h2>
|
|
||||||
<p>
|
|
||||||
Diese Seite nutzt aus Sicherheitsgründen eine SSL-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://" auf „https://" wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>8. Ihre Rechte</h2>
|
|
||||||
<p>Sie haben gegenüber uns folgende Rechte hinsichtlich der Sie betreffenden personenbezogenen Daten:</p>
|
|
||||||
<ul>
|
|
||||||
<li><strong>Recht auf Auskunft</strong> (Art. 15 DSGVO)</li>
|
|
||||||
<li><strong>Recht auf Berichtigung</strong> (Art. 16 DSGVO)</li>
|
|
||||||
<li><strong>Recht auf Löschung</strong> (Art. 17 DSGVO)</li>
|
|
||||||
<li><strong>Recht auf Einschränkung der Verarbeitung</strong> (Art. 18 DSGVO)</li>
|
|
||||||
<li><strong>Recht auf Datenübertragbarkeit</strong> (Art. 20 DSGVO)</li>
|
|
||||||
<li><strong>Widerspruchsrecht</strong> (Art. 21 DSGVO)</li>
|
|
||||||
<li><strong>Recht auf Widerruf der Einwilligung</strong> (Art. 7 Abs. 3 DSGVO)</li>
|
|
||||||
<li><strong>Beschwerderecht bei einer Aufsichtsbehörde</strong> (Art. 77 DSGVO)</li>
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
Zur Ausübung Ihrer Rechte wenden Sie sich bitte an: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<a href="haus-schleusingen.html" class="legal-back">← Zurück zum Objekt</a>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer>
|
|
||||||
<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>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -13,6 +13,7 @@ module.exports = [
|
|||||||
sourceType: "script",
|
sourceType: "script",
|
||||||
globals: {
|
globals: {
|
||||||
...globals.browser,
|
...globals.browser,
|
||||||
|
...globals.jquery,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: {
|
plugins: {
|
||||||
|
|||||||
@@ -1,196 +1,16 @@
|
|||||||
<?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>
|
<!doctype html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Einfamilienhaus mieten Schleusingen | 227 m², 6 Zimmer | 1.300 € Kaltmiete</title>
|
<title>Einfamilienhaus zur Miete - Schleusingen</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="fonts/fonts.css" />
|
||||||
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
||||||
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
<link rel="stylesheet" href="css/haus-schleusingen.css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<a href="#main-content" class="skip-link">Zum Inhalt springen</a>
|
<nav id="navbar">
|
||||||
<nav id="navbar" role="navigation" aria-label="Hauptnavigation">
|
|
||||||
<div class="nav-logo">Bahnhofstraße 10</div>
|
<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">
|
<ul class="nav-links">
|
||||||
<li><a href="#galerie">Galerie</a></li>
|
<li><a href="#galerie">Galerie</a></li>
|
||||||
<li><a href="#grundriss">Grundriss</a></li>
|
<li><a href="#grundriss">Grundriss</a></li>
|
||||||
@@ -204,13 +24,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
Jetzt anfragen
|
Jetzt anfragen
|
||||||
</button>
|
</button>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="nav-mobile-overlay" aria-hidden="true"></div>
|
|
||||||
|
|
||||||
<section class="hero" id="hero">
|
<section class="hero" id="hero">
|
||||||
<div
|
<div
|
||||||
class="hero-bg"
|
class="hero-bg"
|
||||||
id="heroBg"
|
id="heroBg"
|
||||||
style="background-image: url(bilder/Außenansicht-2.png)"
|
style="background-image: url(bilder/Außenansicht-2.webp)"
|
||||||
></div>
|
></div>
|
||||||
<div class="hero-overlay"></div>
|
<div class="hero-overlay"></div>
|
||||||
<div class="hero-content" id="heroContent">
|
<div class="hero-content" id="heroContent">
|
||||||
@@ -235,7 +54,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<main id="main-content">
|
|
||||||
<div class="facts-strip">
|
<div class="facts-strip">
|
||||||
<div class="fact">
|
<div class="fact">
|
||||||
<div class="fact-val">227</div>
|
<div class="fact-val">227</div>
|
||||||
@@ -284,12 +102,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="intro-img" data-animate>
|
<div class="intro-img" data-animate>
|
||||||
<img src="bilder/wohnzimmer2.png" alt="Wohnzimmer" />
|
<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 class="intro-img-badge">Wohnzimmer · 42,6 m²</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="galerie" class="gallery-section" aria-label="Fotogalerie">
|
<section id="galerie" class="gallery-section">
|
||||||
<div class="gallery-header">
|
<div class="gallery-header">
|
||||||
<div>
|
<div>
|
||||||
<div class="section-eyebrow">Fotogalerie</div>
|
<div class="section-eyebrow">Fotogalerie</div>
|
||||||
@@ -299,55 +120,88 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
<div class="masonry-grid">
|
<div class="masonry-grid">
|
||||||
<div class="grid-sizer"></div>
|
<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">
|
<div class="grid-item" data-img="bilder/Außenansicht-2.webp">
|
||||||
<img src="bilder/Außenansicht-2-small.png" alt="Außenansicht des Einfamilienhauses" />
|
<picture>
|
||||||
|
<source srcset="bilder/Außenansicht-2-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Außenansicht-2-small.png" alt="Außenansicht" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Außenansicht</span>
|
<span class="grid-item-label">Außenansicht</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/wohnzimmer2.png" role="button" tabindex="0" aria-label="Wohnzimmer – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/wohnzimmer2.webp">
|
||||||
<img src="bilder/wohnzimmer2-small.png" alt="Wohnzimmer mit 42,6 m² Wohnfläche" />
|
<picture>
|
||||||
|
<source srcset="bilder/wohnzimmer2-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/wohnzimmer2-small.png" alt="Wohnzimmer" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Wohnzimmer · 42,6 m²</span>
|
<span class="grid-item-label">Wohnzimmer · 42,6 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/Küche 1.jpg" role="button" tabindex="0" aria-label="Küche – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Küche 1.webp">
|
||||||
<img src="bilder/Küche 1.jpg" alt="Küche mit 18,4 m²" />
|
<picture>
|
||||||
|
<source srcset="bilder/Küche 1-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Küche 1.jpg" alt="Küche" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Küche · 18,4 m²</span>
|
<span class="grid-item-label">Küche · 18,4 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/schlafzimmer.png" role="button" tabindex="0" aria-label="Schlafzimmer – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/schlafzimmer.webp">
|
||||||
<img src="bilder/schlafzimmer-small.png" alt="Schlafzimmer mit 18 m²" />
|
<picture>
|
||||||
|
<source srcset="bilder/schlafzimmer-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/schlafzimmer-small.png" alt="Schlafzimmer" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Schlafzimmer · 18 m²</span>
|
<span class="grid-item-label">Schlafzimmer · 18 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/Bad.jpg" role="button" tabindex="0" aria-label="Badezimmer – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Bad.webp">
|
||||||
<img src="bilder/Bad.jpg" alt="Badezimmer mit 9,8 m²" />
|
<picture>
|
||||||
|
<source srcset="bilder/Bad-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Bad.jpg" alt="Badezimmer" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Badezimmer · 9,8 m²</span>
|
<span class="grid-item-label">Badezimmer · 9,8 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/Kinderzimmer.png" role="button" tabindex="0" aria-label="Kinderzimmer 1 – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Kinderzimmer.webp">
|
||||||
<img src="bilder/Kinderzimmer-small.png" alt="Kinderzimmer 1 mit 21,7 m²" />
|
<picture>
|
||||||
|
<source srcset="bilder/Kinderzimmer-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Kinderzimmer-small.png" alt="Kinderzimmer 1" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Kinderzimmer 1 · 21,7 m²</span>
|
<span class="grid-item-label">Kinderzimmer 1 · 21,7 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/Kinderzimmer 2.jpg" role="button" tabindex="0" aria-label="Kinderzimmer 2 – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Kinderzimmer 2.webp">
|
||||||
<img src="bilder/Kinderzimmer 2-small.png" alt="Kinderzimmer 2 mit 15,7 m²" />
|
<picture>
|
||||||
|
<source srcset="bilder/Kinderzimmer 2-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Kinderzimmer 2-small.png" alt="Kinderzimmer 2" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Kinderzimmer 2 · 15,7 m²</span>
|
<span class="grid-item-label">Kinderzimmer 2 · 15,7 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/kinderzimmer 2 2.jpeg" role="button" tabindex="0" aria-label="Kinderzimmer Detail – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/kinderzimmer 2 2.webp">
|
||||||
<img src="bilder/kinderzimmer 2 2-small.png" alt="Detailansicht Kinderzimmer" />
|
<picture>
|
||||||
|
<source srcset="bilder/kinderzimmer 2 2-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/kinderzimmer 2 2-small.png" alt="Kinderzimmer Detail" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Kinderzimmer Detail</span>
|
<span class="grid-item-label">Kinderzimmer Detail</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/Kinderzimmer 3.jpg" role="button" tabindex="0" aria-label="Gästezimmer – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Kinderzimmer 3.webp">
|
||||||
<img src="bilder/Kinderzimmer 3-small.png" alt="Gästezimmer mit 11,5 m²" />
|
<picture>
|
||||||
|
<source srcset="bilder/Kinderzimmer 3-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Kinderzimmer 3-small.png" alt="Kinderzimmer 3" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Gästezimmer · 11,5 m²</span>
|
<span class="grid-item-label">Gästezimmer · 11,5 m²</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/Bad-2.jpg" role="button" tabindex="0" aria-label="Zweites Bad – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Bad-2.webp">
|
||||||
<img src="bilder/Bad-2-small.jpg" alt="Zweites Badezimmer im Haus" />
|
<picture>
|
||||||
|
<source srcset="bilder/Bad-2-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Bad-2-small.jpg" alt="Wohnbereich Detail 1" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Wohnbereich</span>
|
<span class="grid-item-label">Wohnbereich</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-item" data-img="bilder/bad3.jpg" role="button" tabindex="0" aria-label="Drittes Bad – Großansicht öffnen">
|
<div class="grid-item" data-img="bilder/Bad-3.webp">
|
||||||
<img src="bilder/Bad-3-small.jpg" alt="Drittes Badezimmer im Haus" />
|
<picture>
|
||||||
|
<source srcset="bilder/Bad-3-small.webp" type="image/webp">
|
||||||
|
<img src="bilder/Bad-3-small.jpg" alt="Wohnbereich Detail 2" loading="lazy" />
|
||||||
|
</picture>
|
||||||
<span class="grid-item-label">Wohnbereich Detail</span>
|
<span class="grid-item-label">Wohnbereich Detail</span>
|
||||||
</div>
|
</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">
|
<div class="grid-item" data-img="bilder/Bad-4.webp">
|
||||||
<img
|
<picture>
|
||||||
src="bilder/WhatsApp Image 2026-03-30 at 07.50.42 (2).jpeg"
|
<source srcset="bilder/Bad-4-small.webp" type="image/webp">
|
||||||
alt="Weitere Außenansicht des Einfamilienhauses"
|
<img src="bilder/Bad-4-small.jpg" alt="Wohnbereich Detail 3" loading="lazy" />
|
||||||
/>
|
</picture>
|
||||||
<span class="grid-item-label">Hausansicht</span>
|
<span class="grid-item-label">Hausansicht</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -358,14 +212,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
<h2>Großzügig auf allen Etagen</h2>
|
<h2>Großzügig auf allen Etagen</h2>
|
||||||
<div class="floor-accordion">
|
<div class="floor-accordion">
|
||||||
<div class="floor-item">
|
<div class="floor-item">
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-0" id="floor-title-0">
|
<div class="floor-header">
|
||||||
<span class="floor-title">Erdgeschoss</span>
|
<span class="floor-title">Erdgeschoss</span>
|
||||||
<div class="floor-size">
|
<div class="floor-size">
|
||||||
<span>99,5 m²</span>
|
<span>99,5 m²</span>
|
||||||
<div class="floor-icon">+</div>
|
<div class="floor-icon">+</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-body" id="floor-body-0" role="region" aria-labelledby="floor-title-0">
|
<div class="floor-body">
|
||||||
<div class="floor-rooms-grid">
|
<div class="floor-rooms-grid">
|
||||||
<div class="room-chip">
|
<div class="room-chip">
|
||||||
Flur
|
Flur
|
||||||
@@ -393,28 +247,36 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-plan floor-plan-multi">
|
<div class="floor-plan floor-plan-multi">
|
||||||
|
<picture>
|
||||||
|
<source srcset="bilder/grundrisse/EG-small.webp" type="image/webp">
|
||||||
<img
|
<img
|
||||||
src="bilder/grundrisse/EG-small.jpg"
|
src="bilder/grundrisse/EG-small.jpg"
|
||||||
alt="Grundriss Erdgeschoss"
|
alt="Grundriss Erdgeschoss"
|
||||||
data-img="bilder/grundrisse/EG.png"
|
loading="lazy"
|
||||||
|
data-img="bilder/grundrisse/EG.webp"
|
||||||
/>
|
/>
|
||||||
|
</picture>
|
||||||
|
<picture>
|
||||||
|
<source srcset="bilder/grundrisse/EG 3D-small.webp" type="image/webp">
|
||||||
<img
|
<img
|
||||||
src="bilder/grundrisse/EG 3D-small.jpg"
|
src="bilder/grundrisse/EG 3D-small.jpg"
|
||||||
alt="Grundriss Erdgeschoss"
|
alt="Grundriss Erdgeschoss"
|
||||||
data-img="bilder/grundrisse/EG 3D.png"
|
loading="lazy"
|
||||||
|
data-img="bilder/grundrisse/EG 3D.webp"
|
||||||
/>
|
/>
|
||||||
|
</picture>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-item">
|
<div class="floor-item">
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-1" id="floor-title-1">
|
<div class="floor-header">
|
||||||
<span class="floor-title">1. Obergeschoss</span>
|
<span class="floor-title">1. Obergeschoss</span>
|
||||||
<div class="floor-size">
|
<div class="floor-size">
|
||||||
<span>120,4 m²</span>
|
<span>120,4 m²</span>
|
||||||
<div class="floor-icon">+</div>
|
<div class="floor-icon">+</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-body" id="floor-body-1" role="region" aria-labelledby="floor-title-1">
|
<div class="floor-body">
|
||||||
<div class="floor-rooms-grid">
|
<div class="floor-rooms-grid">
|
||||||
<div class="room-chip">
|
<div class="room-chip">
|
||||||
Flur
|
Flur
|
||||||
@@ -442,28 +304,36 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-plan floor-plan-multi">
|
<div class="floor-plan floor-plan-multi">
|
||||||
|
<picture>
|
||||||
|
<source srcset="bilder/grundrisse/OG 1 2-small.webp" type="image/webp">
|
||||||
<img
|
<img
|
||||||
src="bilder/grundrisse/OG 1 2-small.jpg"
|
src="bilder/grundrisse/OG 1 2-small.jpg"
|
||||||
alt="Grundriss 1. Obergeschoss"
|
alt="Grundriss 1. Obergeschoss"
|
||||||
data-img="bilder/grundrisse/OG 1 2.png"
|
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
|
<img
|
||||||
src="bilder/grundrisse/OG 1 3D-small.jpg"
|
src="bilder/grundrisse/OG 1 3D-small.jpg"
|
||||||
alt="Grundriss 1. Obergeschoss"
|
alt="Grundriss 1. Obergeschoss"
|
||||||
data-img="bilder/grundrisse/OG 1 3D.png"
|
loading="lazy"
|
||||||
|
data-img="bilder/grundrisse/OG 1 3D.webp"
|
||||||
/>
|
/>
|
||||||
|
</picture>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-item">
|
<div class="floor-item">
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-2" id="floor-title-2">
|
<div class="floor-header">
|
||||||
<span class="floor-title">2. Obergeschoss</span>
|
<span class="floor-title">2. Obergeschoss</span>
|
||||||
<div class="floor-size">
|
<div class="floor-size">
|
||||||
<span>68 m²</span>
|
<span>68 m²</span>
|
||||||
<div class="floor-icon">+</div>
|
<div class="floor-icon">+</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-body" id="floor-body-2" role="region" aria-labelledby="floor-title-2">
|
<div class="floor-body">
|
||||||
<div class="floor-rooms-grid">
|
<div class="floor-rooms-grid">
|
||||||
<div class="room-chip">
|
<div class="room-chip">
|
||||||
Flur
|
Flur
|
||||||
@@ -491,28 +361,36 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-plan floor-plan-multi">
|
<div class="floor-plan floor-plan-multi">
|
||||||
|
<picture>
|
||||||
|
<source srcset="bilder/grundrisse/OG 2 grundriss-small.webp" type="image/webp">
|
||||||
<img
|
<img
|
||||||
src="bilder/grundrisse/OG 2 grundriss-small.jpg"
|
src="bilder/grundrisse/OG 2 grundriss-small.jpg"
|
||||||
alt="Grundriss 2. Obergeschoss (1)"
|
alt="Grundriss 2. Obergeschoss (1)"
|
||||||
data-img="bilder/grundrisse/OG 2 grundriss.png"
|
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
|
<img
|
||||||
src="bilder/grundrisse/OG 2 3D-small.jpg"
|
src="bilder/grundrisse/OG 2 3D-small.jpg"
|
||||||
alt="Grundriss 2. Obergeschoss (1)"
|
alt="Grundriss 2. Obergeschoss (1)"
|
||||||
data-img="bilder/grundrisse/OG 2 3D.png"
|
loading="lazy"
|
||||||
|
data-img="bilder/grundrisse/OG 2 3D.webp"
|
||||||
/>
|
/>
|
||||||
|
</picture>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-item">
|
<div class="floor-item">
|
||||||
<div class="floor-header" role="button" tabindex="0" aria-expanded="false" aria-controls="floor-body-3" id="floor-title-3">
|
<div class="floor-header">
|
||||||
<span class="floor-title">Dachboden</span>
|
<span class="floor-title">Dachboden</span>
|
||||||
<div class="floor-size">
|
<div class="floor-size">
|
||||||
<span>94 m² Nutzfläche</span>
|
<span>94 m² Nutzfläche</span>
|
||||||
<div class="floor-icon">+</div>
|
<div class="floor-icon">+</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-body" id="floor-body-3" role="region" aria-labelledby="floor-title-3">
|
<div class="floor-body">
|
||||||
<div class="floor-rooms-grid">
|
<div class="floor-rooms-grid">
|
||||||
<div class="room-chip">
|
<div class="room-chip">
|
||||||
Dachboden unten (ungeheizt)
|
Dachboden unten (ungeheizt)
|
||||||
@@ -528,23 +406,31 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="floor-plan floor-plan-multi">
|
<div class="floor-plan floor-plan-multi">
|
||||||
|
<picture>
|
||||||
|
<source srcset="bilder/grundrisse/Dachboden unten 2-small.webp" type="image/webp">
|
||||||
<img
|
<img
|
||||||
src="bilder/grundrisse/Dachboden unten 2-small.jpg"
|
src="bilder/grundrisse/Dachboden unten 2-small.jpg"
|
||||||
alt="Grundriss Dachboden"
|
alt="Grundriss Dachboden"
|
||||||
data-img="bilder/grundrisse/Dachboden unten 2.png"
|
loading="lazy"
|
||||||
|
data-img="bilder/grundrisse/Dachboden unten 2.webp"
|
||||||
/>
|
/>
|
||||||
|
</picture>
|
||||||
|
<picture>
|
||||||
|
<source srcset="bilder/grundrisse/Dachboden unten-small.webp" type="image/webp">
|
||||||
<img
|
<img
|
||||||
src="bilder/grundrisse/Dachboden unten-small.jpg"
|
src="bilder/grundrisse/Dachboden unten-small.jpg"
|
||||||
alt="Grundriss Dachboden"
|
alt="Grundriss Dachboden"
|
||||||
data-img="bilder/grundrisse/Dachboden unten.png"
|
loading="lazy"
|
||||||
|
data-img="bilder/grundrisse/Dachboden unten.webp"
|
||||||
/>
|
/>
|
||||||
|
</picture>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="pricing-section" id="miete" aria-label="Mietkonditionen">
|
<section class="pricing-section" id="miete">
|
||||||
<div class="pricing-inner">
|
<div class="pricing-inner">
|
||||||
<div class="section-eyebrow">Mietkonditionen</div>
|
<div class="section-eyebrow">Mietkonditionen</div>
|
||||||
<h2>Transparente Preisgestaltung</h2>
|
<h2>Transparente Preisgestaltung</h2>
|
||||||
@@ -642,7 +528,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="contact-section" id="kontakt" aria-label="Kontaktformular">
|
<section class="contact-section" id="kontakt">
|
||||||
<div class="contact-inner">
|
<div class="contact-inner">
|
||||||
<div class="section-eyebrow">Kontakt</div>
|
<div class="section-eyebrow">Kontakt</div>
|
||||||
<h2>
|
<h2>
|
||||||
@@ -656,31 +542,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
paar Terminvorschläge an.
|
paar Terminvorschläge an.
|
||||||
</p>
|
</p>
|
||||||
<div class="contact-form">
|
<div class="contact-form">
|
||||||
<?php if ($formSuccess): ?>
|
<form id="contactForm">
|
||||||
<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-row">
|
||||||
<div class="form-field">
|
<div class="form-field">
|
||||||
<label for="fname">Vorname</label>
|
<label for="fname">Vorname</label>
|
||||||
<input type="text" id="fname" name="fname" placeholder="Max" required value="<?= escapeContactValue($formData['fname']) ?>" />
|
<input type="text" id="fname" name="fname" placeholder="Max" required />
|
||||||
</div>
|
</div>
|
||||||
<div class="form-field">
|
<div class="form-field">
|
||||||
<label for="lname">Nachname</label>
|
<label for="lname">Nachname</label>
|
||||||
<input type="text" id="lname" name="lname" placeholder="Mustermann" required value="<?= escapeContactValue($formData['lname']) ?>" />
|
<input type="text" id="lname" name="lname" placeholder="Mustermann" required />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -692,25 +562,20 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
name="email"
|
name="email"
|
||||||
placeholder="max@beispiel.de"
|
placeholder="max@beispiel.de"
|
||||||
required
|
required
|
||||||
value="<?= escapeContactValue($formData['email']) ?>"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-field">
|
<div class="form-field">
|
||||||
<label for="phone">Telefon</label>
|
<label for="phone">Telefon</label>
|
||||||
<input type="tel" id="phone" name="phone" placeholder="+49 ..." value="<?= escapeContactValue($formData['phone']) ?>" />
|
<input type="tel" id="phone" name="phone" placeholder="+49 ..." />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-field full">
|
<div class="form-field full">
|
||||||
<label for="interest">Anliegen</label>
|
<label for="interest">Anliegen</label>
|
||||||
<select id="interest" name="interest">
|
<select id="interest" name="interest">
|
||||||
<?php
|
<option>Besichtigung anfragen</option>
|
||||||
$interestOptions = ['Besichtigung anfragen', 'Allgemeine Informationen', 'Mietbewerbung einreichen'];
|
<option>Allgemeine Informationen</option>
|
||||||
foreach ($interestOptions as $opt):
|
<option>Mietbewerbung einreichen</option>
|
||||||
$selected = ($formData['interest'] === $opt) ? ' selected' : '';
|
|
||||||
?>
|
|
||||||
<option<?= $selected ?>><?= escapeContactValue($opt) ?></option>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -722,20 +587,16 @@ foreach ($interestOptions as $opt):
|
|||||||
name="message"
|
name="message"
|
||||||
rows="4"
|
rows="4"
|
||||||
placeholder="Ihre Nachricht ..."
|
placeholder="Ihre Nachricht ..."
|
||||||
required
|
></textarea>
|
||||||
><?= escapeContactValue($formData['message']) ?></textarea>
|
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<button type="submit" class="btn-submit">Anfrage absenden</button>
|
||||||
</form>
|
</form>
|
||||||
<?php endif; ?>
|
<div class="form-success" id="formSuccess">
|
||||||
|
<p>Vielen Dank für Ihre Anfrage!</p>
|
||||||
|
<br />
|
||||||
|
<small>Ihr E-Mail-Programm wurde geöffnet. Bitte senden Sie die E-Mail ab, damit Ihre Anfrage bei uns eingeht.</small>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="contact-details">
|
<div class="contact-details">
|
||||||
<p>Oder schreiben Sie uns direkt: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a></p>
|
<p>Oder schreiben Sie uns direkt: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a></p>
|
||||||
@@ -743,18 +604,17 @@ foreach ($interestOptions as $opt):
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
</main>
|
<footer>
|
||||||
<footer role="contentinfo">
|
|
||||||
<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.html">Impressum</a>
|
<a href="/impressum" target="_blank">Impressum</a>
|
||||||
<a href="datenschutz.html">Datenschutz</a>
|
<a href="#">Datenschutz</a>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<div class="lightbox" id="lightbox" role="dialog" aria-modal="true" aria-label="Bildansicht">
|
<div class="lightbox" id="lightbox">
|
||||||
<button class="lightbox-close" id="lightboxClose" aria-label="Bildansicht schließen">×</button>
|
<button class="lightbox-close" id="lightboxClose">×</button>
|
||||||
<img src="" id="lightboxImg" alt="" />
|
<img src="" id="lightboxImg" alt="Vollbild" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="js/haus-schleusingen.js"></script>
|
<script src="js/haus-schleusingen.js"></script>
|
||||||
185
impressum.html
@@ -1,185 +0,0 @@
|
|||||||
<!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">
|
|
||||||
<div class="nav-logo">Bahnhofstraße 10</div>
|
|
||||||
<ul class="nav-links">
|
|
||||||
<li><a href="haus-schleusingen.html#galerie">Galerie</a></li>
|
|
||||||
<li><a href="haus-schleusingen.html#grundriss">Grundriss</a></li>
|
|
||||||
<li><a href="haus-schleusingen.html#miete">Miete</a></li>
|
|
||||||
<li><a href="haus-schleusingen.html#lage">Lage</a></li>
|
|
||||||
</ul>
|
|
||||||
<a href="haus-schleusingen.html#kontakt" class="nav-cta" style="text-decoration:none;">Jetzt anfragen</a>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<main class="legal-page">
|
|
||||||
<div class="section-eyebrow">Pflichtangaben</div>
|
|
||||||
<h1>Impressum</h1>
|
|
||||||
|
|
||||||
<h2>Angaben gemäß § 5 TMG</h2>
|
|
||||||
<address>
|
|
||||||
Martin Kiesewetter<br />
|
|
||||||
Am Schaftalsgraben 4<br />
|
|
||||||
98529 Suhl<br />
|
|
||||||
Deutschland
|
|
||||||
</address>
|
|
||||||
|
|
||||||
<h3>Kontakt</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Telefon: 0176 – 45853923</li>
|
|
||||||
<li>E-Mail: <a href="mailto:mki@kies-media.de">mki@kies-media.de</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV</h2>
|
|
||||||
<p>
|
|
||||||
Martin Kiesewetter<br />
|
|
||||||
Am Schaftalsgraben 4<br />
|
|
||||||
98529 Suhl
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>Streitschlichtung</h2>
|
|
||||||
<p>
|
|
||||||
Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit:
|
|
||||||
<a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr class="legal-divider" />
|
|
||||||
|
|
||||||
<h2>Haftung für Inhalte</h2>
|
|
||||||
<p>
|
|
||||||
Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Haftung für Links</h2>
|
|
||||||
<p>
|
|
||||||
Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Urheberrecht</h2>
|
|
||||||
<p>
|
|
||||||
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
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>
|
|
||||||
|
|
||||||
<a href="haus-schleusingen.html" class="legal-back">← Zurück zum Objekt</a>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<footer>
|
|
||||||
<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>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,208 +1,95 @@
|
|||||||
document.addEventListener("DOMContentLoaded", function () {
|
$(function () {
|
||||||
// Navbar scroll
|
// Navbar scroll
|
||||||
var navbar = document.getElementById("navbar");
|
$(window).on("scroll", function () {
|
||||||
window.addEventListener("scroll", function () {
|
if ($(this).scrollTop() > 60) $("#navbar").addClass("scrolled");
|
||||||
if (window.scrollY > 60) navbar.classList.add("scrolled");
|
else $("#navbar").removeClass("scrolled");
|
||||||
else navbar.classList.remove("scrolled");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hero animation on load
|
// Hero animation on load
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
document.getElementById("heroContent").classList.add("visible");
|
$("#heroContent").addClass("visible");
|
||||||
document.getElementById("heroBg").classList.add("loaded");
|
$("#heroBg").addClass("loaded");
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|
||||||
// Scroll animations via IntersectionObserver
|
// Scroll animations
|
||||||
var animElements = document.querySelectorAll(".fact, [data-animate]");
|
function checkVisible() {
|
||||||
animElements.forEach(function (el) {
|
$(".fact, [data-animate]").each(function () {
|
||||||
el.style.opacity = "0";
|
var el = $(this);
|
||||||
el.style.transform = "translateY(30px)";
|
var top = el.offset().top;
|
||||||
el.style.transition = "opacity 0.8s ease, transform 0.8s ease";
|
var windowBottom = $(window).scrollTop() + $(window).height();
|
||||||
});
|
if (windowBottom > top + 60) {
|
||||||
|
el.addClass("visible");
|
||||||
if ("IntersectionObserver" in window) {
|
el.css({ opacity: 1, transform: "translateY(0)" });
|
||||||
var observer = new IntersectionObserver(
|
|
||||||
function (entries) {
|
|
||||||
entries.forEach(function (entry) {
|
|
||||||
if (entry.isIntersecting) {
|
|
||||||
entry.target.classList.add("visible");
|
|
||||||
entry.target.style.opacity = "1";
|
|
||||||
entry.target.style.transform = "translateY(0)";
|
|
||||||
observer.unobserve(entry.target);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
|
||||||
{ rootMargin: "0px 0px -60px 0px" }
|
|
||||||
);
|
|
||||||
animElements.forEach(function (el) {
|
|
||||||
observer.observe(el);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// Fallback: show all immediately
|
|
||||||
animElements.forEach(function (el) {
|
|
||||||
el.classList.add("visible");
|
|
||||||
el.style.opacity = "1";
|
|
||||||
el.style.transform = "translateY(0)";
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
$("[data-animate]").css({
|
||||||
|
opacity: 0,
|
||||||
|
transform: "translateY(30px)",
|
||||||
|
transition: "opacity 0.8s ease, transform 0.8s ease",
|
||||||
|
});
|
||||||
|
$(window).on("scroll", checkVisible);
|
||||||
|
checkVisible();
|
||||||
|
|
||||||
// Floor accordion
|
// Floor accordion
|
||||||
// Floor accordion (vanilla JS + a11y)
|
$(".floor-header").on("click", function () {
|
||||||
document.querySelectorAll(".floor-header").forEach(function (header) {
|
var item = $(this).closest(".floor-item");
|
||||||
header.addEventListener("click", function () {
|
var isOpen = item.hasClass("open");
|
||||||
var item = this.closest(".floor-item");
|
$(".floor-item").removeClass("open");
|
||||||
var isOpen = item.classList.contains("open");
|
$(".floor-body").slideUp(300);
|
||||||
var allItems = document.querySelectorAll(".floor-item");
|
|
||||||
|
|
||||||
// Close all
|
|
||||||
allItems.forEach(function (fi) {
|
|
||||||
fi.classList.remove("open");
|
|
||||||
var hdr = fi.querySelector(".floor-header");
|
|
||||||
if (hdr) hdr.setAttribute("aria-expanded", "false");
|
|
||||||
var body = fi.querySelector(".floor-body");
|
|
||||||
if (body) body.style.display = "none";
|
|
||||||
});
|
|
||||||
|
|
||||||
// Open clicked if it was closed
|
|
||||||
if (!isOpen) {
|
if (!isOpen) {
|
||||||
item.classList.add("open");
|
item.addClass("open");
|
||||||
this.setAttribute("aria-expanded", "true");
|
item.find(".floor-body").slideDown(300);
|
||||||
var body = item.querySelector(".floor-body");
|
|
||||||
if (body) body.style.display = "block";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Accordion keyboard handler (Enter/Space)
|
|
||||||
document.querySelectorAll(".floor-header").forEach(function (header) {
|
|
||||||
header.addEventListener("keydown", function (e) {
|
|
||||||
if (e.key === "Enter" || e.key === " ") {
|
|
||||||
e.preventDefault();
|
|
||||||
this.click();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (e.key === "Enter" || e.key === " ") {
|
|
||||||
e.preventDefault();
|
|
||||||
$(this).trigger("click");
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Lightbox – track last focused element for focus return
|
// Lightbox – gallery grid items
|
||||||
var lightboxTrigger = null;
|
$(document).on("click", ".grid-item", function () {
|
||||||
|
var src = $(this).data("img") || $(this).find("img").attr("src");
|
||||||
function openLightbox(src) {
|
$("#lightboxImg").on("error", function () {
|
||||||
lightboxTrigger = document.activeElement;
|
// WebP fallback: try original format
|
||||||
$("#lightboxImg").attr("src", src).attr("alt", "");
|
var fallback = src.replace(/\.webp$/, src.endsWith('.webp') ? '.png' : '.jpg');
|
||||||
|
if ($(this).attr('src') !== fallback) $(this).attr('src', fallback);
|
||||||
|
});
|
||||||
|
$("#lightboxImg").attr("src", src);
|
||||||
$("#lightbox").addClass("open");
|
$("#lightbox").addClass("open");
|
||||||
$("body").css("overflow", "hidden");
|
$("body").css("overflow", "hidden");
|
||||||
// Set focus to close button
|
|
||||||
setTimeout(function () {
|
|
||||||
$("#lightboxClose").focus();
|
|
||||||
}, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
function closeLightbox() {
|
|
||||||
$("#lightbox").removeClass("open");
|
|
||||||
$("body").css("overflow", "");
|
|
||||||
// Return focus to trigger
|
|
||||||
if (lightboxTrigger) {
|
|
||||||
$(lightboxTrigger).focus();
|
|
||||||
lightboxTrigger = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lightbox – gallery grid items
|
|
||||||
|
|
||||||
// Lightbox – gallery grid items
|
|
||||||
document.querySelectorAll(".grid-item").forEach(function (item) {
|
|
||||||
item.addEventListener("click", function () {
|
|
||||||
var src = this.dataset.img || this.querySelector("img").getAttribute("src");
|
|
||||||
openLightbox(src);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Gallery keyboard handler (Enter/Space)
|
|
||||||
document.querySelectorAll(".grid-item").forEach(function (item) {
|
|
||||||
item.setAttribute("tabindex", "0");
|
|
||||||
item.addEventListener("keydown", function (e) {
|
|
||||||
if (e.key === "Enter" || e.key === " ") {
|
|
||||||
e.preventDefault();
|
|
||||||
this.click();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Lightbox – floor plan images in Raumaufteilung
|
// Lightbox – floor plan images in Raumaufteilung
|
||||||
document.querySelectorAll(".floor-plan img[data-img]").forEach(function (img) {
|
$(document).on("click", ".floor-plan img[data-img]", function () {
|
||||||
img.addEventListener("click", function () {
|
var src = $(this).data("img");
|
||||||
openLightbox(this.dataset.img);
|
$("#lightboxImg").on("error", function () {
|
||||||
|
var fallback = src.replace(/\.webp$/, '.png');
|
||||||
|
if ($(this).attr('src') !== fallback) $(this).attr('src', fallback);
|
||||||
});
|
});
|
||||||
|
$("#lightboxImg").attr("src", src);
|
||||||
|
$("#lightbox").addClass("open");
|
||||||
|
$("body").css("overflow", "hidden");
|
||||||
});
|
});
|
||||||
|
$("#lightboxClose, #lightbox").on("click", function (e) {
|
||||||
function openLightbox(src) {
|
if (e.target === this) {
|
||||||
lightboxTrigger = document.activeElement;
|
$("#lightbox").removeClass("open");
|
||||||
document.getElementById("lightboxImg").setAttribute("src", src);
|
$("body").css("overflow", "");
|
||||||
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("lightbox").addEventListener("click", function (e) {
|
|
||||||
if (e.target === this) closeLightbox();
|
|
||||||
});
|
});
|
||||||
document.addEventListener("keydown", function (e) {
|
$(document).on("keydown", function (e) {
|
||||||
if (e.key === "Escape") closeLightbox();
|
if (e.key === "Escape") {
|
||||||
});
|
$("#lightbox").removeClass("open");
|
||||||
|
$("body").css("overflow", "");
|
||||||
// Focus trap for lightbox
|
|
||||||
document.getElementById("lightbox").addEventListener("keydown", function (e) {
|
|
||||||
if (e.key !== "Tab") return;
|
|
||||||
|
|
||||||
var focusable = this.querySelectorAll("button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])");
|
|
||||||
focusable = Array.from(focusable).filter(function (el) { return el.offsetParent !== null; });
|
|
||||||
if (focusable.length === 0) return;
|
|
||||||
|
|
||||||
var first = focusable[0];
|
|
||||||
var last = focusable[focusable.length - 1];
|
|
||||||
|
|
||||||
if (e.shiftKey) {
|
|
||||||
if (document.activeElement === first) {
|
|
||||||
e.preventDefault();
|
|
||||||
last.focus();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (document.activeElement === last) {
|
|
||||||
e.preventDefault();
|
|
||||||
first.focus();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Form submit is handled server-side by PHP – no JS intervention needed.
|
|
||||||
// Form submit – opens email client with pre-filled mailto: link
|
// Form submit – opens email client with pre-filled mailto: link
|
||||||
document.getElementById("contactForm").addEventListener("submit", function (e) {
|
$("#contactForm").on("submit", function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
var fname = document.getElementById("fname").value.trim();
|
var fname = $("#fname").val().trim();
|
||||||
var lname = document.getElementById("lname").value.trim();
|
var lname = $("#lname").val().trim();
|
||||||
var email = document.getElementById("email").value.trim();
|
var email = $("#email").val().trim();
|
||||||
var phone = document.getElementById("phone").value.trim();
|
var phone = $("#phone").val().trim();
|
||||||
var interest = document.getElementById("interest").value;
|
var interest = $("#interest").val();
|
||||||
var message = document.getElementById("message").value.trim();
|
var message = $("#message").val().trim();
|
||||||
|
|
||||||
var subject = "Kontaktanfrage: " + interest;
|
var subject = "Kontaktanfrage: " + interest;
|
||||||
var body = "Von: " + fname + " " + lname + "\n";
|
var body = "Von: " + fname + " " + lname + "\n";
|
||||||
@@ -219,58 +106,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||||||
window.location.href = mailto;
|
window.location.href = mailto;
|
||||||
|
|
||||||
// Show success message
|
// Show success message
|
||||||
this.style.display = "none";
|
$("#contactForm").hide();
|
||||||
var success = document.getElementById("formSuccess");
|
$("#formSuccess").fadeIn(400);
|
||||||
success.style.display = "block";
|
|
||||||
success.style.opacity = "0";
|
|
||||||
success.style.transition = "opacity 0.4s ease";
|
|
||||||
requestAnimationFrame(function () {
|
|
||||||
success.style.opacity = "1";
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
// Mobile hamburger menu (vanilla JS)
|
|
||||||
(function () {
|
|
||||||
var hamburger = document.querySelector(".nav-hamburger");
|
|
||||||
var nav = document.getElementById("navbar");
|
|
||||||
var overlay = document.querySelector(".nav-mobile-overlay");
|
|
||||||
var links = nav ? nav.querySelectorAll(".nav-links a") : [];
|
|
||||||
|
|
||||||
function toggleMenu() {
|
|
||||||
var isOpen = hamburger.classList.toggle("active");
|
|
||||||
nav.classList.toggle("mobile-open", isOpen);
|
|
||||||
if (overlay) overlay.classList.toggle("active", isOpen);
|
|
||||||
hamburger.setAttribute("aria-expanded", isOpen);
|
|
||||||
document.body.style.overflow = isOpen ? "hidden" : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function closeMenu() {
|
|
||||||
hamburger.classList.remove("active");
|
|
||||||
nav.classList.remove("mobile-open");
|
|
||||||
if (overlay) overlay.classList.remove("active");
|
|
||||||
hamburger.setAttribute("aria-expanded", "false");
|
|
||||||
document.body.style.overflow = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hamburger) {
|
|
||||||
hamburger.addEventListener("click", toggleMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay) {
|
|
||||||
overlay.addEventListener("click", closeMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
links.forEach(function (link) {
|
|
||||||
link.addEventListener("click", closeMenu);
|
|
||||||
});
|
|
||||||
|
|
||||||
document.addEventListener("keydown", function (e) {
|
|
||||||
if (e.key === "Escape") closeMenu();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close on resize to desktop
|
|
||||||
window.addEventListener("resize", function () {
|
|
||||||
if (window.innerWidth > 900) closeMenu();
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
|
|||||||
13
nginx.conf
@@ -5,7 +5,20 @@ 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
User-agent: *
|
|
||||||
Allow: /
|
|
||||||
Sitemap: https://haus-schleusingen.de/haus-schleusingen.html
|
|
||||||