• 1.21.4 – Nach-oben-Knopf springt auch in Safari
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 20:09:15 +00:00 | 86 commits to main since this release

    Der 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, #seitenanfang stand 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: dasselbe span als Block springt, ein leerer div ohne 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.php fü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
  • 1.21.3 – Nach-oben-Knopf und Cookie-Leiste auf dem iPhone treffbar
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 19:56:12 +00:00 | 88 commits to main since this release

    Der 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 bottom aber 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.php fü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
  • 1.21.2 – Mobiles Menü lesbar, Hero mit Randabstand
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 19:30:27 +00:00 | 90 commits to main since this release

    Zwei 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.php fü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
  • 1.21.1 - Baustellenseite nach der Installation
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 13:56:25 +00:00 | 92 commits to main since this release

    Die 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
  • 1.21.0 - Bildecken unter Design
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 07:18:34 +00:00 | 94 commits to main since this release

    Wie 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; 0px macht 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
  • 1.20.2 - Die Reparatur als Konsolenbefehl
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 07:05:18 +00:00 | 96 commits to main since this release

    Nachtrag zu 1.20.1: Dort hieß es, scripts/repair-doubled-entities.php räume die doppelt kodierten Texte auf. Der Ordner scripts/ 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 an
    

    Angefasst 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
  • 1.20.1 - Texte wachsen beim Speichern nicht mehr
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 06:57:26 +00:00 | 98 commits to main since this release

    Behoben: 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 &amp; Umgebung wurde deshalb bei jedem Speichern eine Stufe mehr (&amp;amp;, &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 von RichText::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 --schreiben angewandt).

    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
  • 1.20.0 - Eigenes HTML als Baustein
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-16 06:27:49 +00:00 | 100 commits to main since this release

    Neu 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 in frame-src ein (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
  • 1.17.0 - Adresse mit oder ohne www, Rollen wie versprochen, Gesamtpruefung
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-15 18:16:22 +00:00 | 107 commits to main since this release

    Die 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_ORIGIN in .env legt fest, ob die Website mit oder ohne www heiß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 in public/.htaccess entfällt; HTTPS bleibt dort.
    • Neu: php bin/console cms:site:origin https://www.meine-firma.de prü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:path war keine Anmeldung möglich, weil das Sitzungscookie auf /admin blieb.
    • 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_BINARY geraten. 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-lastmod folgt der Fassung, der Feed rechnet in UTC, eingebettete Videos dürfen ins Vollbild.

    Beim Update

    Keine Migration und kein neues Dokumentschema. .env bleibt erhalten; SITE_ORIGIN einmal 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
  • 1.16.1 - Spalte in Sektion, Buttons ausrichten, breite Abschnitte
    CMS quality / php (8.2) (push) Canceled after 0s
    CMS quality / php (8.4) (push) Canceled after 0s
    CMS quality / browser (push) Canceled after 0s
    CMS quality / mysql (push) Canceled after 0s
    Stable

    kantarci released this 2026-09-15 13:19:18 +00:00 | 110 commits to main since this release

    Eine 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