From shopify-developer
Use when writing, editing, reviewing, or debugging Shopify Liquid theme code for hairsolutions.co, including Horizon 3.5.1 sections, blocks, snippets, schema, dynamic sources, metaobjects, theme editor behavior, Liquid syntax, and theme-block architecture
How this skill is triggered — by the user, by Claude, or both
Slash command
/shopify-developer:shopify-liquidThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This is the primary Liquid implementation skill for Hair Solutions Co. Use it for theme code, not Admin API workflows, visual-only design, or production deployment.
This is the primary Liquid implementation skill for Hair Solutions Co. Use it for theme code, not Admin API workflows, visual-only design, or production deployment.
The live storefront target is hairsolutions.co on one-head-hair.myshopify.com, using Horizon 3.5.1 as the live theme baseline. Horizon is a theme-block-first Shopify theme: prefer reusable /blocks/*.liquid where merchant-configurable components need reuse, nesting, dynamic sources, or theme editor control.
.env values.| Item | Current rule |
|---|---|
| Store | one-head-hair.myshopify.com / hairsolutions.co |
| Theme baseline | Horizon 3.5.1 live theme |
| Business priority | Protect revenue, customer experience, trust, speed, and operational control |
| Custom prefixes | hs-custom-*, support-hub-*, kb_*, blog-* |
| Do not casually edit | EComposer ecom-*, SectionStore ss-*, Foxify foxify-*, app snippets, checkout-adjacent flows |
| Typography | Preserve Knockout font conventions where already implemented |
| Mobile | Required on every deliverable |
| Need | Use |
|---|---|
| Liquid, sections, blocks, snippets, schema | This skill |
| Storefront styling, CSS, UI, animation, JS | shopify-front-end |
| Deployment, app safety, live theme operations | shopify-production |
| Metaobject definitions and Admin API custom data | shopify-metaobjects or official Shopify custom-data skill |
| Storefront/Admin API integrations | shopify-apis or official Shopify API skills |
| Very broad official Liquid reference | /Users/vMac/03_agents/plugins/shopify-plugin/skills/shopify-liquid/SKILL.md |
| Horizon-specific architecture reference | /Users/vMac/03_agents/plugins/shopify-liquid-designer/skills/shopify-horizon/SKILL.md |
AGENTS.md, CLAUDE.md, README.md, and nearby theme files if they exist.Horizon 3.5.1 is a patch-level live baseline. Its public release notes call out translation-string fixes and better small-screen support for Split showcase. Do not reintroduce layout assumptions that break narrow mobile screens.
Horizon uses modern Shopify theme architecture:
/blocks/*.liquid for reusable theme blocks./sections/*.liquid for page-level section containers./snippets/*.liquid for reusable logic or markup without merchant settings.{% content_for 'blocks' %} to render dynamic child blocks.{% content_for 'block', type: '...', id: '...' %} to render static blocks.{% stylesheet %} and {% javascript %} where component-scoped assets are supported.| Use case | Choose | Why |
|---|---|---|
| Reusable merchant-configurable component | Theme block in /blocks | Reuse across sections, supports nesting and settings |
| One-off content item local to one section | Section block | Simpler and scoped |
| Reused code that needs parameters | Snippet | Accepts variables through render |
| Locked structural child that still has settings | Static theme block | Keeps layout stable while exposing settings |
| App-provided content | App block | Preserves installed app behavior |
Do not mix section blocks and theme blocks in the same section unless current Shopify documentation and the live theme prove the pattern is supported for that file.
| File type | Location | Rule |
|---|---|---|
| Section | /sections/name.liquid | Full-width page module, schema required |
| Theme block | /blocks/name.liquid | Reusable configurable component, schema required |
| Snippet | /snippets/name.liquid | Reusable render-only code, no merchant settings |
| Asset | /assets/name.css or /assets/name.js | Only when global or reused enough to justify asset file |
| Template | /templates/*.json | Theme-editor composition, avoid hardcoded layout churn |
| Locale | /locales/*.json | Translatable strings only |
{%- -%} and {{- -}} where it keeps output clean..value for metaobject/metafield values when required by the object shape.escape.image_url plus image_tag for images.Every editable block root needs:
{{- block.shopify_attributes -}}
Every dynamic section or block container needs stable structure and predictable classes:
<section
class="hs-custom-feature color-{{ section.settings.color_scheme }}"
id="shopify-section-{{ section.id }}"
>
{%- content_for 'blocks' -%}
</section>
For section blocks:
{%- for block in section.blocks -%}
<div class="hs-custom-feature__item" {{ block.shopify_attributes }}>
{{- block.settings.heading | escape -}}
</div>
{%- endfor -%}
Use this when the component should be reusable or nested.
{% doc %}
Renders a configurable trust item for Hair Solutions pages.
@example
{% content_for 'block', type: 'hs-trust-item', id: 'trust-item' %}
{% enddoc %}
{%- liquid
assign heading = block.settings.heading
assign body = block.settings.body
-%}
<div class="hs-trust-item" {{ block.shopify_attributes }}>
{%- if heading != blank -%}
<h3 class="hs-trust-item__heading">{{- heading | escape -}}</h3>
{%- endif -%}
{%- if body != blank -%}
<div class="hs-trust-item__body rte">
{{- body -}}
</div>
{%- endif -%}
{%- content_for 'blocks' -%}
</div>
{% stylesheet %}
.hs-trust-item {
display: grid;
gap: 0.75rem;
}
{% endstylesheet %}
{% schema %}
{
"name": "Trust item",
"blocks": [{ "type": "@theme" }, { "type": "@app" }],
"settings": [
{
"type": "text",
"id": "heading",
"label": "Heading"
},
{
"type": "richtext",
"id": "body",
"label": "Body"
}
],
"presets": [
{
"name": "Trust item"
}
]
}
{% endschema %}
Use this for a section that accepts reusable theme blocks.
{%- liquid
assign color_scheme = section.settings.color_scheme
assign heading = section.settings.heading
-%}
<section
class="hs-custom-section color-{{ color_scheme }}"
id="shopify-section-{{ section.id }}"
>
<div class="hs-custom-section__inner">
{%- if heading != blank -%}
<h2 class="hs-custom-section__heading">{{- heading | escape -}}</h2>
{%- endif -%}
<div class="hs-custom-section__blocks">
{%- content_for 'blocks' -%}
</div>
</div>
</section>
{% stylesheet %}
.hs-custom-section {
padding-block: clamp(2rem, 5vw, 5rem);
}
.hs-custom-section__inner {
width: min(100% - 2rem, 1400px);
margin-inline: auto;
}
.hs-custom-section__blocks {
display: grid;
gap: 1rem;
}
{% endstylesheet %}
{% schema %}
{
"name": "HS custom section",
"tag": "section",
"class": "section",
"blocks": [{ "type": "@theme" }, { "type": "@app" }],
"settings": [
{
"type": "color_scheme",
"id": "color_scheme",
"label": "Color scheme",
"default": "scheme-1"
},
{
"type": "text",
"id": "heading",
"label": "Heading"
}
],
"presets": [
{
"name": "HS custom section"
}
]
}
{% endschema %}
Use static blocks when the section layout needs a fixed child component that merchants can configure but not move/delete.
{%- content_for "block", type: "hs-split-showcase-media", id: "split-showcase-media" -%}
Rules:
id is required and must be unique within the immediate parent.presets.id, type, and label.default on schema text and textarea inputs when the project rule says to use placeholder.color_scheme instead of ad hoc color pickers unless the design truly needs custom colors.image_picker, video, product, collection, page, url, richtext, inline_richtext, range, checkbox, and select according to actual editor needs.select.Use metaobjects when content is structured, reusable, or should be managed like a CMS. Use metafields when the value belongs to a Shopify resource such as product, variant, collection, page, or customer.
Common access pattern:
{%- assign guide = product.metafields.custom.fit_guide.value -%}
{%- if guide != blank -%}
<section class="hs-fit-guide">
{%- if guide.title.value != blank -%}
<h2>{{- guide.title.value | escape -}}</h2>
{%- endif -%}
</section>
{%- endif -%}
Rules:
.value for references and structured values where needed.shopify-metaobjects.Use Shopify image filters. Avoid hardcoded CDN variants.
{%- if section.settings.image != blank -%}
{{
section.settings.image
| image_url: width: 1600
| image_tag:
widths: '375, 550, 750, 1100, 1500, 1600',
sizes: '(min-width: 990px) 50vw, 100vw',
loading: 'lazy',
alt: section.settings.image.alt
}}
{%- endif -%}
Above-the-fold hero image rule:
fetchpriority if the current theme pattern supports it.Product, variant, cart, and selling-plan UI is revenue-sensitive.
Before changing product forms:
Before returning or committing a Liquid change:
block.shopify_attributes preserved on block roots.{% content_for 'blocks' %}..value.| Mistake | Fix |
|---|---|
| Editing from memory | Read the live file first |
| Treating Horizon like Dawn | Use theme blocks and content_for patterns |
| Hardcoding block IDs | Use stable static IDs only where required; never rely on generated IDs |
Forgetting block.shopify_attributes | Add it to editable block roots |
| Renaming setting IDs | Keep live IDs stable or plan migration |
| Using snippets for merchant-configurable UI | Use theme blocks |
| Using theme blocks for pure helper markup | Use snippets |
| Breaking app blocks | Include @app where app insertion matters and avoid app-owned files |
| Desktop-only section | Build and inspect mobile first |
| Publishing from a coding task | Stop and ask for approval |
Use the project's existing validation first. If in a Shopify theme folder, likely checks include:
shopify theme check
shopify theme dev --store one-head-hair.myshopify.com
If official Shopify plugin validation scripts are available, use them for generated Liquid artifacts. If they are not available in the current environment, state that clearly and use Theme Check or targeted review instead.
https://shopify.dev/docs/storefronts/themes/architecture/blockshttps://shopify.dev/docs/storefronts/themes/architecture/blocks/theme-blocks/quick-starthttps://shopify.dev/docs/storefronts/themes/architecture/blocks/theme-blocks/static-blockshttps://shopify.dev/docs/api/liquid/objects/blockhttps://github.com/Shopify/horizonhttps://shopinfo.app/themes/horizonProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub vincent-laroche/hairsolutionsco-ai-toolkit --plugin shopify-developer