Skip to content

Instantly share code, notes, and snippets.

@screeny05
Created July 7, 2026 16:42
Show Gist options
  • Select an option

  • Save screeny05/e4e49923465d405e48b4392d16bb6194 to your computer and use it in GitHub Desktop.

Select an option

Save screeny05/e4e49923465d405e48b4392d16bb6194 to your computer and use it in GitHub Desktop.
Canonical-Types 0.25.0 & UI 2.6.0

Release notes

UI 2.6.0

Minor Changes

  • openDialog and addToast now 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.

    addToast additionally returns the new toast's id (matching openDialog), and the toaster store's toasts is now a resolved computed rather than a writable ref (it was already only read internally).

  • Add TableOfContents component (numbered nav list with scroll-spy active-item tracking) and the underlying useScrollSpy composable.

  • 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 the ecommerce/legal/withdrawal action. Footer (ui) and SectionFooter (ui-app) gain a bottomContent slot so the button (or any block) can be placed in the footer's bottom row. A withdrawal locale 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 showTableOfContents Studio feature flag to SectionBlogPostDetail, defaulting to on, to control the new auto-generated table of contents.

Patch Changes

  • Form inputs placed inside <Field> now inherit the field's disabled, readonly, required, and invalid state. Previously these were silently dropped (only id and errorMessage propagated), 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>.

Canonical Types 0.25.0

Minor Changes

  • Add the ecommerce/legal/withdrawal action token (WithdrawalAction) and its WithdrawalActionInput schema: 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 — consumer name, an order/contract identifier (orderReference), and email; output is FeedbackResponse. Consumed by the @laioutr/app-essentials-mailer app and by BlockWithdrawalButton.

Core 0.33.1

Patch Changes

  • content_alignment field 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's axis was 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-left renders as top on a vertical field, left on a horizontal field.
    • Widen (single axis → both): the value is paired with a neutral center for the missing axis — top becomes top-center, left becomes center-left.

    Only a value with no analog on the new axis (an axis swap, e.g. top on 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment