From 7c3c8671a7ab866426d46ad6c52251d7379d70c7 Mon Sep 17 00:00:00 2001 From: Umut Kantarci Date: Mon, 14 Sep 2026 08:08:31 +0200 Subject: [PATCH] Fassung 1.5.4: der Werkzeugkasten bekommt Bilder und eine Suche MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Elementwahl war eine Liste aus Schriftzeichen - "▣" fuer Sektion, "☰" fuer Zeile. Jetzt traegt jeder der 34 Eintraege eine Strichzeichnung, die zeigt, was er baut: die Sektion ein gefuelltes Band, "Zeile, 3 Spalten" tatsaechlich drei Kaesten, das Bild einen Rahmen mit Bergzug. Zeichnungen statt Bilddateien. Flatsome liefert je Element ein PNG mit. Gezeichnet ist hier besser: library-previews.js ist ein paar hundert Byte statt eines Ordners voller Bitmaps, die Formen nehmen die Farbe der Flaeche an, auf der sie liegen - gesperrte Eintraege werden damit von selbst blass - und sie bleiben auf jedem Bildschirm scharf. Die Zeilenvorschau wird gerechnet: zwei, drei oder vier Kaesten aus derselben Funktion. Suche. Ein Feld ueber der Liste filtert ueber alle Gruppen, gesucht wird ueber Namen, internen Typ und Gruppennamen - wer "slider" eingibt, muss nicht wissen, dass er unter "Gruppen" steht. Gruppen ohne Treffer verschwinden, darunter steht wie viele von wie vielen uebrig sind. Dabei bemerkt: es gab zwei Suchfelder namens "Element suchen" auf einem Bildschirm, fuer eine Sprachausgabe nicht unterscheidbar. Sie heissen jetzt nach dem, was sie durchsuchen. Geprueft: der Browsertest zaehlt die Vorschaubilder gegen die Eintraege und sucht nach Name, Gruppenname und etwas Nichtvorhandenem. npm test 28/28, phpunit 452/452, npm run test:editor vollstaendig ohne axe-Verstoss. Co-Authored-By: Claude Opus 5 --- VERSION | 2 +- docs/STATUS.md | 36 ++++++++++++++- public/assets/editor.css | 13 +++--- public/assets/editor.js | 39 +++++++++++++--- public/assets/library-previews.js | 76 +++++++++++++++++++++++++++++++ scripts/editor-check.mjs | 22 ++++++++- templates/admin/base.html.twig | 2 +- templates/admin/editor.html.twig | 5 +- 8 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 public/assets/library-previews.js diff --git a/VERSION b/VERSION index 1d5e9e0..63ebd3f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.3 \ No newline at end of file +1.5.4 \ No newline at end of file diff --git a/docs/STATUS.md b/docs/STATUS.md index 86128cc..7d194c2 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,6 +1,6 @@ # Projektstatus -Stand: 14.09.2026, Fassung **1.5.3**. Das System heißt **KantSites** (vorher Arbeitstitel „Kant CMS“). **Startseite von 18 auf 8 Datenbankabfragen, gemessenes Ladebudget, alle langen Listen blättern. Sicherung und Wiederherstellung, letztere nachgewiesen. Globale Seitenbreite wirkt jetzt auch nach oben, vier Menüplätze mit drei Menüarten, und jede Seite wählt ihren Kopf- und Fußbereich – auch „keiner“. 93 Gestaltungseigenschaften, neun Einblendungen, sieben Hover-Effekte, Symbol, Fortschritt und ein Slider ohne JavaScript. Update über Git mit Vorprüfung, Sicherung und Rückweg. Statistik ohne Wiedererkennung und damit ohne Einwilligung. Einwilligung mit tatsächlich zurückgehaltenen Einbettungen, Datenschutz und Impressum als Pflichtseiten. Benutzerverwaltung in der Oberfläche, Mediathek als eigene Seite mit Blättern. Die Verwaltung hat einen gemeinsamen Rahmen mit einer Navigation, die zeigt, wo man ist. Eigenes CSS je Element für alle, eigenes Skript nur für Administratoren und nur als eigene Datei. Formatierter Text mit Werkzeugleiste und HTML-Ansicht, serverseitig gegen eine Positivliste gefiltert. Kopf- und Fußbereich sind frei gestaltbare Blockdokumente, dazu verknüpfte wiederverwendbare Sektionen (Arbeitspaket G, Teil 1). Frei wählbare Startseite; `/sitemap.xml` und Geschwister waren lokal nie erreichbar und sind es jetzt. Seiten verschieben mit automatischen Weiterleitungen, Papierkorb, Fassungsverlauf und geplante Veröffentlichung (Arbeitspaket F). Browsertests wiederhergestellt und erweitert; dabei drei echte Fehler gefunden und behoben, darunter die in der Vorschau wirkungslose Gestaltung. Direktbearbeitung in der Vorschau, Kontrastwarnung, Gestaltungsvorlagen und Bildauswahl für Hintergrundbilder. Der Editor gestaltet frei statt über feste Auswahllisten: eigene Farbpalette, Schriften, und jede Eigenschaft je Block, je Gerät und für den Hover-Zustand frei einstellbar (Dokumentschema v10). SEO-Grundlage mit Sitemap, robots.txt, Weiterleitungen und strukturierten Daten (Arbeitspaket E). Formulare mit serverseitiger Validierung, Einwilligung, E-Mail-Versand und Spamschutz (Arbeitspaket D). Tabs als fortschreitende Verbesserung mit JavaScript (Dokumentschema v7). Zehn neue Blöcke für die Abschnitte der Pilotstartseite (Arbeitspaket C). Beiträge mit Datum, Autor, Auszug, Beitragsbild, Kategorien, Schlagwörtern, Archiven, einbettbarer Beitragsliste und RSS (Arbeitspaket B). Menüs mit Seiten-, Anker- und externen Zielen ersetzen die fest verdrahtete Navigation (Arbeitspaket A). Seiten und Beiträge lassen sich im Browser anlegen und löschen, mit Adresshierarchie bis vier Ebenen.** Die vollständige Phase-1-Abnahme bleibt wegen des fehlenden UX-Builder-Referenzabgleichs offen. +Stand: 14.09.2026, Fassung **1.5.4**. Das System heißt **KantSites** (vorher Arbeitstitel „Kant CMS“). **Startseite von 18 auf 8 Datenbankabfragen, gemessenes Ladebudget, alle langen Listen blättern. Sicherung und Wiederherstellung, letztere nachgewiesen. Globale Seitenbreite wirkt jetzt auch nach oben, vier Menüplätze mit drei Menüarten, und jede Seite wählt ihren Kopf- und Fußbereich – auch „keiner“. 93 Gestaltungseigenschaften, neun Einblendungen, sieben Hover-Effekte, Symbol, Fortschritt und ein Slider ohne JavaScript. Update über Git mit Vorprüfung, Sicherung und Rückweg. Statistik ohne Wiedererkennung und damit ohne Einwilligung. Einwilligung mit tatsächlich zurückgehaltenen Einbettungen, Datenschutz und Impressum als Pflichtseiten. Benutzerverwaltung in der Oberfläche, Mediathek als eigene Seite mit Blättern. Die Verwaltung hat einen gemeinsamen Rahmen mit einer Navigation, die zeigt, wo man ist. Eigenes CSS je Element für alle, eigenes Skript nur für Administratoren und nur als eigene Datei. Formatierter Text mit Werkzeugleiste und HTML-Ansicht, serverseitig gegen eine Positivliste gefiltert. Kopf- und Fußbereich sind frei gestaltbare Blockdokumente, dazu verknüpfte wiederverwendbare Sektionen (Arbeitspaket G, Teil 1). Frei wählbare Startseite; `/sitemap.xml` und Geschwister waren lokal nie erreichbar und sind es jetzt. Seiten verschieben mit automatischen Weiterleitungen, Papierkorb, Fassungsverlauf und geplante Veröffentlichung (Arbeitspaket F). Browsertests wiederhergestellt und erweitert; dabei drei echte Fehler gefunden und behoben, darunter die in der Vorschau wirkungslose Gestaltung. Direktbearbeitung in der Vorschau, Kontrastwarnung, Gestaltungsvorlagen und Bildauswahl für Hintergrundbilder. Der Editor gestaltet frei statt über feste Auswahllisten: eigene Farbpalette, Schriften, und jede Eigenschaft je Block, je Gerät und für den Hover-Zustand frei einstellbar (Dokumentschema v10). SEO-Grundlage mit Sitemap, robots.txt, Weiterleitungen und strukturierten Daten (Arbeitspaket E). Formulare mit serverseitiger Validierung, Einwilligung, E-Mail-Versand und Spamschutz (Arbeitspaket D). Tabs als fortschreitende Verbesserung mit JavaScript (Dokumentschema v7). Zehn neue Blöcke für die Abschnitte der Pilotstartseite (Arbeitspaket C). Beiträge mit Datum, Autor, Auszug, Beitragsbild, Kategorien, Schlagwörtern, Archiven, einbettbarer Beitragsliste und RSS (Arbeitspaket B). Menüs mit Seiten-, Anker- und externen Zielen ersetzen die fest verdrahtete Navigation (Arbeitspaket A). Seiten und Beiträge lassen sich im Browser anlegen und löschen, mit Adresshierarchie bis vier Ebenen.** Die vollständige Phase-1-Abnahme bleibt wegen des fehlenden UX-Builder-Referenzabgleichs offen. Erster Commit angelegt (`82b0782`); das Projekt hat damit einen Rückfallpunkt. Noch kein Remote und kein Push. @@ -410,6 +410,40 @@ Werkzeugkasten ist seit 1.5.1 nichts ohne sein Skript. Für einen Editor ist das öffentliche Website läuft ohne JavaScript –, aber die Fehleranzeige dafür ist noch die Browserkonsole und kein Satz in der Oberfläche. +## Arbeitspaket H, Teil 3b: der Werkzeugkasten bekommt Bilder und eine Suche + +**Erledigt.** Die Elementwahl war eine Liste aus Schriftzeichen – „▣“ für Sektion, „☰“ für Zeile. +Jetzt trägt jeder der 34 Einträge eine Strichzeichnung, die zeigt, was er baut: die Sektion ein +gefülltes Band, „Zeile, 3 Spalten“ tatsächlich drei Kästen, das Bild einen Rahmen mit Bergzug. + +**Zeichnungen statt Bilddateien.** Flatsome liefert je Element ein PNG mit. Gezeichnet ist hier +besser: `library-previews.js` ist ein paar hundert Byte statt eines Ordners voller Bitmaps, die +Formen nehmen die Farbe der Fläche an, auf der sie liegen – gesperrte Einträge werden damit von +selbst blass – und sie bleiben auf jedem Bildschirm scharf. Die Zeilenvorschau wird gerechnet, +nicht gezeichnet: zwei, drei oder vier Kästen aus derselben Funktion. + +**Suche.** Ein Feld über der Liste filtert über alle Gruppen. Gesucht wird über den Namen, den +internen Typ **und** den Gruppennamen – wer „slider“ eingibt, muss nicht wissen, dass er unter +„Gruppen“ einsortiert ist. Gruppen ohne Treffer verschwinden, damit die Liste keine Lücken +behält, und darunter steht, wie viele von wie vielen übrig sind. + +**Dabei bemerkt:** Es gab damit zwei Suchfelder mit dem Namen „Element suchen“ auf einem +Bildschirm – für eine Sprachausgabe nicht unterscheidbar. Sie heißen jetzt nach dem, was sie +durchsuchen: „Element zum Einfügen suchen“ im Werkzeugkasten, „Element auf der Seite suchen“ im +Strukturbaum. + +**Geprüft.** Der Browsertest zählt die Vorschaubilder gegen die Einträge (alle 34 haben eines), +sucht nach „galerie“ (ein Eintrag, eine Gruppe), nach „aufbau“ (fünf Einträge über den +Gruppennamen), nach etwas Nichtvorhandenem und wieder nach nichts. `npm test` 28 von 28, +`php vendor/bin/phpunit` 452 von 452, `npm run test:editor` vollständig ohne axe-Verstoß. + +**Noch offen aus Teil 3.** Vorlagen je Element mit Vorschaubild. Und das Ziehen der +Spaltenbreite: das geht heute nicht ohne einen Zwischenschritt, denn eine Zeile ist ein +CSS-Raster mit **gleich breiten** Spalten (`repeat(n, minmax(0,1fr))`); ein `span` je Spalte +gibt es nicht. Dafür braucht es erst ein Zwölf-Spalten-Modell im Designtoken-Manifest, und das +berührt die öffentliche CSS und damit die Messwerte aus AGENTS.md. Das ist ein eigener Schritt, +kein Nebenbei. + ## Nächster konkreter Schritt Arbeitspaket H, Teil 3b: Vorschaubilder und Suche im Werkzeugkasten, Vorlagen je Element mit diff --git a/public/assets/editor.css b/public/assets/editor.css index 667f4a8..10a9650 100644 --- a/public/assets/editor.css +++ b/public/assets/editor.css @@ -270,13 +270,14 @@ dialog p{font-size:14px;line-height:1.7;color:var(--muted)} .library-group-title{font-size:10px;font-weight:700;letter-spacing:1.1px;text-transform:uppercase;color:var(--muted);margin:0 0 7px} .library-group-hint{font-size:10px;line-height:1.5;color:var(--muted);margin:-3px 0 8px} .library-buttons{display:grid;grid-template-columns:1fr 1fr;gap:6px} -.library-buttons button{display:flex;align-items:center;gap:7px;text-align:left;min-height:38px;padding:7px 9px;border:1px solid var(--line);border-radius:7px;background:#f7f9f2;color:var(--ink);font-size:11px;line-height:1.25} -.library-buttons button>span:first-child{flex:none;width:14px;text-align:center;font-size:13px;color:var(--accent)} +.library-buttons button{display:flex;align-items:center;gap:8px;text-align:left;min-height:44px;padding:6px 8px;border:1px solid var(--line);border-radius:7px;background:#f7f9f2;color:var(--ink);font-size:11px;line-height:1.25} +.library-preview{flex:none;display:grid;place-items:center;width:34px;height:23px;color:var(--accent);opacity:.85} +.library-buttons button:disabled .library-preview{color:var(--muted);opacity:.6} +.library-name{min-width:0} .library-buttons button:hover:not(:disabled){border-color:var(--accent);background:#fff} .library-buttons button:disabled{opacity:.4;background:transparent;cursor:not-allowed} -.library-buttons button:disabled>span:first-child{color:var(--muted)} -/* A row is offered by column count, so its glyph shows the count - and needs the room for it, - instead of the fixed single-glyph width the other entries share. */ -.library-buttons button>span.library-row-glyph{width:auto;letter-spacing:0;font-size:10px;color:var(--accent)} .library-buttons button[data-row]{grid-column:span 2} @media(max-width:1150px){.library-buttons{grid-template-columns:1fr}.library-buttons button[data-row]{grid-column:span 1}} + +#library-search{font-size:11px;min-height:36px;padding:9px;margin-bottom:4px} +#library-found{margin:0 0 10px;min-height:0} diff --git a/public/assets/editor.js b/public/assets/editor.js index ab7fbd4..ddebdff 100644 --- a/public/assets/editor.js +++ b/public/assets/editor.js @@ -1,8 +1,9 @@ -import { EditorHistory, labels, icons, blockLabel, blockIcon, isPluginBlock, setStyle, effectiveStyle, locate, clone, isContainer, canContain, insertBlock, insertBlockAt, insertionTarget, moveBlockTo, duplicateBlock, moveBlock, devices, effectiveDesign, setDesign, blockPath, insertPreset, insertRow, insertRowAt, setEffect, insertMedia, upgradeDocument, CATEGORIES, ROW_COLUMNS, whyNot, dropList } from './editor-model.js'; +import { EditorHistory, labels, blockLabel, blockIcon, isPluginBlock, setStyle, effectiveStyle, locate, clone, isContainer, canContain, insertBlock, insertBlockAt, insertionTarget, moveBlockTo, duplicateBlock, moveBlock, devices, effectiveDesign, setDesign, blockPath, insertPreset, insertRow, insertRowAt, setEffect, insertMedia, upgradeDocument, CATEGORIES, ROW_COLUMNS, whyNot, dropList } from './editor-model.js'; import { openMedia } from './media.js'; import { createDesignPanel } from './design-panel.js'; import { createRichText } from './rich-text.js'; import { createCanvasOverlay } from './canvas-overlay.js'; +import { preview, rowPreview } from './library-previews.js'; // Mirrors DocumentValidator::ICONS; the server rejects anything outside this list. const ICONS = ['app', 'web', 'design', 'network', 'hardware', 'shop', 'support', 'shield', 'clock', 'star', 'phone', 'mail', 'pin', 'check']; @@ -68,7 +69,7 @@ function controls() { updateLibrary(); $('#presets').querySelectorAll('button').forEach(button => button.disabled = !ready || busy); $('#properties').querySelectorAll('input,textarea,select,button').forEach(input => input.disabled = busy); - document.querySelectorAll('[data-panel],[data-viewport],#tree-search,#expand-all,#collapse-all').forEach(input => input.disabled = !ready || busy); + document.querySelectorAll('[data-panel],[data-viewport],#tree-search,#library-search,#expand-all,#collapse-all').forEach(input => input.disabled = !ready || busy); $('[data-panel="design"]').disabled ||= !current; $('#select-page').disabled = !ready || busy; $('#open-media-library').disabled = !ready || busy; @@ -756,12 +757,18 @@ function buildLibrary() { button.type = 'button'; button.draggable = true; button.dataset.add = type; if (columns) button.dataset.row = String(columns); - const glyph = document.createElement('span'); glyph.setAttribute('aria-hidden', 'true'); - glyph.textContent = columns ? '▥'.repeat(Math.min(columns, 4)) : icons[type]; - if (columns) glyph.className = 'library-row-glyph'; + const name = columns ? `${labels[type]}, ${columns} Spalten` : labels[type]; + // What is searched for: the name, the internal type and the group it sits in. Someone + // looking for "slider" should not have to know it is filed under "Gruppen". + button.dataset.search = `${name} ${type} ${category.name}`.toLocaleLowerCase('de'); + const picture = document.createElement('span'); + picture.className = 'library-preview'; + // Drawn, not written: the shapes come from this editor and carry no untrusted text. + picture.innerHTML = columns ? rowPreview(columns) : preview(type); const text = document.createElement('span'); - text.textContent = columns ? `${labels[type]}, ${columns} Spalten` : labels[type]; - button.append(glyph, text); + text.className = 'library-name'; + text.textContent = name; + button.append(picture, text); list.append(button); } } @@ -789,6 +796,24 @@ function updateLibrary() { } } +/** Filters the toolbox. A group without a hit disappears, so the list does not keep its gaps. */ +function filterLibrary() { + const term = $('#library-search').value.trim().toLocaleLowerCase('de'); + let hits = 0; + for (const group of $('#library').querySelectorAll('.library-group')) { + let visible = 0; + for (const button of group.querySelectorAll('button')) { + const hit = '' === term || (button.dataset.search ?? '').includes(term); + button.hidden = !hit; + if (hit) visible++; + } + group.hidden = 0 === visible; + hits += visible; + } + $('#library-found').textContent = '' === term ? '' : (0 === hits ? 'Kein Element mit diesem Namen.' : `${hits} von ${$('#library').querySelectorAll('button').length}`); +} +$('#library-search').addEventListener('input', filterLibrary); + $('#library').addEventListener('click', event => { const button = event.target.closest('[data-add]'); if (!button || button.disabled) return; diff --git a/public/assets/library-previews.js b/public/assets/library-previews.js new file mode 100644 index 0000000..4838940 --- /dev/null +++ b/public/assets/library-previews.js @@ -0,0 +1,76 @@ +/** + * Line art for the toolbox. + * + * Flatsome ships a PNG per element. Drawings are better here: they are a few hundred bytes + * instead of a folder of bitmaps, they take the colour of the surface they sit on, and they stay + * sharp on a screen of any density. Every shape lives in the same 24x16 field so the entries + * line up in the grid. + * + * Each value is the inside of an ``; `stroke` and `fill` come from the wrapper, so a shape + * only says what it is, not what colour it has. + */ + +/** A filled bar, the building block most of these are made of. */ +const bar = (x, y, width, height = 2) => ``; +/** Several bars under each other, as a paragraph of text. */ +const lines = (...widths) => widths.map((width, index) => bar(3, 4 + index * 3.4, width, 1.7)).join(''); + +export const PREVIEWS = { + // Aufbau + section: '', + row: '', + column: '', + + // Inhalt + heading: `${bar(3, 3.6, 18, 3)}${bar(3, 9, 11, 2)}`, + text: lines(18, 16, 11), + image: '', + button: '', + icon: '', + divider: '', + spacer: '', + + // Bausteine + iconcard: `${bar(3, 9, 12, 1.9)}${bar(3, 12, 8, 1.5)}`, + stat: `${bar(3, 3, 9, 5)}${bar(3, 10.5, 14, 1.7)}`, + quote: `${bar(14, 5.6, 7, 1.6)}${bar(14, 9, 5, 1.6)}`, + cta: `${bar(2.5, 4, 12, 2.4)}`, + contact: '', + logos: [2.5, 8, 13.5, 19].map(x => ``).join(''), + progress: '', + + // Gruppen + gallery: [2.5, 12.5].flatMap(x => [2.5, 8.5].map(y => ``)).join(''), + accordion: '', + accordionitem: '', + tabs: '', + tabitem: '', + slider: '', + + // Seite und Daten + postlist: '' + + `${bar(11.5, 3.2, 10, 1.6)}${bar(11.5, 6, 7, 1.4)}${bar(11.5, 9.2, 10, 1.6)}${bar(11.5, 12, 7, 1.4)}`, + postnav: '', + breadcrumb: `${bar(2, 7.2, 5, 1.7)}${bar(11.6, 7.2, 4, 1.7)}${bar(20.2, 7.2, 2, 1.7)}`, + menu: `${bar(2, 7.2, 5, 1.8)}${bar(9, 7.2, 6, 1.8)}${bar(17, 7.2, 5, 1.8)}`, + form: '', + legal: `${bar(2, 4, 20, 1.6)}${bar(2, 7.4, 16, 1.6)}${bar(2, 10.8, 11, 1.6)}`, + partialref: '', + embed: '', +}; + +/** The picture for one element type, ready to drop into the markup. */ +export function preview(type) { + const shape = PREVIEWS[type]; + if (!shape) return ''; + return ``; +} + +/** A row of columns, for the entries that add a row with a column count. */ +export function rowPreview(columns) { + const gap = 1.4; + const inner = (22 - gap * (columns - 1)) / columns; + const cells = Array.from({ length: columns }, (_, index) => + ``).join(''); + return ``; +} diff --git a/scripts/editor-check.mjs b/scripts/editor-check.mjs index 50f6e30..275bb6d 100644 --- a/scripts/editor-check.mjs +++ b/scripts/editor-check.mjs @@ -170,6 +170,24 @@ try { // Differenz. assert.equal(await page.locator('#structure .tree-item').filter({ hasText: 'Spalte' }).count(), columnsBefore + 3); await page.getByRole('button', { name: 'Rückgängig', exact: true }).click(); + // Jeder Eintrag traegt eine Zeichnung statt eines Schriftzeichens. + const mitBild = await page.locator('#library button .library-preview svg').count(); + const knoepfe = await page.locator('#library button').count(); + assert.equal(mitBild, knoepfe, `alle ${knoepfe} Eintraege haben ein Vorschaubild`); + + // Die Suche greift ueber alle Gruppen und blendet leere Gruppen aus. + await page.locator('#library-search').fill('galerie'); + await page.locator('#library-found').filter({ hasText: 'von' }).waitFor(); + assert.equal(await page.locator('#library button:visible').count(), 1, 'genau die Galerie bleibt'); + assert.equal(await page.locator('#library .library-group:visible').count(), 1, 'nur ihre Gruppe bleibt'); + // Auch der Gruppenname findet: "Aufbau" gehoert zu Sektion, Zeile und Spalte. + await page.locator('#library-search').fill('aufbau'); + assert.equal(await page.locator('#library button:visible').count(), 5, 'Sektion, drei Zeilen, Spalte'); + await page.locator('#library-search').fill('gibtesnicht'); + await page.locator('#library-found').filter({ hasText: 'Kein Element' }).waitFor(); + await page.locator('#library-search').fill(''); + assert.equal(await page.locator('#library button:visible').count(), knoepfe, 'leere Suche zeigt wieder alles'); + checks.push({ name: 'the toolbox follows the structure', passed: true }); await page.screenshot({ path: 'reports/editor/toolbox.png' }); console.log('Context aware toolbox passed.'); @@ -219,11 +237,11 @@ try { await page.getByRole('button', { name: 'Einklappen', exact: true }).click(); assert.equal(await page.locator('#structure .tree-item').count(), 3); - await page.getByLabel('Element suchen', { exact: true }).fill('Meine bearbeitete'); + await page.getByLabel('Element auf der Seite suchen', { exact: true }).fill('Meine bearbeitete'); assert.equal(await page.locator('#structure .tree-item').count(), 2); await page.locator('#structure [data-block-id="headline"]').focus(); await page.keyboard.press('Enter'); - await page.getByLabel('Element suchen', { exact: true }).fill(''); + await page.getByLabel('Element auf der Seite suchen', { exact: true }).fill(''); assert.equal(await page.locator('#structure [data-block-id="headline"]').isVisible(), true); await page.getByRole('button', { name: 'Alle öffnen', exact: true }).click(); await page.getByRole('button', { name: 'Design', exact: true }).click(); diff --git a/templates/admin/base.html.twig b/templates/admin/base.html.twig index ca2d967..260f527 100644 --- a/templates/admin/base.html.twig +++ b/templates/admin/base.html.twig @@ -17,7 +17,7 @@ Importzeile sie kennen muss. Sie steht vor jedem Modul-Skript; spaeter geladen wirkt sie nicht mehr. #} diff --git a/templates/admin/editor.html.twig b/templates/admin/editor.html.twig index 843a89e..0c76dac 100644 --- a/templates/admin/editor.html.twig +++ b/templates/admin/editor.html.twig @@ -21,12 +21,15 @@

Werkzeugkasten

Element hinzufügen

Ziehen und in der Vorschau ablegen, oder klicken. Der Werkzeugkasten zeigt an, was an der gewählten Stelle hineinpasst — was dort nicht hingehört, sagt beim Überfahren warum.

+ + +

Fertige Abschnitte

Wird nach dem aktuellen Seitenabschnitt eingefügt.

-

Struktur

Ziehen oder mit den Schaltflächen verschieben.

+

Struktur

Ziehen oder mit den Schaltflächen verschieben.