rebly-sections 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +67 -0
  2. package/assets/SKILL.md +65 -0
  3. package/assets/commands/section.md +27 -0
  4. package/assets/commands/theme-init.md +20 -0
  5. package/assets/data/component-library/_index.csv +19 -0
  6. package/assets/data/component-library/announcement-bar.liquid +69 -0
  7. package/assets/data/component-library/blog-posts-grid.liquid +77 -0
  8. package/assets/data/component-library/collection-list.liquid +71 -0
  9. package/assets/data/component-library/cta-banner.liquid +58 -0
  10. package/assets/data/component-library/faq-accordion.liquid +76 -0
  11. package/assets/data/component-library/features-grid.liquid +94 -0
  12. package/assets/data/component-library/hero-banner.liquid +104 -0
  13. package/assets/data/component-library/image-gallery.liquid +77 -0
  14. package/assets/data/component-library/image-with-text.liquid +84 -0
  15. package/assets/data/component-library/logo-cloud.liquid +70 -0
  16. package/assets/data/component-library/newsletter-signup.liquid +72 -0
  17. package/assets/data/component-library/pricing-table.liquid +101 -0
  18. package/assets/data/component-library/product-grid.liquid +74 -0
  19. package/assets/data/component-library/rich-text-content.liquid +52 -0
  20. package/assets/data/component-library/stats-counter.liquid +73 -0
  21. package/assets/data/component-library/team-members.liquid +81 -0
  22. package/assets/data/component-library/testimonials-slider.liquid +93 -0
  23. package/assets/data/component-library/video-hero.liquid +82 -0
  24. package/assets/data/data-version.json +19 -0
  25. package/assets/data/design-tokens.csv +57 -0
  26. package/assets/data/liquid-stdlib.csv +134 -0
  27. package/assets/data/schema-library.csv +46 -0
  28. package/assets/data/shopify-best-practices.csv +36 -0
  29. package/assets/data/theme-dna.csv +20 -0
  30. package/assets/scripts/core.py +194 -0
  31. package/assets/scripts/quality-gate.py +179 -0
  32. package/assets/scripts/search.py +72 -0
  33. package/assets/scripts/section-generator.py +202 -0
  34. package/assets/scripts/theme-init.py +181 -0
  35. package/assets/templates/generation-prompt.md +31 -0
  36. package/assets/templates/section-base.liquid +49 -0
  37. package/assets/templates/theme-profile-template.md +21 -0
  38. package/dist/commands/init.d.ts +1 -0
  39. package/dist/commands/init.js +70 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +14 -0
  42. package/dist/utils/copy-assets.d.ts +1 -0
  43. package/dist/utils/copy-assets.js +44 -0
  44. package/dist/utils/detect-platform.d.ts +6 -0
  45. package/dist/utils/detect-platform.js +18 -0
  46. package/package.json +35 -0
@@ -0,0 +1,73 @@
1
+ {%- comment -%} rebly-sections: Stats Counter | Category: social-proof | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="stats-counter" style="--bg: {{ section.settings.background_color }};">
4
+ <div class="stats-counter__container">
5
+
6
+ {%- if section.settings.heading != blank -%}
7
+ <h2 class="stats-counter__heading">{{ section.settings.heading | escape }}</h2>
8
+ {%- endif -%}
9
+
10
+ <div class="stats-counter__items">
11
+ {%- for block in section.blocks -%}
12
+ {%- if block.type == 'stat-item' -%}
13
+ <div class="stats-counter__item" {{ block.shopify_attributes }}>
14
+ <span class="stats-counter__value">
15
+ {%- if block.settings.prefix != blank -%}
16
+ <span class="stats-counter__prefix">{{ block.settings.prefix | escape }}</span>
17
+ {%- endif -%}
18
+ {{ block.settings.value | escape }}
19
+ {%- if block.settings.suffix != blank -%}
20
+ <span class="stats-counter__suffix">{{ block.settings.suffix | escape }}</span>
21
+ {%- endif -%}
22
+ </span>
23
+ {%- if block.settings.label != blank -%}
24
+ <span class="stats-counter__label">{{ block.settings.label | escape }}</span>
25
+ {%- endif -%}
26
+ </div>
27
+ {%- endif -%}
28
+ {%- endfor -%}
29
+ </div>
30
+
31
+ </div>
32
+ </section>
33
+
34
+ <style>
35
+ #section-{{ section.id }} { background: var(--bg, #fff); }
36
+ #section-{{ section.id }} .stats-counter__container { max-width: 1100px; margin: 0 auto; padding: 4rem 2rem; text-align: center; }
37
+ #section-{{ section.id }} .stats-counter__heading { font-size: 2rem; margin: 0 0 2.5rem; }
38
+ #section-{{ section.id }} .stats-counter__items { display: flex; flex-wrap: wrap; justify-content: center; gap: 3rem; }
39
+ #section-{{ section.id }} .stats-counter__item { display: flex; flex-direction: column; align-items: center; min-width: 140px; }
40
+ #section-{{ section.id }} .stats-counter__value { font-size: 3rem; font-weight: 700; line-height: 1; }
41
+ #section-{{ section.id }} .stats-counter__prefix, #section-{{ section.id }} .stats-counter__suffix { font-size: 1.75rem; }
42
+ #section-{{ section.id }} .stats-counter__label { font-size: 0.95rem; opacity: 0.65; margin-top: 0.5rem; }
43
+ @media (max-width: 749px) { #section-{{ section.id }} .stats-counter__items { gap: 2rem; } #section-{{ section.id }} .stats-counter__value { font-size: 2.25rem; } }
44
+ </style>
45
+
46
+ {% schema %}
47
+ {
48
+ "name": "Stats Counter",
49
+ "tag": "section",
50
+ "class": "section-stats-counter",
51
+ "settings": [
52
+ { "type": "text", "id": "heading", "label": "Heading" },
53
+ { "type": "color_background", "id": "background_color", "label": "Background Color", "default": "#ffffff" }
54
+ ],
55
+ "blocks": [
56
+ {
57
+ "type": "stat-item",
58
+ "name": "Stat",
59
+ "settings": [
60
+ { "type": "text", "id": "value", "label": "Value", "default": "10K" },
61
+ { "type": "text", "id": "label", "label": "Label", "default": "Happy Customers" },
62
+ { "type": "text", "id": "prefix", "label": "Prefix (e.g. $)" },
63
+ { "type": "text", "id": "suffix", "label": "Suffix (e.g. +)" }
64
+ ]
65
+ },
66
+ { "type": "@app" }
67
+ ],
68
+ "presets": [{
69
+ "name": "Stats Counter",
70
+ "blocks": [{ "type": "stat-item" }, { "type": "stat-item" }, { "type": "stat-item" }]
71
+ }]
72
+ }
73
+ {% endschema %}
@@ -0,0 +1,81 @@
1
+ {%- comment -%} rebly-sections: Team Members | Category: content | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="team-members">
4
+ <div class="team-members__container">
5
+
6
+ {%- if section.settings.heading != blank -%}
7
+ <h2 class="team-members__heading">{{ section.settings.heading | escape }}</h2>
8
+ {%- endif -%}
9
+
10
+ <div class="team-members__grid" style="--cols: {{ section.settings.columns }};">
11
+ {%- for block in section.blocks -%}
12
+ {%- if block.type == 'team-member' -%}
13
+ <div class="team-members__card" {{ block.shopify_attributes }}>
14
+ <div class="team-members__photo">
15
+ {%- if block.settings.photo != blank -%}
16
+ {{- block.settings.photo | image_url: width: 400 | image_tag: loading: 'lazy', alt: block.settings.name -}}
17
+ {%- else -%}
18
+ {{ 'image' | placeholder_svg_tag: 'team-members__placeholder' }}
19
+ {%- endif -%}
20
+ </div>
21
+ <div class="team-members__info">
22
+ {%- if block.settings.name != blank -%}
23
+ <h3 class="team-members__name">{{ block.settings.name | escape }}</h3>
24
+ {%- endif -%}
25
+ {%- if block.settings.role != blank -%}
26
+ <p class="team-members__role">{{ block.settings.role | escape }}</p>
27
+ {%- endif -%}
28
+ {%- if block.settings.bio != blank -%}
29
+ <p class="team-members__bio">{{ block.settings.bio | escape }}</p>
30
+ {%- endif -%}
31
+ </div>
32
+ </div>
33
+ {%- endif -%}
34
+ {%- endfor -%}
35
+ </div>
36
+
37
+ </div>
38
+ </section>
39
+
40
+ <style>
41
+ #section-{{ section.id }} .team-members__container { max-width: 1200px; margin: 0 auto; padding: 4rem 2rem; }
42
+ #section-{{ section.id }} .team-members__heading { font-size: 2rem; text-align: center; margin: 0 0 2.5rem; }
43
+ #section-{{ section.id }} .team-members__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: 2rem; }
44
+ #section-{{ section.id }} .team-members__photo img,
45
+ #section-{{ section.id }} .team-members__photo svg { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 8px; display: block; }
46
+ #section-{{ section.id }} .team-members__info { padding: 1rem 0; }
47
+ #section-{{ section.id }} .team-members__name { font-size: 1.1rem; margin: 0 0 0.25rem; }
48
+ #section-{{ section.id }} .team-members__role { font-size: 0.9rem; opacity: 0.65; margin: 0 0 0.5rem; }
49
+ #section-{{ section.id }} .team-members__bio { font-size: 0.9rem; line-height: 1.6; opacity: 0.8; margin: 0; }
50
+ @media (max-width: 989px) { #section-{{ section.id }} .team-members__grid { grid-template-columns: repeat(2, 1fr); } }
51
+ @media (max-width: 749px) { #section-{{ section.id }} .team-members__grid { grid-template-columns: repeat(2, 1fr); } }
52
+ </style>
53
+
54
+ {% schema %}
55
+ {
56
+ "name": "Team Members",
57
+ "tag": "section",
58
+ "class": "section-team-members",
59
+ "settings": [
60
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Meet the Team" },
61
+ { "type": "range", "id": "columns", "label": "Columns", "min": 2, "max": 4, "step": 1, "default": 3 }
62
+ ],
63
+ "blocks": [
64
+ {
65
+ "type": "team-member",
66
+ "name": "Team Member",
67
+ "settings": [
68
+ { "type": "image_picker", "id": "photo", "label": "Photo" },
69
+ { "type": "text", "id": "name", "label": "Name", "default": "Jane Doe" },
70
+ { "type": "text", "id": "role", "label": "Role", "default": "Co-Founder" },
71
+ { "type": "textarea", "id": "bio", "label": "Bio" }
72
+ ]
73
+ },
74
+ { "type": "@app" }
75
+ ],
76
+ "presets": [{
77
+ "name": "Team Members",
78
+ "blocks": [{ "type": "team-member" }, { "type": "team-member" }, { "type": "team-member" }]
79
+ }]
80
+ }
81
+ {% endschema %}
@@ -0,0 +1,93 @@
1
+ {%- comment -%} rebly-sections: Testimonials Slider | Category: social-proof | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="testimonials-slider" style="--bg: {{ section.settings.background_color }};">
4
+ <div class="testimonials-slider__container">
5
+
6
+ {%- if section.settings.heading != blank -%}
7
+ <h2 class="testimonials-slider__heading">{{ section.settings.heading | escape }}</h2>
8
+ {%- endif -%}
9
+
10
+ <div class="testimonials-slider__track">
11
+ {%- for block in section.blocks -%}
12
+ {%- if block.type == 'testimonial' -%}
13
+ <div class="testimonials-slider__slide" {{ block.shopify_attributes }}>
14
+ <blockquote class="testimonials-slider__quote">
15
+ {%- if block.settings.quote != blank -%}
16
+ <p class="testimonials-slider__text">{{ block.settings.quote | escape }}</p>
17
+ {%- endif -%}
18
+ <footer class="testimonials-slider__author">
19
+ {%- if block.settings.avatar != blank -%}
20
+ <div class="testimonials-slider__avatar">
21
+ {{- block.settings.avatar | image_url: width: 80 | image_tag: loading: 'lazy', alt: block.settings.author -}}
22
+ </div>
23
+ {%- endif -%}
24
+ <div>
25
+ {%- if block.settings.author != blank -%}
26
+ <cite class="testimonials-slider__name">{{ block.settings.author | escape }}</cite>
27
+ {%- endif -%}
28
+ {%- if block.settings.role != blank -%}
29
+ <span class="testimonials-slider__role">{{ block.settings.role | escape }}</span>
30
+ {%- endif -%}
31
+ </div>
32
+ </footer>
33
+ </blockquote>
34
+ </div>
35
+ {%- endif -%}
36
+ {%- endfor -%}
37
+ </div>
38
+
39
+ </div>
40
+ </section>
41
+
42
+ <style>
43
+ #section-{{ section.id }} { background: var(--bg, #f9f9f9); }
44
+ #section-{{ section.id }} .testimonials-slider__container { max-width: 1100px; margin: 0 auto; padding: 4rem 2rem; }
45
+ #section-{{ section.id }} .testimonials-slider__heading { text-align: center; font-size: 2rem; margin: 0 0 2.5rem; }
46
+ #section-{{ section.id }} .testimonials-slider__track {
47
+ display: flex; gap: 1.5rem; overflow-x: auto;
48
+ scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch;
49
+ scrollbar-width: none; padding-bottom: 1rem;
50
+ }
51
+ #section-{{ section.id }} .testimonials-slider__track::-webkit-scrollbar { display: none; }
52
+ #section-{{ section.id }} .testimonials-slider__slide {
53
+ flex: 0 0 calc(33.333% - 1rem); min-width: 280px;
54
+ scroll-snap-align: start; background: #fff;
55
+ border-radius: 8px; padding: 2rem; box-shadow: 0 2px 8px rgba(0,0,0,0.08);
56
+ }
57
+ #section-{{ section.id }} .testimonials-slider__text { font-size: 1.05rem; line-height: 1.7; margin: 0 0 1.5rem; font-style: italic; }
58
+ #section-{{ section.id }} .testimonials-slider__author { display: flex; align-items: center; gap: 0.75rem; }
59
+ #section-{{ section.id }} .testimonials-slider__avatar { width: 48px; height: 48px; border-radius: 50%; overflow: hidden; flex-shrink: 0; }
60
+ #section-{{ section.id }} .testimonials-slider__avatar img { width: 100%; height: 100%; object-fit: cover; }
61
+ #section-{{ section.id }} .testimonials-slider__name { display: block; font-weight: 600; font-style: normal; }
62
+ #section-{{ section.id }} .testimonials-slider__role { font-size: 0.875rem; opacity: 0.65; }
63
+ @media (max-width: 749px) { #section-{{ section.id }} .testimonials-slider__slide { flex: 0 0 85%; } }
64
+ </style>
65
+
66
+ {% schema %}
67
+ {
68
+ "name": "Testimonials Slider",
69
+ "tag": "section",
70
+ "class": "section-testimonials-slider",
71
+ "settings": [
72
+ { "type": "text", "id": "heading", "label": "Heading", "default": "What our customers say" },
73
+ { "type": "color_background", "id": "background_color", "label": "Background Color", "default": "#f9f9f9" }
74
+ ],
75
+ "blocks": [
76
+ {
77
+ "type": "testimonial",
78
+ "name": "Testimonial",
79
+ "settings": [
80
+ { "type": "textarea", "id": "quote", "label": "Quote", "default": "This product changed my life. Absolutely love it!" },
81
+ { "type": "text", "id": "author", "label": "Author Name", "default": "Happy Customer" },
82
+ { "type": "text", "id": "role", "label": "Role / Title" },
83
+ { "type": "image_picker", "id": "avatar", "label": "Avatar Image" }
84
+ ]
85
+ },
86
+ { "type": "@app" }
87
+ ],
88
+ "presets": [{
89
+ "name": "Testimonials Slider",
90
+ "blocks": [{ "type": "testimonial" }, { "type": "testimonial" }, { "type": "testimonial" }]
91
+ }]
92
+ }
93
+ {% endschema %}
@@ -0,0 +1,82 @@
1
+ {%- comment -%} rebly-sections: Video Hero | Category: media | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="video-hero">
4
+ <div class="video-hero__inner" style="--overlay: {{ section.settings.overlay_opacity | divided_by: 100.0 }}; --min-h: {{ section.settings.min_height }}px;">
5
+
6
+ <div class="video-hero__media">
7
+ {%- if section.settings.video_url != blank -%}
8
+ {%- assign video = section.settings.video_url -%}
9
+ {%- if video.type == 'youtube' -%}
10
+ <iframe
11
+ class="video-hero__iframe"
12
+ src="https://www.youtube.com/embed/{{ video.id }}?autoplay=1&mute=1&loop=1&playlist={{ video.id }}&controls=0&playsinline=1"
13
+ allow="autoplay; encrypted-media"
14
+ allowfullscreen
15
+ loading="lazy"
16
+ title="Video background"
17
+ ></iframe>
18
+ {%- elsif video.type == 'vimeo' -%}
19
+ <iframe
20
+ class="video-hero__iframe"
21
+ src="https://player.vimeo.com/video/{{ video.id }}?autoplay=1&muted=1&loop=1&background=1"
22
+ allow="autoplay; fullscreen"
23
+ loading="lazy"
24
+ title="Video background"
25
+ ></iframe>
26
+ {%- endif -%}
27
+ {%- elsif section.settings.fallback_image != blank -%}
28
+ {{- section.settings.fallback_image | image_url: width: 1920 | image_tag: loading: 'eager', class: 'video-hero__fallback', fetchpriority: 'high' -}}
29
+ {%- endif -%}
30
+ </div>
31
+
32
+ <div class="video-hero__overlay"></div>
33
+
34
+ {%- for block in section.blocks -%}<div {{ block.shopify_attributes }}></div>{%- endfor -%}
35
+
36
+ <div class="video-hero__content">
37
+ {%- if section.settings.heading != blank -%}
38
+ <h1 class="video-hero__heading">{{ section.settings.heading | escape }}</h1>
39
+ {%- endif -%}
40
+ {%- if section.settings.subtext != blank -%}
41
+ <p class="video-hero__subtext">{{ section.settings.subtext | escape }}</p>
42
+ {%- endif -%}
43
+ {%- if section.settings.button_label != blank -%}
44
+ <a href="{{ section.settings.button_link }}" class="video-hero__btn">{{ section.settings.button_label | escape }}</a>
45
+ {%- endif -%}
46
+ </div>
47
+
48
+ </div>
49
+ </section>
50
+
51
+ <style>
52
+ #section-{{ section.id }} .video-hero__inner { position: relative; min-height: var(--min-h, 600px); display: grid; place-items: center; overflow: hidden; color: #fff; }
53
+ #section-{{ section.id }} .video-hero__media { position: absolute; inset: 0; }
54
+ #section-{{ section.id }} .video-hero__iframe { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); width: 177.78vh; min-width: 100%; height: 56.25vw; min-height: 100%; border: 0; pointer-events: none; }
55
+ #section-{{ section.id }} .video-hero__fallback { width: 100%; height: 100%; object-fit: cover; }
56
+ #section-{{ section.id }} .video-hero__overlay { position: absolute; inset: 0; background: rgba(0,0,0, var(--overlay, 0.45)); }
57
+ #section-{{ section.id }} .video-hero__content { position: relative; z-index: 1; text-align: center; padding: 2rem; max-width: 800px; }
58
+ #section-{{ section.id }} .video-hero__heading { font-size: clamp(2rem, 5vw, 4rem); margin: 0 0 1rem; }
59
+ #section-{{ section.id }} .video-hero__subtext { font-size: 1.125rem; margin: 0 0 1.5rem; opacity: 0.9; }
60
+ #section-{{ section.id }} .video-hero__btn { display: inline-block; padding: 0.85rem 2rem; background: #fff; color: #000; text-decoration: none; border-radius: 4px; font-weight: 600; }
61
+ @media (max-width: 749px) { #section-{{ section.id }} .video-hero__content { padding: 1.5rem; } }
62
+ </style>
63
+
64
+ {% schema %}
65
+ {
66
+ "name": "Video Hero",
67
+ "tag": "section",
68
+ "class": "section-video-hero",
69
+ "settings": [
70
+ { "type": "video_url", "id": "video_url", "label": "Video URL", "accept": ["youtube", "vimeo"] },
71
+ { "type": "image_picker", "id": "fallback_image", "label": "Fallback Image" },
72
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Welcome to our world" },
73
+ { "type": "text", "id": "subtext", "label": "Subtext", "default": "Discover what we offer" },
74
+ { "type": "text", "id": "button_label", "label": "Button Label", "default": "Explore" },
75
+ { "type": "url", "id": "button_link", "label": "Button Link" },
76
+ { "type": "range", "id": "overlay_opacity", "label": "Overlay Opacity", "min": 0, "max": 80, "step": 5, "default": 45 },
77
+ { "type": "range", "id": "min_height", "label": "Min Height (px)", "min": 400, "max": 900, "step": 50, "default": 600 }
78
+ ],
79
+ "blocks": [{ "type": "@app" }],
80
+ "presets": [{ "name": "Video Hero" }]
81
+ }
82
+ {% endschema %}
@@ -0,0 +1,19 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "updated": "2026-02-22",
4
+ "files": {
5
+ "schema-library.csv": { "rows": 45, "columns": 11, "status": "complete" },
6
+ "liquid-stdlib.csv": { "rows": 133, "columns": 10, "status": "complete" },
7
+ "design-tokens.csv": { "rows": 56, "columns": 8, "status": "complete" },
8
+ "shopify-best-practices.csv": { "rows": 35, "columns": 9, "status": "complete" },
9
+ "theme-dna.csv": { "rows": 19, "columns": 15, "status": "complete" },
10
+ "component-library/_index.csv": { "rows": 18, "columns": 11, "components": 18, "status": "complete" }
11
+ },
12
+ "test_results": {
13
+ "csv_validation": "7/7 passed",
14
+ "quality_gate": "18/18 components passed",
15
+ "search_accuracy": "10/10 queries (100%)",
16
+ "e2e_workflow": "4/4 steps passed",
17
+ "overall_status": "ALL TESTS PASSED"
18
+ }
19
+ }
@@ -0,0 +1,57 @@
1
+ No,Token Name,Category,Value,CSS Variable,Keywords,Usage,Notes
2
+ 1,spacing-0,spacing,0px,--spacing-0,"spacing, gap, margin, padding, none, zero","margin: var(--spacing-0); padding: var(--spacing-0)","Zero spacing; removes all margin/padding"
3
+ 2,spacing-1,spacing,4px,--spacing-1,"spacing, gap, margin, padding, xs, extra small","margin: var(--spacing-1); gap: var(--spacing-1)","4px = 0.25rem; smallest practical spacing unit"
4
+ 3,spacing-2,spacing,8px,--spacing-2,"spacing, gap, margin, padding, small, sm","padding: var(--spacing-2); margin-bottom: var(--spacing-2)","8px = 0.5rem; tight spacing for compact elements"
5
+ 4,spacing-3,spacing,12px,--spacing-3,"spacing, gap, margin, padding, small medium","gap: var(--spacing-3); padding: var(--spacing-3)","12px = 0.75rem; between small and base spacing"
6
+ 5,spacing-4,spacing,16px,--spacing-4,"spacing, gap, margin, padding, base, default, medium","padding: var(--spacing-4); margin: var(--spacing-4)","16px = 1rem; base spacing unit; most common"
7
+ 6,spacing-5,spacing,20px,--spacing-5,"spacing, gap, margin, padding, medium","margin-bottom: var(--spacing-5); gap: var(--spacing-5)","20px = 1.25rem; slightly above base"
8
+ 7,spacing-6,spacing,24px,--spacing-6,"spacing, gap, margin, padding, large, section","padding: var(--spacing-6); margin-bottom: var(--spacing-6)","24px = 1.5rem; comfortable section spacing"
9
+ 8,spacing-8,spacing,32px,--spacing-8,"spacing, gap, margin, padding, large, component","padding: var(--spacing-8); gap: var(--spacing-8)","32px = 2rem; component-level spacing"
10
+ 9,spacing-10,spacing,40px,--spacing-10,"spacing, gap, margin, padding, extra large, xl","margin-bottom: var(--spacing-10); padding: var(--spacing-10)","40px = 2.5rem; large section gaps"
11
+ 10,spacing-12,spacing,48px,--spacing-12,"spacing, gap, margin, padding, 2xl, section gap","padding: var(--spacing-12); margin-top: var(--spacing-12)","48px = 3rem; section vertical rhythm"
12
+ 11,spacing-16,spacing,64px,--spacing-16,"spacing, gap, margin, padding, 3xl, large section","section padding: var(--spacing-16)","64px = 4rem; large section vertical padding"
13
+ 12,spacing-20,spacing,80px,--spacing-20,"spacing, gap, margin, padding, 4xl, hero","hero section padding: var(--spacing-20)","80px = 5rem; hero and feature section padding"
14
+ 13,spacing-24,spacing,96px,--spacing-24,"spacing, gap, margin, padding, 5xl, page section","page-level section spacing: var(--spacing-24)","96px = 6rem; generous page-level spacing"
15
+ 14,color-primary,color,#3B82F6,--color-primary,"primary, brand, main, blue, cta, action, button","background: var(--color-primary); color: var(--color-primary)","Main brand/action color; used for CTAs and highlights"
16
+ 15,color-secondary,color,#6B7280,--color-secondary,"secondary, gray, muted, support, complement","color: var(--color-secondary); border: var(--color-secondary)","Supporting color for secondary actions and content"
17
+ 16,color-accent,color,#F59E0B,--color-accent,"accent, highlight, pop, warm, amber, feature","background: var(--color-accent)","Accent color for highlights and decorative elements"
18
+ 17,color-background,color,#FFFFFF,--color-background,"background, page background, white, base, canvas","background: var(--color-background)","Default page/section background color"
19
+ 18,color-surface,color,#F9FAFB,--color-surface,"surface, card, panel, light gray, container","background: var(--color-surface)","Card and panel background; slightly off-white"
20
+ 19,color-text-primary,color,#111827,--color-text-primary,"text, body, primary text, dark, readable, heading","color: var(--color-text-primary)","Primary body and heading text color; near black"
21
+ 20,color-text-secondary,color,#374151,--color-text-secondary,"text, secondary, subheading, dark gray","color: var(--color-text-secondary)","Secondary text; slightly lighter than primary"
22
+ 21,color-text-muted,color,#6B7280,--color-text-muted,"text, muted, caption, hint, placeholder, meta","color: var(--color-text-muted)","Muted text for captions, hints and metadata"
23
+ 22,color-border,color,#E5E7EB,--color-border,"border, divider, line, separator, outline","border-color: var(--color-border)","Default border and divider color; light gray"
24
+ 23,color-success,color,#10B981,--color-success,"success, green, positive, check, complete, valid","color: var(--color-success); background: var(--color-success)","Success state color; green"
25
+ 24,color-warning,color,#F59E0B,--color-warning,"warning, amber, caution, alert, attention","color: var(--color-warning); background: var(--color-warning)","Warning state color; amber/yellow"
26
+ 25,color-error,color,#EF4444,--color-error,"error, red, danger, invalid, fail, negative","color: var(--color-error); border-color: var(--color-error)","Error/danger state color; red"
27
+ 26,color-info,color,#3B82F6,--color-info,"info, blue, informational, notice, tip","color: var(--color-info); background: var(--color-info)","Informational state color; blue"
28
+ 27,color-link,color,#2563EB,--color-link,"link, anchor, href, blue, clickable","color: var(--color-link)","Hyperlink color; darker blue for accessibility"
29
+ 28,color-focus-ring,color,#93C5FD,--color-focus-ring,"focus, ring, outline, accessibility, keyboard nav","outline-color: var(--color-focus-ring)","Focus ring color for keyboard navigation accessibility"
30
+ 29,font-size-xs,typography,12px,--font-size-xs,"font size, small, tiny, caption, label, xs","font-size: var(--font-size-xs)","12px = 0.75rem; extra small text for fine print"
31
+ 30,font-size-sm,typography,14px,--font-size-sm,"font size, small, secondary, caption, sm","font-size: var(--font-size-sm)","14px = 0.875rem; small text for metadata and captions"
32
+ 31,font-size-base,typography,16px,--font-size-base,"font size, body, base, normal, default, readable","font-size: var(--font-size-base)","16px = 1rem; base body text size; browser default"
33
+ 32,font-size-lg,typography,18px,--font-size-lg,"font size, large, lead, intro, lg","font-size: var(--font-size-lg)","18px = 1.125rem; lead/intro paragraph size"
34
+ 33,font-size-xl,typography,20px,--font-size-xl,"font size, xl, subheading, large, headline","font-size: var(--font-size-xl)","20px = 1.25rem; subheadings and large body text"
35
+ 34,font-size-2xl,typography,24px,--font-size-2xl,"font size, 2xl, heading, h3, section title","font-size: var(--font-size-2xl)","24px = 1.5rem; section headings (h3 level)"
36
+ 35,font-size-3xl,typography,30px,--font-size-3xl,"font size, 3xl, heading, h2, large heading","font-size: var(--font-size-3xl)","30px = 1.875rem; major section headings (h2 level)"
37
+ 36,font-size-4xl,typography,36px,--font-size-4xl,"font size, 4xl, heading, h1, page title","font-size: var(--font-size-4xl)","36px = 2.25rem; page-level headings (h1 level)"
38
+ 37,font-size-5xl,typography,48px,--font-size-5xl,"font size, 5xl, hero, display, large, banner","font-size: var(--font-size-5xl)","48px = 3rem; hero display text and large banners"
39
+ 38,font-weight-normal,typography,400,--font-weight-normal,"font weight, normal, regular, body, 400","font-weight: var(--font-weight-normal)","400; regular/normal font weight for body text"
40
+ 39,font-weight-medium,typography,500,--font-weight-medium,"font weight, medium, 500, semi, label","font-weight: var(--font-weight-medium)","500; medium weight for labels and UI elements"
41
+ 40,font-weight-semibold,typography,600,--font-weight-semibold,"font weight, semibold, 600, heading, subheading","font-weight: var(--font-weight-semibold)","600; semibold for subheadings and emphasis"
42
+ 41,font-weight-bold,typography,700,--font-weight-bold,"font weight, bold, 700, heading, strong, emphasis","font-weight: var(--font-weight-bold)","700; bold for headings and strong emphasis"
43
+ 42,breakpoint-sm,breakpoint,640px,--breakpoint-sm,"breakpoint, sm, small, mobile landscape, tablet","@media (min-width: 640px) { }","Small breakpoint; mobile landscape and small tablets"
44
+ 43,breakpoint-md,breakpoint,768px,--breakpoint-md,"breakpoint, md, medium, tablet, ipad","@media (min-width: 768px) { }","Medium breakpoint; tablet portrait"
45
+ 44,breakpoint-lg,breakpoint,1024px,--breakpoint-lg,"breakpoint, lg, large, laptop, desktop, tablet landscape","@media (min-width: 1024px) { }","Large breakpoint; laptop and tablet landscape"
46
+ 45,breakpoint-xl,breakpoint,1280px,--breakpoint-xl,"breakpoint, xl, extra large, desktop, wide","@media (min-width: 1280px) { }","Extra large breakpoint; standard desktop"
47
+ 46,breakpoint-2xl,breakpoint,1536px,--breakpoint-2xl,"breakpoint, 2xl, wide desktop, large monitor, hd","@media (min-width: 1536px) { }","2XL breakpoint; wide desktop and large monitors"
48
+ 47,shadow-sm,shadow,0 1px 2px 0 rgb(0 0 0 / 0.05),--shadow-sm,"shadow, box shadow, subtle, small, card, elevation","box-shadow: var(--shadow-sm)","Subtle shadow for slight elevation; cards and inputs"
49
+ 48,shadow-base,shadow,"0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)",--shadow-base,"shadow, box shadow, default, card, panel, elevation","box-shadow: var(--shadow-base)","Default shadow for cards and panels"
50
+ 49,shadow-md,shadow,"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)",--shadow-md,"shadow, medium, dropdown, popover, elevated","box-shadow: var(--shadow-md)","Medium shadow for dropdowns and popovers"
51
+ 50,shadow-lg,shadow,"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)",--shadow-lg,"shadow, large, modal, overlay, floating","box-shadow: var(--shadow-lg)","Large shadow for modals and floating elements"
52
+ 51,shadow-xl,shadow,"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)",--shadow-xl,"shadow, extra large, hero, dramatic, high elevation","box-shadow: var(--shadow-xl)","Extra large shadow for high-elevation hero elements"
53
+ 52,border-radius-sm,border-radius,4px,--border-radius-sm,"border radius, rounded, corner, small, slight","border-radius: var(--border-radius-sm)","4px; slight rounding for buttons and inputs"
54
+ 53,border-radius-base,border-radius,6px,--border-radius-base,"border radius, rounded, default, corner, normal","border-radius: var(--border-radius-base)","6px; default rounding for most elements"
55
+ 54,border-radius-md,border-radius,8px,--border-radius-md,"border radius, rounded, card, panel, medium","border-radius: var(--border-radius-md)","8px; card and panel corner rounding"
56
+ 55,border-radius-lg,border-radius,12px,--border-radius-lg,"border radius, rounded, large, prominent, section","border-radius: var(--border-radius-lg)","12px; prominent rounding for featured elements"
57
+ 56,border-radius-full,border-radius,9999px,--border-radius-full,"border radius, full, pill, circle, round, badge","border-radius: var(--border-radius-full)","9999px; pill/circle shape for badges and avatars"
@@ -0,0 +1,134 @@
1
+ No,Name,Kind,Category,Keywords,Syntax,Example,Output,Notes,Deprecated
2
+ 1,if,tag,control-flow,"if, conditional, branch, condition, boolean","{% if condition %}...{% endif %}","{% if product.available %}In stock{% endif %}","In stock (when available)","Basic conditional; supports comparison operators == != > < >= <=",false
3
+ 2,elsif,tag,control-flow,"elsif, else if, additional condition, branch","{% elsif condition %}","{% if qty > 10 %}Many{% elsif qty > 0 %}Few{% endif %}","Few (when qty is 1-10)","Additional condition branch inside if block; spelled elsif not elseif",false
4
+ 3,else,tag,control-flow,"else, fallback, default branch, otherwise","{% else %}","{% if product.available %}Buy{% else %}Sold out{% endif %}","Sold out (when unavailable)","Fallback branch when no conditions match",false
5
+ 4,unless,tag,control-flow,"unless, unless not, negative conditional, not if","{% unless condition %}...{% endunless %}","{% unless product.available %}Sold out{% endunless %}","Sold out (when not available)","Inverse of if; renders when condition is false",false
6
+ 5,case,tag,control-flow,"case, switch, when, multiple conditions, match","{% case variable %}{% when value %}...{% endcase %}","{% case template %}{% when 'product' %}Product{% when 'index' %}Home{% endcase %}","Product (on product template)","Switch-like statement for multiple value comparisons",false
7
+ 6,when,tag,control-flow,"when, case when, match value, condition branch","{% when value %}","{% case color %}{% when 'red' %}Red{% when 'blue' %}Blue{% endcase %}","Red (when color is red)","Used inside case blocks; can match multiple values with comma",false
8
+ 7,for,tag,iteration,"for, loop, iterate, array, each, collection","{% for item in array %}...{% endfor %}","{% for product in collection.products %}{{ product.title }}{% endfor %}","Product titles listed","Loop over arrays; provides forloop object with index/first/last",false
9
+ 8,break,tag,iteration,"break, stop loop, exit, terminate","{% break %}","{% for i in (1..10) %}{% if i == 5 %}{% break %}{% endif %}{{ i }}{% endfor %}","1 2 3 4","Exits the current loop immediately",false
10
+ 9,continue,tag,iteration,"continue, skip, next iteration, loop control","{% continue %}","{% for product in products %}{% if product.hidden %}{% continue %}{% endif %}{{ product.title }}{% endfor %}","Visible product titles only","Skips to next iteration without executing remaining code",false
11
+ 10,cycle,tag,iteration,"cycle, alternate, rotate, odd even, striped","{% cycle 'val1', 'val2' %}","{% for product in products %}{% cycle 'odd', 'even' %}{% endfor %}","odd even odd even...","Rotates through values on each call; useful for striped rows",false
12
+ 11,tablerow,tag,iteration,"tablerow, table, grid, row, columns, html table","{% tablerow item in array cols:N %}...{% endtablerow %}","{% tablerow product in collection.products cols:3 %}{{ product.title }}{% endtablerow %}","HTML table rows with 3 columns","Generates HTML table rows; provides tablerowloop object",false
13
+ 12,assign,tag,variable,"assign, variable, set, define, store value","{% assign varname = value %}","{% assign hero_title = section.settings.heading | upcase %}","WELCOME (if heading is Welcome)","Creates or overwrites a variable in current scope",false
14
+ 13,capture,tag,variable,"capture, string variable, concatenate, build string, store","{% capture varname %}...{% endcapture %}","{% capture full_url %}{{ request.origin }}{{ page.url }}{% endcapture %}","https://shop.com/page","Captures rendered output into a string variable",false
15
+ 14,increment,tag,variable,"increment, counter, increase, count up, number","{% increment varname %}","{% increment counter %}{% increment counter %}","0 1","Creates/increments a counter; separate from assign variables",false
16
+ 15,decrement,tag,variable,"decrement, counter, decrease, count down, subtract","{% decrement varname %}","{% decrement counter %}{% decrement counter %}","-1 -2","Creates/decrements a counter; starts at -1",false
17
+ 16,render,tag,template,"render, include snippet, partial, component, snippet","{% render 'snippet-name' %}","{% render 'product-card', product: product %}","Renders product-card snippet","Preferred over include; isolated scope; pass variables explicitly",false
18
+ 17,include,tag,template,"include, snippet, partial, deprecated, legacy","{% include 'snippet-name' %}","{% include 'product-card' %}","Renders product-card snippet","Deprecated in favor of render; has access to parent scope",true
19
+ 18,section,tag,template,"section, render section, include section","{% section 'section-name' %}","{% section 'header' %}","Renders header section","Renders a static section; used in layout files",false
20
+ 19,layout,tag,template,"layout, theme layout, base layout, wrapper","{% layout 'layout-name' %}","{% layout 'minimal' %}","Uses minimal.liquid layout","Specifies which layout file wraps the template",false
21
+ 20,content_for_layout,tag,template,"content for layout, page content, template output, yield","{{ content_for_layout }}","{{ content_for_layout }}","Rendered page template content","Used in layout files to inject template content",false
22
+ 21,comment,tag,other,"comment, note, disable, ignore, documentation","{% comment %}...{% endcomment %}","{% comment %}TODO: update this{% endcomment %}","(nothing rendered)","Everything inside is not rendered or executed",false
23
+ 22,raw,tag,other,"raw, escape liquid, literal, no parse, output curly braces","{% raw %}...{% endraw %}","{% raw %}{{ not.liquid }}{% endraw %}","{{ not.liquid }}","Outputs content literally without Liquid processing",false
24
+ 23,liquid,tag,other,"liquid, multiple tags, compact, inline, no percent","{% liquid tag1\ntag2 %}","{% liquid assign x = 1\nassign y = 2 %}","(sets x and y)","Allows multiple Liquid tags without individual delimiters",false
25
+ 24,paginate,tag,other,"paginate, pagination, pages, page through, limit","{% paginate array by count %}...{% endpaginate %}","{% paginate collection.products by 12 %}{% endpaginate %}","Paginated product list","Splits arrays across pages; provides paginate object",false
26
+ 25,form,tag,other,"form, html form, contact, cart, customer, post","{% form 'form-type' %}...{% endform %}","{% form 'contact' %}...{% endform %}","HTML form with action/method/token","Generates Shopify form with CSRF token and correct action URL",false
27
+ 26,style,tag,other,"style, css, dynamic css, section styles, inline","{% style %}...{% endstyle %}","{% style %}.section-{{ section.id }} { color: red; }{% endstyle %}","<style> block in head","Outputs CSS; scoped by section ID is a common pattern",false
28
+ 27,javascript,tag,other,"javascript, js, script, section javascript, inline js","{% javascript %}...{% endjavascript %}","{% javascript %}console.log('loaded');{% endjavascript %}","<script> block","Outputs JavaScript for the section; bundled by Shopify",false
29
+ 28,schema,tag,other,"schema, section schema, json schema, settings definition","{% schema %}...{% endschema %}","{% schema %}{""name"":""Hero"",""settings"":[]}{% endschema %}","(not rendered; defines schema)","Contains JSON schema definition for section; required for settings",false
30
+ 29,append,filter,string,"append, add suffix, concatenate, join string, suffix","string | append: suffix","{{ 'Hello' | append: ' World' }}","Hello World","Adds string to end of another string",false
31
+ 30,prepend,filter,string,"prepend, add prefix, prefix string, before, join string","string | prepend: prefix","{{ 'World' | prepend: 'Hello ' }}","Hello World","Adds string to beginning of another string",false
32
+ 31,capitalize,filter,string,"capitalize, title case, first letter, uppercase first","string | capitalize","{{ 'hello world' | capitalize }}","Hello world","Capitalizes first character only; lowercases rest",false
33
+ 32,downcase,filter,string,"downcase, lowercase, lower, small caps","string | downcase","{{ 'Hello World' | downcase }}","hello world","Converts all characters to lowercase",false
34
+ 33,upcase,filter,string,"upcase, uppercase, upper, capital letters, caps","string | upcase","{{ 'hello' | upcase }}","HELLO","Converts all characters to uppercase",false
35
+ 34,strip,filter,string,"strip, trim, whitespace, remove spaces, clean","string | strip","{{ ' hello ' | strip }}","hello","Removes leading and trailing whitespace",false
36
+ 35,lstrip,filter,string,"lstrip, left strip, left trim, leading whitespace","string | lstrip","{{ ' hello ' | lstrip }}","hello ","Removes leading whitespace only",false
37
+ 36,rstrip,filter,string,"rstrip, right strip, right trim, trailing whitespace","string | rstrip","{{ ' hello ' | rstrip }}"," hello","Removes trailing whitespace only",false
38
+ 37,strip_html,filter,string,"strip html, remove html, plain text, no tags, sanitize","string | strip_html","{{ '<p>Hello</p>' | strip_html }}","Hello","Removes all HTML tags from string",false
39
+ 38,strip_newlines,filter,string,"strip newlines, remove newlines, single line, compact","string | strip_newlines","{{ ""line1\nline2"" | strip_newlines }}","line1line2","Removes all newline characters from string",false
40
+ 39,newline_to_br,filter,string,"newline to br, line breaks, html br, convert newlines","string | newline_to_br","{{ ""line1\nline2"" | newline_to_br }}","line1<br/>line2","Converts newline characters to HTML br tags",false
41
+ 40,replace,filter,string,"replace, substitute, swap, find replace, string replace","string | replace: search, replace","{{ 'Hello World' | replace: 'World', 'Liquid' }}","Hello Liquid","Replaces all occurrences of search with replace string",false
42
+ 41,replace_first,filter,string,"replace first, substitute first, first occurrence only","string | replace_first: search, replace","{{ 'aaa' | replace_first: 'a', 'b' }}","baa","Replaces only first occurrence of search string",false
43
+ 42,remove,filter,string,"remove, delete, erase, string remove, strip string","string | remove: substr","{{ 'Hello World' | remove: 'World' }}","Hello ","Removes all occurrences of substring",false
44
+ 43,remove_first,filter,string,"remove first, delete first, first occurrence, erase","string | remove_first: substr","{{ 'aaa' | remove_first: 'a' }}","aa","Removes only first occurrence of substring",false
45
+ 44,truncate,filter,string,"truncate, shorten, ellipsis, limit length, cut","string | truncate: length","{{ 'Hello World' | truncate: 5 }}","He...","Truncates to length including ellipsis; default ellipsis is ...",false
46
+ 45,truncatewords,filter,string,"truncate words, word limit, shorten words, ellipsis","string | truncatewords: count","{{ 'Hello beautiful World' | truncatewords: 2 }}","Hello beautiful...","Truncates to word count; appends ellipsis",false
47
+ 46,split,filter,string,"split, divide, array, parse, delimiter, tokenize","string | split: delimiter","{{ 'a,b,c' | split: ',' }}","['a','b','c']","Splits string into array by delimiter",false
48
+ 47,slice,filter,string,"slice, substring, extract, portion, sub-string, index","string | slice: start, length","{{ 'Hello' | slice: 1, 3 }}","ell","Returns substring; negative start counts from end",false
49
+ 48,escape,filter,string,"escape, html escape, encode, safe, entities, xss","string | escape","{{ '<script>' | escape }}","&lt;script&gt;","Escapes HTML special characters for safe output",false
50
+ 49,url_encode,filter,string,"url encode, percent encode, query string, uri, encode","string | url_encode","{{ 'hello world' | url_encode }}","hello+world","Encodes string for use in URL query parameters",false
51
+ 50,url_decode,filter,string,"url decode, percent decode, uri decode, query string","string | url_decode","{{ 'hello+world' | url_decode }}","hello world","Decodes URL-encoded string",false
52
+ 51,handleize,filter,string,"handleize, handle, slug, url-friendly, kebab, sanitize","string | handleize","{{ 'Hello World!' | handleize }}","hello-world","Converts string to URL-friendly handle; alias: handle",false
53
+ 52,md5,filter,string,"md5, hash, checksum, digest","string | md5","{{ 'hello' | md5 }}","5d41402abc4b2a76b9719d911017c592","Returns MD5 hash of string; useful for Gravatar URLs",false
54
+ 53,sha256,filter,string,"sha256, hash, secure hash, digest, cryptographic","string | sha256","{{ 'hello' | sha256 }}","2cf24db...","Returns SHA256 hash of string",false
55
+ 54,base64_encode,filter,string,"base64 encode, encode, binary, data uri","string | base64_encode","{{ 'hello' | base64_encode }}","aGVsbG8=","Encodes string as base64",false
56
+ 55,base64_decode,filter,string,"base64 decode, decode, binary, data uri","string | base64_decode","{{ 'aGVsbG8=' | base64_decode }}","hello","Decodes base64-encoded string",false
57
+ 56,plus,filter,math,"plus, add, addition, sum, increment","number | plus: num","{{ 4 | plus: 2 }}","6","Adds two numbers",false
58
+ 57,minus,filter,math,"minus, subtract, subtraction, difference","number | minus: num","{{ 10 | minus: 3 }}","7","Subtracts num from number",false
59
+ 58,times,filter,math,"times, multiply, multiplication, product","number | times: num","{{ 3 | times: 4 }}","12","Multiplies number by num",false
60
+ 59,divided_by,filter,math,"divided by, divide, division, quotient","number | divided_by: num","{{ 10 | divided_by: 3 }}","3","Integer division; use floats for decimal: 10.0 | divided_by: 3",false
61
+ 60,modulo,filter,math,"modulo, mod, remainder, division remainder","number | modulo: num","{{ 10 | modulo: 3 }}","1","Returns remainder of integer division",false
62
+ 61,ceil,filter,math,"ceil, ceiling, round up, integer, math","number | ceil","{{ 1.2 | ceil }}","2","Rounds number up to nearest integer",false
63
+ 62,floor,filter,math,"floor, round down, integer, math, truncate","number | floor","{{ 1.9 | floor }}","1","Rounds number down to nearest integer",false
64
+ 63,round,filter,math,"round, nearest integer, decimal places, math","number | round: places","{{ 1.75 | round: 1 }}","1.8","Rounds to specified decimal places; default 0",false
65
+ 64,abs,filter,math,"abs, absolute value, positive, magnitude","number | abs","{{ -5 | abs }}","5","Returns absolute (positive) value of number",false
66
+ 65,at_most,filter,math,"at most, maximum, clamp, cap, upper bound","number | at_most: max","{{ 10 | at_most: 5 }}","5","Returns lesser of number and max",false
67
+ 66,at_least,filter,math,"at least, minimum, clamp, floor, lower bound","number | at_least: min","{{ 1 | at_least: 5 }}","5","Returns greater of number and min",false
68
+ 67,sort,filter,array,"sort, order, alphabetical, ascending, array sort","array | sort: key","{{ products | sort: 'title' }}","Sorted products array","Sorts array by property; case-sensitive",false
69
+ 68,sort_natural,filter,array,"sort natural, natural sort, case insensitive, alphabetical","array | sort_natural: key","{{ products | sort_natural: 'title' }}","Case-insensitive sorted array","Case-insensitive sort",false
70
+ 69,reverse,filter,array,"reverse, backwards, flip, invert array","array | reverse","{{ array | reverse }}","Reversed array","Reverses order of elements in array",false
71
+ 70,map,filter,array,"map, extract, pluck, property, transform, key","array | map: key","{{ products | map: 'title' }}","Array of titles","Extracts property values into new array",false
72
+ 71,where,filter,array,"where, filter, select, match, query, find","array | where: key, value","{{ products | where: 'available', true }}","Available products array","Filters array to items where key equals value",false
73
+ 72,first,filter,array,"first, head, initial, beginning, top","array | first","{{ products | first }}","First product","Returns first element of array; or first N with count",false
74
+ 73,last,filter,array,"last, tail, end, bottom, final","array | last","{{ products | last }}","Last product","Returns last element of array",false
75
+ 74,join,filter,array,"join, concatenate, array to string, glue, separator","array | join: separator","{{ array | join: ', ' }}","a, b, c","Joins array elements into string with separator",false
76
+ 75,concat,filter,array,"concat, merge, combine, join arrays, append array","array | concat: array2","{{ a | concat: b }}","Combined array","Merges two arrays into one",false
77
+ 76,uniq,filter,array,"uniq, unique, deduplicate, distinct, remove duplicates","array | uniq","{{ tags | uniq }}","Array without duplicates","Removes duplicate values from array",false
78
+ 77,size,filter,array,"size, length, count, number of, array length","array | size","{{ products | size }}","12","Returns number of elements in array or characters in string",false
79
+ 78,compact,filter,array,"compact, remove nil, remove null, clean, filter empty","array | compact","{{ array | compact }}","Array without nil values","Removes nil/null values from array",false
80
+ 79,asset_url,filter,url,"asset url, theme asset, css, js, file url, cdn","'filename' | asset_url","{{ 'theme.css' | asset_url }}","https://cdn.shopify.com/.../theme.css","Returns CDN URL for theme asset file",false
81
+ 80,asset_img_url,filter,url,"asset img url, theme image, asset image, size","'image' | asset_img_url: size","{{ 'logo.png' | asset_img_url: '200x' }}","https://cdn.shopify.com/.../logo_200x.png","Returns sized URL for theme image asset",false
82
+ 81,file_url,filter,url,"file url, files, upload, cdn, store file","'filename' | file_url","{{ 'document.pdf' | file_url }}","https://cdn.shopify.com/.../document.pdf","Returns CDN URL for file uploaded to Files section",false
83
+ 82,file_img_url,filter,url,"file img url, files image, upload image, sized","'image' | file_img_url: size","{{ 'banner.jpg' | file_img_url: '1200x' }}","https://cdn.shopify.com/.../banner_1200x.jpg","Returns sized URL for image uploaded to Files section",false
84
+ 83,shopify_asset_url,filter,url,"shopify asset url, shopify cdn, api, global asset","'name' | shopify_asset_url","{{ 'option_selection.js' | shopify_asset_url }}","Shopify CDN URL for global asset","Returns URL for Shopify's own global assets",false
85
+ 84,img_url,filter,url,"img url, image url, size, product image, deprecated","image | img_url: size","{{ product.featured_image | img_url: '400x' }}","Sized image URL","Deprecated; use image_url filter instead",true
86
+ 85,image_url,filter,url,"image url, sized image, responsive, width, height","image | image_url: width: N","{{ product.featured_image | image_url: width: 400 }}","https://cdn.shopify.com/...400x...","Preferred image URL filter; supports width/height params",false
87
+ 86,image_tag,filter,media,"image tag, img, html image, responsive, srcset, lazy","image | image_tag","{{ product.featured_image | image_url: width: 400 | image_tag }}","<img src=""..."" loading=""lazy"">","Generates full img HTML element with srcset; chains with image_url",false
88
+ 87,external_video_tag,filter,media,"external video tag, youtube, vimeo, embed, iframe","video_url | external_video_tag","{{ section.settings.video_url | external_video_tag }}","<iframe src=""...""...>","Generates iframe embed for YouTube or Vimeo video URL",false
89
+ 88,video_tag,filter,media,"video tag, shopify video, html5, hosted video, mp4","video | video_tag","{{ section.settings.video | video_tag }}","<video ...><source ...>","Generates HTML5 video element for Shopify-hosted video",false
90
+ 89,external_video_url,filter,media,"external video url, youtube, vimeo, embed url, iframe","video_url | external_video_url: autoplay: false","{{ url | external_video_url: autoplay: true }}","Embed URL with params","Builds proper embed URL with optional params for external video",false
91
+ 90,color_to_rgb,filter,color,"color to rgb, rgb, color convert, css rgb","color | color_to_rgb","{{ settings.color | color_to_rgb }}","rgb(255, 0, 0)","Converts color to CSS rgb() format",false
92
+ 91,color_to_hsl,filter,color,"color to hsl, hsl, color convert, hue saturation","color | color_to_hsl","{{ settings.color | color_to_hsl }}","hsl(0, 100%, 50%)","Converts color to CSS hsl() format",false
93
+ 92,color_to_hex,filter,color,"color to hex, hex color, convert, hexadecimal","color | color_to_hex","{{ settings.color | color_to_hex }}","#ff0000","Converts color to hex string format",false
94
+ 93,color_extract,filter,color,"color extract, get component, red, green, blue, hue","color | color_extract: component","{{ settings.color | color_extract: 'red' }}","255","Extracts a color component: red/green/blue/hue/saturation/lightness",false
95
+ 94,color_brightness,filter,color,"color brightness, luminance, light, dark, threshold","color | color_brightness","{{ settings.color | color_brightness }}","128","Returns perceived brightness value 0-255",false
96
+ 95,color_modify,filter,color,"color modify, adjust, change, alpha, opacity, component","color | color_modify: component, value","{{ settings.color | color_modify: 'alpha', 0.5 }}","rgba(255,0,0,0.5)","Modifies a color component by absolute value",false
97
+ 96,color_lighten,filter,color,"color lighten, lighter, brightness, increase lightness","color | color_lighten: amount","{{ settings.color | color_lighten: 10 }}","Lightened color","Lightens color by percentage amount",false
98
+ 97,color_darken,filter,color,"color darken, darker, decrease lightness, shadow","color | color_darken: amount","{{ settings.color | color_darken: 10 }}","Darkened color","Darkens color by percentage amount",false
99
+ 98,color_saturate,filter,color,"color saturate, saturation, vivid, rich, increase","color | color_saturate: amount","{{ settings.color | color_saturate: 20 }}","More saturated color","Increases color saturation by percentage amount",false
100
+ 99,color_desaturate,filter,color,"color desaturate, muted, grey, decrease saturation","color | color_desaturate: amount","{{ settings.color | color_desaturate: 20 }}","Less saturated color","Decreases color saturation by percentage amount",false
101
+ 100,color_mix,filter,color,"color mix, blend, combine colors, interpolate","color | color_mix: color2, weight","{{ '#ff0000' | color_mix: '#0000ff', 50 }}","#7f007f","Mixes two colors; weight 0-100 is % of second color",false
102
+ 101,money,filter,money,"money, price, currency format, amount, format price","number | money","{{ product.price | money }}","$10.00","Formats cents amount as money using shop currency format",false
103
+ 102,money_with_currency,filter,money,"money with currency, price, currency code, amount","number | money_with_currency","{{ product.price | money_with_currency }}","$10.00 USD","Formats as money with currency code",false
104
+ 103,money_without_currency,filter,money,"money without currency, price, no symbol, amount","number | money_without_currency","{{ product.price | money_without_currency }}","10.00","Formats as money without currency symbol",false
105
+ 104,money_without_trailing_zeros,filter,money,"money without trailing zeros, price, clean, format","number | money_without_trailing_zeros","{{ 1000 | money_without_trailing_zeros }}","$10","Omits trailing zeros in cents; $10.50 stays $10.50",false
106
+ 105,font_face,filter,font,"font face, css font, @font-face, typography, load font","font | font_face","{{ settings.body_font | font_face }}","@font-face { ... }","Generates @font-face CSS declaration for the font",false
107
+ 106,font_modify,filter,font,"font modify, bold, italic, weight, style, variant","font | font_modify: property, value","{{ settings.body_font | font_modify: 'weight', 'bold' }}","Modified font object","Returns modified font object; use for bold/italic variants",false
108
+ 107,font_url,filter,font,"font url, font file, cdn, load, src","font | font_url","{{ settings.body_font | font_url }}","CDN URL for font file","Returns CDN URL for font file",false
109
+ 108,stylesheet_tag,filter,html,"stylesheet tag, link css, html link, style, css file","url | stylesheet_tag","{{ 'theme.css' | asset_url | stylesheet_tag }}","<link rel=""stylesheet"" href=""..."">","Generates HTML link element for CSS file",false
110
+ 109,script_tag,filter,html,"script tag, javascript, html script, js file, load","url | script_tag","{{ 'theme.js' | asset_url | script_tag }}","<script src=""...""></script>","Generates HTML script element for JS file",false
111
+ 110,img_tag,filter,html,"img tag, image html, deprecated, picture, photo","image | img_tag","{{ product.featured_image | img_tag }}","<img src=""..."">","Generates basic img tag; deprecated, use image_tag instead",true
112
+ 111,json,filter,type,"json, serialize, javascript, data, object","object | json","{{ product | json }}","{""id"":123,""title"":""...""}","Serializes Liquid object as JSON string; safe for JS",false
113
+ 112,t,filter,translation,"translate, i18n, localization, language, string","'key' | t","{{ 'products.product.add_to_cart' | t }}","Add to cart","Returns translated string from locale file for current language",false
114
+ 113,section,object,template,"section, current section, settings, id, blocks","section","{{ section.id }}","abc123","Section object: id/settings/blocks properties","Current rendered section's data",false
115
+ 114,block,object,template,"block, section block, type, id, settings","block","{{ block.id }}","xyz789","Block object within forloop over section.blocks: id/type/settings","Available inside {% for block in section.blocks %} loops",false
116
+ 115,settings,object,template,"settings, section settings, theme settings, configuration","settings","{{ settings.logo }}","Logo image object","Access section/block/theme settings via this object","In sections: section.settings; in blocks: block.settings",false
117
+ 116,shop,object,global,"shop, store, name, currency, domain, email, global","shop","{{ shop.name }}","My Store","Global shop object: name/currency/domain/email/metafields etc","Always available; core store information",false
118
+ 117,product,object,resource,"product, item, variants, price, title, handle","product","{{ product.title }}","Awesome Product","Product object on product template; or from product setting","Access via product.variants/price/images/metafields etc",false
119
+ 118,collection,object,resource,"collection, products, catalog, group, handle","collection","{{ collection.title }}","All Products","Collection object on collection template; or from collection setting","Access products via collection.products array",false
120
+ 119,cart,object,global,"cart, shopping cart, items, total, checkout, quantity","cart","{{ cart.item_count }}","3","Global cart object: items/total_price/item_count","Always available; use for cart-related sections",false
121
+ 120,customer,object,global,"customer, user, account, logged in, email, orders","customer","{{ customer.email }}","user@example.com","Customer object when logged in; nil otherwise","Check customer before accessing: {% if customer %}",false
122
+ 121,page,object,resource,"page, static page, content, handle, title","page","{{ page.title }}","About Us","Page object on page template","Access page.content for rendered HTML content",false
123
+ 122,blog,object,resource,"blog, posts, articles, journal, handle, title","blog","{{ blog.title }}","News","Blog object on blog template; or from blog setting","Access articles via blog.articles array",false
124
+ 123,article,object,resource,"article, blog post, content, author, tags, handle","article","{{ article.title }}","Post Title","Article object on article template; or from article setting","Access article.content/author/image/published_at etc",false
125
+ 124,request,object,global,"request, locale, page type, host, path, design mode","request","{{ request.locale.iso_code }}","en","Request object: locale/page_type/host/path/design_mode","Use request.design_mode to detect theme editor",false
126
+ 125,template,object,global,"template, page template, type, suffix, name","template","{{ template.name }}","product","Template object: name/suffix/directory","Use to conditionally render based on page type",false
127
+ 126,all_products,object,global,"all products, product lookup, by handle, product hash","all_products","{{ all_products['my-product'] }}","Product object","Global hash for accessing products by handle","Limited to 20 product lookups per page",false
128
+ 127,linklists,object,global,"linklists, menus, navigation, links, global","linklists","{{ linklists['main-menu'].links }}","Array of link objects","Global hash of all navigation menus by handle","Use linklists[settings.menu].links to iterate",false
129
+ 128,routes,object,global,"routes, urls, paths, account, cart, search url","routes","{{ routes.cart_url }}","/cart","Global URL routes object: cart/account/search/all_products paths","Use instead of hardcoded paths for portability",false
130
+ 129,content_for_header,object,global,"content for header, scripts, head, meta, global","content_for_header","{{ content_for_header }}","Shopify scripts and meta tags","Must be included in layout <head>; injects Shopify scripts","Required in theme.liquid head section",false
131
+ 130,canonical_url,object,global,"canonical url, seo, url, current page, link rel","canonical_url","{{ canonical_url }}","https://shop.com/products/item","Current page's canonical URL for SEO","Use in <link rel=""canonical""> tag in head",false
132
+ 131,page_title,object,global,"page title, seo, title, head title, browser tab","page_title","{{ page_title }}","Product Title - Shop Name","Current page title for SEO head title tag","Use in <title> tag in layout head",false
133
+ 132,page_description,object,global,"page description, seo, meta, description, head","page_description","{{ page_description }}","A great product...","Current page meta description for SEO","Use in <meta name=""description""> tag",false
134
+ 133,images,object,global,"images, theme images, asset images, global image hash","images","{{ images['logo.png'] }}","Image object","Global hash of theme images by filename","Access theme images uploaded to Assets",false