Features
Since version 3.9
To learn more about extension features, you can read the Extension Features reference docs.
accountInformation
Extendable feature for the Account Information page.
theme/pages/Account/Information
ui.componentsMap
-
DeleteAccount: The component to display the delete account component in the account information pageeditorialToolboxSections
Extendable feature for the Editorial Toolbox component. See
theme/components/molecules/EditorialToolbox/EditorialToolbox.
This is used to add additional sections to the Editorial Toolbox.
ui.componentsMap
Components registered in this extension point will be rendered as additional sections in the Editorial Toolbox. Each component should implement its own section structure and functionality.
orderDetails
Since version 3.19
This feature was previously named OrderDetails. It was renamed to
orderDetails in 3.20 to follow the camelCase naming convention for feature
names. Run the 3.20.0 codemod to update your codebase automatically.
Extendable feature for the Order Details page. This feature uses co-located GraphQL fragments — components registered in this feature can declare their data requirements directly.
ui.componentsMap
OrderItems: The component to display the list of items in an order. Comes with a co-locatedOrderItemsFragmenton theOrdertype. Constrained totargetGraphQLType: "Order".
Facets
Extendable feature for the LayerFacets component. See
theme/modules/Layer/LayerFacets/LayerFacets.
This is used to easily customize the components used to render facets filters.
ui.componentsMap
TextSearchFacetRangeSearchFacetAttributeFacetCategoryFacet, defaulted tonullas it this type of facet is not rendered inLayerFacetby default
maps
Extendable feature for the Map and Marker components. See
PostalAddressSelector
ui.componentsMap
shippingMethodAdditionalData
Extendable feature for the AdditionalShippingInformation component. See
getAddtionalDataComponent.
ui.componentsMap
The registered component name should be the same as the
shippingMethod.method_type value provided in the schema's ShippingMethod
object.
recommendations
Since version 3.13
Extendable feature for product recommendations throughout the application. This feature provides extension points for displaying recommended products in various contexts such as product pages, cart, and homepage.
ui.componentsMap
ProductPageUpsells: Component for displaying upsell recommendations on product pagesProductPageRelated: Component for displaying related product recommendations on product pagesHomePage: Component for displaying recommendations on the homepage. Currently set tonullby default, allowing extensions to provide their own implementationProductAddedPopInCrosssells: Component for displaying cross-sell recommendations in the "Product Added" pop-in modalCartPage: Component for displaying recommendations on the cart pageCategoryPage: Renders recommendations on the category page
pageSkeletons
Since version 3.22
Extendable feature for page skeletons displayed during SPA navigations. See
PageSkeletonOutlet.
Strict opt-in: the theme ships no active declaration. A page displays a skeleton only when a declaration names it — until then, navigations keep the current behaviour (the previous page stays visible with NProgress). The registry below is a library of skeleton components: it enables nothing by itself. Three declaration surfaces turn a key on:
- a route's
handle.skeleton(createHandle({ dynamicRoute: {...}, skeleton: "product" })) — the destination route declares its own skeleton; - a link's navigation state (
<Link state={{ skeleton: "product" }}>) — the link author knows the destination's page type ahead of time; - a pathname key in the registry itself (
"/cart"), registered by any extension — static routes have no handle to declare through, so their declaration lives here. In your own extension:
hooks.registerFeature("pageSkeletons", {
ui: {
componentsMap: {
"/cart": new URL("./theme/pages/CartSkeleton", import.meta.url),
},
},
});
Surfaces 1 and 2 activate independently, each covering its own window of a
dynamic navigation: the link's state covers the loading phase (while the data
fetches — it is the only one that can, since the destination route is unresolved
yet), the route's handle covers the post-commit window (the route module still
loading). Either one alone displays a skeleton in its own window; declaring both
covers the whole navigation. The state's key is not checked against the
route's own type: a link declaring category towards a product route
displays the category skeleton during loading (the route's own declared skeleton
takes over after the commit) — classify links carefully.
ui.componentsMap
Each key maps a page family to its skeleton component — cart, product,
category, cms, generic, plus any key an extension or connector registers.
generic is not a fallback: it is displayed only when explicitly declared.
Set a key to null to disable its skeleton. Extensions and connectors can
register their own keys — e.g. a brand skeleton for marketplace routes — by
augmenting this feature in onFeaturesInit:
// in the extension's lifecycle hooks
hooks.registerFeature("pageSkeletons", {
ui: {
componentsMap: {
brand: new URL("./theme/pages/Brand/BrandPageSkeleton", import.meta.url),
},
},
});
Type the new key through module augmentation of @front-commerce/types (see
theme-chocolatine/src/types/extension-features.d.ts
for the pattern). Declaring a skeleton loads its component (and the SCSS of the
page classes it renders) eagerly in the shared layout chunk — the skeleton must
be styled before the target route module loads.
Skeleton resolution during the loading phase
For an in-flight navigation, the skeleton is resolved in two steps (the pathname declaration wins over the link's state — the route's own declaration is more specific than whatever a link guessed):
- the destination pathname declared in the registry (e.g.
"/cart"— the route's own declaration wins); - the skeleton key declared in the navigation state — the link's author knew
the destination's page type ahead of time and passed
<Link state={{ skeleton: "product" }}>: React Router exposes it innavigation.location.statesynchronously, so the typed skeleton renders on the very first loading frame, with no request and no hover needed (mobile taps included).
Anything else — dynamic destinations without a declared key included — keeps the
historical behaviour (no skeleton, previous page + NProgress). A declared key
that resolves to nothing (unregistered or disabled) also shows nothing: the
declaration promises a specific skeleton, and generic is displayed only
through an explicit declaration. Once the data commits on a dynamic route, the
route's handle.skeleton key selects the typed skeleton while the route module
loads; without it, the historical spinner applies.
A dynamic URL already visited in the session (aliased in the client manifest) displays no skeleton at all — its module is already loaded, there is no loading window to cover.
Annotate the links whose destination type you know statically (product grids, search results, cart lines, wishlists…); leave variable destinations (breadcrumbs, mixed menus) unannotated — a wrong declaration would be worse than none, since it promises a specific skeleton.
messageAuthorRoleBadge
Since version 3.22
Extendable feature for the badge that displays a message author's role. By
default the base theme renders nothing (the placeholder returns null); a
backend package provides a concrete badge. gezy-marketplace renders a colored
badge for each marketplace role (customer, merchant, operator), fed by the
role field of the shared FcMessageAuthor GraphQL interface — so it works for
both conversation and dispute message authors.
A consuming component renders it through
useExtensionComponentMap("messageAuthorRoleBadge", { MessageAuthorRoleBadge }).
ui.componentsMap
MessageAuthorRoleBadge: The component used to display a message author's role. Defaults to a no-op placeholder in the base theme; override it (asgezy-marketplacedoes) to render a role badge.