@runwell/shopify-toolkit 0.17.4 → 0.21.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 (51) hide show
  1. package/bin/runwell-shopify +14 -2
  2. package/lib/list.js +133 -0
  3. package/lib/qa-bundles.js +117 -0
  4. package/lib/qa.js +147 -13
  5. package/modules/INDEX.md +65 -23
  6. package/modules/_shared/css-tokens/assets/runwell-tokens.css +24 -4
  7. package/modules/_shared/css-tokens/module.json +2 -2
  8. package/modules/_shared/css-typography/assets/runwell-typography.css +14 -6
  9. package/modules/_shared/css-typography/module.json +2 -2
  10. package/modules/bundle-builder/README.md +6 -1
  11. package/modules/bundle-builder/module.json +5 -1
  12. package/modules/care-coaching-medvi/README.md +46 -0
  13. package/modules/care-coaching-medvi/assets/runwell-care-coaching-medvi.css +241 -0
  14. package/modules/care-coaching-medvi/module.json +80 -0
  15. package/modules/care-coaching-medvi/sections/runwell-care-coaching-medvi.liquid +274 -0
  16. package/modules/care-coaching-medvi/snippets/runwell-care-coaching-medvi-circular-text.liquid +25 -0
  17. package/modules/cart-cross-sell/snippets/runwell-cart-xsell.liquid +16 -0
  18. package/modules/collection-block-medvi/README.md +50 -0
  19. package/modules/collection-block-medvi/assets/runwell-collection-block-medvi.css +242 -0
  20. package/modules/collection-block-medvi/module.json +83 -0
  21. package/modules/collection-block-medvi/sections/runwell-collection-block-medvi.liquid +355 -0
  22. package/modules/product-trio-medvi/README.md +35 -0
  23. package/modules/product-trio-medvi/assets/runwell-product-trio-medvi.css +119 -0
  24. package/modules/product-trio-medvi/module.json +48 -0
  25. package/modules/product-trio-medvi/sections/runwell-product-trio-medvi.liquid +188 -0
  26. package/modules/runwell-bundle-system/README.md +35 -0
  27. package/modules/runwell-bundle-system/admin-metafields.json +46 -0
  28. package/modules/runwell-bundle-system/assets/runwell-bundle-system.css +861 -0
  29. package/modules/runwell-bundle-system/assets/runwell-bundle-system.js +287 -0
  30. package/modules/runwell-bundle-system/module.json +126 -0
  31. package/modules/runwell-bundle-system/qa/mobile-checklist.md +105 -0
  32. package/modules/runwell-bundle-system/sections/runwell-bundle-cart-xsell.liquid +59 -0
  33. package/modules/runwell-bundle-system/sections/runwell-bundle-collection.liquid +121 -0
  34. package/modules/runwell-bundle-system/sections/runwell-bundle-home-stacks.liquid +77 -0
  35. package/modules/runwell-bundle-system/sections/runwell-bundle-pdp-banner.liquid +50 -0
  36. package/modules/runwell-bundle-system/sections/runwell-bundle-pdp-pairs-with.liquid +72 -0
  37. package/modules/runwell-bundle-system/sections/runwell-bundle-pdp.liquid +105 -0
  38. package/modules/runwell-bundle-system/settings.json +25 -0
  39. package/modules/runwell-bundle-system/snippets/runwell-bundle-card.liquid +70 -0
  40. package/modules/runwell-bundle-system/snippets/runwell-bundle-cross-supplier.liquid +18 -0
  41. package/modules/runwell-bundle-system/snippets/runwell-bundle-data.liquid +67 -0
  42. package/modules/runwell-bundle-system/snippets/runwell-bundle-fomo.liquid +32 -0
  43. package/modules/runwell-bundle-system/snippets/runwell-bundle-free-gift.liquid +34 -0
  44. package/modules/runwell-bundle-system/snippets/runwell-bundle-multi-product.liquid +86 -0
  45. package/modules/runwell-bundle-system/snippets/runwell-bundle-pricing.liquid +30 -0
  46. package/modules/runwell-bundle-system/snippets/runwell-bundle-quantity-tiers.liquid +73 -0
  47. package/modules/testimonials-medvi/README.md +44 -0
  48. package/modules/testimonials-medvi/assets/runwell-testimonials-medvi.css +239 -0
  49. package/modules/testimonials-medvi/module.json +68 -0
  50. package/modules/testimonials-medvi/sections/runwell-testimonials-medvi.liquid +355 -0
  51. package/package.json +2 -2
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "collection-block-medvi",
3
+ "version": "0.1.4",
4
+ "category": "storefront",
5
+ "source": "medvi",
6
+ "base": "collection-block",
7
+ "qualifier": null,
8
+ "description": "Duplex category section: product hero card on one side; eyebrow + split-color headline + benefits checklist + 2 lifestyle photos + CTA on the other. Sides flip per instance.",
9
+ "replaces": null,
10
+ "files": {
11
+ "sections": [
12
+ "sections/runwell-collection-block-medvi.liquid"
13
+ ],
14
+ "snippets": [],
15
+ "assets": [
16
+ "assets/runwell-collection-block-medvi.css"
17
+ ]
18
+ },
19
+ "config": {
20
+ "schema": {
21
+ "eyebrow": {
22
+ "type": "string",
23
+ "default": "PURPOSE-DRIVEN SUPPLEMENTATION",
24
+ "label": "Eyebrow (small caps tracked)"
25
+ },
26
+ "headline_pre": {
27
+ "type": "string",
28
+ "default": "Supplements with the",
29
+ "label": "Headline (first half)"
30
+ },
31
+ "headline_post": {
32
+ "type": "string",
33
+ "default": "power to boost real results",
34
+ "label": "Headline (accent half)"
35
+ },
36
+ "headline_accent_color": {
37
+ "type": "string",
38
+ "default": "{{brand.primary}}",
39
+ "label": "Accent color for headline_post"
40
+ },
41
+ "show_product_card": {
42
+ "type": "boolean",
43
+ "default": true,
44
+ "label": "Show product hero card"
45
+ },
46
+ "product_card_bg": {
47
+ "type": "string",
48
+ "default": "{{brand.celadon}}",
49
+ "label": "Product card background tint"
50
+ },
51
+ "benefits_heading": {
52
+ "type": "string",
53
+ "default": "What better support looks like",
54
+ "label": "Benefits heading"
55
+ },
56
+ "subhead": {
57
+ "type": "string",
58
+ "default": "Support that helps you feel better over time",
59
+ "label": "Sub-headline"
60
+ },
61
+ "cta_label": {
62
+ "type": "string",
63
+ "default": "Shop the collection",
64
+ "label": "CTA button label"
65
+ },
66
+ "layout": {
67
+ "type": "string",
68
+ "default": "image-left",
69
+ "label": "Layout: image-left or image-right"
70
+ },
71
+ "bg_band": {
72
+ "type": "string",
73
+ "default": "white",
74
+ "label": "Background band: white, oat, celadon-tint"
75
+ }
76
+ }
77
+ },
78
+ "lineage": {
79
+ "extracted_from": "https://home.medvi.org/",
80
+ "scrape_path": "_clients/capital-v/lushi/research/medvi-reference/site-scrape/",
81
+ "framer_label": "Cards & Copy"
82
+ }
83
+ }
@@ -0,0 +1,355 @@
1
+ {%- comment -%}
2
+ Runwell collection-block-medvi.
3
+
4
+ Duplex category section adapted from medvi.org. One side: product hero
5
+ card on a tinted background, with a benefits checklist below. Other side:
6
+ eyebrow + split-color headline + 2 lifestyle photos + sub + body + CTA.
7
+ Sides flip per instance via the `layout` setting.
8
+
9
+ Lineage: extracted from home.medvi.org (Framer label "Cards & Copy"),
10
+ generalised to Runwell brand tokens. See module README for details.
11
+ {%- endcomment -%}
12
+
13
+ {{ 'runwell-collection-block-medvi.css' | asset_url | stylesheet_tag }}
14
+
15
+ {%- liquid
16
+ assign layout = section.settings.layout | default: 'image-left'
17
+ assign bg_band = section.settings.bg_band | default: 'white'
18
+ assign accent_color = section.settings.headline_accent_color | default: 'var(--runwell-primary)'
19
+ assign product_card_bg = section.settings.product_card_bg | default: 'var(--runwell-celadon)'
20
+ -%}
21
+
22
+ <section
23
+ class="runwell-collection-block-medvi runwell-collection-block-medvi--{{ layout }} runwell-collection-block-medvi--bg-{{ bg_band }}"
24
+ >
25
+ <div class="runwell-collection-block-medvi__inner">
26
+
27
+ <div class="runwell-collection-block-medvi__product-side">
28
+ {%- if section.settings.show_product_card -%}
29
+ <div
30
+ class="runwell-collection-block-medvi__product-card"
31
+ style="background: {{ product_card_bg }};"
32
+ >
33
+ {%- if section.settings.product_image != blank -%}
34
+ <img
35
+ src="{{ section.settings.product_image | image_url: width: 800 }}"
36
+ alt="{{ section.settings.product_image.alt | default: section.settings.headline_pre | escape }}"
37
+ width="{{ section.settings.product_image.width }}"
38
+ height="{{ section.settings.product_image.height }}"
39
+ loading="lazy"
40
+ class="runwell-collection-block-medvi__product-image"
41
+ >
42
+ {%- elsif section.settings.product_image_asset != blank -%}
43
+ <img
44
+ src="{{ section.settings.product_image_asset | asset_url }}"
45
+ alt="{{ section.settings.headline_pre | escape }}"
46
+ width="800"
47
+ height="600"
48
+ loading="lazy"
49
+ class="runwell-collection-block-medvi__product-image"
50
+ >
51
+ {%- endif -%}
52
+ </div>
53
+ {%- endif -%}
54
+
55
+ {%- assign benefits_blocks = section.blocks | where: 'type', 'benefit' -%}
56
+ {%- if benefits_blocks.size > 0 -%}
57
+ <div class="runwell-collection-block-medvi__benefits">
58
+ {%- if section.settings.benefits_heading != blank -%}
59
+ <p class="runwell-collection-block-medvi__benefits-heading">
60
+ {{ section.settings.benefits_heading }}
61
+ </p>
62
+ {%- endif -%}
63
+ <ul class="runwell-collection-block-medvi__benefits-list">
64
+ {%- for block in benefits_blocks -%}
65
+ <li class="runwell-collection-block-medvi__benefit" {{ block.shopify_attributes }}>
66
+ <span class="runwell-collection-block-medvi__check" aria-hidden="true">
67
+ <svg viewBox="0 0 24 24" width="14" height="14" fill="none">
68
+ <path d="M5 12.5l4.5 4.5L19 7" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
69
+ </svg>
70
+ </span>
71
+ <span class="runwell-collection-block-medvi__benefit-text">{{ block.settings.text }}</span>
72
+ </li>
73
+ {%- endfor -%}
74
+ </ul>
75
+ </div>
76
+ {%- endif -%}
77
+ </div>
78
+
79
+ <div class="runwell-collection-block-medvi__copy-side">
80
+ {%- if section.settings.eyebrow != blank -%}
81
+ <p class="runwell-collection-block-medvi__eyebrow">{{ section.settings.eyebrow }}</p>
82
+ {%- endif -%}
83
+
84
+ {%- liquid
85
+ assign h_pre = section.settings.headline_pre
86
+ assign h_mid = section.settings.headline_mid
87
+ assign h_post = section.settings.headline_post
88
+ assign has_mid = false
89
+ if h_mid != blank
90
+ assign has_mid = true
91
+ endif
92
+ -%}
93
+ {%- if h_pre != blank or h_mid != blank or h_post != blank -%}
94
+ <h2 class="runwell-collection-block-medvi__headline">
95
+ {%- if h_pre != blank -%}
96
+ <span class="runwell-collection-block-medvi__headline-part runwell-collection-block-medvi__headline-pre">{{ h_pre }}</span>
97
+ {%- if h_mid != blank or h_post != blank -%}{{ ' ' }}{%- endif -%}
98
+ {%- endif -%}
99
+ {%- if has_mid -%}
100
+ <span class="runwell-collection-block-medvi__headline-part runwell-collection-block-medvi__headline-accent" style="color: {{ accent_color }};">{{ h_mid }}</span>
101
+ {%- if h_post != blank -%}{{ ' ' }}<span class="runwell-collection-block-medvi__headline-part runwell-collection-block-medvi__headline-post">{{ h_post }}</span>{%- endif -%}
102
+ {%- elsif h_post != blank -%}
103
+ <span class="runwell-collection-block-medvi__headline-part runwell-collection-block-medvi__headline-accent" style="color: {{ accent_color }};">{{ h_post }}</span>
104
+ {%- endif -%}
105
+ </h2>
106
+ {%- endif -%}
107
+
108
+ <div class="runwell-collection-block-medvi__photos">
109
+ {%- if section.settings.lifestyle_image_1 != blank -%}
110
+ <figure class="runwell-collection-block-medvi__photo">
111
+ <img
112
+ src="{{ section.settings.lifestyle_image_1 | image_url: width: 800 }}"
113
+ alt="{{ section.settings.lifestyle_image_1.alt | default: '' | escape }}"
114
+ width="{{ section.settings.lifestyle_image_1.width }}"
115
+ height="{{ section.settings.lifestyle_image_1.height }}"
116
+ loading="lazy"
117
+ >
118
+ </figure>
119
+ {%- elsif section.settings.lifestyle_image_1_asset != blank -%}
120
+ <figure class="runwell-collection-block-medvi__photo">
121
+ <img
122
+ src="{{ section.settings.lifestyle_image_1_asset | asset_url }}"
123
+ alt=""
124
+ width="800"
125
+ height="1000"
126
+ loading="lazy"
127
+ >
128
+ </figure>
129
+ {%- endif -%}
130
+ {%- if section.settings.lifestyle_image_2 != blank -%}
131
+ <figure class="runwell-collection-block-medvi__photo">
132
+ <img
133
+ src="{{ section.settings.lifestyle_image_2 | image_url: width: 800 }}"
134
+ alt="{{ section.settings.lifestyle_image_2.alt | default: '' | escape }}"
135
+ width="{{ section.settings.lifestyle_image_2.width }}"
136
+ height="{{ section.settings.lifestyle_image_2.height }}"
137
+ loading="lazy"
138
+ >
139
+ </figure>
140
+ {%- elsif section.settings.lifestyle_image_2_asset != blank -%}
141
+ <figure class="runwell-collection-block-medvi__photo">
142
+ <img
143
+ src="{{ section.settings.lifestyle_image_2_asset | asset_url }}"
144
+ alt=""
145
+ width="800"
146
+ height="1000"
147
+ loading="lazy"
148
+ >
149
+ </figure>
150
+ {%- endif -%}
151
+ </div>
152
+
153
+ {%- if section.settings.subhead != blank -%}
154
+ <p class="runwell-collection-block-medvi__subhead">{{ section.settings.subhead }}</p>
155
+ {%- endif -%}
156
+
157
+ {%- if section.settings.body != blank -%}
158
+ <div class="runwell-collection-block-medvi__body">{{ section.settings.body }}</div>
159
+ {%- endif -%}
160
+
161
+ {%- if section.settings.cta_label != blank -%}
162
+ <a
163
+ href="{{ section.settings.cta_link | default: '#' }}"
164
+ class="runwell-collection-block-medvi__cta"
165
+ >
166
+ {{ section.settings.cta_label }}
167
+ </a>
168
+ {%- endif -%}
169
+ </div>
170
+
171
+ </div>
172
+ </section>
173
+
174
+ {% schema %}
175
+ {
176
+ "name": "Collection block (medvi)",
177
+ "tag": "section",
178
+ "class": "section-runwell-collection-block-medvi",
179
+ "settings": [
180
+ {
181
+ "type": "header",
182
+ "content": "Headline"
183
+ },
184
+ {
185
+ "type": "text",
186
+ "id": "eyebrow",
187
+ "label": "Eyebrow (tracked small caps)",
188
+ "default": "PURPOSE-DRIVEN SUPPLEMENTATION"
189
+ },
190
+ {
191
+ "type": "text",
192
+ "id": "headline_pre",
193
+ "label": "Headline (first part, plain)",
194
+ "default": "Supplements with the"
195
+ },
196
+ {
197
+ "type": "text",
198
+ "id": "headline_mid",
199
+ "label": "Headline (middle part, accent)",
200
+ "info": "Optional. When set, this is the accent-colored part and `headline_post` renders plain after it. Leave blank for a 2-part split (pre + post-accent)."
201
+ },
202
+ {
203
+ "type": "text",
204
+ "id": "headline_post",
205
+ "label": "Headline (third part)",
206
+ "info": "Plain when middle is set; accent when middle is blank.",
207
+ "default": "real results"
208
+ },
209
+ {
210
+ "type": "color",
211
+ "id": "headline_accent_color",
212
+ "label": "Headline accent color",
213
+ "default": "#0B3D38"
214
+ },
215
+ {
216
+ "type": "header",
217
+ "content": "Product hero card"
218
+ },
219
+ {
220
+ "type": "checkbox",
221
+ "id": "show_product_card",
222
+ "label": "Show product hero card",
223
+ "default": true
224
+ },
225
+ {
226
+ "type": "image_picker",
227
+ "id": "product_image",
228
+ "label": "Product image (uploaded)",
229
+ "info": "PNG with transparent background recommended. Falls through to bundled asset filename below."
230
+ },
231
+ {
232
+ "type": "text",
233
+ "id": "product_image_asset",
234
+ "label": "Product image (bundled asset filename)",
235
+ "info": "e.g. runwell-jar-hero.png"
236
+ },
237
+ {
238
+ "type": "color",
239
+ "id": "product_card_bg",
240
+ "label": "Product card background",
241
+ "default": "#ADDDBD"
242
+ },
243
+ {
244
+ "type": "text",
245
+ "id": "benefits_heading",
246
+ "label": "Benefits heading",
247
+ "default": "What better support looks like"
248
+ },
249
+ {
250
+ "type": "header",
251
+ "content": "Lifestyle photos"
252
+ },
253
+ {
254
+ "type": "image_picker",
255
+ "id": "lifestyle_image_1",
256
+ "label": "Lifestyle photo 1",
257
+ "info": "3:4 portrait crop recommended. Falls through to bundled asset filename below."
258
+ },
259
+ {
260
+ "type": "text",
261
+ "id": "lifestyle_image_1_asset",
262
+ "label": "Lifestyle photo 1 (asset filename fallback)"
263
+ },
264
+ {
265
+ "type": "image_picker",
266
+ "id": "lifestyle_image_2",
267
+ "label": "Lifestyle photo 2"
268
+ },
269
+ {
270
+ "type": "text",
271
+ "id": "lifestyle_image_2_asset",
272
+ "label": "Lifestyle photo 2 (asset filename fallback)"
273
+ },
274
+ {
275
+ "type": "header",
276
+ "content": "Body copy"
277
+ },
278
+ {
279
+ "type": "text",
280
+ "id": "subhead",
281
+ "label": "Sub-headline",
282
+ "default": "Support that helps you feel better over time"
283
+ },
284
+ {
285
+ "type": "richtext",
286
+ "id": "body",
287
+ "label": "Body",
288
+ "default": "<p>Doctor-designed formulas made with quality ingredients and evidence-based dosing to support your body day after day.</p>"
289
+ },
290
+ {
291
+ "type": "text",
292
+ "id": "cta_label",
293
+ "label": "CTA label",
294
+ "default": "Shop the collection"
295
+ },
296
+ {
297
+ "type": "url",
298
+ "id": "cta_link",
299
+ "label": "CTA link"
300
+ },
301
+ {
302
+ "type": "header",
303
+ "content": "Layout"
304
+ },
305
+ {
306
+ "type": "select",
307
+ "id": "layout",
308
+ "label": "Layout",
309
+ "options": [
310
+ { "value": "image-left", "label": "Product side on left" },
311
+ { "value": "image-right", "label": "Product side on right" }
312
+ ],
313
+ "default": "image-left"
314
+ },
315
+ {
316
+ "type": "select",
317
+ "id": "bg_band",
318
+ "label": "Background band",
319
+ "options": [
320
+ { "value": "white", "label": "White" },
321
+ { "value": "oat", "label": "Oat" },
322
+ { "value": "celadon-tint", "label": "Celadon tint" }
323
+ ],
324
+ "default": "white"
325
+ }
326
+ ],
327
+ "blocks": [
328
+ {
329
+ "type": "benefit",
330
+ "name": "Benefit",
331
+ "limit": 5,
332
+ "settings": [
333
+ {
334
+ "type": "text",
335
+ "id": "text",
336
+ "label": "Benefit text",
337
+ "default": "Clean, transparent ingredients"
338
+ }
339
+ ]
340
+ }
341
+ ],
342
+ "presets": [
343
+ {
344
+ "name": "Runwell collection-block-medvi",
345
+ "blocks": [
346
+ { "type": "benefit", "settings": { "text": "Clean, transparent ingredients" } },
347
+ { "type": "benefit", "settings": { "text": "Built to support daily health" } },
348
+ { "type": "benefit", "settings": { "text": "Evidence-based dosing" } },
349
+ { "type": "benefit", "settings": { "text": "Doctor-formulated blends" } },
350
+ { "type": "benefit", "settings": { "text": "High-quality sourcing" } }
351
+ ]
352
+ }
353
+ ]
354
+ }
355
+ {% endschema %}
@@ -0,0 +1,35 @@
1
+ # product-trio-medvi
2
+
3
+ 3-product fan-layout showcase with a single soft-corner copy panel beside. Hero anchor for a product line. Reveals the actual product lineup that a `collection-block-medvi` introduces.
4
+
5
+ Category: `branding`
6
+
7
+ ## Files
8
+
9
+ - `sections/runwell-product-trio-medvi.liquid`
10
+ - `assets/runwell-product-trio-medvi.css`
11
+
12
+ ## Layout
13
+
14
+ Three products arranged in a fan: center product foregrounded (z-index above, slightly larger, vertically anchored at bottom), left and right products partially behind it. The composition is asymmetric on purpose; medvi's reference shot has the center product offset.
15
+
16
+ The copy panel sits beside the products holding a single short headline (no body, no CTA). That's intentional: this component reveals products and anchors them with a one-line promise. Ad copy or extended CTA belong in adjacent components (`collection-block-medvi`, `editorial-block`, etc.).
17
+
18
+ ## Tokens consumed
19
+
20
+ Brand: `--runwell-oat`, `--runwell-tertiary`, `--runwell-celadon`. Design system: `--runwell-radius-xl`. Typography: `--runwell-h3-size`.
21
+
22
+ ## Tenant overrides
23
+
24
+ - Brand-block (`runwell.config.json`) flips global tokens. Panel background follows `--runwell-oat` by default.
25
+ - Per-instance (Theme Editor): 6 image fields (3 products with uploaded image plus bundled-asset fallback for each), panel headline, panel background color, layout (products-left vs products-right), bg band.
26
+
27
+ ## Lineage
28
+
29
+ Extracted from `https://home.medvi.org/` on 2026-05-06. Framer label: `3 Cards / Pill Image Group`. Scrape path: `_clients/capital-v/lushi/research/medvi-reference/site-scrape/`. The medvi reference shot uses 3 supplement jars (Colonix+ / BrainBloom / Colonix+) with a soft-cream panel saying "Doctor-formulated blends designed to support how your body works best."
30
+
31
+ ## Notes
32
+
33
+ - Recommended product images are PNG with transparent background so the products float on top of the section's bg band. Document this in tenant onboarding.
34
+ - Mobile: products row keeps horizontal arrangement but shrinks; panel stacks below.
35
+ - This module pairs naturally with `collection-block-medvi`. Typical sequence: `collection-block-medvi` (introduces the category with benefits + lifestyle) then `product-trio-medvi` (reveals the products) then onward.
@@ -0,0 +1,119 @@
1
+ /* Runwell product-trio-medvi.
2
+
3
+ 3-product fan layout with center product foregrounded. Single
4
+ soft-corner copy panel beside.
5
+
6
+ Tokens: --runwell-oat, --runwell-tertiary, --runwell-radius-xl,
7
+ --runwell-h3-size.
8
+ Mobile-first: products row stays horizontal but shrinks; panel
9
+ stacks below at <768px.
10
+ */
11
+
12
+ .runwell-product-trio-medvi {
13
+ padding: clamp(3rem, 8vw, 7rem) clamp(1.5rem, 4vw, 4rem);
14
+ font-family: var(--font-body-family, inherit);
15
+ color: var(--runwell-tertiary, #0B3D38);
16
+ }
17
+
18
+ .runwell-product-trio-medvi--bg-white {
19
+ background: #ffffff;
20
+ }
21
+
22
+ .runwell-product-trio-medvi--bg-oat {
23
+ background: var(--runwell-oat, #F5F0EE);
24
+ }
25
+
26
+ .runwell-product-trio-medvi--bg-celadon-tint {
27
+ background: color-mix(in srgb, var(--runwell-celadon, #ADDDBD) 18%, white);
28
+ }
29
+
30
+ .runwell-product-trio-medvi__inner {
31
+ display: grid;
32
+ grid-template-columns: 1fr;
33
+ gap: clamp(2rem, 4vw, 4rem);
34
+ max-width: 1280px;
35
+ margin: 0 auto;
36
+ align-items: center;
37
+ }
38
+
39
+ @media (min-width: 768px) {
40
+ .runwell-product-trio-medvi__inner {
41
+ grid-template-columns: 1.2fr 1fr;
42
+ }
43
+
44
+ .runwell-product-trio-medvi--products-right .runwell-product-trio-medvi__inner {
45
+ direction: rtl;
46
+ }
47
+
48
+ .runwell-product-trio-medvi--products-right .runwell-product-trio-medvi__inner > * {
49
+ direction: ltr;
50
+ }
51
+ }
52
+
53
+ /* ----- Products fan ----- */
54
+
55
+ .runwell-product-trio-medvi__products {
56
+ position: relative;
57
+ display: flex;
58
+ align-items: flex-end;
59
+ justify-content: center;
60
+ gap: clamp(0.25rem, 1vw, 0.75rem);
61
+ min-height: clamp(280px, 35vw, 480px);
62
+ }
63
+
64
+ .runwell-product-trio-medvi__product {
65
+ position: relative;
66
+ display: flex;
67
+ align-items: flex-end;
68
+ justify-content: center;
69
+ }
70
+
71
+ .runwell-product-trio-medvi__product img {
72
+ display: block;
73
+ width: 100%;
74
+ height: auto;
75
+ object-fit: contain;
76
+ }
77
+
78
+ .runwell-product-trio-medvi__product--left,
79
+ .runwell-product-trio-medvi__product--right {
80
+ flex: 0 1 28%;
81
+ max-width: 220px;
82
+ z-index: 1;
83
+ }
84
+
85
+ .runwell-product-trio-medvi__product--left {
86
+ margin-right: -3%;
87
+ transform: translateY(8%);
88
+ }
89
+
90
+ .runwell-product-trio-medvi__product--right {
91
+ margin-left: -3%;
92
+ transform: translateY(8%);
93
+ }
94
+
95
+ .runwell-product-trio-medvi__product--center {
96
+ flex: 0 1 36%;
97
+ max-width: 320px;
98
+ z-index: 2;
99
+ }
100
+
101
+ /* ----- Copy panel ----- */
102
+
103
+ .runwell-product-trio-medvi__panel {
104
+ border-radius: var(--runwell-radius-xl, 32px);
105
+ padding: clamp(2rem, 4vw, 3.5rem);
106
+ display: flex;
107
+ align-items: center;
108
+ min-height: clamp(180px, 20vw, 280px);
109
+ }
110
+
111
+ .runwell-product-trio-medvi__panel-heading {
112
+ font-family: var(--font-heading-family, inherit);
113
+ font-size: var(--runwell-h3-size, clamp(2rem, 3vw, 2.8rem));
114
+ font-weight: 600;
115
+ line-height: 1.25;
116
+ margin: 0;
117
+ text-align: center;
118
+ width: 100%;
119
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "product-trio-medvi",
3
+ "version": "0.1.0",
4
+ "category": "branding",
5
+ "source": "medvi",
6
+ "base": "product-trio",
7
+ "qualifier": null,
8
+ "description": "3-product showcase, fan layout with center product foregrounded, soft-corner copy panel beside. Hero anchor for a product line.",
9
+ "replaces": null,
10
+ "files": {
11
+ "sections": [
12
+ "sections/runwell-product-trio-medvi.liquid"
13
+ ],
14
+ "snippets": [],
15
+ "assets": [
16
+ "assets/runwell-product-trio-medvi.css"
17
+ ]
18
+ },
19
+ "config": {
20
+ "schema": {
21
+ "panel_heading": {
22
+ "type": "string",
23
+ "default": "Doctor-formulated blends designed to support how your body works best.",
24
+ "label": "Panel headline"
25
+ },
26
+ "panel_bg": {
27
+ "type": "string",
28
+ "default": "{{brand.oat}}",
29
+ "label": "Panel background tint"
30
+ },
31
+ "layout": {
32
+ "type": "string",
33
+ "default": "products-left",
34
+ "label": "Layout: products-left or products-right"
35
+ },
36
+ "bg_band": {
37
+ "type": "string",
38
+ "default": "white",
39
+ "label": "Background band: white, oat, celadon-tint"
40
+ }
41
+ }
42
+ },
43
+ "lineage": {
44
+ "extracted_from": "https://home.medvi.org/",
45
+ "scrape_path": "_clients/capital-v/lushi/research/medvi-reference/site-scrape/",
46
+ "framer_label": "3 Cards / Pill Image Group"
47
+ }
48
+ }