@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
package/modules/INDEX.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Auto-generated by `scripts/generate-index.mjs`. Do not edit by hand.
4
4
  Skills (shopify-storefront, shopify-cro, shopify-cli-ops, shopify-admin-browser) grep this file before writing custom Liquid.
5
5
 
6
- Total modules: 31.
6
+ Total modules: 34.
7
7
 
8
8
  ## By category
9
9
 
@@ -11,7 +11,7 @@ Total modules: 31.
11
11
  - **conversion**: cart-cross-sell, cart-freeship-progress, cart-usps, exit-intent, gift-with-purchase, post-purchase-upsell, quick-view, risk-reversal, shipping-bar, sticky-atc
12
12
  - **customer**: loyalty-tiers, wishlist
13
13
  - **pdp**: comparison-table, delivery-estimate, inventory-urgency, pdp-ingredients, pdp-journal-link, pdp-trust-checks, recently-viewed
14
- - **social-proof**: press-bar, product-badges, reviews, testimonials, trust-badges
14
+ - **social-proof**: press-bar, product-badges, reviews, scrolling-ticker, social-proof-banner, stats-bar, testimonials, trust-badges
15
15
  - **storefront**: editorial-block, editorial-hero, faq, how-it-works
16
16
 
17
17
  ## Modules
@@ -25,7 +25,7 @@ Total modules: 31.
25
25
  | `comparison-table` | pdp | app-driven comparison widgets | | eyebrow, heading, lede, background_color, text_color | feature-columns, feature-rows | (none) |
26
26
  | `delivery-estimate` | pdp | (native build) | snippets:1 | (none) | (none) | (none) |
27
27
  | `editorial-block` | storefront | (native build) | sections:1 | eyebrow, heading, lede, background_color, text_color | (none) | (none) |
28
- | `editorial-hero` | storefront | (native build) | sections:1 | eyebrow, heading, subheading, video_url, poster_image, min_height, button_label_primary, button_link_primary, button_label_secondary, button_link_secondary | (none) | (none) |
28
+ | `editorial-hero` | storefront | Dawn's image-banner / video-banner | | eyebrow, heading, subheading | video-bg, hero-with-card | (none) |
29
29
  | `exit-intent` | conversion | (native build) | sections:1 assets:1 | eyebrow, heading, lede | (none) | (none) |
30
30
  | `faq` | storefront | (native build) | sections:1 | eyebrow, heading, background_color, text_color | (none) | (none) |
31
31
  | `gift-with-purchase` | conversion | (native build) | snippets:1 assets:1 | threshold_cents, gift_handle, unlocked_message, locked_message_suffix | (none) | create-gift-product + create-gift-discount |
@@ -43,10 +43,13 @@ Total modules: 31.
43
43
  | `recently-viewed` | pdp | (native build) | sections:1 assets:1 | eyebrow, heading, background_color | (none) | (none) |
44
44
  | `reviews` | social-proof | (native build) | sections:1 | heading | (none) | (none) |
45
45
  | `risk-reversal` | conversion | (native build) | sections:1 | icon, heading, body, link_label, link_url, background_color, text_color | (none) | (none) |
46
+ | `scrolling-ticker` | social-proof | announcement-bar / scrolling-text apps | sections:1 assets:1 | (none) | (none) | (none) |
46
47
  | `shipping-bar` | conversion | (native build) | sections:1 | threshold_cents, message_below, message_qualified, message_default, background_color, text_color | (none) | (none) |
48
+ | `social-proof-banner` | social-proof | fixed-text social-proof apps | sections:1 assets:1 | (none) | (none) | (none) |
49
+ | `stats-bar` | social-proof | app-driven stat counters | sections:1 assets:1 | (none) | (none) | (none) |
47
50
  | `sticky-atc` | conversion | Sticky Add To Cart Booster Pro and similar | sections:1 assets:1 | (none) | (none) | (none) |
48
51
  | `subscriptions` | catalog | Recharge / Bold Subscriptions / Appstle for the storefront display layer; subscription management still uses Shopify's native customer account | snippets:1 | one_time_label, subscribe_label, fineprint | (none) | install-shopify-subscriptions + create-selling-plan-group + enable-customer-account-tab |
49
- | `testimonials` | social-proof | (native build) | sections:1 | eyebrow, heading, background_color, text_color | (none) | (none) |
52
+ | `testimonials` | social-proof | app-driven review widgets at the social-proof display layer | | eyebrow, heading, background_color, text_color | grid-quotes, carousel-ugc | (none) |
50
53
  | `trust-badges` | social-proof | (native build) | sections:1 | background_color, text_color | (none) | (none) |
51
54
  | `wishlist` | customer | Wishlist Plus, Wishlist King, Globo Wishlist | sections:1 snippets:1 assets:1 templates:1 | max_items | (none) | create-wishlist-page |
52
55
 
@@ -107,9 +110,10 @@ Total modules: 31.
107
110
  ### editorial-hero
108
111
 
109
112
  - Category: storefront
110
- - What: Lushi video hero module migrated from Lushi.
111
- - Files: sections:1
112
- - Config: eyebrow, heading, subheading, video_url, poster_image, min_height, button_label_primary, button_link_primary, button_label_secondary, button_link_secondary
113
+ - Replaces: Dawn's image-banner / video-banner
114
+ - What: Editorial hero section.
115
+ - Config: eyebrow, heading, subheading
116
+ - Variants: video-bg, hero-with-card
113
117
 
114
118
  ### exit-intent
115
119
 
@@ -233,6 +237,13 @@ Total modules: 31.
233
237
  - Files: sections:1
234
238
  - Config: icon, heading, body, link_label, link_url, background_color, text_color
235
239
 
240
+ ### scrolling-ticker
241
+
242
+ - Category: social-proof
243
+ - Replaces: announcement-bar / scrolling-text apps
244
+ - What: Top-of-page horizontally-scrolling promotional ticker (free shipping, sale messaging, FOMO copy).
245
+ - Files: sections:1 assets:1
246
+
236
247
  ### shipping-bar
237
248
 
238
249
  - Category: conversion
@@ -240,6 +251,20 @@ Total modules: 31.
240
251
  - Files: sections:1
241
252
  - Config: threshold_cents, message_below, message_qualified, message_default, background_color, text_color
242
253
 
254
+ ### social-proof-banner
255
+
256
+ - Category: social-proof
257
+ - Replaces: fixed-text social-proof apps
258
+ - What: Single-line social-proof banner (e.g.
259
+ - Files: sections:1 assets:1
260
+
261
+ ### stats-bar
262
+
263
+ - Category: social-proof
264
+ - Replaces: app-driven stat counters
265
+ - What: Three-up (or N-up) stats row with big number + supporting label per block.
266
+ - Files: sections:1 assets:1
267
+
243
268
  ### sticky-atc
244
269
 
245
270
  - Category: conversion
@@ -259,9 +284,10 @@ Total modules: 31.
259
284
  ### testimonials
260
285
 
261
286
  - Category: social-proof
262
- - What: Lushi testimonials module migrated from Lushi.
263
- - Files: sections:1
287
+ - Replaces: app-driven review widgets at the social-proof display layer
288
+ - What: Customer testimonials section.
264
289
  - Config: eyebrow, heading, background_color, text_color
290
+ - Variants: grid-quotes, carousel-ugc
265
291
 
266
292
  ### trust-badges
267
293
 
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi product comparison table. Drops on PDP (or any template) to
2
+ Runwell product comparison table. Drops on PDP (or any template) to
3
3
  compare attributes across Lushi products or against a competitor.
4
4
  Editorial style, not a feature dump. Per CRO §5.2 (decision-aid for
5
5
  high-trust niches).
@@ -84,7 +84,7 @@
84
84
 
85
85
  {% schema %}
86
86
  {
87
- "name": "Lushi comparison table",
87
+ "name": "Runwell comparison table",
88
88
  "tag": "section",
89
89
  "class": "section-runwell-comparison",
90
90
  "settings": [
@@ -145,7 +145,7 @@
145
145
  "max_blocks": 4,
146
146
  "presets": [
147
147
  {
148
- "name": "Lushi comparison table",
148
+ "name": "Runwell comparison table",
149
149
  "blocks": [
150
150
  { "type": "column", "settings": { "column_title": "Lushi pick", "column_subtitle": "This product" } },
151
151
  { "type": "column", "settings": { "column_title": "Drugstore", "column_subtitle": "Average mass-market option" } },
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi delivery estimate. Renders a placeholder span filled by JS with
2
+ Runwell delivery estimate. Renders a placeholder span filled by JS with
3
3
  a date range based on cutoff time and standard transit. Native
4
4
  replacement for the Estimated Delivery Date widget in Vitals etc.
5
5
  {%- endcomment -%}
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi v2 editorial section: eyebrow + serif italic heading + lede + body.
2
+ Runwell editorial section: eyebrow + serif italic heading + lede + body.
3
3
  Used for the homepage section flow (Approach, Press, Partnering equivalents).
4
4
  {%- endcomment -%}
5
5
 
@@ -66,7 +66,7 @@
66
66
 
67
67
  {% schema %}
68
68
  {
69
- "name": "Lushi editorial block",
69
+ "name": "Runwell editorial block",
70
70
  "tag": "section",
71
71
  "class": "section-runwell-editorial",
72
72
  "settings": [
@@ -143,7 +143,7 @@
143
143
  ],
144
144
  "presets": [
145
145
  {
146
- "name": "Lushi editorial block",
146
+ "name": "Runwell editorial block",
147
147
  "blocks": [
148
148
  { "type": "card" },
149
149
  { "type": "card" },
@@ -1,61 +1,44 @@
1
1
  {
2
2
  "name": "editorial-hero",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "category": "storefront",
5
- "description": "Lushi video hero module migrated from Lushi.",
6
- "files": {
7
- "sections": [
8
- "sections/runwell-video-hero.liquid"
9
- ]
10
- },
5
+ "description": "Editorial hero section. Two variants: video-bg (default) renders a full-bleed background video with eyebrow + heading + subhead + dual CTA, ideal for Lushi-style editorial brands; hero-with-card renders a background image with a centered text card (Hero with Card pattern), ideal for product-led brands. Replaces Dawn's image-banner / video-banner.",
6
+ "default_variant": "video-bg",
11
7
  "config": {
12
8
  "schema": {
13
- "eyebrow": {
14
- "type": "string",
15
- "default": "Wellness, curated",
16
- "label": "Eyebrow text"
17
- },
18
- "heading": {
19
- "type": "string",
20
- "default": "Glow from within.",
21
- "label": "Headline"
22
- },
23
- "subheading": {
24
- "type": "string",
25
- "default": "Lushi is a modern wellness brand offering curated supplements, skincare, and rituals for everyday health.",
26
- "label": "Subheading"
27
- },
28
- "video_url": {
29
- "type": "string",
30
- "label": "Background video URL (mp4)"
31
- },
32
- "poster_image": {
33
- "type": "string",
34
- "label": "Poster image (and fallback)"
35
- },
36
- "min_height": {
37
- "type": "number",
38
- "default": 100,
39
- "label": "Hero min-height (vh)"
40
- },
41
- "button_label_primary": {
42
- "type": "string",
43
- "default": "Shop wellness",
44
- "label": "Primary button label"
45
- },
46
- "button_link_primary": {
47
- "type": "string",
48
- "label": "Primary button link"
49
- },
50
- "button_label_secondary": {
51
- "type": "string",
52
- "default": "Read the journal",
53
- "label": "Secondary button label"
54
- },
55
- "button_link_secondary": {
56
- "type": "string",
57
- "label": "Secondary button link"
9
+ "eyebrow": { "type": "string", "default": "Wellness, curated", "label": "Eyebrow text" },
10
+ "heading": { "type": "string", "default": "Glow from within.", "label": "Headline" },
11
+ "subheading": { "type": "string", "default": "Lushi is a modern wellness brand offering curated supplements, skincare, and rituals for everyday health.", "label": "Subheading" }
12
+ }
13
+ },
14
+ "variants": {
15
+ "video-bg": {
16
+ "description": "Full-bleed background video (mp4) with poster fallback, eyebrow + heading + subhead + primary/secondary CTAs. Section type: runwell-video-hero.",
17
+ "files": {
18
+ "sections": ["variants/video-bg/sections/runwell-video-hero.liquid"]
19
+ },
20
+ "config_extra": {
21
+ "video_url": { "type": "string", "label": "Background video URL (mp4)" },
22
+ "poster_image": { "type": "string", "label": "Poster image (and fallback)" },
23
+ "fallback_asset": { "type": "string", "label": "Bundled fallback asset filename (e.g. lushi-hero-bg.jpg)" },
24
+ "min_height": { "type": "number", "default": 100, "label": "Hero min-height (vh)" },
25
+ "button_label_primary": { "type": "string", "default": "Shop wellness", "label": "Primary button label" },
26
+ "button_link_primary": { "type": "string", "label": "Primary button link" },
27
+ "button_label_secondary": { "type": "string", "default": "Read the journal", "label": "Secondary button label" },
28
+ "button_link_secondary": { "type": "string", "label": "Secondary button link" }
29
+ }
30
+ },
31
+ "hero-with-card": {
32
+ "description": "Background image (image_picker) with a centered text card overlay. Single CTA. Image overlay opacity is configurable. Section type: runwell-editorial-hero. Ported from Lusha bespoke (guabrasha-store/sections/hero-with-card.liquid).",
33
+ "files": {
34
+ "sections": ["variants/hero-with-card/sections/runwell-editorial-hero.liquid"],
35
+ "assets": ["variants/hero-with-card/assets/runwell-editorial-hero.css"]
36
+ },
37
+ "config_extra": {
38
+ "overlay_opacity": { "type": "number", "default": 20, "label": "Image overlay opacity (%)" },
39
+ "button_label": { "type": "string", "default": "Shop now", "label": "Button label" },
40
+ "button_link": { "type": "string", "label": "Button link" }
58
41
  }
59
42
  }
60
43
  }
61
- }
44
+ }
@@ -0,0 +1,108 @@
1
+ .runwell-editorial-hero--card {
2
+ position: relative;
3
+ min-height: 85vh;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ overflow: hidden;
8
+ }
9
+
10
+ .runwell-editorial-hero__media {
11
+ position: absolute;
12
+ inset: 0;
13
+ z-index: 0;
14
+ }
15
+
16
+ .runwell-editorial-hero__image {
17
+ width: 100%;
18
+ height: 100%;
19
+ object-fit: cover;
20
+ }
21
+
22
+ .runwell-editorial-hero__placeholder {
23
+ width: 100%;
24
+ height: 100%;
25
+ background: #E8D5C4;
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ }
30
+
31
+ .runwell-editorial-hero__placeholder svg {
32
+ width: 60%;
33
+ max-width: 600px;
34
+ opacity: 0.3;
35
+ }
36
+
37
+ .runwell-editorial-hero__overlay {
38
+ position: absolute;
39
+ inset: 0;
40
+ background: #000;
41
+ }
42
+
43
+ .runwell-editorial-hero__content-wrapper {
44
+ position: relative;
45
+ z-index: 1;
46
+ padding: 2rem;
47
+ width: 100%;
48
+ display: flex;
49
+ justify-content: center;
50
+ }
51
+
52
+ .runwell-editorial-hero__card {
53
+ background: rgba(255, 255, 255, 0.95);
54
+ backdrop-filter: blur(12px);
55
+ border-radius: 20px;
56
+ padding: 3.6rem 4rem;
57
+ max-width: 560px;
58
+ text-align: center;
59
+ box-shadow: 0 8px 40px rgba(0, 0, 0, 0.08);
60
+ }
61
+
62
+ .runwell-editorial-hero__heading {
63
+ margin-bottom: 1.2rem;
64
+ color: #2A2622;
65
+ }
66
+
67
+ .runwell-editorial-hero__subheading {
68
+ font-size: 1.5rem;
69
+ color: #6B6259;
70
+ line-height: 1.6;
71
+ margin-bottom: 2rem;
72
+ }
73
+
74
+ .runwell-editorial-hero__button {
75
+ min-width: 200px;
76
+ font-size: 1.5rem;
77
+ padding: 1.4rem 3.2rem;
78
+ background: #2A2622;
79
+ color: #fff;
80
+ border: none;
81
+ border-radius: 8px;
82
+ font-weight: 600;
83
+ letter-spacing: 0.02em;
84
+ cursor: pointer;
85
+ text-decoration: none;
86
+ display: inline-block;
87
+ transition: background 0.2s;
88
+ }
89
+
90
+ .runwell-editorial-hero__button:hover {
91
+ background: #3F5B4C;
92
+ }
93
+
94
+ @media screen and (max-width: 749px) {
95
+ .runwell-editorial-hero--card {
96
+ min-height: 70vh;
97
+ }
98
+
99
+ .runwell-editorial-hero__card {
100
+ padding: 2.4rem 2rem;
101
+ margin: 0 1rem;
102
+ border-radius: 16px;
103
+ }
104
+
105
+ .runwell-editorial-hero__button {
106
+ width: 100%;
107
+ }
108
+ }
@@ -0,0 +1,91 @@
1
+ {{ 'runwell-editorial-hero.css' | asset_url | stylesheet_tag }}
2
+
3
+ <div class="runwell-editorial-hero runwell-editorial-hero--card color-{{ section.settings.color_scheme }}">
4
+ <div class="runwell-editorial-hero__media">
5
+ {% if section.settings.image != blank %}
6
+ {{ section.settings.image | image_url: width: 1920 | image_tag: loading: 'eager', class: 'runwell-editorial-hero__image', sizes: '100vw' }}
7
+ {% else %}
8
+ <div class="runwell-editorial-hero__placeholder">{{ 'lifestyle-1' | placeholder_svg_tag }}</div>
9
+ {% endif %}
10
+ <div class="runwell-editorial-hero__overlay" style="opacity: {{ section.settings.overlay_opacity | divided_by: 100.0 }};"></div>
11
+ </div>
12
+
13
+ <div class="runwell-editorial-hero__content-wrapper">
14
+ <div class="runwell-editorial-hero__card color-scheme-1">
15
+ {% if section.settings.heading != blank %}
16
+ <h1 class="runwell-editorial-hero__heading {{ section.settings.heading_size }}">{{ section.settings.heading }}</h1>
17
+ {% endif %}
18
+ {% if section.settings.subheading != blank %}
19
+ <p class="runwell-editorial-hero__subheading">{{ section.settings.subheading }}</p>
20
+ {% endif %}
21
+ {% if section.settings.button_label != blank %}
22
+ <a href="{{ section.settings.button_link }}" class="button runwell-editorial-hero__button">{{ section.settings.button_label }}</a>
23
+ {% endif %}
24
+ </div>
25
+ </div>
26
+ </div>
27
+
28
+ {% schema %}
29
+ {
30
+ "name": "Editorial hero (card)",
31
+ "tag": "section",
32
+ "class": "section-runwell-editorial-hero",
33
+ "settings": [
34
+ {
35
+ "type": "image_picker",
36
+ "id": "image",
37
+ "label": "Background image"
38
+ },
39
+ {
40
+ "type": "range",
41
+ "id": "overlay_opacity",
42
+ "label": "Image overlay opacity",
43
+ "min": 0, "max": 80, "step": 5, "default": 20, "unit": "%"
44
+ },
45
+ {
46
+ "type": "text",
47
+ "id": "heading",
48
+ "label": "Heading",
49
+ "default": "A Moment of Care, Every Day"
50
+ },
51
+ {
52
+ "type": "select",
53
+ "id": "heading_size",
54
+ "label": "Heading size",
55
+ "options": [
56
+ { "value": "h1", "label": "Large" },
57
+ { "value": "h0", "label": "Extra large" }
58
+ ],
59
+ "default": "h1"
60
+ },
61
+ {
62
+ "type": "text",
63
+ "id": "subheading",
64
+ "label": "Subheading",
65
+ "default": "Discover gentle sculpting tools designed for everyday comfort; a thoughtful addition to your morning ritual."
66
+ },
67
+ {
68
+ "type": "text",
69
+ "id": "button_label",
70
+ "label": "Button label",
71
+ "default": "Shop Now"
72
+ },
73
+ {
74
+ "type": "url",
75
+ "id": "button_link",
76
+ "label": "Button link"
77
+ },
78
+ {
79
+ "type": "color_scheme",
80
+ "id": "color_scheme",
81
+ "label": "Color scheme",
82
+ "default": "scheme-1"
83
+ }
84
+ ],
85
+ "presets": [
86
+ {
87
+ "name": "Editorial hero (card)"
88
+ }
89
+ ]
90
+ }
91
+ {% endschema %}
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi v2 video hero. Full-bleed background video with editorial copy
2
+ Runwell video hero. Full-bleed background video with editorial copy
3
3
  bottom-left. Mirrors the v1 lushi.co Hero pattern but pivots messaging
4
4
  to general health and wellness.
5
5
  {%- endcomment -%}
@@ -76,7 +76,7 @@
76
76
 
77
77
  {% schema %}
78
78
  {
79
- "name": "Lushi video hero",
79
+ "name": "Runwell video hero",
80
80
  "tag": "section",
81
81
  "class": "section-runwell-video-hero",
82
82
  "settings": [
@@ -150,7 +150,7 @@
150
150
  ],
151
151
  "presets": [
152
152
  {
153
- "name": "Lushi video hero"
153
+ "name": "Runwell video hero"
154
154
  }
155
155
  ]
156
156
  }
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi exit-intent newsletter popup. Native replacement for Privy /
2
+ Runwell exit-intent newsletter popup. Native replacement for Privy /
3
3
  Justuno / Uno popups. Triggers on mouseleave at top of viewport
4
4
  (desktop) or after 30 seconds (mobile fallback). Suppresses with a
5
5
  localStorage cookie for 30 days after dismiss or sign-up.
@@ -33,7 +33,7 @@
33
33
 
34
34
  {% schema %}
35
35
  {
36
- "name": "Lushi exit popup",
36
+ "name": "Runwell exit popup",
37
37
  "tag": "section",
38
38
  "class": "section-runwell-exit",
39
39
  "settings": [
@@ -42,7 +42,7 @@
42
42
  { "type": "textarea", "id": "lede", "label": "Lede", "default": "Join the journal and get the founder's take on what we picked, why we picked it, and which products to skip altogether." }
43
43
  ],
44
44
  "presets": [
45
- { "name": "Lushi exit popup" }
45
+ { "name": "Runwell exit popup" }
46
46
  ]
47
47
  }
48
48
  {% endschema %}
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi FAQ accordion. Native replacement for FAQ widgets in Vitals,
2
+ Runwell FAQ accordion. Native replacement for FAQ widgets in Vitals,
3
3
  HelpCenter, etc. Uses native HTML <details> elements so it works
4
4
  without any JS.
5
5
  {%- endcomment -%}
@@ -30,7 +30,7 @@
30
30
 
31
31
  {% schema %}
32
32
  {
33
- "name": "Lushi FAQ",
33
+ "name": "Runwell FAQ",
34
34
  "tag": "section",
35
35
  "class": "section-runwell-faq",
36
36
  "settings": [
@@ -52,12 +52,12 @@
52
52
  "max_blocks": 12,
53
53
  "presets": [
54
54
  {
55
- "name": "Lushi FAQ",
55
+ "name": "Runwell FAQ",
56
56
  "blocks": [
57
- { "type": "qa", "settings": { "question": "Are these supplements third-party tested?", "answer": "<p>Every product we list ships with a published Certificate of Analysis from the supplier. We confirm the lot numbers match what the bottle claims before any product gets a page on Lushi.</p>" } },
57
+ { "type": "qa", "settings": { "question": "Are these supplements third-party tested?", "answer": "<p>Every product we list ships with a published Certificate of Analysis from the supplier. We confirm the lot numbers match what the bottle claims before any product gets a page on the site.</p>" } },
58
58
  { "type": "qa", "settings": { "question": "How fast do orders ship?", "answer": "<p>Most orders leave the warehouse within one to two business days. Free standard shipping on US orders over $75; flat $7 below. International rates calculated at checkout.</p>" } },
59
59
  { "type": "qa", "settings": { "question": "What is the return policy?", "answer": "<p>If a product does not earn a place on your counter, write to us within 30 days for a full refund. We do not make returns hard.</p>" } },
60
- { "type": "qa", "settings": { "question": "Do these products treat or cure conditions?", "answer": "<p>No. Statements about supplements and skincare on Lushi have not been evaluated by the FDA and are not intended to diagnose, treat, cure, or prevent any disease. Consult your physician before starting any new regimen.</p>" } },
60
+ { "type": "qa", "settings": { "question": "Do these products treat or cure conditions?", "answer": "<p>No. Statements about supplements and skincare on this site have not been evaluated by the FDA and are not intended to diagnose, treat, cure, or prevent any disease. Consult your physician before starting any new regimen.</p>" } },
61
61
  { "type": "qa", "settings": { "question": "How does the journal work?", "answer": "<p>Every product is paired with a journal post explaining how it works, who it is for, and what the research actually says. Editorial, not advertorial.</p>" } }
62
62
  ]
63
63
  }
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi "How it works" section. Side-image left + content right (or
2
+ Runwell "How it works" section. Side-image left + content right (or
3
3
  reversible). Eyebrow + headline + lede + 3 numbered service cards.
4
4
  Mirrors v1 .conciergeSection / "Nationwide Access to Concierge Care"
5
5
  but pivoted to wellness curation flow.
@@ -60,11 +60,11 @@
60
60
 
61
61
  {% schema %}
62
62
  {
63
- "name": "Lushi how it works",
63
+ "name": "Runwell how it works",
64
64
  "tag": "section",
65
65
  "class": "section-runwell-how",
66
66
  "settings": [
67
- { "type": "text", "id": "eyebrow", "label": "Eyebrow", "default": "How Lushi works" },
67
+ { "type": "text", "id": "eyebrow", "label": "Eyebrow", "default": "How it works" },
68
68
  { "type": "text", "id": "heading", "label": "Heading", "default": "Curated, written, shipped." },
69
69
  { "type": "textarea", "id": "lede", "label": "Lede", "default": "Three simple steps from the brands we trust to your counter. No filler in between." },
70
70
  { "type": "image_picker", "id": "image", "label": "Side image (uploaded)" },
@@ -87,9 +87,9 @@
87
87
  "max_blocks": 4,
88
88
  "presets": [
89
89
  {
90
- "name": "Lushi how it works",
90
+ "name": "Runwell how it works",
91
91
  "blocks": [
92
- { "type": "step", "settings": { "title": "We curate.", "body": "Every product on Lushi is hand-picked from small wellness brands and clears our four-check standards before it gets a page." } },
92
+ { "type": "step", "settings": { "title": "We curate.", "body": "Every product is hand-picked and clears our standards before it gets a page." } },
93
93
  { "type": "step", "settings": { "title": "We write.", "body": "Each product pairs with a journal post: how it works, who it's for, and what the research actually says. Editorial, not advertorial." } },
94
94
  { "type": "step", "settings": { "title": "We ship.", "body": "Suppliers ship direct from their facility. Free shipping over $75; 30-day no-hassle returns." } }
95
95
  ]
@@ -1,5 +1,5 @@
1
1
  {%- comment -%}
2
- Lushi inventory urgency. Shows "Only N left" near ATC when stock is
2
+ Runwell inventory urgency. Shows "Only N left" near ATC when stock is
3
3
  low. Replaces the urgency widget from Vitals / similar apps.
4
4
  Threshold and display are conservative: only fires when inventory is
5
5
  tracked AND visible on the PDP product object.
@@ -1,11 +1,12 @@
1
1
  {%- comment -%}
2
- Lushi ingredient grid. Drops below a PDP description (or anywhere) and
2
+ Runwell ingredient grid. Drops below a PDP description (or anywhere) and
3
3
  spotlights 3 to 6 hero ingredients with name, role, and dose. Reads
4
- product.metafields.lushi.ingredients (list.metaobject) when set, with
4
+ product.metafields.<namespace>.ingredients (list.metaobject, default namespace runwell) when set, with
5
5
  manual blocks as the fallback.
6
6
  {%- endcomment -%}
7
7
 
8
- {%- assign ingredients_meta = product.metafields.lushi.ingredients.value -%}
8
+ {%- assign ns = section.settings.metafield_namespace | default: 'runwell' -%}
9
+ {%- assign ingredients_meta = product.metafields[ns].ingredients.value -%}
9
10
 
10
11
  <section
11
12
  class="runwell-ingredients"
@@ -74,7 +75,7 @@
74
75
 
75
76
  {% schema %}
76
77
  {
77
- "name": "Lushi ingredients",
78
+ "name": "Runwell ingredients",
78
79
  "tag": "section",
79
80
  "class": "section-runwell-ingredients",
80
81
  "settings": [
@@ -84,6 +85,13 @@
84
85
  "label": "Eyebrow",
85
86
  "default": "What's inside"
86
87
  },
88
+ {
89
+ "type": "text",
90
+ "id": "metafield_namespace",
91
+ "label": "Ingredients metafield namespace",
92
+ "default": "runwell",
93
+ "info": "Reads product.metafields.<namespace>.ingredients (list.metaobject)."
94
+ },
87
95
  {
88
96
  "type": "text",
89
97
  "id": "heading",
@@ -110,7 +118,7 @@
110
118
  },
111
119
  {
112
120
  "type": "paragraph",
113
- "content": "If product.metafields.lushi.ingredients is set, those are used and the blocks below are ignored."
121
+ "content": "If product.metafields.<namespace>.ingredients is set, those are used and the blocks below are ignored."
114
122
  }
115
123
  ],
116
124
  "blocks": [
@@ -127,7 +135,7 @@
127
135
  "max_blocks": 8,
128
136
  "presets": [
129
137
  {
130
- "name": "Lushi ingredients",
138
+ "name": "Runwell ingredients",
131
139
  "blocks": [
132
140
  { "type": "ingredient", "settings": { "name": "Magnesium glycinate", "dose": "200mg", "role": "The most bioavailable form of magnesium. Supports sleep onset and muscle recovery." } },
133
141
  { "type": "ingredient", "settings": { "name": "L-theanine", "dose": "100mg", "role": "Amino acid from green tea. Calms without sedating; pairs well with magnesium." } },