
Shopify Liquid
Generate and edit Shopify Online Store 2.0 Liquid blocks—such as hero slides with responsive images, overlays, and CTAs—for theme customization without guessing section schema.
Overview
Shopify Liquid is an agent skill for the Build phase that helps solo builders author Shopify theme Liquid blocks—like hero slides—with responsive images, overlays, and editor-safe attributes.
Install
npx skills add https://github.com/shopify/shopify-ai-toolkit --skill shopify-liquidWhat is this skill?
- Hero-slide block pattern with background media, overlay opacity CSS variable, and alignment settings
- Responsive `<picture>` branch for separate mobile vs desktop hero images with eager loading and `100vw` sizes
- Placeholder SVG fallback when no image is configured in theme editor
- CTA buttons and typographic hierarchy (subheading, heading, description) wired to `block.settings`
- Uses `block.shopify_attributes` for theme editor compatibility on Online Store 2.0 sections
Adoption & trust: 5.9k installs on skills.sh; 373 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need Shopify storefront sections that match OS 2.0 block conventions, but hand-written Liquid often misses responsive images, schema wiring, or theme-editor hooks.
Who is it for?
Indie merchants or freelancers extending Shopify themes who live in `.liquid` files and section/block JSON—not building a separate SaaS backend.
Skip if: Headless Shopify (Hydrogen-only) projects with no theme Liquid, or teams that only need Shopify Admin API / app backend work.
When should I use this skill?
When authoring or refactoring Shopify theme Liquid for sections, blocks, or hero/media components in an ecommerce storefront.
What do I get? / Deliverables
After the skill runs, you get production-oriented Liquid block markup with documented examples, mobile/desktop media handling, and settings-driven content you can drop into a theme section.
- Liquid block or section snippets with `{% doc %}` and settings bindings
- Responsive image markup using Shopify CDN filters
Recommended Skills
Journey fit
Storefront markup and theme blocks are implemented in the Build phase before merchants can preview or ship theme updates. Liquid templates, `{% doc %}`, `content_for` blocks, and `image_url` patterns are core frontend/theme authoring—not backend APIs or ops.
How it compares
Use for theme Liquid snippets and section blocks—not for generic HTML/CSS generator skills that ignore Shopify `image_url`, `shopify_attributes`, and block settings.
Common Questions / FAQ
Who is shopify-liquid for?
Solo builders and theme developers shipping or customizing Shopify Online Store 2.0 themes who want agent help writing correct Liquid for sections and blocks.
When should I use shopify-liquid?
Use it during Build (frontend) when creating hero banners, slideshow blocks, or other `content_for` blocks; also when iterating theme markup before you Ship theme updates to a staging or live store.
Is shopify-liquid safe to install?
Treat it like any third-party agent skill: review the Security Audits panel on this Prism page and inspect generated Liquid before publishing theme changes that affect customer-facing pages.
SKILL.md
READMESKILL.md - Shopify Liquid
{% doc %} Renders an individual slide within a hero banner section. Includes a background image with overlay, heading, subheading, description, and up to two CTA buttons. @example {% content_for 'block', type: 'hero-slide', id: 'slide-1' %} {% enddoc %} <div class="hero-banner__slide hero-slide {{ block.settings.content_alignment }}" style="--overlay-opacity: {{ block.settings.overlay_opacity | divided_by: 100.0 }};" {{ block.shopify_attributes }} > <div class="hero-slide__media"> {%- if block.settings.image != blank -%} {%- if block.settings.mobile_image != blank -%} <picture> <source media="(max-width: 749px)" srcset="{{ block.settings.mobile_image | image_url: width: 800 }}" > {{ block.settings.image | image_url: width: 2000 | image_tag: loading: 'eager', class: 'hero-slide__image', sizes: '100vw' }} </picture> {%- else -%} {{ block.settings.image | image_url: width: 2000 | image_tag: loading: 'eager', class: 'hero-slide__image', sizes: '100vw' }} {%- endif -%} {%- else -%} {{ 'lifestyle-1' | placeholder_svg_tag: 'hero-slide__image hero-slide__placeholder' }} {%- endif -%} <div class="hero-slide__overlay"></div> </div> <div class="hero-slide__content {{ block.settings.text_color }}"> {%- if block.settings.subheading != blank -%} <p class="hero-slide__subheading">{{ block.settings.subheading | escape }}</p> {%- endif -%} {%- if block.settings.heading != blank -%} <h2 class="hero-slide__heading">{{ block.settings.heading | escape }}</h2> {%- endif -%} {%- if block.settings.description != blank -%} <p class="hero-slide__description">{{ block.settings.description | escape }}</p> {%- endif -%} {%- if block.settings.button_label != blank or block.settings.button_label_2 != blank -%} <div class="hero-slide__buttons"> {%- if block.settings.button_label != blank -%} <a href="{{ block.settings.button_link | default: '#' }}" class="hero-slide__btn {{ block.settings.button_style }}" > {{- block.settings.button_label | escape -}} </a> {%- endif -%} {%- if block.settings.button_label_2 != blank -%} <a href="{{ block.settings.button_link_2 | default: '#' }}" class="hero-slide__btn hero-slide__btn--outline" > {{- block.settings.button_label_2 | escape -}} </a> {%- endif -%} </div> {%- endif -%} </div> </div> {% stylesheet %} .hero-banner__slide { position: relative; width: 100%; height: 100%; overflow: hidden; } .hero-slide__media { position: absolute; inset: 0; z-index: 0; } .hero-slide__image { width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; } .hero-slide__placeholder { width: 100%; height: 100%; } .hero-slide__overlay { position: absolute; inset: 0; background-color: rgba(0, 0, 0, var(--overlay-opacity, 0.3)); } .hero-slide__content { position: relative; z-index: 1; display: flex; flex-direction: column; justify-content: center; height: 100%; padding: 3rem 4rem; max-width: 700px; } .hero-slide.hero-slide--center .hero-slide__content { align-items: center; text-align: center; margin-inline: auto; max-width: none; } .hero-slide.hero-slide--right .hero-slide__content { align-items: flex-end; text-align: right; margin-inline-start: auto; } .hero-slide__content.hero-slide-text--light { color: #ffffff; } .hero-slide__content.hero-slide-text--dark { color: #1a1a1a; } .hero-slide__subheading { margin: 0 0 0.625rem; font-size: 0.8125rem; font-weight: 600; letter-spacing: