Skip to main content
CMS Wrapper
A DOM-based product listing controller for Framer that adds pagination, price sorting, and variant filtering on top of any Framer CMS collection — with responsive layout support for desktop, tablet, and mobile.

What It Does

The CMS Wrapper wraps a Framer CMS collection component and takes control of which items are shown. It reads prices and product IDs directly from the rendered DOM, then handles pagination, sorting, and filtering entirely on the client side — no backend required. Key behaviors at a glance:
  • Pagination — splits the full list of CMS items into pages and renders only the current page’s items. Previous/Next buttons navigate between pages. The page counter shows the current page and total pages, or “No items” when all items are filtered out.
  • Price sorting — reads the priceSort key from sessionStorage and re-orders items by price (Low → High or High → Low) whenever it changes. Works with the Price Sort Controller component out of the box.
  • Variant filtering — reads the variantFilterProductIds key from localStorage and hides any CMS items whose product ID is not in the list. Works with the Variant-Based Filter component out of the box.
  • Responsive layouts — accepts separate CMS page components for desktop, tablet, and mobile. Switches between them based on configurable breakpoint widths.
  • Scroll on page change — after navigating to a new page, the viewport automatically scrolls up to the top of the list with a configurable offset to account for sticky headers or navbars.
  • Live updates — listens for storage events on window so the list reacts instantly whenever the sort order or variant filter changes without a page reload.
  • DOM-based price extraction — reads prices from elements with the class .framerfyPrice and product IDs from the second class name on that element (e.g. framerfyPrice 8352533184673).

Property Controls

All controls are accessible in Framer’s right panel when the component is selected.

CMS Pages

PropertyTypeDefaultDescription
CMS PageComponent InstanceThe primary Framer CMS collection component used on desktop. This is the main content slot — always required.
CMS Tablet PageComponent InstanceThe CMS collection component used when the screen width is at or below the Tablet Breakpoint.
CMS Mobile PageComponent InstanceThe CMS collection component used when the screen width is at or below the Mobile Breakpoint.

Breakpoints

PropertyTypeDefaultDescription
Tablet BreakpointNumber1199Screen width in pixels at which the Tablet CMS page is used instead of the Desktop CMS page.
Mobile BreakpointNumber809Screen width in pixels at which the Mobile CMS page is used. Takes priority over the Tablet breakpoint when both apply.

Pagination

PropertyTypeDefaultDescription
Items Per PageNumber15How many CMS items to show per page. Range: 1–50.
Scroll Offset PaddingNumber (px)258When the user navigates to a new page, the viewport scrolls to the top of the list minus this offset. Increase this value if a sticky header or navbar covers the top of the list. Range: 0–500 px.

Notes

  • This component requires the Dynamic Product Price component to be inside each CMS card with the class framerfyPrice for price sorting and filtering to work. Without it, all items will have a price of 0.
  • Product IDs are read from the second class name on the .framerfyPrice element (e.g. <span class="framerfyPrice 8352533184673">). The Dynamic Product Price component handles this automatically when Product ID is connected from CMS.
  • Price sorting reacts to the priceSort key in sessionStorage. Connect a Price Sort Controller on the same page to drive this.
  • Variant filtering reacts to the variantFilterProductIds key in localStorage. Connect a Variant-Based Filter on the same page to drive this.
  • When no variant filter is active (the variantFilterProductIds array is empty), all items are shown.
  • The breakpoint check runs once on mount using window.innerWidth — it does not dynamically swap layouts on browser resize.
  • Price filtering via min/max inputs is implemented in the code but currently disabled in the Framer panel. It can be enabled by uncommenting the relevant property controls in the source.