Loading...
Loading...
Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas
npx skill4agent add shopify/shopify-ai-toolkit shopify-liquidbashbashnode scripts/search_docs.mjs "<tag, filter, or object name>"[]bashnode scripts/validate.mjs --filename <file.liquid> --filetype <sections|snippets|blocks|...> --code '<content>' --model YOUR_MODEL_NAME --client-name YOUR_CLIENT_NAME --client-version YOUR_CLIENT_VERSION --artifact-id YOUR_ARTIFACT_ID --revision REVISION_NUMBER.
├── assets # Stores static assets (CSS, JS, images, fonts, etc.)
├── blocks # Reusable, nestable, customizable components
├── config # Global theme settings and customization options
├── layout # Top-level wrappers for pages (layout templates)
├── locales # Translation files for theme internationalization
├── sections # Modular full-width page components
├── snippets # Reusable Liquid code or HTML fragments
└── templates # Templates combining sections and blocks to define page structuressections.liquid{% schema %}schemas/section.jsonblocks.liquid{% schema %}schemas/theme_block.json{% doc %}{% content_for 'block', id: '42', type: 'block_name' %}snippetsrender{% doc %}layout<head><body>{{ content_for_header }}<head>{{ content_for_layout }}configconfig/settings_schema.jsonschemas/theme_settings.jsonconfig/settings_data.jsonconfig/settings_schema.jsonassetsasset_urlcritical.css{% stylesheet %}{% javascript %}localesen.default.jsonfr.json{{ 'key' | t }}localesschemas/translations.jsontemplates{% stylesheet %}{% javascript %}{% stylesheet %}{% javascript %}snippets/blocks/sections/{% doc %}
Renders a responsive image that might be wrapped in a link.
@param {image} image - The image to be rendered
@param {string} [url] - An optional destination URL for the image
@example
{% render 'image', image: product.featured_image %}
{% enddoc %}
<a href="{{ url | default: '#' }}">{{ image | image_url: width: 200, height: 200 | image_tag }}</a>{% schema %}{% schema %}{% schema %}<div class="collection" style="--gap: {{ block.settings.gap }}px">
Example
</div>
{% stylesheet %}
.collection {
gap: var(--gap);
}
{% endstylesheet %}
{% schema %}
{
"settings": [{
"type": "range",
"label": "gap",
"id": "gap",
"min": 0,
"max": 100,
"unit": "px",
"default": 0,
}]
}
{% endschema %}<div class="collection {{ block.settings.layout }}">
Example
</div>
{% stylesheet %}
.collection--full-width {
/* multiple styles */
}
.collection--narrow {
/* multiple styles */
}
{% endstylesheet %}
{% schema %}
{
"settings": [{
"type": "select",
"id": "layout",
"label": "layout",
"values": [
{ "value": "collection--full-width", "label": "t:options.full" },
{ "value": "collection--narrow", "label": "t:options.narrow" }
]
}]
}
{% endschema %}{% schema %}
{
"type": "select",
"id": "columns_mobile",
"label": "Columns on mobile",
"options": [
{ "value": 1, "label": "1" },
{ "value": "2", "label": "2" }
]
}
{% endschema %}{{ ... }}{{- ... -}}{% ... %}{%- ... -%}-{%{{%}}}{{- product.title -}}{%- if available -%}In stock{%- endif -%}=
orandcontainsif{% if cond %}{% if product.title == "Awesome Shoes" %}
These shoes are awesome!
{% endif %}{% if product.type == "Shirt" or product.type == "Shoes" %}
This is a shirt or a pair of shoes.
{% endif %}{% if product.title contains "Pack" %}{% if product.tags contains "Hello" %}contains{% if a %}
...
{% elsif b %}
...
{% endif %}{% unless condition %}
...
{% endunless %}{% case variable %}
{% when 'a' %}
a
{% when 'b' %}
b
{% else %}
other
{% endcase %}{% if product.available %}
In stock
{% else %}
Sold out
{% endif %}{% for item in collection.products %}
{{ item.title }}
{% else %}
No products found.
{% endfor %}{% assign my_variable = 'value' %}
{% capture my_variable %}
Contents of variable
{% endcapture %}
{% increment counter %}
{% decrement counter %}upcase{{ string | upcase }}split{{ string | split: string }}splitlast{{ array | last }}upcasesplitlast"WORLD"{{ "hello world" | upcase | split: " " | last }}"hello world""HELLO WORLD"split["HELLO", "WORLD"]last"WORLD"compact{{ array | compact }}arrayconcat{{ array | concat: array }}arrayfind{{ array | find: string, string }}untypedfind_index{{ array | find_index: string, string }}numberfirst{{ array | first }}untypedhas{{ array | has: string, string }}booleanjoin{{ array | join }}stringlast{{ array | last }}untypedmap{{ array | map: string }}arrayreject{{ array | reject: string, string }}arrayreverse{{ array | reverse }}arraysize{{ variable | size }}numbersort{{ array | sort }}arraysort_natural{{ array | sort_natural }}arraysum{{ array | sum }}numberuniq{{ array | uniq }}arraywhere{{ array | where: string, string }}arrayitem_count_for_variant{{ cart | item_count_for_variant: {variant_id} }}numberline_items_for{{ cart | line_items_for: object }}arraylink_to_type{{ string | link_to_type }}stringlink_to_vendor{{ string | link_to_vendor }}stringsort_by{{ string | sort_by: string }}stringurl_for_type{{ string | url_for_type }}stringurl_for_vendor{{ string | url_for_vendor }}stringwithin{{ string | within: collection }}stringhighlight_active_tag{{ string | highlight_active_tag }}stringbrightness_difference{{ string | brightness_difference: string }}numbercolor_brightness{{ string | color_brightness }}numbercolor_contrast{{ string | color_contrast: string }}numbercolor_darken{{ string | color_darken: number }}stringcolor_desaturate{{ string | color_desaturate: number }}stringcolor_difference{{ string | color_difference: string }}numbercolor_extract{{ string | color_extract: string }}numbercolor_lighten{{ string | color_lighten: number }}stringcolor_mix{{ string | color_mix: string, number }}stringcolor_modify{{ string | color_modify: string, number }}stringcolor_saturate{{ string | color_saturate: number }}stringcolor_to_hex{{ string | color_to_hex }}stringcolor_to_hsl{{ string | color_to_hsl }}stringcolor_to_oklch{{ string | color_to_oklch }}stringcolor_to_rgb{{ string | color_to_rgb }}stringhex_to_rgba{{ string | hex_to_rgba }}stringcustomer_login_link{{ string | customer_login_link }}stringcustomer_logout_link{{ string | customer_logout_link }}stringcustomer_register_link{{ string | customer_register_link }}stringavatar{{ customer | avatar }}stringlogin_button{{ shop | login_button }}stringdate{{ date | date: string }}stringdefault_errors{{ string | default_errors }}stringdefault{{ variable | default: variable }}untypeddefault_pagination{{ paginate | default_pagination }}stringfont_face{{ font | font_face }}stringfont_modify{{ font | font_modify: string, string }}fontfont_url{{ font | font_url }}stringdate{{ string | date: string }}stringjson{{ variable | json }}stringstructured_data{{ variable | structured_data }}stringunit_price_with_measurement{{ number | unit_price_with_measurement: unit_price_measurement }}stringweight_with_unit{{ number | weight_with_unit }}stringasset_img_url{{ string | asset_img_url }}stringasset_url{{ string | asset_url }}stringfile_img_url{{ string | file_img_url }}stringfile_url{{ string | file_url }}stringglobal_asset_url{{ string | global_asset_url }}stringshopify_asset_url{{ string | shopify_asset_url }}stringclass_list{{ settings.layout | class_list }}stringtime_tag{{ string | time_tag: string }}stringinline_asset_content{{ asset_name | inline_asset_content }}stringhighlight{{ string | highlight: string }}stringlink_to{{ string | link_to: string }}stringplaceholder_svg_tag{{ string | placeholder_svg_tag }}stringpreload_tag{{ string | preload_tag: as: string }}stringscript_tag{{ string | script_tag }}stringstylesheet_tag{{ string | stylesheet_tag }}stringcurrency_selector{{ form | currency_selector }}stringtranslate{{ string | t }}stringformat_address{{ address | format_address }}stringabs{{ number | abs }}numberat_least{{ number | at_least }}numberat_most{{ number | at_most }}numberceil{{ number | ceil }}numberdivided_by{{ number | divided_by: number }}numberfloor{{ number | floor }}numberminus{{ number | minus: number }}numbermodulo{{ number | modulo: number }}numberplus{{ number | plus: number }}numberround{{ number | round }}numbertimes{{ number | times: number }}numberexternal_video_tag{{ variable | external_video_tag }}stringexternal_video_url{{ media | external_video_url: attribute: string }}stringimage_tag{{ string | image_tag }}stringmedia_tag{{ media | media_tag }}stringmodel_viewer_tag{{ media | model_viewer_tag }}stringvideo_tag{{ media | video_tag }}stringarticle_img_url{{ variable | article_img_url }}stringcollection_img_url{{ variable | collection_img_url }}stringimage_url{{ variable | image_url: width: number, height: number }}stringimg_tag{{ string | img_tag }}stringimg_url{{ variable | img_url }}stringproduct_img_url{{ variable | product_img_url }}stringmetafield_tag{{ metafield | metafield_tag }}stringmetafield_text{{ metafield | metafield_text }}stringmoney{{ number | money }}stringmoney_with_currency{{ number | money_with_currency }}stringmoney_without_currency{{ number | money_without_currency }}stringmoney_without_trailing_zeros{{ number | money_without_trailing_zeros }}stringpayment_button{{ form | payment_button }}stringpayment_terms{{ form | payment_terms }}stringpayment_type_img_url{{ string | payment_type_img_url }}stringpayment_type_svg_tag{{ string | payment_type_svg_tag }}stringhmac_sha1{{ string | hmac_sha1: string }}stringhmac_sha256{{ string | hmac_sha256: string }}stringmd5{{ string | md5 }}stringsha1{{ string | sha1: string }}stringsha256{{ string | sha256: string }}stringappend{{ string | append: string }}stringbase64_decode{{ string | base64_decode }}stringbase64_encode{{ string | base64_encode }}stringbase64_url_safe_decode{{ string | base64_url_safe_decode }}stringbase64_url_safe_encode{{ string | base64_url_safe_encode }}stringcapitalize{{ string | capitalize }}stringdowncase{{ string | downcase }}stringescape{{ string | escape }}stringescape_once{{ string | escape_once }}stringlstrip{{ string | lstrip }}stringnewline_to_br{{ string | newline_to_br }}stringprepend{{ string | prepend: string }}stringremove{{ string | remove: string }}stringremove_first{{ string | remove_first: string }}stringremove_last{{ string | remove_last: string }}stringreplace{{ string | replace: string, string }}stringreplace_first{{ string | replace_first: string, string }}stringreplace_last{{ string | replace_last: string, string }}stringrstrip{{ string | rstrip }}stringslice{{ string | slice }}stringsplit{{ string | split: string }}arraystrip{{ string | strip }}stringstrip_html{{ string | strip_html }}stringstrip_newlines{{ string | strip_newlines }}stringtruncate{{ string | truncate: number }}stringtruncatewords{{ string | truncatewords: number }}stringupcase{{ string | upcase }}stringurl_decode{{ string | url_decode }}stringurl_encode{{ string | url_encode }}stringcamelize{{ string | camelize }}stringhandleize{{ string | handleize }}stringurl_escape{{ string | url_escape }}stringurl_param_escape{{ string | url_param_escape }}stringpluralize{{ number | pluralize: string, string }}stringlink_to_add_tag{{ string | link_to_add_tag }}stringlink_to_remove_tag{{ string | link_to_remove_tag }}stringlink_to_tag{{ string | link_to_tag }}stringcollectionspagesall_productsarticlesblogscartclosestcontent_for_headercustomerimageslinklistslocalizationmetaobjectsrequestroutesshopthemesettingstemplateadditional_checkout_buttonsall_country_option_tagscanonical_urlcontent_for_additional_checkout_buttonscontent_for_indexcontent_for_layoutcountry_option_tagscurrent_pagehandlepage_descriptionpage_imagepage_titlepowered_by_linkscripts/articlearticleblog/blogblogcurrent_tags/cartcart/checkoutcheckout/collectioncollectioncurrent_tags/customers/accountcustomer/customers/addressescustomer/customers/ordercustomerorder/gift_card.liquidgift_cardrecipient/metaobjectmetaobject/pagepage/productproduct/robots.txt.liquidrobots/searchsearchcontent_for'blocks''block'{% content_for 'blocks' %}
{% content_for 'block', type: "slide", id: "slide-1" %}formactivate_customer_passwordcartcontactcreate_customercurrencycustomercustomer_addresscustomer_loginguest_loginlocalizationnew_commentproductrecover_customer_passwordreset_customer_passwordstorefront_password{% form 'form_type' %}
content
{% endform %}{% layout name %}Caution: Predefined Liquid objects can be overridden by variables with the same name. To make sure that you can access all Liquid objects, make sure that your variable name doesn't match a predefined object's name.
{% assign variable_name = value %}{% break %}Caution: Predefined Liquid objects can be overridden by variables with the same name. To make sure that you can access all Liquid objects, make sure that your variable name doesn't match a predefined object's name.
{% capture variable %}
value
{% endcapture %}{% case variable %}
{% when first_value %}
first_expression
{% when second_value %}
second_expression
{% else %}
third_expression
{% endcase %}comment{% comment %}
content
{% endcomment %}{% continue %}cycleforTip: Use thetag to output text in a predictable pattern. For example, to apply odd/even classes to rows in a table.cycle
{% cycle string, string, ... %}decrementdecrementassigncapturedecrementincrement{% decrement variable_name %}docdocLiquidDoc{% doc %}
Renders a message.
@param {string} foo - A string value.
@param {string} [bar] - An optional string value.
@example
{% render 'message', foo: 'Hello', bar: 'World' %}
{% enddoc %}echo{{}}echoliquidTip: You can use filters on expressions insidetags.echo
{% liquid
echo expression
%}forpaginateTip: Everyloop has an associatedforobject with information about the loop.forloop
{% for variable in array %}
expression
{% endfor %}{% if condition %}
expression
{% endif %}incrementincrementassigncaptureincrementdecrement{% increment variable_name %}{% raw %}
expression
{% endraw %}productsectionNote: When you render a snippet using thetag, you can't use therendertag inside the snippet.include
{% render 'filename' %}tablerow<table></table>Tip: Everyloop has an associatedtablerowobject with information about the loop.tablerowloop
{% tablerow variable in array %}
expression
{% endtablerow %}{% unless condition %}
expression
{% endunless %}forpaginateall_productsarticle.commentsblog.articlescollectionscollection.productscustomer.addressescustomer.orderspagesproduct.variantssearch.resultscollection_listproduct_listpaginatepaginatedefault_pagination{% paginate array by page_size %}
{% for item in array %}
forloop_content
{% endfor %}
{% endpaginate %}
The `paginate` tag allows the user to paginate to the 25,000th item in the array and no further. To reach items further in
the array the array should be filtered further before paginating. See
[Pagination Limits](/themes/best-practices/performance/platform#pagination-limits) for more information.{% javascript %}javascriptCaution: Liquid isn't rendered inside oftags. Including Liquid code can cause syntax errors.{% javascript %}
{% javascript %}
javascript_code
{% endjavascript %}section{% section 'name' %}{% stylesheet %}stylesheetCaution: Liquid isn't rendered inside oftags. Including Liquid code can cause syntax errors.{% stylesheet %}
{% stylesheet %}
css_styles
{% endstylesheet %}sections{% sections 'name' %}Note: If you reference color settings insidetags, then the associated CSS rules will update as the setting is changed in the theme editor, without a page refresh.style
{% style %}
CSS_rules
{% endstyle %}else{% else %}
expression{% for variable in array %}
first_expression
{% else %}
second_expression
{% endfor %}Tip: Use thetag to output an expression insideechotags.liquid
{% liquid
expression
%}locales/en.default.json{{ 'key' | t }}<!-- Good -->
<h2>{{ 'sections.featured_collection.title' | t }}</h2>
<p>{{ 'sections.featured_collection.description' | t }}</p>
<button>{{ 'products.add_to_cart' | t }}</button>
<!-- Bad -->
<h2>Featured Collection</h2>
<p>Check out our best products</p>
<button>Add to cart</button><!-- Liquid template -->
<p>{{ 'products.price_range' | t: min: product.price_min | money, max: product.price_max | money }}</p>
<p>{{ 'general.pagination.page' | t: page: paginate.current_page, pages: paginate.pages }}</p>{
"products": {
"price_range": "From {{ min }} to {{ max }}"
},
"general": {
"pagination": {
"page": "Page {{ page }} of {{ pages }}"
}
}
}Featured collectionFeatured collectionFeatured Collection{{ variable | escape }}locales/locales/
├── en.default.json # English (required)
├── en.default.schema.json # English (required)
├── es.json # Spanish
├── est.schema.json # Spanish
├── fr.json # French
├── frt.schema.json # French
└── pt-BR.json # Portuguese
└── pt-BR..schema.json # Portuguese{
"general": {
"cart": "Cart",
"checkout": "Checkout"
},
"products": {
"add_to_cart": "Add to Cart"
}
}{
"products": {
"card": {
"description": "Product card layout"
}
}
}{
"general": {
"meta": {
"title": "{{ shop_name }}",
"description": "{{ shop_description }}"
},
"accessibility": {
"skip_to_content": "Skip to content",
"close": "Close"
}
},
"products": {
"add_to_cart": "Add to cart",
"quick_view": "Quick view",
"price": {
"regular": "Regular price",
"sale": "Sale price",
"unit": "Unit price"
}
}
}{{ 'general.meta.title' | t: shop_name: shop.name }}
{{ 'general.meta.description' | t: shop_description: shop.description }}snippet{% doc %}
Renders a responsive image that might be wrapped in a link.
When `width`, `height` and `crop` are provided, the image will be rendered
with a fixed aspect ratio.
Serves as an example of how to use the `image_url` filter and `image_tag` filter
as well as how you can use LiquidDoc to document your code.
@param {image} image - The image to be rendered
@param {string} [url] - An optional destination URL for the image
@param {string} [css_class] - Optional class to be added to the image wrapper
@param {number} [width] - The highest resolution width of the image to be rendered
@param {number} [height] - The highest resolution height of the image to be rendered
@param {string} [crop] - The crop position of the image
@example
{% render 'image', image: product.featured_image %}
{% render 'image', image: product.featured_image, url: product.url %}
{% render 'image',
css_class: 'product__image',
image: product.featured_image,
url: product.url,
width: 1200,
height: 800,
crop: 'center',
%}
{% enddoc %}
{% liquid
unless height
assign width = width | default: image.width
endunless
if url
assign wrapper = 'a'
else
assign wrapper = 'div'
endif
%}
<{{ wrapper }}
class="image {{ css_class }}"
{% if url %}
href="{{ url }}"
{% endif %}
>
{{ image | image_url: width: width, height: height, crop: crop | image_tag }}
</{{ wrapper }}>
{% stylesheet %}
.image {
display: block;
position: relative;
overflow: hidden;
width: 100%;
height: auto;
}
.image > img {
width: 100%;
height: auto;
}
{% endstylesheet %}
{% javascript %}
function doSomething() {
// example
}
doSomething()
{% endjavascript %}
block{% doc %}
Renders a text block.
@example
{% content_for 'block', type: 'text', id: 'text' %}
{% enddoc %}
<div
class="text {{ block.settings.text_style }}"
style="--text-align: {{ block.settings.alignment }}"
{{ block.shopify_attributes }}
>
{{ block.settings.text }}
</div>
{% stylesheet %}
.text {
text-align: var(--text-align);
}
.text--title {
font-size: 2rem;
font-weight: 700;
}
.text--subtitle {
font-size: 1.5rem;
}
{% endstylesheet %}
{% schema %}
{
"name": "t:general.text",
"settings": [
{
"type": "text",
"id": "text",
"label": "t:labels.text",
"default": "Text"
},
{
"type": "select",
"id": "text_style",
"label": "t:labels.text_style",
"options": [
{ "value": "text--title", "label": "t:options.text_style.title" },
{ "value": "text--subtitle", "label": "t:options.text_style.subtitle" },
{ "value": "text--normal", "label": "t:options.text_style.normal" }
],
"default": "text--title"
},
{
"type": "text_alignment",
"id": "alignment",
"label": "t:labels.alignment",
"default": "left"
}
],
"presets": [{ "name": "t:general.text" }]
}
{% endschema %}{% doc %}
Renders a group of blocks with configurable layout direction, gap and
alignment.
All settings apply to only one dimension to reduce configuration complexity.
This component is a wrapper concerned only with rendering its children in
the specified layout direction with appropriate padding and alignment.
@example
{% content_for 'block', type: 'group', id: 'group' %}
{% enddoc %}
<div
class="group {{ block.settings.layout_direction }}"
style="
--padding: {{ block.settings.padding }}px;
--alignment: {{ block.settings.alignment }};
"
{{ block.shopify_attributes }}
>
{% content_for 'blocks' %}
</div>
{% stylesheet %}
.group {
display: flex;
flex-wrap: nowrap;
overflow: hidden;
width: 100%;
}
.group--horizontal {
flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 0 var(--padding);
}
.group--vertical {
flex-direction: column;
align-items: var(--alignment);
padding: var(--padding) 0;
}
{% endstylesheet %}
{% schema %}
{
"name": "t:general.group",
"blocks": [{ "type": "@theme" }],
"settings": [
{
"type": "select",
"id": "layout_direction",
"label": "t:labels.layout_direction",
"default": "group--vertical",
"options": [
{ "value": "group--horizontal", "label": "t:options.direction.horizontal" },
{ "value": "group--vertical", "label": "t:options.direction.vertical" }
]
},
{
"visible_if": "{{ block.settings.layout_direction == 'group--vertical' }}",
"type": "select",
"id": "alignment",
"label": "t:labels.alignment",
"default": "flex-start",
"options": [
{ "value": "flex-start", "label": "t:options.alignment.left" },
{ "value": "center", "label": "t:options.alignment.center" },
{ "value": "flex-end", "label": "t:options.alignment.right" }
]
},
{
"type": "range",
"id": "padding",
"label": "t:labels.padding",
"default": 0,
"min": 0,
"max": 200,
"step": 2,
"unit": "px"
}
],
"presets": [
{
"name": "t:general.column",
"category": "t:general.layout",
"settings": {
"layout_direction": "group--vertical",
"alignment": "flex-start",
"padding": 0
}
},
{
"name": "t:general.row",
"category": "t:general.layout",
"settings": {
"layout_direction": "group--horizontal",
"padding": 0
}
}
]
}
{% endschema %}section<div class="example-section full-width">
{% if section.settings.background_image %}
<div class="example-section__background">
{{ section.settings.background_image | image_url: width: 2000 | image_tag }}
</div>
{% endif %}
<div class="custom-section__content">
{% content_for 'blocks' %}
</div>
</div>
{% stylesheet %}
.example-section {
position: relative;
overflow: hidden;
width: 100%;
}
.example-section__background {
position: absolute;
width: 100%;
height: 100%;
z-index: -1;
overflow: hidden;
}
.example-section__background img {
position: absolute;
width: 100%;
height: auto;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.example-section__content {
display: grid;
grid-template-columns: var(--content-grid);
}
.example-section__content > * {
grid-column: 2;
}
{% endstylesheet %}
{% schema %}
{
"name": "t:general.custom_section",
"blocks": [{ "type": "@theme" }],
"settings": [
{
"type": "image_picker",
"id": "background_image",
"label": "t:labels.background"
}
],
"presets": [
{
"name": "t:general.custom_section"
}
]
}
{% endschema %}<details><summary><dialog>{% schema %}idclassasset_urlshopify app initshopify app generate extensionshopify app devshopify app deployshopifynpm install -g @shopify/cli@latest
# or
yarn global add @shopify/cli@latest
# or
pnpm install -g @shopify/cli@latest
# or (macOS only)
brew tap shopify/shopify && brew install shopify-clishopify [topic] [command] [flags]--verbose--no-color--path <value>--resetexport SHOPIFY_HTTP_PROXY=http://proxy.com:8080
export SHOPIFY_HTTPS_PROXY=https://secure-proxy.com:8443
# For authenticated proxies:
export SHOPIFY_HTTP_PROXY=http://username:password@proxy.com:8080shopify upgradeshopify help [command]SHOPIFY_CLI_NO_ANALYTICS=1shopify theme push --unpublished --jsonshopify theme duplicate --theme 10 --name 'New Theme'shopify theme console --url /products/classic-leather-jacketshopify theme profile --url /products/classic-leather-jacketscripts/search_docs.mjs "<object, filter, or tag name>" --model YOUR_MODEL_NAME --client-name YOUR_CLIENT_NAME --client-version YOUR_CLIENT_VERSIONscripts/search_docs.mjs "product metafields liquid section" --model YOUR_MODEL_NAME --client-name YOUR_CLIENT_NAME --client-version YOUR_CLIENT_VERSIONscripts/validate.mjsnode scripts/validate.mjs \
--filename featured-collection.liquid \
--filetype sections \
--code '
{% for product in collection.products limit: 4 %}
<div>{{ product.title }}</div>
{% endfor %}
{% schema %}
{
"name": "Featured Collection",
"settings": []
}
{% endschema %}
' \
--model YOUR_MODEL_NAME \
--client-name YOUR_CLIENT_NAME \
--client-version YOUR_CLIENT_VERSION \
--artifact-id YOUR_ARTIFACT_ID \
--revision REVISION_NUMBER--filetype sections--filetype snippets--filetype blocks--filenamehero-banner.liquidscripts/search_docs.mjs "<tag or object name from the error>" --model YOUR_MODEL_NAME --client-name YOUR_CLIENT_NAME --client-version YOUR_CLIENT_VERSIONscripts/validate.mjsPrivacy notice:reports anonymized validation results (pass/fail and skill name) to Shopify to help improve these tools. Setscripts/validate.mjsin your environment to opt out.OPT_OUT_INSTRUMENTATION=true