@runwell/shopify-toolkit 0.6.0 → 0.8.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 (36) hide show
  1. package/modules/INDEX.md +35 -9
  2. package/modules/comparison-table/variants/feature-columns/sections/runwell-comparison-table.liquid +3 -3
  3. package/modules/delivery-estimate/snippets/runwell-delivery-estimate.liquid +1 -1
  4. package/modules/editorial-block/sections/runwell-editorial-block.liquid +3 -3
  5. package/modules/editorial-hero/module.json +36 -53
  6. package/modules/editorial-hero/variants/hero-with-card/assets/runwell-editorial-hero.css +108 -0
  7. package/modules/editorial-hero/variants/hero-with-card/sections/runwell-editorial-hero.liquid +91 -0
  8. package/modules/editorial-hero/{sections → variants/video-bg/sections}/runwell-video-hero.liquid +3 -3
  9. package/modules/exit-intent/sections/runwell-exit-intent.liquid +3 -3
  10. package/modules/faq/sections/runwell-faq.liquid +5 -5
  11. package/modules/how-it-works/sections/runwell-how-it-works.liquid +5 -5
  12. package/modules/inventory-urgency/snippets/runwell-inventory-urgency.liquid +1 -1
  13. package/modules/pdp-ingredients/sections/runwell-ingredients.liquid +14 -6
  14. package/modules/pdp-journal-link/sections/runwell-pdp-journal.liquid +18 -9
  15. package/modules/pdp-trust-checks/sections/runwell-pdp-trust.liquid +4 -4
  16. package/modules/press-bar/sections/runwell-press-bar.liquid +3 -3
  17. package/modules/recently-viewed/sections/runwell-recently-viewed.liquid +3 -3
  18. package/modules/reviews/sections/runwell-pdp-reviews.liquid +15 -9
  19. package/modules/risk-reversal/sections/runwell-risk-reversal.liquid +3 -3
  20. package/modules/scrolling-ticker/assets/runwell-scrolling-ticker.css +51 -0
  21. package/modules/scrolling-ticker/module.json +13 -0
  22. package/modules/scrolling-ticker/sections/runwell-scrolling-ticker.liquid +82 -0
  23. package/modules/shipping-bar/sections/runwell-shipping-bar.liquid +3 -3
  24. package/modules/social-proof-banner/assets/runwell-social-proof-banner.css +30 -0
  25. package/modules/social-proof-banner/module.json +13 -0
  26. package/modules/social-proof-banner/sections/runwell-social-proof-banner.liquid +66 -0
  27. package/modules/stats-bar/assets/runwell-stats-bar.css +49 -0
  28. package/modules/stats-bar/module.json +13 -0
  29. package/modules/stats-bar/sections/runwell-stats-bar.liquid +87 -0
  30. package/modules/sticky-atc/sections/runwell-pdp-sticky.liquid +3 -3
  31. package/modules/testimonials/module.json +24 -26
  32. package/modules/testimonials/variants/carousel-ugc/assets/runwell-testimonials.css +169 -0
  33. package/modules/testimonials/variants/carousel-ugc/sections/runwell-testimonials.liquid +148 -0
  34. package/modules/testimonials/{sections → variants/grid-quotes/sections}/runwell-testimonials.liquid +3 -3
  35. package/modules/trust-badges/sections/runwell-trust-badges.liquid +4 -4
  36. package/package.json +1 -1
@@ -1,11 +1,13 @@
1
1
  {%- comment -%}
2
- Lushi PDP journal link. Connects a product to the editorial article that
3
- explains why it's on Lushi. Uses the product's metafield
4
- `lushi.journal_article` if set, otherwise falls back to the linked
5
- article picked in the section settings, otherwise the manual title.
2
+ Runwell PDP journal link. Connects a product to the editorial article
3
+ that explains why we carry it. Uses the product metafield
4
+ `<namespace>.journal_article` (default namespace 'runwell', overridable
5
+ per-client). Falls back to the section settings article picker, then
6
+ the manual title.
6
7
  {%- endcomment -%}
7
8
 
8
- {%- assign linked_article = product.metafields.lushi.journal_article.value -%}
9
+ {%- assign ns = section.settings.metafield_namespace | default: 'runwell' -%}
10
+ {%- assign linked_article = product.metafields[ns].journal_article.value -%}
9
11
  {%- if linked_article == blank -%}
10
12
  {%- assign linked_article = section.settings.article -%}
11
13
  {%- endif -%}
@@ -59,7 +61,7 @@
59
61
 
60
62
  {% schema %}
61
63
  {
62
- "name": "Lushi PDP journal link",
64
+ "name": "Runwell PDP journal link",
63
65
  "tag": "section",
64
66
  "class": "section-runwell-pdp-journal",
65
67
  "settings": [
@@ -69,11 +71,18 @@
69
71
  "label": "Eyebrow",
70
72
  "default": "From the journal"
71
73
  },
74
+ {
75
+ "type": "text",
76
+ "id": "metafield_namespace",
77
+ "label": "Journal metafield namespace",
78
+ "default": "runwell",
79
+ "info": "Reads product.metafields.<namespace>.journal_article. Default: runwell."
80
+ },
72
81
  {
73
82
  "type": "article",
74
83
  "id": "article",
75
84
  "label": "Linked article (override)",
76
- "info": "Optional. If set, overrides the product's lushi.journal_article metafield."
85
+ "info": "Optional. If set, overrides the product's <namespace>.journal_article metafield."
77
86
  },
78
87
  {
79
88
  "type": "color",
@@ -101,7 +110,7 @@
101
110
  "type": "textarea",
102
111
  "id": "fallback_body",
103
112
  "label": "Fallback body",
104
- "default": "Every product on Lushi pairs with a journal article. Browse the full archive to dig deeper."
113
+ "default": "Every product we carry pairs with a journal article. Browse the full archive to dig deeper."
105
114
  },
106
115
  {
107
116
  "type": "text",
@@ -117,7 +126,7 @@
117
126
  ],
118
127
  "presets": [
119
128
  {
120
- "name": "Lushi PDP journal link"
129
+ "name": "Runwell PDP journal link"
121
130
  }
122
131
  ]
123
132
  }
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi PDP trust block. Shows the four-check standards on every PDP.
2
+ Runwell PDP trust block. Shows the four-check standards on every PDP.
3
3
  Builds buyer trust the way Goop's "What it is / what it does" panels do.
4
4
  Drop into product.json after the main-product section.
5
5
  {%- endcomment -%}
@@ -56,7 +56,7 @@
56
56
 
57
57
  {% schema %}
58
58
  {
59
- "name": "Lushi PDP trust",
59
+ "name": "Runwell PDP trust",
60
60
  "tag": "section",
61
61
  "class": "section-runwell-pdp-trust",
62
62
  "settings": [
@@ -76,7 +76,7 @@
76
76
  "type": "textarea",
77
77
  "id": "lede",
78
78
  "label": "Lede",
79
- "default": "We do not stock everything. Every product on Lushi has to clear these four checks before it gets a page."
79
+ "default": "We do not stock everything. Every product has to clear these four checks before it gets a page."
80
80
  },
81
81
  {
82
82
  "type": "color",
@@ -128,7 +128,7 @@
128
128
  ],
129
129
  "presets": [
130
130
  {
131
- "name": "Lushi PDP trust",
131
+ "name": "Runwell PDP trust",
132
132
  "blocks": [
133
133
  { "type": "check", "settings": { "eyebrow": "Check 01", "title": "Ingredients we trust.", "body": "Whole-food forms over synthetic where the science holds. Synthetic where it works better, with a clear reason why." } },
134
134
  { "type": "check", "settings": { "eyebrow": "Check 02", "title": "Doses that match research.", "body": "We check actual doses against published trials. No buzzword ingredients at one-tenth the studied dose." } },
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi press bar. Logos in a row with optional eyebrow text and link.
2
+ Runwell press bar. Logos in a row with optional eyebrow text and link.
3
3
  Used on homepage and about page. Keep tight; the wins do the talking.
4
4
 
5
5
  Block options (in priority order):
@@ -52,7 +52,7 @@
52
52
 
53
53
  {% schema %}
54
54
  {
55
- "name": "Lushi press bar",
55
+ "name": "Runwell press bar",
56
56
  "tag": "section",
57
57
  "class": "section-runwell-press-bar",
58
58
  "settings": [
@@ -104,7 +104,7 @@
104
104
  "max_blocks": 9,
105
105
  "presets": [
106
106
  {
107
- "name": "Lushi press bar",
107
+ "name": "Runwell press bar",
108
108
  "blocks": [
109
109
  { "type": "logo", "settings": { "label": "Bloomberg", "asset_filename": "runwell-press-bloomberg.png" } },
110
110
  { "type": "logo", "settings": { "label": "Yahoo Finance", "asset_filename": "runwell-press-yahoo-finance.png" } },
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi recently-viewed products. Reads from localStorage (populated on
2
+ Runwell recently-viewed products. Reads from localStorage (populated on
3
3
  PDP visits) and renders up to 4 cards. Native replacement for the
4
4
  recently-viewed feature in Vitals / similar apps.
5
5
  {%- endcomment -%}
@@ -23,7 +23,7 @@
23
23
 
24
24
  {% schema %}
25
25
  {
26
- "name": "Lushi recently viewed",
26
+ "name": "Runwell recently viewed",
27
27
  "tag": "section",
28
28
  "class": "section-runwell-rv",
29
29
  "settings": [
@@ -32,7 +32,7 @@
32
32
  { "type": "color", "id": "background_color", "label": "Background", "default": "#FFFFFF" }
33
33
  ],
34
34
  "presets": [
35
- { "name": "Lushi recently viewed" }
35
+ { "name": "Runwell recently viewed" }
36
36
  ]
37
37
  }
38
38
  {% endschema %}
@@ -1,12 +1,15 @@
1
1
  {%- comment -%}
2
- Lushi native PDP reviews. Replaces Stamped / Loox display layer.
3
- Reads from product metafield `lushi.reviews` (json type) where each
4
- entry is { name, location, rating, body, date, verified }.
5
- Falls back to a "no reviews yet" state with a CTA to email a review.
2
+ Runwell native PDP reviews. Replaces Stamped / Loox display layer.
3
+ Reads from product metafield `<namespace>.reviews` (json type, default
4
+ namespace 'runwell', overridable per-client via section setting).
5
+ Each entry is { name, location, rating, body, date, verified }.
6
+ Falls back to a "no reviews yet" state with a mailto CTA pointing
7
+ to shop.email (merchant configures in Shopify admin > settings).
6
8
  {%- endcomment -%}
7
9
 
8
10
  {%- if product != blank -%}
9
- {%- assign reviews_json = product.metafields.lushi.reviews.value -%}
11
+ {%- assign ns = section.settings.metafield_namespace | default: 'runwell' -%}
12
+ {%- assign reviews_json = product.metafields[ns].reviews.value -%}
10
13
  <section class="runwell-reviews" data-runwell-reviews>
11
14
  <div class="runwell-reviews__inner">
12
15
  <header class="runwell-reviews__header">
@@ -45,7 +48,9 @@
45
48
  </ul>
46
49
  {%- else -%}
47
50
  <div class="runwell-reviews__empty">
48
- <p>No reviews on this one yet. If you have tried it, write us at <a href="mailto:hello@lushi.co?subject=Review for {{ product.title | escape }}">hello@lushi.co</a> and we will publish thoughtful reviews on the page.</p>
51
+ {%- comment -%}brand.support_email is interpolated at sync time from runwell.config.json; falls back to Shopify admin shop.email if the brand var is unset.{%- endcomment -%}
52
+ {%- assign reply_to = '{{brand.support_email}}' | default: shop.email | default: shop.url -%}
53
+ <p>No reviews on this one yet. If you have tried it, write us at <a href="mailto:{{ reply_to }}?subject=Review for {{ product.title | escape }}">{{ reply_to }}</a> and we will publish thoughtful reviews on the page.</p>
49
54
  </div>
50
55
  {%- endif -%}
51
56
 
@@ -79,14 +84,15 @@
79
84
 
80
85
  {% schema %}
81
86
  {
82
- "name": "Lushi PDP reviews",
87
+ "name": "Runwell PDP reviews",
83
88
  "tag": "section",
84
89
  "class": "section-runwell-pdp-reviews",
85
90
  "settings": [
86
- { "type": "text", "id": "heading", "label": "Heading", "default": "What customers wrote in." }
91
+ { "type": "text", "id": "heading", "label": "Heading", "default": "What customers wrote in." },
92
+ { "type": "text", "id": "metafield_namespace", "label": "Reviews metafield namespace", "default": "runwell", "info": "Reads product.metafields.<namespace>.reviews. Default: runwell." }
87
93
  ],
88
94
  "presets": [
89
- { "name": "Lushi PDP reviews" }
95
+ { "name": "Runwell PDP reviews" }
90
96
  ]
91
97
  }
92
98
  {% endschema %}
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi risk-reversal block. Small, calm reassurance that drops directly
2
+ Runwell risk-reversal block. Small, calm reassurance that drops directly
3
3
  under the PDP buy form (or anywhere the editor wants reassurance).
4
4
  Per CRO §5.3 (foundational trust signal under add-to-cart).
5
5
  {%- endcomment -%}
@@ -39,7 +39,7 @@
39
39
 
40
40
  {% schema %}
41
41
  {
42
- "name": "Lushi risk reversal",
42
+ "name": "Runwell risk reversal",
43
43
  "tag": "section",
44
44
  "class": "section-runwell-risk-reversal",
45
45
  "settings": [
@@ -87,7 +87,7 @@
87
87
  ],
88
88
  "presets": [
89
89
  {
90
- "name": "Lushi risk reversal"
90
+ "name": "Runwell risk reversal"
91
91
  }
92
92
  ]
93
93
  }
@@ -0,0 +1,51 @@
1
+ .runwell-scrolling-ticker {
2
+ overflow: hidden;
3
+ white-space: nowrap;
4
+ padding: 12px 0;
5
+ font-size: 1.4rem;
6
+ font-weight: 600;
7
+ letter-spacing: 0.08em;
8
+ text-transform: uppercase;
9
+ }
10
+
11
+ .scrolling-ticker__inner {
12
+ display: flex;
13
+ width: max-content;
14
+ animation: ticker-scroll var(--ticker-speed, 25s) linear infinite;
15
+ }
16
+
17
+ .scrolling-ticker__content {
18
+ display: flex;
19
+ align-items: center;
20
+ flex-shrink: 0;
21
+ }
22
+
23
+ .scrolling-ticker__item {
24
+ display: inline-flex;
25
+ align-items: center;
26
+ gap: 6px;
27
+ }
28
+
29
+ .scrolling-ticker__separator {
30
+ opacity: 0.6;
31
+ }
32
+
33
+ .scrolling-ticker__icon {
34
+ font-size: 1.2em;
35
+ }
36
+
37
+ @keyframes ticker-scroll {
38
+ 0% { transform: translateX(0); }
39
+ 100% { transform: translateX(-25%); }
40
+ }
41
+
42
+ .scrolling-ticker:hover .scrolling-ticker__inner {
43
+ animation-play-state: paused;
44
+ }
45
+
46
+ @media screen and (max-width: 749px) {
47
+ .runwell-scrolling-ticker {
48
+ font-size: 1.2rem;
49
+ padding: 10px 0;
50
+ }
51
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "scrolling-ticker",
3
+ "version": "0.1.0",
4
+ "category": "social-proof",
5
+ "description": "Top-of-page horizontally-scrolling promotional ticker (free shipping, sale messaging, FOMO copy). One block per text item. Replaces announcement-bar / scrolling-text apps. Promoted from Lusha bespoke (guabrasha-store/sections/scrolling-ticker.liquid).",
6
+ "files": {
7
+ "sections": ["sections/runwell-scrolling-ticker.liquid"],
8
+ "assets": ["assets/runwell-scrolling-ticker.css"]
9
+ },
10
+ "config": {
11
+ "schema": {}
12
+ }
13
+ }
@@ -0,0 +1,82 @@
1
+ {{ 'runwell-scrolling-ticker.css' | asset_url | stylesheet_tag }}
2
+
3
+ <div class="runwell-scrolling-ticker color-{{ section.settings.color_scheme }}" role="marquee">
4
+ <div class="scrolling-ticker__inner">
5
+ {% for i in (1..4) %}
6
+ <div class="scrolling-ticker__content" {% if forloop.index > 1 %}aria-hidden="true"{% endif %}>
7
+ {% for block in section.blocks %}
8
+ <span class="scrolling-ticker__item">
9
+ {% if block.settings.icon != 'none' %}
10
+ <span class="scrolling-ticker__icon">{{ block.settings.icon }}</span>
11
+ {% endif %}
12
+ {{ block.settings.text }}
13
+ </span>
14
+ <span class="scrolling-ticker__separator">&nbsp;&nbsp;{{ section.settings.separator }}&nbsp;&nbsp;</span>
15
+ {% endfor %}
16
+ </div>
17
+ {% endfor %}
18
+ </div>
19
+ </div>
20
+
21
+ {% schema %}
22
+ {
23
+ "name": "Scrolling Ticker",
24
+ "tag": "section",
25
+ "class": "section-runwell-scrolling-ticker",
26
+ "settings": [
27
+ {
28
+ "type": "color_scheme",
29
+ "id": "color_scheme",
30
+ "label": "Color scheme",
31
+ "default": "scheme-3"
32
+ },
33
+ {
34
+ "type": "text",
35
+ "id": "separator",
36
+ "label": "Separator",
37
+ "default": "\u2728"
38
+ },
39
+ {
40
+ "type": "range",
41
+ "id": "speed",
42
+ "label": "Scroll speed (seconds)",
43
+ "min": 10,
44
+ "max": 60,
45
+ "step": 5,
46
+ "default": 25,
47
+ "unit": "s"
48
+ }
49
+ ],
50
+ "blocks": [
51
+ {
52
+ "type": "text",
53
+ "name": "Text item",
54
+ "settings": [
55
+ {
56
+ "type": "text",
57
+ "id": "text",
58
+ "label": "Text",
59
+ "default": "Free shipping on orders over $50"
60
+ },
61
+ {
62
+ "type": "text",
63
+ "id": "icon",
64
+ "label": "Icon (emoji)",
65
+ "default": "none"
66
+ }
67
+ ]
68
+ }
69
+ ],
70
+ "presets": [
71
+ {
72
+ "name": "Scrolling Ticker",
73
+ "blocks": [
74
+ { "type": "text", "settings": { "text": "FREE SHIPPING on orders over $50", "icon": "\u2728" } },
75
+ { "type": "text", "settings": { "text": "Your 2-minute morning sculpting ritual", "icon": "\u2728" } },
76
+ { "type": "text", "settings": { "text": "Inspired by centuries of facial sculpting wisdom", "icon": "\u2728" } },
77
+ { "type": "text", "settings": { "text": "90-Day Satisfaction Guarantee", "icon": "\u2728" } }
78
+ ]
79
+ }
80
+ ]
81
+ }
82
+ {% endschema %}
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi free-shipping announcement bar. Sits at the very top of every
2
+ Runwell free-shipping announcement bar. Sits at the very top of every
3
3
  page. Reads cart total and shows a progress message + bar.
4
4
  {%- endcomment -%}
5
5
 
@@ -40,7 +40,7 @@
40
40
 
41
41
  {% schema %}
42
42
  {
43
- "name": "Lushi shipping bar",
43
+ "name": "Runwell shipping bar",
44
44
  "tag": "aside",
45
45
  "class": "section-runwell-shipping-bar",
46
46
  "enabled_on": {
@@ -88,7 +88,7 @@
88
88
  ],
89
89
  "presets": [
90
90
  {
91
- "name": "Lushi shipping bar"
91
+ "name": "Runwell shipping bar"
92
92
  }
93
93
  ]
94
94
  }
@@ -0,0 +1,30 @@
1
+ .social-proof-banner__content {
2
+ display: flex;
3
+ align-items: baseline;
4
+ justify-content: center;
5
+ gap: 0.6rem;
6
+ text-align: center;
7
+ }
8
+
9
+ .social-proof-banner__count {
10
+ font-family: var(--font-heading-family);
11
+ font-size: 3.6rem;
12
+ font-weight: 600;
13
+ line-height: 1;
14
+ }
15
+
16
+ .social-proof-banner__text {
17
+ font-size: 1.6rem;
18
+ opacity: 0.8;
19
+ }
20
+
21
+ @media screen and (max-width: 749px) {
22
+ .social-proof-banner__content {
23
+ flex-direction: column;
24
+ gap: 0.2rem;
25
+ }
26
+
27
+ .social-proof-banner__count {
28
+ font-size: 2.8rem;
29
+ }
30
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "social-proof-banner",
3
+ "version": "0.1.0",
4
+ "category": "social-proof",
5
+ "description": "Single-line social-proof banner (e.g. 'Loved by 12,400+ customers'). Compact form for tucking under hero or above CTA. Replaces fixed-text social-proof apps. Promoted from Lusha bespoke (guabrasha-store/sections/social-proof-banner.liquid).",
6
+ "files": {
7
+ "sections": ["sections/runwell-social-proof-banner.liquid"],
8
+ "assets": ["assets/runwell-social-proof-banner.css"]
9
+ },
10
+ "config": {
11
+ "schema": {}
12
+ }
13
+ }
@@ -0,0 +1,66 @@
1
+ {{ 'runwell-social-proof-banner.css' | asset_url | stylesheet_tag }}
2
+
3
+ <div class="runwell-social-proof-banner color-{{ section.settings.color_scheme }} section-{{ section.id }}-padding">
4
+ <div class="page-width">
5
+ <div class="social-proof-banner__content">
6
+ {% if section.settings.count != blank %}
7
+ <span class="social-proof-banner__count">{{ section.settings.count }}</span>
8
+ {% endif %}
9
+ {% if section.settings.text != blank %}
10
+ <span class="social-proof-banner__text">{{ section.settings.text }}</span>
11
+ {% endif %}
12
+ </div>
13
+ </div>
14
+ </div>
15
+
16
+ {% schema %}
17
+ {
18
+ "name": "Social Proof Banner",
19
+ "tag": "section",
20
+ "class": "section-runwell-social-proof-banner",
21
+ "settings": [
22
+ {
23
+ "type": "text",
24
+ "id": "count",
25
+ "label": "Count",
26
+ "default": "2,400+"
27
+ },
28
+ {
29
+ "type": "text",
30
+ "id": "text",
31
+ "label": "Text",
32
+ "default": "Happy Customers and Counting"
33
+ },
34
+ {
35
+ "type": "color_scheme",
36
+ "id": "color_scheme",
37
+ "label": "Color scheme",
38
+ "default": "scheme-2"
39
+ },
40
+ {
41
+ "type": "range",
42
+ "id": "padding_top",
43
+ "label": "Top padding",
44
+ "min": 0, "max": 60, "step": 4, "default": 24, "unit": "px"
45
+ },
46
+ {
47
+ "type": "range",
48
+ "id": "padding_bottom",
49
+ "label": "Bottom padding",
50
+ "min": 0, "max": 60, "step": 4, "default": 24, "unit": "px"
51
+ }
52
+ ],
53
+ "presets": [
54
+ {
55
+ "name": "Social Proof Banner"
56
+ }
57
+ ]
58
+ }
59
+ {% endschema %}
60
+
61
+ <style>
62
+ .section-{{ section.id }}-padding {
63
+ padding-top: {{ section.settings.padding_top }}px;
64
+ padding-bottom: {{ section.settings.padding_bottom }}px;
65
+ }
66
+ </style>
@@ -0,0 +1,49 @@
1
+ .stats-bar__grid {
2
+ display: grid;
3
+ gap: 2rem;
4
+ text-align: center;
5
+ }
6
+
7
+ .stats-bar__grid--3-col {
8
+ grid-template-columns: repeat(3, 1fr);
9
+ }
10
+
11
+ .stats-bar__grid--2-col {
12
+ grid-template-columns: repeat(2, 1fr);
13
+ }
14
+
15
+ .stats-bar__grid--4-col {
16
+ grid-template-columns: repeat(4, 1fr);
17
+ }
18
+
19
+ .stats-bar__item {
20
+ display: flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ gap: 0.8rem;
24
+ padding: 2rem 1rem;
25
+ }
26
+
27
+ .stats-bar__number {
28
+ font-size: 4.8rem;
29
+ line-height: 1;
30
+ font-weight: 600;
31
+ }
32
+
33
+ .stats-bar__label {
34
+ font-size: 1.4rem;
35
+ opacity: 0.85;
36
+ max-width: 24ch;
37
+ line-height: 1.4;
38
+ }
39
+
40
+ @media screen and (max-width: 749px) {
41
+ .stats-bar__grid--3-col,
42
+ .stats-bar__grid--4-col {
43
+ grid-template-columns: 1fr;
44
+ }
45
+
46
+ .stats-bar__number {
47
+ font-size: 3.6rem;
48
+ }
49
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "stats-bar",
3
+ "version": "0.1.0",
4
+ "category": "social-proof",
5
+ "description": "Three-up (or N-up) stats row with big number + supporting label per block. Editorial social proof: clinical results, customer surveys, NPS, etc. Replaces app-driven stat counters. Promoted from Lusha bespoke (guabrasha-store/sections/stats-bar.liquid).",
6
+ "files": {
7
+ "sections": ["sections/runwell-stats-bar.liquid"],
8
+ "assets": ["assets/runwell-stats-bar.css"]
9
+ },
10
+ "config": {
11
+ "schema": {}
12
+ }
13
+ }
@@ -0,0 +1,87 @@
1
+ {{ 'runwell-stats-bar.css' | asset_url | stylesheet_tag }}
2
+
3
+ <div class="runwell-stats-bar color-{{ section.settings.color_scheme }} section-{{ section.id }}-padding">
4
+ <div class="page-width">
5
+ <div class="stats-bar__grid stats-bar__grid--{{ section.blocks.size }}-col">
6
+ {% for block in section.blocks %}
7
+ <div class="stats-bar__item" {{ block.shopify_attributes }}>
8
+ <span class="stats-bar__number h0">{{ block.settings.number }}</span>
9
+ <span class="stats-bar__label">{{ block.settings.label }}</span>
10
+ </div>
11
+ {% endfor %}
12
+ </div>
13
+ </div>
14
+ </div>
15
+
16
+ {% schema %}
17
+ {
18
+ "name": "Stats Bar",
19
+ "tag": "section",
20
+ "class": "section-runwell-stats-bar",
21
+ "settings": [
22
+ {
23
+ "type": "color_scheme",
24
+ "id": "color_scheme",
25
+ "label": "Color scheme",
26
+ "default": "scheme-3"
27
+ },
28
+ {
29
+ "type": "range",
30
+ "id": "padding_top",
31
+ "label": "Top padding",
32
+ "min": 0,
33
+ "max": 100,
34
+ "step": 4,
35
+ "default": 40,
36
+ "unit": "px"
37
+ },
38
+ {
39
+ "type": "range",
40
+ "id": "padding_bottom",
41
+ "label": "Bottom padding",
42
+ "min": 0,
43
+ "max": 100,
44
+ "step": 4,
45
+ "default": 40,
46
+ "unit": "px"
47
+ }
48
+ ],
49
+ "blocks": [
50
+ {
51
+ "type": "stat",
52
+ "name": "Statistic",
53
+ "settings": [
54
+ {
55
+ "type": "text",
56
+ "id": "number",
57
+ "label": "Number",
58
+ "default": "89%"
59
+ },
60
+ {
61
+ "type": "text",
62
+ "id": "label",
63
+ "label": "Label",
64
+ "default": "saw reduced puffiness in 7 days"
65
+ }
66
+ ]
67
+ }
68
+ ],
69
+ "presets": [
70
+ {
71
+ "name": "Stats Bar",
72
+ "blocks": [
73
+ { "type": "stat", "settings": { "number": "89%", "label": "saw reduced puffiness in 7 days" } },
74
+ { "type": "stat", "settings": { "number": "94%", "label": "noticed a more sculpted jawline in 4 weeks" } },
75
+ { "type": "stat", "settings": { "number": "91%", "label": "said their skin felt softer after first use" } }
76
+ ]
77
+ }
78
+ ]
79
+ }
80
+ {% endschema %}
81
+
82
+ <style>
83
+ .section-{{ section.id }}-padding {
84
+ padding-top: {{ section.settings.padding_top }}px;
85
+ padding-bottom: {{ section.settings.padding_bottom }}px;
86
+ }
87
+ </style>