erstes Layout fertig

This commit is contained in:
Bernhard Kolb 2026-04-14 15:02:50 +02:00
parent 4ccec275fd
commit c6a0de159a
11 changed files with 130 additions and 193 deletions

19
app.py
View File

@ -1,20 +1,27 @@
from flask import Flask, render_template from flask import Flask, render_template, send_from_directory
app = Flask(__name__)
@app.route('/favicon.ico')
def favicon():
return send_from_directory('static', 'favicon.ico')
app = Flask(__name__, static_folder="images", static_url_path="/images")
@app.route("/") @app.route("/")
@app.route("/home") @app.route("/home")
def home(): def home():
return render_template("home.html") return render_template("home.html")
@app.route("/impressum")
def impressum():
return render_template("impressum.html")
@app.route("/kontakt") @app.route("/kontakt")
def kontakt(): def kontakt():
return render_template("kontakt.html") return render_template("kontakt.html")
@app.route("/impressum")
def impressum():
return render_template("impressum.html")
@app.route("/datenschutz") @app.route("/datenschutz")
def datenschutz(): def datenschutz():
return render_template("datenschutz.html") return render_template("datenschutz.html")

View File

@ -2,9 +2,7 @@
set -euo pipefail set -euo pipefail
SRC_ROOT="/Volumes/MacBook SD/Projekte/HebammeKrystyna" SRC_ROOT="/Volumes/MacBook SD/Projekte/HebammeKrystyna"
DST_ROOT="/Volumes/docker/flask-postgres/app-hebammekrystyna"
APP_DST="/Volumes/docker/flask-postgres/app-hebammekrystyna"
ASSET_DST="/Volumes/docker/flask-postgres/hebammekrystyna"
NAS_USER="BKolb" NAS_USER="BKolb"
NAS_HOST="192.168.0.10" NAS_HOST="192.168.0.10"
@ -13,10 +11,9 @@ CONTAINER_NAME="flask_hebammekrystyna"
echo "Starte Deployment..." echo "Starte Deployment..."
[ -d "$SRC_ROOT" ] || { echo "Quelle fehlt: $SRC_ROOT"; exit 1; } [ -d "$SRC_ROOT" ] || { echo "Quelle fehlt: $SRC_ROOT"; exit 1; }
[ -d "$APP_DST" ] || { echo "App-Ziel fehlt: $APP_DST"; exit 1; } [ -d "$DST_ROOT" ] || { echo "Ziel fehlt: $DST_ROOT"; exit 1; }
[ -d "$ASSET_DST" ] || { echo "Asset-Ziel fehlt: $ASSET_DST"; exit 1; }
echo "Synchronisiere Projektdateien nach $APP_DST ..." echo "Synchronisiere Projektdateien ..."
rsync -av --delete \ rsync -av --delete \
--exclude '.DS_Store' \ --exclude '.DS_Store' \
--exclude '._*' \ --exclude '._*' \
@ -29,47 +26,11 @@ rsync -av --delete \
--exclude 'venv/' \ --exclude 'venv/' \
--exclude 'node_modules/' \ --exclude 'node_modules/' \
--exclude 'files/' \ --exclude 'files/' \
--exclude 'images/' \ "$SRC_ROOT/" "$DST_ROOT/"
--exclude 'styles/' \
"$SRC_ROOT/" "$APP_DST/"
echo "Synchronisiere images/ nach $ASSET_DST/images ..."
if [ -d "$SRC_ROOT/images" ]; then
mkdir -p "$ASSET_DST/images"
rsync -av --delete \
--exclude '.DS_Store' \
--exclude '._*' \
--exclude 'videos/' \
"$SRC_ROOT/images/" "$ASSET_DST/images/"
else
echo "Hinweis: $SRC_ROOT/images nicht gefunden, übersprungen."
fi
echo "Synchronisiere styles/ nach $ASSET_DST/styles ..."
if [ -d "$SRC_ROOT/styles" ]; then
mkdir -p "$ASSET_DST/styles"
rsync -av --delete \
--exclude '.DS_Store' \
--exclude '._*' \
"$SRC_ROOT/styles/" "$ASSET_DST/styles/"
else
echo "Hinweis: $SRC_ROOT/styles nicht gefunden, übersprungen."
fi
echo "Synchronisiere templates/ nach $APP_DST/templates ..."
if [ -d "$SRC_ROOT/templates" ]; then
mkdir -p "$APP_DST/templates"
rsync -av --delete \
--exclude '.DS_Store' \
--exclude '._*' \
"$SRC_ROOT/templates/" "$APP_DST/templates/"
else
echo "Hinweis: $SRC_ROOT/templates nicht gefunden, übersprungen."
fi
echo "files/ wird bewusst nicht angefasst." echo "files/ wird bewusst nicht angefasst."
echo "Container neu starten ... manuell!" echo "Starte Container neu ..."
#ssh "${NAS_USER}@${NAS_HOST}" "docker restart ${CONTAINER_NAME}" #ssh "${NAS_USER}@${NAS_HOST}" "docker restart ${CONTAINER_NAME}"
echo "Deployment abgeschlossen." echo "Deployment abgeschlossen."

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -8,8 +8,7 @@
--text: #4b4650; --text: #4b4650;
--accent-rosa: #bf6f8c; --accent-rosa: #bf6f8c;
--accent-blau: #6f8eae; --accent-blau: #6f8eae;
--card: rgba(255, 255, 255, 0.82); --card: rgba(255, 255, 255, 0.85);
--card-strong: rgba(255, 255, 255, 0.9);
--shadow: 0 12px 30px rgba(86, 110, 140, 0.16); --shadow: 0 12px 30px rgba(86, 110, 140, 0.16);
--radius: 24px; --radius: 24px;
} }
@ -22,74 +21,35 @@ body {
margin: 0; margin: 0;
color: var(--text); color: var(--text);
font-family: "Quicksand", Arial, sans-serif; font-family: "Quicksand", Arial, sans-serif;
background: linear-gradient(135deg, var(--rosa-1) 0%, var(--rosa-2) 35%, var(--blau-1) 70%, var(--blau-2) 100%); background: linear-gradient(135deg, var(--rosa-1), var(--blau-2));
min-height: 100vh; min-height: 100vh;
} }
h1, h2, h3, .handwritten, .hero-motto { h1, h2, h3 {
font-family: "Handlee", cursive; font-family: "Handlee", cursive;
font-weight: 400;
} }
.page-wrap { .page-wrap {
max-width: 1180px; max-width: 1180px;
margin: 0 auto; margin: 0 auto;
padding: 28px 20px 40px; padding: 22px 20px 40px;
}
.topbar {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 24px;
margin-bottom: 20px;
}
.logo-box,
.photo-box,
.main-nav,
.hero-card,
.info-card,
details,
.legal-card {
background: var(--card);
box-shadow: var(--shadow);
border-radius: var(--radius);
backdrop-filter: blur(6px);
}
.logo-box,
.photo-box {
padding: 14px;
}
.logo {
display: block;
height: 92px;
width: auto;
object-fit: contain;
}
.profile {
display: block;
width: 200px;
max-width: 100%;
height: auto;
border-radius: 22px;
object-fit: cover;
box-shadow: 0 12px 28px rgba(0,0,0,0.14);
} }
.main-nav { .main-nav {
padding: 14px 18px; background: var(--card);
margin-bottom: 28px; padding: 14px 20px;
border-radius: var(--radius);
margin-bottom: 26px;
box-shadow: var(--shadow);
text-align: center;
} }
.main-nav a { .main-nav a {
display: inline-block;
margin: 0 14px;
text-decoration: none; text-decoration: none;
color: var(--accent-blau);
font-weight: 700; font-weight: 700;
margin-right: 18px; color: var(--accent-blau);
font-size: 1rem; font-size: 1rem;
} }
@ -97,18 +57,33 @@ details,
color: var(--accent-rosa); color: var(--accent-rosa);
} }
.hero { .hero-header {
display: grid; display: grid;
grid-template-columns: 1.2fr 0.8fr; grid-template-columns: 180px 1fr 220px;
gap: 26px; gap: 28px;
align-items: center; align-items: center;
margin-bottom: 34px; background: var(--card);
border-radius: var(--radius);
box-shadow: var(--shadow);
padding: 28px 30px;
margin-bottom: 28px;
} }
.hero-card, .hero-logo {
.info-card, display: flex;
.legal-card { align-items: center;
padding: 30px; justify-content: center;
}
.logo {
max-width: 150px;
width: 100%;
height: auto;
display: block;
}
.hero-text-block {
min-width: 0;
} }
.eyebrow { .eyebrow {
@ -129,62 +104,70 @@ h1 {
margin: 0 0 18px; margin: 0 0 18px;
} }
h2 {
font-size: 2rem;
color: #6f5f6b;
margin-top: 0;
}
.hero-motto { .hero-motto {
font-size: 1.45rem; font-size: 1.22rem;
line-height: 1.65;
margin: 0;
color: #735f6c;
}
.lead,
.info-card p,
.legal-card p,
.legal-card li {
font-size: 1.06rem;
line-height: 1.75; line-height: 1.75;
margin: 0;
} }
.note-region { .note-region {
margin-top: 18px; margin-top: 16px;
font-weight: 700; font-weight: 700;
color: var(--accent-blau); color: var(--accent-blau);
} }
.hero-photo {
display: flex;
justify-content: center;
align-items: center;
}
.profile {
width: 220px;
height: 260px;
object-fit: cover;
object-position: center 20%; /* verschiebt Fokus nach oben */
border-radius: 22px;
}
.info-card,
.legal-card {
background: var(--card);
padding: 30px;
border-radius: var(--radius);
box-shadow: var(--shadow);
margin-bottom: 28px;
}
.section-title { .section-title {
margin: 10px 0 14px; font-size: 2rem;
margin-bottom: 10px;
} }
.section-subtitle { .section-subtitle {
max-width: 820px; margin-bottom: 20px;
line-height: 1.75; line-height: 1.75;
margin: 0 0 24px;
} }
.services-grid { .services-grid {
display: grid; display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, 1fr);
gap: 18px; gap: 18px;
} }
details { details {
background: var(--card);
border-radius: var(--radius);
box-shadow: var(--shadow);
overflow: hidden; overflow: hidden;
} }
summary { summary {
list-style: none; padding: 18px;
cursor: pointer;
padding: 20px 22px;
font-weight: 700; font-weight: 700;
cursor: pointer;
list-style: none;
color: var(--accent-blau); color: var(--accent-blau);
display: flex;
justify-content: space-between;
align-items: center;
} }
summary::-webkit-details-marker { summary::-webkit-details-marker {
@ -193,16 +176,18 @@ summary::-webkit-details-marker {
summary::after { summary::after {
content: "+"; content: "+";
font-size: 1.5rem; float: right;
color: var(--accent-rosa); color: var(--accent-rosa);
font-size: 1.4rem;
line-height: 1;
} }
details[open] summary::after { details[open] summary::after {
content: ""; content: "";
} }
.detail-content { .detail-content {
padding: 0 22px 22px; padding: 0 18px 18px;
line-height: 1.75; line-height: 1.75;
} }
@ -211,50 +196,36 @@ details[open] summary::after {
line-height: 1.9; line-height: 1.9;
} }
.contact-block a { .contact-block a,
.legal-card a {
color: var(--accent-blau); color: var(--accent-blau);
text-decoration: none; text-decoration: none;
font-weight: 700; font-weight: 700;
} }
.legal-card h3 {
margin-top: 28px;
margin-bottom: 10px;
font-size: 1.55rem;
color: var(--accent-blau);
}
.legal-card ul {
padding-left: 20px;
line-height: 1.8;
}
.footer { .footer {
text-align: center; text-align: center;
padding-top: 28px; margin-top: 40px;
color: #736b76; color: #777;
} }
@media (max-width: 900px) { @media (max-width: 980px) {
.hero, .hero-header {
.services-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
text-align: center;
} }
}
@media (max-width: 640px) { .hero-logo,
.topbar { .hero-photo {
flex-direction: column; justify-content: center;
} }
.profile { .profile {
width: 100%; width: 150px;
max-width: 260px; height: 150px;
} }
.hero-card, .services-grid {
.info-card, grid-template-columns: 1fr;
.legal-card {
padding: 22px;
} }
} }

View File

View File

@ -4,19 +4,11 @@
<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>{% block title %}Hebamme Krystyna Kolb{% endblock %}</title> <title>{% block title %}Hebamme Krystyna Kolb{% endblock %}</title>
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="{{ url_for('static', filename='styles/style.css') }}"> <link rel="stylesheet" href="{{ url_for('static', filename='styles/style.css') }}">
</head> </head>
<body> <body>
<div class="page-wrap"> <div class="page-wrap">
<header class="topbar">
<div class="logo-box">
<img src="{{ url_for('static', filename='logo_transparent.png') }}" alt="Logo Hebamme Krystyna Kolb" class="logo">
</div>
<div class="photo-box">
<img src="{{ url_for('static', filename='Krystyna_optimized_full.png') }}" alt="Krystyna Kolb" class="profile">
</div>
</header>
<nav class="main-nav"> <nav class="main-nav">
<a href="{{ url_for('home') }}">Startseite</a> <a href="{{ url_for('home') }}">Startseite</a>
@ -25,9 +17,7 @@
<a href="{{ url_for('datenschutz') }}">Datenschutz</a> <a href="{{ url_for('datenschutz') }}">Datenschutz</a>
</nav> </nav>
<main> {% block content %}{% endblock %}
{% block content %}{% endblock %}
</main>
<footer class="footer"> <footer class="footer">
<p>Hebamme Krystyna Kolb · Von Wien bis zum Neusiedlersee</p> <p>Hebamme Krystyna Kolb · Von Wien bis zum Neusiedlersee</p>

View File

@ -2,8 +2,12 @@
{% block title %}Hebamme Krystyna Kolb{% endblock %} {% block title %}Hebamme Krystyna Kolb{% endblock %}
{% block content %} {% block content %}
<section class="hero"> <section class="hero-header">
<div class="hero-card"> <div class="hero-logo">
<img src="{{ url_for('static', filename='images/logo_transparent.png') }}" alt="Logo Hebamme Krystyna Kolb" class="logo">
</div>
<div class="hero-text-block">
<div class="eyebrow">Mit Herz, Erfahrung und Achtsamkeit</div> <div class="eyebrow">Mit Herz, Erfahrung und Achtsamkeit</div>
<h1>Hebamme Krystyna Kolb</h1> <h1>Hebamme Krystyna Kolb</h1>
<p class="hero-motto"> <p class="hero-motto">
@ -16,17 +20,21 @@
</p> </p>
</div> </div>
<div class="info-card"> <div class="hero-photo">
<h2>Begleitung in einer besonderen Zeit</h2> <img src="{{ url_for('static', filename='images/Krystyna_optimized_full.png') }}" alt="Krystyna Kolb" class="profile">
<p>
Schwangerschaft, Geburt und die erste Zeit mit eurem Baby sind besonders wertvolle Lebensphasen.
Ich begleite euch mit Ruhe, Erfahrung und einem offenen Ohr für eure Fragen, Sorgen und Wünsche.
Dabei ist mir wichtig, dass ihr euch sicher, verstanden und gut aufgehoben fühlt.
</p>
</div> </div>
</section> </section>
<section> <section class="info-card">
<h2>Begleitung in einer besonderen Zeit</h2>
<p>
Schwangerschaft, Geburt und die erste Zeit mit eurem Baby sind besonders wertvolle Lebensphasen.
Ich begleite euch mit Ruhe, Erfahrung und einem offenen Ohr für eure Fragen, Sorgen und Wünsche.
Dabei ist mir wichtig, dass ihr euch sicher, verstanden und gut aufgehoben fühlt.
</p>
</section>
<section class="services-section">
<h2 class="section-title">Meine Leistungen</h2> <h2 class="section-title">Meine Leistungen</h2>
<p class="section-subtitle"> <p class="section-subtitle">
Jede Familie ist anders deshalb darf auch Begleitung individuell sein. Meine Leistungen unterstützen Jede Familie ist anders deshalb darf auch Begleitung individuell sein. Meine Leistungen unterstützen