Eine großartige Teamkultur, in der sich jeder geschätzt fühlt und gerne arbeitet
Stelle Video-Seitenverhältnisse auf 16:9, 4:3 oder 9:16 ein. Passe diese Einstellungen an deinen Videotyp an für das beste Layout.
Kundengeschichten und Testimonials schaffen sofort Vertrauen, indem sie zeigen, dass dein Unternehmen wirklich funktioniert. Sie sind eine großartige Möglichkeit, deine zufriedenen Kunden für dich sprechen zu lassen!
Artikel: Titel oder kurze Beschreibung Artikel
Wir helfen Unternehmen seit über 1 Jahren zu wachsen.
Wir haben einen Seiten-Baukasten entwickelt, der wirklich für dich arbeitet. Unsere Bereiche und Vorlagen sind von den beliebtesten Websites inspiriert, und wir halten alles aktuell, damit du immer einen Schritt voraus bist.
Dieses Z-Muster-Layout dreht Inhalte horizontal für einen besseren Fluss. Google einfach mal "Z-Muster Webdesign", um mehr Beispiele zu sehen.
Wir helfen Unternehmen seit über 2 Jahren zu wachsen.
Wir haben einen Seiten-Baukasten entwickelt, der wirklich für dich arbeitet. Unsere Bereiche und Vorlagen sind von den beliebtesten Websites inspiriert, und wir halten alles aktuell, damit du immer einen Schritt voraus bist.
Dieses Z-Muster-Layout dreht Inhalte horizontal für einen besseren Fluss. Google einfach mal "Z-Muster Webdesign", um mehr Beispiele zu sehen.
Standort Karlsbad
Telefonnummer
07248/2783299
Standort Stuttgart
Telefonnummer
07248/2783299
Standort Freiburg
Telefonnummer
07248/2783299
© 2025 Sachverständigengesellschaft für urbanes Grün. Alle Rechte vorbehalten.
document.addEventListener('DOMContentLoaded', function() { const baseTitle = document.title; const modal = document.getElementById('post-modal'); const modalArticle= document.getElementById('modal-article'); const modalTitleEl= document.getElementById('modal-title'); const copyBtn = document.getElementById('copylink-btn'); // Artikel-Abschnitt zu Slug finden (über den Anker #post-) function findArticleSectionBySlug(slug){ const anchor = document.getElementById('post-' + slug); if (!anchor) return null; return anchor.closest('section') || anchor.parentElement; } function openPost(slug, push=true){ slug = (slug || '').trim(); const section = findArticleSectionBySlug(slug); if(!section){ console.error('Anker #post-' + slug + ' nicht gefunden (liegt custom-code#1 im Artikel-Abschnitt ganz oben?)'); return; } // Inhalt in Modal kopieren (Meta/Anker entfernen) const clone = section.cloneNode(true); const meta = clone.querySelector('#post-' + slug); if (meta) meta.remove(); modalArticle.innerHTML = clone.innerHTML; // Inline-Styles entschärfen (Breiten-/Spalten-Zwang) modalArticle.querySelectorAll('[style]').forEach(function(el){ el.style.removeProperty('max-width'); el.style.removeProperty('width'); el.style.removeProperty('flex'); el.style.removeProperty('flex-basis'); el.style.removeProperty('float'); }); // Titel aus erster Überschrift const h = section.querySelector('h1, h2, h3'); const hText = h ? h.textContent.trim() : 'Blog'; modalTitleEl.textContent = hText; document.title = hText + ' – ' + baseTitle; // Modal anzeigen + Body-Scroll sperren modal.classList.add('open'); modal.setAttribute('aria-hidden','false'); document.body.classList.add('no-scroll'); // URL teilbar machen if (push) { const u = new URL(window.location); u.searchParams.set('post', slug); u.hash = 'post-' + slug; history.pushState({post: slug}, '', u.toString()); } // Fokus in den Dialog modal.querySelector('.dialog').focus({preventScroll:true}); } function closePost(push=true){ if (!modal.classList.contains('open')) return; modal.classList.remove('open'); modal.setAttribute('aria-hidden','true'); document.body.classList.remove('no-scroll'); // URL zurücksetzen if (push) { const u = new URL(window.location); u.searchParams.delete('post'); u.hash = ''; history.pushState({}, '', u.toString()); } document.title = baseTitle; } // Robuste Clipboard-Funktion (vermeidet "Uncaught (in promise)") async function copyCurrentURL(btn){ const text = window.location.href; try { if (navigator.clipboard && window.isSecureContext) { await navigator.clipboard.writeText(text); } else { throw new Error('Clipboard API nicht verfügbar'); } } catch (err) { // Fallback: temporäres Textfeld const ta = document.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.top = '-1000px'; document.body.appendChild(ta); ta.select(); try { document.execCommand('copy'); } catch(_) {} document.body.removeChild(ta); } finally { if (btn) { const old = btn.textContent; btn.textContent = 'Kopiert!'; setTimeout(() => (btn.textContent = old || 'Link kopieren'), 1200); } } } // Copy-Link-Button copyBtn?.addEventListener('click', (e) => { e.preventDefault(); copyCurrentURL(copyBtn); }); // Klicks auf Links mit ?post= (z. B. Bild im ) document.addEventListener('click', function(e){ const a = e.target.closest('a[href]'); if(!a) return; const url = new URL(a.getAttribute('href'), location.href); const qsSlug = url.searchParams.get('post'); const hash = url.hash || ''; const hashSlug= hash.startsWith('#post-') ? hash.slice(6) : ''; const slug = (qsSlug || hashSlug || '').trim(); if(!slug) return; // kein Blog-Link e.preventDefault(); openPost(slug, true); }); // Optional: Unterstütze auch Elemente mit data-open-post="slug" document.addEventListener('click', function(e){ const opener = e.target.closest('[data-open-post]'); if(!opener) return; e.preventDefault(); const slug = opener.getAttribute('data-open-post'); if (slug) openPost(slug, true); }); document.addEventListener('keydown', function(e){ if (e.key !== 'Enter' && e.key !== ' ') return; const opener = document.activeElement && document.activeElement.closest('[data-open-post]'); if (!opener) return; e.preventDefault(); const slug = opener.getAttribute('data-open-post'); if (slug) openPost(slug, true); }); // Modal schließen (Backdrop, Button, ESC) modal.addEventListener('click', (e)=>{ if (e.target.hasAttribute('data-close')) closePost(true); }); document.addEventListener('keydown', (e)=>{ if (e.key === 'Escape') closePost(true); }); // Direktaufruf: ...?post=artikel const initial = new URLSearchParams(location.search).get('post'); if (initial) openPost(initial, false); // Browser Vor/Zurück window.addEventListener('popstate', ()=>{ const p = new URLSearchParams(location.search).get('post'); if (p) openPost(p, false); else closePost(false); }); });