UI Changelog
All notable changes to Laioutr UI (@laioutr-core/ui, the commerce-specific organism components built on UI Kit) are documented here, following Keep a Changelog and Semantic Versioning.
2.4.0
Added
- UI Kit —
<Media>gains aplaybackmode for video and audio.playback="background"is a one-switch decorative loop —autoplay,muted,loop,playsinline, anddisablePictureInPictureon,controlsoff — replacing the hand-spelled cluster;interactive(the default) is the native player. Each attribute still has its own prop that overrides the mode.<Media>now exposesv-model:pausedso a consumer can render and position its own pause control (WCAG 2.2.2), and it suppresses autoplay underprefers-reduced-motion: reduce, seeding the paused state from that decision.MediaStageadoptsplayback="background"for video backgrounds; it ships no pause control of its own, so a consumer that needs one renders the background with<Media>directly and bindsv-model:paused. See Rendering video and audio.
2.3.0
Added
- UI —
BlockProductDetailEnergyLabelfor the Product Detail page. Renders the EU energy efficiency label: an inline energy-class badge (opening the full label in a lightbox) and an optional product data sheet link next to the product information. The block queries the product's variants for the newProductVariantEnergyLabelcomponent and renders the label of the selected variant (resolved viauseProductVariantContext, falling back to the first variant). It is non-standalone and placeable in the Product Detail section.
A newProductVariantEnergyLabelentity component (@laioutr-core/canonical-types/entity/product-variant) defines the per-variant shape:badge: Media— small inline energy-class badge image (A–G).label: Media— full-size energy label image, opened in a lightbox.title?: string— human-readable title (e.g. "Energy class A++"), used as the alt text on the badge image. Optional: consumers fall back to a generated name or a translated default.energyClass?: string— energy efficiency class (e.g. "A", "A++"). Free-form string, not an enum, so the type survives the EU periodically rescaling its class vocabulary (regulation 2017/1369).energyClassScaleMax?: string/energyClassScaleMin?: string— the most and least efficient class on the product category's regulated scale.eprelRegistrationNumber?: string— identifier for the variant's entry in the EU EPREL registry.dataSheetLink?: string— optional URL of the product information sheet / data sheet PDF.
The component lives onProductVariantbecause each EU energy label is registered per commercial model in EPREL, keyed by the model identifier / GTIN — which is variant-level. Variants of the same product can carry different energy classes. Adapters (shopify, shopware, ambiendo, etc.) populate this component when the underlying variant carries an EU energy label; variants without the data omit the component and the block renders nothing. Until adapters implement the resolver, the block is placeable but renders nothing in storefronts.
A newEnergyLabelcomponent renders the badge image, lightbox trigger, and optional data sheet link. Props:badge: Media,label: Media,title?: string,dataSheetLink?: string, pluswidth/heightfor the badge image. Whentitleis omitted, the alt text falls back to thepdp.energyLabeltranslation. - UI App —
BlockProductDetailRatingfor the Product Detail section. Renders the product's average star rating, the rating value (x/maxRating), and the review count. The product detail query now fetches theProductRatingcomponent so any PDP block can readproduct.components.rating. - UI Kit —
Countdowncomponent (#ui-kit/components/Countdown/Countdown.vue) and auseCountdowncomposable for editorial countdowns. Unit labels come fromIntl.NumberFormat, so they are localized and plural-aware automatically; theunitDisplayprop ('long' | 'short' | 'narrow') sets their verbosity.Countdownalso takes an optional frozennow(for tests/Storybook), and a purecomputeCountdown(endDate, now)helper is exported. Addscountdown.expiredandpromotionBanner.{codeCopiedTitle,codeCopiedSubline,copyCodeAriaLabel}locale entries (EN + DE).useNownow accepts an optional tick interval —useNow(intervalMs = 60_000)— and is seeded viauseState, so the shared clock renders byte-identically across SSR and hydration; consumers no longer needdata-allow-mismatchon time-dependent nodes. - UI —
PromotionBanner(moved here from UI Kit because promo-codes + checkout language are commerce-domain). Accepts headings, optional countdown (viauseCountdown), a promo-code copy button, a CTA, and a surface preset (default | pale | bright | solid) orcustomcolors with per-slot overrides (background / text / countdown / icon). It auto-promotesvariantto'custom'when anycustomColorsfield is set, and adds@vueuse/coreas a dependency. - UI App —
SectionPromotionBanner, registered in theBannerstemplate list. WrapsPromotionBannerfor canonical margin / padding / container-style chrome, with Content (heading, subline, icon, code button, CTA, countdown) and Design (styling + layout) panels. The promotion banner is configured directly on the Section — there is noBlockPromotionBanner. - UI — Plumbed
target?: stringthrough link-rendering components so consumers can choose the browsing context of editorial links. Default behaviour is unchanged whentargetis omitted (_self):BrandList—BrandListItem.targetcarries through to the per-brandNuxtLink.HeaderBasic— newlogoTargetprop on the logo link.HeaderShop— newlogoTargetprop on the logo link.LogoSlider/LogoGrid/LogoSliderSlide—LogoSliderSlideProps.targetforwards to the slide'sMaybeLink.TopBar—informationLinks[].targetforwards to each navigation item.
- UI Kit —
target?: stringprop onLinkTile,LinkTileBasic,LinkTileCompact,LinkTileBig, andNavigationMenuTextItem. Forwarded to the underlyingNuxtLink/MaybeLinkto open the link in a new browsing context (_blank), with_selfremaining the default. - UI App — Editors can now choose a link
target(_self/_blank, default_self) in Studio across single-link Blocks and Sections, via the newlinkTargetOptionsshared field. NewTargetfields onBlockButton,BlockCategoryCard,BlockLogoSliderSlide; per-itemTargetonSectionBrandList.brandLinksandSectionTopBar.informationLinks;Logo Link TargetonSectionHeaderBasicandSectionHeaderShop. Existing configurations are unchanged — the runtime default_selfmatches prior behaviour. - UI Kit —
sectionBrandList.headingandsectionGlossaryList.headingtranslation keys (EN: "Brands"/"Glossary", DE: "Marken"/"Glossar"). These act as the locale-aware fallback heading when an editor leaves the section'sheadingfield empty. - UI App —
SectionGlossaryList, with a newglossaryQueryshared field. Renders a shared alphabetical index of name + link entries, sourced either from a bound Hygraph data source (any app registering aGlossaryentity) or from a manually authoreditemsarray. A configurableheadingfield falls back to a locale-aware default when left empty. - UI Kit —
rel?: stringprop onButtonandIconButton. Forwarded to the underlyingNuxtLinkonly when the component renders as a link (hrefset), ignored when rendered as a<button>. Accepts any valid HTMLreltoken or space-separated combination — e.g.'prev','next','noopener','noopener noreferrer','external nofollow'. - UI App —
SectionLocationFinder,SectionLocationDetail, andBlockLocationCard.SectionLocationFinderresolves locations via the new canonicalLocationentity and renders a finder with a configurable heading, container style, and Google Maps Map ID; it also exposes alocationCardsslot for manually curatedBlockLocationCardinstances merged into the same list and map.SectionLocationDetailrenders the full location page — map, header, image gallery, info list, and a rich description.BlockLocationCardis non-standalone (only usable insideSectionLocationFinder'slocationCardsslot); cards without coordinates are silently dropped. Both sections read the Google Maps API promise fromuseNuxtApp().$googleMapsApiand render inert until the storefront registers that plugin.
Changed
- UI Kit —
Mediais now a dispatcher. Images render via the built-in image renderer (unchanged public prop API and DOM/CSS output). Video and audio now render via new built-in native renderers:MediaVideo(native<video>) andMediaAudio(native<audio>with the optionalcovershown above it). AMediavalue of any type renders out of the box with no registration. Playback is controlled by new flat props on<Media>, mirroring the HTML attributes 1:1:controls(defaulttrue),autoplay,muted,loop,playsinline(defaultfalse). These are set by the consuming Block, not carried on theMediavalue. Consumers can override the built-in renderer for a media type (e.g. for HLS/DASH or a custom player):// plugins/media-renderers.ts import { provideMediaRenderers } from '#ui-kit/components/Media/MediaRenderersProvider'; import VidstackMedia from '../components/VidstackMedia.vue'; export default defineNuxtPlugin((nuxtApp) => { provideMediaRenderers(nuxtApp.vueApp, { video: VidstackMedia, audio: VidstackMedia }); });MediaStagenow drives its background<Media>as a decorative loop (autoplay muted loop playsinline,controls={false}); a picked video plays silently and loops behind the foreground content.MediaVideosuppressesautoplaywhen the user prefers reduced motion (prefers-reduced-motion: reduce), settling on theposterframe instead. - UI App — The
media/backgroundImage/bannerImagefields of the banner and media sections and blocks now accept bothimageandvideoassets (previously image-only). Affected:BlockBannerBasic,BlockBannerIntegrated,BlockBannerShowcase,BlockCategoryCard,SectionBannerBasic,SectionBannerIntegrated,SectionBannerShowcase,SectionBrandHero(background only),SectionMediaText,SectionProductSliderShowcase.SectionPageNotFoundstays image-only (it renders the asset as a CSSbackground-image, not via<Media>). - UI Kit —
Paginationnow emits SEO-correct sequence semantics whenhrefTemplateis set: the previous/next anchors carryrel="prev"/rel="next"only on edges where the target page actually exists; on the first page the previous control renders as a<button>(nohref), and on the last page the next control does the same, so crawlers don't follow dead links to page 0 or page N+1. - UI — Breaking: Replaced
BrandListwith the genericAlphabeticalIndexcomponent — an alphabetically grouped link list with a configurableheadingand an optional per-itemcount, usable for brands, glossaries, and similar A–Z indexes.// Before interface BrandListProps { brands: { name: string; href: string; count?: number }[]; } // After interface AlphabeticalIndexProps { heading?: string; items: { name: string; href: string; count?: number }[]; }
Upgrade: import from#ui/components/AlphabeticalIndex/AlphabeticalIndex.vue, rename thebrandsprop toitems, and passheadingexplicitly (the old built-in"Brands"translation no longer renders automatically). - UI App — Breaking (
SectionBrandList): thebrandLinksschema field is renamed toitems, and a newheadingtext field is added. BothSectionBrandListandSectionGlossaryListnow render the shared alphabetical index;SectionBrandListkeeps the optional count. Stored configurations referencing the oldbrandLinksname will not migrate automatically.
Removed
- UI Kit — Breaking: the orphaned
brandGrid.titletranslation key — it is no longer referenced anywhere. Consumers that overrode this key in custom locales can delete the override. - UI Kit —
PromotionBannerhas moved to@laioutr-core/ui(promo-codes are commerce-domain). ui-kit no longer exportsPromotionBanner/types— import from@laioutr-core/uiinstead.
Fixed
- UI — Fixed component props that were silently dropped because they didn't match the target component's API:
FeaturePillListpassedleft-icontoBadge(whose prop isicon-left), so pill icons never rendered.OpeningStatusIndicator,OpeningStatusDetail,LocationCard,LocationFinder, andLocationHeaderpassedvarianttoText, which has novariantprop. Headings usingvariant="heading"rendered with the defaultbodystyling.FilterBarboundv-model:opentoFilterOffCanvas, which exposesv-model:isOpen— the off-canvas filter panel could not be opened.PromotionBannerpassed an invalidtype="text"toButton; the dead attribute was removed.
2.2.3
Added
- UI Kit —
$unitPricei18n formatter that renders aUnitPriceas a localizedprice / referencestring (e.g.13.99 € / 100 ml), composing the existing$moneyand$measurementformatters. Available as a template global alongside$money/$measurement, and used internally byVariantSelectionCard.
Changed
- UI —
PriceInfo,ProductTileBasic, andCartListItemnow render their unit price via the new$unitPriceformatter instead of inlining$money(...) / $measurement(...). No visual change — the rendered string and each component's BEM classes are unchanged.
Fixed
- UI Kit —
.radius-containedcollapsing to square corners on tall elements. Inset banners (BannerBasic,BannerShowcase,BannerIntegrated,BrandHero) now keep their rounded corners regardless of height — previously a banner taller than the viewport width (common at mobile widths) lost its rounding entirely. Full-bleed, edge-to-edge banners still render square. No action required. - UI Kit —
OpeningStatuscomponents and composables now use the sharednowclock.
2.2.2
Changed
- UI —
BackgroundAwareButton's adaptive lookup variants are nowadaptive-primary/adaptive-secondary/adaptive-ghost(previouslyprimary/secondary/ghost), so they no longer shadowButton's literalprimary/secondaryvariants. The pass-through variants (tertiary,secondary-white,ghost-*,glass-*,subtle,info,positive,danger,close-*) are unchanged.
In Studio, the newbackgroundAwareButtonFieldsshared field exposes the threeAdaptive *options alongside the existing literalButtonVariantoptions. Every section and block with a CTA now uses this field — banner sections, the sliders,BlockButton,BlockCard,BlockText, and now also the header, footer email button, 404 page, and pricing-plan card, whose CTAs newly adapt to their surrounding surface tone. Editors opt into per-surface remapping by picking anAdaptive *option.
Breaking: Custom themes that overridebackgroundAwareButtonsindefineTheme/extendThemeneed their map keys renamed accordingly (light:light:primary→light:light:adaptive-primary, same forsecondaryandghostacross alllight|dark×light|dark|brightcombos). Stored Studio CTAs where an editor previously picked "Primary" or "Secondary" will, after upgrade, render as the literal Button variant — the per-surface remap is no longer applied unless the editor re-selects anAdaptive *option. - UI Kit — Breaking:
Scrollbarnow owns its interaction and sizing logic and takesprogress(0..1) andvisibleRatio(0..1) instead ofthumbSize/thumbPosition(px), and emitsupdate:progressinstead oftrack-click/drag-start. It computes thumb size/position, handles drag and track-click, and hides itself when content fits.<!-- Before --> <Scrollbar :thumb-size="120" :thumb-position="40" @track-click="onClick" @drag-start="onDragStart" /> <!-- After --> <Scrollbar :progress="0.3" :visible-ratio="0.25" @update:progress="(progress, source) => …" />sourceis'drag'(continuous) or'click'(jump-to-position).
Fixed
- UI Kit —
SwiperScrollbarthumb mis-sizing and mis-positioning underslidesPerView: 'auto': the thumb now reflects true content size (including gaps and uneven slide widths), dragging tracks the cursor, and clicking the track animates to the nearest slide. No API change forSwiperScrollbarconsumers.
2.2.1
Changed
- UI — Caption styling on
BannerBasic: plain/boxed variant, colour scheme, and text-shadow controls — replacing the previous colour-only override. A newcaptionVariantFieldshared field bundles the controls into a single sidebar group onBlockBannerBasicandSectionProductSliderShowcase.Containerno longer strips border-radius from CTA banners in full-width containers (banners now own their own radius).
Breaking:BannerBasicreplacescaptionColor: stringwithcaptionVariant: Omit<CaptionFlagProps, 'text'>. Migrate inline:// Before <BannerBasic :caption="caption" caption-color="#ff0000" /> // After <BannerBasic :caption="caption" :caption-variant="{ variant: 'plain', textShadow: 'none' }" />
Breaking:SectionProductSliderShowcaseschema replacescaptionStyle.colorwithcaptionVariant. Existing pages with values stored undercaptionStylesilently drop them on next save — re-author the caption styling via the new Variant panel in Studio. - UI — Sizing-system consolidation. A new
Sizerprimitive (in UI Kit) and matchingsizingFieldshared schema route outer-box sizing. Banner blocks (BlockBannerBasic,BlockBannerIntegrated,BlockBannerShowcase) plusBlockMediaandBlockIframenow route outer-box sizing throughSizerinstead of bespoke per-block fields. Banner blocks also gain vertical content alignment (2D on Basic, vertical-only on Integrated).Placeholderaccepts an optionaltextprop.
Breaking:BannerBasicno longer acceptssizing/aspectRatioprops. Wrap in<Sizer>in the consuming Block.
Breaking:BlockMediadropsaspectRatio,height, andorientationschema fields;BlockIframedropsdesktopHeightandmobileHeight. Existing pages with values stored under these names silently drop them on next save — author the desired height via the newsizingfield in Studio.
Removed
- UI Kit — Breaking:
Iframecomponent removed from@laioutr-core/ui-kit. Inline an<iframe class="…" :src :title />directly and letSizer(in your Block) drive the height. - UI Kit — Breaking:
MediaPreviewno longer acceptsaspectRatio,height, ororientation. Wrap in<Sizer :sizing="…">(or any parent that provides a definite height) and letMediaPreviewfill it. Portrait orientation is now done by typing a portraitaspect-ratiodirectly in the schema (e.g.3/4).
Fixed
- UI — Fixed
ProductSliderShowcasepadding and width: the slider no longer reserves bleed padding on the wrapper, the banner respects its container, and the slider fills the remaining row width on desktop. - UI Kit —
SwiperChromemobile navigation positioning.
2.2.0
Added
- UI —
Footeraccepts two new optional props:logoPosition?: 'top' | 'bottom'(default'top') andlogoAlignment?: 'left' | 'center' | 'right'(default'left', only meaningful whenlogoPosition === 'bottom'). WhenlogoPosition === 'bottom', the top logo-column is hidden, menus span the full top row, and the logo image renders inside the bottom bar between the icons cluster and the copyright;logoAlignmentcontrols its placement. Existing behaviour is preserved at the defaults. - UI — Editors can now pick a button size per CTA across every section and block.
buttonFieldsexposes a new Size selector (xs/s/m/l, default'm'), and a newbuttonSizeOptionsexport covers inline button-size selects. Existing CTAs render unchanged unless an editor explicitly picks a different size. For ui consumers building their own CTA shapes, the following accept an optionalsizeon each CTA entry (defaults preserve previous rendering):HeroSlide,PageNotFound,BannerShowcase,ContentGrid,HeaderBasic.ctaButtons[], theContentSlider/CategoryCardSlider/ProductSlidercta types;PlanCardgainsctaVariant/ctaSize. - UI — Forwarded the new
sectionBackground(andcustomSectionBackground) props throughContainerandMediaTexttoBackdrop. Both default to'none', so existing consumers render unchanged. - UI —
HeroSlideaccepts new optional props:headingSize?: 's' | 'm' | 'l',sublineSize?: 's' | 'm' | 'l'(defaults'l'/'m'), andheadingTextShadow?: 'none' | 'soft' | 'strong'/sublineTextShadow?: 'none' | 'soft' | 'strong'(default'none'). The text-shadow values apply a layered shadow for legibility against busy hero backgrounds, resolving from the global--text-shadow-soft/--text-shadow-strongcustom properties. Defaults preserve previous rendering. - UI — Added opening-hours primitives (in UI Kit) and location-card domain components (here):
useOpeningStatuscomposable,OpeningStatusIndicator,OpeningStatusDetail,OpeningStatus,OpeningHoursWeeklyTable, plusLocationCard(list / map-popup variants) andPaymentMethodList. - UI —
NewsletterRegistrationaccepts two new optional props:caption?: string(rendered above the heading) andbody?: string(rendered as a<RichContent>block between the headings group and the form), mirroring the caption + body fields exposed byBlockText. Both are unset by default. - UI — Editor: every section AND block with a configurable heading or subline now exposes an HTML-element selector (
H1–H6/DIVfor headings;P/H1–H6/DIVfor sublines) directly next to the field via theas: 'style'decorator popup — no more separate "SEO" panel. Newly available on 13 sections and 7 blocks; section defaults: heading →h2, subline →div; block defaults: heading →h3, subline →h4. The underlying ui components (BannerBasic,BannerShowcase,BannerIntegrated,BrandHero,CategoryCardSlider,CategoryCardGrid,ContentGrid,ContentSlider,EditorialGrid,HeroSlide,LogoGrid,LogoSlider,NewsletterRegistration,PageHero,PageNotFound,ProductSlider,ProductSliderShowcase,VariantSelectorConfigurator) accept new optionalheadingAs/sublineAsprops (additive). - UI Kit —
CaptionFlagaccepts an optionaltextShadow?: 'none' | 'soft' | 'strong'prop. When'soft'or'strong', a layered text-shadow improves legibility against busy backgrounds. Defaults to'none', so existing consumers render unchanged. The values resolve from two new global CSS custom properties,--text-shadow-softand--text-shadow-strong, so consumers can override them per theme. - UI Kit —
HighlightedTextatom — renders a string with substring matches wrapped in<mark>. Diacritic-insensitive (NFD fold + combining-mark strip), highlights all occurrences, accepts ahighlightClassfor per-instance styling. Replaces the inline highlight loop inInputAutocomplete. - UI Kit — Opening-hours primitives in ui-kit:
useOpeningStatus(openingHours, now)composable (reactiveisOpen+ next state-change event across a 30-day horizon, respecting IANA timezone and one-off date exceptions),OpeningStatusIndicator(open/closed pill),OpeningStatusDetail(localized one-liner),OpeningStatus(Indicator + Detail combined), andOpeningHoursWeeklyTable(weekly schedule as aDescriptionList, grouping consecutive same-hours days). AddsopeningStatus.*,openingHoursWeeklyTable.*, andlocationCard.*i18n keys. (LocationCardandPaymentMethodListland in@laioutr-core/ui.) - UI Kit —
sectionBackground?: BackdropBackgroundprop onBackdrop. When set andcontainerStyle === 'boxed', an outer band element paints edge-to-edge around the constrainedOnSurfaceroot, creating two distinct color zones. Infull-widthmode the band is inert. Accepts the same value space asbackground; defaults to'none', so existing consumers render identically. - UI App — A new Section Background field-pair (
sectionBackground+customSectionBackground) on every section that exposes acontainerStyle+backgroundconfig (17 sections). It paints the edge-to-edge band around a boxed container — visible only inboxedmode, hidden infull-width. Defaults preserve current rendering. - UI Kit —
block?: booleanprop onButton(and through extensionBackgroundAwareButton), defaulting tofalse. Whentrue, the button switches toflex+width: 100%and stretches to its container width. New Storybook story:Block. - UI Kit —
laioutr:beforeModuleRegisterNuxt hook. Fires before the ui-kit module registers each upstream Nuxt module, with{ name, key, options }. Consumers can mutateoptionsto override defaults applied byregisterModule:// nuxt.config.ts export default defineNuxtConfig({ hooks: { 'laioutr:beforeModuleRegister': ({ name, options }) => { if (name === '@nuxt/image') { options.providers = { ...options.providers, customProvider: { /* … */ } }; } }, }, }); - UI App —
SectionContentGrid— hybrid slot/query wrapper.dataSource: 'slot'(default,BlockCardvia thedefaultslot) ordataSource: 'query'(auto-populated from a blog post collection). - UI App — Studio preview images (
previewSrc) for 31 blocks (plus 2 refreshed). Editors browsing the block picker now see a representative illustration for each placeable element. - UI App —
BlockHeroSliderSlidegains per-element text-shadow controls (caption, heading, subline;none/soft/strong, defaultnone) and per-slide text-size controls for heading and subline (S/M/L; defaults headingl, sublinem). Existing stored slides render unchanged.
Changed
- UI —
HeaderBasicMenu→MenuBasic. The component was a generic basic navigation menu (used by bothSectionHeaderBasicandSectionHeaderShop), not a sub-component ofHeaderBasic. Exported typeHeaderProps→MenuBasicProps,MenuItem→MenuBasicItem; root CSS class.header-basic-menu→.menu-basic.
Breaking:BlockMenuHeaderBasic→BlockMenuBasic.defineBlock({ component: 'BlockMenuHeaderBasic' })→'BlockMenuBasic'— stored project configurations that reference this block by name need a one-time migration. Studio label'Basic Header Menu'→'Basic Menu'. - UI — Breaking: the
image?: MediaImageprop onNewsletterRegistrationis removed in favor of a newmediaslot. The right-side / top-on-mobile media area is now consumer-provided via<template #media>...</template>. The legacytheme.image('newsletterRegistrationTeaser')fallback is gone; if no media is provided, the content side takes the full width. - UI — Migrated (2 sections):
SectionProductSlider,SectionProductSliderShowcaselose their dedicated "SEO" fieldset;headingElementis now stored atheadingStyle.element. Action required: anyone with storedheadingElementvalues on these two sections must re-pick the heading element in Studio once. - UI Kit — Breaking:
TextGroupprop and type renames —headingTag→headingAs,sublineTag→sublineAs;TextGroupHeadingTag→TextGroupHeadingAs,TextGroupSublineTag→TextGroupSublineAs.TextGroupSublineAsis widened to include'h1'.SwiperChromegets the same rename plus an addedsublineAs. External consumers that import the old type names or bind:heading-tag/:subline-tagmust update to the new names. - UI Kit — The
highlightMatchutility now returns segments withhighlight: boolean(wasmatched: boolean) and finds every occurrence (was only the first). - UI App — Breaking (
BlockButton): the singleiconfield is replaced byiconLeftandiconRight. Stored configs using the oldiconkey must migrate toiconRightto preserve the original right-aligned visual. A newwidthfield (hugdefault /fill) is added, and the schema is reorganized into Content and Design panels. - UI App —
SectionContentSlidernow accepts the three banner blocks (BlockBannerBasic,BlockBannerIntegrated,BlockBannerShowcase) andBlockTextin its slot, alongside the existingBlockCard/BlockMedia. - UI App —
SectionProductSlidernow exposes the standardbackgroundandcustomBackgroundcontrols in Design → Styling. - UI App — Rewrote
studio.label,description, andtagsfor all 36 sections and 37 blocks so the copy reads naturally to UX designers and e-commerce managers in Studio — removing implementation jargon and giving several blocks clearer labels (e.g.BlockIframe→ "Embedded Page",BlockMedia→ "Image or Video",BlockProductDetailCartButton→ "Add to Cart",BlockText→ "Text Block"). No runtime behavior change. - UI — Removed the strawberry-field theme.
Fixed
- UI — Fixed
FilterOffCanvas/FilterModalfilter selections never reaching the parent'sselectedFilters. Three inner filter components had moved to the canonicalmodelValuechannel, so the parent's:checkedbinding fell through as a raw HTML attribute and@update:checkedwas never emitted — brand checkboxes did not toggle, the price-range slider receivedchecked="[object Object]", and the stock-filter switch toggled visually but never propagated.
Breaking:FilterOffCanvasSwatchList's v-model channel is renamed from'checked'to the defaultmodelValue. Consumers usingv-model:checked="…"must switch tov-model="…". - UI —
SearchAutoSuggestItemnow uses the sharedHighlightedTextatom instead of its own inline highlighting, picking up diacritic-insensitive matching and all-occurrences highlighting. Visual output is unchanged. - UI Kit —
Card's body text not visually centering or end-aligning whentextAlignmentis set — the capped-width body box now follows the chosen alignment viaalign-self, matching the caption/heading/subline. - UI App —
SectionMediaTextcustom background. When an editor picked a custom color, nothing rendered because the value was passed to a non-existent prop. The custom color is now resolved intobackgrounddirectly. Preset values (none,pale,solid,default) keep working unchanged.
2.1.0
Added
- UI — Restored banner / category-slider / showcase parity with v1:
BannerBasic: new optionalsizeprop ('s' | 'm' | 'l', default'm') andaspectRatioprop.CategoryCardSlider: new optionalctaprop ({ text, link, variant }).- New
BlockBannerBasic,BlockBannerIntegrated,BlockBannerShowcaseblocks — first-class block versions of the banner trio (previously only available asSectionBanner*).BlockBannerBasicgains an optionalaspectRatioschema field. SectionCategoryCardSlider: new optionalctaschema field withctaVisiblevisibility decorator.SectionProductSliderShowcase: new optionalbannerTextSizeschema field (s/m/l, defaultm).
Changed
- UI —
SectionContentSliderremoved the cosmetic hardcodedsurface-tone="'light'"binding; surface tone now derives from the outerBackdropas intended (no rendering change). - UI — Routed elevation shadows through the
--shadow-s/--shadow-m/--shadow-ldesign tokens instead of hardcodedbox-shadowvalues, so theme overrides take effect on Card, NavigationMenuContent, Select, ContextMenu, DropdownMenu, AlertDialog, Toast, ThemeEditor, PlanCard, PersonaQuote, SearchAutoSuggest, and the variant-selector controls. Default-theme rendering is unchanged. - UI — Reverted HeroSlider height behaviour to v1.
Fixed
- UI Kit —
NavigationMenuTextItemWrapperrendering white text on a light surface when used inside a topbar (inTopbar+surfaceTone="light"). Items now correctly inherit dark text on a light background. AffectsSectionTopBarwith its defaultcolorMode="grey"and any other consumer combininginTopbarwithsurfaceTone="light". No action required.
2.0.0
A large coordinated refactor across the UI layer (UI Kit, UI, and the section/block app layer). This is the major release that unified naming, the surface-tone system, form prop contracts, and the public CSS API. The most consequential consumer-facing changes are summarized below; see the migration sub-sections at the end for diffs.
Added
- UI — New ui components:
Container(backdrop + grid + alignment composition), theMegaMenucompound (MegaMenu+MegaMenuTrigger+MegaMenuContent),BlogPostDetail,ProductDetail,ScrollAnchor,BlogPostListing, aPopUpshell + presets (PopUpInfo,PopUpNewsletter,PopUpPromotion),SortModes, andSearchAutoSuggest(+SearchAutoSuggestItem). - UI — Auto-import prefix unified to
L.@laioutr-core/uinow registers its auto-imported components with prefixL(matching UI Kit) instead ofLui. Every<LuiX>template tag pointing at auicomponent must be renamed to<LX>. Combined with the cross-package moves, consumers can apply a single<Lui→<Lsweep across templates. - UI — New UI-Kit atoms relevant to ui consumers:
IconButton,TextGroup,OnSurface(replacesOnBackground),LinkTile(replacesCategoryCard),HighlightToggle,StatusMessage,MediaStage,BadgePromotion(replacesSavingsBadge),NavLinkItem,NavSectionHeading, and the Swiper widget family moved in fromui. - UI — New sections/blocks:
SectionContentGrid,SectionEditorialGrid,SectionCategoryCardGrid,SectionProductReviews,SectionContentSlider;BlockCategoryCard,BlockUspBannerItem,BlockProductsListing,BlockFilterBar,BlockSortModes,BlockPagination,BlockMobileMenuBasic,BlockMobileMenuShop,BlockMenuSideBySide,BlockMenuHeaderBasic,BlockMegaMenu,BlockProductDetailVariantSelectorOptions. - UI Kit — New components:
IconButton(icon-only button; requiredlabelrendered asaria-label, requiredicon),TextGroup(caption + heading + subline molecule),OnSurface(surface-tone context provider, replacesOnBackground),LinkTile(replacesCategoryCard),HighlightToggle(replacesBillingCycleSwitch),StatusMessage(generic icon-led message, replacesLoginReviewPanel),MediaStage(replacesCtaBannerBase),BadgePromotion(replacesSavingsBadge, redesigned),NavLinkItem(replacesMenuLinkItem),NavSectionHeading(replacesMenuSectionTitle/FooterTitle),SwiperChrome,Iframe(sandboxed wrapper), and the reka-ui atomsTabs,Popover,ContextMenu,Listbox,InputSlider,InputAutocomplete,InputCombobox,InputPin. - UI Kit — New
useSwiperEdgeState()anduseFieldContext(props)composables. The Swiper widget family (SwiperBullets,SwiperNumbers,SwiperNavBar,SwiperArrows,SwiperScrollbar,ThumbnailsSlider) andDarkModeSwitch,StockInfoSummary(wasBuyBoxStockInfo),LanguageSwitcher,RatingProgressBarFilter,CommonSwiper, and theswiperBreakpointshelper move into ui-kit. - UI Kit — Many new locale keys (countdown, pagination, social-share, variant-selection, opening-hours, and more). New CSS tokens
--on-light-*,--on-dark-*,--on-bright-*. - UI App — New sections:
SectionContentGrid(hybrid slot/query),SectionEditorialGrid,SectionCategoryCardGrid,SectionProductReviews(replacing the legacy block-level implementation).SectionContentSlideradopts a hybrid slot/query data source (defaultslot).SectionUspBanneris reshaped: it dropsbannerStyleandcolors(moved to top-levelcolor/iconColor) and extracts itsusps[]into a newitemsslot populated byBlockUspBannerItem. - UI App — New blocks:
BlockCategoryCardandBlockUspBannerItem(non-standalone children);BlockProductsListing,BlockFilterBar,BlockSortModes,BlockPagination(split out of the previous combinedSectionProductListing);BlockMobileMenuBasicandBlockMobileMenuShop(non-standalone, hosted in header sections'mobileslots);BlockMenuSideBySideandBlockMenuHeaderBasic(non-standalone, headerdesktopslots);BlockMegaMenu(thin wrapper around the newMegaMenucompound);BlockProductDetailVariantSelectorOptions.
Changed
- UI — Breaking: extensive component renames in
ui. Final → old names include:HeaderBasic←Header;HeaderShop←ShopHeader;HeroSlider←BasicHeroSlider;HeroSlide←BasicHeroSliderSlide;MobileMenuBasic←MobileMenu;MobileMenuShop←MegaMenuMobile;MenuSideBySide←SideBySideMenu;EditorialGrid←ArticlesGrid;ContentGrid←CardGrid;ContentSlider←GalleryContentSlider;BrandList←BrandGrid;MediaText←CmsImageText;MediaGallery←LightboxGallery;SearchResultHero←SearchResultHeader;PageNotFound←Error404Page;ProductListingGrid←ProductGrid;QuoteCardSlider←QuoteSlider; the BuyBox family renamed toEnergyLabel,BenefitsBox,PriceInfo,CouponBox,QuantityDiscount,ProductTitle,AddToCart; theVariantSelector*/FilterOffCanvas*/PlanCard*families renamed. Every*Propstype, BEM block, and Storybook title follows the new name. - UI — Breaking: surface-tone migration.
BackgroundBrightness→SurfaceTone('light' | 'dark' | 'bright') across the form-input families.OnBackgroundis deleted — useOnSurface+ theuseSurfaceTone()composable.colorToBackgroundrenamed tocolorToSurfaceTone.HeaderBasicMenu'stextColoris replaced bysurfaceTonewith a semantic value flip: oldtext-color="dark"(dark text on light bg) maps to newsurface-tone="light"— invert the value, don't just rename. - UI — Breaking: Button refactor.
Button.typeprop removed (useIconButtonfor icon-only buttons). Sizes'small' | 'medium' | 'large'→'xs' | 's' | 'm' | 'l'(default'm').ButtonVariantflattened to a single 14-value union;'input-field'→'subtle','video-control'removed. Icons move from#iconLeft/#iconRightslots to typediconLeft/iconRightprops. - UI — Breaking: form prop normalization.
Fielddropserror: string(useerrorMessage+invalid);InputisError→invalid;Labelerror→invalid;SwitchandCheckboxv-model channel renamed from'checked'to defaultmodelValue(v-model:checkedcallsites must becomev-model);Selectsizeprop removed (express via:trigger="{ size: 's' }"). - UI — Breaking:
is*prefix sweep. For props where the subject is the component itself, theisprefix is dropped — e.g.Badge.isRounded→rounded,Button.isLoading→loading,Toast.isOpen→open,Pagination.isNavigationNumbers→variant,HeaderBasic.isSticky→sticky,HeroSlider.isFullHeight→fullHeight,CouponBox.isApplied→applied,ProductTileBasic.isAddToCart*→addToCart*. World-state facts (isUserLoggedIn,isSoldOut,isAboveTheFold, etc.) keepis*. - UI — Breaking: TextGroup tag-prop rename.
headingTag/sublineTag→headingAs/sublineAs; typesTextGroupHeadingTag/TextGroupSublineTag→*As.TextGroupSublineAswidened to include'h1'. - UI — Breaking: Studio data migration required for every renamed/deleted section and block component string, every renamed schema field, and every promoted/demoted section ↔ block. Highlights:
- Section renames:
SectionBasicHeader→SectionHeaderBasic,SectionImageAndContent→SectionMediaText,SectionShopHeader→SectionHeaderShop,SectionError404→SectionPageNotFound,SectionPricingPlans→SectionPlanCardSlider,SectionPricingTable→SectionPlanComparisonTable, the banner blocks promoted toSectionBanner*, and more. - Block renames:
BlockBasicHeroSliderSlide→BlockHeroSliderSlide,BlockTestimonial→BlockPersonaQuote,BlockProductGrid→BlockProductsListing,BlockCmsButton→BlockButton,BlockCmsCardContent→BlockCard, etc. - Schema fields normalized to the section-config standard across 30+ sections/blocks:
blockMargin→margin,blockPadding→padding,textAlignment→alignment,headline*→heading*,actionButton[0]→cta+ctaVisible, and thectaButton.variantenum reshaped from 12 to 14 values (e.g.white-ghost→ghost-white,input-fielddropped). - Header refactor:
HeaderBasic/HeaderShopare now slot-based; inline navigation/mobile-menu props (menuItems,mobileMenuItems,navigationMenuItems,socialLinks) are removed and provided viadesktop/mobileslots filled by the hosting Section. MegaMenu(wasMegaMenuDesktop): complete API replacement — oldcolorMode/isOpen/megaMenuItems/contentLayoutprops gone; newitems/surfaceTone/defaultValueprops and splitMegaMenuTrigger/MegaMenuContentcompound parts.
- Section renames:
- UI — Breaking: public CSS class renames following the component renames — e.g.
.cms-image-text*→.media-text*,.brand-grid*→.brand-list*,.shop-header*→.header-shop*,.product-grid*→.product-listing-grid*,.error-404-page*→.page-not-found*,.basic-hero-slider*→.hero-slider*, plusis-state-modifier prefixes dropped (.breadcrumbs-item--is-active→--active,.swatch-chip.is-selected→.swatch-chip--selected).Containeruses.s-scontaineras its root block. - UI — Breaking: locale key renames —
lightboxGallery.*→mediaGallery.*,colorSwatch.*→swatchChip.*,searchInput.*→inputSearch.*,passwordInput.*→inputPassword.*,savingsBadge.*→badgePromotion.*,shopHeader.*→headerShop.*;couponCodeInput.*removed (reusescart.couponCodeandinputSearch.clear). - UI Kit — Breaking —
Buttonrefactor.Button.typeremoved (use the newIconButton). Sizes'small' | 'medium' | 'large'→'xs' | 's' | 'm' | 'l'(default'm').ButtonVariantflattened to a single 14-value union;CtaButtonVariant/IconOnlyButtonVariantremoved.'input-field'→'subtle';'video-control'removed. Legacy alias layer dropped (LegacyButtonVariant,normalizeButtonVariant,VARIANT_ALIASES, …).iconLeft/iconRightnow acceptIconNameprops instead of#iconLeft/#iconRightslots.isLoading→loading; newspinnerType?: 'row' | 'round'.BackgroundAwareButtonVariantrebuilt to mirror the new shape — theme-levelbackgroundAwareButtonsmaps must rewrite their value entries. - UI Kit — Breaking — surface-tone migration.
OnBackgrounddeleted; useOnSurface+useSurfaceTone()(useSurfaceTone(props)resolves explicit prop > nearest ancestor context >'light').BackgroundBrightnesstype removed in favor ofSurfaceTone('light' | 'dark' | 'bright') across the Field, Input, Switch, Select, Checkbox,InputRadio, and Swatch families.colorToBackground→colorToSurfaceTone.Backdrop'scontainerBackgroundandbackgroundBrightnessprops removed — pass:backgrounddirectly.MediaPreview'smodeprop →surfaceTone.provideSurfaceToneContext→ internal_provideSurfaceToneContext(only<OnSurface>may set tone publicly). - UI Kit — Breaking — form prop normalization.
Fielddropserror: string(useerrorMessage+invalid).Input/InputAutocomplete/InputCombobox:isError→invalid.Label:error: boolean→invalid: boolean.SwitchandCheckbox: v-model channelchecked→ defaultmodelValue(v-model:checkedcall sites must becomev-model);Switchsize'small' | 'medium'→'s' | 'm'.Selectsizeprop removed (use:trigger="{ size: 's' }").InputPassword:readOnly→readonly. - UI Kit — Breaking —
is*prefix renames (dropiswhere the component is the subject):Badge.isRounded→rounded,Button.isLoading→loading,Label.isRequired→required,ThumbnailsSlider.isCentered→centered,Toast.isOpen→open,LinkTileBig.isBackgroundDark→backgroundDark,Pagination.isNavigationNumbers→variant: 'arrows' | 'numbers',OptionTileImage/OptionTileTextnotAvailableobject flattened tounavailable?+unavailableTooltip?. - UI Kit — Breaking — other prop / API changes.
Accordion.accordionStyle→variant.LoadingSpinner:type→variant, colorvariant→colorScheme, size'small' | 'large'→'s' | 'l'.IconListsize scale →'xs' | 's' | 'm'.Cardredesigned (size →'m' | 'l', many new props,Card/types.tsdeleted — importCardProps/CardCtafromCard.vue).BadgePromotionprops redesigned (BEM root.badge-promotion).Sheetdropscomponent/customClass. Various banner-refactor changes (variantprop removed from the three banners; border-radius now context-driven via.radius-contained).reka-uibumped^2.3.1→^2.9.6. - UI Kit — Numerous BEM/CSS class renames and the removal of
<style scoped>/:deep()/:global()across many components (full diff preserved below). - UI App — Breaking — section renames (Studio data migration required):
SectionBasicHeader→SectionHeaderBasic;SectionBasicHeroSlider→SectionHeroSlider;SectionImageAndContent→SectionMediaText;SectionTestimonialPersonaQuote→SectionPersonaQuoteSlider;SectionTestimonialQuoteCardSlider→SectionQuoteCardSlider;SectionBrandLink→SectionBrandList;SectionSearchResultHeader→SectionSearchResultHero;SectionPricingPlans→SectionPlanCardSlider;SectionPricingTable→SectionPlanComparisonTable;SectionPageHeader/SectionCategoryHeader→SectionPageHero;SectionShopHeader→SectionHeaderShop;SectionError404→SectionPageNotFound;SectionProductDetailContainer→SectionProductDetail;SectionLogoPresentation→ split intoSectionLogoSlider/SectionLogoGridby the oldviewdiscriminator;BlockCtaBanner{Basic,Integrated,Showcase}→ promoted toSectionBanner{Basic,Integrated,Showcase};SectionBannerContainer→ consolidated intoSectionContainer. - UI App — Breaking — block renames (Studio data migration required):
BlockBasicHeroSliderSlide→BlockHeroSliderSlide;BlockTestimonial→BlockPersonaQuote;BlockProductGrid→BlockProductsListing;BlockQueryPagination→BlockPagination;BlockQuerySorting→BlockSortModes;BlockCmsButton→BlockButton(Studio labelCMS Button→Button);BlockCmsCardContent→BlockCard;BlockSingleLogoPresentation→BlockLogoSliderSlide. - UI App — Breaking — schema field renames (Studio data migration required) normalized across 30+ sections/blocks to the section-config standard, including:
blockMargin→margin;blockPadding/innerBlockPadding→padding;textAlignment/contentPosition/contentAlignment→alignment;headline*→heading*;actionButton[0]→ctaobject +ctaVisible;accordionStyle(BlockAccordion) →variant;image(SectionNewsletterRegistration) →media;BlockIframe.url→src;SectionScrollAnchor.id→anchorName;SectionPageHero.title→heading; plus many per-section renames onSectionTopBar,SectionFooter,SectionProductSlider,SectionProductSliderShowcase,SectionCategoryCardSlider,SectionQuoteCardSlider, and others.is*-prefixed schema fields (isSticky,isSaleDesign) are kept unchanged so stored configurations continue to bind without migration. - UI App — Breaking —
ctaButton.variantvalue remap (Studio data migration required): the CTA variant enum was reshaped from 12 to 14 values. Notable remaps:white-ghost→ghost-white;white-secondary→secondary-white;black-ghost→ghost-black;white-close→close-white;black-close→close-black;glass→glass-black(verify with design);input-field→ dropped (map tosubtleor drop);black-close-always-black/white-close-always-whitelose their always-color semantics. New variants without a predecessor:tertiary,positive,danger,subtle,info. - UI App — New shared-field presets in
shared-fields/:background.ts,margin.ts,padding.ts,size.ts,visibility.ts,buttonVariant.ts,themedStyleColor.ts,button.ts,containerStyle.ts,headingElement.ts,surfaceTone.ts. Top-level panels normalized toContent+Design(withStyling/Layoutdividers) across 30+ sections/blocks. - UI App —
SectionBlogPostDetail,SectionProductDetail,SectionScrollAnchor,SectionBlogPostListing,SectionMediaText,BlockMedia, andBlockIframeare now thin configuration adapters over theiruicomponents, with no schema changes.
Removed
- UI — Breaking:
BuyBox(static demo), theInpageNavigation*family (covered byCategoryCardGrid/CategoryCardSlider),CmsContainer/ContainerContent,PageHeader,CategoryNodeButton,LightboxModal(useLightboxfrom UI Kit),FilterBarQuickFilters,MobileMenuButtonGrid,GridCardContent/GridCardTextContent, andFooterMenuItem/FooterTitle(replaced byNavLinkItem/NavSectionHeading). - UI — Breaking: components moved to UI Kit —
Card,Iframe,DarkModeSwitch,BuyBoxStockInfo,LanguageSwitcher;Media(importMediaPreviewdirectly). - UI — Breaking: sections/blocks deleted with Studio migration —
SectionBlogSlider/SectionFlexibleContentSlider→SectionContentSlider;SectionCardGrid→SectionContentGrid;SectionInpageNavigation*→SectionCategoryCardGrid/SectionCategoryCardSlider;SectionFilterBar(now block-only asBlockFilterBar);SectionShopHeaderNavigation(demoted intoBlockMenuSideBySide);BlockProductReviews→SectionProductReviews. - UI Kit — Breaking:
OnBackground(useOnSurface),BillingCycleSwitch(useHighlightToggle),CategoryCard(useLinkTile),Breadcrumb(moved to ui asBreadcrumbsItem),Menubar,Stepper,HoverCard,DiscountFlag(useBadge),SavingsBadge(useBadgePromotion),SwiperNavigationNumbersWithArrows(useSwiperNavBarwithnavigationStyle="numbers"). - UI Kit — Moved out to
@laioutr-core/ui:LightboxGallery(→MediaGallery),SearchResultHeader(→SearchResultHero),ReviewForm,SocialShare,NavigationNodeButton(→MenuSideBySideNode). - UI App — Breaking (Studio data migration required):
SectionBlogSliderandSectionFlexibleContentSlider→SectionContentSlider;SectionTestimonialQuoteCard→SectionQuoteCardSlider(single slide);SectionCardGrid→SectionContentGrid;SectionInpageNavigationBasic/Big/Compact→SectionCategoryCardGrid/SectionCategoryCardSlider;SectionAmbiendoHeader→SectionHeaderShopwithBlockMenuSideBySide;SectionShopHeaderNavigation→ demoted intoBlockMenuSideBySide;BlockProductReviews→SectionProductReviews;SectionFilterBar→ block-onlyBlockFilterBar.
Migration — imports and template tags (UI Kit)
- import OnBackground from '#ui-kit/components/OnBackground/OnBackground.vue';
+ import OnSurface from '#ui-kit/components/OnSurface/OnSurface.vue';
- import { colorToBackground } from '#ui-kit/imports/colorToBackground';
+ import { colorToSurfaceTone } from '#ui-kit/imports/colorToSurfaceTone';
- import LightboxGallery from '#ui/components/LightboxGallery/LightboxGallery.vue';
+ import MediaGallery from '#ui/components/MediaGallery/MediaGallery.vue';
- import LoginReviewPanel from '#ui-kit/components/LoginReviewPanel/LoginReviewPanel.vue';
+ import StatusMessage from '#ui-kit/components/StatusMessage/StatusMessage.vue';
- import CategoryCard from '#ui-kit/components/CategoryCard/CategoryCard.vue';
+ import LinkTile from '#ui-kit/components/LinkTile/LinkTile.vue';
- import Card from '#ui/components/Card/Card.vue';
+ import Card from '#ui-kit/components/Card/Card.vue';
- import Iframe from '#ui/components/Iframe/Iframe.vue';
+ import Iframe from '#ui-kit/components/Iframe/Iframe.vue';
- import Media from '#ui/components/Media/Media.vue';
+ import MediaPreview from '#ui-kit/components/MediaPreview/MediaPreview.vue';
- <LuiProductSlider /> <!-- old: ui registered components with the Lui prefix -->
+ <LProductSlider /> <!-- new: ui uses L, matching ui-kit. Applies to every native-ui component. -->
Migration — props and bindings (UI Kit)
- <Button type="icon" size="medium" />
+ <IconButton label="..." icon="..." size="m" />
- <Button>
- <template #iconLeft><Icon name="..." /></template>
- </Button>
+ <Button :icon-left="iconName" />
- <Button variant="input-field" />
+ <Button variant="subtle" />
- <Input :is-error="hasError" />
+ <Input :invalid="hasError" />
- <Field :error="errorString" />
+ <Field :error-message="errorString" />
+ <!-- Field auto-derives `invalid` from `errorMessage`. Pass :invalid="…" explicitly only to override. -->
- <Label :error="hasError" />
+ <Label :invalid="hasError" />
- <Select size="small" />
+ <Select :trigger="{ size: 's' }" />
- <Accordion accordion-style="..." />
+ <Accordion variant="..." />
- <SwatchChip color-mode="dark" />
+ <SwatchChip surface-tone="dark" />
- <Badge is-rounded />
+ <Badge rounded />
- <Toast :is-open="open" />
+ <Toast :open="open" />
- <Pagination :is-navigation-numbers="true" />
+ <Pagination variant="numbers" />
- <OptionTileImage :not-available="{ isNotAvailable: true, notAvailableTooltip: '…' }" />
+ <OptionTileImage unavailable unavailable-tooltip="…" />
- <LSwiperCompact />
+ <LSwiperNavBar />
- <LSwiperFadeoutArrows :has-fadeout-background="false" />
+ <LSwiperArrows :fadeout="false" />
- <LSwiperThumbnailsSlider />
+ <LThumbnailsSlider />
- <Switch v-model:checked="open" />
+ <Switch v-model="open" />
- <Checkbox v-model:checked="agreed" />
+ <Checkbox v-model="agreed" />
Migration — CSS class names (UI Kit)
- .swatch-chip.is-selected { ... }
+ .swatch-chip--selected { ... }
- .switch--small { ... }
+ .switch--s { ... }
- .round-spinner-s { ... }
+ .round-spinner--s { ... }
- .swiper-chrome__head-top { ... }
+ .swiper-chrome__head--top { ... }
- .user-avatar { ... }
+ .avatar { ... }
- .toast__progress-bar { ... }
+ .toaster-progressbar { ... }
- .login-review-panel { ... }
+ .status-message { ... }
- .swatch-preview { ... }
+ .swatch { ... }
- .swatch-item { ... }
+ .swatch-option { ... }
- .product-tiles-swatches { ... }
+ .swatch-summary { ... }
- .menu-link-item { ... }
+ .nav-link-item { ... }
- .menu-section-title { ... }
+ .nav-section-heading { ... }
- .navigation-node-button { ... }
+ .menu-side-by-side-node { ... }
- .variant-option-selector-button, .variant-option-selector-image
+ .option-tile-text, .option-tile-image
- .zoom-level-mobile, .zoom-level-desktop
+ .zoom-level-segmented, .zoom-level-stepper
- .media-block* { ... }
+ .media-preview* { ... }
Studio data migration required for every renamed or deleted section/block component string, every renamed schema field, and every promoted or demoted section ↔ block. Custom themes that defined
backgroundAwareBackdropwith'default'must rewrite those entries with the equivalentSurfaceTone('default'was a synonym for'light').
1.34.0
Added
- UI Kit — New z-index token scale in ui-kit:
--z-index-sticky(100),--z-index-modal(1400),--z-index-popover(1500),--z-index-tooltip(1600),--z-index-toast(1700). Modal overlays and content share one token so stacked modals layer correctly via DOM order.
Changed
- UI Kit — All portaled components (Dialog, Sheet, AlertDialog, DropdownMenu, Select, Tooltip, MediaLightbox) now set z-index on their content class for reliable stacking. Header sections opt out of section isolation so their sticky/fixed chrome remains visible, and
FilterBarteleports its scroll-triggered fixed bar to<body>to escape section isolation, using an IntersectionObserver instead of hardcoded scroll thresholds. - UI App — Reworked z-index architecture across the UI stack. Header sections opt out of section isolation so their sticky/fixed chrome remains visible above subsequent sections; the filter bar teleports its scroll-triggered fixed bar to
<body>to escape section isolation.
1.33.0
Added
- UI Kit —
scrollToTopprop onPagination(defaults totrue), which scrolls the viewport to the top when navigating pages. - UI App —
scrollToTopprop on Pagination (defaulttrue), which scrolls the viewport to the top when navigating pages.
Fixed
- UI Kit —
Buttonnow emitsclickevents on theNuxtLinkbranch and forwards$attrson both root elements, enabling reka-uias-childto work correctly. - UI Kit —
SectionBlogPostListingnow uses reactive computed properties for client-side pagination. - UI App — Button now emits
clickevents on the NuxtLink branch and forwards$attrson both root elements, so reka-uias-childworks correctly. - UI App —
SectionBlogPostListinguses reactive computed properties for client-side pagination.
1.32.5
Fixed
- UI — Fixed Card
RichContentprop (:content→:html), simplified SocialShare layout, and wrapped BlogPostDetail content in a container div.
1.32.4
Added
- UI App — Standalone
BlockSocialShareblock for sharing the current page via social platforms.
Fixed
- UI — Prevented breadcrumb item text from wrapping by applying single-line text-overflow with ellipsis.
1.32.2
Fixed
- UI Kit — CSS-layer order in Studio preview.
- UI App — CSS-layer order in Studio preview.
1.32.1
Fixed
- UI App — Workaround for entities not refetching on locale change.
1.32.0
Added
- UI — Added the
$tlVue global for locale translations and expanded the locale system with 13 new message groups, full German translations, and umlaut fixes. Migrated 46 components fromuseLocale().tto$tltemplate calls. - UI App —
BlockProductReviewsblock,PageHeadersection, andSearchResultsHeadersection.
Fixed
- UI — Use correct hover font-colors for some elements.
- UI App — Correct hover font colors for some elements; loading state from async watchers.
1.31.4
Fixed
- UI App — Missing
useResolvedLinkimport inSectionBreadcrumbsthat caused a runtime error.
1.31.0
Added
- UI Kit —
$durationformatter for ISO 8601 duration strings. UsesIntl.DurationFormatwith locale awareness when available, falling back to narrow-style manual formatting (1h 30m 5s). Available as template global and auto-import. - UI App —
LanguageSwitchernow uses market-domain data for available locales; locale props are threaded through Header, TopBar, MobileMenu, and MegaMenu components, and sections useuseAvailableLocalesfor navigation-based locale switching.
Changed
- UI —
LanguageSwitchernow uses market-domain data for available locales instead of the removeduseLocalesDatacomposable. Locale props are threaded through Header, TopBar, MobileMenu, and MegaMenu components, and sections useuseAvailableLocalesfor navigation-based locale switching. - UI — Migrated URL fields from
texttolinktype and resolve links throughlinkResolverfor market-aware URL resolution. - UI Kit —
$moneyand$measurementi18n formatters moved from frontend-core to ui-kit, removing dead code. Template globals and auto-imports work identically — no consumer changes needed. - UI App — URL fields migrated from
texttolinktype and resolved throughlinkResolverfor market-aware URL resolution.
Deprecated
- UI App —
useLinkResolveris converted to a singletonlinkResolverobject that no longer requires a setup context.useLinkResolveris preserved as a deprecated re-export. UnuseduseSwitchLanguagePathanduseSwitchMarketUrlwrappers were removed.
1.30.0
Added
- UI Kit — An ESLint rule (
laioutr/require-css-layer) that enforces all new component CSS is layered.
Changed
- UI — Wrapped all component CSS in
@layer lui-componentsfor cascade layer control, allowing consumers to override component styles with unlayered CSS without needing!important. Existing@layer lui-overridableblocks (Icon, Text) are preserved. A new ESLint rule (laioutr/require-css-layer) enforces that all new component CSS is layered. - UI Kit — All component CSS is now wrapped in
@layer lui-components, allowing consumers to override component styles with unlayered CSS without needing!important. Existing@layer lui-overridableblocks (Icon, Text) are preserved. - UI App — All component CSS is now wrapped in
@layer lui-componentsfor cascade-layer control.
1.29.3
Fixed
- UI Kit —
ThemeSwitcherimport andThemeWithMeta. - UI Kit —
Inputprop fallthrough and theShopHeaderclose-button. - UI App — ThemeSwitcher import and
ThemeWithMeta; Input prop fallthrough and ShopHeader close button.
1.29.2
Fixed
- UI App — Correctly merge theme images.
1.29.1
Fixed
- UI App — Do not show the theme switcher when it is not enabled.
1.29.0
Added
- UI Kit — Theme switcher support.
- UI App — Theme switcher support.
1.28.1
Changed
- UI — Show filter-bar sorting only if sortings are available; made the BuyBoxStockInfo icon optional.
1.28.0
Changed
- UI — Fixed links in the basic header and the logo banner, made
SectionLogoPresentationrespect link fields, fixed pricing table width, and fixed mobile menu hierarchy inSectionBasicHeader.
Fixed
- UI App — Links in the basic header.
1.27.0
Added
- UI App — New Iframe block.
Fixed
- UI Kit —
HeroSliderMedia loading eagerness. - UI App — HeroSlider media loading eagerness.
1.26.1
Changed
- UI App —
SectionBreadcrumbsuses theBreadcrumbItemcanonical type.
1.26.0
Added
- UI — Implemented the Breadcrumb section.
- UI App — Breadcrumb section.
1.25.0
Added
- UI — Added the Error 404, Pricing Plans, and Pricing Table sections.
- UI App — Error 404, Pricing Plans, and Pricing Table sections.
1.24.3
Fixed
- UI — Fixed a hydration error that broke the page when the Header component with submenus was used.
- UI App — Hydration error breaking the page when a Header component with submenus is used.
1.24.2
Fixed
- UI App —
FlexibleContentSliderSectionbreaking whenactionButtonis missing.
1.24.1
Added
- UI App —
WellKnownSectionTagand section tags.
1.24.0
Added
- UI — Added support for multiple CTAs in the basic header.
- UI — Added support for calling PDPs with variant option-values.
- UI App — Support for multiple CTAs in the basic header.
- UI App — Support for calling PDPs with variant option values.
1.23.0
Added
- UI App — Missing testimonial sections.
1.22.0
Added
- UI App — ProductShowcaseSlider section.
Fixed
- UI App — Footer width and background.
1.21.3
Added
- UI App — Support for a variant query parameter in
ProductDetailContainer.
1.21.1
Fixed
- UI App — Links with references are now case-insensitive to their
type.
1.21.0
Added
- UI App — Autosuggest in the shop header on mobile.
1.20.0
Added
- UI — Implemented the SearchOverlay with actual data.
- UI Kit —
SearchOverlayimplemented with actual data. - UI App — SearchOverlay wired to actual data.
1.19.0
Added
- UI App —
ConnectedCartcomponent for use in headers.
1.18.0
Added
- UI App — Correct
SectionBasicHeaderimplementation.
1.17.7
Fixed
- UI App —
SectionIntegratedHeaderrecursion bug.
1.17.0
Added
- UI App — Ability to select a root menu item in the Integrated Shop Header; the root menu places all of its children as navigation items.
1.16.0
Added
- UI App — Basic strawberry-field theme.
1.15.0
Added
- UI App — Integrated Shop Header section.
1.14.0
Added
- UI App —
SectionShopHeaderopens an empty cart; sold-out status shown in DetailAddToCart with LightboxModal connected to the product image gallery; detail variant switcher and add-to-cart toast.
1.13.0
Added
- UI App — Filter bar implementation and type adjustments.
Fixed
- UI App — Removed duplicate product info from
BlockProductDetailDetails.
1.12.0
Added
- UI App — Remote
QueryTemplates.
1.11.0
Changed
- UI App — Studio refresh compatibility.
1.10.0
Changed
- UI App — Improved LCP loading strategy.
1.9.0
Fixed
- UI App — Missing links; added
robots.txtand page SEO meta.
1.6.0
Fixed
- UI App — CSS layer order and swiper styles.
1.5.0
Added
- UI App — Adjusted definition default behaviour; added several sections and blocks.
0.20.0
Changed
- UI — Updated the cart-sheet implementation.
Fixed
- UI Kit — Minor type fixes.
0.19.11
Fixed
- UI Kit — Worked around a nuxt/image Hygraph provider bug that returned broken image URLs.
0.19.7
Fixed
- UI Kit — Prevent a frontend crash when the
Mediacomponent is not provided amediaprop.
0.19.0
Added
- UI Kit —
RichContentsupport for anHtmlFragmentprop.
0.18.0
Added
- UI Kit — A basic
strawberry-fieldtheme.
0.17.5
Changed
- UI — Shopware implementation, minor UI fixes, and quality-of-life improvements.
0.17.4
Fixed
- UI Kit — Build issue.
0.17.0
Added
- UI — Added the Integrated Shop Header section.
0.16.0
Added
- UI —
SectionShopHeaderopens an empty cart. - UI — Show
isSoldOutstatus in DetailAddToCart and connect LightboxModal to ProductImageGallery. - UI Kit — Detail variant switcher and add-to-cart toast.
Fixed
- UI — Fixed a missing import in CartSheet, IconButton sizing, and variant preview sizes.
0.15.0
Added
- UI — Adjusted types and implemented the filter bar.
- UI Kit — Filter bar implementation and type adjustments.
0.14.3
Fixed
- UI Kit —
SectionShopHeaderNavigationnow respects menu data; fixedRichContentmargins.
0.14.1
Changed
- UI — Studio refresh compatibility.
Added
- UI Kit — Studio refresh compatibility.
0.14.0
Changed
- UI — Improved the LCP loading strategy.
- UI Kit — Improved LCP loading strategy.
0.13.0
Changed
- UI — Accessibility improvements for desktop navigation and slider navigation.
- UI Kit — Accessibility improvements for desktop navigation and slider navigation.
0.12.0 – 0.11.0
Added
- UI — Fixed missing links, added
robots.txtand page SEO meta.
Fixed
- UI Kit — Missing links; added
robots.txtand page SEO meta.
0.10.4
Changed
- UI Kit — Default color-mode set to
lightinstead ofsystem, since most e-commerce frontends do not provide a dark mode and being greeted with dark mode could confuse users.
0.10.2
Fixed
- UI — Fixed Shopify product prices and made minor frontend adjustments.
- UI Kit — Shopify product prices and minor frontend adjustments.
0.10.0
Changed
- UI — Fixed CSS layer order and Swiper styles.
Fixed
- UI Kit — CSS layer order and swiper styles.
0.9.0 – 0.8.0
Added
- UI — Added a few sections and blocks; changed definition default behaviour.
- UI Kit — Adjusted definition default behaviour; added several sections and blocks to ui-app.
0.7.1
Fixed
- UI Kit — Import paths.
0.6.0
Added
- UI — Added section definitions in preparation for the Shopify demo.
- UI Kit — Section definitions; preparation for the Shopify demo.
0.5.0
Changed
- UI — Migrated base components to UI Kit.
Added
- UI Kit — Migrated base components into the UI Kit.
0.4.0
Added
- UI — Media Library upload handling and improved documentation generation from canonical types.
earlier versions
Earlier 0.x releases and the intervening patch releases not listed above contained only internal changes and cross-package dependency updates with no user-facing UI changes. For the Section and Block layer, initial development (1.1.0 – 1.4.0) covered the first section definitions, preparation for the Shopify demo, theme loading via ui-kit, and early ShopHeader login wiring.