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.
- package/README.md +67 -0
- package/assets/SKILL.md +65 -0
- package/assets/commands/section.md +27 -0
- package/assets/commands/theme-init.md +20 -0
- package/assets/data/component-library/_index.csv +19 -0
- package/assets/data/component-library/announcement-bar.liquid +69 -0
- package/assets/data/component-library/blog-posts-grid.liquid +77 -0
- package/assets/data/component-library/collection-list.liquid +71 -0
- package/assets/data/component-library/cta-banner.liquid +58 -0
- package/assets/data/component-library/faq-accordion.liquid +76 -0
- package/assets/data/component-library/features-grid.liquid +94 -0
- package/assets/data/component-library/hero-banner.liquid +104 -0
- package/assets/data/component-library/image-gallery.liquid +77 -0
- package/assets/data/component-library/image-with-text.liquid +84 -0
- package/assets/data/component-library/logo-cloud.liquid +70 -0
- package/assets/data/component-library/newsletter-signup.liquid +72 -0
- package/assets/data/component-library/pricing-table.liquid +101 -0
- package/assets/data/component-library/product-grid.liquid +74 -0
- package/assets/data/component-library/rich-text-content.liquid +52 -0
- package/assets/data/component-library/stats-counter.liquid +73 -0
- package/assets/data/component-library/team-members.liquid +81 -0
- package/assets/data/component-library/testimonials-slider.liquid +93 -0
- package/assets/data/component-library/video-hero.liquid +82 -0
- package/assets/data/data-version.json +19 -0
- package/assets/data/design-tokens.csv +57 -0
- package/assets/data/liquid-stdlib.csv +134 -0
- package/assets/data/schema-library.csv +46 -0
- package/assets/data/shopify-best-practices.csv +36 -0
- package/assets/data/theme-dna.csv +20 -0
- package/assets/scripts/core.py +194 -0
- package/assets/scripts/quality-gate.py +179 -0
- package/assets/scripts/search.py +72 -0
- package/assets/scripts/section-generator.py +202 -0
- package/assets/scripts/theme-init.py +181 -0
- package/assets/templates/generation-prompt.md +31 -0
- package/assets/templates/section-base.liquid +49 -0
- package/assets/templates/theme-profile-template.md +21 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +70 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +14 -0
- package/dist/utils/copy-assets.d.ts +1 -0
- package/dist/utils/copy-assets.js +44 -0
- package/dist/utils/detect-platform.d.ts +6 -0
- package/dist/utils/detect-platform.js +18 -0
- 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 }}","<script>","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
|