Each block comes with default styling designed to look great out of the box, while giving you full flexibility to match your website's look and feel via custom CSS.
All blocks use BEM naming conventions with the mage-* prefix, and styles are scoped to .mage-block to prevent interference with your Shopify theme.
Architecture
Every block wraps in a root container:
<div class="mage-block mage-{block-name}">Colors are never hardcoded in CSS — they come from data-* attributes on the container element (set via the Shopify theme editor) and are applied as inline styles.
Disable Customizer Styles
Each block has a Disable Customizer Styles checkbox in the Shopify theme editor (under Advanced). When enabled, all inline colour styles are removed from the block, so your custom CSS rules apply without needing !important. This is the recommended approach when you want full control over colours via the Custom CSS field.
Overriding colours without Disable Customizer Styles
Merchant-configurable colours are applied as inline styles, which have higher specificity than class selectors. This means:
Layout overrides (padding, border-radius, grid, etc.) work with a normal class selector — no
!importantneeded.Colour overrides require
!importantto beat the inline styles.
/* Structural override — no !important needed */ .mage-ways-to-earn__card { border-radius: 1rem; padding: 2rem; } /* Colour override — !important required */ .mage-ways-to-earn__card-title { color: #333 !important; }Block Reference
Hero Banner
Block: mage-hero-banner | Container ID: #mage-hero-banner
A full-width hero section with background image, headline, subtitle, and CTA buttons. Shown to guest users.
Class | Description |
| Root container |
| Background image container with min-height |
| 400px min-height |
| 50vh min-height |
| 100vh min-height |
| Dark semi-transparent overlay (40% black) |
| Centred content wrapper (max-width 4xl) |
| Tagline text (white, light weight) |
| Small subtitle sizing |
| Medium subtitle sizing |
| Large subtitle sizing |
| Main heading (white, bold) |
| Small title sizing |
| Medium title sizing |
| Large title sizing |
| Button group wrapper (flex, stacks on mobile) |
| Base button class |
| Small button padding/text |
| Medium button padding/text |
| Large button padding/text |
| White on transparent (Register) |
| White bordered on transparent (Login) |
| Dark on light |
| Light on dark |
Data attributes: data-background-image, data-background-image-mobile, data-mobile-breakpoint, data-banner-size, data-button-style, data-primary-button-color, data-primary-button-text-color, data-secondary-button-color, data-secondary-button-text-color, data-title-font-weight, data-title-font-color, data-subtitle-font-weight, data-subtitle-font-color, data-disable-customizer-styles
How It Works
Block: mage-how-it-works | Container ID: #mage-how-it-works
A 3-step explanatory section with icons/images, titles, and descriptions.
Class | Description |
| Root container |
| Max-width wrapper with padding |
| Header section (centred) |
| Section heading |
| Steps flex container (column on mobile, row on desktop) |
| Individual step wrapper |
| Step card with padding and min-height |
| Has a custom background colour |
| No background, transparent |
| Icon/image container |
| Custom uploaded image |
| 48px image |
| 64px image |
| 80px image |
| 100px image |
| Default icon when no image uploaded |
| Base icon sizing (32px) |
| Step heading |
| Step description |
Data attributes: data-hide-when-logged-in, data-step1-image, data-step2-image, data-step3-image, data-image-size, data-title-color, data-step-title-color, data-step-description-color, data-box-background-color
Ways to Earn
Block: mage-ways-to-earn | Container ID: #mage-ways-to-earn
A responsive card grid showing earning rules (purchase, social, birthday, receipt, etc.) with icons, points, status badges, and action overlays.
Class | Description |
| Root container |
| Loading state modifier on root |
| Max-width wrapper |
| Section header (centred) |
| Section heading |
| Section description |
| VIP tier multiplier info bar (amber) |
| Lightning icon in banner |
| Banner text content |
| Bold tier name / multiplier value |
| Card grid (1 col → 2 col → 4 col responsive) |
| Earning rule card (clickable, rounded-xl) |
| Loading skeleton modifier |
| Non-clickable card (no hover brightness) |
| Completed rule (reduced opacity) |
| Icon container area |
| Rule display name |
| Points value container |
| Points text or rule description |
| Photo/video bonus points text |
| Tier multiplier badge (amber pill) |
| Lightning icon in multiplier badge |
| Arrow icon container (clickable indicator) |
| Arrow icon |
| Status badge container (absolute, top-right) |
| Badge pill text ("Completed" / "Pending") |
| Login overlay for guest users (blur + dark backdrop) |
| "Login to earn points" text |
| "Log in" button in overlay |
| Default icon sizing (32px) |
| Custom icon image (48px, object-contain) |
Data attributes: data-background-color, data-section-title-color, data-section-description-color, data-card-title-color, data-card-icon-color, data-card-description-color, data-card-background-color, data-primary-color
Ways to Redeem
Block: mage-ways-to-redeem | Container ID: #mage-ways-to-redeem
A card grid of available rewards that customers can redeem with their points.
Class | Description |
| Root container |
| Loading state modifier |
| Max-width wrapper |
| Section header |
| Section heading |
| Section description |
| Card grid (1 → 2 → 4 columns) |
| Reward card (rounded-xl, no border) |
| Loading skeleton modifier |
| Unified top media area (h-36, rounded-t-xl) |
| Card content area below media |
| Circular icon container (56px, rounded-full) centred in media area |
| Product image (object-contain, hover scale) inside media area |
| Icon sizing (32px) |
| Custom icon image (48px) |
| Reward name |
| Points cost container |
| Points cost text |
| Redeem CTA button |
| Disabled button (no hover effect) |
| Empty state container (spans full grid) |
| "No rewards" message |
Data attributes: data-background-color, data-section-title-color, data-section-description-color, data-card-title-color, data-card-icon-color, data-card-description-color, data-card-background-color, data-primary-color
Product Points Calculator
Block: mage-product-points-calculator | Container ID: #mage-product-points-page-calculator
A product page widget showing how many points a customer earns with a purchase.
Class | Description |
| Root container |
| Inline text display mode |
| Badge/pill display mode |
| Points message text |
| Badge container (badge mode only) |
| Tier multiplier note |
Data attributes: data-product-price, data-display-style, data-badge-color, data-badge-text-color, data-inline-text-color, data-custom-message, data-disable-customizer-styles
Points Overview
Block: mage-points-overview | Container ID: #mage-points-overview
A logged-in customer's points summary with greeting, description, and activity history table. Pending transactions are visually distinguished.
Class | Description |
| Root container |
| Max-width wrapper (centred) |
| Loading skeleton placeholder |
| Greeting heading with points |
| Description text below greeting |
| Activity history table wrapper |
| Table |
| Table header |
| Table |
| Table row |
| Pending transaction row modifier |
| Skeleton loading row modifier |
| Empty state row modifier |
| Base table cell class |
| Activity name cell (text-left) |
| Points value cell (text-center) |
| Date cell (text-right) |
| Points number + label span (dimmed when pending) |
| Status badge base class |
| Pending status badge |
| Empty state heading |
| Empty state description |
Data attributes: data-background-color, data-title-color, data-description-color, data-primary-color, data-table-header-color, data-table-border-color, data-disable-customizer-styles, data-greeting, data-description, data-max-rows
Refer a Friend
Block: mage-refer | Container ID: #mage-refer-a-friend
A split-layout section promoting the referral program with a modal for sharing.
Main section:
Class | Description |
| Root container |
| Loading placeholder |
| Card wrapper with shadow |
| Flex container (image + content) |
| Image side (50% on desktop) |
| Background image |
| Placeholder when no image set |
| Gradient overlay |
| Content side (50% on desktop) |
| Inner wrapper with max-width |
| Section heading |
| Description |
| CTA button (rounded-full, shine effect) |
| Animated shine overlay on hover |
| Button label |
| Button arrow icon |
| Terms/disclaimer text |
Referral modal:
Class | Description |
| Modal root |
| Full-screen overlay |
| Modal dialog box |
| Close button (top-right) |
| Loading state container |
| Loading spinner |
| Error state container |
| Success state wrapper |
| Modal heading |
| Modal description |
| URL input section |
| URL input + copy button row |
| Referral URL input (readonly) |
| Copy to clipboard button |
| Social sharing section |
| "Share via" heading |
| Social buttons row |
| Base social button |
| X/Twitter share |
| Facebook share |
| Email share |
Data attributes: data-title, data-subtitle, data-background-color, data-text-color, data-button-text, data-image, data-layout, data-container-layout
FAQ
Block: mage-faq | Container ID: #mage-faq
An accordion-style FAQ section with animated expand/collapse, icon transitions, and a bottom divider.
Class | Description |
| Root container |
| Max-width wrapper with padding |
| Header section (centred) |
| Section heading |
| Section description |
| FAQ items container |
| Individual FAQ item (rounded-xl, border) |
| Expanded state modifier |
| Clickable button (full-width, flex, padding) |
| Question text |
| Icon container |
| Icon element (24px) |
| Plus icon (hidden when open) |
| Minus icon (shown when open) |
| Accordion content wrapper (grid rows animation) |
| Inner overflow wrapper |
| Answer text |
| Divider container |
| Decorative line |
Data attributes: data-divider-color, data-icon-color, data-title-color, data-subtitle-color, data-answer-color, data-disable-customizer-styles
VIP Tier Benefits Table
Block: mage-tiers-table | Container ID: #mage-vip-tier-benefits
A comparison table showing benefits across VIP tiers with check, cross, and custom text values. Supports an optional progress bar for logged-in customers.
Class | Description |
| Root container |
| Max-width wrapper with padding |
| Header section (centred) |
| Section heading — conditional based on login state |
| Subtitle text — conditional based on login state |
| Progress section container (logged-in only) |
| Progress title/subtitle wrapper |
| Progress section heading |
| Progress section description |
| Bar + labels container |
| Tier name labels row above bar |
| Current tier name (left) |
| Next tier name (right) |
| Bar background track |
| Bar fill element (animated width) |
| Percentage text positioned right of fill |
| Value labels row below bar |
| Current threshold value (left) |
| Next tier threshold value (right) |
| "Highest tier reached" text (shown when at max tier) |
| Base class for all dynamic placeholder values |
| Current tier name placeholder |
| Next tier name placeholder |
| Remaining points/spend placeholder |
| Progress value placeholder |
| Target threshold placeholder |
| Table scroll container (overflow-x-auto) |
| Table element |
| "Benefits" column header |
| Tier name column headers |
| Flex wrapper inside tier header (icon + name) |
| Tier badge element (custom image or roman numeral) |
| Tier name text span |
| Threshold subtitle wrapper |
| Threshold pill badge |
| Table body row |
| Alternating row |
| Benefit name cell |
| Tier value cell |
| Cell containing a tick |
| Cell containing a cross |
| Cell containing custom text |
| Tick SVG icon |
| Cross SVG icon (30% opacity) |
| Custom text value |
| Empty/not configured state |
Data attributes: data-primary-color, data-section-bg-color, data-text-color, data-disable-customizer-styles, data-tier-header-display
Tier header display modes (set via data-tier-header-display):
name(default) — tier name onlyicon— tier badge onlyicon_name— badge + name side by side
Column targeting: Each __tier-header and __value-cell carries a data-tier-index attribute (0-based, left to right). Use this to style individual columns without fragile nth-child selectors:
.mage-tiers-table__tier-header[data-tier-index='0'], .mage-tiers-table__value-cell[data-tier-index='0'] { background-color: #f5f0eb !important; }Dynamic placeholders: Titles and subtitles support {placeholder} syntax. Each placeholder renders as a <span> you can target with CSS:
/* Bold the current tier name */ .mage-tiers-table__var--currentTier { font-weight: 700 !important; } /* Highlight the remaining amount in red */ .mage-tiers-table__var--remaining { color: #dc2626 !important; }Dialog Reference
All dialogs are built on a shared base component. Dialog-specific content is nested inside.
Shared Dialog Base
BEM block: mage-block-dialog
Class | Description |
| Fixed fullscreen backdrop |
| Dialog box (rounded-2xl, shadow-xl, white background) |
| Max-width 400px |
| Max-width 600px |
| Max-width 800px |
| Max-width 1140px |
| 95% width, 90vh height |
| Header area |
| Flex row inside header |
| Dialog heading |
| Scrollable content area |
| Footer with border-top and action buttons |
| Close button |
| Close X icon |
Earn Dialog
BEM block: mage-block-dialog-earn
The generic earn dialog shown when a customer clicks on a social, engagement, or purchase rule. Many classes are reused by the birthday and receipt dialogs.
Summary card:
Class | Description |
| Container with background tint |
| Icon wrapper (56px, rounded-lg) |
| Icon element (40px) |
| Custom icon image (40px, object-contain) |
| Text content wrapper |
| "+X Points" heading with optional boost badge |
| Rule category label |
| Secondary text |
Boost badge (VIP tier multiplier):
Class | Description |
| Amber pill |
| Lightning icon |
| "Nx tier bonus" text line |
| Lightning icon (small) |
| Bonus text |
Content, status, and actions:
Class | Description |
| Rule description paragraph |
| Status message ("Completed" / "Pending verification") |
| Primary action button (full-width, rounded-lg) |
| Outlined close button |
| SVG spinner animation |
Success state:
Class | Description |
| Container (text-center) |
| "+X" large number |
| "Points added to your balance" |
Result card (shared with birthday and receipt dialogs):
Class | Description |
| Result container |
| Icon circle (56px, rounded-full) |
| Result heading |
| Result description |
| Action button in result card |
| Outlined variant |
Receipt Upload Dialog
BEM block: mage-block-dialog-earn-receipt
The receipt scanning modal with drag-and-drop upload and status feedback.
Reuses from Earn Dialog: __summary, __summary-icon, __icon, __summary-content, __summary-points, __summary-subtitle, __button, __result, __result-icon, __result-title, __result-text, __result-button, __result-button--outline
Dropzone:
Class | Description |
| Dashed-border container |
| Camera icon circle |
| "Tap to take a photo or upload" |
| File format hint |
Preview (file selected):
Class | Description |
| Container |
| Image wrapper |
| Image element |
| Non-image file fallback |
| File name text |
| Remove button |
| Cancel link |
Uploading:
Class | Description |
| Container |
| Spinning border circle |
| "Processing your receipt..." |
| "This may take a few seconds" |
Error:
Class | Description |
| Error icon circle |
| "Upload Failed" heading |
| Error message |
| Bold text in result message (for points awarded) |
Birthday Dialog
BEM block: mage-block-dialog-earn-birthday
The date-of-birth form that lets customers earn birthday points.
Reuses from Earn Dialog: __summary, __summary-icon, __icon, __summary-content, __summary-points, __summary-subtitle, __button, __spinner, __result, __result-icon, __result-title, __result-text, __result-button
Form elements:
Class | Description |
| Intro text |
| Form row container |
| Input wrapper |
| Field label ("Month", "Day", "Year") |
| Number input |
| Error message |
Redeem Dialog
BEM block: mage-block-dialog-redeem
The reward redemption modal with points display, confirmation, and discount code output.
Class | Description |
| Root |
| Icon container (64px, rounded-xl) |
| Product image variant (96px, overflow-hidden) |
| Reward icon |
| Product image |
| Reward name |
| Reward description |
| Requirements container |
| Individual requirement (visible by default) |
| Minimum spend requirement |
| Minimum order subtotal requirement |
| Minimum quantity requirement |
| Maximum shipping discount requirement |
| Points display card |
| Points cost number |
| "Your balance" text |
| Insufficient points error |
| Primary action button (full-width) |
| Outlined close button |
| Loading spinner |
| Success message |
| Discount code display card |
| Monospace code text |
| Error message |
| Button group container |
Flexible rewards:
Class | Description |
| Flexible reward container |
| Hero discount display wrapper |
| Large discount amount (e.g. "$25.00") |
| "discount at checkout" subtitle |
| Info row: points available + conversion rate |
| Input wrapper |
| Input + suffix container |
| Points amount text input |
| "points" label inside input group |
| Validation error text |
| Range hint (e.g. "Enter between 1 and 10 points") |
| Checkout info hint |
Hiding specific requirements:
.mage-block-dialog-redeem__requirement--max-shipping { display: none !important; }Login Dialog
BEM block: mage-block-dialog-login
A prompt shown to guest users asking them to create an account or sign in.
Class | Description |
| Description paragraph |
| Button container |
| Create Account CTA |
| Sign In CTA |
