@runwell/shopify-toolkit 0.17.4 → 0.18.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 (25) hide show
  1. package/bin/runwell-shopify +4 -1
  2. package/lib/list.js +120 -0
  3. package/modules/INDEX.md +52 -19
  4. package/modules/_shared/css-tokens/assets/runwell-tokens.css +24 -4
  5. package/modules/_shared/css-tokens/module.json +2 -2
  6. package/modules/_shared/css-typography/assets/runwell-typography.css +14 -6
  7. package/modules/_shared/css-typography/module.json +2 -2
  8. package/modules/care-coaching-medvi/README.md +46 -0
  9. package/modules/care-coaching-medvi/assets/runwell-care-coaching-medvi.css +241 -0
  10. package/modules/care-coaching-medvi/module.json +80 -0
  11. package/modules/care-coaching-medvi/sections/runwell-care-coaching-medvi.liquid +274 -0
  12. package/modules/care-coaching-medvi/snippets/runwell-care-coaching-medvi-circular-text.liquid +25 -0
  13. package/modules/collection-block-medvi/README.md +50 -0
  14. package/modules/collection-block-medvi/assets/runwell-collection-block-medvi.css +242 -0
  15. package/modules/collection-block-medvi/module.json +83 -0
  16. package/modules/collection-block-medvi/sections/runwell-collection-block-medvi.liquid +355 -0
  17. package/modules/product-trio-medvi/README.md +35 -0
  18. package/modules/product-trio-medvi/assets/runwell-product-trio-medvi.css +119 -0
  19. package/modules/product-trio-medvi/module.json +48 -0
  20. package/modules/product-trio-medvi/sections/runwell-product-trio-medvi.liquid +188 -0
  21. package/modules/testimonials-medvi/README.md +44 -0
  22. package/modules/testimonials-medvi/assets/runwell-testimonials-medvi.css +239 -0
  23. package/modules/testimonials-medvi/module.json +68 -0
  24. package/modules/testimonials-medvi/sections/runwell-testimonials-medvi.liquid +355 -0
  25. package/package.json +2 -2
@@ -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
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "care-coaching-medvi",
3
+ "version": "0.2.0",
4
+ "category": "branding",
5
+ "source": "medvi",
6
+ "base": "care-coaching",
7
+ "qualifier": null,
8
+ "description": "Brand-promise section: portrait card + circular rotating text mark + 2-color headline + body + footer CTA line. Distinctive flourish for editorial-led brands.",
9
+ "replaces": null,
10
+ "files": {
11
+ "sections": [
12
+ "sections/runwell-care-coaching-medvi.liquid"
13
+ ],
14
+ "snippets": [
15
+ "snippets/runwell-care-coaching-medvi-circular-text.liquid"
16
+ ],
17
+ "assets": [
18
+ "assets/runwell-care-coaching-medvi.css"
19
+ ]
20
+ },
21
+ "config": {
22
+ "schema": {
23
+ "section_eyebrow": {
24
+ "type": "string",
25
+ "default": "BETTER IS POSSIBLE, AND WE BUILT FOR IT.",
26
+ "label": "Section eyebrow"
27
+ },
28
+ "headline_pre": {
29
+ "type": "string",
30
+ "default": "Modern healthcare,",
31
+ "label": "Headline first part"
32
+ },
33
+ "headline_post": {
34
+ "type": "string",
35
+ "default": "built around you",
36
+ "label": "Headline accent part"
37
+ },
38
+ "headline_accent_color": {
39
+ "type": "string",
40
+ "default": "{{brand.primary}}",
41
+ "label": "Accent color for headline post"
42
+ },
43
+ "block_heading": {
44
+ "type": "string",
45
+ "default": "Care coaching and nutrition support",
46
+ "label": "Block heading"
47
+ },
48
+ "circular_text": {
49
+ "type": "string",
50
+ "default": "WITH YOU FROM START TO SUCCESS",
51
+ "label": "Circular text"
52
+ },
53
+ "circular_text_position": {
54
+ "type": "string",
55
+ "default": "top-right",
56
+ "label": "Circular text position: top-right, top-left, bottom-right, bottom-left"
57
+ },
58
+ "footer_link_label": {
59
+ "type": "string",
60
+ "default": "We're here for those details",
61
+ "label": "Footer link label"
62
+ },
63
+ "layout": {
64
+ "type": "string",
65
+ "default": "portrait-left",
66
+ "label": "Layout: portrait-left or portrait-right"
67
+ },
68
+ "bg_band": {
69
+ "type": "string",
70
+ "default": "white",
71
+ "label": "Background band: white, oat, celadon-tint"
72
+ }
73
+ }
74
+ },
75
+ "lineage": {
76
+ "extracted_from": "https://home.medvi.org/",
77
+ "scrape_path": "_clients/capital-v/lushi/research/medvi-reference/site-scrape/",
78
+ "framer_label": "Care Coaching"
79
+ }
80
+ }
@@ -0,0 +1,274 @@
1
+ {%- comment -%}
2
+ Runwell care-coaching-medvi.
3
+
4
+ Brand-promise section: section eyebrow + 2-color headline at top;
5
+ large portrait card on one side; block (heading + body) on the other;
6
+ circular rotating text mark anchored to a corner of the section;
7
+ footer eyebrow + link below.
8
+
9
+ Lineage: extracted from home.medvi.org (Framer label "Care Coaching"),
10
+ generalised to Runwell brand tokens.
11
+ {%- endcomment -%}
12
+
13
+ {{ 'runwell-care-coaching-medvi.css' | asset_url | stylesheet_tag }}
14
+
15
+ {%- liquid
16
+ assign layout = section.settings.layout | default: 'portrait-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 portrait_card_bg = section.settings.portrait_card_bg | default: 'var(--runwell-oat)'
20
+ assign block_bg = section.settings.block_bg | default: 'transparent'
21
+ assign circular_position = section.settings.circular_text_position | default: 'top-right'
22
+ assign circular_color = section.settings.circular_text_accent | default: 'var(--runwell-tertiary)'
23
+ -%}
24
+
25
+ <section
26
+ class="runwell-care-coaching-medvi runwell-care-coaching-medvi--{{ layout }} runwell-care-coaching-medvi--bg-{{ bg_band }}"
27
+ >
28
+
29
+ {%- if section.settings.section_eyebrow != blank -%}
30
+ <p class="runwell-care-coaching-medvi__section-eyebrow">{{ section.settings.section_eyebrow }}</p>
31
+ {%- endif -%}
32
+
33
+ {%- if section.settings.headline_pre != blank or section.settings.headline_post != blank -%}
34
+ <h2 class="runwell-care-coaching-medvi__headline">
35
+ {%- if section.settings.headline_pre != blank -%}
36
+ <span class="runwell-care-coaching-medvi__headline-pre">{{ section.settings.headline_pre }}</span>
37
+ {%- endif -%}
38
+ {%- if section.settings.headline_post != blank -%}
39
+ <span class="runwell-care-coaching-medvi__headline-post" style="color: {{ accent_color }};">{{ section.settings.headline_post }}</span>
40
+ {%- endif -%}
41
+ </h2>
42
+ {%- endif -%}
43
+
44
+ <div class="runwell-care-coaching-medvi__inner">
45
+
46
+ <div class="runwell-care-coaching-medvi__portrait-card" style="background: {{ portrait_card_bg }};">
47
+ {%- if section.settings.portrait_image != blank -%}
48
+ <img
49
+ src="{{ section.settings.portrait_image | image_url: width: 1000 }}"
50
+ alt="{{ section.settings.portrait_image.alt | default: section.settings.block_heading | escape }}"
51
+ width="{{ section.settings.portrait_image.width }}"
52
+ height="{{ section.settings.portrait_image.height }}"
53
+ loading="lazy"
54
+ >
55
+ {%- elsif section.settings.portrait_image_asset != blank -%}
56
+ <img
57
+ src="{{ section.settings.portrait_image_asset | asset_url }}"
58
+ alt="{{ section.settings.block_heading | escape }}"
59
+ width="800"
60
+ height="1000"
61
+ loading="lazy"
62
+ >
63
+ {%- endif -%}
64
+ </div>
65
+
66
+ <div class="runwell-care-coaching-medvi__block runwell-care-coaching-medvi__block--bg-{{ block_bg }}">
67
+ {%- if section.settings.block_eyebrow != blank -%}
68
+ <p class="runwell-care-coaching-medvi__block-eyebrow">{{ section.settings.block_eyebrow }}</p>
69
+ {%- endif -%}
70
+ {%- if section.settings.block_heading != blank -%}
71
+ <h3 class="runwell-care-coaching-medvi__block-heading">{{ section.settings.block_heading }}</h3>
72
+ {%- endif -%}
73
+ {%- if section.settings.block_body != blank -%}
74
+ <div class="runwell-care-coaching-medvi__block-body">{{ section.settings.block_body }}</div>
75
+ {%- endif -%}
76
+ </div>
77
+
78
+ {%- if section.settings.circular_text != blank -%}
79
+ <div class="runwell-care-coaching-medvi__circular runwell-care-coaching-medvi__circular--{{ circular_position }}">
80
+ {%- render 'runwell-care-coaching-medvi-circular-text',
81
+ text: section.settings.circular_text,
82
+ color: circular_color,
83
+ id_suffix: section.id
84
+ -%}
85
+ </div>
86
+ {%- endif -%}
87
+
88
+ </div>
89
+
90
+ {%- if section.settings.footer_eyebrow != blank or section.settings.footer_link_label != blank -%}
91
+ <div class="runwell-care-coaching-medvi__footer">
92
+ {%- if section.settings.footer_eyebrow != blank -%}
93
+ <p class="runwell-care-coaching-medvi__footer-eyebrow">{{ section.settings.footer_eyebrow }}</p>
94
+ {%- endif -%}
95
+ {%- if section.settings.footer_link_label != blank -%}
96
+ <a href="{{ section.settings.footer_link_href | default: '#' }}" class="runwell-care-coaching-medvi__footer-link">
97
+ {{ section.settings.footer_link_label }}
98
+ </a>
99
+ {%- endif -%}
100
+ </div>
101
+ {%- endif -%}
102
+
103
+ </section>
104
+
105
+ {% schema %}
106
+ {
107
+ "name": "Care coaching (medvi)",
108
+ "tag": "section",
109
+ "class": "section-runwell-care-coaching-medvi",
110
+ "settings": [
111
+ {
112
+ "type": "header",
113
+ "content": "Headline"
114
+ },
115
+ {
116
+ "type": "text",
117
+ "id": "section_eyebrow",
118
+ "label": "Section eyebrow (centered, tracked caps)",
119
+ "default": "BETTER IS POSSIBLE, AND WE BUILT FOR IT."
120
+ },
121
+ {
122
+ "type": "text",
123
+ "id": "headline_pre",
124
+ "label": "Headline (first part)",
125
+ "default": "Modern healthcare,"
126
+ },
127
+ {
128
+ "type": "text",
129
+ "id": "headline_post",
130
+ "label": "Headline (accent part)",
131
+ "default": "built around you"
132
+ },
133
+ {
134
+ "type": "color",
135
+ "id": "headline_accent_color",
136
+ "label": "Headline accent color",
137
+ "default": "#0B3D38"
138
+ },
139
+ {
140
+ "type": "header",
141
+ "content": "Portrait card"
142
+ },
143
+ {
144
+ "type": "image_picker",
145
+ "id": "portrait_image",
146
+ "label": "Portrait image (4:5 portrait crop)"
147
+ },
148
+ {
149
+ "type": "text",
150
+ "id": "portrait_image_asset",
151
+ "label": "Portrait (asset filename fallback)"
152
+ },
153
+ {
154
+ "type": "color",
155
+ "id": "portrait_card_bg",
156
+ "label": "Card background tint",
157
+ "default": "#F5F0EE"
158
+ },
159
+ {
160
+ "type": "header",
161
+ "content": "Block copy"
162
+ },
163
+ {
164
+ "type": "select",
165
+ "id": "block_bg",
166
+ "label": "Block background",
167
+ "info": "Card: theme-driven surface color (uses --runwell-surface-card token; defaults to oat). Oat / Celadon: explicit named brand colors. Transparent: no card background.",
168
+ "options": [
169
+ { "value": "card", "label": "Card (theme default)" },
170
+ { "value": "oat-card", "label": "Oat card" },
171
+ { "value": "celadon-card", "label": "Celadon card" },
172
+ { "value": "transparent", "label": "Transparent (no card)" }
173
+ ],
174
+ "default": "card"
175
+ },
176
+ {
177
+ "type": "text",
178
+ "id": "block_eyebrow",
179
+ "label": "Block eyebrow (optional)"
180
+ },
181
+ {
182
+ "type": "text",
183
+ "id": "block_heading",
184
+ "label": "Block heading",
185
+ "default": "Care coaching and nutrition support"
186
+ },
187
+ {
188
+ "type": "richtext",
189
+ "id": "block_body",
190
+ "label": "Block body",
191
+ "default": "<p>Our care coaching team, led by certified medical assistants and registered dietitians, helps answer questions about your medication, program, and day-to-day lifestyle changes, so you have the guidance you need to stay on track and see results.</p>"
192
+ },
193
+ {
194
+ "type": "header",
195
+ "content": "Circular text mark"
196
+ },
197
+ {
198
+ "type": "text",
199
+ "id": "circular_text",
200
+ "label": "Circular text",
201
+ "default": "WITH YOU FROM START TO SUCCESS"
202
+ },
203
+ {
204
+ "type": "color",
205
+ "id": "circular_text_accent",
206
+ "label": "Circular text color",
207
+ "default": "#0B3D38"
208
+ },
209
+ {
210
+ "type": "select",
211
+ "id": "circular_text_position",
212
+ "label": "Circular text position",
213
+ "options": [
214
+ { "value": "top-right", "label": "Top right" },
215
+ { "value": "top-left", "label": "Top left" },
216
+ { "value": "bottom-right", "label": "Bottom right" },
217
+ { "value": "bottom-left", "label": "Bottom left" }
218
+ ],
219
+ "default": "top-right"
220
+ },
221
+ {
222
+ "type": "header",
223
+ "content": "Footer line"
224
+ },
225
+ {
226
+ "type": "text",
227
+ "id": "footer_eyebrow",
228
+ "label": "Footer eyebrow (centered, small)",
229
+ "default": "We're creating a better experience, and the details matter"
230
+ },
231
+ {
232
+ "type": "text",
233
+ "id": "footer_link_label",
234
+ "label": "Footer link label",
235
+ "default": "We're here for those details"
236
+ },
237
+ {
238
+ "type": "url",
239
+ "id": "footer_link_href",
240
+ "label": "Footer link href"
241
+ },
242
+ {
243
+ "type": "header",
244
+ "content": "Layout"
245
+ },
246
+ {
247
+ "type": "select",
248
+ "id": "layout",
249
+ "label": "Layout",
250
+ "options": [
251
+ { "value": "portrait-left", "label": "Portrait on left" },
252
+ { "value": "portrait-right", "label": "Portrait on right" }
253
+ ],
254
+ "default": "portrait-left"
255
+ },
256
+ {
257
+ "type": "select",
258
+ "id": "bg_band",
259
+ "label": "Background band",
260
+ "options": [
261
+ { "value": "white", "label": "White" },
262
+ { "value": "oat", "label": "Oat" },
263
+ { "value": "celadon-tint", "label": "Celadon tint" }
264
+ ],
265
+ "default": "white"
266
+ }
267
+ ],
268
+ "presets": [
269
+ {
270
+ "name": "Care coaching (medvi)"
271
+ }
272
+ ]
273
+ }
274
+ {% endschema %}
@@ -0,0 +1,25 @@
1
+ {%- comment -%}
2
+ Renders text-on-path along a closed circle as inline SVG. Used by the
3
+ care-coaching-medvi section as a slow-rotating decorative mark.
4
+
5
+ Inputs:
6
+ - text: the string to render around the circle
7
+ - color: CSS color value
8
+ - id_suffix: unique suffix (avoids id collisions when section appears
9
+ multiple times on a page)
10
+ {%- endcomment -%}
11
+
12
+ {%- assign uid = id_suffix | default: section.id -%}
13
+
14
+ <svg viewBox="0 0 200 200" class="runwell-care-coaching-medvi__circular-svg" aria-hidden="true">
15
+ <defs>
16
+ <path
17
+ id="runwell-care-coaching-medvi-path-{{ uid }}"
18
+ d="M 100, 100 m -75, 0 a 75,75 0 1,1 150,0 a 75,75 0 1,1 -150,0"
19
+ fill="none"
20
+ />
21
+ </defs>
22
+ <text fill="{{ color | default: 'currentColor' }}" class="runwell-care-coaching-medvi__circular-text">
23
+ <textPath href="#runwell-care-coaching-medvi-path-{{ uid }}" startOffset="0%">{{ text | escape }}</textPath>
24
+ </text>
25
+ </svg>
@@ -0,0 +1,50 @@
1
+ # collection-block-medvi
2
+
3
+ Duplex category section. Product hero card on one side; eyebrow + split-color headline + 2 lifestyle photos + benefits checklist + CTA on the other. Sides flip per instance via the `layout` setting. The most-reused pattern from medvi.org's homepage.
4
+
5
+ Category: `storefront`
6
+
7
+ ## Files
8
+
9
+ - `sections/runwell-collection-block-medvi.liquid`
10
+ - `assets/runwell-collection-block-medvi.css`
11
+
12
+ ## Layout options
13
+
14
+ - `image-left` (default): product side first.
15
+ - `image-right`: copy side first. Use for visual rhythm; alternate per instance for an A-B-A flow.
16
+ - `show_product_card: false`: hides the product card; the benefits list fills the product side.
17
+
18
+ ## Tokens consumed
19
+
20
+ Brand: `--runwell-primary`, `--runwell-tertiary`, `--runwell-oat`, `--runwell-celadon`. Design system: `--runwell-radius-lg`, `--runwell-radius-xl`, `--runwell-shadow-card`. Typography: `--runwell-eyebrow-size`, `--runwell-h2-size`, `--runwell-h4-size`, `--runwell-body-size`, `--runwell-cta-size`.
21
+
22
+ ## Blocks
23
+
24
+ The section schema accepts `benefit` blocks (1 to 5). Each benefit renders a brand-colored circle-check icon plus text. Defaults shipped via the section preset cover the medvi pattern (5 benefits).
25
+
26
+ ## Headline two-color split
27
+
28
+ Headline is composed of `headline_pre` (default color) and `headline_post` (accent color via `headline_accent_color`). Both pieces render inline so they flow naturally on the same line; line wraps fall where the browser places them.
29
+
30
+ ## Lineage
31
+
32
+ Extracted from `https://home.medvi.org/` on 2026-05-06.
33
+
34
+ - Framer label: `Cards & Copy`.
35
+ - Scrape path: `_clients/capital-v/lushi/research/medvi-reference/site-scrape/` (in claude-PM repo, gitignored, local only).
36
+ - Generalisation: ships with Lushi-tinted defaults (Rain Forrest primary, Celadon product card background, "Supplements with the power to boost real results" headline). Tenants override per-instance via Theme Editor or globally via `runwell.config.json` brand block.
37
+
38
+ ## Tenant overrides
39
+
40
+ Per-tenant overrides flow through two channels:
41
+
42
+ 1. `runwell.config.json` brand block: rewires the global tokens (`brand.primary`, `brand.celadon`, etc.) so every instance picks up the new color palette.
43
+ 2. Per-instance section settings in the Theme Editor: override eyebrow, headline copy, accent color, layout, background band on a single use of the section.
44
+
45
+ ## Notes
46
+
47
+ - Mobile: stacks vertically below 768px, side-by-side above.
48
+ - Photos use a 3:4 aspect ratio; product card is 4:3.
49
+ - Benefits checkmark icon is rendered as inline SVG (no extra asset).
50
+ - CTA button is a pill with brand-primary background; hover lifts the button by 1px (respects `prefers-reduced-motion`).