-
openDialogandaddToastnow accept a ref or getter for their content (MaybeRefOrGetter<…>), so a dialog's or toast's title, description, and other fields can stay reactive after it opens — e.g.openDialog(() => ({ title: t('...'), ... }))re-renders on locale or prop changes. Passing a plain object works exactly as before.addToastadditionally returns the new toast'sid(matchingopenDialog), and the toaster store'stoastsis now a resolved computed rather than a writable ref (it was already only read internally). -
Add
TableOfContentscomponent (numbered nav list with scroll-spy active-item tracking) and the underlyinguseScrollSpycomposable. -
Add the EU withdrawal-button feature to the UI layer:
WithdrawalForm(ui) renders a statutory right-of-withdrawal (Widerruf) dialog form with the three legally-permitted fields (name, order/contract reference, email) and client-side validation;BlockWithdrawalButton(ui-app) makes it a Studio-configurable button that opens the form in a dialog and dispatches theecommerce/legal/withdrawalaction.Footer(ui) andSectionFooter(ui-app) gain abottomContentslot so the button (or any block) can be placed in the footer's bottom row. Awithdrawallocale namespace (en/de) supplies the default labels and validation messages. -
Add an optional, auto-generated table of contents to
ArticleDetail, built from the body's H2 headings, with a sticky sidebar on desktop and a collapsible accordion on mobile. -
Add a
showTableOfContentsStudio feature flag toSectionBlogPostDetail, defaulting to on, to control the new auto-generated table of contents.
- Form inputs placed inside
<Field>now inherit the field'sdisabled,readonly,required, andinvalidstate. Previously these were silently dropped (onlyidanderrorMessagepropagated), so a control inside<Field disabled>or<Field :invalid>stayed enabled/valid. A control is now in that state if either its own prop or the surrounding<Field>declares it, matching native<fieldset disabled>.
- Add the
ecommerce/legal/withdrawalaction token (WithdrawalAction) and itsWithdrawalActionInputschema: the canonical contract for the EU statutory right-of-withdrawal button (Widerrufsbutton, § 356a BGB / Art. 11a Directive 2011/83/EU). Input carries the three fields a trader may require — consumername, an order/contract identifier (orderReference), andemail; output isFeedbackResponse. Consumed by the@laioutr/app-essentials-mailerapp and byBlockWithdrawalButton.
-
content_alignmentfield values that fall outside the field's axis-derived set are now healed when resolving render props, instead of passing through. A value already in the set is unchanged. When a field'saxiswas changed after the value was stored, the stored value is projected onto the new axis rather than discarded:- Restrict (
both→ single axis): the matching component is kept —top-leftrenders astopon a vertical field,lefton a horizontal field. - Widen (single axis →
both): the value is paired with a neutralcenterfor the missing axis —topbecomestop-center,leftbecomescenter-left.
Only a value with no analog on the new axis (an axis swap, e.g.
topon a horizontal field) or a malformed value (e.g.diagonal) clamps to the field's fallback alignment (center/center-center). Previously any out-of-range value was discarded and replaced with the fallback, silently losing alignment intent the stored value still carried. - Restrict (