Pro
Install
One file: sections/mf-aurora-hero.liquid. It appears in the theme editor as EX · Aurora hero.
- Connect EXPERAISE Sections to Claude (once). In Claude Code:In the Claude app: Settings → Connectors → Add custom connector →
claude mcp add --transport http experaise-sections https://sections.experaise.com/api/mcphttps://sections.experaise.com/api/mcp. Full setup - Ask Claude. It fetches
sections/mf-aurora-hero.liquid, pushes only that file to your theme with Shopify CLI, and tells you where to find it.Install the EXPERAISE Sections section "Aurora Hero" (aurora-hero) on my Shopify store your-store.myshopify.com. Put it on an unpublished copy of my live theme, then tell me how to add it in the theme editor. - Customize. Online Store → Themes → Customize → Add section → EX · Aurora hero. Every text, color and product is a setting.
{%- liquid
assign s = section.settings
assign heading_tag = s.heading_tag | default: 'h2'
-%}
<mf-aurora-hero
class="mf-aurora{% if s.image != blank %} mf-aurora--image{% endif %}"
data-pointer="{{ s.enable_pointer }}"
style="--mf-aurora-bg: {{ s.color_bg }}; --mf-aurora-fg: {{ s.color_text }}; --mf-aurora-accent: {{ s.color_accent }}; --mf-aurora-min-h: {{ s.min_height }}px;"
>
<div class="mf-aurora__grid" aria-hidden="true"></div>
<div class="mf-aurora__cursor" aria-hidden="true"></div>
<div class="mf-aurora__copy">
{%- if s.eyebrow != blank -%}
<p class="mf-aurora__eyebrow"><i aria-hidden="true"></i>{{ s.eyebrow | escape }}</p>
{%- endif -%}
<{{ heading_tag }} class="mf-aurora__title">
{{- s.heading -}}
{%- if s.heading_accent != blank %}<br><em>{{ s.heading_accent }}</em>{% endif -%}
</{{ heading_tag }}>
{%- if s.text != blank -%}
<div class="mf-aurora__text">{{ s.text }}</div>
{%- endif -%}
<div class="mf-aurora__actions">
{%- if s.button_label != blank -%}
<a class="mf-aurora__button" href="{{ s.button_link | default: routes.all_products_collection_url }}">
{{- s.button_label | escape }} <span aria-hidden="true">→</span>
</a>
{%- endif -%}
{%- if s.link_label != blank -%}
<a class="mf-aurora__link" href="{{ s.link_url | default: '#' }}">{{ s.link_label | escape }}</a>
{%- endif -%}
</div>
{%- if s.proof != blank -%}
<p class="mf-aurora__proof">
<span class="mf-aurora__stars" aria-hidden="true">★★★★★</span>
{{ s.proof | escape }}
</p>
{%- endif -%}
</div>
<div class="mf-aurora__object" aria-hidden="true">
<div class="mf-aurora__orbit mf-aurora__orbit--one"></div>
<div class="mf-aurora__orbit mf-aurora__orbit--two"></div>
{%- if s.image != blank -%}
<div class="mf-aurora__media">
{{
s.image
| image_url: width: 1400
| image_tag:
loading: 'eager',
fetchpriority: 'high',
sizes: '(min-width: 750px) 50vw, 90vw',
widths: '600, 900, 1200, 1400',
class: 'mf-aurora__img'
}}
</div>
{%- else -%}
<div class="mf-aurora__matter">
<div class="mf-aurora__sheen"></div>
<div class="mf-aurora__core"></div>
</div>
{%- endif -%}
<div class="mf-aurora__shadow"></div>
</div>
{%- if s.note_title != blank or s.note_text != blank -%}
<aside class="mf-aurora__note">
{%- if s.note_title != blank -%}<span>{{ s.note_title | escape }}</span>{%- endif -%}
{%- if s.note_text != blank -%}<p>{{ s.note_text | escape }}</p>{%- endif -%}
</aside>
{%- endif -%}
</mf-aurora-hero>
{% stylesheet %}
.mf-aurora {
--mf-aurora-x: 50%;
--mf-aurora-y: 48%;
--mf-aurora-rx: 0deg;
--mf-aurora-ry: 0deg;
position: relative;
isolation: isolate;
display: block;
min-height: var(--mf-aurora-min-h, 720px);
overflow: hidden;
background: var(--mf-aurora-bg, #08090d);
color: var(--mf-aurora-fg, #f6f2ee);
font-family: inherit;
}
.mf-aurora *,
.mf-aurora *::before,
.mf-aurora *::after {
box-sizing: border-box;
}
.mf-aurora::before {
content: "";
position: absolute;
z-index: -2;
inset: 0;
background:
radial-gradient(520px circle at var(--mf-aurora-x) var(--mf-aurora-y), rgba(216, 212, 255, 0.2), transparent 52%),
radial-gradient(circle at 16% 86%, rgba(116, 255, 209, 0.23), transparent 25%),
radial-gradient(circle at 84% 16%, rgba(239, 159, 255, 0.19), transparent 23%);
}
.mf-aurora::after {
content: "";
position: absolute;
z-index: 3;
inset: 0;
pointer-events: none;
opacity: 0.22;
background-image: radial-gradient(#fff 0.5px, transparent 0.7px);
background-size: 5px 5px;
mix-blend-mode: soft-light;
}
.mf-aurora__grid {
position: absolute;
inset: 0;
z-index: -1;
background:
linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px),
linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);
background-size: clamp(42px, 5vw, 72px) clamp(42px, 5vw, 72px);
-webkit-mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.3), transparent 68%);
mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.3), transparent 68%);
}
.mf-aurora__cursor {
position: absolute;
width: 420px;
height: 420px;
left: var(--mf-aurora-x);
top: var(--mf-aurora-y);
border-radius: 50%;
background: radial-gradient(circle, rgba(255, 255, 255, 0.1), transparent 64%);
filter: blur(8px);
transform: translate(-50%, -50%);
pointer-events: none;
mix-blend-mode: screen;
}
.mf-aurora__copy {
position: relative;
z-index: 4;
max-width: 760px;
padding: clamp(84px, 11vw, 148px) clamp(22px, 7vw, 112px) 64px;
}
.mf-aurora__eyebrow {
display: flex;
align-items: center;
gap: 10px;
margin: 0 0 22px;
color: currentColor;
opacity: 0.78;
font: 500 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.mf-aurora__eyebrow i {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--mf-aurora-accent);
box-shadow: 0 0 14px var(--mf-aurora-accent);
}
.mf-aurora__title {
margin: 0;
max-width: 11ch;
font-family: inherit;
font-size: clamp(54px, 9.4vw, 148px);
font-weight: 700;
line-height: 0.82;
letter-spacing: -0.075em;
text-transform: none;
color: transparent;
background: linear-gradient(112deg, #fff 10%, #bab6d7 33%, #ffd0ed 47%, #c0fff4 58%, #fff 74%);
background-size: 180% 100%;
-webkit-background-clip: text;
background-clip: text;
}
.mf-aurora__title em {
font-family: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
font-weight: 400;
font-style: italic;
letter-spacing: -0.06em;
}
.mf-aurora__text {
max-width: 44ch;
margin-top: 26px;
font-size: 17px;
line-height: 1.55;
opacity: 0.78;
}
.mf-aurora__text p {
margin: 0;
}
.mf-aurora__actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 22px;
margin-top: 38px;
}
.mf-aurora__button {
display: inline-flex;
align-items: center;
gap: 18px;
min-height: 50px;
padding: 0 22px;
border-radius: 8px;
background: #f1f0ed;
color: #131319;
font-size: 14px;
font-weight: 700;
letter-spacing: 0;
text-decoration: none;
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.4);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.mf-aurora__button span {
font-size: 18px;
transition: transform 0.2s ease;
}
.mf-aurora__button:hover {
transform: translateY(-3px);
box-shadow: 0 20px 38px rgba(0, 0, 0, 0.55);
}
.mf-aurora__button:hover span {
transform: translateX(4px);
}
.mf-aurora__link {
color: currentColor;
font-size: 14px;
font-weight: 600;
text-decoration: underline;
text-decoration-color: rgba(255, 255, 255, 0.35);
text-underline-offset: 6px;
}
.mf-aurora__link:hover {
text-decoration-color: currentColor;
}
.mf-aurora__button:focus-visible,
.mf-aurora__link:focus-visible {
outline: 2px solid var(--mf-aurora-accent);
outline-offset: 4px;
}
.mf-aurora__proof {
display: flex;
align-items: center;
gap: 10px;
margin: 30px 0 0;
font-size: 13px;
opacity: 0.72;
}
.mf-aurora__stars {
color: var(--mf-aurora-accent);
letter-spacing: 2px;
}
.mf-aurora__object {
position: absolute;
z-index: 2;
right: clamp(-140px, 3vw, 50px);
top: 50%;
width: min(54vw, 740px);
aspect-ratio: 1;
transform: translateY(-46%) perspective(1000px) rotateX(var(--mf-aurora-rx)) rotateY(var(--mf-aurora-ry));
transform-style: preserve-3d;
transition: transform 0.18s ease-out;
}
.mf-aurora__matter {
position: absolute;
inset: 19%;
border-radius: 42% 58% 60% 40% / 49% 41% 59% 51%;
background:
radial-gradient(circle at 30% 25%, #fff 0 2%, transparent 6%),
radial-gradient(circle at 68% 18%, #ffb4ee 0 4%, transparent 16%),
radial-gradient(circle at 31% 72%, #abffe3 0 3%, transparent 20%),
conic-gradient(from 142deg at 45% 47%, #faf5ff, #92ffe1 14%, #5a77ff 31%, #d57ef1 50%, #ffc4e3 66%, #b6ffe8 82%, #faf5ff);
box-shadow: inset 25px 18px 40px rgba(255, 255, 255, 0.55), inset -40px -34px 60px rgba(23, 19, 61, 0.6), 0 50px 95px rgba(0, 0, 0, 0.65);
filter: saturate(1.25);
animation: mf-aurora-float 7s ease-in-out infinite;
}
.mf-aurora__matter::before {
content: "";
position: absolute;
inset: 7%;
border-radius: inherit;
background: radial-gradient(ellipse at 26% 20%, rgba(255, 255, 255, 0.6), transparent 23%), linear-gradient(118deg, transparent 28%, rgba(255, 255, 255, 0.6) 40%, transparent 48%);
mix-blend-mode: screen;
opacity: 0.8;
}
.mf-aurora__matter::after {
content: "";
position: absolute;
inset: 11%;
border-radius: inherit;
border: 1px solid rgba(255, 255, 255, 0.5);
box-shadow: inset 0 0 28px rgba(255, 255, 255, 0.5);
}
.mf-aurora__sheen {
position: absolute;
z-index: 2;
inset: -5%;
border-radius: inherit;
background: linear-gradient(112deg, transparent 36%, rgba(255, 255, 255, 0.6) 46%, transparent 54%);
filter: blur(7px);
mix-blend-mode: overlay;
animation: mf-aurora-sheen 6s ease-in-out infinite;
}
.mf-aurora__core {
position: absolute;
inset: 29%;
border-radius: 50%;
background: radial-gradient(circle at 35% 28%, #fff, #ffd5f3 18%, #6a8bff 48%, #17133b 74%);
box-shadow: 0 0 45px rgba(255, 227, 241, 0.65), inset -8px -12px 21px #160d2d;
opacity: 0.95;
}
.mf-aurora__media {
position: absolute;
inset: 12%;
display: grid;
place-items: center;
animation: mf-aurora-float 7s ease-in-out infinite;
}
.mf-aurora__media::before {
content: "";
position: absolute;
inset: 6%;
border-radius: 50%;
background: conic-gradient(from 142deg, #92ffe1, #5a77ff, #d57ef1, #ffc4e3, #92ffe1);
filter: blur(60px);
opacity: 0.45;
}
.mf-aurora__img {
position: relative;
width: 100%;
height: 100%;
object-fit: contain;
filter: drop-shadow(0 40px 60px rgba(0, 0, 0, 0.55));
}
.mf-aurora__orbit {
position: absolute;
z-index: 3;
left: 2%;
right: 2%;
top: 47%;
height: 26%;
border: 1px solid rgba(255, 255, 255, 0.46);
border-radius: 50%;
transform: rotate(-21deg);
box-shadow: 0 0 22px rgba(198, 255, 239, 0.34);
}
.mf-aurora__orbit::after {
content: "";
position: absolute;
top: 46%;
right: 5%;
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--mf-aurora-accent);
box-shadow: 0 0 18px var(--mf-aurora-accent);
}
.mf-aurora__orbit--two {
left: 13%;
right: 13%;
top: 28%;
height: 50%;
border-color: rgba(255, 211, 243, 0.55);
transform: rotate(58deg);
}
.mf-aurora__orbit--two::after {
top: 10%;
right: 22%;
background: #ffd2f2;
box-shadow: 0 0 18px #ffd2f2;
}
.mf-aurora__shadow {
position: absolute;
z-index: -1;
left: 12%;
right: 10%;
bottom: 9%;
height: 13%;
border-radius: 50%;
background: rgba(0, 0, 0, 0.8);
filter: blur(22px);
transform: translateZ(-80px);
}
.mf-aurora__note {
position: absolute;
z-index: 4;
right: clamp(22px, 4vw, 64px);
bottom: 36px;
display: grid;
gap: 9px;
max-width: 220px;
padding-left: 15px;
border-left: 1px solid rgba(255, 255, 255, 0.35);
}
.mf-aurora__note span {
font: 500 10px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--mf-aurora-accent);
}
.mf-aurora__note p {
margin: 0;
font-size: 13px;
line-height: 1.35;
opacity: 0.82;
}
@keyframes mf-aurora-float {
0%, 100% { transform: translateY(0) rotate(-4deg); }
50% { transform: translateY(-18px) rotate(5deg); }
}
@keyframes mf-aurora-sheen {
0%, 100% { transform: translateX(-30%) rotate(4deg); }
50% { transform: translateX(24%) rotate(4deg); }
}
@media screen and (max-width: 749px) {
.mf-aurora {
min-height: 640px;
}
.mf-aurora__copy {
padding: 72px 22px 300px;
}
.mf-aurora__title {
font-size: clamp(50px, 15vw, 96px);
}
.mf-aurora__object {
top: auto;
bottom: -12%;
right: -18%;
width: 92vw;
transform: none;
opacity: 0.85;
}
.mf-aurora__note {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.mf-aurora__matter,
.mf-aurora__sheen,
.mf-aurora__media {
animation: none;
}
.mf-aurora__cursor {
display: none;
}
.mf-aurora__object {
transition: none;
}
}
{% endstylesheet %}
{% javascript %}
if (!customElements.get('mf-aurora-hero')) {
customElements.define(
'mf-aurora-hero',
class extends HTMLElement {
connectedCallback() {
if (this.dataset.pointer === 'false') return;
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
if (!window.matchMedia('(pointer: fine)').matches) return;
this.tx = 0;
this.ty = 0;
this.x = 0;
this.y = 0;
this.frame = 0;
this.tick = this.tick.bind(this);
this.onMove = (event) => {
const r = this.getBoundingClientRect();
this.tx = event.clientX - r.left;
this.ty = event.clientY - r.top;
if (!this.frame) this.frame = requestAnimationFrame(this.tick);
};
this.onLeave = () => {
const r = this.getBoundingClientRect();
this.tx = r.width / 2;
this.ty = r.height / 2;
if (!this.frame) this.frame = requestAnimationFrame(this.tick);
};
this.addEventListener('pointermove', this.onMove);
this.addEventListener('pointerleave', this.onLeave);
}
disconnectedCallback() {
if (this.onMove) this.removeEventListener('pointermove', this.onMove);
if (this.onLeave) this.removeEventListener('pointerleave', this.onLeave);
if (this.frame) cancelAnimationFrame(this.frame);
}
tick() {
this.x += (this.tx - this.x) * 0.09;
this.y += (this.ty - this.y) * 0.09;
const r = this.getBoundingClientRect();
this.style.setProperty('--mf-aurora-x', this.x + 'px');
this.style.setProperty('--mf-aurora-y', this.y + 'px');
this.style.setProperty('--mf-aurora-rx', (this.y / r.height - 0.5) * -9 + 'deg');
this.style.setProperty('--mf-aurora-ry', (this.x / r.width - 0.5) * 9 + 'deg');
if (Math.abs(this.tx - this.x) + Math.abs(this.ty - this.y) > 0.4) {
this.frame = requestAnimationFrame(this.tick);
} else {
this.frame = 0;
}
}
}
);
}
{% endjavascript %}
{% schema %}
{
"name": "EX · Aurora hero",
"tag": "section",
"class": "mf-section",
"disabled_on": {
"groups": ["header", "footer"]
},
"settings": [
{
"type": "header",
"content": "Content"
},
{
"type": "text",
"id": "eyebrow",
"label": "Eyebrow",
"default": "New · The Aurora Serum"
},
{
"type": "inline_richtext",
"id": "heading",
"label": "Heading",
"default": "Glow that feels"
},
{
"type": "inline_richtext",
"id": "heading_accent",
"label": "Heading accent (italic line)",
"default": "tangible."
},
{
"type": "select",
"id": "heading_tag",
"label": "Heading HTML tag",
"info": "Use H1 only when this is the first section of the page.",
"options": [
{ "value": "h1", "label": "H1" },
{ "value": "h2", "label": "H2" }
],
"default": "h2"
},
{
"type": "richtext",
"id": "text",
"label": "Text",
"default": "<p>An iridescent vitamin C serum that turns dull, tired skin luminous in 14 days, without the sting.</p>"
},
{
"type": "text",
"id": "button_label",
"label": "Button label",
"default": "Shop the serum"
},
{
"type": "url",
"id": "button_link",
"label": "Button link"
},
{
"type": "text",
"id": "link_label",
"label": "Secondary link label",
"default": "Discover the ritual"
},
{
"type": "url",
"id": "link_url",
"label": "Secondary link"
},
{
"type": "text",
"id": "proof",
"label": "Social proof line",
"default": "4.9/5 from 2,340 verified reviews"
},
{
"type": "header",
"content": "Visual"
},
{
"type": "image_picker",
"id": "image",
"label": "Product image",
"info": "Optional. A transparent PNG floats inside the orbit. Leave empty to show the iridescent sculpture."
},
{
"type": "text",
"id": "note_title",
"label": "Note label",
"default": "Clinically tested"
},
{
"type": "text",
"id": "note_text",
"label": "Note text",
"default": "93% saw visibly brighter skin in 14 days."
},
{
"type": "checkbox",
"id": "enable_pointer",
"label": "Light follows the cursor",
"default": true
},
{
"type": "range",
"id": "min_height",
"label": "Minimum height",
"min": 520,
"max": 960,
"step": 20,
"unit": "px",
"default": 720
},
{
"type": "header",
"content": "Colors"
},
{
"type": "color",
"id": "color_bg",
"label": "Background",
"default": "#08090d"
},
{
"type": "color",
"id": "color_text",
"label": "Text",
"default": "#f6f2ee"
},
{
"type": "color",
"id": "color_accent",
"label": "Accent",
"default": "#b8ff73"
}
],
"presets": [
{
"name": "EX · Aurora hero"
}
]
}
{% endschema %}
Why it converts
A single, distinctive hero with proof next to the CTA stops the scroll and sends intent to one product.
Specs
About this section
Aurora Hero is a free Shopify Online Store 2.0 section for launches and flagship products. It pairs oversized chrome-gradient typography and an italic serif accent line with an iridescent CSS sculpture wrapped in two orbital rings. On desktop, a soft light bloom follows the cursor and the sculpture tilts in 3D, driven by a small custom element that eases CSS custom properties with requestAnimationFrame. Merchants can swap the sculpture for their own product image: a transparent PNG floats inside the orbit with a colored glow and drop shadow. Every piece of copy is editable in the theme editor: eyebrow, two-line heading, rich text, primary button, secondary link, a social-proof line with stars and a lower-right clinical note. Background, text and accent colors are settings, as is the minimum height. The conversion logic is focus: one hero, one product, one call to action, with the review score and a clinical claim sitting directly beside the button so shoppers see proof at the moment of intent. The section ships as one self-contained .liquid file with scoped CSS and JavaScript, no external fonts, libraries or images, and it respects prefers-reduced-motion (animations stop and the pointer effect is disabled) and touch devices (no pointer tracking).
Questions
Can I use my own product photo instead of the sculpture?
Yes. Pick an image in the Product image setting. A transparent PNG works best: it floats inside the orbital rings with a colored glow and a drop shadow. Leave the setting empty to keep the iridescent CSS sculpture.
Does the cursor effect slow down my store?
No. The effect only runs on devices with a fine pointer, only while the cursor moves over the section, and it animates CSS custom properties inside a single requestAnimationFrame loop that stops as soon as the light settles. It is disabled entirely when the visitor prefers reduced motion.
Should the heading be an H1?
Use the Heading HTML tag setting. Choose H1 only when Aurora Hero is the first section of the page and your theme does not already output an H1 there; otherwise keep the default H2.
Which themes does it work with?
Any Online Store 2.0 theme, including Dawn and Horizon. The section is a single file with its own scoped CSS and JavaScript, uses no rem units, and inherits your theme's body font.
More sections
Pro