Skip to content

Releases: graphcommerce-org/graphcommerce

Release 10.1.0-canary.22

20 May 15:14

Choose a tag to compare

Pre-release

@graphcommerce/magento-product@10.1.0-canary.22

Minor Changes

  • #2627 95c188f - Add YoutubeEmbed component — a lightweight lazy-loading YouTube player that defers iframe creation until the user clicks the poster. Uses preconnect on hover for fast playback start and is styled with MUI sx, so no external CSS is required. Supports playlists, no-cookie mode, custom aspect ratios and ad-network preconnect hints.

    ProductVideo (used by ProductPageGallery) now delegates YouTube playback to YoutubeEmbed, so any product whose Magento media_gallery contains a YouTube video entry gets the new lazy-loading player on its product page. Vimeo and self-hosted video paths are unchanged. The Magento preview image is passed as the YoutubeEmbed thumbnail so the visible poster stays consistent with the rest of the gallery.

    Fix SidebarGallery so it forwards the Additional and slotProps from each image to MotionImageAspect. Before this fix the gallery silently dropped both props, which meant any Additional overlay configured by ProductPageGallery (the <ProductVideo> overlay with its PlayCircle and the new YoutubeEmbed) never reached the DOM. That was a latent regression that made all video-gallery entries render as static images, with or without this PR's YouTube changes.

    Fix playwright.config.ts so npx playwright test actually loads. The config previously imported examples/magento-graphcms/next.config.ts, which transitively pulled @graphcommerce/next-config's ESM build into a CJS context and crashed with ReferenceError: exports is not defined. Replaced with an opt-in PLAYWRIGHT_LOCALES env var for the multi-locale projects that the next.config import was meant to drive. (@paales)

@graphcommerce/next-ui@10.1.0-canary.22

Minor Changes

  • #2627 95c188f - Add YoutubeEmbed component — a lightweight lazy-loading YouTube player that defers iframe creation until the user clicks the poster. Uses preconnect on hover for fast playback start and is styled with MUI sx, so no external CSS is required. Supports playlists, no-cookie mode, custom aspect ratios and ad-network preconnect hints.

    ProductVideo (used by ProductPageGallery) now delegates YouTube playback to YoutubeEmbed, so any product whose Magento media_gallery contains a YouTube video entry gets the new lazy-loading player on its product page. Vimeo and self-hosted video paths are unchanged. The Magento preview image is passed as the YoutubeEmbed thumbnail so the visible poster stays consistent with the rest of the gallery.

    Fix SidebarGallery so it forwards the Additional and slotProps from each image to MotionImageAspect. Before this fix the gallery silently dropped both props, which meant any Additional overlay configured by ProductPageGallery (the <ProductVideo> overlay with its PlayCircle and the new YoutubeEmbed) never reached the DOM. That was a latent regression that made all video-gallery entries render as static images, with or without this PR's YouTube changes.

    Fix playwright.config.ts so npx playwright test actually loads. The config previously imported examples/magento-graphcms/next.config.ts, which transitively pulled @graphcommerce/next-config's ESM build into a CJS context and crashed with ReferenceError: exports is not defined. Replaced with an opt-in PLAYWRIGHT_LOCALES env var for the multi-locale projects that the next.config import was meant to drive. (@paales)

@graphcommerce/misc@10.1.0-canary.22

Patch Changes

  • #2627 95c188f - Add YoutubeEmbed component — a lightweight lazy-loading YouTube player that defers iframe creation until the user clicks the poster. Uses preconnect on hover for fast playback start and is styled with MUI sx, so no external CSS is required. Supports playlists, no-cookie mode, custom aspect ratios and ad-network preconnect hints.

    ProductVideo (used by ProductPageGallery) now delegates YouTube playback to YoutubeEmbed, so any product whose Magento media_gallery contains a YouTube video entry gets the new lazy-loading player on its product page. Vimeo and self-hosted video paths are unchanged. The Magento preview image is passed as the YoutubeEmbed thumbnail so the visible poster stays consistent with the rest of the gallery.

    Fix SidebarGallery so it forwards the Additional and slotProps from each image to MotionImageAspect. Before this fix the gallery silently dropped both props, which meant any Additional overlay configured by ProductPageGallery (the <ProductVideo> overlay with its PlayCircle and the new YoutubeEmbed) never reached the DOM. That was a latent regression that made all video-gallery entries render as static images, with or without this PR's YouTube changes.

    Fix playwright.config.ts so npx playwright test actually loads. The config previously imported examples/magento-graphcms/next.config.ts, which transitively pulled @graphcommerce/next-config's ESM build into a CJS context and crashed with ReferenceError: exports is not defined. Replaced with an opt-in PLAYWRIGHT_LOCALES env var for the multi-locale projects that the next.config import was meant to drive. (@paales)

Release 10.1.0-canary.21

20 May 14:36

Choose a tag to compare

Pre-release

@graphcommerce/next-ui@10.1.0-canary.21

Patch Changes

  • #2633 7554ad4 - Fix: <Fab variant="extended"> no longer gets a fixed width from MuiFabSizes. The size-based width/height variants are now scoped to variant: 'circular' only, so extended Fabs can grow with their label (controlled via min-width instead) as MUI intends. Previously every extended Fab without an explicit size matched the default large rule and was forced to 54px wide. (@paales)

Release 10.1.0-canary.20

20 May 14:29

Choose a tag to compare

Pre-release

@graphcommerce/next-config@10.1.0-canary.20

Patch Changes

  • #2632 c25106b - Regenerate the mergeEnvIntoConfig snapshot so yarn test passes on canary. The test input already feeds GC_DEMO_MODE and GC_STOREFRONT_<i>_HYGRAPH_LOCALES_0 into the env-schema parser, but the snapshot it was compared against still reflected the pre-demoMode / pre-flattened-hygraphLocales schema, so every CI run since those config fields were added has been failing the test job on every PR with a snapshot mismatch unrelated to the PR's own changes. (@paales)

Release 10.1.0-canary.18

20 May 13:09

Choose a tag to compare

Pre-release

@graphcommerce/misc@10.1.0-canary.18

Patch Changes

  • #2629 ab82fcf - Clarify the type-check workflow in CLAUDE.md: type checking is per-example only, and optional/private packages must be activated via PRIVATE_ADDITIONAL_DEPENDENCIES and codegen must be re-run before tsgo sees their fragments. (@paales)

Release 10.1.0-canary.17

20 May 12:04

Choose a tag to compare

Pre-release

@graphcommerce/hygraph-dynamic-rows-ui@10.1.0-canary.17

Patch Changes

  • #2623 241576a - Bump Next.js from 16.1.1 to 16.2.6 across the framework and example storefronts. Also bumps the matching @next/env and @next/eslint-plugin-next pins. (@paales)

@graphcommerce/magento-customer@10.1.0-canary.17

Minor Changes

  • #2624 cbad1fd - CustomerUpdateForm now accepts useFormGqlOptions and mutationOptions props that get forwarded to its underlying useCustomerUpdateForm hook. Lets consumers attach an onComplete (e.g. to close an overlay and navigate back on a successful save), an onBeforeSubmit (to amend or veto the variables), or any other option already supported by useFormGqlMutation/useMutation — without having to drop down and rebuild the form from scratch.

    Defaults preserve existing behaviour, so the change is backwards compatible. (@paales)

@graphcommerce/eslint-config-pwa@10.1.0-canary.17

Patch Changes

  • #2623 241576a - Bump Next.js from 16.1.1 to 16.2.6 across the framework and example storefronts. Also bumps the matching @next/env and @next/eslint-plugin-next pins. (@paales)

@graphcommerce/misc@10.1.0-canary.17

Patch Changes

  • #2622 f310cfd - Add yarn packages:build one-shot script and document the packagesDev/* rebuild workflow in CLAUDE.md. Also adds guidance on changeset bump-type selection (avoid major) and the @graphcommerce/misc fallback for docs-only / placeless changes. (@paales)

Release 10.1.0-canary.13

20 May 10:44

Choose a tag to compare

Pre-release

@graphcommerce/magento-customer@10.1.0-canary.13

Minor Changes

  • #2620 43a0ed2 - SignUpForm now accepts fieldsets and render props (mirroring CustomerUpdateForm), so consumers can group dynamic customer attributes into custom labelled sections via AttributesFormAutoLayout. Defaults to the existing [nameFieldset(attributes)] / CustomerAttributeField behaviour, so unchanged for projects that don't supply the props.

    This avoids the unstyled, untranslated Other fallback header that AttributesFormAutoLayout adds whenever attributes don't fit any registered fieldset — projects that extend the customer schema (e.g. with a club attribute) can now declare their own fieldset alongside nameFieldset.

    The fallback header itself in AttributesFormAutoLayout is now wrapped in <Trans>Other</Trans> so it picks up project translations instead of rendering as a hardcoded English string.

    Bug fix in nameFieldset: when a store doesn't register dob/gender on the registration form, the additional row was empty and the helper produced grid-template-areas: "firstname lastname" "", which is invalid CSS and made the whole declaration fall back to the default single-column layout — firstname/lastname stacked on separate rows even at md+. Empty rows are now filtered out, so the side-by-side md layout works as intended. (@paales)

@graphcommerce/magento-store@10.1.0-canary.13

Patch Changes

  • #2625 539b353 - CustomAttributesField_to_AttributeValueInputs was filtering out any falsy form value (if (!value) return), so empty strings and false booleans never made it into the resulting AttributeValueInput[]. That meant a consumer who picked the empty-string option of a SELECT attribute (e.g. a "-- None --" option used to undo a previous choice) couldn't actually clear the attribute — the mutation simply omitted it and Magento kept the old value.

    Skip only when the value is undefined (the attribute was never touched). Pass empty strings and false booleans through to the mutation so the backend can interpret them as "clear this attribute". (@paales)

  • #2620 43a0ed2 - SignUpForm now accepts fieldsets and render props (mirroring CustomerUpdateForm), so consumers can group dynamic customer attributes into custom labelled sections via AttributesFormAutoLayout. Defaults to the existing [nameFieldset(attributes)] / CustomerAttributeField behaviour, so unchanged for projects that don't supply the props.

    This avoids the unstyled, untranslated Other fallback header that AttributesFormAutoLayout adds whenever attributes don't fit any registered fieldset — projects that extend the customer schema (e.g. with a club attribute) can now declare their own fieldset alongside nameFieldset.

    The fallback header itself in AttributesFormAutoLayout is now wrapped in <Trans>Other</Trans> so it picks up project translations instead of rendering as a hardcoded English string.

    Bug fix in nameFieldset: when a store doesn't register dob/gender on the registration form, the additional row was empty and the helper produced grid-template-areas: "firstname lastname" "", which is invalid CSS and made the whole declaration fall back to the default single-column layout — firstname/lastname stacked on separate rows even at md+. Empty rows are now filtered out, so the side-by-side md layout works as intended. (@paales)

@graphcommerce/next-config@10.1.0-canary.13

Patch Changes

  • #2621 4eccccd - graphcommerce cleanup-interceptors now actually finds and restores .original.tsx / .original.ts files when run from a consumer project. Previously findDotOriginalFiles walked up looking for a @graphcommerce/* parent package; from a consumer project (where there is no such parent) parentPath ended up null and the glob expanded to literally null/**/*.original.tsx, so the command silently restored nothing. Now it falls back to cwd and cwd/node_modules/@graphcommerce where interceptors actually live for consumers.

    Also fixes a display bug — the final X files restored from .original line printed an always-0 counter (restoredCount was declared but never incremented; the now-removed removedCount was the one being incremented). Counter and message are now consistent. (@paales)

Release 10.1.0-canary.9

12 May 11:53

Choose a tag to compare

Pre-release

@graphcommerce/magento-payment-multisafepay@10.1.0-canary.9

Patch Changes

  • #2583 01bb1df - Fixed a bug in MSPPaymentHandler where successful MultiSafepay payments were prevented from redirecting to the success page due to an incorrect condition in the payment handler. (@Giovanni-Schroevers)

Release 10.1.0-canary.7

08 May 08:00

Choose a tag to compare

Pre-release

@graphcommerce/next-ui@10.1.0-canary.7

Patch Changes

  • #2610 7b6ba3f - Fix duplicate React key warning in <NumberFormat> / <CurrencyFormat> / <Money> for numbers with a thousands group separator. Intl.NumberFormat.formatToParts() emits multiple parts with type: "integer" (one per group, e.g. 1.234,56 produces two integer parts). Using key={part.type} therefore collided. Switched to an index key — parts are already wrapped in suppressHydrationWarning, so SSR/client divergence isn't an issue. (@paales)

Release 10.1.0-canary.6

06 May 09:00

Choose a tag to compare

Pre-release

@graphcommerce/storyblok-ui@10.1.0-canary.6

Patch Changes

  • #2609 fe29527 - Drop @graphcommerce/magento-cms from the Storyblok example, ship locale-redirect proxy with storyblok-ui

    The Storyblok example had several leftovers from a half-completed migration off Magento CMS, all conceptually out of place in an example whose purpose is "all content lives in Storyblok":

    • pages/page/[...url].tsx — a CMS page handler whose getStaticPaths called getCategoryStaticPaths (returns Magento category URLs). Feeding category URLs into the cmsPage query caused getStaticProps to return a redirect, which Next.js rejects during prerender — crashing next build.
    • Layout.graphql queried cmsBlocks(["footer_links_block"]) but the resulting prop was destructured-and-discarded in both layout components — the Footer is fully driven by Storyblok's globalConfig. The dead query also produced noisy GraphQL errors at build time on backends without the block.
    • pages/404.tsx rendered a Magento cms_no_route CMS page (with a hardcoded fallback if absent).
    • proxy.ts was a hand-written file with hardcoded LOCALES = ['en', 'nl'] — broken for any other storefront combination, and not using the plugin system.

    This PR:

    • Removes pages/page/[...url].tsx, the dead cmsBlocks query and unused destructures, the Magento CMS fallback in pages/404.tsx, and the @graphcommerce/magento-cms dependency
    • Migrates proxy.ts → standard managed re-export
    • Adds @graphcommerce/storyblok-ui/plugins/LocaleRedirectProxy.ts with ifConfig: 'storyblok' — every project depending on @graphcommerce/storyblok-ui now gets locale-redirect (Visual Editor _storyblok_lang + Accept-Language root) automatically, with locales read from storefront config

    If a project needs Magento CMS pages alongside Storyblok, it can re-add the dependency and a route — but the example should default to pure Storyblok. (@paales)

Release 10.1.0-canary.5

06 May 08:21

Choose a tag to compare

Pre-release
chore(release): update prerelease versions