Laioutr Release News Juli 2026
Der Juli stand im Zeichen der Content-Vorschau: Redakteurinnen und Redakteure können unveröffentlichte Inhalte jetzt serverseitig gerendert im echten Storefront ansehen - vom Token in den Projekteinstellungen über den Studio-Befehl bis zur Absicherung gegen Suchmaschinen-Indexierung. Parallel dazu wurde die Medienbibliothek grundlegend überarbeitet und als Orchestr-Integration angebunden, mit Ordner-Navigation, Cursor-Pagination und direktem Browser-Upload. Frontend Core lernte mit dem neuen pageIndex-Handler, den kompletten Seitenraum eines Seitentyps aufzuzählen - Grundlage für korrekte hreflang-Alternates pro Sprache und für Sitemaps. In Laioutr UI kamen Produktspezifikations- und Öffnungszeiten-Tabellen, ein automatisches Inhaltsverzeichnis für Artikel und der EU-Widerrufs-Button hinzu.
Frontend Core v0.33.1 - v0.38.1
Highlights
- Content-Vorschau für unveröffentlichte Inhalte: Wer eine Storefront-URL mit
?preview_token=<token>öffnet, sieht ab sofort die unveröffentlichte Fassung der Seite - serverseitig gerendert, nicht nachträglich im Browser ersetzt. Der Token wird serverseitig gegen denpreviewTokendes Projekts geprüft (timing-sicherer Vergleich); nur das Ergebnis dieser Prüfung erreicht die Connectoren alsclientEnv.isPreview. Ein falscher Token führt nicht zu einem Fehler, sondern rendert schlicht den veröffentlichten Stand. Jede Antwort auf eine Anfrage mit Token - angenommen oder abgelehnt - wird alsprivate, no-storeausgeliefert und landet damit nicht in einem geteilten Cache wie einem CDN. Neu ist das auto-importierte ComposableuseContentPreview(), dasenabled,status(off/pending/active/rejected) undstateliefert;enabledwird erst nach erfolgreicher Serverprüfungtrueund eignet sich damit direkt fürv-if. Zwei Hooks stehen bereit:frontend-core:content-preview:resolve-token(Bail-Hook, um den Token statt aus dem Query-Parameter aus einem Cookie oder Header zu beziehen) undfrontend-core:content-preview:changed(feuert nach einem Vorschau-Wechsel, etwa um eigene Caches zu invalidieren). - Vorschau-Seiten werden nicht indexiert:
PageRenderererzwingt auf jedem Render, der einen Vorschau-Token trägt,noindex, nofollow- unabhängig davon, ob die Vorschau aktiv, ausstehend oder abgelehnt ist, und unabhängig vom konfiguriertenrobots-Wert der Seite. Vorschau-URLs liefern unveröffentlichte, tokengeschützte Inhalte und tragen den Token in der URL; sie dürfen deshalb unter keinen Umständen in einen Suchindex geraten. - Medienbibliotheken als Orchestr-Integration (Breaking): Eine Medienbibliothek wird jetzt über
defineX.mediaLibrary(...)am Orchestr-Builder der App deklariert statt über die eigenständigedefineMediaLibraryProvider-Factory. Identität (id,label,iconSrc) stammt aus dem.meta()des Builders; der Connector deklariert seinecapabilities(Suche, Tags, Ordner, Sortierungen, Upload-Verfahren) explizit. Das Blättern läuft über Cursor-Pagination (MediaQuery→MediaListResult), Ordner sind in die einelist-Methode gefaltet (die separatebrowseFolders-Methode entfällt), und der Upload kennt neben dem Proxy-Weg jetzt auch einen Staged-Weg direkt vom Browser zum Backend - beide mit Ergebnis pro Datei, sodass eine fehlgeschlagene Datei nicht den ganzen Stapel kippt. Der Shopify-Connector nutzt Staged-Uploads und wartet, bis jede DateiREADYist; der Shopware-Connector kann jetzt durch den echten Medienordner-Baum navigieren. Alle Adapter-Ausgaben werden an der Vertrauensgrenze validiert (kanonischer Zod-Parse, URL-Schema-Prüfung inklusive verschachtelter Poster- und Cover-Bilder); verworfene Einträge erzeugen eine serverseitige Warnung.defineMediaLibraryProvider(...)funktioniert als abgekündigter Kompatibilitäts-Shim weiter, allerdings in eingeschränktem Umfang (keine Ordner, kein Staged-Upload, keine deklarierten Sortierungen) und mit einer einmaligen Warnung bei der Registrierung. - CMS-Medienbibliothek über die Laioutr-CDN-API: Neu ist der
@laioutr-app/cms-Medienbibliotheks-Connector samtRcProject.config.cdn-Container. Er implementiert die neue Schnittstelle gegenapps/cdn-api- Cursor-Blättern mit Ordnern, Staged-Upload und Cloudflare-Provider für Bild und Video-Poster auf dem projekteigenen Delivery-Host.RcCoreConfigerhält dafür ein optionalescdn: { key, deliveryHost }, das über die bestehende Config-Bereinigung nicht an den Client gelangt. - Herkunft und KI-Kennzeichnung an Medien: Jede
Media-Quelle trägt jetzt ein optionalesorigin({ libraryId, externalId? }), das die erzeugende Bibliothek und die stabile Asset-ID festhält. Es wird automatisch gesetzt, wenn ein Asset aus einer Medienbibliothek gewählt wird, ist rein verwaltungsseitig (der Renderer liest es nie) und additiv - zuvor gespeicherte Medien bleiben gültig. Ergänzend kamaiDisclosurehinzu, das festhält, ob ein Asset vollständig KI-generiert ('generated') oder mit generativer KI verändert ('modified') wurde. Das Feld gibt es für Bild, Video und Audio; der Poster eines Videos und das Cover eines Audios tragen einen eigenen Wert unabhängig vom Elternobjekt. Anbieter sollten es nur aus einem verlässlichen Backend-Signal setzen und sonst weglassen: „nicht gesetzt" bedeutet „keine Angabe bekannt", nicht „von Menschen erstellt". pageIndex-Handler: der komplette Seitenraum eines Seitentyps: MitdefineOrchestr.pageIndex({ for, list, search?, count?, locate?, cache?, order? })gibt es eine Registrierung pro Seitentyp, die dessen gesamten Seitenraum verantwortet.listläuft den Seitenraum in stabiler Reihenfolge ab und liefert je konkreter Seite einenPageIndexEntry; der neuepaginate()-Helper macht aus einer cursor-basierten Plattform-API genau das.searchbeantwortet einen Suchbegriff mit einer relevanz-sortierten Top-N-Liste - optional, denn ohne eigene Implementierung durchsucht der Runner die ersten 1000 aufgezählten Einträge nach Titel und Route-Parametern.countliefert eine günstige Gesamtzahl für Sitemaps und Picker,locateschlägt eine einzelne Seite nach und meldet deren Route-Parameter in allen Sprachen, in denen sie existiert. Auf Konsumentenseite stehen die auto-importierten Server-UtilitieslistPages(),searchPages(),countPages(),locatePage()undinvalidateEntity()bereit. Seitentypen ohne Registrierung verhalten sich exakt wie zuvor - Anbieter müssen das nicht implementieren.- hreflang-Alternates mit den Route-Parametern der jeweiligen Sprache: Auf Seiten mit pro Sprache übersetztem Slug wurden die Alternate-URLs,
og:locale:alternate,x-defaultund das Ziel des Sprachumschalters bisher aus den Parametern der aktuellen Sprache gebildet - und zeigten damit auf URLs, die es in der Zielsprache gar nicht gibt. Wo diepageIndex-Registrierung eines Seitentypslocateimplementiert und eine vollständige Sprachkarte meldet, bekommt jede Sprache jetzt ihren eigenen Slug; Sprachen, in denen die Seite nicht existiert, entfallen aus den Alternates, statt geraten zu werden. Weggelassen wird ausschließlich auf Basis einer vollständigen Karte: Meldet einlocatenur die Sprache, in der es aufgerufen wurde, bleibt es beim bisherigen Verhalten. Die Auflösung läuft parallel zu den Seiten-Queries und ist durch ein SSR-Budget von zwei Sekunden begrenzt; wird es überschritten, fällt genau dieser Render auf das alte Verhalten zurück, wärmt aber den Server-Cache, sodass der nächste Render korrekt ist. Einsprachige Projekte und Seiten ohne dynamische Parameter führen keine Auflösung durch. ai-Metadaten an Sektionen und Blöcken (Breaking): Dieai-Metadaten einer Sektions- oder Block-Definition sind jetzt ein typisiertesAiComponentMetadata-Objekt mit genau zwei optionalen Feldern:descriptionfür agentenseitige Fakten, die nicht in die Picker-Beschreibung passen, undexamplesfür eine ausformulierte Slot-/Block-Komposition bei mehrteiligen Sektionen. Die frühere freie{ label, description }-Form, die begleitendenai-descriptions/*.md-Dateien und deraiDescription()-Helper sind entfallen. Keinai-Objekt zu haben ist der Normalfall -studio.descriptionund das Feld-/Slot-Schema tragen die Last, und sämtliche eingebauten Beschreibungen wurden um die Fakten ergänzt, die zuvor in denai-Metadaten standen. Die vorschreibenden Felder (useWhen,avoidWhen,constraints,neverWith,pairsWellWith,typicallyFollowedBy,supports) sind ersatzlos gestrichen: Auswertungen haben gezeigt, dass sie die Seitenkomposition durch Agenten messbar verschlechtern.DateTime-Wertetyp: Ein zeitzonenbehafteter ISO-8601-Zeitpunkt (z.iso.datetime({ offset: true })), der den temporalen Satz nebenCalendarDate,TimeundDurationvervollständigt.- Fokuspunkt für Videos: Video-Quellen unterstützen jetzt einen
focalPointanalog zu Bildern. Der eingebauteMediaVideo-Renderer setzt ihn alsobject-positionum - pro Viewport, mitcenter centerals Rückfall -, sodass der wichtige Bildausschnitt sichtbar bleibt, wenn das Video durchobject-fit: coverbeschnitten wird. ClientEnv.domain: Der aufgelöste Client-Kontext trägt jetzt die Markt-Domain (Host, Pfad, Sprache), auf die die aktuelle Anfrage aufgelöst wurde. Für den kanonischen Host einer Anfrage sollte dieses Feld gelesen werden stattmarket.defaultDomainanzunehmen. Die i18n-Konfigurationsprüfung warnt außerdem, wenn zwei Domains desselben Markts dieselbe Sprache verwenden - dann ist die aufgelöste Domain mehrdeutig und die Sprachen sollten regional qualifiziert werden (etwade-DEgegenüberde-AT).
Fehlerbehebungen & Verbesserungen
content_alignment-Werte, die außerhalb der aus der Achse abgeleiteten Menge liegen, werden beim Auflösen der Render-Props jetzt geheilt statt verworfen. Wurde dieaxiseines Felds nachträglich geändert, wird der gespeicherte Wert auf die neue Achse projiziert: Beim Einschränken vonbothauf eine Achse bleibt die passende Komponente erhalten (top-leftrendert auf einem vertikalen Feld alstop), beim Erweitern wird die fehlende Achse mitcenterergänzt (topwird zutop-center). Nur ein Wert ohne Entsprechung auf der neuen Achse oder ein fehlerhafter Wert fällt noch auf die Vorgabe zurück. Zuvor ging in all diesen Fällen die gespeicherte Ausrichtungsabsicht verloren.- Behoben: Medienbibliotheken älterer Anbieter tauchten im Cockpit nicht auf, weil ihr v2-Provider und -Deskriptor mit falschen Registry-Argumenten registriert wurden.
- Behoben: Über
onConsentChangeregistrierte Verbraucher des Consent-Stores wurden nie benachrichtigt. Der Store veränderte seine State-Ref direkt, beobachtete sie aber ohnedeep, sodass der Watcher nie auslöste. Der State wird jetzt neu zugewiesen und der Watcher greift. - Medienbibliotheks-Anfragen aus dem Asset-Browser des Cockpits laufen jetzt mit dem Standardmarkt und der Standardsprache des Projekts statt mit einem Platzhalter (
{ locale: 'en', currency: '' }). Anbieter, die sich auf die leere Währung als Auslöser ihres eigenen Rückfalls verlassen haben, erhalten nun die echte Währung des Standardmarkts.
Hinweise für Entwickler (Breaking Changes)
- Medienbibliotheken: Umstellung von
defineMediaLibraryProvider({ name, label, iconSrc, list, upload })aufdefineX.mediaLibrary({ capabilities, list, createUploadTargets, finalizeUploads })am Orchestr-Builder. Der alte Weg bleibt als Shim funktionsfähig, aber im eingeschränkten Modus.ProjectFrontendContext.mediaLibrariesträgt jetzt Deskriptoren{ id, label, iconSrc, capabilities }. Frontend Core 0.35.0 ist zugleich die Schwelle für dasmediaLibraryV2-Capability-Gate im Cockpit. ai-Metadaten:aiDescription()und dieai-descriptions/*.md-Dateien entfernen; Fakten nachstudio.descriptionverschieben undainur dort setzen, wo eine Aussage nicht in den Picker-Text passt.WireClientEnvumgezogen: Der Typ liegt jetzt in@laioutr-core/core-types/orchestrstatt in@laioutr-core/orchestr- Handler desorchestr:client-env:modify-Hooks importieren ihn von dort. Zusätzlich sind dieclientEnv-Felder derquery-templates- undpage-index-Request-Schemas alsWireClientEnvstattunknowntypisiert. Solange sieunknownwaren, passierte jedes Objekt die Validierung - auch ein vertippter Schlüssel wiemarketidstattmarketId, worauf die Anfrage kommentarlos gegen den Standardmarkt auflöste. Ein solcher Schlüssel ist jetzt ein Compile-Fehler, und eine Anfrage mit fehlerhaftemclientEnvwird mit400und Angabe des betroffenen Pfads abgelehnt statt später als500zu scheitern.page-index/locateist ungeschützt erreichbar: Neben den geschützten Endpunkten unter/api/laioutr/wirdlocatezusätzlich ungated unterPOST /api/orchestr/page-index/locatebereitgestellt, weil das Frontend die sprachspezifischen Slugs auch bei clientseitiger Navigation auflösen muss und dort niemals den Projekt-Secret halten kann. Der Endpunkt gibt nur die Route-Parameter preis, die die gerenderten hreflang-Tags ohnehin veröffentlichen. Reverse Proxies oder Edge-Regeln, die die API-Pfade der Anwendung einschränken, müssen diesen Pfad zulassen.
Orchestr v0.34.0 - v0.38.1
Highlights
clientEnv.isPreviewist eine serverseitig geprüfte Tatsache (Breaking): Der Client-Kontext ist jetzt in zwei Typen getrennt.WireClientEnvist das, was der Browser schickt (isPreview,previewToken,marketId,languageId,custom), und gilt als nicht vertrauenswürdig;localeundcurrencyträgt er nicht mehr - der Server leitet beides aus dem aufgelösten Markt und der aufgelösten Sprache ab.ClientEnvist das, was Handler erhalten, und entsteht ausschließlich überresolveClientEnv(). Diese Funktion prüft den vorgelegten Vorschau-Token, entfernt ihn, bevor ihn ein Handler sehen kann, und macht ausmarketId/languageIdvollständige, gegen die i18n-Konfiguration validiertemarket- undlanguage-Objekte. Damit kann die ausgelieferte Sprache dem gelesenen Markt nie widersprechen, und eine Middleware kannmarket,languageoderisPreviewnicht mehr überschreiben. Query-, Link- und Component-Caches sind vorschau-bewusst: Die Schlüssel tragen die Vorschau-Stufe, und während einer Vorschau wird der Cache vollständig umgangen, damit unveröffentlichte Inhalte nie gespeichert und nie an Käuferinnen und Käufer ausgeliefert werden. Neu ist das auto-importierteinvalidateOrchestrQueries(), das alle gespeicherten Query-Ergebnisse auf einmal verwirft.- Fortsetzbare Seitenraum-Aufzählung mit
listPagesFrom: Für Aufzählungen, die nicht in einem Durchgang fertig werden, nimmtpaginatejetzt einen optionalenstartCursorund legtcursorsowieconsumedSinceCursoroffen - ein Durchlauf kann also melden, wo er stehen geblieben ist. Darauf bautlistPagesFrom(token, { take, resumeFrom })auf: Der zurückgegebene Stream trägt einenendCursor, den der Aufrufer speichert, um später weiterzumachen. Sammelt man dieendCursoraller Durchgänge, erhält man unabhängig auslieferbare Shards - genau das, was eine geshardete Sitemap braucht. Die Funktion ist cursor-adressiert und rührt den Chunk-Cache des Page-Index nicht an, sodass kein TTL den Fortschritt über mehrere Besuche hinweg begrenzt.listPagesbleibt unverändert. Page-Index-Handler erhalten einen optionalenstartCursor; wer ihn ignoriert, behält das heutige Verhalten, aberlistPagesFromwirft dann einen Fehler, statt bei jedem Durchgang stillschweigend wieder bei Eintrag 0 zu beginnen. Beide mitgelieferten Produkt-Connectoren sind fortsetzbar.
Fehlerbehebungen & Verbesserungen
- Die Component-Reflection listet die Resolver einer Entity-Komponente jetzt mit dem effektiven zuerst - also dem, den
get()zur Laufzeit tatsächlich auswählt (höchsteorder, bei Gleichstand der zuletzt registrierte). Zuvor kam die Registrierungsreihenfolge zurück, sodass Werkzeuge, dieimplementations[0]lesen, um eine Komponente ihrer App zuzuordnen, bei mehreren installierten Apps die falsche App anzeigen konnten. - Behoben: Ein SSR-500 (
[nuxt] instance unavailable) auf datengebundenen Seiten.renderQueryToWirelöste die Nuxt-App zum Aufrufzeitpunkt auf, lief dabei aber in verzögert ausgewerteten Computeds außerhalb von Nuxts asynchronem Kontext. Die Nuxt-App wird jetzt bei der Composable-Einrichtung erfasst und durchgereicht.
Hinweise für Entwickler (Breaking Changes)
@laioutr/loggerwurde entfernt: Das Nuxt-Modul wird weder vonfrontend-corenoch vonorchestrinstalliert, und das Paket selbst wird nicht mehr veröffentlicht. Internes Logging läuft jetzt überconsola, den Standard-Logger von Nuxt. Das entfernt die pino-Abhängigkeitskette und bereitet eine Observability-Einrichtung auf OpenTelemetry-Basis vor. Für Projekte bedeutet das: Das auto-importierteuseLogger()entfällt - stattdessenimport { consola } from 'consola'undconsola.withTag('my-scope')verwenden. Das globale$logger(globalThis.$logger,event.node.req.log) wird nicht mehr bereitgestellt. Der KonfigurationsschlüsselltrLogger(logLevelServer,logLevelClient,logForDevelopment,logNitroRequestsVerbose,logNitroResponsesVerbose) wird nicht mehr gelesen und sollte aus dernuxt.config.tsentfernt werden. Die Request-ID-Middleware (pino-http-Request-Logging,x-request-id-Response-Header, Sentry-Request-ID-Tagging) ist ebenfalls entfallen.ClientEnvverlangtmarketundlanguage: Handler lesen den Kontext wie bisher, aber wer einenClientEnvvon Hand baut, muss beide Felder liefern oder den Weg überresolveClientEnv(event, rawClientEnvFromRequest)gehen.ClientEnv.localeundClientEnv.currencysind abgekündigt: Sie lösen weiterhin auf, sind aber flache Kopien von Feldern, die die aufgelösten Objekte bereits tragen - künftigclientEnv.language.codeundclientEnv.market.currencylesen. Hängt die Ausgabe eines Handlers vom Markt ab, gehört ein Skalar wieclientEnv.market.slugin das eigenegetKeySuffix; der Standard-Cache-Schlüssel weitet sich bewusst nicht auf denClientEnvaus, undJSON.stringify(clientEnv)wirft, weilmarketundlanguagezyklisch sind. Da die Cache-Schlüssel jetzt die Vorschau-Stufe enthalten, sind von früheren Versionen geschriebene Einträge verwaist - nach dem Deployment ist gegen einen geteilten Cache mit einem einmaligen Cold-Cache-Fenster zu rechnen; von Hand geleert werden muss nichts.
Laioutr UI v2.5.0 - v2.8.1
Highlights
- Produktspezifikations-Tabelle:
TableProductSpecificationsrendert ein Datenblatt auf Basis vonBasicTable. Jede Zeile trägt einlabelund einen typisiertenvalue(string | number | boolean | Measurement | Money), den die neue UnterkomponenteTableProductSpecificationsValueje Sprache formatiert - Zahlen überIntl.NumberFormat, Wahrheitswerte als lokalisiertes Ja/Nein,Measurementüber$measurement,Moneyüber$money. Ein optionalessectionNamepro Zeile gruppiert die Ausgabe in Abschnitte. Datenseitig steht dahinter die neue kanonische Entity-KomponenteProductSpecifications, modelliert nach schema.orgPropertyValue: Jede Zeile führt neben dem lokalisierten Namen einen optionalenwellKnownNameaus einer offenen Vokabular-Union (material,weight,dimensions,warranty,countryOfOrigin, …), den das Frontend auf ein lokalisiertes Label mit Icon abbildet. Die Werte bleiben typisiert statt vorformatiert, damit Mengen ihre Einheit und Preise ihre Währung mitführen. Die Komponente ist für die Produktdetailseite gedacht, nicht für Listen. - Zwei neue Tabellen-Blöcke für Studio:
BlockTableOpeningHoursundBlockTableProductSpecificationslassen sich jeweils aus einer Query befüllen (die Öffnungszeiten eines Standorts beziehungsweise diespecificationseines Produkts) oder mit manuell erfassten Zeilen - umschaltbar über einen Datenquelle-Schalter - und bieten eineoutlined/plain-Darstellung. Passend dazu istOpeningHoursWeeklyTableaus dem UI Kit nach@laioutr-core/uialsTableOpeningHoursumgezogen und steht jetzt ebenfalls aufBasicTable. - Automatisches Inhaltsverzeichnis für Artikel:
ArticleDetailkann ein aus den H2-Überschriften des Textkörpers erzeugtes Inhaltsverzeichnis anzeigen - als klebrige Seitenleiste auf dem Desktop, als aufklappbares Akkordeon auf dem Mobilgerät. Steuerbar ist das über das Studio-FlagshowTableOfContentsanSectionBlogPostDetail, das standardmäßig aktiv ist. Darunter liegen die neue KomponenteTableOfContents(nummerierte Navigationsliste mit Scroll-Spy für den aktiven Eintrag) und das ComposableuseScrollSpy, die auch eigenständig nutzbar sind. - EU-Widerrufsbutton:
WithdrawalFormrendert ein Formular für die Ausübung des gesetzlichen Widerrufsrechts mit genau den drei rechtlich zulässigen Feldern (Name, Bestell- beziehungsweise Vertragsreferenz, E-Mail) samt clientseitiger Validierung.BlockWithdrawalButtonmacht daraus einen in Studio konfigurierbaren Button, der das Formular in einem Dialog öffnet und die Aktionecommerce/legal/withdrawalauslöst. Damit der Button dort landen kann, wo er hingehört, habenFooterundSectionFootereinenbottomContent-Slot für die untere Fußzeilen-Reihe bekommen. Einwithdrawal-Locale-Namespace (Deutsch und Englisch) liefert die Standardbeschriftungen und Validierungsmeldungen. - Glossar-Detailseite:
SectionGlossaryDetailist die Leseansicht für einen einzelnen Glossareintrag. Sie bindet diebase- undcontent-Komponenten derGlossary-Entität und rendert sie über dieselbeArticleDetail-Komponente wie die Blog-Post-Sektion - mit abgeschaltetem Social-Share. - Gutschein-Box auf der Produktdetailseite:
BlockProductDetailCouponBoxist ein nicht eigenständiger Block für den Inhalts-Slot der Produktdetail-Sektion. Er umschließtCouponBoxmit im Editor konfigurierbarem Text, Code, optionalem Rabatt-Badge und Icon und ist fest aufaction="copy"gesetzt, sodass Kundinnen und Kunden den Code in die Zwischenablage kopieren. Einvariant-Schalter wechselt zwischen der Standard- und der Promotion-Code-Darstellung. - Reaktive Dialog- und Toast-Inhalte:
openDialogundaddToastnehmen ihren Inhalt jetzt auch als Ref oder Getter entgegen (MaybeRefOrGetter<…>). Titel, Beschreibung und weitere Felder eines geöffneten Dialogs oder Toasts bleiben damit reaktiv -openDialog(() => ({ title: t('...'), ... }))rendert bei einem Sprach- oder Prop-Wechsel neu. Ein einfaches Objekt zu übergeben funktioniert unverändert.addToastgibt zusätzlich dieiddes neuen Toasts zurück, passend zuopenDialog. - Textfarbe für Menüeinträge:
MenuBasicItem,MegaMenuItemundNavigationNodetragen jetzt eine optionaletextColor, die die aus dem Oberflächen-Ton abgeleitete Beschriftungsfarbe eines Menüeintrags oder Triggers überschreibt. In Studio steht dafür anBlockMenuBasic,BlockMenuSideBySideundBlockMegaMenuein Farbwähler pro Eintrag bereit; für Einträge aus einer CMS-Query wird er nicht angeboten. - Neue Layout- und Abstands-Steuerungen: Die Banner-Sektionen (
BannerBasic,BannerIntegrated,BannerShowcase) haben unter Design → Layout eine Content Padding-Steuerung erhalten (default/m/s/none),SectionMediaTexteine Padding-Steuerung (keine/S/M/L). Ohne gesetzten Wert rendern bestehende Sektionen unverändert. Im UI Kit hatGridFilljustify- undalign-Props bekommen,Inputeineplain-Variante für Felder auf bereits gestalteten Oberflächen, undEmailInputFormreicht einevariant(boxed/plain) durch, damit Newsletter-Anmeldungen in Fußzeilen und Pop-ups bündig auf farbigem Grund sitzen. - Studio-Picker mit Paket-Tabs: Sektionen und Blöcke tragen jetzt
studio.package- undstudio.kit-Metadaten, über die der Studio-Picker sie in Paket-Tabs gruppiert und nach Kit filtert. Sämtliche eingebauten Beschreibungen wurden dabei überarbeitet, sodass der Picker-Text die nicht offensichtlichen Fähigkeiten und Datenbindungen einer Komponente mitträgt.
Fehlerbehebungen & Verbesserungen
- Formularfelder innerhalb von
<Field>erben jetzt dessendisabled-,readonly-,required- undinvalid-Zustand. Zuvor wurden diese stillschweigend verworfen (nuridunderrorMessagewurden durchgereicht), sodass ein Feld in<Field disabled>weiterhin bedienbar blieb. Ein Steuerelement ist jetzt in diesem Zustand, wenn entweder sein eigener Prop oder das umgebende<Field>ihn setzt - analog zu nativem<fieldset disabled>. - Der
$unitPrice-Formatter ist jetzt als Auto-Import registriert und damit sowohl als Template-Global als auch aus#importsverfügbar. Zuvor war er nur im Runtime-Plugin verdrahtet, sodass Typprüfungen in ProjektenProperty '$unitPrice' does not existmeldeten, obwohl er zur Laufzeit funktionierte. - Behoben: Die
Container-Ausrichtung war im Sizing-Modus „Greedy First" gespiegelt.Containerbildet seine zweidimensionalealignmentjetzt auf die logischenjustify/align-Props vonGridFillab, und die Achsen-Umkehr wird inGridFillselbst behandelt. - Behoben:
BlockButtonmit Breite „Hug" dehnte sich innerhalb von Media & Text auf die volle Spaltenbreite. - Behoben: Die Medienspalte von
NewsletterRegistrationfiel in sich zusammen; das E-Mail-Feld nutzt jetzt dieplain-Darstellung. - Behoben: Gruppeninhalte im
AlphabeticalIndexsind jetzt oben ausgerichtet, sodass unterschiedlich hohe Spalten an ihrer Oberkante abschließen. - Behoben:
.location-finder--boxedbegrenzt sich ab dem--lg-Breakpoint auf--container-max-widthund zentriert sich, statt auf dem Desktop über die volle Breite zu laufen. - Behoben:
LocationFinderMapbündeltvue3-google-mapüber ViteoptimizeDepsvor, womit ESM-Export-Fehler in der Entwicklungsumgebung entfallen. - Behoben: Das fehlende Vorschaubild für den Produkt-Slider wurde ergänzt, sodass der Studio-Picker jetzt eine Vorschau statt eines toten Bildlinks zeigt.
Hinweise für Entwickler (Breaking Changes)
DescriptionList→BasicTable:DescriptionListheißt jetztBasicTable,DescriptionListItemheißtBasicTableRow.BasicTablerendert als semantische Beschreibungsliste (<dl>mit<dt>/<dd>) statt als präsentationale<div>s, und die Beschriftungsspalte ist über die öffentliche Custom-Property--basic-table-label-colüberschreibbar. Layout und CSS-Oberfläche (.basic-table-Wurzelklasse, BEM-Klassen) bleiben unverändert.OpeningHoursWeeklyTable→TableOpeningHours: Die Komponente ist aus dem UI Kit nach@laioutr-core/uiumgezogen, steht aufBasicTableund hat einevariant(outlined/plain) bekommen. Die Wochentags-Gruppierung ist unverändert. Import künftig aus#ui/components/TableOpeningHours/TableOpeningHours.vue.BlogPostDetail→ArticleDetail: Die Komponente wurde umbenannt und zur gemeinsamen Leseansicht hinter der Blog-Post- und der Glossar-Sektion befördert. Einen abwärtskompatiblen Alias gibt es nicht -<LBlogPostDetail>wird zu<LArticleDetail>. Zusätzlich hatArticleDetailein optionalesshowSocialShare(Vorgabefalse) für die abschließendeSocialShare-Reihe bekommen.SectionGlossaryList→SectionGlossaryListing: Der Studio-Komponenten-String hat sich geändert und es wurde keine Datenmigration ausgeliefert - gespeicherte Sektionen müssen neu hinzugefügt werden. Passend dazu heißt der Locale-Namespace jetztsectionGlossaryListing(SchlüsselsectionGlossaryListing.heading); eigene Locales, die den alten Namespace überschreiben, müssen umbenannt werden.ai-Metadaten: Wie unter Frontend Core beschrieben - die freie{ label, description }-Form, dieai-descriptions/*.md-Dateien undaiDescription()sind entfallen.
Nicht betroffen: Die Container-Style-Steuerung von SectionLocationFinder ist auf das gemeinsame containerStyleField-Toggle umgestellt worden. Feldname (containerStyle) und gespeicherte Werte ('full-width' | 'boxed') bleiben gleich, die Migration ist datensicher.
CLI v0.4.1
- Die Deployment-Logs folgen jetzt den CLI-Ausgabekonventionen, HTTP-Fehler sind handlungsleitend formuliert und berücksichtigen Timeouts, und die CLI schickt einen versionierten API-User-Agent mit.
- Flags werden auf Kebab-Case umgestellt; die bisherigen camelCase-Schreibweisen bleiben als abgekündigte Aliasse erhalten.
Cockpit (Studio) Juli 2026
Highlights
- Content-Vorschau im Studio: In den Projekteinstellungen lässt sich ein Content-Preview-Token erzeugen; mit dem Befehl „Show Preview Content" zeigt Studio anschließend unveröffentlichte Inhalte an. Neue Projekte bringen ein Token bereits mit, neu ausgestellte Tokens tragen das Präfix
pvtk_(bereits ausgegebene funktionieren unverändert weiter). Ist das im Projekt ausgerollte Frontend Core zu alt, um die Vorschau zu unterstützen, ist der Befehl deaktiviert und ein Tooltip nennt die benötigte Version. Ergänzend führt in den Projekteinstellungen ein „Open Preview"-Link die live ausgelieferte Storefront im Vorschaumodus in einem neuen Tab auf, sobald das Projekt einen bereitgestellten Host hat. - Präzisere Vorschau-Daten-Auswahl: Die Auswahl der Vorschau-Daten zeigt jetzt Icon und Namen der liefernden App und benennt das vorgeschaute Produkt, statt dessen rohe URL-Parameter anzuzeigen - und zwar sofort nach der Auswahl. Sie verfolgt außerdem, welche Seite gerade in der Vorschau steht: Ein Klick auf einen Link in der Vorschau aktualisiert die Auswahl auf die neue Seite, auch bei Shops, deren Produkt-URLs über mehrere Pfadsegmente laufen.
- Seiten direkt im Link-Picker auswählen: Im Link-Picker lässt sich jetzt eine konkrete Seite auswählen; die manuelle Parametereingabe bleibt daneben bestehen. Die Vorschau- und Link-Seitenauswahl spricht dabei von „Seite" statt wie bisher von „Instanz".
- Sektions-Picker mit Paket-Tabs: „Add a Section" gruppiert die Sektionen jetzt in Paket-Tabs und filtert sie nach Kit.
- Bessere Seitenkomposition durch KI-Agenten: Studio-KI-Agenten bauen vollständigere Seiten, weil sie sich an Kompositionsmustern aus dem Produktivbetrieb orientieren.
- npm-Registry-Login vom Terminal: Die Anmeldung an der npm-Registry funktioniert jetzt per
npm login --auth-type=web. Die eigenen Registry-Web-Login-Sitzungen lassen sich in den Sicherheitseinstellungen des Kontos einsehen und widerrufen, und der Anmeldebildschirm der Registry entspricht jetzt dem Erscheinungsbild der App. Die Projekteinstellungen verlinken auf die Organisations-API-Schlüssel für den Registry-Zugriff, abgelaufene API-Schlüssel werden in der Tabelle abgeblendet dargestellt, und der Projekt-Secret-Key lässt sich dort direkt kopieren. - Medien-Auswahl mit Fokuspunkt für Videos: Der Fokuspunkt-Wähler funktioniert jetzt auch für Videoquellen, nicht mehr nur für Bilder. Die Medienbibliotheks-Auswahl zeigt außerdem das Icon jeder Bibliothek neben ihrem Namen.
Fehlerbehebungen & Verbesserungen
- Behoben: KI-Agenten konnten sich nicht mit dem Studio-MCP-Server verbinden, weil die vom Server angekündigte OAuth-Discovery-URL auf eine nicht existierende Seite zeigte und die Autorisierung damit nie abschließen konnte.
- Behoben: Medienfelder zeigen jetzt klarere Dateiangaben und bleiben über verschiedene Frontend-Versionen hinweg zuverlässig. Uploads aktualisieren sich sofort, fehlgeschlagene Uploads lassen sich erneut versuchen, und SVGs werden sicher gerendert.
- Behoben: SVG-Medienvorschauen wurden auf Containergröße gerendert, statt in sich zusammenzufallen.
- Behoben: Die Dropdowns der Medien-Auswahl blitzten keinen Fokusring mehr auf; Bibliotheken ohne Namen zeigen ihre ID.
- Behoben: Fehlende oder defekte Vorschaubilder in der Sektions- und Block-Auswahl zeigen jetzt einen Platzhalter.
- Behoben: Die Auswahl der dynamischen Datenquelle zeigt das Icon der App, die den jeweiligen Wert tatsächlich liefert - auch wenn mehrere Apps dieselben Daten bereitstellen.
- Behoben: Die Datenquellen-Optionen im Query-Picker richten sich jetzt nach dem in Studio gewählten Markt.
- Behoben: Die Vorschau-Daten folgen jetzt auch Links auf der Seite, die einen Query-String oder akzentuierte Zeichen enthalten.
- Behoben: Das Markt-Domain-Feld zeigte fälschlich ein vorangestelltes „laioutr.com.".
- Behoben: Wer sich über einen Link auf eine bestimmte Seite (etwa eine Studio-URL) anmeldet, landet jetzt auf dieser Seite statt auf einer „Nicht gefunden"-Meldung.
Hinweis für Entwickler (Breaking Change im MCP-Server)
- Das MCP-Tool
studio_set_static_propheißt jetztstudio_set_static_propsund schreibt mehrere Props in einem Aufruf. Relevant für alle, die eigene Agenten-Integrationen gegen den Studio-MCP-Server gebaut haben.
Die vollständigen Changelogs mit allen technischen Details findest du unter .
Weiterführend bei Laioutr
Mehr zur Laioutr-Plattform: Agentic Frontend Management Platform · Composable Visual Page Builder