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,104 @@
1
+ {%- comment -%} rebly-sections: Hero Banner | Category: hero | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="hero-banner">
4
+ <div class="hero-banner__inner"
5
+ style="
6
+ --overlay-opacity: {{ section.settings.overlay_opacity | divided_by: 100.0 }};
7
+ --text-color: {{ section.settings.text_color }};
8
+ --min-height: {{ section.settings.min_height }}px;
9
+ ">
10
+
11
+ {%- if section.settings.image != blank -%}
12
+ <div class="hero-banner__bg">
13
+ {{- section.settings.image | image_url: width: 1920 | image_tag: loading: 'eager', fetchpriority: 'high', class: 'hero-banner__img' -}}
14
+ </div>
15
+ {%- endif -%}
16
+
17
+ <div class="hero-banner__overlay"></div>
18
+
19
+ {%- for block in section.blocks -%}
20
+ <div {{ block.shopify_attributes }}></div>
21
+ {%- endfor -%}
22
+
23
+ <div class="hero-banner__content hero-banner__content--{{ section.settings.content_position }}">
24
+ {%- if section.settings.heading != blank -%}
25
+ <h1 class="hero-banner__heading">{{ section.settings.heading | escape }}</h1>
26
+ {%- endif -%}
27
+ {%- if section.settings.subtext != blank -%}
28
+ <p class="hero-banner__subtext">{{ section.settings.subtext | escape }}</p>
29
+ {%- endif -%}
30
+ {%- if section.settings.button_label != blank -%}
31
+ <a href="{{ section.settings.button_link }}" class="hero-banner__btn btn">
32
+ {{ section.settings.button_label | escape }}
33
+ </a>
34
+ {%- endif -%}
35
+ </div>
36
+
37
+ </div>
38
+ </section>
39
+
40
+ <style>
41
+ #section-{{ section.id }} .hero-banner__inner {
42
+ position: relative;
43
+ display: grid;
44
+ place-items: center;
45
+ min-height: var(--min-height, 500px);
46
+ overflow: hidden;
47
+ color: var(--text-color, #ffffff);
48
+ }
49
+ #section-{{ section.id }} .hero-banner__bg,
50
+ #section-{{ section.id }} .hero-banner__img {
51
+ position: absolute;
52
+ inset: 0;
53
+ width: 100%;
54
+ height: 100%;
55
+ object-fit: cover;
56
+ }
57
+ #section-{{ section.id }} .hero-banner__overlay {
58
+ position: absolute;
59
+ inset: 0;
60
+ background: rgba(0,0,0, var(--overlay-opacity, 0.4));
61
+ }
62
+ #section-{{ section.id }} .hero-banner__content {
63
+ position: relative;
64
+ z-index: 1;
65
+ padding: 2rem;
66
+ max-width: 800px;
67
+ text-align: center;
68
+ }
69
+ #section-{{ section.id }} .hero-banner__content--left { text-align: left; justify-self: start; }
70
+ #section-{{ section.id }} .hero-banner__content--right { text-align: right; justify-self: end; }
71
+ #section-{{ section.id }} .hero-banner__heading { font-size: clamp(2rem, 5vw, 4rem); margin: 0 0 1rem; }
72
+ #section-{{ section.id }} .hero-banner__subtext { font-size: 1.125rem; margin: 0 0 1.5rem; opacity: 0.9; }
73
+ #section-{{ section.id }} .hero-banner__btn { display: inline-block; padding: 0.75rem 2rem; background: #fff; color: #000; text-decoration: none; border-radius: 4px; font-weight: 600; }
74
+ @media (max-width: 749px) {
75
+ #section-{{ section.id }} .hero-banner__content { padding: 1.5rem; }
76
+ #section-{{ section.id }} .hero-banner__content--left,
77
+ #section-{{ section.id }} .hero-banner__content--right { text-align: center; justify-self: center; }
78
+ }
79
+ </style>
80
+
81
+ {% schema %}
82
+ {
83
+ "name": "Hero Banner",
84
+ "tag": "section",
85
+ "class": "section-hero-banner",
86
+ "settings": [
87
+ { "type": "image_picker", "id": "image", "label": "Background Image" },
88
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Welcome to our store" },
89
+ { "type": "text", "id": "subtext", "label": "Subtext", "default": "Discover our collection" },
90
+ { "type": "text", "id": "button_label", "label": "Button Label", "default": "Shop Now" },
91
+ { "type": "url", "id": "button_link", "label": "Button Link" },
92
+ { "type": "range", "id": "overlay_opacity", "label": "Overlay Opacity", "min": 0, "max": 80, "step": 5, "default": 40 },
93
+ { "type": "range", "id": "min_height", "label": "Min Height (px)", "min": 300, "max": 900, "step": 50, "default": 500 },
94
+ { "type": "color", "id": "text_color", "label": "Text Color", "default": "#ffffff" },
95
+ { "type": "select", "id": "content_position", "label": "Content Position", "options": [
96
+ { "value": "left", "label": "Left" },
97
+ { "value": "center", "label": "Center" },
98
+ { "value": "right", "label": "Right" }
99
+ ], "default": "center" }
100
+ ],
101
+ "blocks": [{ "type": "@app" }],
102
+ "presets": [{ "name": "Hero Banner" }]
103
+ }
104
+ {% endschema %}
@@ -0,0 +1,77 @@
1
+ {%- comment -%} rebly-sections: Image Gallery | Category: media | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="image-gallery">
4
+ <div class="image-gallery__container">
5
+
6
+ {%- if section.settings.heading != blank -%}
7
+ <h2 class="image-gallery__heading">{{ section.settings.heading | escape }}</h2>
8
+ {%- endif -%}
9
+
10
+ <div class="image-gallery__grid" style="--cols: {{ section.settings.columns }};">
11
+ {%- for block in section.blocks -%}
12
+ {%- if block.type == 'gallery-item' -%}
13
+ <div class="image-gallery__item" {{ block.shopify_attributes }}>
14
+ {%- if block.settings.image != blank -%}
15
+ {%- if section.settings.enable_lightbox -%}
16
+ <a
17
+ href="{{ block.settings.image | image_url: width: 1600 }}"
18
+ class="image-gallery__link"
19
+ data-lightbox="gallery-{{ section.id }}"
20
+ data-title="{{ block.settings.caption | escape }}"
21
+ >
22
+ {%- endif -%}
23
+ {{- block.settings.image | image_url: width: 600 | image_tag: loading: 'lazy', alt: block.settings.caption, class: 'image-gallery__img' -}}
24
+ {%- if section.settings.enable_lightbox -%}</a>{%- endif -%}
25
+ {%- if block.settings.caption != blank -%}
26
+ <p class="image-gallery__caption">{{ block.settings.caption | escape }}</p>
27
+ {%- endif -%}
28
+ {%- else -%}
29
+ {{ 'image' | placeholder_svg_tag: 'image-gallery__img' }}
30
+ {%- endif -%}
31
+ </div>
32
+ {%- endif -%}
33
+ {%- endfor -%}
34
+ </div>
35
+
36
+ </div>
37
+ </section>
38
+
39
+ <style>
40
+ #section-{{ section.id }} .image-gallery__container { max-width: 1200px; margin: 0 auto; padding: 4rem 2rem; }
41
+ #section-{{ section.id }} .image-gallery__heading { font-size: 2rem; text-align: center; margin: 0 0 2rem; }
42
+ #section-{{ section.id }} .image-gallery__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: 1rem; }
43
+ #section-{{ section.id }} .image-gallery__item { position: relative; overflow: hidden; border-radius: 4px; }
44
+ #section-{{ section.id }} .image-gallery__img { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; transition: transform 0.3s; }
45
+ #section-{{ section.id }} .image-gallery__item:hover .image-gallery__img { transform: scale(1.04); }
46
+ #section-{{ section.id }} .image-gallery__link { display: block; overflow: hidden; }
47
+ #section-{{ section.id }} .image-gallery__caption { font-size: 0.85rem; opacity: 0.7; padding: 0.4rem 0; text-align: center; }
48
+ @media (max-width: 749px) { #section-{{ section.id }} .image-gallery__grid { grid-template-columns: repeat(2, 1fr); } }
49
+ </style>
50
+
51
+ {% schema %}
52
+ {
53
+ "name": "Image Gallery",
54
+ "tag": "section",
55
+ "class": "section-image-gallery",
56
+ "settings": [
57
+ { "type": "text", "id": "heading", "label": "Heading" },
58
+ { "type": "range", "id": "columns", "label": "Columns", "min": 2, "max": 5, "step": 1, "default": 3 },
59
+ { "type": "checkbox", "id": "enable_lightbox", "label": "Enable Lightbox Links", "default": false }
60
+ ],
61
+ "blocks": [
62
+ {
63
+ "type": "gallery-item",
64
+ "name": "Image",
65
+ "settings": [
66
+ { "type": "image_picker", "id": "image", "label": "Image" },
67
+ { "type": "text", "id": "caption", "label": "Caption" }
68
+ ]
69
+ },
70
+ { "type": "@app" }
71
+ ],
72
+ "presets": [{
73
+ "name": "Image Gallery",
74
+ "blocks": [{ "type": "gallery-item" }, { "type": "gallery-item" }, { "type": "gallery-item" }, { "type": "gallery-item" }, { "type": "gallery-item" }, { "type": "gallery-item" }]
75
+ }]
76
+ }
77
+ {% endschema %}
@@ -0,0 +1,84 @@
1
+ {%- comment -%} rebly-sections: Image with Text | Category: content | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="image-with-text">
4
+ <div class="image-with-text__grid image-with-text__grid--{{ section.settings.image_position }} image-with-text__grid--{{ section.settings.image_width }}">
5
+
6
+ <div class="image-with-text__media">
7
+ {%- if section.settings.image != blank -%}
8
+ {{- section.settings.image | image_url: width: 800 | image_tag: loading: 'lazy', class: 'image-with-text__img' -}}
9
+ {%- else -%}
10
+ {{ 'image' | placeholder_svg_tag: 'image-with-text__img placeholder' }}
11
+ {%- endif -%}
12
+ </div>
13
+
14
+ {%- for block in section.blocks -%}<div {{ block.shopify_attributes }}></div>{%- endfor -%}
15
+
16
+ <div class="image-with-text__body">
17
+ {%- if section.settings.heading != blank -%}
18
+ <h2 class="image-with-text__heading">{{ section.settings.heading | escape }}</h2>
19
+ {%- endif -%}
20
+ {%- if section.settings.text != blank -%}
21
+ <div class="image-with-text__text rte">{{ section.settings.text }}</div>
22
+ {%- endif -%}
23
+ {%- if section.settings.button_label != blank -%}
24
+ <a href="{{ section.settings.button_link }}" class="image-with-text__btn btn">
25
+ {{ section.settings.button_label | escape }}
26
+ </a>
27
+ {%- endif -%}
28
+ </div>
29
+
30
+ </div>
31
+ </section>
32
+
33
+ <style>
34
+ #section-{{ section.id }} .image-with-text__grid {
35
+ display: grid;
36
+ grid-template-columns: 1fr 1fr;
37
+ gap: 2rem;
38
+ align-items: center;
39
+ padding: 4rem 2rem;
40
+ max-width: 1200px;
41
+ margin: 0 auto;
42
+ }
43
+ #section-{{ section.id }} .image-with-text__grid--small { grid-template-columns: 1fr 2fr; }
44
+ #section-{{ section.id }} .image-with-text__grid--large { grid-template-columns: 2fr 1fr; }
45
+ #section-{{ section.id }} .image-with-text__grid--right .image-with-text__media { order: 2; }
46
+ #section-{{ section.id }} .image-with-text__grid--right .image-with-text__body { order: 1; }
47
+ #section-{{ section.id }} .image-with-text__img { width: 100%; height: auto; display: block; border-radius: 4px; }
48
+ #section-{{ section.id }} .image-with-text__heading { font-size: 2rem; margin: 0 0 1rem; }
49
+ #section-{{ section.id }} .image-with-text__text { margin: 0 0 1.5rem; line-height: 1.6; }
50
+ #section-{{ section.id }} .image-with-text__btn { display: inline-block; padding: 0.75rem 1.5rem; background: currentColor; color: #fff; text-decoration: none; border-radius: 4px; }
51
+ @media (max-width: 749px) {
52
+ #section-{{ section.id }} .image-with-text__grid,
53
+ #section-{{ section.id }} .image-with-text__grid--small,
54
+ #section-{{ section.id }} .image-with-text__grid--large { grid-template-columns: 1fr; }
55
+ #section-{{ section.id }} .image-with-text__grid--right .image-with-text__media { order: 0; }
56
+ #section-{{ section.id }} .image-with-text__grid--right .image-with-text__body { order: 0; }
57
+ }
58
+ </style>
59
+
60
+ {% schema %}
61
+ {
62
+ "name": "Image with Text",
63
+ "tag": "section",
64
+ "class": "section-image-with-text",
65
+ "settings": [
66
+ { "type": "image_picker", "id": "image", "label": "Image" },
67
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Image with text" },
68
+ { "type": "richtext", "id": "text", "label": "Text", "default": "<p>Pair text with an image to focus on your chosen product.</p>" },
69
+ { "type": "text", "id": "button_label", "label": "Button Label" },
70
+ { "type": "url", "id": "button_link", "label": "Button Link" },
71
+ { "type": "select", "id": "image_position", "label": "Image Position", "options": [
72
+ { "value": "left", "label": "Left" },
73
+ { "value": "right", "label": "Right" }
74
+ ], "default": "left" },
75
+ { "type": "select", "id": "image_width", "label": "Image Width", "options": [
76
+ { "value": "medium", "label": "Medium (50/50)" },
77
+ { "value": "small", "label": "Small (33/66)" },
78
+ { "value": "large", "label": "Large (66/33)" }
79
+ ], "default": "medium" }
80
+ ],
81
+ "blocks": [{ "type": "@app" }],
82
+ "presets": [{ "name": "Image with Text" }]
83
+ }
84
+ {% endschema %}
@@ -0,0 +1,70 @@
1
+ {%- comment -%} rebly-sections: Logo Cloud | Category: social-proof | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="logo-cloud">
4
+ <div class="logo-cloud__container">
5
+
6
+ {%- if section.settings.heading != blank -%}
7
+ <h2 class="logo-cloud__heading">{{ section.settings.heading | escape }}</h2>
8
+ {%- endif -%}
9
+
10
+ <div class="logo-cloud__grid" style="--per-row: {{ section.settings.logos_per_row }};">
11
+ {%- for block in section.blocks -%}
12
+ {%- if block.type == 'logo-item' -%}
13
+ <div class="logo-cloud__item" {{ block.shopify_attributes }}>
14
+ {%- if block.settings.link != blank -%}
15
+ <a href="{{ block.settings.link }}" class="logo-cloud__link" aria-label="{{ block.settings.alt_text | default: 'Partner logo' }}">
16
+ {%- endif -%}
17
+ {%- if block.settings.image != blank -%}
18
+ {{- block.settings.image | image_url: width: 200 | image_tag: loading: 'lazy', alt: block.settings.alt_text -}}
19
+ {%- else -%}
20
+ {{ 'image' | placeholder_svg_tag: 'logo-cloud__placeholder' }}
21
+ {%- endif -%}
22
+ {%- if block.settings.link != blank -%}
23
+ </a>
24
+ {%- endif -%}
25
+ </div>
26
+ {%- endif -%}
27
+ {%- endfor -%}
28
+ </div>
29
+
30
+ </div>
31
+ </section>
32
+
33
+ <style>
34
+ #section-{{ section.id }} .logo-cloud__container { max-width: 1100px; margin: 0 auto; padding: 3rem 2rem; }
35
+ #section-{{ section.id }} .logo-cloud__heading { text-align: center; font-size: 1.25rem; opacity: 0.6; margin: 0 0 2rem; text-transform: uppercase; letter-spacing: 0.1em; }
36
+ #section-{{ section.id }} .logo-cloud__grid { display: grid; grid-template-columns: repeat(var(--per-row, 5), 1fr); gap: 1.5rem 2rem; align-items: center; }
37
+ #section-{{ section.id }} .logo-cloud__item { display: flex; justify-content: center; }
38
+ #section-{{ section.id }} .logo-cloud__item img { max-height: 60px; width: auto; max-width: 140px; object-fit: contain; filter: grayscale(1); opacity: 0.65; transition: filter 0.2s, opacity 0.2s; }
39
+ #section-{{ section.id }} .logo-cloud__item img:hover { filter: grayscale(0); opacity: 1; }
40
+ #section-{{ section.id }} .logo-cloud__link { display: flex; }
41
+ @media (max-width: 749px) { #section-{{ section.id }} .logo-cloud__grid { grid-template-columns: repeat(3, 1fr); } }
42
+ </style>
43
+
44
+ {% schema %}
45
+ {
46
+ "name": "Logo Cloud",
47
+ "tag": "section",
48
+ "class": "section-logo-cloud",
49
+ "settings": [
50
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Trusted by" },
51
+ { "type": "range", "id": "logos_per_row", "label": "Logos Per Row", "min": 3, "max": 7, "step": 1, "default": 5 }
52
+ ],
53
+ "blocks": [
54
+ {
55
+ "type": "logo-item",
56
+ "name": "Logo",
57
+ "settings": [
58
+ { "type": "image_picker", "id": "image", "label": "Logo Image" },
59
+ { "type": "url", "id": "link", "label": "Link" },
60
+ { "type": "text", "id": "alt_text", "label": "Alt Text" }
61
+ ]
62
+ },
63
+ { "type": "@app" }
64
+ ],
65
+ "presets": [{
66
+ "name": "Logo Cloud",
67
+ "blocks": [{ "type": "logo-item" }, { "type": "logo-item" }, { "type": "logo-item" }, { "type": "logo-item" }, { "type": "logo-item" }]
68
+ }]
69
+ }
70
+ {% endschema %}
@@ -0,0 +1,72 @@
1
+ {%- comment -%} rebly-sections: Newsletter Signup | Category: conversion | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="newsletter-signup" style="--bg: {{ section.settings.background_color }};">
4
+ <div class="newsletter-signup__container">
5
+
6
+ {%- for block in section.blocks -%}<div {{ block.shopify_attributes }}></div>{%- endfor -%}
7
+
8
+ {%- if section.settings.heading != blank -%}
9
+ <h2 class="newsletter-signup__heading">{{ section.settings.heading | escape }}</h2>
10
+ {%- endif -%}
11
+ {%- if section.settings.subtext != blank -%}
12
+ <p class="newsletter-signup__subtext">{{ section.settings.subtext | escape }}</p>
13
+ {%- endif -%}
14
+
15
+ {%- form 'customer', id: 'newsletter-form-{{ section.id }}', class: 'newsletter-signup__form' -%}
16
+ <input type="hidden" name="contact[tags]" value="newsletter">
17
+ <div class="newsletter-signup__fields">
18
+ <label for="email-{{ section.id }}" class="visually-hidden">Email address</label>
19
+ <input
20
+ type="email"
21
+ id="email-{{ section.id }}"
22
+ name="contact[email]"
23
+ class="newsletter-signup__input"
24
+ placeholder="your@email.com"
25
+ required
26
+ autocomplete="email"
27
+ >
28
+ <button type="submit" class="newsletter-signup__btn">
29
+ {{ section.settings.button_label | default: 'Subscribe' | escape }}
30
+ </button>
31
+ </div>
32
+ {%- if form.posted_successfully? -%}
33
+ <p class="newsletter-signup__success">{{ section.settings.success_message | escape }}</p>
34
+ {%- endif -%}
35
+ {%- if form.errors -%}
36
+ <p class="newsletter-signup__error">{{ form.errors.translated_fields['email'] | capitalize }} {{ form.errors.messages['email'] }}</p>
37
+ {%- endif -%}
38
+ {%- endform -%}
39
+
40
+ </div>
41
+ </section>
42
+
43
+ <style>
44
+ #section-{{ section.id }} { background: var(--bg, #f5f5f5); }
45
+ #section-{{ section.id }} .newsletter-signup__container { max-width: 600px; margin: 0 auto; padding: 4rem 2rem; text-align: center; }
46
+ #section-{{ section.id }} .newsletter-signup__heading { font-size: 2rem; margin: 0 0 0.75rem; }
47
+ #section-{{ section.id }} .newsletter-signup__subtext { opacity: 0.75; margin: 0 0 2rem; }
48
+ #section-{{ section.id }} .newsletter-signup__fields { display: flex; gap: 0.5rem; }
49
+ #section-{{ section.id }} .newsletter-signup__input { flex: 1; padding: 0.75rem 1rem; border: 1px solid rgba(0,0,0,0.2); border-radius: 4px; font-size: 1rem; }
50
+ #section-{{ section.id }} .newsletter-signup__btn { padding: 0.75rem 1.5rem; background: #000; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 1rem; white-space: nowrap; }
51
+ #section-{{ section.id }} .newsletter-signup__success { color: green; margin-top: 1rem; }
52
+ #section-{{ section.id }} .newsletter-signup__error { color: red; margin-top: 1rem; }
53
+ .visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); }
54
+ @media (max-width: 749px) { #section-{{ section.id }} .newsletter-signup__fields { flex-direction: column; } }
55
+ </style>
56
+
57
+ {% schema %}
58
+ {
59
+ "name": "Newsletter Signup",
60
+ "tag": "section",
61
+ "class": "section-newsletter-signup",
62
+ "settings": [
63
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Subscribe to our newsletter" },
64
+ { "type": "text", "id": "subtext", "label": "Subtext", "default": "Get exclusive deals and updates." },
65
+ { "type": "text", "id": "button_label", "label": "Button Label", "default": "Subscribe" },
66
+ { "type": "text", "id": "success_message", "label": "Success Message", "default": "Thanks for subscribing!" },
67
+ { "type": "color_background", "id": "background_color", "label": "Background Color", "default": "#f5f5f5" }
68
+ ],
69
+ "blocks": [{ "type": "@app" }],
70
+ "presets": [{ "name": "Newsletter Signup" }]
71
+ }
72
+ {% endschema %}
@@ -0,0 +1,101 @@
1
+ {%- comment -%} rebly-sections: Pricing Table | Category: conversion | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="pricing-table">
4
+ <div class="pricing-table__container">
5
+
6
+ {%- if section.settings.heading != blank or section.settings.subheading != blank -%}
7
+ <div class="pricing-table__header">
8
+ {%- if section.settings.heading != blank -%}
9
+ <h2 class="pricing-table__heading">{{ section.settings.heading | escape }}</h2>
10
+ {%- endif -%}
11
+ {%- if section.settings.subheading != blank -%}
12
+ <p class="pricing-table__subheading">{{ section.settings.subheading | escape }}</p>
13
+ {%- endif -%}
14
+ </div>
15
+ {%- endif -%}
16
+
17
+ <div class="pricing-table__tiers">
18
+ {%- for block in section.blocks -%}
19
+ {%- if block.type == 'pricing-tier' -%}
20
+ <div class="pricing-table__tier{% if block.settings.highlighted %} pricing-table__tier--featured{% endif %}" {{ block.shopify_attributes }}>
21
+ {%- if block.settings.plan_name != blank -%}
22
+ <h3 class="pricing-table__plan-name">{{ block.settings.plan_name | escape }}</h3>
23
+ {%- endif -%}
24
+ <div class="pricing-table__price-wrap">
25
+ <span class="pricing-table__price">{{ block.settings.price | escape }}</span>
26
+ {%- if block.settings.period != blank -%}
27
+ <span class="pricing-table__period">/ {{ block.settings.period | escape }}</span>
28
+ {%- endif -%}
29
+ </div>
30
+ {%- if block.settings.features != blank -%}
31
+ <ul class="pricing-table__features">
32
+ {%- assign feature_list = block.settings.features | split: "\n" -%}
33
+ {%- for feature in feature_list -%}
34
+ {%- if feature != blank -%}
35
+ <li>{{ feature | escape }}</li>
36
+ {%- endif -%}
37
+ {%- endfor -%}
38
+ </ul>
39
+ {%- endif -%}
40
+ {%- if block.settings.button_label != blank -%}
41
+ <a href="{{ block.settings.button_link }}" class="pricing-table__btn">
42
+ {{ block.settings.button_label | escape }}
43
+ </a>
44
+ {%- endif -%}
45
+ </div>
46
+ {%- endif -%}
47
+ {%- endfor -%}
48
+ </div>
49
+
50
+ </div>
51
+ </section>
52
+
53
+ <style>
54
+ #section-{{ section.id }} .pricing-table__container { max-width: 1100px; margin: 0 auto; padding: 4rem 2rem; }
55
+ #section-{{ section.id }} .pricing-table__header { text-align: center; margin-bottom: 3rem; }
56
+ #section-{{ section.id }} .pricing-table__heading { font-size: 2rem; margin: 0 0 0.75rem; }
57
+ #section-{{ section.id }} .pricing-table__subheading { opacity: 0.7; margin: 0; }
58
+ #section-{{ section.id }} .pricing-table__tiers { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 1.5rem; align-items: start; }
59
+ #section-{{ section.id }} .pricing-table__tier { border: 1px solid rgba(0,0,0,0.12); border-radius: 8px; padding: 2rem; }
60
+ #section-{{ section.id }} .pricing-table__tier--featured { border-color: #000; border-width: 2px; box-shadow: 0 4px 20px rgba(0,0,0,0.12); }
61
+ #section-{{ section.id }} .pricing-table__plan-name { font-size: 1.25rem; margin: 0 0 1rem; text-transform: uppercase; letter-spacing: 0.05em; }
62
+ #section-{{ section.id }} .pricing-table__price-wrap { margin-bottom: 1.5rem; }
63
+ #section-{{ section.id }} .pricing-table__price { font-size: 2.5rem; font-weight: 700; }
64
+ #section-{{ section.id }} .pricing-table__period { opacity: 0.6; }
65
+ #section-{{ section.id }} .pricing-table__features { list-style: none; margin: 0 0 2rem; padding: 0; }
66
+ #section-{{ section.id }} .pricing-table__features li { padding: 0.4rem 0; border-bottom: 1px solid rgba(0,0,0,0.07); font-size: 0.95rem; }
67
+ #section-{{ section.id }} .pricing-table__btn { display: block; text-align: center; padding: 0.85rem 1.5rem; background: #000; color: #fff; text-decoration: none; border-radius: 4px; font-weight: 600; }
68
+ #section-{{ section.id }} .pricing-table__tier--featured .pricing-table__btn { background: #000; }
69
+ </style>
70
+
71
+ {% schema %}
72
+ {
73
+ "name": "Pricing Table",
74
+ "tag": "section",
75
+ "class": "section-pricing-table",
76
+ "settings": [
77
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Simple, Transparent Pricing" },
78
+ { "type": "text", "id": "subheading", "label": "Subheading" }
79
+ ],
80
+ "blocks": [
81
+ {
82
+ "type": "pricing-tier",
83
+ "name": "Pricing Tier",
84
+ "settings": [
85
+ { "type": "text", "id": "plan_name", "label": "Plan Name", "default": "Basic" },
86
+ { "type": "text", "id": "price", "label": "Price", "default": "$9" },
87
+ { "type": "text", "id": "period", "label": "Period", "default": "month" },
88
+ { "type": "textarea", "id": "features", "label": "Features (one per line)", "default": "Feature one\nFeature two\nFeature three" },
89
+ { "type": "text", "id": "button_label", "label": "Button Label", "default": "Get Started" },
90
+ { "type": "url", "id": "button_link", "label": "Button Link" },
91
+ { "type": "checkbox", "id": "highlighted", "label": "Highlight this tier", "default": false }
92
+ ]
93
+ },
94
+ { "type": "@app" }
95
+ ],
96
+ "presets": [{
97
+ "name": "Pricing Table",
98
+ "blocks": [{ "type": "pricing-tier" }, { "type": "pricing-tier" }, { "type": "pricing-tier" }]
99
+ }]
100
+ }
101
+ {% endschema %}
@@ -0,0 +1,74 @@
1
+ {%- comment -%} rebly-sections: Product Grid | Category: product | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="product-grid">
4
+ <div class="product-grid__container">
5
+
6
+ {%- if section.settings.heading != blank -%}
7
+ <h2 class="product-grid__heading">{{ section.settings.heading | escape }}</h2>
8
+ {%- endif -%}
9
+
10
+ {%- for block in section.blocks -%}<div {{ block.shopify_attributes }}></div>{%- endfor -%}
11
+ {%- assign collection = collections[section.settings.collection] -%}
12
+ {%- assign products_limit = section.settings.products_to_show -%}
13
+
14
+ <div class="product-grid__items" style="--cols: {{ section.settings.columns }};">
15
+ {%- if collection != blank -%}
16
+ {%- for product in collection.products limit: products_limit -%}
17
+ <div class="product-grid__card">
18
+ <a href="{{ product.url }}" class="product-grid__card-link">
19
+ <div class="product-grid__card-image">
20
+ {{- product.featured_image | image_url: width: 400 | image_tag: loading: 'lazy', alt: product.title -}}
21
+ </div>
22
+ <div class="product-grid__card-info">
23
+ {%- if section.settings.show_vendor and product.vendor != blank -%}
24
+ <p class="product-grid__vendor">{{ product.vendor }}</p>
25
+ {%- endif -%}
26
+ <h3 class="product-grid__card-title">{{ product.title }}</h3>
27
+ {%- if section.settings.show_price -%}
28
+ <p class="product-grid__price">{{ product.price | money }}</p>
29
+ {%- endif -%}
30
+ </div>
31
+ </a>
32
+ </div>
33
+ {%- endfor -%}
34
+ {%- else -%}
35
+ {%- for i in (1..products_limit) -%}
36
+ <div class="product-grid__card">{{ 'product-' | append: i | placeholder_svg_tag: 'product-grid__placeholder' }}</div>
37
+ {%- endfor -%}
38
+ {%- endif -%}
39
+ </div>
40
+
41
+ </div>
42
+ </section>
43
+
44
+ <style>
45
+ #section-{{ section.id }} .product-grid__container { max-width: 1200px; margin: 0 auto; padding: 4rem 2rem; }
46
+ #section-{{ section.id }} .product-grid__heading { font-size: 2rem; text-align: center; margin: 0 0 2rem; }
47
+ #section-{{ section.id }} .product-grid__items { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: 1.5rem; }
48
+ #section-{{ section.id }} .product-grid__card-link { display: block; text-decoration: none; color: inherit; }
49
+ #section-{{ section.id }} .product-grid__card-image img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 4px; }
50
+ #section-{{ section.id }} .product-grid__card-info { padding: 0.75rem 0; }
51
+ #section-{{ section.id }} .product-grid__card-title { font-size: 1rem; margin: 0 0 0.25rem; }
52
+ #section-{{ section.id }} .product-grid__vendor { font-size: 0.85rem; opacity: 0.6; margin: 0 0 0.25rem; }
53
+ #section-{{ section.id }} .product-grid__price { font-weight: 600; margin: 0; }
54
+ @media (max-width: 989px) { #section-{{ section.id }} .product-grid__items { grid-template-columns: repeat(2, 1fr); } }
55
+ @media (max-width: 749px) { #section-{{ section.id }} .product-grid__items { grid-template-columns: repeat(2, 1fr); } }
56
+ </style>
57
+
58
+ {% schema %}
59
+ {
60
+ "name": "Product Grid",
61
+ "tag": "section",
62
+ "class": "section-product-grid",
63
+ "settings": [
64
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Featured Products" },
65
+ { "type": "collection", "id": "collection", "label": "Collection" },
66
+ { "type": "range", "id": "products_to_show", "label": "Products to Show", "min": 2, "max": 12, "step": 1, "default": 6 },
67
+ { "type": "range", "id": "columns", "label": "Columns", "min": 2, "max": 4, "step": 1, "default": 3 },
68
+ { "type": "checkbox", "id": "show_price", "label": "Show Price", "default": true },
69
+ { "type": "checkbox", "id": "show_vendor", "label": "Show Vendor", "default": false }
70
+ ],
71
+ "blocks": [{ "type": "@app" }],
72
+ "presets": [{ "name": "Product Grid" }]
73
+ }
74
+ {% endschema %}
@@ -0,0 +1,52 @@
1
+ {%- comment -%} rebly-sections: Rich Text Content | Category: content | OS2.0 {%- endcomment -%}
2
+
3
+ <section id="section-{{ section.id }}" class="rich-text-content">
4
+ {%- for block in section.blocks -%}<div {{ block.shopify_attributes }}></div>{%- endfor -%}
5
+ <div class="rich-text-content__container rich-text-content__container--{{ section.settings.content_width }}">
6
+ <div class="rich-text-content__body" style="text-align: {{ section.settings.text_alignment }};">
7
+ {%- if section.settings.heading != blank -%}
8
+ <h2 class="rich-text-content__heading">{{ section.settings.heading | escape }}</h2>
9
+ {%- endif -%}
10
+ {%- if section.settings.text != blank -%}
11
+ <div class="rich-text-content__text rte">{{ section.settings.text }}</div>
12
+ {%- endif -%}
13
+ </div>
14
+ </div>
15
+ </section>
16
+
17
+ <style>
18
+ #section-{{ section.id }} .rich-text-content__container {
19
+ margin: 0 auto;
20
+ padding: 4rem 2rem;
21
+ }
22
+ #section-{{ section.id }} .rich-text-content__container--narrow { max-width: 640px; }
23
+ #section-{{ section.id }} .rich-text-content__container--medium { max-width: 900px; }
24
+ #section-{{ section.id }} .rich-text-content__container--full { max-width: 100%; }
25
+ #section-{{ section.id }} .rich-text-content__heading { font-size: 2rem; margin: 0 0 1.25rem; }
26
+ #section-{{ section.id }} .rich-text-content__text { line-height: 1.7; }
27
+ #section-{{ section.id }} .rich-text-content__text p { margin: 0 0 1rem; }
28
+ @media (max-width: 749px) {
29
+ #section-{{ section.id }} .rich-text-content__container { padding: 2.5rem 1.5rem; }
30
+ #section-{{ section.id }} .rich-text-content__heading { font-size: 1.5rem; }
31
+ }
32
+ </style>
33
+
34
+ {% schema %}
35
+ {
36
+ "name": "Rich Text Content",
37
+ "tag": "section",
38
+ "class": "section-rich-text-content",
39
+ "settings": [
40
+ { "type": "text", "id": "heading", "label": "Heading", "default": "Talk about your brand" },
41
+ { "type": "richtext", "id": "text", "label": "Text", "default": "<p>Share information about your brand with your customers. Describe a product, make announcements, or welcome customers to your store.</p>" },
42
+ { "type": "text_alignment", "id": "text_alignment", "label": "Text Alignment", "default": "center" },
43
+ { "type": "select", "id": "content_width", "label": "Content Width", "options": [
44
+ { "value": "narrow", "label": "Narrow" },
45
+ { "value": "medium", "label": "Medium" },
46
+ { "value": "full", "label": "Full" }
47
+ ], "default": "medium" }
48
+ ],
49
+ "blocks": [{ "type": "@app" }],
50
+ "presets": [{ "name": "Rich Text Content" }]
51
+ }
52
+ {% endschema %}