-
released this
2026-09-16 20:09:15 +00:00 | 86 commits to main since this releaseDer Nach-oben-Knopf tat in Safari nichts – auf dem iPhone wie auf dem Mac. Am Schreibtisch im Chrome ging er.
Woran es lag. Das Sprungziel des Knopfs war ein leerer
<span>am Anfang der Seite. WebKit springt nicht zu einem Ziel, dessen Box inline ist und keine Fläche hat: der Tipp kam an,#seitenanfangstand in der Adresse, und die Seite blieb stehen. Chromium ist toleranter, deshalb fiel es dort nie auf. Nachgestellt in echter Safari-Engine (Playwright-WebKit, iPhone-14-Profil) mit vierzehn Varianten des Ziels: dasselbespanals Block springt, ein leererdivohne Höhe springt – es ist die Inline-Box, nicht die Größe.Was sich ändert. Das Sprungziel bekommt eine Blockbox, eine Regel in
site.css. Die Abschnittsanker der Menüs waren nie betroffen.Zurückgenommen: die Anhebung von Knopf und Cookie-Leiste über Safaris Adressleiste aus 1.21.3. Sie beruhte auf einer falschen Diagnose – der Test dahinter (kein
#…in der Adresszeile) war wertlos, weil Safaris zusammengeschobene Leiste nur die Domain zeigt. Beides steht wieder da, wo es in 1.21.2 stand.Update: Verwaltung → System → Update, oder
install.phpfür eine neue Installation. Nur CSS, kein Datenbank- oder Dokumentformat geändert.WebKit iPhone 14 nach der Änderung: Tipp → 0, Klick → 0, Hash → 0. Chromium unverändert. 51 Tests / 1944 Assertions zu Einwilligung, Stilen und Bündelung grün.
Downloads
-
released this
2026-09-16 19:56:12 +00:00 | 88 commits to main since this releaseDer Nach-oben-Knopf war auf dem iPhone da und tat nichts – auf jeder Seite jeder Installation. Am Schreibtisch funktionierte er tadellos.
Woran es lag. Safari schiebt seine Adressleiste beim Lesen zu einem schmalen Balken zusammen und legt den über den Seiteninhalt. Ein fixiertes Element rechnet sein
bottomaber gegen die volle Ansicht, nicht gegen den freien Teil: der Knopf stand genau in dem Streifen, den der Browser sich selbst genommen hatte. Gezeichnet wurde er, sichtbar war er – nur landete jeder Tipp auf der Leiste. Gemessen bei 390 × 844 px belegt er y 780 bis 828, also die unteren 64 Pixel.Was sich ändert. Die Differenz zwischen großer Ansicht (Leiste zusammengeschoben) und kleiner Ansicht (Leiste ausgefahren) ist genau diese Höhe. Was unten klebt, rechnet sie jetzt dazu. Wo es keine solche Leiste gibt – Schreibtisch, die meisten Android-Browser – ist sie null und nichts verschiebt sich.
Die Cookie-Leiste hatte dieselbe Geometrie, „Annehmen“ und „Ablehnen“ waren also genauso schwer zu treffen. Sie wird gleich mit angehoben – außer wenn sie an der Kante klebt: dort bliebe sonst ein Spalt, durch den die Seite scheint, deshalb wächst stattdessen ihr unterer Innenabstand und die Knöpfe rücken mit hoch.
Update: Verwaltung → System → Update, oder
install.phpfür eine neue Installation. Nur CSS, kein Datenbank- oder Dokumentformat geändert.Geprüft mit einer Testseite, die die Leistenhöhe auf 50 px setzt – der einzige Weg, den Effekt ohne Gerät sichtbar zu machen: der Knopf wandert um genau 50 px hoch, die klebende Leiste behält ihre Kante und ihr Innenabstand geht von 16 auf 66 px. Auf einem echten iPhone ist es nicht gegengeprüft.
Downloads
-
released this
2026-09-16 19:30:27 +00:00 | 90 commits to main since this releaseZwei Kernfehler, beide auf dem Telefon sichtbar, beide in jeder Installation mit schwebendem Kopfbereich.
Das aufgeklappte Menü stand weiß auf weiß. Die Fläche unter dem Kopfbereich malt ihren eigenen weißen Untergrund, holte sich die Schriftfarbe aber vom Kopfbereich. Schwebt der über einem dunklen Bild, schreibt er weiß – und das Menü war unlesbar, bis man weit genug gescrollt hatte. Im Design gibt es Einstellungen für den Menü-Knopf, aber keine für die Fläche; es gab also keinen Weg, das selbst zu beheben. Die Fläche setzt ihre Schriftfarbe jetzt zusammen mit ihrem Untergrund.
Ein Hero-Abschnitt verlor seinen Randabstand. Seit 1.10.0 durfte der Inhaltskasten eines Flex-Abschnitts wachsen, damit ein Abschnitt voller Höhe keinen Streifen in der Mitte zeigt. Wachsen wirkt bei Flex aber in der Laufrichtung, und die ist voreingestellt die Zeile: der Kasten wuchs in die Breite und drückte die Randluft heraus. Am Schreibtisch bremste die Höchstbreite des Designs vorher, auf dem Telefon nicht – dort stand der Text hart an der Kante, während Kopfbereich und alle übrigen Abschnitte ihre 18 px hatten. Gemessen bei 375 px: vorher x 0 bei 375 px Breite, jetzt x 18 bei 339 px, gleichauf mit dem Kopfbereich. Bei 1440 px ändert sich nichts.
Die Vorlage „Vollbild-Hero“ ist gegengeprüft und sieht unverändert aus.
Update: Verwaltung → System → Update, oder
install.phpfür eine neue Installation. Kein Datenbank- oder Dokumentformat geändert.579 PHP-Tests / 4798 Assertions unter 8.4 und 8.2, 35 JavaScript-Modelltests.
Downloads
-
released this
2026-09-16 13:56:25 +00:00 | 92 commits to main since this releaseDie Startseite, mit der eine frische Installation startet, ist jetzt eine Baustellenseite: das KantSites-Zeichen, die Kleinzeile In Arbeit, der Name der Website als Überschrift, darunter „Hier entsteht eine neue Webpräsenz.“ und die Zeile „Erstellt mit KantSites“. Sonst nichts.
Warum: Bisher standen dort zwei Abschnitte mit Arbeitsanweisungen – „Melde dich an, öffne sie im Editor …“ und „Die nächsten Schritte“ mit Design, Menüs und Einstellungen. Das ist aber die einzige Seite, die eine neue Installation öffentlich ausliefert: Gelesen hat es der Besucher, nicht der Betreiber. Für den stehen dieselben Schritte auf dem letzten Installerbildschirm und in der Verwaltung.
Der Abschnitt stellt den Inhalt mittig auf den Bildschirm (
min-height: 70vh, Verlauf von Papier nach Mint). Die Farben sind Palettenverweise und folgen jedem Designwechsel; alles sind gewöhnliche Bausteine und im Editor vollständig änder- oder löschbar. Auch die Seitenbeschreibung ist jetzt ein Satz statt „NOCH AUSZUFÜLLEN“, damit eine neue Website keinen Platzhalter in die Suchergebnisse trägt.Unverändert: Kopf- und Fußbereich, Menüs sowie Impressum und Datenschutzerklärung als Gerüst mit markierten Pflichtangaben.
Bestehende Websites ändern sich durch dieses Update nicht – die Seite entsteht nur bei einer Neuinstallation.
Update: über den Bildschirm „System“ (Git oder Releasearchiv). Das Archiv unten bringt
vendor/mit und braucht kein Composer auf dem Server.Downloads
-
released this
2026-09-16 07:18:34 +00:00 | 94 commits to main since this releaseWie stark die Ecken der Bilder gerundet sind, steht jetzt unter Design → Bildecken und gilt für die ganze Website – Bilder, Galerien, Logoleisten und Beitragslisten. Die Vorgabe bleibt
12px, damit bestehende Websites unverändert aussehen;0pxmacht alle Bilder eckig.Warum das nötig war: Die 12 px standen fest im Stylesheet (
.block-image{border-radius:12px}). Jedes Bild war gerundet, ohne dass ein Feld das gesagt hätte – wer eine Vorlage ohne Rundungen baute, musste den Wert an jedem einzelnen Bild überschreiben. Auf einer Seite, auf der Flächen über dem Bild liegen (ein Verlauf, ein Schild, eine Aufruf-Fläche), sieht man es sofort: Die eckigen Flächen stehen aus der Rundung heraus.Für ein einzelnes Bild gibt es die Einstellung wie bisher im Editor beim ausgewählten Bild unter Design → Bild → Bildecken – je Gerät und je Ecke. Sie gewinnt gegen den Wert der Website.
Update: über den Bildschirm „System“ (Git oder Releasearchiv). Das Archiv unten bringt
vendor/mit und braucht kein Composer auf dem Server.Downloads
-
released this
2026-09-16 07:05:18 +00:00 | 96 commits to main since this releaseNachtrag zu 1.20.1: Dort hieß es,
scripts/repair-doubled-entities.phpräume die doppelt kodierten Texte auf. Der Ordnerscripts/geht aber gar nicht ins Releasearchiv – eine Installation ohne Git hätte das Skript nie gesehen.Deshalb jetzt als Befehl, der mitgeliefert wird:
php bin/console cms:repair:entities # zeigt nur, was sich ändern würde php bin/console cms:repair:entities --schreiben # wendet es anAngefasst werden die veröffentlichte Fassung und der Entwurf jeder Seite sowie die Bereiche; jede Änderung wird so geprüft, wie auch das Speichern prüft. Ältere Fassungen bleiben Historie.
Nach dem Update auf 1.20.1 oder 1.20.2 einmal ausführen – besonders der Entwurf der Startseite ist einen Blick wert. Wer bereits 1.20.1 installiert hat, bekommt mit diesem Update nur den Befehl dazu; am Verhalten der Website ändert sich nichts.
Update: über den Bildschirm „System“ (Git oder Releasearchiv). Das Archiv unten bringt
vendor/mit und braucht kein Composer auf dem Server.Downloads
-
released this
2026-09-16 06:57:26 +00:00 | 98 commits to main since this releaseBehoben: das kaufmännische Und, das bei jedem Speichern wuchs. Ein Text ohne Auszeichnung wurde beim Speichern nur escaped, statt vorher dekodiert zu werden. Was der Editor schickt, ist aber HTML – auch ohne ein einziges Tag. Aus
Freudenstadt & Umgebungwurde deshalb bei jedem Speichern eine Stufe mehr (&amp;,&amp;amp;…), bis die Entity sichtbar auf der Seite stand.Und ein zweiter Fall derselben Art:
nl2br()ließ den Zeilenumbruch hinter dem<br>stehen, und der nächste Durchlauf machte ein zweites<br>daraus – aus einem Absatz wurden zwei. Beide Zweige vonRichText::sanitise()enden jetzt bei derselben Darstellung, und wiederholtes Speichern ändert einen Text nicht mehr.Was bereits falsch gespeichert ist, räumt ein Befehl auf – siehe 1.20.2:
php bin/console cms:repair:entities(ohne Option ein Trockenlauf, mit--schreibenangewandt).Korrektur: Diese Fassung nannte hier ein Skript unter
scripts/. Dieser Ordner geht nicht ins Releasearchiv, das Skript hätte eine Installation ohne Git also nie erreicht. 1.20.2 liefert dieselbe Reparatur als Konsolenbefehl mit – am Verhalten der Website ändert 1.20.2 sonst nichts.Update: über den Bildschirm „System“ (Git oder Releasearchiv). Das Archiv unten bringt
vendor/mit und braucht kein Composer auf dem Server.Downloads
-
released this
2026-09-16 06:27:49 +00:00 | 100 commits to main since this releaseNeu ist der Baustein Eigenes HTML (Werkzeugkasten, Gruppe „Seite und Daten“, Dokumentschema v24): Markup bis 20.000 Zeichen, das unverändert auf der Seite landet – eigene Tabellen, fremde Widgets, Auszeichnungen, die es als Baustein nicht gibt.
Ändern darf ihn nur ein Administrator, genau wie das Feld „Eigenes Skript“; für alle anderen ist er sichtbar und schreibgeschützt, und der Server weist eine Änderung ohnehin ab – beim Speichern, beim Speichern eines Bereichs und beim Zurückholen einer älteren Fassung.
Zwei Tags nimmt er nicht an, statt sie stillschweigend von der Sicherheitsrichtlinie schlucken zu lassen:
<script>gehört unter „Erweitert“ in das Feld „Eigenes Skript“, und ein<iframe>in den Baustein Externer Inhalt – nur der fragt vorher um Einwilligung und trägt den Anbieter inframe-srcein (ADR 106).Zum Einbetten selbst: Am Rahmen lässt sich alles gestalten, was der eigenen Website gehört – Höhe, Abstände, Breite, Rand, Ecken und eigenes CSS für den Rahmen wie für den Platzhalter vor der Einwilligung. Was im Rahmen steht, gehört dem Anbieter; daran kommt kein CSS heran.
Update: über den Bildschirm „System“ (Git oder Releasearchiv). Das Archiv unten bringt
vendor/mit und braucht kein Composer auf dem Server.Downloads
-
released this
2026-09-15 18:16:22 +00:00 | 107 commits to main since this releaseDie Website heißt mit oder ohne www – das entscheidet
SITE_ORIGIN, die andere Schreibweise leitet dorthin um. Die Rollen tun, was die Rollenhilfe verspricht. Dazu die Ergebnisse einer Gesamtprüfung von Backend, Betrieb, Editor, öffentlicher Ausgabe und Autorisierung.Eine Adresse
SITE_ORIGINin.envlegt fest, ob die Website mit oder ohnewwwheißt. Die jeweils andere Schreibweise antwortet mit 301 auf die eingetragene Adresse, mit Pfad und Abfrage, auch für die Verwaltung. Ein anderer Host (Vorschauadresse des Hosters, IP-Adresse,localhost) bleibt erreichbar. Der www-Block inpublic/.htaccessentfällt; HTTPS bleibt dort.- Neu:
php bin/console cms:site:origin https://www.meine-firma.deprüft und schreibt die Adresse. Der Bildschirm „System“ zeigt sie mit Quelle und warnt, wenn die Verwaltung gerade unter einer anderen Adresse läuft.
Rollen – bitte vor dem Update lesen
- Redakteur: Entwürfe von Seiten und Beiträgen, Medien, Statistik, eigenes Konto.
- Veröffentlicher: dazu veröffentlichen, Bereiche (Kopf, Fuß, Sektionen), Menüs, Formulare, Weiterleitungen, 404-Seite.
- Administrator: dazu Design, Unternehmensdaten samt Einwilligung und Spamschutz, Benutzer, System, Aufgaben, eigene Skripte, endgültiges Löschen.
- Bisher genügte für Design, Einstellungen, Bereiche, Menüs und Formulare die Rolle Redakteur. Bestehende Redakteurskonten verlieren diese Bildschirme; wer sie braucht, wird unter Benutzer zum Veröffentlicher oder Administrator. Die Navigation zeigt je Rolle nur, was sie öffnen darf.
Sicherheit
- Der Installer öffnete sich wieder, sobald die Datenbank nicht antwortete (Wartung beim Hoster, gedrehtes Passwort). Jetzt zählt die Marke der Installation, und eine tote Verbindung heißt „gestört“.
- Nach
cms:admin:pathwar keine Anmeldung möglich, weil das Sitzungscookie auf/adminblieb. - Die Einwilligung nimmt nur noch Entscheidungen von dieser Website an und springt nur auf eigene Pfade zurück.
</script>in einem Seitentitel oder einer FAQ-Antwort konnte die strukturierten Daten und den Seitenkopf zerreißen.- Eigenes CSS konnte mit einem Komma im Selektor andere Elemente treffen. Eine wiederhergestellte Fassung prüft Skripte wie das Speichern.
Betrieb
- Ein MySQL- oder SMTP-Passwort mit Sonderzeichen ließ die Website nach dem Installer bei jeder Anfrage abbrechen.
- Update-Downloads bleiben auch über Weiterleitungen bei HTTPS. Composer und Git bekommen aus dem Web-Update eine Umgebung, die PHP-Kommandozeile wird gesucht statt aus
PHP_BINARYgeraten. Ein unerwarteter Fehler im Updater nimmt den Rückweg. - Eine geplante Veröffentlichung, die scheitert, hält die anderen nicht mehr auf. Unter einer Seite im Papierkorb entsteht keine Unterseite mehr.
Editor
- Menü, Beitragsliste und Slider ließen sich in älteren Dokumenten nicht speichern (Schemafassung). „Gestaltung einfügen“ und „Als Vorlage speichern“ waren fälschlich aktiv und konnten eine Gestaltung oder Vorlage löschen. „Ausrücken“ und ein Zug im Strukturbaum folgen den Elternregeln. Ein Bild auf ein Akkordeon meldet sich statt zu scheitern. Abgelehnte Einfügungen hinterlassen keinen leeren Verlaufsschritt.
Öffentliche Seiten
- Schatten bei Überfahren oder Scrollen erben Versatz und Weichzeichnung. Tabs und Bildbetrachter in Kopf, Fuß oder verknüpften Sektionen bekommen ihr Skript. Das Archiv escaped alte Klartext-Bereiche. Sitemap-
lastmodfolgt der Fassung, der Feed rechnet in UTC, eingebettete Videos dürfen ins Vollbild.
Beim Update
Keine Migration und kein neues Dokumentschema.
.envbleibt erhalten;SITE_ORIGINeinmal prüfen (mit oder ohne www, so wie die Website heißen soll).Geprüft
- 551 PHP-Tests (PHP 8.4), 33 JavaScript-Tests, Editor-Durchlauf mit Playwright und axe, Twig/YAML/Container-Lint, php-cs-fixer.
Downloads
-
released this
2026-09-15 13:19:18 +00:00 | 110 commits to main since this releaseEine einzelne Spalte darf direkt in einer Sektion stehen, Buttons lassen sich ausrichten, und zwei Lücken der öffentlichen Seiten sind geschlossen.
Editor
- Eine Spalte darf jetzt auch allein in einer Sektion liegen, nicht nur in einer Zeile. So wird ein Button oder ein kurzer Text zentriert und schmaler, ohne eine Zeile mit einer Spalte darum.
- Das Design-Token „Ausrichtung“ (links, mittig, rechts, je Gerät) gilt auch für Buttons. Ein Button zentrierte sich bisher weder über Ausrichtung noch über automatische Ränder.
Öffentliche Seiten
- Abschnitte mit Breite „breit“ oder „voll“ blieben so schmal wie alle anderen, sobald das Design eine Inhaltsbreite setzte. Jetzt gewinnen die Breitenregeln.
- Der Nach-oben-Knopf steckt in einer Navigations-Landmarke; axe meldete ihn bisher als Inhalt außerhalb jeder Landmarke.
- Cormorant Garamond liegt als lokale Schrift bei (OFL), für die Referenzwebsite Ihr Malerservice Drews.
Beim Update
Keine Migration und kein neues Dokumentschema. Dokumente, die das Token „Ausrichtung“ an einem Button tragen, ließen sich unter 1.16.0 nicht rendern (500); ab dieser Fassung schon.
Geprüft
- 512 PHP-Tests erfolgreich (PHP 8.4), 33 JavaScript-Tests.
- Lighthouse auf der Referenzwebsite Ihr Malerservice Drews: Barrierefreiheit, Best Practices, SEO und agentisches Browsing 100, Leistung 98–100; axe null Verstöße auf neun Seiten.
Downloads