SEOOptimierungenAlex07092025

This commit is contained in:
astosic 2025-09-08 01:15:11 +02:00
parent 6828c3f835
commit b7f8f2ac5e
34 changed files with 4426 additions and 253 deletions

View file

@ -194,3 +194,12 @@ body {
margin: 0; margin: 0;
padding: 20px; padding: 20px;
} }
.sr-only {
position: absolute !important;
width: 1px; height: 1px;
padding: 0; margin: -1px; overflow: hidden;
clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

View file

@ -1,5 +1,6 @@
######################## default configuration #################### ######################## default configuration ####################
baseURL = "" baseURL = "https://www.amperion.at/"
title = "AMPERION" title = "AMPERION"
theme = "airspace-hugo" theme = "airspace-hugo"
# Default time zone for time stamps; use any valid tz database name: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List # Default time zone for time stamps; use any valid tz database name: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
@ -36,7 +37,8 @@ target = '$1'
############################# Outputs ############################## ############################# Outputs ##############################
[outputs] [outputs]
home = ["HTML", "WebAppManifest"] home = ["HTML", "Sitemap", "WebAppManifest"]
############################# Imaging ############################## ############################# Imaging ##############################
[imaging] [imaging]

View file

@ -12,7 +12,8 @@ logo_text = "AMPERION"
# navbar fixed to top # navbar fixed to top
navbar_fixed = true navbar_fixed = true
# OpenGraph / Twitter Card metadata # OpenGraph / Twitter Card metadata
description = "This is meta description" description = "Staatlich geprüftes Ingenieurbüro & Elektrotechnikbetrieb: Planung, Projektmanagement & Consulting für Photovoltaik, Energiespeicher und Ladeinfrastruktur."
default_meta_description = "Staatlich geprüftes Ingenieurbüro & Elektrotechnikbetrieb: Planung, Projektmanagement & Consulting für Photovoltaik, Energiespeicher und Ladeinfrastruktur."
author = "AMPERION GmbH" author = "AMPERION GmbH"
image = "images/logo.webp" # this image will be used as fallback if a page has no image of its own image = "images/logo.webp" # this image will be used as fallback if a page has no image of its own
# Whether to display text descriptors (like "E-mail: ", "Phone: ") before the address block elements # Whether to display text descriptors (like "E-mail: ", "Phone: ") before the address block elements

View file

@ -7,7 +7,9 @@ draft: false
tags: ["E-Mobilität", "Ladeinfrastruktur", "AC/DC", "Lastmanagement", "Backend", "Abrechnung", "EMS"] tags: ["E-Mobilität", "Ladeinfrastruktur", "AC/DC", "Lastmanagement", "Backend", "Abrechnung", "EMS"]
categories: ["Fokusthemen"] categories: ["Fokusthemen"]
meta_description: "Ladeinfrastruktur: AC/DC-Planung, Netzanschluss, Lastmanagement, Abrechnung skalierbar & zukunftssicher." meta_title: "Ladeinfrastruktur planen (AC/DC) | AMPERION"
meta_description: "Standort, Layout, Mittelspannungsanschluss, eichrechtskonforme DC-Systeme und dynamisches Lastmanagement bis zur Inbetriebnahme."
kicker: "Fokusthema" kicker: "Fokusthema"
subtitle: "Ladeinfrastruktur, die heute funktioniert und morgen skaliert." subtitle: "Ladeinfrastruktur, die heute funktioniert und morgen skaliert."
hero_cta_label: "Jetzt starten" hero_cta_label: "Jetzt starten"

View file

@ -7,7 +7,8 @@ draft: false
tags: ["Speicher", "Batteriespeicher", "Peak-Shaving", "Eigenverbrauch", "EMS", "Notstrom", "Redox-Flow"] tags: ["Speicher", "Batteriespeicher", "Peak-Shaving", "Eigenverbrauch", "EMS", "Notstrom", "Redox-Flow"]
categories: ["Fokusthemen"] categories: ["Fokusthemen"]
meta_description: "Stromspeicher für Unternehmen: technologieoffen dimensioniert, wirtschaftlich begründet, sicher integriert mit EMS & Notstrom." meta_title: "Energiespeicher für Gewerbe | AMPERION"
meta_description: "Peak-Shaving, Eigenverbrauchsoptimierung und EMS-Integration korrekt dimensioniert mit Blick auf C-Rate, Zyklen und Degradation."
kicker: "Fokusthema" kicker: "Fokusthema"
subtitle: "Lastspitzen kappen, Kosten senken sicher ins EMS eingebunden." subtitle: "Lastspitzen kappen, Kosten senken sicher ins EMS eingebunden."
hero_cta_label: "Speicherlösung planen" hero_cta_label: "Speicherlösung planen"

View file

@ -6,7 +6,8 @@ date: 2025-08-12
draft: false draft: false
tags: ["Photovoltaik", "PV Planung", "Wirtschaftlichkeitsberechnung", "Netzintegration", "Eigenverbrauch", "EMS", "Ladeinfrastruktur"] tags: ["Photovoltaik", "PV Planung", "Wirtschaftlichkeitsberechnung", "Netzintegration", "Eigenverbrauch", "EMS", "Ladeinfrastruktur"]
categories: ["Fokusthemen"] categories: ["Fokusthemen"]
meta_description: "PV für Unternehmen & Gemeinden: wirtschaftlich, sicher, integriert. PV mit Speicher & Ladeinfrastruktur aus einer Hand." meta_title: "Photovoltaik Planung & Netzzutritt (B2B) | AMPERION"
meta_description: "Einreich-/Ausführungsplanung, Stringdesign, Brandschutz und netzbetreiberkonforme Umsetzung für Gewerbe/Industrie und Kommunen."
kicker: "Fokusthema" kicker: "Fokusthema"
subtitle: "Präzise geplant maximaler Eigenverbrauch, stabile Erträge." subtitle: "Präzise geplant maximaler Eigenverbrauch, stabile Erträge."
hero_cta_label: "Projekt starten" hero_cta_label: "Projekt starten"
@ -54,7 +55,7 @@ cta_href: "/contact/"
--- ---
### Photovoltaik mit Ingenieurspräzision normgerecht & wirtschaftlich ### Photovoltaik mit Ingenieurspräzision normgerecht & wirtschaftlich
Wir planen und realisieren **Photovoltaiksysteme** als integrierte Energiestrategie: **Standortanalyse, Verschattungsprüfung, Netzanbindung, Sicherheitskonzepte** und **integrierte Speicher- & Ladeinfrastruktur**. Wir planen und realisieren **Photovoltaiksysteme** als integrierte Energiestrategie: **Standortanalyse, Verschattungsprüfung, Netzanbindung, Sicherheitskonzepte** und **integrierte Speicher- & Ladeinfrastruktur**.
Als staatlich geprüftes Ingenieurbüro sichern wir **technische Zuverlässigkeit, maximale Eigenverbrauchsquote und wirtschaftliche Performance** von der **Machbarkeitsstudie über Einreich- und Ausführungsplanung bis zur Inbetriebnahme**. Ihr Projekt startet termingerecht, normkonform und effizient. Als staatlich geprüftes Ingenieurbüro sichern wir **technische Zuverlässigkeit, maximale Eigenverbrauchsquote und wirtschaftliche Performance** von der **Machbarkeitsstudie über Einreich- und Ausführungsplanung bis zur Inbetriebnahme**. Ihr Projekt startet termingerecht, normkonform und effizient.

View file

@ -6,7 +6,8 @@ date: 2025-08-12
draft: false draft: false
tags: ["Consulting", "Standortprüfung", "Energiekonzepte", "Förderberatung", "Energiemanagement", "Bestandsanlagen", "Technologievergleich"] tags: ["Consulting", "Standortprüfung", "Energiekonzepte", "Förderberatung", "Energiemanagement", "Bestandsanlagen", "Technologievergleich"]
categories: ["Leistungen"] categories: ["Leistungen"]
meta_description: "Energie-Consulting: unabhängig, wirtschaftlich, technologieoffen. Von Standortprüfung bis Energiemanagement mit klarem Business Case." meta_title: "Consulting Energieprojekte (B2B) | AMPERION"
meta_description: "Standort-/Lastganganalysen, Förder-Check, Machbarkeit und Business-Case mit Szenarien & Sensitivität technologieoffen."
kicker: "Strategie & Engineering" kicker: "Strategie & Engineering"
subtitle: "Technologieoffen beraten mit klarem Business Case." subtitle: "Technologieoffen beraten mit klarem Business Case."
hero_cta_label: "Beratungstermin sichern" hero_cta_label: "Beratungstermin sichern"

View file

@ -6,7 +6,8 @@ date: 2025-08-12
draft: false draft: false
tags: ["Planung", "Einreichplanung", "Ausführungsplanung", "Energieausweis", "Energiekonzept", "Technische Studien", "Photovoltaik", "Speicher", "Ladeinfrastruktur"] tags: ["Planung", "Einreichplanung", "Ausführungsplanung", "Energieausweis", "Energiekonzept", "Technische Studien", "Photovoltaik", "Speicher", "Ladeinfrastruktur"]
categories: ["Leistungen"] categories: ["Leistungen"]
meta_description: "Planung für PV, Speicher & Ladeinfrastruktur unabhängig, normkonform, wirtschaftlich. Staatlich geprüft & konzessioniert." meta_title: "Einreich- & Ausführungsplanung | AMPERION"
meta_description: "Stromlauf-/Verlegepläne, Schutz/Selektivität, Brandschutz und Netzanschluss sauber dokumentiert und netzbetreiberkonform."
kicker: "Engineering & Elektrotechnik" kicker: "Engineering & Elektrotechnik"
subtitle: "Technisch präzise geplant wirtschaftlich belastbar." subtitle: "Technisch präzise geplant wirtschaftlich belastbar."
hero_cta_label: "Jetzt unverbindlich anfragen" hero_cta_label: "Jetzt unverbindlich anfragen"

View file

@ -6,6 +6,7 @@ date: 2025-08-12
draft: false draft: false
tags: ["Projektmanagement", "Baukoordination", "Begleitende Kontrolle", "Bauherrnvertretung", "Dokumentation", "Inbetriebnahme"] tags: ["Projektmanagement", "Baukoordination", "Begleitende Kontrolle", "Bauherrnvertretung", "Dokumentation", "Inbetriebnahme"]
categories: ["Leistungen"] categories: ["Leistungen"]
meta_title: "Projektmanagement Elektrotechnik | AMPERION"
meta_description: "Projektmanagement für Energieprojekte: Koordination, Kontrolle, Dokumentation unabhängig, elektrotechnisch fundiert, sicher zur Abnahme." meta_description: "Projektmanagement für Energieprojekte: Koordination, Kontrolle, Dokumentation unabhängig, elektrotechnisch fundiert, sicher zur Abnahme."
kicker: "Engineering & Elektrotechnik" kicker: "Engineering & Elektrotechnik"
subtitle: "Sicher zur Abnahme Termine, Kosten, Qualität im Griff." subtitle: "Sicher zur Abnahme Termine, Kosten, Qualität im Griff."

View file

@ -1,4 +1,7 @@
--- ---
meta_title: "Ingenieurbüro: PV, Speicher & Ladeinfrastruktur | AMPERION"
meta_description: "Planung, Netzanschluss & Projektmanagement für Unternehmen und Kommunen: Photovoltaik, Energiespeicher, Ladeinfrastruktur herstellerneutral, normkonform, wirtschaftlich."
############################### Banner ############################## ############################### Banner ##############################
banner: banner:
enable: true enable: true
@ -19,14 +22,26 @@ banner:
link: "#about" link: "#about"
image: "images/pfeil-nach-unten-skizze.webp" image: "images/pfeil-nach-unten-skizze.webp"
label: "About us" label: "About us"
############################# About ################################# ############################# About #################################
about: about:
enable: true enable: true
title: "ÜBER AMPERION" title: "ÜBER AMPERION"
description: "Technik mit Verantwortung. Planung mit Weitblick." description: "Technik mit Verantwortung. Planung mit Weitblick."
content: "<b> AMPERION </b> ist ein <b>staatlich geprüftes Ingenieurbüro</b> und <b> konzessionierter Elektrotechnikbetrieb</b> mit Sitz in Niederösterreich. <p> Wir unterstützen Unternehmen, Gemeinden und Bauträger bei der Planung und Umsetzung nachhaltiger Energiesysteme mit einem klaren Fokus auf Photovoltaik, Speicherlösungen, Ladeinfrastruktur und smarte Gebäudetechnik. <br><br><b> Systemisch. Unabhängig. Zukunftsorientiert. </b> <br><br> Denn Technik ist für uns kein Selbstzweck sondern ein Werkzeug, um Lösungen zu schaffen, die in der Praxis funktionieren und dauerhaft Bestand haben. <br> Mit technischem <b> Know-how, Verantwortungsbewusstsein </b> und einem geschulten Blick fürs Ganze bringen wir Energieprojekte von der Idee bis zur Inbetriebnahme. </b> </p>" content: |
image: "images/ingenieurbuero.svg" **AMPERION** ist ein **staatlich geprüftes Ingenieurbüro** und **konzessionierter Elektrotechnikbetrieb** in Niederösterreich. Wir unterstützen **Unternehmen, Gemeinden, Bauträger aber auch Privatpersonen** dabei, Energieprojekte technisch sicher, wirtschaftlich und termingerecht umzusetzen von der Idee bis zur Inbetriebnahme.
Unsere Schwerpunkte: **[Photovoltaik](/photovoltaik/)**, **[Energiespeicher](/energiespeicher/)** und **[Ladeinfrastruktur](/e-mobilitaet/)**. Wir planen **herstellerneutral**, prüfen Varianten transparent und achten auf **Normkonformität**.
**Was Sie erwarten können:**
- **Einreich- & Ausführungsplanung:** mit präzisem Stringdesign, Anschlusskonzept und geprüften Plänen.
- **Projektmanagement & Baukoordination:** klare Meilensteine, Schnittstellenführung, Dokumentation bis zur Abnahme.
- **Beratung und Consulting:** Eigenverbrauchsquote, Business case/Wirtschaftlichkeitsanalyse, Förderungen für belastbare Investitionsentscheidungen.
- **Systemdenken**: PV, Speicher, Laden und Energiemanagement als integriertes Energiesystem.
Unser Anspruch: **systemisch, unabhängig, zukunftsorientiert**. So entstehen Lösungen, die **in der Praxis funktionieren** zuverlässig im Betrieb, **erweiterbar** bei steigendem Bedarf und **wirtschaftlich** über den gesamten Lebenszyklus.
image: "images/ingenieurbuero.svg"
######################### Portfolio ############################### ######################### Portfolio ###############################
@ -34,18 +49,18 @@ portfolio:
enable: true enable: true
bg_image: "images/amperion_letters_color.webp" bg_image: "images/amperion_letters_color.webp"
title: "Wir entwickeln die Energiezukunft" title: "Wir entwickeln die Energiezukunft"
content: " TEXT " content: "Referenzen aus Planung, Netzzutritt und Projektmanagement von PV-Dachanlagen über Speicherintegration bis zur Ladeinfrastruktur. Nachhaltig, normkonform und wirtschaftlich."
button: button:
enable: true enable: true
label: "Projekte" label: "Projekte"
link: "project/" link: "project/"
############################# Service ############################ ############################# Service ############################
service: service:
enable: true enable: true
# service content comes from "service.md" file # service content comes from "service.md" file
############################# facts ############################### ############################# facts ###############################
facts: facts:
enable: true enable: true
@ -56,9 +71,6 @@ facts:
name: "Ingenieurbuero" name: "Ingenieurbuero"
count: "200" count: "200"
testimonial_slider: testimonial_slider:
# testimonial item loop # testimonial item loop
- name: "" - name: ""
@ -78,7 +90,6 @@ facts:
designation: "" designation: ""
content: "" content: ""
cta: cta:
enable: true enable: true
title: "Kostenlose Erstberatung sichern!" title: "Kostenlose Erstberatung sichern!"
@ -86,5 +97,4 @@ cta:
accent: "Jetzt Kontakt aufnehmen!" accent: "Jetzt Kontakt aufnehmen!"
email_button_text: "E-Mail senden" email_button_text: "E-Mail senden"
phone_button_text: "Anrufen" phone_button_text: "Anrufen"
--- ---

View file

@ -3,6 +3,8 @@ title: "Wir sind AMPERION"
bg_image: "" bg_image: ""
layout: "about" layout: "about"
draft: false draft: false
meta_title: "Über AMPERION | Ingenieurbüro"
meta_description: "Ingenieurbüro für PV, Ladeinfrastruktur und Energiespeicher unabhängige Beratung, Normenkompetenz und Netzbetreiber-Erfahrung."
intro_section: intro_section:
enable: true enable: true

View file

@ -1,4 +1,7 @@
--- ---
meta_title: "AGB | AMPERION"
meta_description: "Allgemeine Geschäftsbedingungen: Geltungsbereich, Angebote, Leistungen, Haftung, Gewährleistung, Zahlungs- und Vertragsbedingungen."
robots: "noindex,follow"
title: "Allgemeine Geschäftsbedingungen" title: "Allgemeine Geschäftsbedingungen"
description: "" description: ""
subtitle : "" subtitle : ""

View file

@ -5,6 +5,10 @@ bg_image: ""
layout: "contact" layout: "contact"
draft: false draft: false
# SEO
meta_title: "Kontakt & Projektanfrage | AMPERION"
meta_description: "Rückmeldung innerhalb von 24 Stunden. Jetzt Projekt anfragen Photovoltaik, Speicher, Ladeinfrastruktur."
############################# call to action ################################# ############################# call to action #################################
cta: cta:
enable : true enable : true

View file

@ -1,4 +1,7 @@
--- ---
meta_title: "Datenschutz | AMPERION"
meta_description: "Informationen zum Datenschutz gemäß DSGVO: Verantwortlicher, Zwecke, Rechtsgrundlagen, Speicherdauer, Betroffenenrechte, Kontakt."
robots: "noindex,follow"
title: "Datenschutz" title: "Datenschutz"
description: "" description: ""
subtitle : "" subtitle : ""

View file

@ -1,4 +1,7 @@
--- ---
meta_title: "Impressum | AMPERION"
meta_description: "Angaben gemäß ECG: AMPERION GmbH Kontakt, Firmenbuch, UID, zuständige Behörde und weitere Pflichtangaben."
# robots: "index,follow" # optional; Standard ist ohnehin index,follow
title: "Impressum" title: "Impressum"
layout: "impressum" layout: "impressum"
bg_image: "images/module_reflection_2.webp" bg_image: "images/module_reflection_2.webp"

View file

@ -1,12 +1,15 @@
--- ---
title: "Karriere" title: "Karriere"
slug: "karriere" slug: "karriere"
layout: "karriere" layout: "karriere"
image: "/images/karriere/karriere_hero.webp" image: "/images/karriere/karriere_hero.webp"
og_image: "/images/karriere/karriere_hero.webp" og_image: "/images/karriere/karriere_hero.webp"
date: 2025-01-01 date: 2025-01-01
draft: false draft: false
# SEO
meta_title: "Karriere: Jobs in PV, Ladeinfrastruktur & Speicher | AMPERION"
meta_description: "Jobs für Elektrotechnik & Energie: PV, Ladeinfrastruktur & Speicher. Flexible Arbeitszeiten, Weiterbildung, Hybrid/Remote. Jetzt bewerben oder initiativ."
hero: hero:
title: "Karriere bei AMPERION" title: "Karriere bei AMPERION"
@ -35,5 +38,4 @@ cta:
cta_text: "Gestalte die Energiewende mit uns." cta_text: "Gestalte die Energiewende mit uns."
cta_label: "Jetzt bewerben" cta_label: "Jetzt bewerben"
cta_href: "/contact/" cta_href: "/contact/"
---
---

View file

@ -1,71 +1,46 @@
<!-- <!--
PROJECT: Startup Hugo PROJECT: Startup Hugo
VERSION: 1.0.0 VERSION: 1.0.0
AUTHOR: Gethugothemes AUTHOR: Gethugothemes
AUTHOR WEBSITE: https://gethugothemes.com AUTHOR WEBSITE: https://gethugothemes.com
--> -->
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ site.LanguageCode | default `en-US` }}" itemscope itemtype="http://schema.org/WebPage"> <html lang="{{ site.LanguageCode | default `de-AT` }}" itemscope itemtype="http://schema.org/WebPage">
<head> <head>
{{ partial "head.html" . }} {{ partial "head.html" . }}
<!-- WICHTIG: kein weiterer <meta name="viewport"> hier; ist bereits in head.html enthalten -->
<!-- Meta Viewport Tag hinzufügen -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- cache partial only in production -->
{{ if hugo.IsProduction }}
{{ partialCached "style.html" . }}
{{ else }}
{{ partial "style.html" . }}
{{ end }}
<!-- cache partial only in production -->
{{ if hugo.IsProduction }}
{{ partialCached "style.html" . }}
{{ else }}
{{ partial "style.html" . }}
{{ end }}
</head> </head>
<body> <body>
<!-- cache partial only in production --> <!-- cache partial only in production -->
{{ partial "header.html" . }} {{ partial "header.html" . }}
{{ if hugo.IsProduction }} {{ if hugo.IsProduction }}
{{ partialCached "preloader.html" . }} {{ partialCached "preloader.html" . }}
{{ else }} {{ else }}
{{ partial "preloader.html" . }} {{ partial "preloader.html" . }}
{{ end }} {{ end }}
<main>
{{ block "main" . }}{{ end }}
</main>
<!-- cache partial only in production -->
{{ if hugo.IsProduction }}
{{ partialCached "footer.html" . }}
{{ partialCached "script.html" . }}
{{ else }}
{{ partial "footer.html" . }}
{{ partial "script.html" . }}
{{ end }}
<main>
{{ block "main" . }}{{ end }}
</main>
<!-- cache partial only in production -->
{{ if hugo.IsProduction }}
{{ partialCached "footer.html" . }}
{{ partialCached "script.html" . }}
{{ else }}
{{ partial "footer.html" . }}
{{ partial "script.html" . }}
{{ end }}
</body> </body>
</html> </html>

View file

@ -0,0 +1,13 @@
{{ define "main" }}
{{ partial "page-title.html" . }}
<section class="page-wrapper">
<div class="container">
<div class="row">
<div class="col-md-12">
{{ .Content }}
</div>
</div>
</div>
</section>
{{ end }}

View file

@ -1,6 +1,8 @@
{{ define "main" }} {{ define "main" }}
{{ partial "breadcrumbs.html" . }}
{{ partial "page-title.html" . }} {{ partial "page-title.html" . }}
{{/* ==== BILDER SAMMELN (Front-Matter oder Auto-Discovery) ==== */}} {{/* ==== BILDER SAMMELN (Front-Matter oder Auto-Discovery) ==== */}}
{{ $photos := .Params.images }} {{ $photos := .Params.images }}
{{ if not $photos }} {{ if not $photos }}
@ -111,9 +113,9 @@
{{ with $heroPhoto }} {{ with $heroPhoto }}
<figure class="service-hero__media"> <figure class="service-hero__media">
<img src='{{ .src | default . | relURL }}' <img src='{{ .src | default . | relURL }}'
alt='{{ .alt | default $.Title }}' alt='{{ .alt | default $.Title }}'
width="1200" height="800" width="1200" height="800"
loading="eager" decoding="async" class="img-fluid"> loading="eager" decoding="async" fetchpriority="high" class="img-fluid">
</figure> </figure>
{{ end }} {{ end }}
</div> </div>
@ -430,7 +432,7 @@
{{ $totalFeatures := len $features }} {{ $totalFeatures := len $features }}
<div class="sf-carousel" id="sfCarousel"> <div class="sf-carousel" id="sfCarousel">
<h2 class="sf-title">Unsere Leistungen</h2> <h3 class="sf-title">Unsere Leistungen</h3>
<button class="sf-arrow prev" aria-label="Vorherige Leistung"> <button class="sf-arrow prev" aria-label="Vorherige Leistung">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"> <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
@ -677,7 +679,7 @@
<!-- Text links --> <!-- Text links -->
<div class="col-lg-6" data-reveal> <div class="col-lg-6" data-reveal>
<h2 class="mb-3">Ergebnis & Mehrwert</h2> <h3 class="mb-3">Ergebnis & Mehrwert</h3>
<ul class="checklist"> <ul class="checklist">
{{ range . }} {{ range . }}
<li data-reveal> <li data-reveal>
@ -713,6 +715,8 @@
</section> </section>
{{ end }} {{ end }}
{{ partial "related.html" . }}
<!-- ========================= <!-- =========================
CTA (animierter Hintergrund wie auf Index), CTA (animierter Hintergrund wie auf Index),
@ -755,13 +759,13 @@
<div class="cta__social"> <div class="cta__social">
<a class="cta__social-link" href="https://www.instagram.com/amperion.at/" target="_blank" rel="noopener" aria-label="Instagram"> <a class="cta__social-link" href="https://www.instagram.com/amperion.at/" target="_blank" rel="noopener" aria-label="Instagram">
<img src="/images/social/instagram.svg" alt=""> <img src="/images/social/instagram.svg" alt="" role="presentation" aria-hidden="true">
</a> </a>
<a class="cta__social-link" href="https://www.linkedin.com/company/amperion-gmbh/" target="_blank" rel="noopener" aria-label="LinkedIn"> <a class="cta__social-link" href="https://www.linkedin.com/company/amperion-gmbh/" target="_blank" rel="noopener" aria-label="LinkedIn">
<img src="/images/social/linkedin.svg" alt=""> <img src="/images/social/linkedin.svg" alt="" role="presentation" aria-hidden="true">
</a> </a>
<a class="cta__social-link" href="https://www.facebook.com/share/1CZ7xm6cdw/?mibextid=wwXIfr" target="_blank" rel="noopener" aria-label="Facebook"> <a class="cta__social-link" href="https://www.facebook.com/share/1CZ7xm6cdw/?mibextid=wwXIfr" target="_blank" rel="noopener" aria-label="Facebook">
<img src="/images/social/facebook.svg" alt=""> <img src="/images/social/facebook.svg" alt="" role="presentation" aria-hidden="true">
</a> </a>
</div> </div>
</div> </div>

View file

@ -1,5 +1,5 @@
{{ define "main" }} {{ define "main" }}
{{ partial "breadcrumbs.html" . }}
{{ partial "page-title.html" . }} {{ partial "page-title.html" . }}
<!-- checking blog --> <!-- checking blog -->
@ -9,17 +9,29 @@
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
{{ $paginator := .Paginate .Data.Pages -}} {{ $paginator := .Paginate .Data.Pages -}}
{{ range $paginator.Pages -}} {{ range $paginator.Pages -}}
<div class="post"> <article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<div class="post-media post-thumb"> <div class="post-media post-thumb">
{{ if isset .Params "image" -}} {{ with .Params.image -}}
<a href="{{ .RelPermalink }}"> <a href="{{ $.RelPermalink }}" rel="bookmark">
<img src="{{ .Params.image | relURL }}" alt="{{ .Title }}"> {{ partial "img.html" (dict
"src" .
"alt" $.Title
"class" "img-responsive"
"loading" "lazy"
"page" $
) }}
</a> </a>
{{- end }} {{- end }}
</div> </div>
<h3 class="post-title"><a href="{{ .RelPermalink }}">{{ .Title }}</a></h3>
<h3 class="post-title" itemprop="headline">
<a href="{{ .RelPermalink }}" rel="bookmark">{{ .Title }}</a>
</h3>
<div class="post-meta"> <div class="post-meta">
<ul> <ul>
<li><i class="fas fa-calendar-week"></i> {{ time.Format ":date_long" .PublishDate }}</li> <li><i class="fas fa-calendar-week"></i> {{ time.Format ":date_long" .PublishDate }}</li>
@ -33,11 +45,12 @@
</li> </li>
</ul> </ul>
</div> </div>
<div class="post-content"> <div class="post-content">
<p>{{ .Summary }}</p> <p itemprop="description">{{ .Summary }}</p>
<a href="{{ .RelPermalink }}" class="btn btn-main">{{ i18n "read_more" }}</a> <a href="{{ .RelPermalink }}" class="btn btn-main" rel="bookmark">{{ i18n "read_more" }}</a>
</div> </div>
</div> </article>
{{- end }} {{- end }}
<!-- pagination --> <!-- pagination -->
@ -47,61 +60,55 @@
{{ $lower_limit := (add $adjacent_links 1) -}} {{ $lower_limit := (add $adjacent_links 1) -}}
{{ $upper_limit := (sub $paginator.TotalPages $adjacent_links) -}} {{ $upper_limit := (sub $paginator.TotalPages $adjacent_links) -}}
{{ if gt $paginator.TotalPages 1 -}} {{ if gt $paginator.TotalPages 1 -}}
<nav class="text-center"> <nav class="text-center" aria-label="Blog pagination">
<ul class="pagination post-pagination"> <ul class="pagination post-pagination">
<!-- Previous page. --> <!-- Previous page. -->
{{ if $paginator.HasPrev -}} {{ if $paginator.HasPrev -}}
<li> <li>
<a href="{{ $paginator.Prev.URL }}" class="page-link">{{ i18n "page_prev" }}</a> <a href="{{ $paginator.Prev.URL }}" class="page-link" rel="prev">{{ i18n "page_prev" }}</a>
</li> </li>
{{- end }} {{- end }}
<!-- Page numbers. --> <!-- Page numbers. -->
{{ range $paginator.Pagers -}} {{ range $paginator.Pagers -}}
{{ $page_number_flag := false -}} {{ $page_number_flag := false -}}
<!-- Advanced page numbers. --> {{ if gt $paginator.TotalPages $max_links -}}
{{ if gt $paginator.TotalPages $max_links -}} {{ if le $paginator.PageNumber $lower_limit -}}
<!-- Lower limit pages. --> {{ if le .PageNumber $max_links -}}
<!-- If the user is on a page which is in the lower limit. --> {{ $page_number_flag = true -}}
{{ if le $paginator.PageNumber $lower_limit -}} {{ end -}}
<!-- If the current loop page is less than max_links. --> {{ else if ge $paginator.PageNumber $upper_limit -}}
{{ if le .PageNumber $max_links -}} {{ if gt .PageNumber (sub $paginator.TotalPages $max_links) -}}
{{ $page_number_flag = true -}} {{ $page_number_flag = true -}}
{{ end -}} {{ end -}}
<!-- Upper limit pages. --> {{ else -}}
<!-- If the user is on a page which is in the upper limit. --> {{ if and (ge .PageNumber (sub $paginator.PageNumber $adjacent_links)) (le .PageNumber (add $paginator.PageNumber $adjacent_links)) -}}
{{ else if ge $paginator.PageNumber $upper_limit -}} {{ $page_number_flag = true -}}
<!-- If the current loop page is greater than total pages minus $max_links --> {{ end -}}
{{ if gt .PageNumber (sub $paginator.TotalPages $max_links) -}} {{ end -}}
{{ $page_number_flag = true -}} {{ else -}}
{{ end -}} {{ $page_number_flag = true -}}
<!-- Middle pages. --> {{ end -}}
{{ else -}}
{{ if and (ge .PageNumber (sub $paginator.PageNumber $adjacent_links)) (le .PageNumber (add $paginator.PageNumber $adjacent_links)) -}} {{ if eq $page_number_flag true -}}
{{ $page_number_flag = true -}} <li class="{{ if eq . $paginator }} active {{ end }}">
{{ end -}} <a href="{{ .URL }}" {{ if eq . $paginator }}aria-current="page"{{ end }}>
{{ end -}} {{ .PageNumber }}
<!-- Simple page numbers. --> </a>
{{ else -}} </li>
{{ $page_number_flag = true -}} {{- end }}
{{ end -}}
<!-- Output page numbers. -->
{{ if eq $page_number_flag true -}}
<li class="{{ if eq . $paginator }} active {{ end }}">
<a href="{{ .URL }}">
{{ .PageNumber }}
</a>
</li>
{{- end }}
{{- end }} {{- end }}
<!-- Next page. --> <!-- Next page. -->
{{ if $paginator.HasNext -}} {{ if $paginator.HasNext -}}
<li> <li>
<a href="{{ $paginator.Next.URL }}">{{ i18n "page_next" }}</a> <a href="{{ $paginator.Next.URL }}" rel="next">{{ i18n "page_next" }}</a>
</li> </li>
{{- end }} {{- end }}
</ul> </ul>
</nav> </nav>
{{- end }} {{- end }}
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
{{ partial "blog-sidebar.html" . }} {{ partial "blog-sidebar.html" . }}
@ -112,7 +119,7 @@
<!-- regular page --> <!-- regular page -->
{{ else -}} {{ else -}}
{{ .Render "default" }} {{ .Render "default" }}
{{- end }} {{- end }}
<!-- /regular page --> <!-- /regular page -->

View file

@ -1,7 +1,8 @@
{{ define "main" }} {{ define "main" }}
{{ partial "breadcrumbs.html" . }}
{{ partial "page-title.html" . }} {{ partial "page-title.html" . }}
<!-- checking blog --> <!-- checking blog -->
{{ if or (eq .Section "post") (eq .Section "posts") (eq .Section "blog") (eq .Section "blogs") (eq .Section "news") (eq .Section "categories") (eq .Section "tags") }} {{ if or (eq .Section "post") (eq .Section "posts") (eq .Section "blog") (eq .Section "blogs") (eq .Section "news") (eq .Section "categories") (eq .Section "tags") }}
@ -26,12 +27,25 @@
</div> </div>
<div class="post-thumb"> <div class="post-thumb">
{{ with .Params.image -}} {{ with .Params.image -}}
<img class="img-responsive" src="{{ . | relURL }}" alt="{{ $.Title }}"> {{ $img := . }}
{{- end }} {{ $static := printf "static/%s" (strings.TrimLeft "/" $img) }}
{{ $w := 0 }}{{ $h := 0 }}
{{ if fileExists $static }}
{{ with (imageConfig $static) }}{{ $w = .Width }}{{ $h = .Height }}{{ end }}
{{ end }}
<img class="img-responsive"
src="{{ $img | relURL }}"
alt="{{ $.Title | plainify }}"
loading="lazy"
decoding="async"
{{ if gt $w 0 }}width="{{ $w }}"{{ end }}
{{ if gt $h 0 }}height="{{ $h }}"{{ end }}>
{{- end }}
</div> </div>
<div class="post-content post-excerpt"> <div class="post-content post-excerpt">
{{ .Content }} {{ .Content }}
</div> </div>
{{ partial "related.html" . }}
{{ with site.Params.DisqusShortname -}} {{ with site.Params.DisqusShortname -}}
<div class="post-comments"> <div class="post-comments">
{{ template "_internal/disqus.html" . }} {{ template "_internal/disqus.html" . }}

View file

@ -6,6 +6,7 @@
<section id="hero" class="slider {{ if .bg_overlay }}overly{{ end }} gif-background" <section id="hero" class="slider {{ if .bg_overlay }}overly{{ end }} gif-background"
style="min-height: 100vh; display: flex; align-items: center; justify-content: center; position: relative;"> style="min-height: 100vh; display: flex; align-items: center; justify-content: center; position: relative;">
<div class="my-container" style="position: relative; z-index: 2;"> <div class="my-container" style="position: relative; z-index: 2;">
<!-- Logo-Zeile mit zwei Frames --> <!-- Logo-Zeile mit zwei Frames -->
<div class="logo-container"> <div class="logo-container">
@ -20,7 +21,7 @@
<!-- Haupttitel + Button --> <!-- Haupttitel + Button -->
<div class="hero-section" style="margin-top: 10rem;"> <div class="hero-section" style="margin-top: 10rem;">
{{ with .title }} {{ with .title }}
<h2 class="hero-title fade-in-title">{{ . | markdownify }}</h2> <h1 class="hero-title fade-in-title" itemprop="headline">{{ . | markdownify }}</h1>
{{ end }} {{ end }}
{{ with .button }} {{ with .button }}
{{ if .enable }} {{ if .enable }}
@ -136,6 +137,7 @@ document.addEventListener('DOMContentLoaded', function () {
</div> </div>
</section> </section>
<!-- DARUM AMPERION --> <!-- DARUM AMPERION -->
<section class="whyamperion section"> <section class="whyamperion section">
<div class="container my-container"> <div class="container my-container">
@ -314,13 +316,13 @@ document.addEventListener('DOMContentLoaded', function () {
<div class="cta__social"> <div class="cta__social">
<a class="cta__social-link" href="https://www.instagram.com/amperion.at/" target="_blank" rel="noopener" aria-label="Instagram"> <a class="cta__social-link" href="https://www.instagram.com/amperion.at/" target="_blank" rel="noopener" aria-label="Instagram">
<img src="/images/social/instagram.svg" alt=""> <img src="/images/social/instagram.svg" alt="" role="presentation" aria-hidden="true">
</a> </a>
<a class="cta__social-link" href="https://www.linkedin.com/company/amperion-gmbh/" target="_blank" rel="noopener" aria-label="LinkedIn"> <a class="cta__social-link" href="https://www.linkedin.com/company/amperion-gmbh/" target="_blank" rel="noopener" aria-label="LinkedIn">
<img src="/images/social/linkedin.svg" alt=""> <img src="/images/social/linkedin.svg" alt="" role="presentation" aria-hidden="true">
</a> </a>
<a class="cta__social-link" href="https://www.facebook.com/share/1CZ7xm6cdw/?mibextid=wwXIfr" target="_blank" rel="noopener" aria-label="Facebook"> <a class="cta__social-link" href="https://www.facebook.com/share/1CZ7xm6cdw/?mibextid=wwXIfr" target="_blank" rel="noopener" aria-label="Facebook">
<img src="/images/social/facebook.svg" alt=""> <img src="/images/social/facebook.svg" alt="" role="presentation" aria-hidden="true">
</a> </a>
</div> </div>
</div> </div>

View file

@ -0,0 +1,86 @@
{{/* Breadcrumbs mit Microdata + JSON-LD
- Zeigt nichts auf der Startseite
- Crumbs: Startseite → (Sektion/Kategorie) → Aktuelle Seite
- Sektionen werden auf DACH-taugliche Labels gemappt
*/}}
{{ if not .IsHome }}
{{/* ------- Hilfsfunktionen/Labels ------- */}}
{{ $section := .Section | default "" }}
{{ $sectionLabel := "" }}
{{ if eq $section "leistungen" }}{{ $sectionLabel = "Leistungen" }}
{{ else if or (eq $section "post") (eq $section "posts") (eq $section "blog") (eq $section "blogs") (eq $section "news") }}{{ $sectionLabel = "Wissen" }}
{{ else if or (eq $section "fokusthemen") (eq $section "themen") }}{{ $sectionLabel = "Fokusthemen" }}
{{ else if eq $section "referenzen" }}{{ $sectionLabel = "Referenzen" }}
{{ else if .CurrentSection }}{{ $sectionLabel = .CurrentSection.Title }}
{{ end }}
{{ $crumbs := slice (dict "name" "Startseite" "url" ("/" | relURL)) }}
{{/* Sektion (falls vorhanden) */}}
{{ if $sectionLabel }}
{{ $secURL := cond .CurrentSection ( .CurrentSection.RelPermalink ) (printf "/%s/" $section | relURL) }}
{{ $crumbs = $crumbs | append (dict "name" $sectionLabel "url" $secURL ) }}
{{ end }}
{{/* Optional: erste Kategorie als weiterer Crumb (außer sie wäre ident mit Sektion) */}}
{{ $cat := index .Params.categories 0 }}
{{ if and $cat (ne (lower $cat) (lower $sectionLabel)) }}
{{ $catPage := site.GetPage (printf "/categories/%s" (urlize $cat)) }}
{{ $catURL := cond $catPage $catPage.RelPermalink (printf "/categories/%s/" (urlize $cat) | relURL) }}
{{ $crumbs = $crumbs | append (dict "name" $cat "url" $catURL ) }}
{{ end }}
{{/* Aktuelle Seite */}}
{{ $crumbs = $crumbs | append (dict "name" .Title "url" .RelPermalink) }}
<nav class="breadcrumbs container" aria-label="Brotkrumen" itemscope itemtype="https://schema.org/BreadcrumbList">
<ol>
{{ range $i, $c := $crumbs }}
{{ $pos := add $i 1 }}
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
{{ if lt $i (sub (len $crumbs) 1) }}
<a itemprop="item" href="{{ $c.url }}">
<span itemprop="name">{{ $c.name }}</span>
</a>
{{ else }}
<span itemprop="name" aria-current="page">{{ $c.name }}</span>
{{ end }}
<meta itemprop="position" content="{{ $pos }}" />
</li>
{{ end }}
</ol>
</nav>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{{- range $i, $c := $crumbs -}}
{{- if $i }},{{ end -}}
{
"@type": "ListItem",
"position": {{ add $i 1 }},
"name": {{ $c.name | jsonify }},
"item": {{ (absURL $c.url) | jsonify }}
}
{{- end -}}
]
}
</script>
<style>
/* Minimal-Styles; kollidiert nicht mit deinem Theme */
.breadcrumbs { font-size:.875rem; margin: 8px auto 0; }
.breadcrumbs ol { list-style:none; padding:0; margin:0; display:flex; flex-wrap:wrap; gap:.35rem; align-items:center }
.breadcrumbs li { color:#6b7280 } /* neutral-500 */
.breadcrumbs a { color:inherit; text-decoration:none }
.breadcrumbs a:hover { text-decoration:underline }
.breadcrumbs li::after { content:"/"; margin:0 .35rem; opacity:.5 }
.breadcrumbs li:last-child::after { content:"" }
@media (max-width: 768px) { .breadcrumbs { padding:0 16px } }
</style>
{{ end }}

View file

@ -1,87 +1,122 @@
{{ partial "seo.html" . }} {{ partial "seo.html" . }}
<meta charset="utf-8"> <meta charset="utf-8">
<title>{{.Title | default site.Title}}</title>
<!-- base url --> <title>
{{- if .IsHome -}}
Ingenieurbüro für PV, Speicher & Ladeinfrastruktur | AMPERION
{{- else -}}
{{- with .Params.meta_title -}}
{{ . }}
{{- else -}}
{{ .Title }} | AMPERION
{{- end -}}
{{- end -}}
</title>
<!-- base url (vom Theme genutzt, belassen) -->
{{ if or (eq site.BaseURL "/") (eq site.BaseURL "http://localhost:1313/") (eq site.BaseURL "http://examplesite.org/") (eq site.BaseURL "https://examplesite.org/") (eq site.BaseURL "http://examplesite.com/") (eq site.BaseURL "https://examplesite.com/")}}{{else}} {{ if or (eq site.BaseURL "/") (eq site.BaseURL "http://localhost:1313/") (eq site.BaseURL "http://examplesite.org/") (eq site.BaseURL "https://examplesite.org/") (eq site.BaseURL "http://examplesite.com/") (eq site.BaseURL "https://examplesite.com/")}}{{else}}
<base href="{{ .Permalink }}"> <base href="{{ .Permalink }}">
{{ end }} {{ end }}
<!-- multilingual SEO optimizations --> <!-- Canonical + self-referential hreflang -->
{{ if .IsTranslated }} <link rel="canonical" href="{{ .Permalink }}">
{{ range .AllTranslations }} <link rel="alternate" hreflang="{{ site.LanguageCode | default `de-AT` }}" href="{{ .Permalink }}">
<link rel="alternate" hreflang="{{.Lang}}" href="{{ .RelPermalink | absLangURL }}"> {{ if not .IsTranslated }}
{{ end }} <link rel="alternate" hreflang="x-default" href="{{ .Permalink }}">
<link rel="alternate" hreflang="x-default" href="{{ .RelPermalink | absLangURL }}">
{{ end }} {{ end }}
<!-- mobile responsive meta --> <!-- Multilingual alternates -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"> {{ if .IsTranslated }}
<meta name="description" content="{{ .Params.Description | default site.Params.description }}"> {{ range .AllTranslations }}
{{ with site.Params.author }} <link rel="alternate" hreflang="{{ .Lang }}" href="{{ .RelPermalink | absLangURL }}">
<meta name="author" content="{{ . }}">{{ end }} {{ end }}
<link rel="alternate" hreflang="x-default" href="{{ .RelPermalink | absLangURL }}">
{{ end }}
<!-- Viewport: nur EIN Tag -->
<meta name="viewport" content="width=device-width, initial-scale=1">
{{ with site.Params.author }}<meta name="author" content="{{ . }}">{{ end }}
{{ hugo.Generator }} {{ hugo.Generator }}
<!-- theme meta --> <!-- Optional: manuelles Preload von Bildern pro Seite -->
{{ with .Params.preload_images }}
{{ range . }}
<link rel="preload" as="image" href="{{ . | relURL }}">
{{ end }}
{{ end }}
{{ with .Params.robots }}<meta name="robots" content="{{ . }}">{{ end }}
<!-- Theme / Manifest / Favicons -->
<meta name="theme-name" content="airspace-hugo" /> <meta name="theme-name" content="airspace-hugo" />
<!-- favicon --> {{ $favicon := site.Params.favicon }}
{{ $favicon:= site.Params.favicon }}
{{ if $favicon }} {{ if $favicon }}
{{ if fileExists (add `assets/` $favicon) }} {{ if fileExists (add `assets/` $favicon) }}
{{ $favicon:= resources.Get $favicon }} {{ $fav := resources.Get $favicon }}
{{ $favicon_16:= $favicon.Resize "16x png"}} {{ $f16 := $fav.Resize "16x png" }}
{{ $favicon_32:= $favicon.Resize "32x png"}} {{ $f32 := $fav.Resize "32x png" }}
{{ $favicon_180:= $favicon.Resize "180x png"}} {{ $f180 := $fav.Resize "180x png" }}
<link rel="shortcut icon" href="{{$favicon_32.RelPermalink}}" type="image/x-icon"> <link rel="shortcut icon" href="{{ $f32.RelPermalink }}" type="image/x-icon">
<link rel="icon" href="{{$favicon_32.RelPermalink}}" type="image/x-icon"> <link rel="icon" href="{{ $f32.RelPermalink }}" type="image/x-icon">
<link rel="icon" type="image/png" sizes="16x16" href="{{$favicon_16.RelPermalink}}"> <link rel="icon" type="image/png" sizes="16x16" href="{{ $f16.RelPermalink }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{$favicon_32.RelPermalink}}"> <link rel="icon" type="image/png" sizes="32x32" href="{{ $f32.RelPermalink }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{$favicon_180.RelPermalink}}"> <link rel="apple-touch-icon" sizes="180x180" href="{{ $f180.RelPermalink }}">
{{ end }}
{{ end }} {{ end }}
{{ end }} <link rel="manifest" href="{{ `manifest.webmanifest` | relLangURL }}">
<link rel="manifest" href="{{`manifest.webmanifest` | relLangURL }}"> <meta name="msapplication-TileColor" content="{{ site.Params.variables.color_primary | default `#da532c` }}">
<meta name="msapplication-TileColor" content="{{site.Params.variables.color_primary | default `#da532c`}}"> <meta name="theme-color" content="{{ site.Params.variables.body_color | default `#ffffff` }}">
<meta name="theme-color" content="{{site.Params.variables.body_color | default `#ffffff` }}">
<!-- Open Graph image and Twitter Card meta-data --> <!-- OG/Twitter: Bild + Maße + Card (einheitlich, ohne Duplikate) -->
{{ $image_path := .Params.image | default site.Params.image }} {{ $image_path := .Params.image | default site.Params.image }}
{{ $image_path_local := printf "assets/%s" $image_path }} {{ $image_path_local := printf "assets/%s" $image_path }}
{{ $image_ext := trim (path.Ext $image_path | lower) "." }} {{ $image_ext := trim (path.Ext $image_path | lower) "." }}
{{/* Titel & Beschreibung für OG/Twitter */}}
{{ $ogt := cond .IsHome "Ingenieurbüro für PV, Speicher & Ladeinfrastruktur | AMPERION" (cond .Params.meta_title .Params.meta_title (printf "%s | AMPERION" .Title)) }}
{{ $desc := .Params.meta_description | default site.Params.description }}
{{ $isArticle := in (slice "post" "posts" "blog" "blogs" "news") .Section }}
<meta property="og:type" content="{{ if $isArticle }}article{{ else }}website{{ end }}">
<meta property="og:url" content="{{ .Permalink }}">
<meta property="og:title" content="{{ $ogt }}">
{{ with $desc }}<meta property="og:description" content="{{ . | plainify }}">{{ end }}
{{ if fileExists $image_path_local }} {{ if fileExists $image_path_local }}
<meta property="og:image" content="{{ $image_path | absURL }}" /> <meta property="og:image" content="{{ $image_path | absURL }}">
<!-- If not SVG, read image aspect ratio and define Twitter Card and Open Graph width and height --> {{ if ne $image_ext "svg" }}
{{ if ne $image_ext "svg" }} {{ with (imageConfig $image_path_local) }}
{{ with (imageConfig $image_path_local) }} {{ if (and (gt .Width 144) (gt .Height 144)) }}
{{ if (and (gt .Width 144) (gt .Height 144)) }} <meta name="twitter:image" content="{{ $image_path | absURL }}">
<meta name="twitter:image" content="{{ $image_path | absURL }}" /> {{ end }}
<meta name="twitter:card" <meta property="og:image:width" content="{{ .Width }}">
content="summary{{ if (and (gt .Width 300) (gt .Height 157) (not (eq .Width .Height))) }}_large_image{{ end }}"> <meta property="og:image:height" content="{{ .Height }}">
{{ end }} {{ end }}
<meta property="og:image:width" content="{{ .Width }}"> {{ end }}
<meta property="og:image:height" content="{{ .Height }}">
{{ end }}
{{ end }} {{ end }}
{{ end }} <meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ $ogt }}">
{{ with $desc }}<meta name="twitter:description" content="{{ . | plainify }}">{{ end }}
{{ template "_internal/opengraph.html" . }} <!-- AOS CSS + Bootstrap (defer) -->
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css">
<!-- AOS Animation CSS -->
<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" defer></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" defer></script>
<!-- Hugo SCSS Pipeline mit Template-Parsing --> <!-- Styles: werden über partial "style.html" eingebunden (nicht hier erneut) -->
{{- $scss := resources.Get "scss/style.scss" | resources.ExecuteAsTemplate "scss/style.scss" . | toCSS (dict "targetPath" "css/style.css") | minify -}}
<link rel="stylesheet" href="{{ $scss.RelPermalink }}">
<!-- Strukturierte Daten: Organization -->
{{ if templates.Exists "partials/ld-org.html" }}
{{ partial "ld-org.html" . }}
{{ end }}
<!-- Matomo --> <!-- Matomo -->
<script> <script>
var _paq = window._paq = window._paq || []; var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']); _paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']); _paq.push(['enableLinkTracking']);
(function() { (function() {
@ -92,4 +127,4 @@
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})(); })();
</script> </script>
<!-- End Matomo Code --> <!-- End Matomo -->

26
layouts/partials/img.html Normal file
View file

@ -0,0 +1,26 @@
{{/* Re-usable image partial with alt + size fallback
Usage:
{{ partial "img.html" (dict "src" "/images/foo.webp" "alt" "Kurzbeschreibung" "class" "img-fluid" "loading" "lazy" "page" .) }}
*/}}
{{- $src := .src -}}
{{- $alt := .alt | default .page.Title -}}
{{- $class := .class -}}
{{- $loading := .loading | default "lazy" -}}
{{- $w := 0 -}}
{{- $h := 0 -}}
{{- $static := printf "static/%s" (strings.TrimLeft "/" $src) -}}
{{- if fileExists $static -}}
{{- with (imageConfig $static) -}}
{{- $w = .Width -}}
{{- $h = .Height -}}
{{- end -}}
{{- end -}}
<img src="{{ $src | relURL }}"
alt="{{ $alt | plainify }}"
loading="{{ $loading }}"
decoding="async"
{{ if gt $w 0 }}width="{{ $w }}"{{ end }}
{{ if gt $h 0 }}height="{{ $h }}"{{ end }}
class="{{ $class }}">

View file

@ -0,0 +1,26 @@
{{- /* Organization JSON-LD — robust, nur Felder ausgeben, die vorhanden sind */ -}}
{{- $logo := site.Params.logo | default site.Params.favicon | default site.Params.image | default "images/logo.webp" -}}
{{- $email := site.Params.email | default "" -}}
{{- $phone := site.Params.phone1 | default site.Params.phone | default "" -}}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "AMPERION GmbH",
"url": {{ "/" | absURL | jsonify }},
"logo": {{ ($logo | relURL | absURL) | jsonify }},
"sameAs": [
"https://www.linkedin.com/company/amperion-gmbh/",
"https://www.instagram.com/amperion.at/",
"https://www.facebook.com/share/1CZ7xm6cdw/?mibextid=wwXIfr"
]{{ if or $email $phone }},
"contactPoint": [{
"@type": "ContactPoint",
"contactType": "customer service"{{ if $phone }},
"telephone": {{ $phone | jsonify }}{{ end }}{{ if $email }},
"email": {{ $email | jsonify }}{{ end }},
"areaServed": "AT"
}]{{ end }}
}
</script>

View file

@ -80,16 +80,15 @@
</div> </div>
</div> </div>
<!-- Content --> <!-- Content -->
{{/* SEO: H1 steuerbar via .Params.h1, Fallback .Title; KEIN Untertitel mehr */}}
{{ $h1 := .Params.h1 | default .Title }}
<div class="container1"> <div class="container1">
<div class="row"> <div class="row">
<div class="col-md-12 text-center"> <div class="col-md-12 text-center">
<div class="service-title"> <div class="service-title">
<h1 class="title-electric">{{ .Title }}</h1> <h1 class="title-electric" itemprop="headline" data-text="{{ $h1 }}">{{ $h1 }}</h1>
</div> </div>
{{ with .Params.description }}
<p class="page-title-desc">{{ . }}</p>
{{ end }}
</div> </div>
</div> </div>
</div> </div>
@ -539,4 +538,4 @@
opacity: 0.5; opacity: 0.5;
} }
} }
</style> </style>

View file

@ -0,0 +1,169 @@
{{/* related.html (Enhanced UI + robust image fallback) */}}
{{ if not .IsHome }}
{{ $page := . }}
{{ $max := .Params.related_max | default 4 }}
{{ $tags := .Params.tags | default (slice) }}
{{ $exclude := .Params.related_exclude | default (slice) }}
{{ $manual := .Params.related_manual | default (slice) }}
{{ $pages := slice }}
{{/* Manuelle Auswahl? */}}
{{ if gt (len $manual) 0 }}
{{ range $manual }}
{{ $p := site.GetPage . }}
{{ if not $p }}{{ $p = site.GetPage (printf "/%s" (strings.TrimPrefix "/" .)) }}{{ end }}
{{ if $p }}{{ $pages = $pages | append $p }}{{ end }}
{{ end }}
{{ $pages = first $max $pages }}
{{ else }}
{{/* Automatisch */}}
{{ $recs := slice }}
{{ range site.RegularPages }}
{{ if or
(eq .RelPermalink $page.RelPermalink)
(in (slice "impressum" "datenschutz" "agb" "privacy") .Section)
(in $exclude .RelPermalink)
(in $exclude .File.TranslationBaseName)
}}
{{/* skip */}}
{{ else }}
{{ $candTags := .Params.tags | default (slice) }}
{{ $tagScore := len (intersect $candTags $tags) }}
{{/* Sektion-Priorität */}}
{{ $secScore := 0 }}
{{ if eq $page.Section "leistungen" }}
{{ if or (eq .Section "fokusthemen") (in (slice "post" "posts" "blog" "blogs" "news") .Section) }}{{ $secScore = 1 }}{{ end }}
{{ else if or (eq $page.Section "fokusthemen") (eq $page.Section "themen") }}
{{ if or (eq .Section "leistungen") (in (slice "post" "posts" "blog" "blogs" "news") .Section) }}{{ $secScore = 1 }}{{ end }}
{{ else if in (slice "post" "posts" "blog" "blogs" "news") $page.Section }}
{{ if or (eq .Section "leistungen") (eq .Section "fokusthemen") (eq .Section "themen") }}{{ $secScore = 1 }}{{ end }}
{{ end }}
{{ $score := add (mul $tagScore 10) $secScore }}
{{ if gt $score 0 }}
{{ $recs = $recs | append (dict "p" . "s" $score "d" .Date) }}
{{ end }}
{{ end }}
{{ end }}
{{ $recs = sort $recs "s" "desc" "d" "desc" }}
{{ range first $max $recs }}
{{ $pages = $pages | append .p }}
{{ end }}
{{ end }}
{{ if gt (len $pages) 0 }}
<section class="related section" aria-label="Verwandte Inhalte">
<div class="container my-container">
<h3 class="related-title">Verwandte Inhalte</h3>
<div class="related-grid">
{{ range $pages }}
{{/* Sektion-Label */}}
{{ $sec := .Section | default "" }}
{{ $secLabel := "" }}
{{ if eq $sec "leistungen" }}{{ $secLabel = "Leistungen" }}
{{ else if or (eq $sec "fokusthemen") (eq $sec "themen") }}{{ $secLabel = "Fokusthemen" }}
{{ else if or (eq $sec "post") (eq $sec "posts") (eq $sec "blog") (eq $sec "blogs") (eq $sec "news") }}{{ $secLabel = "Wissen" }}
{{ else }}{{ $secLabel = (title $sec) }}{{ end }}
{{/* Robust: Thumb finden (card_image → image → images[0] → Auto-Discovery) */}}
{{ $thumb := .Params.card_image | default .Params.image }}
{{ if not $thumb }}
{{ $imgs := .Params.images }}
{{ if $imgs }}
{{ $first := index $imgs 0 }}
{{ if (reflect.IsMap $first) }}
{{ $thumb = $first.src }}
{{ else }}
{{ $thumb = $first }}
{{ end }}
{{ end }}
{{ end }}
{{ if not $thumb }}
{{ $slug := .Params.slug | default .File.TranslationBaseName }}
{{ $cands := slice
(printf "static/images/%s/%s1.webp" .Section $slug)
(printf "static/images/leistungen/%s1.webp" $slug)
(printf "static/images/fokusthemen/%s1.webp" $slug)
(printf "static/images/%s1.webp" $slug)
}}
{{ range $cands }}
{{ if and (not $thumb) (fileExists .) }}
{{ $thumb = replace . "static" "" }}
{{ end }}
{{ end }}
{{ end }}
<article class="related-item">
<a class="related-link" href="{{ .RelPermalink }}">
<div class="related-thumb-wrap">
{{ if $thumb }}
{{ partial "img.html" (dict
"src" $thumb
"alt" .Title
"class" "related-thumb"
"loading" "lazy"
"page" $
) }}
{{ else }}
<div class="related-thumb related-thumb--placeholder" aria-hidden="true">
<svg viewBox="0 0 24 24" width="48" height="48">
<path d="M21 19V5a2 2 0 0 0-2-2H5C3.9 3 3 3.9 3 5v14c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2ZM8.5 13.5l2.5 3 3.5-4.5 4.5 6H5l3.5-4.5Z" fill="currentColor" opacity=".28"/>
<circle cx="8" cy="8" r="2" fill="currentColor" opacity=".28"/>
</svg>
</div>
{{ end }}
{{ if $secLabel }}<span class="related-badge">{{ $secLabel }}</span>{{ end }}
<span class="related-overlay" aria-hidden="true"></span>
</div>
<h4 class="related-name">{{ .Title }}</h4>
</a>
</article>
{{ end }}
</div>
</div>
<style>
.related-title{ text-align:center; margin:0 0 1.25rem }
.related-grid{ display:grid; gap:16px; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)) }
.related-item{ background:#fff; border-radius:14px; box-shadow:0 2px 12px rgba(0,0,0,.06); overflow:hidden; transition:transform .25s ease, box-shadow .25s ease }
.related-link{ display:block; color:inherit; text-decoration:none; outline:none }
.related-link:focus-visible{ box-shadow:0 0 0 3px rgba(4,110,110,.35) }
.related-thumb-wrap{ position:relative; aspect-ratio:16/9; overflow:hidden; background:#f3f3f3 }
.related-thumb{ width:100%; height:100%; object-fit:cover; display:block; transition:transform .35s ease }
.related-thumb--placeholder{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; color:#9ca3af }
.related-badge{ position:absolute; left:12px; top:12px; padding:6px 10px; font-size:.75rem; border-radius:999px; background:rgba(4,110,110,.92); color:#fff; box-shadow:0 2px 8px rgba(0,0,0,.15) }
.related-overlay{ position:absolute; inset:0; background:linear-gradient(180deg,rgba(0,0,0,0) 55%,rgba(0,0,0,.22)); opacity:0; transition:opacity .25s ease }
.related-item:hover .related-overlay{ opacity:1 }
.related-item:hover{ transform:translateY(-2px); box-shadow:0 10px 28px rgba(0,0,0,.10) }
.related-item:hover .related-thumb{ transform:scale(1.03) }
.related-name{ margin:12px 14px 16px; line-height:1.3 }
@media (max-width:640px){
.related-grid{ gap:12px; grid-template-columns:1fr }
.related-name{ margin:10px 12px 14px }
.related-badge{ left:10px; top:10px; padding:5px 9px }
}
@media (prefers-color-scheme:dark){
.related-item{ background:#023d3d; box-shadow:0 2px 10px rgba(0,0,0,.4) }
.related-thumb--placeholder{ background:#0b0f17; color:#6b7280 }
.related-badge{ background:rgba(245,166,35,.95); color:#111 }
.related-name{ color:#e5e7eb }
}
@media (prefers-reduced-motion:reduce){
.related-item, .related-thumb, .related-overlay{ transition:none !important }
}
</style>
</section>
{{ end }}
{{ end }}

View file

@ -1,39 +1,14 @@
{{- /* layouts/partials/seo.html */ -}} {{- /* layouts/partials/seo.html — minimal & konfliktfrei */ -}}
{{- $siteTitle := site.Title -}}
{{- $sep := " | " -}} {{- $desc := .Params.meta_description
<title> | default .Params.description
{{- if .IsHome -}} | default .Description
AMPERION Ingenieurbüro & Elektrotechnikbetrieb für Erneuerbare Energien | default site.Params.default_meta_description
{{- else -}} | default site.Params.description
{{- .Title }}{{ $sep }}AMPERION Photovoltaik, Energiespeicher, Ladeinfrastruktur | default (plainify (.Summary | default .Content)) -}}
<meta name="description" content="{{ $desc | plainify | truncate 155 }}">
{{- if or .Draft .Params.noindex -}}
<meta name="robots" content="noindex,nofollow">
{{- end -}} {{- end -}}
</title>
{{- $desc := cond (isset .Params "description") .Params.description
"AMPERION ist Ihr staatlich geprüftes Ingenieurbüro & Elektrotechnikbetrieb: Planung, Projektmanagement & Consulting für Photovoltaik, Energiespeicher und Ladeinfrastruktur von der Idee bis zur Inbetriebnahme." -}}
<meta name="description" content="{{ $desc }}">
<link rel="canonical" href="{{ .Permalink }}">
{{- with .AlternativeOutputFormats }}{{ end -}}
{{- /* hreflang (de/en) */ -}}
{{- range .AllTranslations -}}
<link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}">
{{- end -}}
<link rel="alternate" hreflang="x-default" href="{{ .Permalink }}">
<meta name="robots" content="index,follow">
<!-- Open Graph -->
<meta property="og:type" content="{{ if .IsHome }}website{{ else }}article{{ end }}">
<meta property="og:title" content="{{ if .IsHome }}AMPERION Ingenieurbüro & Elektrotechnik{{ else }}{{ .Title }}{{ end }}">
<meta property="og:description" content="{{ $desc }}">
<meta property="og:url" content="{{ .Permalink }}">
{{- $ogimg := (resources.Get "images/og-default.jpg") | default (resources.Get "images/logo.png") -}}
{{- with $ogimg -}}{{ $p := .Fit "1200x630" }}<meta property="og:image" content="{{ $p.RelPermalink }}">{{ end -}}
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{ if .IsHome }}AMPERION Ingenieurbüro & Elektrotechnik{{ else }}{{ .Title }}{{ end }}">
<meta name="twitter:description" content="{{ $desc }}">

View file

@ -1,16 +1,36 @@
<!-- DNS preconnect --> {{- /* Robust CSS loader: externe Links direkt, lokale Ressourcen sammeln, SCSS bauen, dann bündeln */ -}}
<!-- DNS prefetch on -->
<meta http-equiv="x-dns-prefetch-control" content="on"> <meta http-equiv="x-dns-prefetch-control" content="on">
{{- $bundleList := slice -}}
<!-- plugins + stylesheet --> {{- /* 1) Plugins aus params: externe -> <link>, lokale -> sammeln */ -}}
{{ $styles := slice }} {{- $plugins := site.Params.plugins.css | default (slice) -}}
{{ range site.Params.plugins.css }} {{- range $plugins }}
{{ if findRE "^http" .link }} {{- $link := .link | default "" -}}
<link crossorigin="anonymous" media="all" rel="stylesheet" href="{{ .link | relURL }}" {{.attributes | safeHTMLAttr}} > {{- if $link -}}
{{ else }} {{- if findRE `^https?://` $link -}}
{{ $styles = $styles | append (resources.Get .link) }} <link rel="stylesheet" href="{{ $link }}" {{ .attributes | safeHTMLAttr }}>
{{ end }} {{- else -}}
{{ end }} {{- with (resources.Get $link) -}}
{{ $styles := $styles | append (resources.Get "scss/style.scss" | resources.ExecuteAsTemplate "style.scss" . | toCSS) }} {{- $bundleList = $bundleList | append . -}}
{{ $styles := $styles | resources.Concat "/css/style.css" | minify | fingerprint "sha512"}} {{- end -}}
<link rel="stylesheet" href="{{ $styles.Permalink }}"> {{- end -}}
{{- end -}}
{{- end -}}
{{- /* 2) SCSS bauen (falls vorhanden) und hinzufügen */ -}}
{{- with (resources.Get "scss/style.scss") -}}
{{- $css := . | resources.ExecuteAsTemplate "scss/style.scss" $ | toCSS (dict "targetPath" "css/style.css") -}}
{{- $bundleList = $bundleList | append $css -}}
{{- end -}}
{{- /* 3) Bündeln + minify + fingerprint, sofern wir was haben */ -}}
{{- if gt (len $bundleList) 0 -}}
{{- $bundle := $bundleList | resources.Concat "css/bundle.css" | minify | fingerprint "sha512" -}}
<link rel="stylesheet" href="{{ $bundle.RelPermalink }}" integrity="{{ $bundle.Data.Integrity }}">
{{- else -}}
{{- /* Fallback: statische CSS falls vorhanden/gewünscht */ -}}
<link rel="stylesheet" href="{{ "css/style.css" | relURL }}">
{{- end -}}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
{"Target":"css/style.css","MediaType":"text/css","Data":{}}

View file

@ -2,4 +2,3 @@ User-agent: *
Disallow: Disallow:
Sitemap: https://www.amperion.at/sitemap.xml Sitemap: https://www.amperion.at/sitemap.xml
Sitemap: https://www.amperion.at/en/sitemap.xml