Skip to content

Instantly share code, notes, and snippets.

View screeny05's full-sized avatar

Sebastian Langer screeny05

View GitHub Profile
@screeny05
screeny05 / CHANGELOG.md
Created July 14, 2026 02:44
Frontend-Core 0.35.0

Release notes

Core 0.34.0

Minor Changes

  • Add a configurable trailing-slash policy via RcProject.config.trailingSlash (default false). Routes, canonical/hreflang links, switch-locale/market URLs, and the useMarketPath helper are generated in the configured shape, and a Nitro server middleware issues a 301 normalizing the opposite shape. The policy is also applied to Nuxt's <NuxtLink> default so client-side navigation hrefs match, and the active value is readable at runtime via runtimeConfig.public.laioutr.trailingSlash. Domain path prefixes are normalized, so single- and multi-segment prefixes (/fr, /en/us) — including ones written with a stray trailing slash — compose correctly. Fixes homepage alternate/canonical links carrying a trailing slash on path-prefixed domains (/fr//fr). The root path / is unaffected.

On path-prefixed domains the homepage now resolves correctly instead of falling through to the 404 page (the core/404 catch-all is no longer market-prefixed, so

@screeny05
screeny05 / CHANGELOG.md
Created July 13, 2026 15:51
Frontend-Core 0.34.0

Release notes

Core 0.34.0

Minor Changes

  • Add a configurable trailing-slash policy via RcProject.config.trailingSlash (default false). Routes, canonical/hreflang links, switch-locale/market URLs, and the useMarketPath helper are generated in the configured shape, and a Nitro server middleware issues a 301 normalizing the opposite shape. The policy is also applied to Nuxt's <NuxtLink> default so client-side navigation hrefs match, and the active value is readable at runtime via runtimeConfig.public.laioutr.trailingSlash. Domain path prefixes are normalized, so single- and multi-segment prefixes (/fr, /en/us) — including ones written with a stray trailing slash — compose correctly. Fixes homepage alternate/canonical links carrying a trailing slash on path-prefixed domains (/fr//fr). The root path / is unaffected.

On path-prefixed domains the homepage now resolves correctly instead of falling through to the 404 page (the core/404 catch-all is no longer market-prefixed, so

@screeny05
screeny05 / CHANGELOG.md
Created July 7, 2026 16:42
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).

@screeny05
screeny05 / CHANGELOG.md
Created July 6, 2026 10:26
Frontend-Core 0.33.0 & Laioutr UI 2.5.0

Release notes

Core 0.33.0

Minor Changes

  • Emit SEO and locale head tags automatically on every page. Each page now renders a self-referential <link rel="canonical">, <link rel="alternate" hreflang> alternates for every market domain plus x-default, og:locale / og:locale:alternate, and <html lang> — with no per-page or per-layout call required. Alternates are scoped to a page's marketIds, so a market-restricted page never advertises (or links to a 404 for) markets it does not belong to. MetaPage gains an optional marketIds field that carries this scope onto the route.

    Customize the emitted head with one new filter hook, registered in a Nuxt plugin: frontend-core:page-head:resolve. Its result.value carries frontend-core's computed head in two slots — seo (title, description, robots, and any og/twitter field) and locale (canonical, hreflang, og:locale, html lang) — so a handler can add, override, or remove any tag.

@screeny05
screeny05 / CHANGELOG.md
Created June 19, 2026 14:58
Laioutr UI 2.4.0

Release notes

UI 2.4.0

Minor Changes

  • Un-mirror alignment under "Greedy First" sizing

    GridFill now accepts justify and align props ('start' | 'center' | 'end') for main- and cross-axis item alignment. Alignment is honored consistently across

@screeny05
screeny05 / CHANGELOG.md
Created June 9, 2026 07:29
Frontend-Core 0.31.0 & Laioutr UI 2.3.0

Release notes

Core 0.31.0

Minor Changes

  • Render referenced global sections on pages (dereference + query merge + config wiring).

  • Add new Energy Label Model

@screeny05
screeny05 / CHANGELOG.md
Created June 1, 2026 18:05
Frontend-Core 0.30.3 & Laioutr UI 2.2.3

@laioutr-core/core-types@0.30.3

Patch Changes

  • dc8610b: Add support for setting Media fields from query entities.

    Add RcPropValueEntityProperty for query-bound prop values — a new variant on the RcPropValue union that lets a single prop read its value from a property of a query-result entity (e.g. { type: 'entity-property', queryId: 'q1', path: ['components', 'base', 'image'] }). The composite path uses the same components.* / links.* form as string-template references.

    Lifted RenderQueryReference.queryPath from string to string[] and added an entity-property variant to the RenderQueryReference and RenderQueryLoadSpecSeed unions (internal render-pipeline types, consumed only by @laioutr-core/frontend-core).

@screeny05
screeny05 / CHANGELOG.md
Last active May 27, 2026 08:27
Frontend-Core 0.30.2 & Laioutr UI 2.2.2

@laioutr-core/frontend-core@0.30.2

  • 0262d90: Honor URL redirects configured for the project. Visiting a redirect source path (exact or :param pattern) sends the user to the configured target — isPermanent: true returns 301, isPermanent: false returns 302. Works for direct hits, hard reloads, and SPA navigations via <NuxtLink> or router.push, including on storefronts that define a custom core/404 page. Query strings are preserved; targets can be absolute URLs for external redirects.

@laioutr-core/ui@2.2.2

  • 03d0edb: BackgroundAwareButton's adaptive lookup variants are now adaptive-primary / adaptive-secondary / adaptive-ghost (previously primary / secondary / ghost), so they no longer shadow Button's literal primary / secondary variants. The pass-through variants (tertiary, secondary-white, ghost-*, glass-*, subtle, info, positive, danger, close-*) are unchanged.

    In Studio, the new backgroundAwareButtonFields shared field exposes the three `Adapt

@screeny05
screeny05 / CHANGELOG.md
Last active May 22, 2026 15:14
Laioutr UI 2.2.1

@laioutr-core/ui@2.2.1

  • 32a2ebb: Fix ProductSliderShowcase padding and width: slider no longer reserves bleed padding on the wrapper (relied on full-bleed parent), banner respects its container, and the slider fills the remaining row width on desktop.

  • 32a2ebb: Caption styling on BannerBasic: plain/boxed variant, colour scheme, and text-shadow controls — replacing the previous colour-only override. New captionVariantField shared field in @laioutr-app/ui bundles the controls into a single sidebar group on BlockBannerBasic and SectionProductSliderShowcase. Container no longer strips border-radius from CTA banners in full-width containers (banners now own their own radius).

    Breaking: BannerBasic (@laioutr-core/ui) replaces captionColor: string with captionVariant: Omit<CaptionFlagProps, 'text'>. Migrate inline:

    // Before

Laioutr Core

0.30.1

  • e388d8e: Section slots prop now retains structural typing of block props at consumer call sites.

    Previously, props.slots.<slotName>[i].props was wrapped in SimplifyDeep, which recursively walked every nested block-schema decorator (headingStyle, sublineStyle, …). Past a certain schema depth the cumulative type instantiation exceeded TypeScript's 50-level limit and surfaced as TS2589: Type instantiation is excessively deep and possibly infinite in any section that mapped over its slot blocks.

    The wrapper now uses bounded Simplify (one level) at the right boundaries — the outer slot map, each block item, and the block's props shape. IDE hover output is unchanged; structural typing is unchanged. Sections that previously needed an as unknown as ReadonlyArray<{ props: Record<string, any> }> cast on props.slots.* to silence TS2589 can drop the cast and access block.props.<field> with full type inference.