@runwell/shopify-toolkit 0.15.3 → 0.16.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.
@@ -38,7 +38,7 @@
38
38
  </th>
39
39
  {%- for block in section.blocks -%}
40
40
  <th style="text-align: left; padding: 0.8rem 1rem; vertical-align: bottom; border-bottom: 2px solid currentColor;">
41
- <div style="font-family: var(--font-heading-family); font-style: italic; font-weight: 400; font-size: var(--runwell-cta-size); line-height: 1.2; margin-bottom: 0.2rem;">
41
+ <div style="font-family: var(--font-heading-family); font-style: italic; font-weight: 400; font-size: var(--runwell-h4-size); line-height: 1.2; margin-bottom: 0.2rem;">
42
42
  {{ block.settings.column_title }}
43
43
  </div>
44
44
  {%- if block.settings.column_subtitle != blank -%}
@@ -13,15 +13,17 @@
13
13
  },
14
14
  "variants": {
15
15
  "video-bg": {
16
- "description": "Full-bleed background video (mp4) with poster fallback, eyebrow + heading + subhead + primary/secondary CTAs. Section type: runwell-video-hero.",
16
+ "description": "Full-bleed background video (mp4) with poster fallback, eyebrow + heading + subhead + primary/secondary CTAs. Section type: runwell-video-hero. Ships its own CSS so tenants don't have to re-implement layout. Content position is configurable via Theme Editor (default: middle-left, keeps the primary CTA above the fold).",
17
17
  "files": {
18
- "sections": ["variants/video-bg/sections/runwell-video-hero.liquid"]
18
+ "sections": ["variants/video-bg/sections/runwell-video-hero.liquid"],
19
+ "assets": ["variants/video-bg/assets/runwell-video-hero.css"]
19
20
  },
20
21
  "config_extra": {
21
22
  "video_url": { "type": "string", "label": "Background video URL (mp4)" },
22
23
  "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)" },
24
+ "fallback_asset": { "type": "string", "label": "Bundled fallback asset filename" },
25
+ "min_height": { "type": "number", "default": 90, "label": "Hero min-height (vh)" },
26
+ "content_position": { "type": "string", "default": "middle-left", "label": "Content position (top-left | middle-left | bottom-left | center | bottom-center)" },
25
27
  "button_label_primary": { "type": "string", "default": "Shop now", "label": "Primary button label" },
26
28
  "button_link_primary": { "type": "string", "label": "Primary button link" },
27
29
  "button_label_secondary": { "type": "string", "default": "Learn more", "label": "Secondary button label" },
@@ -0,0 +1,138 @@
1
+ /* Runwell editorial-hero video-bg variant.
2
+ Ships baseline layout so tenants don't have to re-implement.
3
+ Content position is controlled via [data-position] section setting:
4
+ middle-left (default), top-left, bottom-left, center, bottom-center.
5
+ Tenants can override colors/typography in their brand stylesheet. */
6
+
7
+ .runwell-video-hero {
8
+ position: relative;
9
+ width: 100%;
10
+ overflow: hidden;
11
+ background: var(--runwell-primary, #1A1A1A);
12
+ }
13
+
14
+ .runwell-video-hero__video {
15
+ position: absolute;
16
+ top: 0;
17
+ left: 0;
18
+ width: 100%;
19
+ height: 100%;
20
+ object-fit: cover;
21
+ z-index: 0;
22
+ }
23
+
24
+ .runwell-video-hero__overlay {
25
+ position: absolute;
26
+ inset: 0;
27
+ background: linear-gradient(180deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.55) 100%);
28
+ z-index: 1;
29
+ }
30
+
31
+ /* Content layer. Default content-position = middle-left.
32
+ Padding leaves comfortable breathing room without pushing CTAs below fold
33
+ even on 90vh hero, because flex centers content vertically. */
34
+ .runwell-video-hero__content {
35
+ position: relative;
36
+ z-index: 2;
37
+ display: flex;
38
+ flex-direction: column;
39
+ height: 100%;
40
+ min-height: inherit;
41
+ padding: 6rem 6vw;
42
+ color: #FFFFFF;
43
+ max-width: 1400px;
44
+ margin: 0 auto;
45
+ justify-content: center;
46
+ align-items: flex-start;
47
+ }
48
+
49
+ /* Position variants set via section setting */
50
+ .runwell-video-hero[data-position="top-left"] .runwell-video-hero__content {
51
+ justify-content: flex-start;
52
+ align-items: flex-start;
53
+ }
54
+ .runwell-video-hero[data-position="middle-left"] .runwell-video-hero__content {
55
+ justify-content: center;
56
+ align-items: flex-start;
57
+ }
58
+ .runwell-video-hero[data-position="bottom-left"] .runwell-video-hero__content {
59
+ justify-content: flex-end;
60
+ align-items: flex-start;
61
+ }
62
+ .runwell-video-hero[data-position="center"] .runwell-video-hero__content {
63
+ justify-content: center;
64
+ align-items: center;
65
+ text-align: center;
66
+ }
67
+ .runwell-video-hero[data-position="bottom-center"] .runwell-video-hero__content {
68
+ justify-content: flex-end;
69
+ align-items: center;
70
+ text-align: center;
71
+ }
72
+
73
+ .runwell-video-hero__title {
74
+ font-family: var(--font-heading-family, serif);
75
+ font-size: calc(var(--font-heading-scale) * clamp(2.6rem, 6vw, 5.8rem));
76
+ font-weight: 400;
77
+ font-style: normal;
78
+ line-height: 1.02;
79
+ margin: 0 0 1.2rem 0;
80
+ max-width: 14ch;
81
+ color: #FFFFFF;
82
+ }
83
+
84
+ .runwell-video-hero__subtitle {
85
+ font-family: var(--font-body-family, sans-serif);
86
+ font-size: var(--runwell-lede-size);
87
+ line-height: 1.5;
88
+ margin: 0 0 2rem 0;
89
+ max-width: 42ch;
90
+ opacity: 0.95;
91
+ }
92
+
93
+ .runwell-video-hero__cta-row {
94
+ display: flex;
95
+ gap: 0.9rem;
96
+ flex-wrap: wrap;
97
+ }
98
+
99
+ .runwell-video-hero__cta {
100
+ display: inline-block;
101
+ padding: 1.1rem 1.8rem;
102
+ border-radius: 4px;
103
+ font-weight: 700;
104
+ font-size: var(--runwell-body-size);
105
+ letter-spacing: 0.01em;
106
+ text-decoration: none;
107
+ transition: opacity 0.2s ease, transform 0.2s ease;
108
+ }
109
+
110
+ .runwell-video-hero__cta--primary {
111
+ background: #FFFFFF;
112
+ color: var(--runwell-primary, #1A1A1A);
113
+ }
114
+
115
+ .runwell-video-hero__cta--primary:hover {
116
+ opacity: 0.9;
117
+ transform: translateY(-1px);
118
+ }
119
+
120
+ .runwell-video-hero__cta--secondary {
121
+ background: transparent;
122
+ color: #FFFFFF;
123
+ border: 1px solid rgba(255, 255, 255, 0.45);
124
+ }
125
+
126
+ .runwell-video-hero__cta--secondary:hover {
127
+ background: rgba(255, 255, 255, 0.10);
128
+ }
129
+
130
+ @media (max-width: 749px) {
131
+ .runwell-video-hero__content {
132
+ padding: 4rem 6vw;
133
+ }
134
+ .runwell-video-hero__cta {
135
+ padding: 0.9rem 1.4rem;
136
+ font-size: var(--runwell-cta-size);
137
+ }
138
+ }
@@ -1,10 +1,12 @@
1
1
  {%- comment -%}
2
- Runwell video hero. Full-bleed background video with editorial copy
3
- bottom-left. Mirrors the v1 lushi.co Hero pattern but pivots messaging
4
- to general health and wellness.
2
+ Runwell video hero. Full-bleed background video with editorial copy.
3
+ Default content position is middle-left so the primary CTA stays above
4
+ the fold. Tenants can change via Theme Editor (top-left, middle-left,
5
+ bottom-left, center, bottom-center).
5
6
  {%- endcomment -%}
7
+ {{ 'runwell-video-hero.css' | asset_url | stylesheet_tag }}
6
8
 
7
- <section class="runwell-video-hero" style="min-height: {{ section.settings.min_height | default: 100 }}vh;">
9
+ <section class="runwell-video-hero" data-position="{{ section.settings.content_position | default: 'middle-left' }}" style="min-height: {{ section.settings.min_height | default: 90 }}vh;">
8
10
  {%- if section.settings.video_url != blank -%}
9
11
  <video
10
12
  class="runwell-video-hero__video"
@@ -122,9 +124,23 @@
122
124
  "min": 60,
123
125
  "max": 100,
124
126
  "step": 5,
125
- "default": 100,
127
+ "default": 90,
126
128
  "unit": "vh"
127
129
  },
130
+ {
131
+ "type": "select",
132
+ "id": "content_position",
133
+ "label": "Content position",
134
+ "default": "middle-left",
135
+ "options": [
136
+ { "value": "top-left", "label": "Top left" },
137
+ { "value": "middle-left", "label": "Middle left" },
138
+ { "value": "bottom-left", "label": "Bottom left" },
139
+ { "value": "center", "label": "Center" },
140
+ { "value": "bottom-center", "label": "Bottom center" }
141
+ ],
142
+ "info": "Default middle-left keeps the primary CTA above the fold on most viewports."
143
+ },
128
144
  {
129
145
  "type": "text",
130
146
  "id": "button_label_primary",
@@ -34,7 +34,7 @@
34
34
  {{ linked_article.excerpt_or_content | strip_html | truncate: 180 }}
35
35
  </p>
36
36
  <a href="{{ linked_article.url }}"
37
- style="display: inline-block; padding: 0.85rem 1.4rem; border-radius: 4px; background: {{ section.settings.text_color }}; color: {{ section.settings.background_color }}; font-weight: 700; font-size: var(--runwell-caption-size); letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none;">
37
+ style="display: inline-block; padding: 0.85rem 1.4rem; border-radius: 4px; background: {{ section.settings.text_color }}; color: {{ section.settings.background_color }}; font-weight: 700; font-size: var(--runwell-cta-size); letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none;">
38
38
  Read the journal &rarr;
39
39
  </a>
40
40
  {%- else -%}
@@ -48,7 +48,7 @@
48
48
  {%- endif -%}
49
49
  {%- if section.settings.fallback_link_url != blank -%}
50
50
  <a href="{{ section.settings.fallback_link_url }}"
51
- style="display: inline-block; padding: 0.85rem 1.4rem; border-radius: 4px; background: {{ section.settings.text_color }}; color: {{ section.settings.background_color }}; font-weight: 700; font-size: var(--runwell-caption-size); letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none;">
51
+ style="display: inline-block; padding: 0.85rem 1.4rem; border-radius: 4px; background: {{ section.settings.text_color }}; color: {{ section.settings.background_color }}; font-weight: 700; font-size: var(--runwell-cta-size); letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none;">
52
52
  {{ section.settings.fallback_link_label | default: 'Read more' }} &rarr;
53
53
  </a>
54
54
  {%- endif -%}
@@ -35,7 +35,7 @@
35
35
  margin: 0 0 0.8rem 0;
36
36
  }
37
37
  .runwell-ty-upsell__lede {
38
- font-size: var(--runwell-meta-size);
38
+ font-size: var(--runwell-body-size);
39
39
  line-height: 1.5;
40
40
  margin: 0;
41
41
  opacity: 0.85;
@@ -98,11 +98,11 @@
98
98
  line-height: 1.2;
99
99
  }
100
100
  .runwell-ty-card__price {
101
- font-size: var(--runwell-caption-size);
101
+ font-size: var(--runwell-cta-size);
102
102
  opacity: 0.7;
103
103
  }
104
104
  .runwell-ty-card__cta {
105
- font-size: var(--runwell-caption-size);
105
+ font-size: var(--runwell-cta-size);
106
106
  font-weight: 700;
107
107
  text-decoration: underline;
108
108
  text-underline-offset: 4px;
@@ -17,7 +17,7 @@
17
17
  {%- endif -%}
18
18
  <div style="flex: 1 1 auto;">
19
19
  {%- if section.settings.heading != blank -%}
20
- <h3 style="font-family: var(--font-heading-family); font-style: italic; font-weight: 400; font-size: var(--runwell-cta-size); line-height: 1.2; margin: 0 0 0.3rem 0;">
20
+ <h3 style="font-family: var(--font-heading-family); font-style: italic; font-weight: 400; font-size: var(--runwell-h4-size); line-height: 1.2; margin: 0 0 0.3rem 0;">
21
21
  {{ section.settings.heading }}
22
22
  </h3>
23
23
  {%- endif -%}
@@ -57,7 +57,7 @@
57
57
  .runwell-sticky-atc__title {
58
58
  font-family: var(--font-heading-family, serif);
59
59
  font-style: italic;
60
- font-size: var(--runwell-meta-size);
60
+ font-size: var(--runwell-body-size);
61
61
  font-weight: 400;
62
62
  line-height: 1.2;
63
63
  color: var(--runwell-primary, #1A1A1A);
@@ -68,7 +68,7 @@
68
68
 
69
69
  .runwell-sticky-atc__price {
70
70
  font-family: var(--font-body-family, sans-serif);
71
- font-size: var(--runwell-caption-size);
71
+ font-size: var(--runwell-body-size);
72
72
  font-weight: 500;
73
73
  color: var(--runwell-primary, #1A1A1A);
74
74
  opacity: 0.8;
@@ -86,7 +86,7 @@
86
86
  border-radius: 0;
87
87
  padding: 0.75rem 1.5rem;
88
88
  font-family: var(--font-body-family, sans-serif);
89
- font-size: var(--runwell-caption-size);
89
+ font-size: var(--runwell-body-size);
90
90
  font-weight: 600;
91
91
  letter-spacing: 0.04em;
92
92
  text-transform: uppercase;
@@ -108,10 +108,10 @@
108
108
  padding: 0.6rem 0.9rem;
109
109
  }
110
110
  .runwell-sticky-atc__title {
111
- font-size: var(--runwell-caption-size);
111
+ font-size: var(--runwell-body-size);
112
112
  }
113
113
  .runwell-sticky-atc__cta {
114
114
  padding: 0.6rem 1.1rem;
115
- font-size: var(--runwell-eyebrow-size);
115
+ font-size: var(--runwell-cta-size);
116
116
  }
117
117
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runwell/shopify-toolkit",
3
- "version": "0.15.3",
3
+ "version": "0.16.0",
4
4
  "description": "Reusable Shopify theme modules from Runwell. Replaces typically app-driven features (reviews, wishlist, urgency, FAQ, post-purchase upsell, exit popups, free-ship progress, sticky ATC, testimonials, badges, bundles) with native Liquid + JS + CSS that ship across multiple client themes via a config-driven sync CLI.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",