
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
priceSortkey fromsessionStorageand 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
variantFilterProductIdskey fromlocalStorageand 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
storageevents onwindowso 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
.framerfyPriceand 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
| Property | Type | Default | Description |
|---|---|---|---|
| CMS Page | Component Instance | — | The primary Framer CMS collection component used on desktop. This is the main content slot — always required. |
| CMS Tablet Page | Component Instance | — | The CMS collection component used when the screen width is at or below the Tablet Breakpoint. |
| CMS Mobile Page | Component Instance | — | The CMS collection component used when the screen width is at or below the Mobile Breakpoint. |
Breakpoints
| Property | Type | Default | Description |
|---|---|---|---|
| Tablet Breakpoint | Number | 1199 | Screen width in pixels at which the Tablet CMS page is used instead of the Desktop CMS page. |
| Mobile Breakpoint | Number | 809 | Screen width in pixels at which the Mobile CMS page is used. Takes priority over the Tablet breakpoint when both apply. |
Pagination
| Property | Type | Default | Description |
|---|---|---|---|
| Items Per Page | Number | 15 | How many CMS items to show per page. Range: 1–50. |
| Scroll Offset Padding | Number (px) | 258 | When 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
framerfyPricefor price sorting and filtering to work. Without it, all items will have a price of0. - Product IDs are read from the second class name on the
.framerfyPriceelement (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
priceSortkey insessionStorage. Connect a Price Sort Controller on the same page to drive this. - Variant filtering reacts to the
variantFilterProductIdskey inlocalStorage. Connect a Variant-Based Filter on the same page to drive this. - When no variant filter is active (the
variantFilterProductIdsarray 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.