7 Commits

Author SHA1 Message Date
1918e86717 Merge pull request 'Fix #2: Korrigiere Flächenangaben laut Notarvertrag' (#3) from feature/issue-2-korrigiere-flaechenangaben into main
Reviewed-on: #3
2026-05-10 15:06:05 +02:00
214f401e71 Fix #2: Korrigiere Flächenangaben laut Notarvertrag
- EG: 99,4 → 99,5 m² (Summenfehler)
- 1. OG: Wohnzimmer 24,7 → 42,6 m², Gesamt 100,3 → 120,4 m²
- 2. OG: Dachterrasse 35,8 → 9,0 m² (25% von 35,8 m²)
- Dachboden: 52 → 94 m² (unten 52 + Mitte 31 + oben 11)
- Nutzfläche Gesamt: 113 → 154,9 m²
- Wohnzimmer in Galerie/Badge: 24,7 → 42,6 m²
2026-05-10 12:43:41 +00:00
7f4ad16318 fix: add lint confirmation messages for CSS and JS linters 2026-05-10 13:27:58 +02:00
78dd17da05 readme 2026-05-10 12:59:08 +02:00
be956a5b8f loc 2026-05-10 12:53:09 +02:00
424d8e20b6 image 2026-05-10 12:50:26 +02:00
400ad464f3 image 2026-05-10 12:37:55 +02:00
7 changed files with 173 additions and 128 deletions

View File

@@ -1,6 +1,7 @@
name: New MCP server name: New MCP server
version: 0.0.1 version: 0.0.1
schema: v1 schema: v1
mcpServers: mcpServers:
- name: playwright - name: playwright
command: npx command: npx
@@ -10,3 +11,11 @@ mcpServers:
command: npx command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "C:\\Users\\greggy\\Desktop\\landingpage-haus-schleusingen"] args: ["-y", "@modelcontextprotocol/server-filesystem", "C:\\Users\\greggy\\Desktop\\landingpage-haus-schleusingen"]
- name: gitea
command: npx
args: ["-y", "@modelcontextprotocol/server-gitea"]
env:
GITEA_URL: "https://git.home.kies-media.de"
GITEA_TOKEN: "5688416ff6b5805706f89178322de4e882692e34"
GITEA_REPO: "greggy/haus-schleusingen"
GITEA_BRANCH: "main"

254
README.md
View File

@@ -3,175 +3,203 @@
Statische Landingpage für **Haus Schleusingen**. Statische Landingpage für **Haus Schleusingen**.
Das Projekt basiert auf reinem HTML, CSS und JavaScript und wird über einen Nginx-Container ausgeliefert. Das Projekt basiert auf reinem HTML, CSS und JavaScript und wird über einen Nginx-Container ausgeliefert.
![Screenshot der Landingpage Haus Schleusingen](screenshot-landingpage.png) <div align="right">
<a href="screenshot-landingpage.png">
<img src="screenshot-landingpage-thumb.png" alt="Screenshot der Landingpage Haus Schleusingen" width="300" />
</a>
</div>
--- ---
## Inhaltsübersicht ## Inhaltsübersicht
- [Technologien](#technologien)
- [Projektstruktur](#projektstruktur)
- [Voraussetzungen](#voraussetzungen)
- [Lokale Entwicklung](#lokale-entwicklung)
- [Deployment mit Docker](#deployment-mit-docker)
- [Code-Qualität & Linting](#code-qualität--linting)
- [Git-Workflow](#git-workflow)
- [Konfigurationsdateien](#konfigurationsdateien)
- [Lizenz](#lizenz)
---
## Technologien
| Bereich | Technologie |
| ------------ | ---------------------------------------- |
| Markup | HTML5 |
| Styling | CSS3 |
| Scripting | JavaScript (Vanilla) |
| Layout | [Masonry](https://masonry.desandro.com/) |
| Webserver | Nginx (Alpine) |
| Container | Docker |
| Linting | HTMLHint, Stylelint, ESLint |
| Formatierung | Prettier |
| Git Hooks | Husky + lint-staged |
---
## Projektstruktur
``` ```
├── bilder/ # Bildressourcen ├── haus-schleusingen.html # Einstiegsseite (einzige HTML-Datei)
├── css/ ├── css/
│ └── haus-schleusingen.css # Hauptstylesheet │ └── haus-schleusingen.css # Hauptstylesheet
├── fonts/
│ └── fonts.css # Schriftart-Einbindungen
├── js/ ├── js/
│ ├── haus-schleusingen.js # Haupt-JavaScript │ ├── haus-schleusingen.js # Haupt-JavaScript
│ └── masonry.pkgd.min.js # Masonry-Layout-Bibliothek │ └── masonry.pkgd.min.js # Masonry-Layout-Bibliothek (nicht bearbeiten)
├── haus-schleusingen.html # Einstiegsseite ├── fonts/
│ └── fonts.css # Schriftart-Einbindungen
├── bilder/ # Bildressourcen
├── nginx.conf # Nginx-Konfiguration ├── nginx.conf # Nginx-Konfiguration
├── Dockerfile # Docker-Image (nginx:alpine) ├── Dockerfile # Docker-Image-Definition (nginx:alpine)
├── package.json # Projekt-Metadaten & Skripte
├── eslint.config.js # ESLint-Konfiguration ├── eslint.config.js # ESLint-Konfiguration
├── .stylelintrc.json # Stylelint-Konfiguration ├── .htmlhintrc # HTMLHint-Regeln
├── .htmlhintrc # HTMLHint-Konfiguration ├── .stylelintrc.json # Stylelint-Regeln
├── .prettierrc # Prettier-Konfiguration ├── .prettierrc # Prettier-Einstellungen
├── .husky/pre-commit # Husky Git-Hook (lint-staged) ├── .prettierignore # Prettier-Ausnahmen
── package.json # Projekt-Metadaten & Skripte ── .husky/pre-commit # Git Pre-Commit Hook
├── .dockerignore # Docker Build-Ausnahmen
└── AGENTS.md # Agent-Richtlinien
``` ```
--- ---
## Voraussetzungen ## Voraussetzungen
| Werkzeug | Version | - **Node.js** ≥ 18
| -------- | --------------- | - **npm** ≥ 9
| Node.js | ≥ 18 | - **Docker** (optional, für Container-Deployment)
| npm | ≥ 9 |
| Docker | optional (≥ 20) |
--- ---
## Installation ## Lokale Entwicklung
Kein Build-Step erforderlich das Projekt besteht aus statischen Dateien.
### Abhängigkeiten installieren
```bash ```bash
# Repository klonen
git clone https://git.home.kies-media.de/greggy/landingpage-haus-schleusingen.git
cd landingpage-haus-schleusingen
# Abhängigkeiten installieren
npm install npm install
``` ```
--- ### Lokalen Server starten
## Entwicklung Entweder mit **npx serve**:
### Lokaler Dateiserver
Für die Entwicklung empfiehlt sich ein lokaler Server, z. B.:
```bash ```bash
npx serve . npx serve .
``` ```
Oder mit der in VS Code integrierten _Live Server_-Erweiterung. Oder mit dem **VS Code Live Server** Plugin.
--- ### Linting ausführen
## Deployment mit Docker
Das Projekt enthält ein vorkonfiguriertes Nginx-Image.
```bash
# Image bauen
docker build -t landingpage-haus-schleusingen .
# Container starten (Website-Dateien per Volume einbinden)
docker run -d \
-p 8080:80 \
-v $(pwd):/usr/share/nginx/html:ro \
landingpage-haus-schleusingen
```
Die Seite ist danach unter **http://localhost:8080** erreichbar.
---
## Code-Qualität & Linting
Das Projekt nutzt eine Kombination aus mehreren Linting- und Formatierungswerkzeugen, um eine einheitliche Code-Qualität sicherzustellen:
| Werkzeug | Zweck | Konfigurationsdatei |
| --------------- | ---------------------------------- | ------------------- |
| **ESLint** | JavaScript-Linting | `eslint.config.js` |
| **Stylelint** | CSS-Linting | `.stylelintrc.json` |
| **HTMLHint** | HTML-Linting | `.htmlhintrc` |
| **Prettier** | Code-Formatierung | `.prettierrc` |
| **Husky** | Git Hooks (Pre-Commit) | `.husky/pre-commit` |
| **lint-staged** | Linting nur für gesteuerte Dateien | `package.json` |
### Befehle
#### Alle Linter auf einmal ausführen
```bash ```bash
# Alle Linter auf einmal
npm run lint npm run lint
```
Dadurch werden nacheinander `lint:html`, `lint:css` und `lint:js` ausgeführt. # Oder einzeln
#### HTML linten
```bash
npm run lint:html npm run lint:html
```
Prüft alle `.html`-Dateien mit **HTMLHint**.
Regeln (`.htmlhintrc`):
- Tag-Paarung (`tag-pair`)
- Kleinschreibung von Tags & Attributen (`tagname-lowercase`, `attr-lowercase`)
- Doctype zuerst (`doctype-first`)
- Eindeutige IDs (`id-unique`)
- `alt`-Attribut bei Bildern (`alt-require`)
- Titel erforderlich (`title-require`)
#### CSS linten
```bash
npm run lint:css npm run lint:css
```
Prüft alle CSS-Dateien in `css/` und `fonts/` mit **Stylelint** (basiert auf `stylelint-config-standard`).
#### JavaScript linten
```bash
npm run lint:js npm run lint:js
``` ```
Prüft alle `.js`-Dateien in `js/` mit **ESLint** (minimierte Dateien werden ignoriert). ### Code formatieren
Regeln (`eslint.config.js`):
- `no-unused-vars` → Warnung
- `no-undef` → Warnung
- Prettier-Integration (`prettier/prettier` → Fehler)
#### Code formatieren
```bash ```bash
npm run format npm run format
``` ```
Formatiert alle `html`, `css`, `js`, `json` und `md`-Dateien mit **Prettier** (in-place). ### Formatierung prüfen (ohne Änderung)
#### Formatierung prüfen (ohne Änderungen)
```bash ```bash
npm run format:check npm run format:check
``` ```
Prüft, ob alle Dateien den Prettier-Vorgaben entsprechen, ohne sie zu verändern. ---
#### Husky Pre-Commit Hook ## Deployment mit Docker
Bei jedem `git commit` werden automatisch **lint-staged**-Prüfungen ausgeführt: ### Image bauen
```bash
docker build -t landingpage-haus-schleusingen .
```
### Container starten
```bash
# PowerShell
docker run -d -p 8080:80 -v ${pwd}:/usr/share/nginx/html:ro landingpage-haus-schleusingen
```
Die Website ist danach erreichbar unter: **http://localhost:8080**
> **Hinweis:** Die Website-Dateien werden per Volume-Mount eingebunden (`-v`), sodass Änderungen ohne Neubau des Images sofort wirksam werden.
---
## Code-Qualität & Linting
Das Projekt verwendet mehrere Werkzeuge zur Sicherstellung der Code-Qualität:
| Werkzeug | Zweck | Befehl |
| --------- | ------------------ | ------------------- |
| HTMLHint | HTML-Linting | `npm run lint:html` |
| Stylelint | CSS-Linting | `npm run lint:css` |
| ESLint | JavaScript-Linting | `npm run lint:js` |
| Prettier | Code-Formatierung | `npm run format` |
Alle Linter auf einmal ausführen:
```bash
npm run lint
```
### Wichtige Regeln
- **Prettier-Formatierung ist Pflicht** Verstöße werden als Fehler gewertet.
- **HTMLHint**: Tag-Paarung, Kleinschreibung, eindeutige IDs, `alt`-Attribut bei Bildern und `<title>` sind Pflicht.
- **ESLint**: Ungenutzte Variablen (`no-unused-vars`) und undefinierte Variablen (`no-undef`) ergeben Warnungen.
- **Globale Variablen**: `browser` und `jquery` sind in der ESLint-Konfiguration freigegeben.
- **Minifizierte Dateien** (`*.min.js`, `*.min.css`) werden von Linting und Formatierung ausgeschlossen.
---
## Git-Workflow
Beim Committen führt **Husky** automatisch den Pre-Commit Hook (`.husky/pre-commit`) aus, der **lint-staged** startet.
### lint-staged prüft automatisch:
| Dateityp | Aktionen | | Dateityp | Aktionen |
| -------------- | ------------------------------ | | ---------------- | ------------------------------ |
| `*.html` | HTMLHint + Prettier | | `*.html` | HTMLHint + Prettier |
| `*.css` | Stylelint (`--fix`) + Prettier | | `*.css` | Stylelint (`--fix`) + Prettier |
| `*.js` | ESLint (`--fix`) + Prettier | | `*.js` | ESLint (`--fix`) + Prettier |
| `*.json, *.md` | Prettier | | `*.json`, `*.md` | Prettier |
> Es ist kein manueller Schritt nötig beim Committen werden nur die geänderten Dateien automatisch geprüft und formatiert.
---
## Konfigurationsdateien
| Datei | Beschreibung |
| ------------------- | ----------------------------------------------------------------------------------------------- |
| `.prettierrc` | Prettier-Einstellungen (Semikolons, doppelte Anführungszeichen, 2er-Einrückung, LF-Zeilenenden) |
| `.prettierignore` | Ignoriert `node_modules`, `*.min.js`, `*.min.css` |
| `.htmlhintrc` | HTMLHint-Regeln (Tag-Paarung, Kleinschreibung, IDs, `alt`-Pflicht) |
| `.stylelintrc.json` | Stylelint mit `stylelint-config-standard` und Prettier-Plugin |
| `eslint.config.js` | ESLint-Flat-Config mit Prettier-Integration |
| `.dockerignore` | Schließt `.git`, Skripte und Docker-Dateien vom Build aus |
---
## Lizenz
ISC

BIN
docker-preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -88,7 +88,7 @@
</p> </p>
<div class="intro-stats"> <div class="intro-stats">
<div> <div>
<div class="istat-val">113</div> <div class="istat-val">154,9</div>
<div class="istat-label">Nutzfläche</div> <div class="istat-label">Nutzfläche</div>
</div> </div>
<div> <div>
@@ -103,7 +103,7 @@
</div> </div>
<div class="intro-img" data-animate> <div class="intro-img" data-animate>
<img src="bilder/wohnzimmer2.png" alt="Wohnzimmer" /> <img src="bilder/wohnzimmer2.png" alt="Wohnzimmer" />
<div class="intro-img-badge">Wohnzimmer · 24,7</div> <div class="intro-img-badge">Wohnzimmer · 42,6</div>
</div> </div>
</section> </section>
@@ -123,7 +123,7 @@
</div> </div>
<div class="grid-item" data-img="bilder/wohnzimmer2.png"> <div class="grid-item" data-img="bilder/wohnzimmer2.png">
<img src="bilder/wohnzimmer2-small.png" alt="Wohnzimmer" /> <img src="bilder/wohnzimmer2-small.png" alt="Wohnzimmer" />
<span class="grid-item-label">Wohnzimmer · 24,7</span> <span class="grid-item-label">Wohnzimmer · 42,6</span>
</div> </div>
<div class="grid-item" data-img="bilder/Küche 1.jpg"> <div class="grid-item" data-img="bilder/Küche 1.jpg">
<img src="bilder/Küche 1.jpg" alt="Küche" /> <img src="bilder/Küche 1.jpg" alt="Küche" />
@@ -179,7 +179,7 @@
<div class="floor-header"> <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,4</span> <span>99,5</span>
<div class="floor-icon">+</div> <div class="floor-icon">+</div>
</div> </div>
</div> </div>
@@ -228,7 +228,7 @@
<div class="floor-header"> <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>100,3</span> <span>120,4</span>
<div class="floor-icon">+</div> <div class="floor-icon">+</div>
</div> </div>
</div> </div>
@@ -240,7 +240,7 @@
</div> </div>
<div class="room-chip"> <div class="room-chip">
Wohnzimmer Wohnzimmer
<span class="room-chip-area">24,7</span> <span class="room-chip-area">42,6</span>
</div> </div>
<div class="room-chip"> <div class="room-chip">
Gästezimmer Gästezimmer
@@ -305,7 +305,7 @@
</div> </div>
<div class="room-chip"> <div class="room-chip">
Dachterrasse Dachterrasse
<span class="room-chip-area">35,8 m²</span> <span class="room-chip-area">9,0 m²</span> <small>(25% von 35,8 m²)</small>
</div> </div>
</div> </div>
<div class="floor-plan floor-plan-multi"> <div class="floor-plan floor-plan-multi">
@@ -326,16 +326,24 @@
<div class="floor-header"> <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>52 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"> <div class="floor-body">
<div class="floor-rooms-grid"> <div class="floor-rooms-grid">
<div class="room-chip"> <div class="room-chip">
Dachboden (ungeheizt) Dachboden unten (ungeheizt)
<span class="room-chip-area">52 m²</span> <span class="room-chip-area">52 m²</span>
</div> </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>
<div class="floor-plan floor-plan-multi"> <div class="floor-plan floor-plan-multi">
<img <img

View File

@@ -5,8 +5,8 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"lint:html": "htmlhint \"**/*.html\"", "lint:html": "htmlhint \"**/*.html\"",
"lint:css": "stylelint \"css/**/*.css\" \"fonts/**/*.css\"", "lint:css": "stylelint \"css/**/*.css\" \"fonts/**/*.css\" && echo Stylelint: No errors found",
"lint:js": "eslint \"js/**/*.js\" --ignore-pattern \"**/*.min.js\"", "lint:js": "eslint \"js/**/*.js\" --ignore-pattern \"**/*.min.js\" && echo ESLint: No errors found",
"lint": "npm run lint:html && npm run lint:css && npm run lint:js", "lint": "npm run lint:html && npm run lint:css && npm run lint:js",
"format": "prettier --write \"**/*.{html,css,js,json,md}\" --ignore-path .prettierignore", "format": "prettier --write \"**/*.{html,css,js,json,md}\" --ignore-path .prettierignore",
"format:check": "prettier --check \"**/*.{html,css,js,json,md}\" --ignore-path .prettierignore", "format:check": "prettier --check \"**/*.{html,css,js,json,md}\" --ignore-path .prettierignore",

BIN
page-preview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB