Cursor rule
.cursor/rules/liquid.mdcLiquid syntax standards
Cursor rules
Quality
77/100
Scores the file, not the repository.Length
909 words
7 headings · 3 code blocksRepository
428
— · pushed 17 days agoLast changed
3 days ago
First indexed 3 days ago.1234567# Liquid Syntax Standards89## ⚠️ CRITICAL: Schema Editing1011**NEVER edit the `{% schema %}` block directly in `.liquid` files!**1213Schemas are generated from source files in the `schemas/` folder. To make schema changes:14151. Find the corresponding `.js` file in `schemas/blocks/` or `schemas/sections/`162. Edit the JavaScript source file173. Run `pnpm run build:schemas` to regenerate the `.liquid` files1819See [@schemas](mdc:.cursor/rules/schemas.mdc) for more details.2021---2223## Valid Tags with Parameters2425**Control Flow:**2627- `if condition` / `endif` - Conditional logic28- `unless condition` / `endunless` - Negative conditional29- `case variable` / `when value` / `endcase` - Switch statement30- `for item in array` / `endfor` - Loop with optional `limit:`, `offset:`3132**Variable Assignment:**3334- `assign variable = value` - Create variable35- `capture variable` / `endcapture` - Capture output36- `increment variable` - Add 1 to counter37- `decrement variable` - Subtract 1 from counter3839**Template Inclusion:**4041- `render 'snippet-name'` - Include snippet42- `render 'snippet-name', param: value` - With parameters43- `section 'section-name'` - Include section4445**Forms:**4647- `form 'cart'` / `endform` - Cart form48- `form 'product'` / `endform` - Product form49- `form 'customer_login'` / `endform` - Login form5051**Other:**5253- `paginate collection.products by 12` / `endpaginate` - Paginate results54- `liquid` / `endliquid` - Multiline Liquid block55- `comment` / `endcomment` - Block comments56- `raw` / `endraw` - Output without processing5758## Valid Filters5960**Array Filters:**6162- `compact` - Remove nil values: `array | compact`63- `concat` - Join arrays: `array | concat: array`64- `find` - Find object: `array | find: property, value`65- `where` - Filter objects: `array | where: property, value`66- `map` - Extract property: `array | map: property`67- `sort` - Sort array: `array | sort`68- `reverse` - Reverse order: `array | reverse`69- `first` - First item: `array | first`70- `last` - Last item: `array | last`71- `size` - Count items: `array | size`7273**String Filters:**7475- `escape` - HTML escape: `string | escape`76- `truncate` - Limit length: `string | truncate: 150`77- `handleize` - URL handle: `string | handleize`78- `replace` - Replace text: `string | replace: 'old', 'new'`79- `split` - Split string: `string | split: 'delimiter'`80- `upcase` - Uppercase: `string | upcase`81- `downcase` - Lowercase: `string | downcase`82- `capitalize` - Capitalize: `string | capitalize`8384**Money Filters:**8586- `money` - Format price: `price | money`87- `money_with_currency` - With symbol: `price | money_with_currency`88- `money_without_currency` - No symbol: `price | money_without_currency`8990**Media Filters:**9192- `image_url` - Responsive image: `image | image_url: width: 800`93- `image_tag` - Complete img tag: `image | image_tag`94- `asset_url` - Theme asset: `'style.css' | asset_url`9596## Syntax Rules9798- Use `{% liquid %}` for multiline code blocks99- Use `{% # comment %}` for inline comments100- Never invent new filters, tags, or objects101- Follow proper tag closing order (last opened, first closed)102- Use object dot notation: `product.title` not `product['title']`103- Respect object scope and availability104105## Snippet Documentation with {% doc %}106107All snippets must include documentation using `{% doc %}` and `{% enddoc %}` tags.108109**Parameter types:** `{object}`, `{string}`, `{number}`, `{boolean}`, `{array}`110**Optional params:** Use brackets like `[param_name]`111**Nested properties:** Use dash notation like `object - .property`112113**Example:**114115```liquid116{% doc %}117 Volume Pricing Info118119 Renders volume pricing information with quantity rules in a popover.120 Only renders if variant has quantity rules or volume pricing.121122 @param {object} variant - The variant object to display pricing for123 @param {string} [unique_id] - Optional unique identifier to append to popover ID124 @param {number} [quantity] - The current quantity (for highlighting active tier)125126 @example127 {% render 'volume-pricing-info',128 variant: item.variant,129 unique_id: item.index,130 quantity: item.quantity131 %}132{% enddoc %}133```134135## Inline Variables Pattern136137For props that are relatively straightforward, prefer to inline the liquid instead of declaring extra variables. In smaller components it doesn't make a big difference, but in bigger ones it helps not having to scroll up and down to know what is being applied where.138139**✅ Do this (inline approach):**140141```liquid142<div143 class='component component--{{ settings.style_modifier }}'144 style='145 color: {{ settings.text_color }};146 {% if settings.show_border %}147 border: 1px solid {{ settings.border_color }};148 {% endif %}149 '150>151 <h2>{{ 'sections.component.title' | t }}</h2>152153 {{ content | truncate: settings.max_length | default: 200 }}154155 <a156 href='{{ link_url }}'157 class='link--{{ settings.link_style | default: 'primary' }}'158 >159 {{ 'general.read_more' | t }}160 </a>161</div>162```163164**❌ Don't do this (variable declaration approach):**165166```liquid167{% liquid168 assign component_class = 'component component--' | append: settings.style_modifier169 assign text_color = settings.text_color170 assign truncate_length = settings.max_length | default: 200171 assign link_class = 'link--' | append: settings.link_style | default: 'primary'172%}173174{% capture component_style %}175 color: {{ text_color }};176 {% if settings.show_border %}177 border: 1px solid {{ settings.border_color }};178 {% endif %}179{% endcapture %}180181<div182 class='{{ component_class }}'183 style='{{ component_style }}'184>185 <h2>{{ 'sections.component.title' | t }}</h2>186187 {{ content | truncate: truncate_length }}188189 <a190 href='{{ link_url }}'191 class='{{ link_class }}'192 >193 {{ 'general.read_more' | t }}194 </a>195</div>196```197198**Exceptions:**199200- When Liquid filter parameters require string values and complex logic cannot be inlined201- When the same complex calculation is used multiple times202- When the logic is extremely complex and would harm readability203- When you need to build a string incrementally with conditional parts204205**Benefits:**206207- Easier to understand what's being applied where208- No need to scroll up and down to find variable definitions209- Reduces cognitive load in larger components210- Makes the code more maintainable211
Also in Shopify/horizon
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| Shopify/horizon.cursor/rules/accordion-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/animation-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/blocks.mdc · 428 | Cursor rules | stylearchtypesdatabase+2 | 62/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/breadcrumb-accessibility.mdc · 428 | Cursor rules | ui | 36/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/carousel-accessibility.mdc · 428 | Cursor rules | ui | 32/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/cart-drawer-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/chat-window-accessibility.mdc · 428 | Cursor rules | styleui | 24/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/color-contrast-accessibility.mdc · 428 | Cursor rules | lint-formatui | 44/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/color-swatch-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/commit-messages.mdc · 428 | Cursor rules | setuplint-formattypesgit | 62/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/css-standards.mdc · 428 | Cursor rules | stylearchuiperformance+3 | 49/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/disclosure-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/dropdown-navigation-accessibility.mdc · 428 | Cursor rules | styleui | 36/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/flip-card-accessibility.mdc · 428 | Cursor rules | styleui | 36/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/form-accessibility.mdc · 428 | Cursor rules | ui | 32/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/javascript-standards.mdc · 428 | Cursor rules | stylearchtypesui+2 | 54/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/landmark-accessibility.mdc · 428 | Cursor rules | ui | 40/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/locales.mdc · 428 | Cursor rules | arch | 49/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/localization.mdc · 428 | Cursor rules | style | 54/100 | 3 days ago | |
| Shopify/horizon.cursor/rules/mobile-accessibility-standards.mdc · 428 | Cursor rules | styleui | 36/100 | 3 days ago |
Diff against .cursor/rules/accordion-accessibility.mdc Diff against .cursor/rules/animation-accessibility.mdc Diff against .cursor/rules/blocks.mdc Diff against .cursor/rules/breadcrumb-accessibility.mdc Diff against .cursor/rules/carousel-accessibility.mdc Diff against .cursor/rules/cart-drawer-accessibility.mdc Diff against .cursor/rules/chat-window-accessibility.mdc Diff against .cursor/rules/color-contrast-accessibility.mdc Diff against .cursor/rules/color-swatch-accessibility.mdc Diff against .cursor/rules/commit-messages.mdc Diff against .cursor/rules/css-standards.mdc Diff against .cursor/rules/disclosure-accessibility.mdc Diff against .cursor/rules/dropdown-navigation-accessibility.mdc Diff against .cursor/rules/flip-card-accessibility.mdc Diff against .cursor/rules/form-accessibility.mdc Diff against .cursor/rules/javascript-standards.mdc Diff against .cursor/rules/landmark-accessibility.mdc Diff against .cursor/rules/locales.mdc Diff against .cursor/rules/localization.mdc Diff against .cursor/rules/mobile-accessibility-standards.mdc
