@runwell/shopify-toolkit 0.17.0 → 0.17.1

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.
@@ -0,0 +1,110 @@
1
+ /* Runwell loyalty tier card. Customer-account block: eyebrow + tier name +
2
+ perk line + progress bar to next tier + perks list. Tenants override
3
+ colors/fonts via brand CSS. */
4
+
5
+ .runwell-tier {
6
+ padding: clamp(3rem, 6vw, 5rem) 6vw;
7
+ }
8
+
9
+ .runwell-tier__inner {
10
+ max-width: 720px;
11
+ margin: 0 auto;
12
+ }
13
+
14
+ .runwell-tier__header {
15
+ margin-bottom: 2rem;
16
+ }
17
+
18
+ .runwell-tier__eyebrow {
19
+ font-family: var(--font-body-family, sans-serif);
20
+ font-size: var(--runwell-eyebrow-size);
21
+ font-weight: 700;
22
+ letter-spacing: 0.2em;
23
+ text-transform: uppercase;
24
+ opacity: 0.6;
25
+ margin: 0 0 0.6rem 0;
26
+ }
27
+
28
+ .runwell-tier__name {
29
+ font-family: var(--font-heading-family, serif);
30
+ font-style: normal;
31
+ font-weight: 400;
32
+ font-size: var(--runwell-h2-size);
33
+ line-height: 1.05;
34
+ margin: 0 0 0.6rem 0;
35
+ }
36
+
37
+ .runwell-tier__perk {
38
+ font-family: var(--font-body-family, sans-serif);
39
+ font-size: var(--runwell-body-size);
40
+ line-height: 1.55;
41
+ opacity: 0.85;
42
+ margin: 0;
43
+ }
44
+
45
+ .runwell-tier__progress {
46
+ margin: 1.6rem 0 2rem;
47
+ }
48
+
49
+ .runwell-tier__progress-label {
50
+ font-family: var(--font-body-family, sans-serif);
51
+ font-size: var(--runwell-body-size);
52
+ margin: 0 0 0.6rem 0;
53
+ opacity: 0.85;
54
+ }
55
+
56
+ .runwell-tier__progress-label strong {
57
+ font-weight: 700;
58
+ }
59
+
60
+ .runwell-tier__progress-track {
61
+ width: 100%;
62
+ height: 6px;
63
+ background: rgba(0, 0, 0, 0.08);
64
+ border-radius: 999px;
65
+ overflow: hidden;
66
+ }
67
+
68
+ .runwell-tier__progress-fill {
69
+ height: 100%;
70
+ background: currentColor;
71
+ opacity: 0.85;
72
+ transition: width 0.4s ease;
73
+ }
74
+
75
+ .runwell-tier__topped {
76
+ font-family: var(--font-heading-family, serif);
77
+ font-style: italic;
78
+ font-size: var(--runwell-lede-size);
79
+ line-height: 1.5;
80
+ margin: 1.4rem 0 2rem 0;
81
+ opacity: 0.85;
82
+ }
83
+
84
+ .runwell-tier__perks-list {
85
+ list-style: none;
86
+ padding: 0;
87
+ margin: 0;
88
+ display: flex;
89
+ flex-direction: column;
90
+ gap: 0.6rem;
91
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
92
+ padding-top: 1.2rem;
93
+ }
94
+
95
+ .runwell-tier__perks-list li {
96
+ font-family: var(--font-body-family, sans-serif);
97
+ font-size: var(--runwell-body-size);
98
+ line-height: 1.5;
99
+ opacity: 0.85;
100
+ position: relative;
101
+ padding-left: 1.4rem;
102
+ }
103
+
104
+ .runwell-tier__perks-list li::before {
105
+ content: "·";
106
+ position: absolute;
107
+ left: 0.4rem;
108
+ font-weight: 700;
109
+ opacity: 0.6;
110
+ }
@@ -4,6 +4,7 @@
4
4
  Shopify Flow workflows that auto-tag customers (see admin_steps).
5
5
  Replaces Smile.io / Yotpo Loyalty / LoyaltyLion display layer.
6
6
  {%- endcomment -%}
7
+ {{ 'runwell-loyalty-tiers.css' | asset_url | stylesheet_tag }}
7
8
 
8
9
  {%- if customer != blank -%}
9
10
  {%- assign spend = customer.total_spent | divided_by: 100.0 -%}
@@ -0,0 +1,88 @@
1
+ /* Runwell recently-viewed. Eyebrow + heading + 4-up product card grid.
2
+ Cards are anchor links built by runwell-recently-viewed.js. Tenants
3
+ override colors/fonts via brand CSS. */
4
+
5
+ .runwell-rv {
6
+ padding: clamp(3rem, 7vw, 5rem) 6vw;
7
+ }
8
+
9
+ .runwell-rv__inner {
10
+ max-width: 1400px;
11
+ margin: 0 auto;
12
+ }
13
+
14
+ .runwell-rv__eyebrow {
15
+ font-family: var(--font-body-family, sans-serif);
16
+ font-size: var(--runwell-eyebrow-size);
17
+ font-weight: 700;
18
+ letter-spacing: 0.2em;
19
+ text-transform: uppercase;
20
+ opacity: 0.6;
21
+ margin: 0 0 0.6rem 0;
22
+ }
23
+
24
+ .runwell-rv__heading {
25
+ font-family: var(--font-heading-family, serif);
26
+ font-style: normal;
27
+ font-weight: 400;
28
+ font-size: var(--runwell-h2-size);
29
+ line-height: 1.1;
30
+ margin: 0 0 2rem 0;
31
+ }
32
+
33
+ .runwell-rv__grid {
34
+ display: grid;
35
+ grid-template-columns: repeat(2, minmax(0, 1fr));
36
+ gap: clamp(1rem, 2vw, 2rem);
37
+ }
38
+
39
+ @media (min-width: 750px) {
40
+ .runwell-rv__grid {
41
+ grid-template-columns: repeat(4, minmax(0, 1fr));
42
+ }
43
+ }
44
+
45
+ .runwell-rv__card {
46
+ display: block;
47
+ text-decoration: none;
48
+ color: inherit;
49
+ }
50
+
51
+ .runwell-rv__media {
52
+ aspect-ratio: 4/5;
53
+ overflow: hidden;
54
+ background: rgba(0, 0, 0, 0.04);
55
+ margin-bottom: 0.8rem;
56
+ border-radius: 4px;
57
+ }
58
+
59
+ .runwell-rv__media img {
60
+ width: 100%;
61
+ height: 100%;
62
+ object-fit: cover;
63
+ display: block;
64
+ transition: transform 0.4s ease;
65
+ }
66
+
67
+ .runwell-rv__card:hover .runwell-rv__media img {
68
+ transform: scale(1.03);
69
+ }
70
+
71
+ .runwell-rv__noimg {
72
+ width: 100%;
73
+ height: 100%;
74
+ }
75
+
76
+ .runwell-rv__title {
77
+ font-family: var(--font-heading-family, serif);
78
+ font-weight: 400;
79
+ font-size: var(--runwell-h4-size);
80
+ line-height: 1.3;
81
+ margin-bottom: 0.3rem;
82
+ }
83
+
84
+ .runwell-rv__price {
85
+ font-family: var(--font-body-family, sans-serif);
86
+ font-size: var(--runwell-body-size);
87
+ opacity: 0.85;
88
+ }
@@ -3,6 +3,7 @@
3
3
  PDP visits) and renders up to 4 cards. Native replacement for the
4
4
  recently-viewed feature in Vitals / similar apps.
5
5
  {%- endcomment -%}
6
+ {{ 'runwell-recently-viewed.css' | asset_url | stylesheet_tag }}
6
7
 
7
8
  <section
8
9
  class="runwell-rv"
@@ -0,0 +1,196 @@
1
+ /* Runwell PDP reviews. Heading + summary stars + review list + write-review
2
+ accordion form. Reads from product metafield (default ns 'runwell').
3
+ Tenants override colors/fonts via brand CSS. */
4
+
5
+ .runwell-reviews {
6
+ padding: clamp(3rem, 7vw, 5rem) 6vw;
7
+ }
8
+
9
+ .runwell-reviews__inner {
10
+ max-width: 820px;
11
+ margin: 0 auto;
12
+ }
13
+
14
+ .runwell-reviews__header {
15
+ margin-bottom: 2rem;
16
+ }
17
+
18
+ .runwell-reviews__heading {
19
+ font-family: var(--font-heading-family, serif);
20
+ font-style: normal;
21
+ font-weight: 400;
22
+ font-size: var(--runwell-h2-size);
23
+ line-height: 1.1;
24
+ margin: 0 0 0.8rem 0;
25
+ }
26
+
27
+ .runwell-reviews__summary {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 0.8rem;
31
+ }
32
+
33
+ .runwell-reviews__stars {
34
+ font-size: calc(var(--font-body-scale) * 1.4rem);
35
+ letter-spacing: 0.05em;
36
+ color: currentColor;
37
+ }
38
+
39
+ .runwell-reviews__count {
40
+ font-family: var(--font-body-family, sans-serif);
41
+ font-size: var(--runwell-meta-size);
42
+ opacity: 0.7;
43
+ letter-spacing: 0.04em;
44
+ }
45
+
46
+ .runwell-reviews__list {
47
+ list-style: none;
48
+ padding: 0;
49
+ margin: 0;
50
+ display: flex;
51
+ flex-direction: column;
52
+ }
53
+
54
+ .runwell-reviews__item {
55
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
56
+ padding: 1.4rem 0;
57
+ }
58
+
59
+ .runwell-reviews__item:last-child {
60
+ border-bottom: 1px solid rgba(0, 0, 0, 0.12);
61
+ }
62
+
63
+ .runwell-reviews__row {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: 0.8rem;
67
+ margin-bottom: 0.6rem;
68
+ }
69
+
70
+ .runwell-reviews__verified {
71
+ font-family: var(--font-body-family, sans-serif);
72
+ font-size: var(--runwell-eyebrow-size);
73
+ font-weight: 700;
74
+ letter-spacing: 0.18em;
75
+ text-transform: uppercase;
76
+ opacity: 0.6;
77
+ }
78
+
79
+ .runwell-reviews__body {
80
+ font-family: var(--font-body-family, sans-serif);
81
+ font-size: var(--runwell-body-size);
82
+ line-height: 1.6;
83
+ margin: 0 0 0.6rem 0;
84
+ max-width: 60ch;
85
+ }
86
+
87
+ .runwell-reviews__meta {
88
+ font-family: var(--font-body-family, sans-serif);
89
+ font-size: var(--runwell-meta-size);
90
+ opacity: 0.7;
91
+ margin: 0;
92
+ }
93
+
94
+ .runwell-reviews__meta strong {
95
+ font-weight: 700;
96
+ }
97
+
98
+ .runwell-reviews__empty {
99
+ font-family: var(--font-body-family, sans-serif);
100
+ font-size: var(--runwell-body-size);
101
+ line-height: 1.6;
102
+ opacity: 0.85;
103
+ padding: 1rem 0;
104
+ }
105
+
106
+ .runwell-reviews__empty a {
107
+ color: inherit;
108
+ text-decoration: underline;
109
+ text-underline-offset: 4px;
110
+ }
111
+
112
+ .runwell-reviews__write {
113
+ margin-top: 2rem;
114
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
115
+ padding-top: 1.2rem;
116
+ }
117
+
118
+ .runwell-reviews__write summary {
119
+ cursor: pointer;
120
+ font-family: var(--font-body-family, sans-serif);
121
+ font-size: var(--runwell-cta-size);
122
+ font-weight: 700;
123
+ letter-spacing: 0.04em;
124
+ text-transform: uppercase;
125
+ list-style: none;
126
+ padding: 0.6rem 0;
127
+ }
128
+
129
+ .runwell-reviews__write summary::-webkit-details-marker {
130
+ display: none;
131
+ }
132
+
133
+ .runwell-reviews__form {
134
+ display: flex;
135
+ flex-direction: column;
136
+ gap: 0.8rem;
137
+ margin-top: 1rem;
138
+ }
139
+
140
+ .runwell-reviews__form label {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: 0.4rem;
144
+ font-family: var(--font-body-family, sans-serif);
145
+ font-size: var(--runwell-eyebrow-size);
146
+ font-weight: 700;
147
+ letter-spacing: 0.18em;
148
+ text-transform: uppercase;
149
+ opacity: 0.7;
150
+ }
151
+
152
+ .runwell-reviews__form input,
153
+ .runwell-reviews__form select,
154
+ .runwell-reviews__form textarea {
155
+ font-family: var(--font-body-family, sans-serif);
156
+ font-size: var(--runwell-body-size);
157
+ font-weight: 400;
158
+ letter-spacing: normal;
159
+ text-transform: none;
160
+ opacity: 1;
161
+ padding: 0.85rem 1rem;
162
+ border: 1px solid rgba(0, 0, 0, 0.25);
163
+ border-radius: 4px;
164
+ background: #FFFFFF;
165
+ color: inherit;
166
+ }
167
+
168
+ .runwell-reviews__form textarea {
169
+ resize: vertical;
170
+ min-height: 6rem;
171
+ }
172
+
173
+ .runwell-reviews__form button {
174
+ align-self: flex-start;
175
+ padding: 0.85rem 1.6rem;
176
+ background: currentColor;
177
+ color: #FFFFFF;
178
+ border: 0;
179
+ border-radius: 4px;
180
+ font-family: var(--font-body-family, sans-serif);
181
+ font-size: var(--runwell-body-size);
182
+ font-weight: 700;
183
+ letter-spacing: 0.04em;
184
+ cursor: pointer;
185
+ }
186
+
187
+ .runwell-reviews__form button > * {
188
+ color: #FFFFFF;
189
+ }
190
+
191
+ .runwell-reviews__success {
192
+ margin-top: 0.6rem;
193
+ font-family: var(--font-body-family, sans-serif);
194
+ font-size: var(--runwell-body-size);
195
+ font-weight: 600;
196
+ }
@@ -6,6 +6,7 @@
6
6
  Falls back to a "no reviews yet" state with a mailto CTA pointing
7
7
  to shop.email (merchant configures in Shopify admin > settings).
8
8
  {%- endcomment -%}
9
+ {{ 'runwell-reviews.css' | asset_url | stylesheet_tag }}
9
10
 
10
11
  {%- if product != blank -%}
11
12
  {%- assign ns = section.settings.metafield_namespace | default: 'runwell' -%}
@@ -0,0 +1,157 @@
1
+ /* Runwell wishlist. Two surfaces:
2
+ 1. .runwell-wishlist-icon: heart toggle button on cards/PDP.
3
+ 2. .runwell-wishlist: dedicated /pages/wishlist grid with empty state.
4
+ Tenants override colors/fonts via brand CSS. */
5
+
6
+ /* Heart icon button (rendered into card-product / main-product) */
7
+
8
+ .runwell-wishlist-icon {
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: 36px;
13
+ height: 36px;
14
+ padding: 0;
15
+ background: rgba(255, 255, 255, 0.85);
16
+ border: 0;
17
+ border-radius: 999px;
18
+ color: currentColor;
19
+ cursor: pointer;
20
+ transition: background 0.2s ease, transform 0.2s ease;
21
+ }
22
+
23
+ .runwell-wishlist-icon:hover {
24
+ background: rgba(255, 255, 255, 1);
25
+ transform: scale(1.05);
26
+ }
27
+
28
+ .runwell-wishlist-icon.is-saved svg path {
29
+ fill: currentColor;
30
+ }
31
+
32
+ .runwell-wishlist-icon svg {
33
+ display: block;
34
+ }
35
+
36
+ /* Wishlist page */
37
+
38
+ .runwell-wishlist {
39
+ padding: clamp(3rem, 7vw, 5rem) 6vw;
40
+ }
41
+
42
+ .runwell-wishlist__inner {
43
+ max-width: 1400px;
44
+ margin: 0 auto;
45
+ }
46
+
47
+ .runwell-wishlist__heading {
48
+ font-family: var(--font-heading-family, serif);
49
+ font-style: normal;
50
+ font-weight: 400;
51
+ font-size: var(--runwell-h1-size);
52
+ line-height: 1.05;
53
+ margin: 0 0 2rem 0;
54
+ }
55
+
56
+ .runwell-wishlist__empty {
57
+ text-align: center;
58
+ padding: 3rem 0;
59
+ }
60
+
61
+ .runwell-wishlist__empty p {
62
+ font-family: var(--font-body-family, sans-serif);
63
+ font-size: var(--runwell-lede-size);
64
+ line-height: 1.55;
65
+ opacity: 0.85;
66
+ margin: 0 0 1.4rem 0;
67
+ }
68
+
69
+ .runwell-wishlist__cta {
70
+ display: inline-block;
71
+ padding: 0.85rem 1.6rem;
72
+ background: currentColor;
73
+ color: #FFFFFF;
74
+ border: 0;
75
+ border-radius: 4px;
76
+ font-family: var(--font-body-family, sans-serif);
77
+ font-size: var(--runwell-body-size);
78
+ font-weight: 700;
79
+ letter-spacing: 0.04em;
80
+ text-decoration: none;
81
+ }
82
+
83
+ .runwell-wishlist__cta > * {
84
+ color: #FFFFFF;
85
+ }
86
+
87
+ .runwell-wishlist__grid {
88
+ display: grid;
89
+ grid-template-columns: repeat(2, minmax(0, 1fr));
90
+ gap: clamp(1rem, 2vw, 2rem);
91
+ }
92
+
93
+ @media (min-width: 750px) {
94
+ .runwell-wishlist__grid {
95
+ grid-template-columns: repeat(4, minmax(0, 1fr));
96
+ }
97
+ }
98
+
99
+ .runwell-wishlist__card {
100
+ position: relative;
101
+ display: block;
102
+ text-decoration: none;
103
+ color: inherit;
104
+ }
105
+
106
+ .runwell-wishlist__media {
107
+ aspect-ratio: 4/5;
108
+ overflow: hidden;
109
+ background: rgba(0, 0, 0, 0.04);
110
+ margin-bottom: 0.8rem;
111
+ border-radius: 4px;
112
+ }
113
+
114
+ .runwell-wishlist__media img {
115
+ width: 100%;
116
+ height: 100%;
117
+ object-fit: cover;
118
+ display: block;
119
+ transition: transform 0.4s ease;
120
+ }
121
+
122
+ .runwell-wishlist__card:hover .runwell-wishlist__media img {
123
+ transform: scale(1.03);
124
+ }
125
+
126
+ .runwell-wishlist__title {
127
+ font-family: var(--font-heading-family, serif);
128
+ font-weight: 400;
129
+ font-size: var(--runwell-h4-size);
130
+ line-height: 1.3;
131
+ margin-bottom: 0.3rem;
132
+ }
133
+
134
+ .runwell-wishlist__price {
135
+ font-family: var(--font-body-family, sans-serif);
136
+ font-size: var(--runwell-body-size);
137
+ opacity: 0.85;
138
+ margin-bottom: 0.6rem;
139
+ }
140
+
141
+ .runwell-wishlist__remove {
142
+ background: transparent;
143
+ border: 0;
144
+ padding: 0;
145
+ font-family: var(--font-body-family, sans-serif);
146
+ font-size: var(--runwell-eyebrow-size);
147
+ font-weight: 700;
148
+ letter-spacing: 0.18em;
149
+ text-transform: uppercase;
150
+ opacity: 0.6;
151
+ cursor: pointer;
152
+ color: inherit;
153
+ }
154
+
155
+ .runwell-wishlist__remove:hover {
156
+ opacity: 1;
157
+ }
@@ -2,6 +2,7 @@
2
2
  Runwell wishlist page section. Drop into a Shopify Page template
3
3
  (e.g. templates/page.wishlist.json).
4
4
  {%- endcomment -%}
5
+ {{ 'runwell-wishlist.css' | asset_url | stylesheet_tag }}
5
6
 
6
7
  <section class="runwell-wishlist" data-runwell-wishlist-page>
7
8
  <div class="runwell-wishlist__inner">
@@ -2,6 +2,7 @@
2
2
  Runwell wishlist heart button. Drop into card-product or main-product.
3
3
  Caller sets handle via {% render 'runwell-wishlist-icon', handle: card_product.handle %}
4
4
  {%- endcomment -%}
5
+ {{ 'runwell-wishlist.css' | asset_url | stylesheet_tag }}
5
6
 
6
7
  <button
7
8
  type="button"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runwell/shopify-toolkit",
3
- "version": "0.17.0",
3
+ "version": "0.17.1",
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",