@runwell/shopify-toolkit 0.21.0 → 0.24.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.
- package/lib/init.js +13 -2
- package/modules/INDEX.md +3 -3
- package/modules/runwell-bundle-system/admin-metafields.json +15 -3
- package/modules/runwell-bundle-system/assets/runwell-bundle-quantity-builder.css +383 -0
- package/modules/runwell-bundle-system/assets/runwell-bundle-system.css +246 -0
- package/modules/runwell-bundle-system/assets/runwell-bundle-system.js +359 -0
- package/modules/runwell-bundle-system/module.json +18 -4
- package/modules/runwell-bundle-system/qa/v1.5-mobile-qa-checklist.md +103 -0
- package/modules/runwell-bundle-system/sections/runwell-bundle-cart-xsell.liquid +2 -1
- package/modules/runwell-bundle-system/sections/runwell-bundle-collection.liquid +20 -8
- package/modules/runwell-bundle-system/sections/runwell-bundle-pdp-banner.liquid +2 -1
- package/modules/runwell-bundle-system/sections/runwell-bundle-pdp-pairs-with.liquid +2 -1
- package/modules/runwell-bundle-system/sections/runwell-bundle-pdp.liquid +15 -1
- package/modules/runwell-bundle-system/sections/runwell-bundle-quantity-builder.liquid +318 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker-accordion.liquid +84 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker-grid.liquid +72 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker-radio.liquid +77 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker.liquid +71 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-summary.liquid +39 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-card.liquid +15 -2
- package/modules/runwell-bundle-system/snippets/runwell-bundle-cart-xsell.liquid +85 -0
- package/modules/runwell-bundle-system/snippets/runwell-bundle-data.liquid +8 -0
- package/modules/scratch-popup/README.md +88 -0
- package/modules/scratch-popup/SPEC.md +120 -0
- package/modules/scratch-popup/assets/runwell-scratch-popup.css +315 -0
- package/modules/scratch-popup/assets/runwell-scratch-popup.js +367 -0
- package/modules/scratch-popup/module.json +128 -0
- package/modules/scratch-popup/sections/runwell-scratch-popup.liquid +184 -0
- package/package.json +1 -1
package/lib/init.js
CHANGED
|
@@ -65,7 +65,7 @@ export async function init(flags) {
|
|
|
65
65
|
store: 'TODO.myshopify.com',
|
|
66
66
|
theme_path: '.',
|
|
67
67
|
baseline,
|
|
68
|
-
toolkit_version: '^0.
|
|
68
|
+
toolkit_version: '^0.21.0',
|
|
69
69
|
brand: {
|
|
70
70
|
name: client.charAt(0).toUpperCase() + client.slice(1),
|
|
71
71
|
primary: '#1A1A1A',
|
|
@@ -76,7 +76,18 @@ export async function init(flags) {
|
|
|
76
76
|
tagline: ''
|
|
77
77
|
},
|
|
78
78
|
modules: {
|
|
79
|
-
'_shared/css-tokens': { enabled: true, config: {} }
|
|
79
|
+
'_shared/css-tokens': { enabled: true, config: {} },
|
|
80
|
+
'runwell-bundle-system': {
|
|
81
|
+
enabled: false,
|
|
82
|
+
config: {
|
|
83
|
+
surface_1_collection_page_enabled: false,
|
|
84
|
+
surface_2_pdp_pairs_with_enabled: false,
|
|
85
|
+
surface_3_home_stacks_enabled: false,
|
|
86
|
+
surface_4_cart_drawer_xsell_enabled: false,
|
|
87
|
+
surface_5_pdp_banner_enabled: false,
|
|
88
|
+
surface_6_collection_filter_enabled: false
|
|
89
|
+
}
|
|
90
|
+
}
|
|
80
91
|
}
|
|
81
92
|
};
|
|
82
93
|
|
package/modules/INDEX.md
CHANGED
|
@@ -47,7 +47,7 @@ Total modules: 39.
|
|
|
47
47
|
| `recently-viewed` | pdp | (native build) | sections:1 assets:2 | eyebrow, heading, background_color | (none) | (none) |
|
|
48
48
|
| `reviews` | social-proof | (native build) | sections:1 assets:1 | heading | (none) | (none) |
|
|
49
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:
|
|
50
|
+
| `runwell-bundle-system` | catalog | the legacy bundle-builder module | sections:6 snippets:13 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-byob-mode + 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 |
|
|
51
51
|
| `scrolling-ticker` | social-proof | announcement-bar / scrolling-text apps | sections:1 assets:1 | (none) | (none) | (none) |
|
|
52
52
|
| `shipping-bar` | conversion | (native build) | sections:1 | threshold_cents, message_below, message_qualified, message_default, background_color, text_color | (none) | (none) |
|
|
53
53
|
| `social-proof-banner` | social-proof | fixed-text social-proof apps | sections:1 assets:1 | (none) | (none) | (none) |
|
|
@@ -269,9 +269,9 @@ Total modules: 39.
|
|
|
269
269
|
- Category: catalog
|
|
270
270
|
- Replaces: the legacy bundle-builder module
|
|
271
271
|
- What: Configurable bundles engine.
|
|
272
|
-
- Files: sections:6 snippets:
|
|
272
|
+
- Files: sections:6 snippets:13 assets:2
|
|
273
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
|
|
274
|
+
- Admin steps: install-shopify-bundles + define-bundle-metafields + create-bundle-index-metaobject + create-first-bundle-product + configure-byob-mode + 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
275
|
|
|
276
276
|
### scrolling-ticker
|
|
277
277
|
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"namespace": "runwell",
|
|
6
6
|
"owner_type": "PRODUCT",
|
|
7
7
|
"definitions": [
|
|
8
|
-
{ "key": "bundle_mode", "name": "Bundle mode", "type": "single_line_text_field", "validations": [{ "name": "choices", "value": "[\"quantity_tiers\",\"multi_product\",\"mix_match\",\"subscription\"]" }] },
|
|
9
|
-
{ "key": "bundle_pricing_model", "name": "Bundle pricing model", "type": "single_line_text_field", "validations": [{ "name": "choices", "value": "[\"tier_quantity\",\"fixed_price\",\"percent_off_subtotal\",\"dollar_off_subtotal\"]" }] },
|
|
8
|
+
{ "key": "bundle_mode", "name": "Bundle mode", "type": "single_line_text_field", "validations": [{ "name": "choices", "value": "[\"quantity_tiers\",\"multi_product\",\"mix_match\",\"byob\",\"subscription\"]" }] },
|
|
9
|
+
{ "key": "bundle_pricing_model", "name": "Bundle pricing model", "type": "single_line_text_field", "validations": [{ "name": "choices", "value": "[\"tier_quantity\",\"fixed_price\",\"fixed_bundle_price\",\"percent_off_subtotal\",\"dollar_off_subtotal\"]" }] },
|
|
10
10
|
{ "key": "bundle_pricing_value", "name": "Bundle pricing value (JSON)", "type": "json", "description": "Shape varies by pricing_model. See spec.md section 2.2." },
|
|
11
11
|
{ "key": "bundle_components", "name": "Bundle components (JSON)", "type": "json", "description": "Required for multi_product / mix_match. Array of {product_handle, qty}." },
|
|
12
|
-
{ "key": "bundle_quantity_tiers", "name": "Bundle quantity tiers (JSON)", "type": "json", "description": "Required for quantity_tiers. Array of {qty, discount_pct}.
|
|
12
|
+
{ "key": "bundle_quantity_tiers", "name": "Bundle quantity tiers (JSON)", "type": "json", "description": "Required for quantity_tiers. Array of {qty, discount_pct, label?, popular?, free_shipping?, free_gift?}. label is the visible row label (e.g. '2x Sculpting Brush'); falls back to '{qty}x {product.title}' when absent. popular adds the MOST POPULAR badge. free_shipping shows the FREE SHIPPING tag on that tier. free_gift means buying this tier appends the bundle_free_gift_handle product as a $0 line item via ATC." },
|
|
13
13
|
{ "key": "bundle_show_in_catalog", "name": "Show in main catalog", "type": "boolean", "default": true },
|
|
14
14
|
{ "key": "bundle_surfaces_enabled", "name": "Surfaces enabled (JSON)", "type": "json", "description": "Per-bundle surface allowlist. Array of 1..6. Absent = all enabled at tenant level." },
|
|
15
15
|
{ "key": "bundle_copy", "name": "Per-surface copy (JSON)", "type": "json", "description": "Per-surface eyebrow/heading/cta overrides." },
|
|
@@ -21,6 +21,15 @@
|
|
|
21
21
|
{ "key": "bundle_cross_supplier", "name": "Cross-supplier", "type": "boolean", "default": false },
|
|
22
22
|
{ "key": "bundle_supplier_count", "name": "Supplier count", "type": "number_integer" },
|
|
23
23
|
{ "key": "bundle_savings_pct", "name": "Computed savings percent", "type": "number_decimal", "description": "Precomputed for fast banner / card render. Recomputed by runwell-shopify rebuild-bundle-index." },
|
|
24
|
+
{ "key": "bundle_sale_prefix", "name": "Sale prefix (Mode A)", "type": "single_line_text_field", "description": "Subheading copy displayed under the product title on Mode A quantity-tier surfaces. Example: 'Spring Sculpting Sale: Ends June 5'." },
|
|
25
|
+
{ "key": "bundle_rating_score", "name": "Rating score display", "type": "single_line_text_field", "description": "Rating string shown above the title (e.g. '4.8/5'). Display-only; not wired to a review provider for v1." },
|
|
26
|
+
{ "key": "bundle_rating_count", "name": "Rating count display", "type": "single_line_text_field", "description": "Review count string shown next to the rating score (e.g. '2,400+ Reviews')." },
|
|
27
|
+
{ "key": "bundle_byob_candidates", "name": "BYOB candidates", "type": "list.product_reference", "description": "Mode C only. Pool of candidate products the customer can pick from.", "v1_5": true },
|
|
28
|
+
{ "key": "bundle_byob_min_picks", "name": "BYOB min picks", "type": "number_integer", "description": "Mode C only. Minimum required selections before ATC enables.", "v1_5": true },
|
|
29
|
+
{ "key": "bundle_byob_max_picks", "name": "BYOB max picks", "type": "number_integer", "description": "Mode C only. Maximum allowed selections.", "v1_5": true },
|
|
30
|
+
{ "key": "bundle_byob_layout", "name": "BYOB picker layout", "type": "single_line_text_field", "validations": [{ "name": "choices", "value": "[\"grid\",\"accordion\",\"radio\"]" }], "description": "Mode C only. Default grid.", "v1_5": true },
|
|
31
|
+
{ "key": "bundle_byob_categories", "name": "BYOB categories", "type": "json", "description": "Mode C only. Optional. Array of {label, handles: [product_handle]} to group candidates.", "v1_5": true },
|
|
32
|
+
{ "key": "bundle_byob_required_handles", "name": "BYOB required handles", "type": "list.product_reference", "description": "Mode C only. Pre-selected, not deselectable.", "v1_5": true },
|
|
24
33
|
{ "key": "subscription_enabled", "name": "Subscription enabled (v2)", "type": "boolean", "default": false, "v2_only": true },
|
|
25
34
|
{ "key": "subscription_interval", "name": "Subscription interval (JSON, v2)", "type": "json", "v2_only": true },
|
|
26
35
|
{ "key": "subscription_discount_pct", "name": "Subscription discount percent (v2)", "type": "number_decimal", "v2_only": true },
|
|
@@ -40,6 +49,9 @@
|
|
|
40
49
|
"cross_field_validation": [
|
|
41
50
|
{ "rule": "bundle_quantity_tiers required when bundle_mode == 'quantity_tiers'", "enforced_by": "runwell-shopify qa --bundles" },
|
|
42
51
|
{ "rule": "bundle_components required when bundle_mode in ['multi_product','mix_match']", "enforced_by": "runwell-shopify qa --bundles" },
|
|
52
|
+
{ "rule": "bundle_byob_candidates + bundle_byob_min_picks + bundle_byob_max_picks required when bundle_mode == 'byob'", "enforced_by": "runwell-shopify qa --bundles" },
|
|
53
|
+
{ "rule": "bundle_byob_min_picks <= bundle_byob_max_picks", "enforced_by": "runwell-shopify qa --bundles" },
|
|
54
|
+
{ "rule": "bundle_byob_layout == 'radio' requires bundle_byob_categories", "enforced_by": "runwell-shopify qa --bundles" },
|
|
43
55
|
{ "rule": "bundle_pricing_value shape matches bundle_pricing_model (see spec.md section 2.2)", "enforced_by": "runwell-shopify qa --bundles" },
|
|
44
56
|
{ "rule": "bundle_free_gift_handle required when bundle_free_gift_enabled == true", "enforced_by": "runwell-shopify qa --bundles" }
|
|
45
57
|
]
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
.runwell-bundle-quantity-builder__grid {
|
|
2
|
+
display: grid;
|
|
3
|
+
grid-template-columns: 1fr 1fr;
|
|
4
|
+
gap: 2.4rem;
|
|
5
|
+
align-items: start;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* Slideshow Gallery */
|
|
9
|
+
.runwell-bundle-quantity-builder__slideshow {
|
|
10
|
+
position: relative;
|
|
11
|
+
border-radius: 12px;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
background: #E8D5C4;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.runwell-bundle-quantity-builder__slide {
|
|
17
|
+
display: none;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.runwell-bundle-quantity-builder__slide--active {
|
|
21
|
+
display: block;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.runwell-bundle-quantity-builder__img {
|
|
25
|
+
width: 100%;
|
|
26
|
+
height: auto;
|
|
27
|
+
display: block;
|
|
28
|
+
aspect-ratio: 1 / 1;
|
|
29
|
+
object-fit: cover;
|
|
30
|
+
max-height: calc(100vh - 260px);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Thumbnail Strip - ALWAYS visible including mobile */
|
|
34
|
+
.runwell-bundle-quantity-builder__thumbnails {
|
|
35
|
+
display: flex;
|
|
36
|
+
gap: 8px;
|
|
37
|
+
margin-top: 12px;
|
|
38
|
+
overflow-x: auto;
|
|
39
|
+
scrollbar-width: thin;
|
|
40
|
+
scrollbar-color: #EADFD4 transparent;
|
|
41
|
+
padding-bottom: 4px;
|
|
42
|
+
-webkit-overflow-scrolling: touch;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.runwell-bundle-quantity-builder__thumbnails::-webkit-scrollbar {
|
|
46
|
+
height: 4px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.runwell-bundle-quantity-builder__thumbnails::-webkit-scrollbar-thumb {
|
|
50
|
+
background: #EADFD4;
|
|
51
|
+
border-radius: 2px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.runwell-bundle-quantity-builder__thumb {
|
|
55
|
+
flex: 0 0 72px;
|
|
56
|
+
height: 72px;
|
|
57
|
+
border-radius: 8px;
|
|
58
|
+
overflow: hidden;
|
|
59
|
+
border: 2px solid transparent;
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
padding: 0;
|
|
62
|
+
background: #E8D5C4;
|
|
63
|
+
transition: border-color 0.2s, opacity 0.2s;
|
|
64
|
+
opacity: 0.7;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.runwell-bundle-quantity-builder__thumb--active {
|
|
68
|
+
border-color: #3F5B4C;
|
|
69
|
+
opacity: 1;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.runwell-bundle-quantity-builder__thumb:hover {
|
|
73
|
+
opacity: 1;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.runwell-bundle-quantity-builder__thumb img {
|
|
77
|
+
width: 100%;
|
|
78
|
+
height: 100%;
|
|
79
|
+
object-fit: cover;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Rating */
|
|
83
|
+
.runwell-bundle-quantity-builder__rating {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 8px;
|
|
87
|
+
margin-bottom: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.runwell-bundle-quantity-builder__stars {
|
|
91
|
+
color: #E8B931;
|
|
92
|
+
font-size: calc(var(--font-body-scale) * 1.6rem);
|
|
93
|
+
letter-spacing: 1px;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.runwell-bundle-quantity-builder__rating-text {
|
|
97
|
+
font-size: calc(var(--font-body-scale) * 1.4rem);
|
|
98
|
+
font-weight: 600;
|
|
99
|
+
font-style: italic;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Title */
|
|
103
|
+
.runwell-bundle-quantity-builder__title {
|
|
104
|
+
margin-top: 0.4rem;
|
|
105
|
+
margin-bottom: 1rem;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Sale heading */
|
|
109
|
+
.runwell-bundle-quantity-builder__sale-heading {
|
|
110
|
+
display: flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
gap: 1.2rem;
|
|
113
|
+
margin-bottom: 1.2rem;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.runwell-bundle-quantity-builder__sale-line {
|
|
117
|
+
flex: 1;
|
|
118
|
+
height: 1px;
|
|
119
|
+
background: #2A2622;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.runwell-bundle-quantity-builder__sale-text {
|
|
123
|
+
font-weight: 700;
|
|
124
|
+
font-size: calc(var(--font-body-scale) * 1.5rem);
|
|
125
|
+
white-space: nowrap;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Scarcity indicator */
|
|
129
|
+
.runwell-bundle-quantity-builder__scarcity {
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
justify-content: center;
|
|
133
|
+
gap: 6px;
|
|
134
|
+
font-size: calc(var(--font-body-scale) * 1.3rem);
|
|
135
|
+
font-weight: 500;
|
|
136
|
+
color: #b45309;
|
|
137
|
+
margin-bottom: 1rem;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.runwell-bundle-quantity-builder__scarcity-dot {
|
|
141
|
+
width: 8px;
|
|
142
|
+
height: 8px;
|
|
143
|
+
border-radius: 50%;
|
|
144
|
+
background: #b45309;
|
|
145
|
+
animation: scarcity-pulse 2s ease-in-out infinite;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@keyframes scarcity-pulse {
|
|
149
|
+
0%, 100% { opacity: 1; }
|
|
150
|
+
50% { opacity: 0.4; }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Options */
|
|
154
|
+
.runwell-bundle-quantity-builder__options {
|
|
155
|
+
display: flex;
|
|
156
|
+
flex-direction: column;
|
|
157
|
+
gap: 10px;
|
|
158
|
+
margin-bottom: 1.2rem;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.runwell-bundle-quantity-builder__option {
|
|
162
|
+
display: flex;
|
|
163
|
+
align-items: flex-start;
|
|
164
|
+
gap: 12px;
|
|
165
|
+
padding: 14px 18px;
|
|
166
|
+
border: 2px solid #EADFD4;
|
|
167
|
+
border-radius: 10px;
|
|
168
|
+
cursor: pointer;
|
|
169
|
+
transition: border-color 0.2s, box-shadow 0.2s;
|
|
170
|
+
position: relative;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.runwell-bundle-quantity-builder__option:hover {
|
|
174
|
+
border-color: #3F5B4C;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.runwell-bundle-quantity-builder__option--selected {
|
|
178
|
+
border-color: #2A2622;
|
|
179
|
+
box-shadow: 0 0 0 1px #2A2622;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.runwell-bundle-quantity-builder__option--popular {
|
|
183
|
+
border-color: #3F5B4C;
|
|
184
|
+
position: relative;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.runwell-bundle-quantity-builder__popular-badge {
|
|
188
|
+
position: absolute;
|
|
189
|
+
top: -10px;
|
|
190
|
+
right: 16px;
|
|
191
|
+
background: #3F5B4C;
|
|
192
|
+
color: #fff;
|
|
193
|
+
font-size: var(--runwell-body-size);
|
|
194
|
+
font-weight: 700;
|
|
195
|
+
padding: 2px 10px;
|
|
196
|
+
border-radius: 4px;
|
|
197
|
+
letter-spacing: 0.06em;
|
|
198
|
+
text-transform: uppercase;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.runwell-bundle-quantity-builder__option input {
|
|
202
|
+
position: absolute;
|
|
203
|
+
opacity: 0;
|
|
204
|
+
pointer-events: none;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.runwell-bundle-quantity-builder__option-radio {
|
|
208
|
+
width: 22px;
|
|
209
|
+
height: 22px;
|
|
210
|
+
border-radius: 50%;
|
|
211
|
+
border: 2px solid #EADFD4;
|
|
212
|
+
flex-shrink: 0;
|
|
213
|
+
margin-top: 2px;
|
|
214
|
+
display: flex;
|
|
215
|
+
align-items: center;
|
|
216
|
+
justify-content: center;
|
|
217
|
+
transition: border-color 0.2s;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.runwell-bundle-quantity-builder__option--selected .runwell-bundle-quantity-builder__option-radio {
|
|
221
|
+
border-color: #2A2622;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.runwell-bundle-quantity-builder__option--selected .runwell-bundle-quantity-builder__option-radio::after {
|
|
225
|
+
content: '';
|
|
226
|
+
width: 12px;
|
|
227
|
+
height: 12px;
|
|
228
|
+
border-radius: 50%;
|
|
229
|
+
background: #2A2622;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.runwell-bundle-quantity-builder__option-content {
|
|
233
|
+
flex: 1;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.runwell-bundle-quantity-builder__option-header {
|
|
237
|
+
display: flex;
|
|
238
|
+
justify-content: space-between;
|
|
239
|
+
align-items: baseline;
|
|
240
|
+
gap: 12px;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.runwell-bundle-quantity-builder__option-title {
|
|
244
|
+
font-weight: 700;
|
|
245
|
+
font-size: calc(var(--font-heading-scale) * 1.5rem);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.runwell-bundle-quantity-builder__option-pricing {
|
|
249
|
+
display: flex;
|
|
250
|
+
align-items: baseline;
|
|
251
|
+
gap: 8px;
|
|
252
|
+
flex-shrink: 0;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.runwell-bundle-quantity-builder__option-price {
|
|
256
|
+
font-weight: 700;
|
|
257
|
+
font-size: calc(var(--font-body-scale) * 1.8rem);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.runwell-bundle-quantity-builder__option-compare {
|
|
261
|
+
font-size: calc(var(--font-body-scale) * 1.3rem);
|
|
262
|
+
text-decoration: line-through;
|
|
263
|
+
opacity: 0.5;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.runwell-bundle-quantity-builder__option-badges {
|
|
267
|
+
display: flex;
|
|
268
|
+
gap: 6px;
|
|
269
|
+
margin-top: 6px;
|
|
270
|
+
flex-wrap: wrap;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.runwell-bundle-quantity-builder__badge {
|
|
274
|
+
font-size: calc(var(--font-body-scale) * 1.1rem);
|
|
275
|
+
font-weight: 700;
|
|
276
|
+
padding: 2px 8px;
|
|
277
|
+
border-radius: 4px;
|
|
278
|
+
text-transform: uppercase;
|
|
279
|
+
letter-spacing: 0.03em;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.runwell-bundle-quantity-builder__badge--save {
|
|
283
|
+
background: #3F5B4C;
|
|
284
|
+
color: #fff;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.runwell-bundle-quantity-builder__badge--shipping {
|
|
288
|
+
color: #3F5B4C;
|
|
289
|
+
font-weight: 600;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.runwell-bundle-quantity-builder__free-gift {
|
|
293
|
+
display: flex;
|
|
294
|
+
align-items: center;
|
|
295
|
+
gap: 6px;
|
|
296
|
+
margin-top: 8px;
|
|
297
|
+
padding: 8px 12px;
|
|
298
|
+
background: rgba(63, 91, 76, 0.06);
|
|
299
|
+
border-radius: 6px;
|
|
300
|
+
font-size: calc(var(--font-body-scale) * 1.3rem);
|
|
301
|
+
font-weight: 600;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.runwell-bundle-quantity-builder__gift-icon {
|
|
305
|
+
font-size: calc(var(--font-body-scale) * 1.6rem);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* ATC Button */
|
|
309
|
+
.runwell-bundle-quantity-builder__atc {
|
|
310
|
+
width: 100%;
|
|
311
|
+
padding: 1.6rem;
|
|
312
|
+
font-size: calc(var(--font-body-scale) * 1.6rem);
|
|
313
|
+
font-weight: 700;
|
|
314
|
+
letter-spacing: 0.06em;
|
|
315
|
+
text-transform: uppercase;
|
|
316
|
+
background: #2A2622;
|
|
317
|
+
color: #fff;
|
|
318
|
+
border: none;
|
|
319
|
+
border-radius: 8px;
|
|
320
|
+
cursor: pointer;
|
|
321
|
+
transition: background 0.2s;
|
|
322
|
+
margin-bottom: 1.2rem;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.runwell-bundle-quantity-builder__atc:hover {
|
|
326
|
+
background: #3F5B4C;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* Trust badges */
|
|
330
|
+
.runwell-bundle-quantity-builder__trust {
|
|
331
|
+
display: flex;
|
|
332
|
+
justify-content: center;
|
|
333
|
+
gap: 2rem;
|
|
334
|
+
font-size: calc(var(--font-body-scale) * 1.3rem);
|
|
335
|
+
opacity: 0.7;
|
|
336
|
+
flex-wrap: wrap;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/* Sticky ATC on mobile */
|
|
340
|
+
@media screen and (max-width: 989px) {
|
|
341
|
+
.runwell-bundle-quantity-builder__grid {
|
|
342
|
+
grid-template-columns: 1fr;
|
|
343
|
+
gap: 2rem;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.runwell-bundle-quantity-builder__atc-wrap {
|
|
347
|
+
position: sticky;
|
|
348
|
+
bottom: 0;
|
|
349
|
+
z-index: 10;
|
|
350
|
+
background: #fff;
|
|
351
|
+
padding: 12px 0 max(12px, env(safe-area-inset-bottom));
|
|
352
|
+
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.08);
|
|
353
|
+
margin: 0 -1.5rem;
|
|
354
|
+
padding-left: 1.5rem;
|
|
355
|
+
padding-right: 1.5rem;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
@media screen and (max-width: 749px) {
|
|
360
|
+
.runwell-bundle-quantity-builder__option-header {
|
|
361
|
+
flex-direction: column;
|
|
362
|
+
gap: 4px;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.runwell-bundle-quantity-builder__trust {
|
|
366
|
+
flex-direction: column;
|
|
367
|
+
align-items: center;
|
|
368
|
+
gap: 0.6rem;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/* Runwell additions: placeholder states when gallery is empty */
|
|
373
|
+
.runwell-bundle-quantity-builder__img--placeholder,
|
|
374
|
+
.runwell-bundle-quantity-builder__thumb-img--placeholder {
|
|
375
|
+
width: 100%;
|
|
376
|
+
height: 100%;
|
|
377
|
+
min-height: 320px;
|
|
378
|
+
background: linear-gradient(135deg, var(--runwell-oat, #F5F0EE), var(--runwell-cream, #EDE6D8));
|
|
379
|
+
display: block;
|
|
380
|
+
}
|
|
381
|
+
.runwell-bundle-quantity-builder__thumb-img--placeholder {
|
|
382
|
+
min-height: 0;
|
|
383
|
+
}
|