diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..5a5a321 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,40 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project + +Static website for **Dr. med. Carina Kautsch**, Ärztin für Allgemeinmedizin, 1160 Wien. +Served via `nginx:alpine` in Docker. No build step, no framework, no CMS. + +Full project context (infrastructure, design decisions, open items) is in `meineordi-project-summary.md`. + +## Architecture + +Everything is a single file: `index.html` contains all HTML, CSS, and JavaScript inline. +`logo.png` and `favicon.svg` are served as static assets alongside it. + +The only dynamic behaviour is client-side JavaScript: +- **`SCHLIESSZEITEN` array** — at the very top of ``, the sole place to edit holiday closures. `renderClosures()` reads it and builds cards; empty array shows a "no closures" message automatically. +- **Today's hours** — populated on load from a hardcoded day→time map. +- **Font size toggle** — switches `body.large-font` class (18px → 22px), persisted in `localStorage`. +- **Hamburger menu** — toggles `.open` class on mobile nav. + +## Deployment + +Changes go live by: +1. Commit & push to `https://git.stranto.com/cgasser/web_meineordi` (branch: `master`) +2. Portainer → Stacks → `meineordi` → **Pull and redeploy** + +Portainer builds the Docker image directly from the repo (via `build: .` in `docker-compose.yml`). +The container joins `nginx_internal_network` (shared with Nginx Proxy Manager). +NPM routes `new.meineordi.at` → container `meineordi-web` port `80`. + +## Key constraints + +- **No external CSS/JS files** — everything must stay embedded in `index.html`. +- **No framework, no npm, no build step** — plain HTML/CSS/JS only. +- **`logo.png` must exist** in the repo root — it is `COPY`'d into the image by the Dockerfile. Missing it breaks the Docker build. +- **Primary color is `#C8102E`** — do not change, it is extracted from the practice logo. +- **Base font size is 18px** — deliberately large for older patients; large mode is 22px. +- Google Maps embed uses a no-API-key URL. If Google blocks it, switch to the official Maps Embed API (`/maps/embed/v1/place?key=...`). diff --git a/Dockerfile b/Dockerfile index cad162a..49d37d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ FROM nginx:alpine -COPY index.html /usr/share/nginx/html/index.html -COPY logo.png /usr/share/nginx/html/logo.png -COPY favicon.svg /usr/share/nginx/html/favicon.svg +COPY index.html /usr/share/nginx/html/index.html +COPY impressum.html /usr/share/nginx/html/impressum.html +COPY logo.png /usr/share/nginx/html/logo.png +COPY favicon.svg /usr/share/nginx/html/favicon.svg diff --git a/impressum.html b/impressum.html new file mode 100644 index 0000000..aceade5 --- /dev/null +++ b/impressum.html @@ -0,0 +1,511 @@ + + + + + + + Impressum – Dr. Carina Kautsch + + + + + + + + + +
+ +
+ Öffnungszeiten + Leistungen + Aktuelles + Kontakt + 📞 +43 1 493 17 73 +
+ + +
+
+
+ + +
+ +
+ + +
+ +
+ + + + + + + + + diff --git a/index.html b/index.html index 759a75f..44b963c 100644 --- a/index.html +++ b/index.html @@ -415,36 +415,6 @@ footer a { color: #ccc; } footer a:hover { color: #fff; } - /* ─── Impressum / Datenschutz ──────────────────────────── */ - .legal-section h3 { - font-family: 'Cormorant Garamond', serif; - font-size: 1.4rem; - font-weight: 700; - color: var(--red); - margin: 32px 0 10px; - } - .legal-section h3:first-of-type { margin-top: 0; } - .legal-section p, .legal-section li { - font-size: 16px; - color: #444; - line-height: 1.7; - margin-bottom: 8px; - } - .legal-section ul { - padding-left: 20px; - margin-bottom: 12px; - } - .legal-section a { color: var(--red); text-decoration: underline; } - .legal-section .legal-box { - background: #fff; - border-radius: var(--radius); - border-left: 4px solid var(--red); - padding: 20px 24px; - margin-top: 8px; - } - body.large-font .legal-section p, - body.large-font .legal-section li { font-size: 18px; } - /* ─── Font Size Toggle ──────────────────────────────────── */ .font-toggle-wrap { display: flex; @@ -682,12 +652,12 @@ const SCHLIESSZEITEN = [
💊
Rezepte & Überweisungen
-
Ausstellung von Rezepten, Überweisungen und ärztlichen Attesten.
+
Ausstellung von Rezepten und Überweisungen.
🩸
Laboruntersuchungen
-
Blutabnahme und Auswertung gängiger Laborparameter direkt in der Ordination.
+
Blutabnahme und Befundbesprechung in der Ordination.
❤️
@@ -789,165 +759,6 @@ const SCHLIESSZEITEN = [
- -
- -
- - -
- -
- @@ -990,9 +801,33 @@ const SCHLIESSZEITEN = [ 4: '13:00 – 17:00', 5: '09:00 – 12:00', }; + + // Check if today falls within any defined closure period + function isClosureDay() { + const today = new Date(); + today.setHours(0, 0, 0, 0); + for (const c of SCHLIESSZEITEN) { + // Parse date strings like "30.3." from "30.3. – 3.4." + const parts = c.dates.split('–'); + if (parts.length !== 2) continue; + function parseDate(s) { + const p = s.trim().replace(/\.$/, '').split('.'); + const d = parseInt(p[0]), m = parseInt(p[1]) - 1; + let start = new Date(today.getFullYear(), m, d); + return start; + } + const start = parseDate(parts[0]); + const end = parseDate(parts[1]); + // Handle year wrap (e.g. 28.12. – 3.1.) + if (end < start) end.setFullYear(end.getFullYear() + 1); + if (today >= start && today <= end) return true; + } + return false; + } + const day = new Date().getDay(); // 0=Sun, 1=Mon, … const el = document.getElementById('todays-hours'); - el.textContent = hours[day] || 'Geschlossen'; + el.textContent = isClosureDay() ? 'Geschlossen' : (hours[day] || 'Geschlossen'); })(); // Render closure cards