@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
package/modules/INDEX.md CHANGED
@@ -3,46 +3,51 @@
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: 34.
6
+ Total modules: 39.
7
7
 
8
8
  ## By category
9
9
 
10
- - **catalog**: bundle-builder, quantity-breaks, subscriptions
10
+ - **branding**: care-coaching-medvi, product-trio-medvi
11
+ - **catalog**: bundle-builder, quantity-breaks, runwell-bundle-system, subscriptions
11
12
  - **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
13
  - **customer**: loyalty-tiers, wishlist
13
14
  - **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, scrolling-ticker, social-proof-banner, stats-bar, testimonials, trust-badges
15
- - **storefront**: editorial-block, editorial-hero, faq, how-it-works
15
+ - **social-proof**: press-bar, product-badges, reviews, scrolling-ticker, social-proof-banner, stats-bar, testimonials, testimonials-medvi, trust-badges
16
+ - **storefront**: collection-block-medvi, editorial-block, editorial-hero, faq, how-it-works
16
17
 
17
18
  ## Modules
18
19
 
19
20
  | Name | Category | Replaces | Files | Config keys | Variants | Admin steps |
20
21
  |---|---|---|---|---|---|---|
21
- | `bundle-builder` | catalog | BYOB-style bundle apps | sections:1 assets:1 | heading, sale_prefix, show_rating, rating_score, rating_count, show_trust_badges, trust_1, trust_2, trust_3, fomo_mode, fomo_cycle_days, fomo_stock_count | (none) | (none) |
22
+ | `bundle-builder` | catalog | (native build) | sections:1 assets:1 | heading, sale_prefix, show_rating, rating_score, rating_count, show_trust_badges, trust_1, trust_2, trust_3, fomo_mode, fomo_cycle_days, fomo_stock_count | (none) | (none) |
23
+ | `care-coaching-medvi` | branding | (native build) | sections:1 snippets:1 assets:1 | section_eyebrow, headline_pre, headline_post, headline_accent_color, block_heading, circular_text, circular_text_position, footer_link_label, layout, bg_band | (none) | (none) |
22
24
  | `cart-cross-sell` | conversion | Rebuy / OneClickUpsell pre-purchase upsell | snippets:1 | eyebrow, cta_label | (none) | (none) |
23
25
  | `cart-freeship-progress` | conversion | Bold Free Shipping Manager and similar app features | snippets:1 | threshold_cents, away_text, unlocked_message | (none) | (none) |
24
26
  | `cart-usps` | conversion | (native build) | snippets:1 | icon, usp_1, usp_2, usp_3 | (none) | (none) |
27
+ | `collection-block-medvi` | storefront | (native build) | sections:1 assets:1 | eyebrow, headline_pre, headline_post, headline_accent_color, show_product_card, product_card_bg, benefits_heading, subhead, cta_label, layout, bg_band | (none) | (none) |
25
28
  | `comparison-table` | pdp | app-driven comparison widgets | | eyebrow, heading, lede, background_color, text_color | feature-columns, feature-rows | (none) |
26
29
  | `delivery-estimate` | pdp | (native build) | snippets:1 | (none) | (none) | (none) |
27
- | `editorial-block` | storefront | (native build) | sections:1 | eyebrow, heading, lede, background_color, text_color | (none) | (none) |
30
+ | `editorial-block` | storefront | (native build) | sections:1 assets:1 | eyebrow, heading, lede, background_color, text_color | (none) | (none) |
28
31
  | `editorial-hero` | storefront | Dawn's image-banner / video-banner | | eyebrow, heading, subheading | video-bg, hero-with-card | (none) |
29
- | `exit-intent` | conversion | Privy / Justuno display layer | sections:1 assets:1 | eyebrow, heading, lede | (none) | (none) |
30
- | `faq` | storefront | (native build) | sections:1 | eyebrow, heading, background_color, text_color | (none) | (none) |
32
+ | `exit-intent` | conversion | Privy / Justuno display layer | sections:1 assets:2 | eyebrow, heading, lede | (none) | (none) |
33
+ | `faq` | storefront | (native build) | sections:1 assets:1 | eyebrow, heading, background_color, text_color | (none) | (none) |
31
34
  | `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 |
32
- | `how-it-works` | storefront | (native build) | sections:1 | eyebrow, heading, lede, image, asset_filename, background_color, text_color, cta_label, cta_link | (none) | (none) |
35
+ | `how-it-works` | storefront | (native build) | sections:1 assets:1 | eyebrow, heading, lede, image, asset_filename, background_color, text_color, cta_label, cta_link | (none) | (none) |
33
36
  | `inventory-urgency` | pdp | (native build) | snippets:1 | (none) | (none) | (none) |
34
- | `loyalty-tiers` | customer | (native build) | sections:1 | tier_0_name, tier_1_name, tier_1_threshold, tier_1_perk_pct, tier_2_name, tier_2_threshold, tier_2_perk_pct | (none) | create-tier-tags-and-flows + create-tier-discounts + add-tier-card-to-account |
37
+ | `loyalty-tiers` | customer | (native build) | sections:1 assets:1 | tier_0_name, tier_1_name, tier_1_threshold, tier_1_perk_pct, tier_2_name, tier_2_threshold, tier_2_perk_pct | (none) | create-tier-tags-and-flows + create-tier-discounts + add-tier-card-to-account |
35
38
  | `pdp-ingredients` | pdp | (native build) | sections:1 | eyebrow, heading, lede, background_color, text_color | (none) | (none) |
36
39
  | `pdp-journal-link` | pdp | (native build) | sections:1 | eyebrow, article, background_color, text_color, fallback_title, fallback_body, fallback_link_label, fallback_link_url | (none) | (none) |
37
40
  | `pdp-trust-checks` | pdp | (native build) | sections:1 | eyebrow, heading, lede, background_color, text_color, link_label, link_url | (none) | (none) |
38
41
  | `post-purchase-upsell` | conversion | Reconvert / OneClickUpsell / AfterSell display layer | assets:2 | discount_code, discount_label, max_items, heading, eyebrow, lede, cross_category_logic | (none) | create-discount + paste-bootstrap |
39
42
  | `press-bar` | social-proof | (native build) | sections:1 | eyebrow, background_color, text_color | (none) | (none) |
40
43
  | `product-badges` | social-proof | (native build) | snippets:1 | label_best_seller, label_new, label_editor_pick | (none) | (none) |
44
+ | `product-trio-medvi` | branding | (native build) | sections:1 assets:1 | panel_heading, panel_bg, layout, bg_band | (none) | (none) |
41
45
  | `quantity-breaks` | catalog | (native build) | snippets:1 | eyebrow, fineprint | (none) | define-breaks-metafield + set-product-breaks + create-discount-function |
42
46
  | `quick-view` | conversion | (native build) | snippets:2 assets:1 | (none) | (none) | (none) |
43
- | `recently-viewed` | pdp | (native build) | sections:1 assets:1 | eyebrow, heading, background_color | (none) | (none) |
44
- | `reviews` | social-proof | (native build) | sections:1 | heading | (none) | (none) |
47
+ | `recently-viewed` | pdp | (native build) | sections:1 assets:2 | eyebrow, heading, background_color | (none) | (none) |
48
+ | `reviews` | social-proof | (native build) | sections:1 assets:1 | heading | (none) | (none) |
45
49
  | `risk-reversal` | conversion | (native build) | sections:1 | icon, heading, body, link_label, link_url, background_color, text_color | (none) | (none) |
50
+ | `runwell-bundle-system` | catalog | the legacy bundle-builder module | sections:6 snippets:8 assets:2 | surface_1_collection_page_enabled, surface_2_pdp_pairs_with_enabled, surface_3_home_stacks_enabled, surface_4_cart_drawer_xsell_enabled, surface_5_pdp_banner_enabled, surface_6_collection_filter_enabled, surface_2_eyebrow, surface_2_heading, surface_3_eyebrow, surface_3_heading, surface_4_eyebrow, surface_4_cta, surface_5_copy_template, cross_supplier_disclosure, home_strip_position | (none) | install-shopify-bundles + define-bundle-metafields + create-bundle-index-metaobject + create-first-bundle-product + configure-quantity-tier-discount-function + configure-free-gift-discount + create-bundles-collection-page-template + add-home-stacks-section + add-pdp-pairs-with-section + add-pdp-banner-section + verify-cart-drawer-coordination + rebuild-bundle-index |
46
51
  | `scrolling-ticker` | social-proof | announcement-bar / scrolling-text apps | sections:1 assets:1 | (none) | (none) | (none) |
47
52
  | `shipping-bar` | conversion | (native build) | sections:1 | threshold_cents, message_below, message_qualified, message_default, background_color, text_color | (none) | (none) |
48
53
  | `social-proof-banner` | social-proof | fixed-text social-proof apps | sections:1 assets:1 | (none) | (none) | (none) |
@@ -50,19 +55,26 @@ Total modules: 34.
50
55
  | `sticky-atc` | conversion | Sticky Add To Cart Booster Pro and similar | sections:1 assets:1 | (none) | (none) | (none) |
51
56
  | `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 |
52
57
  | `testimonials` | social-proof | app-driven review widgets at the social-proof display layer | | eyebrow, heading, background_color, text_color | grid-quotes, carousel-ugc | (none) |
58
+ | `testimonials-medvi` | social-proof | (native build) | sections:1 assets:1 | section_eyebrow, headline_pre, headline_post, headline_accent_color, lede, card_bg, star_color, bg_band | (none) | (none) |
53
59
  | `trust-badges` | social-proof | (native build) | sections:1 | background_color, text_color | (none) | (none) |
54
- | `wishlist` | customer | Wishlist Plus, Wishlist King, Globo Wishlist | sections:1 snippets:1 assets:1 templates:1 | max_items | (none) | create-wishlist-page |
60
+ | `wishlist` | customer | Wishlist Plus, Wishlist King, Globo Wishlist | sections:1 snippets:1 assets:2 templates:1 | max_items | (none) | create-wishlist-page |
55
61
 
56
62
  ## Descriptions
57
63
 
58
64
  ### bundle-builder
59
65
 
60
66
  - Category: catalog
61
- - Replaces: BYOB-style bundle apps
62
- - What: Build-your-own-bundle PDP section.
67
+ - What: DEPRECATED 2026-05-10 in favor of runwell-bundle-system (Mode A).
63
68
  - Files: sections:1 assets:1
64
69
  - Config: heading, sale_prefix, show_rating, rating_score, rating_count, show_trust_badges, trust_1, trust_2, trust_3, fomo_mode, fomo_cycle_days, fomo_stock_count
65
70
 
71
+ ### care-coaching-medvi
72
+
73
+ - Category: branding
74
+ - What: Brand-promise section: portrait card + circular rotating text mark + 2-color headline + body + footer CTA line.
75
+ - Files: sections:1 snippets:1 assets:1
76
+ - Config: section_eyebrow, headline_pre, headline_post, headline_accent_color, block_heading, circular_text, circular_text_position, footer_link_label, layout, bg_band
77
+
66
78
  ### cart-cross-sell
67
79
 
68
80
  - Category: conversion
@@ -86,6 +98,13 @@ Total modules: 34.
86
98
  - Files: snippets:1
87
99
  - Config: icon, usp_1, usp_2, usp_3
88
100
 
101
+ ### collection-block-medvi
102
+
103
+ - Category: storefront
104
+ - What: Duplex category section: product hero card on one side; eyebrow + split-color headline + benefits checklist + 2 lifestyle photos + CTA on the other.
105
+ - Files: sections:1 assets:1
106
+ - Config: eyebrow, headline_pre, headline_post, headline_accent_color, show_product_card, product_card_bg, benefits_heading, subhead, cta_label, layout, bg_band
107
+
89
108
  ### comparison-table
90
109
 
91
110
  - Category: pdp
@@ -104,7 +123,7 @@ Total modules: 34.
104
123
 
105
124
  - Category: storefront
106
125
  - What: Editorial introduction block: eyebrow + serif italic heading + lede + body.
107
- - Files: sections:1
126
+ - Files: sections:1 assets:1
108
127
  - Config: eyebrow, heading, lede, background_color, text_color
109
128
 
110
129
  ### editorial-hero
@@ -120,14 +139,14 @@ Total modules: 34.
120
139
  - Category: conversion
121
140
  - Replaces: Privy / Justuno display layer
122
141
  - What: Exit-intent popup with email capture.
123
- - Files: sections:1 assets:1
142
+ - Files: sections:1 assets:2
124
143
  - Config: eyebrow, heading, lede
125
144
 
126
145
  ### faq
127
146
 
128
147
  - Category: storefront
129
148
  - What: FAQ accordion.
130
- - Files: sections:1
149
+ - Files: sections:1 assets:1
131
150
  - Config: eyebrow, heading, background_color, text_color
132
151
 
133
152
  ### gift-with-purchase
@@ -142,7 +161,7 @@ Total modules: 34.
142
161
 
143
162
  - Category: storefront
144
163
  - What: How-it-works section: side-image + multi-step explainer.
145
- - Files: sections:1
164
+ - Files: sections:1 assets:1
146
165
  - Config: eyebrow, heading, lede, image, asset_filename, background_color, text_color, cta_label, cta_link
147
166
 
148
167
  ### inventory-urgency
@@ -155,7 +174,7 @@ Total modules: 34.
155
174
 
156
175
  - Category: customer
157
176
  - What: Lifetime-spend tier card on the customer account page.
158
- - Files: sections:1
177
+ - Files: sections:1 assets:1
159
178
  - Config: tier_0_name, tier_1_name, tier_1_threshold, tier_1_perk_pct, tier_2_name, tier_2_threshold, tier_2_perk_pct
160
179
  - Admin steps: create-tier-tags-and-flows + create-tier-discounts + add-tier-card-to-account
161
180
 
@@ -203,6 +222,13 @@ Total modules: 34.
203
222
  - Files: snippets:1
204
223
  - Config: label_best_seller, label_new, label_editor_pick
205
224
 
225
+ ### product-trio-medvi
226
+
227
+ - Category: branding
228
+ - What: 3-product showcase, fan layout with center product foregrounded, soft-corner copy panel beside.
229
+ - Files: sections:1 assets:1
230
+ - Config: panel_heading, panel_bg, layout, bg_band
231
+
206
232
  ### quantity-breaks
207
233
 
208
234
  - Category: catalog
@@ -221,14 +247,14 @@ Total modules: 34.
221
247
 
222
248
  - Category: pdp
223
249
  - What: recently viewed.
224
- - Files: sections:1 assets:1
250
+ - Files: sections:1 assets:2
225
251
  - Config: eyebrow, heading, background_color
226
252
 
227
253
  ### reviews
228
254
 
229
255
  - Category: social-proof
230
256
  - What: PDP reviews.
231
- - Files: sections:1
257
+ - Files: sections:1 assets:1
232
258
  - Config: heading
233
259
 
234
260
  ### risk-reversal
@@ -238,6 +264,15 @@ Total modules: 34.
238
264
  - Files: sections:1
239
265
  - Config: icon, heading, body, link_label, link_url, background_color, text_color
240
266
 
267
+ ### runwell-bundle-system
268
+
269
+ - Category: catalog
270
+ - Replaces: the legacy bundle-builder module
271
+ - What: Configurable bundles engine.
272
+ - Files: sections:6 snippets:8 assets:2
273
+ - Config: surface_1_collection_page_enabled, surface_2_pdp_pairs_with_enabled, surface_3_home_stacks_enabled, surface_4_cart_drawer_xsell_enabled, surface_5_pdp_banner_enabled, surface_6_collection_filter_enabled, surface_2_eyebrow, surface_2_heading, surface_3_eyebrow, surface_3_heading, surface_4_eyebrow, surface_4_cta, surface_5_copy_template, cross_supplier_disclosure, home_strip_position
274
+ - Admin steps: install-shopify-bundles + define-bundle-metafields + create-bundle-index-metaobject + create-first-bundle-product + configure-quantity-tier-discount-function + configure-free-gift-discount + create-bundles-collection-page-template + add-home-stacks-section + add-pdp-pairs-with-section + add-pdp-banner-section + verify-cart-drawer-coordination + rebuild-bundle-index
275
+
241
276
  ### scrolling-ticker
242
277
 
243
278
  - Category: social-proof
@@ -290,6 +325,13 @@ Total modules: 34.
290
325
  - Config: eyebrow, heading, background_color, text_color
291
326
  - Variants: grid-quotes, carousel-ugc
292
327
 
328
+ ### testimonials-medvi
329
+
330
+ - Category: social-proof
331
+ - What: Two horizontal marquee rows of testimonial cards.
332
+ - Files: sections:1 assets:1
333
+ - Config: section_eyebrow, headline_pre, headline_post, headline_accent_color, lede, card_bg, star_color, bg_band
334
+
293
335
  ### trust-badges
294
336
 
295
337
  - Category: social-proof
@@ -302,7 +344,7 @@ Total modules: 34.
302
344
  - Category: customer
303
345
  - Replaces: Wishlist Plus, Wishlist King, Globo Wishlist
304
346
  - What: Native wishlist using localStorage.
305
- - Files: sections:1 snippets:1 assets:1 templates:1
347
+ - Files: sections:1 snippets:1 assets:2 templates:1
306
348
  - Config: max_items
307
349
  - Admin steps: create-wishlist-page
308
350
 
@@ -1,7 +1,10 @@
1
- /* Runwell Shopify Toolkit: brand tokens.
2
- Generated from runwell.config.json brand vars. Every other module
3
- references these via var(--runwell-X). Do not hand-edit in client
4
- themes; re-run runwell-shopify sync to update.
1
+ /* Runwell Shopify Toolkit: brand and design tokens.
2
+
3
+ Section 1 (brand): generated from runwell.config.json brand vars.
4
+ Re-run runwell-shopify sync to update.
5
+
6
+ Section 2 (design system): toolkit-wide constants. Tenants override
7
+ in their own tenant-brand.css if they need a different scale.
5
8
 
6
9
  --runwell-tertiary is the canonical brand-tertiary token; the
7
10
  --runwell-rain-forrest alias is preserved for one minor cycle of
@@ -10,6 +13,7 @@
10
13
  brand.tertiary in runwell.config.json.
11
14
  */
12
15
  :root {
16
+ /* Brand colors (interpolated from runwell.config.json) */
13
17
  --runwell-primary: {{brand.primary}};
14
18
  --runwell-accent: {{brand.accent}};
15
19
  --runwell-cream: {{brand.cream}};
@@ -18,4 +22,20 @@
18
22
  --runwell-blue: {{brand.blue}};
19
23
  --runwell-tertiary: {{brand.tertiary}};
20
24
  --runwell-rain-forrest: {{brand.tertiary}};
25
+
26
+ /* Design system: semantic surfaces.
27
+ Components reference these so the theme controls the default look.
28
+ Tenants override in tenant-brand.css to retarget any brand color. */
29
+ --runwell-surface-card: var(--runwell-oat);
30
+ --runwell-surface-card-alt: color-mix(in srgb, var(--runwell-celadon) 18%, white);
31
+
32
+ /* Design system: corner radii */
33
+ --runwell-radius-sm: 4px;
34
+ --runwell-radius-md: 12px;
35
+ --runwell-radius-lg: 20px;
36
+ --runwell-radius-xl: 32px;
37
+
38
+ /* Design system: elevation */
39
+ --runwell-shadow-card: 0 2px 8px rgba(0, 0, 0, 0.04);
40
+ --runwell-shadow-elevated: 0 8px 24px rgba(0, 0, 0, 0.06);
21
41
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "_shared/css-tokens",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "category": "foundation",
5
- "description": "CSS custom properties published as :root vars so every Runwell module pulls brand colors from one source. Always synced.",
5
+ "description": "CSS custom properties published as :root vars. Brand colors interpolated from runwell.config.json. Design system tokens (radii, shadows) hardcoded as toolkit-wide constants. Always synced.",
6
6
  "always_enabled": true,
7
7
  "files": {
8
8
  "assets": ["assets/runwell-tokens.css"]
@@ -4,6 +4,11 @@
4
4
  sliders in layout/theme.liquid) so every toolkit module renders type
5
5
  that scales uniformly when a merchant adjusts the sliders.
6
6
 
7
+ Sizes are Dawn-aligned. Dawn sets html font-size to
8
+ calc(var(--font-body-scale) * 62.5%), so 1rem equals 10px when body
9
+ scale is 1.0. Our tokens land in the readability range Dawn uses for
10
+ its own headings and captions (1.2rem to 1.8rem).
11
+
7
12
  Modules reference these via var(--runwell-X-size). Tenant CSS may also
8
13
  reference them directly OR compose its own scale-aware sizes using
9
14
  calc(var(--font-body-scale) * Xrem) and calc(var(--font-heading-scale) * Xrem).
@@ -11,13 +16,16 @@
11
16
  Do not hand-edit in client themes; re-run runwell-shopify sync to update.
12
17
  */
13
18
  :root {
14
- /* Body-scale derived. Eyebrows, captions, ledes, body, CTAs. */
15
- --runwell-eyebrow-size: calc(var(--font-body-scale) * 0.78rem);
16
- --runwell-caption-size: calc(var(--font-body-scale) * 0.85rem);
17
- --runwell-meta-size: calc(var(--font-body-scale) * 0.92rem);
18
- --runwell-cta-size: calc(var(--font-body-scale) * 1.15rem);
19
+ /* Body-scale derived. Eyebrows, captions, meta, body, ledes, CTAs.
20
+ Dawn-aligned: smallest readable text at 1.2rem (12px), Dawn body at
21
+ 1.5rem (15px), our body slightly larger at 1.6rem (16px) for
22
+ component readability inside cards and sections. */
23
+ --runwell-eyebrow-size: calc(var(--font-body-scale) * 1.2rem);
24
+ --runwell-caption-size: calc(var(--font-body-scale) * 1.3rem);
25
+ --runwell-meta-size: calc(var(--font-body-scale) * 1.4rem);
26
+ --runwell-cta-size: calc(var(--font-body-scale) * 1.5rem);
19
27
  --runwell-body-size: calc(var(--font-body-scale) * 1.6rem);
20
- --runwell-lede-size: calc(var(--font-body-scale) * 1.7rem);
28
+ --runwell-lede-size: calc(var(--font-body-scale) * 1.8rem);
21
29
 
22
30
  /* Heading-scale derived. Section titles, big numbers, hero/aura titles. */
23
31
  --runwell-h4-size: calc(var(--font-heading-scale) * 1.7rem);
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "_shared/css-typography",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "category": "foundation",
5
- "description": "Typography tokens published as :root vars. Every Runwell module references these instead of hardcoding rem values, so type scale responds to Dawn's body_scale and heading_scale Theme Editor sliders. Always synced.",
5
+ "description": "Typography tokens published as :root vars. Every Runwell module references these instead of hardcoding rem values, so type scale responds to Dawn's body_scale and heading_scale Theme Editor sliders. Sizes are Dawn-aligned (eyebrow 1.2rem, body 1.6rem, etc.). Always synced.",
6
6
  "always_enabled": true,
7
7
  "files": {
8
8
  "assets": ["assets/runwell-typography.css"]
@@ -1,4 +1,9 @@
1
- # bundle-builder
1
+ # bundle-builder (deprecated)
2
+
3
+ > **Deprecated since toolkit 0.21.0.** Use `runwell-bundle-system` (Mode A: quantity tiers) instead.
4
+ > This module continues to function for tenants pinned to it; removal target version is 0.22.0.
5
+ >
6
+ > **Migration path:** set `modules.bundle-builder.enabled` to false in `runwell.config.json`, enable `runwell-bundle-system`, and set `bundle_mode: "quantity_tiers"` on the bundle product via the `runwell.bundle_mode` metafield. See `_clients/capital-v/lushi/specs/bundle-system/phase-plan.md` v1.1 for the full Lusha cutover plan.
2
7
 
3
8
  PDP section for build-your-own-bundle merchandising. Slideshow gallery + thumbnail nav + radio bundle picker (1x / 2x / 3x with savings, free-ship and free-gift badges) + sticky ATC + FOMO countdown + scarcity. Migrated from Lusha's bundle-selector.
4
9
 
@@ -2,7 +2,11 @@
2
2
  "name": "bundle-builder",
3
3
  "version": "0.1.0",
4
4
  "category": "catalog",
5
- "description": "Build-your-own-bundle PDP section. Slideshow gallery + thumbnail nav + radio bundle picker (1x / 2x / 3x with savings, free-ship and free-gift badges) + sticky ATC + FOMO countdown + scarcity. Migrated from Lusha (guabrasha-store/sections/bundle-selector.liquid). Replaces BYOB-style bundle apps.",
5
+ "deprecated": true,
6
+ "deprecated_in_favor_of": "runwell-bundle-system",
7
+ "deprecated_since": "0.21.0",
8
+ "removal_target_version": "0.22.0",
9
+ "description": "DEPRECATED 2026-05-10 in favor of runwell-bundle-system (Mode A). Build-your-own-bundle PDP section. Slideshow gallery + thumbnail nav + radio bundle picker (1x / 2x / 3x with savings, free-ship and free-gift badges) + sticky ATC + FOMO countdown + scarcity. Lusha migration to runwell-bundle-system Mode A happens in v1.1; module removed at toolkit 0.22.0.",
6
10
  "files": {
7
11
  "sections": ["sections/runwell-bundle-builder.liquid"],
8
12
  "assets": ["assets/runwell-bundle-builder.css"]
@@ -0,0 +1,46 @@
1
+ # care-coaching-medvi
2
+
3
+ Brand-promise section. Centered eyebrow + 2-color headline at top; large portrait card on one side; block (heading + body) on the other; circular rotating text mark anchored to a corner of the section; footer eyebrow + link below.
4
+
5
+ Category: `branding`
6
+
7
+ The distinguishing visual is the **circular rotating text mark** ("WITH YOU FROM START TO SUCCESS" in medvi's reference), rendered as inline SVG `textPath` along a closed circle, slowly rotating via CSS animation. Respects `prefers-reduced-motion`.
8
+
9
+ ## Files
10
+
11
+ - `sections/runwell-care-coaching-medvi.liquid`
12
+ - `snippets/runwell-care-coaching-medvi-circular-text.liquid` (SVG textPath generator, isolated for reuse)
13
+ - `assets/runwell-care-coaching-medvi.css`
14
+
15
+ ## Layout
16
+
17
+ - Section eyebrow (centered, tracked uppercase) + 2-color split headline span across the top, full width.
18
+ - Inner grid: portrait card on one side (4:5), block (eyebrow + heading + body) on the other.
19
+ - Circular text mark anchored to a corner of the section (`top-right` default, `top-left` / `bottom-right` / `bottom-left` available).
20
+ - Footer line: small eyebrow plus link, centered below the inner.
21
+
22
+ ## Tokens consumed
23
+
24
+ Brand: `--runwell-primary`, `--runwell-tertiary`, `--runwell-oat`, `--runwell-blue`. Design system: `--runwell-radius-xl`. Typography: `--runwell-eyebrow-size`, `--runwell-h2-size`, `--runwell-h3-size`, `--runwell-body-size`, `--runwell-meta-size`.
25
+
26
+ ## Lineage
27
+
28
+ Extracted from `https://home.medvi.org/` on 2026-05-06. Framer label: `Care Coaching`. Scrape path: `_clients/capital-v/lushi/research/medvi-reference/site-scrape/`.
29
+
30
+ The medvi reference shot:
31
+ - Eyebrow: `BETTER IS POSSIBLE, AND WE BUILT FOR IT.`
32
+ - Headline: `Modern healthcare,` (black) `built around you` (green accent), centered.
33
+ - Portrait: woman in beige sweater on warm-grey background.
34
+ - Circular mark: `WITH YOU FROM START TO SUCCESS` in soft tan, top-right of inner card.
35
+
36
+ ## Tenant overrides
37
+
38
+ - `runwell.config.json` brand block: rewires the global tokens.
39
+ - Per-instance Theme Editor: section eyebrow, headline split, accent color, portrait + card tint, block heading/eyebrow/body, circular text content + color + corner position, footer eyebrow + link, layout (portrait-left vs portrait-right), bg band.
40
+
41
+ ## Notes
42
+
43
+ - Circular mark animation: 30s per full turn, linear, infinite. Stops on `prefers-reduced-motion: reduce`.
44
+ - The SVG `textPath` snippet uses `id_suffix: section.id` to avoid id collisions when the section is dropped multiple times on the same page.
45
+ - Mobile: stacks portrait above block. Circular mark scales smaller and pulls in to corners.
46
+ - Block has its own oat-tinted background by default to lift it visually from the white section bg, mirroring medvi's reference. Override via `portrait_card_bg`-style additions if a different background is needed.
@@ -0,0 +1,241 @@
1
+ /* Runwell care-coaching-medvi.
2
+
3
+ Brand-promise section. Centered eyebrow + 2-color headline at top;
4
+ large portrait card on one side; block (heading + body) on the
5
+ other; circular rotating text mark in a corner; footer line below.
6
+
7
+ Tokens: --runwell-tertiary, --runwell-oat, --runwell-radius-xl.
8
+ Typography: --runwell-eyebrow-size, --runwell-h2-size, --runwell-h3-size,
9
+ --runwell-body-size, --runwell-meta-size.
10
+ */
11
+
12
+ .runwell-care-coaching-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
+ position: relative;
17
+ }
18
+
19
+ .runwell-care-coaching-medvi--bg-white {
20
+ background: #ffffff;
21
+ }
22
+
23
+ .runwell-care-coaching-medvi--bg-oat {
24
+ background: var(--runwell-oat, #F5F0EE);
25
+ }
26
+
27
+ .runwell-care-coaching-medvi--bg-celadon-tint {
28
+ background: color-mix(in srgb, var(--runwell-celadon, #ADDDBD) 18%, white);
29
+ }
30
+
31
+ .runwell-care-coaching-medvi__section-eyebrow {
32
+ font-size: var(--runwell-eyebrow-size, 0.78rem);
33
+ letter-spacing: 0.16em;
34
+ text-transform: uppercase;
35
+ font-weight: 600;
36
+ margin: 0 0 1rem;
37
+ text-align: center;
38
+ opacity: 0.85;
39
+ }
40
+
41
+ .runwell-care-coaching-medvi__headline {
42
+ font-family: var(--font-heading-family, inherit);
43
+ font-size: var(--runwell-h2-size, clamp(3rem, 5vw, 4.8rem));
44
+ font-weight: 700;
45
+ line-height: 1.1;
46
+ margin: 0 0 clamp(2rem, 5vw, 4rem);
47
+ text-align: center;
48
+ letter-spacing: -0.01em;
49
+ max-width: 18ch;
50
+ margin-left: auto;
51
+ margin-right: auto;
52
+ }
53
+
54
+ .runwell-care-coaching-medvi__headline-pre,
55
+ .runwell-care-coaching-medvi__headline-post {
56
+ display: block;
57
+ }
58
+
59
+ .runwell-care-coaching-medvi__inner {
60
+ position: relative;
61
+ display: grid;
62
+ grid-template-columns: 1fr;
63
+ gap: clamp(1.5rem, 3vw, 2.5rem);
64
+ max-width: 1200px;
65
+ margin: 0 auto;
66
+ align-items: stretch;
67
+ }
68
+
69
+ @media (min-width: 768px) {
70
+ .runwell-care-coaching-medvi__inner {
71
+ grid-template-columns: 1fr 1fr;
72
+ }
73
+
74
+ .runwell-care-coaching-medvi--portrait-right .runwell-care-coaching-medvi__inner {
75
+ direction: rtl;
76
+ }
77
+
78
+ .runwell-care-coaching-medvi--portrait-right .runwell-care-coaching-medvi__inner > * {
79
+ direction: ltr;
80
+ }
81
+ }
82
+
83
+ .runwell-care-coaching-medvi__portrait-card {
84
+ border-radius: var(--runwell-radius-xl, 32px);
85
+ overflow: hidden;
86
+ aspect-ratio: 4 / 5;
87
+ }
88
+
89
+ .runwell-care-coaching-medvi__portrait-card img {
90
+ display: block;
91
+ width: 100%;
92
+ height: 100%;
93
+ object-fit: cover;
94
+ }
95
+
96
+ .runwell-care-coaching-medvi__block {
97
+ display: flex;
98
+ flex-direction: column;
99
+ justify-content: center;
100
+ gap: clamp(0.75rem, 2vw, 1.25rem);
101
+ padding: clamp(1.5rem, 4vw, 3rem) clamp(0.5rem, 2vw, 2rem);
102
+ }
103
+
104
+ .runwell-care-coaching-medvi__block--bg-transparent {
105
+ background: transparent;
106
+ padding-left: clamp(1rem, 2vw, 2rem);
107
+ padding-right: clamp(1rem, 2vw, 2rem);
108
+ }
109
+
110
+ /* Theme-driven default: tenant's design system decides the surface color
111
+ via --runwell-surface-card. Falls back to oat if the token is missing. */
112
+ .runwell-care-coaching-medvi__block--bg-card {
113
+ background: var(--runwell-surface-card, var(--runwell-oat, #F5F0EE));
114
+ border-radius: var(--runwell-radius-xl, 32px);
115
+ }
116
+
117
+ /* Explicit named overrides for tenants who want a specific brand color
118
+ regardless of the theme's surface-card token. */
119
+ .runwell-care-coaching-medvi__block--bg-oat-card {
120
+ background: var(--runwell-oat, #F5F0EE);
121
+ border-radius: var(--runwell-radius-xl, 32px);
122
+ }
123
+
124
+ .runwell-care-coaching-medvi__block--bg-celadon-card {
125
+ background: color-mix(in srgb, var(--runwell-celadon, #ADDDBD) 18%, white);
126
+ border-radius: var(--runwell-radius-xl, 32px);
127
+ }
128
+
129
+ .runwell-care-coaching-medvi__block-eyebrow {
130
+ font-size: var(--runwell-eyebrow-size, 0.78rem);
131
+ letter-spacing: 0.12em;
132
+ text-transform: uppercase;
133
+ font-weight: 600;
134
+ margin: 0;
135
+ opacity: 0.7;
136
+ }
137
+
138
+ .runwell-care-coaching-medvi__block-heading {
139
+ font-family: var(--font-heading-family, inherit);
140
+ font-size: var(--runwell-h3-size, clamp(2rem, 3vw, 2.8rem));
141
+ font-weight: 700;
142
+ line-height: 1.2;
143
+ margin: 0;
144
+ }
145
+
146
+ .runwell-care-coaching-medvi__block-body {
147
+ font-size: var(--runwell-body-size, 1.6rem);
148
+ line-height: 1.6;
149
+ opacity: 0.85;
150
+ }
151
+
152
+ .runwell-care-coaching-medvi__block-body p {
153
+ margin: 0 0 0.5em;
154
+ }
155
+
156
+ .runwell-care-coaching-medvi__block-body p:last-child {
157
+ margin-bottom: 0;
158
+ }
159
+
160
+ /* ----- Circular rotating text mark ----- */
161
+
162
+ .runwell-care-coaching-medvi__circular {
163
+ position: absolute;
164
+ width: clamp(110px, 14vw, 200px);
165
+ height: clamp(110px, 14vw, 200px);
166
+ z-index: 3;
167
+ pointer-events: none;
168
+ }
169
+
170
+ .runwell-care-coaching-medvi__circular--top-right { top: -8%; right: -4%; }
171
+ .runwell-care-coaching-medvi__circular--top-left { top: -8%; left: -4%; }
172
+ .runwell-care-coaching-medvi__circular--bottom-right { bottom: -8%; right: -4%; }
173
+ .runwell-care-coaching-medvi__circular--bottom-left { bottom: -8%; left: -4%; }
174
+
175
+ @media (max-width: 767px) {
176
+ .runwell-care-coaching-medvi__circular {
177
+ width: clamp(80px, 22vw, 130px);
178
+ height: clamp(80px, 22vw, 130px);
179
+ }
180
+ .runwell-care-coaching-medvi__circular--top-right,
181
+ .runwell-care-coaching-medvi__circular--bottom-right { right: 0; }
182
+ .runwell-care-coaching-medvi__circular--top-left,
183
+ .runwell-care-coaching-medvi__circular--bottom-left { left: 0; }
184
+ }
185
+
186
+ .runwell-care-coaching-medvi__circular-svg {
187
+ width: 100%;
188
+ height: 100%;
189
+ animation: runwell-care-coaching-medvi__rotate 30s linear infinite;
190
+ }
191
+
192
+ .runwell-care-coaching-medvi__circular-text {
193
+ font-size: 18px;
194
+ font-weight: 600;
195
+ letter-spacing: 0.16em;
196
+ font-family: var(--font-body-family, inherit);
197
+ text-transform: uppercase;
198
+ }
199
+
200
+ @keyframes runwell-care-coaching-medvi__rotate {
201
+ from { transform: rotate(0deg); }
202
+ to { transform: rotate(360deg); }
203
+ }
204
+
205
+ @media (prefers-reduced-motion: reduce) {
206
+ .runwell-care-coaching-medvi__circular-svg {
207
+ animation: none;
208
+ }
209
+ }
210
+
211
+ /* ----- Footer ----- */
212
+
213
+ .runwell-care-coaching-medvi__footer {
214
+ margin-top: clamp(2rem, 4vw, 3rem);
215
+ text-align: center;
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: 0.5rem;
219
+ }
220
+
221
+ .runwell-care-coaching-medvi__footer-eyebrow {
222
+ font-size: var(--runwell-meta-size, 0.92rem);
223
+ font-weight: 600;
224
+ margin: 0;
225
+ }
226
+
227
+ .runwell-care-coaching-medvi__footer-link {
228
+ display: inline-block;
229
+ font-size: var(--runwell-meta-size, 0.92rem);
230
+ font-weight: 600;
231
+ color: var(--runwell-primary, #0B3D38);
232
+ text-decoration: underline;
233
+ text-underline-offset: 4px;
234
+ text-decoration-color: var(--runwell-blue, #8AD3CC);
235
+ text-decoration-thickness: 2px;
236
+ }
237
+
238
+ .runwell-care-coaching-medvi__footer-link:hover,
239
+ .runwell-care-coaching-medvi__footer-link:focus {
240
+ text-decoration-color: var(--runwell-primary, #0B3D38);
241
+ }