@runwell/shopify-toolkit 0.18.0 → 0.23.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 (37) hide show
  1. package/bin/runwell-shopify +10 -1
  2. package/lib/init.js +13 -2
  3. package/lib/list.js +22 -9
  4. package/lib/qa-bundles.js +117 -0
  5. package/lib/qa.js +147 -13
  6. package/modules/INDEX.md +14 -5
  7. package/modules/bundle-builder/README.md +6 -1
  8. package/modules/bundle-builder/module.json +5 -1
  9. package/modules/cart-cross-sell/snippets/runwell-cart-xsell.liquid +16 -0
  10. package/modules/runwell-bundle-system/README.md +35 -0
  11. package/modules/runwell-bundle-system/admin-metafields.json +55 -0
  12. package/modules/runwell-bundle-system/assets/runwell-bundle-system.css +1107 -0
  13. package/modules/runwell-bundle-system/assets/runwell-bundle-system.js +444 -0
  14. package/modules/runwell-bundle-system/module.json +137 -0
  15. package/modules/runwell-bundle-system/qa/mobile-checklist.md +105 -0
  16. package/modules/runwell-bundle-system/qa/v1.5-mobile-qa-checklist.md +103 -0
  17. package/modules/runwell-bundle-system/sections/runwell-bundle-cart-xsell.liquid +59 -0
  18. package/modules/runwell-bundle-system/sections/runwell-bundle-collection.liquid +121 -0
  19. package/modules/runwell-bundle-system/sections/runwell-bundle-home-stacks.liquid +77 -0
  20. package/modules/runwell-bundle-system/sections/runwell-bundle-pdp-banner.liquid +50 -0
  21. package/modules/runwell-bundle-system/sections/runwell-bundle-pdp-pairs-with.liquid +72 -0
  22. package/modules/runwell-bundle-system/sections/runwell-bundle-pdp.liquid +117 -0
  23. package/modules/runwell-bundle-system/settings.json +25 -0
  24. package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker-accordion.liquid +84 -0
  25. package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker-grid.liquid +72 -0
  26. package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker-radio.liquid +77 -0
  27. package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-picker.liquid +71 -0
  28. package/modules/runwell-bundle-system/snippets/runwell-bundle-byob-summary.liquid +39 -0
  29. package/modules/runwell-bundle-system/snippets/runwell-bundle-card.liquid +70 -0
  30. package/modules/runwell-bundle-system/snippets/runwell-bundle-cross-supplier.liquid +18 -0
  31. package/modules/runwell-bundle-system/snippets/runwell-bundle-data.liquid +75 -0
  32. package/modules/runwell-bundle-system/snippets/runwell-bundle-fomo.liquid +32 -0
  33. package/modules/runwell-bundle-system/snippets/runwell-bundle-free-gift.liquid +34 -0
  34. package/modules/runwell-bundle-system/snippets/runwell-bundle-multi-product.liquid +86 -0
  35. package/modules/runwell-bundle-system/snippets/runwell-bundle-pricing.liquid +30 -0
  36. package/modules/runwell-bundle-system/snippets/runwell-bundle-quantity-tiers.liquid +73 -0
  37. package/package.json +1 -1
@@ -0,0 +1,1107 @@
1
+ /* runwell-bundle-system: assets/runwell-bundle-system.css.
2
+ Styles for the bundle PDP and shared bundle UI. Scoped to the
3
+ .runwell-bundle-system namespace. Brand tokens come from
4
+ _shared/css-tokens (--runwell-primary, --runwell-accent,
5
+ --runwell-cream, --runwell-oat, --runwell-celadon, --runwell-blue,
6
+ --runwell-tertiary, plus radii and shadows).
7
+
8
+ Layout: mobile first at 375px, side-by-side at 1024px+.
9
+ Tap targets: 44px floor for any interactive element. */
10
+
11
+ .runwell-bundle-system {
12
+ font-family: inherit;
13
+ color: inherit;
14
+ }
15
+
16
+ .runwell-bundle-system__inner {
17
+ display: grid;
18
+ grid-template-columns: 1fr;
19
+ gap: 24px;
20
+ }
21
+
22
+ @media (min-width: 1024px) {
23
+ .runwell-bundle-system__inner {
24
+ grid-template-columns: 1fr 1fr;
25
+ gap: 48px;
26
+ align-items: start;
27
+ }
28
+ }
29
+
30
+ .runwell-bundle-system__gallery-image {
31
+ width: 100%;
32
+ height: auto;
33
+ border-radius: var(--runwell-radius-md, 12px);
34
+ display: block;
35
+ }
36
+
37
+ .runwell-bundle-system__details {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: 16px;
41
+ }
42
+
43
+ .runwell-bundle-system__sale-prefix {
44
+ margin: 0;
45
+ font-size: 0.875rem;
46
+ letter-spacing: 0.06em;
47
+ text-transform: uppercase;
48
+ color: var(--runwell-accent, currentColor);
49
+ }
50
+
51
+ .runwell-bundle-system__title {
52
+ margin: 0;
53
+ font-size: 1.75rem;
54
+ line-height: 1.2;
55
+ }
56
+
57
+ @media (min-width: 768px) {
58
+ .runwell-bundle-system__title {
59
+ font-size: 2.25rem;
60
+ }
61
+ }
62
+
63
+ .runwell-bundle-system__description {
64
+ margin: 0;
65
+ font-size: 1rem;
66
+ line-height: 1.5;
67
+ opacity: 0.85;
68
+ }
69
+
70
+ /* ---------- Quantity tiers (Mode A) ---------- */
71
+
72
+ .runwell-bundle-system__form {
73
+ margin: 0;
74
+ display: flex;
75
+ flex-direction: column;
76
+ gap: 16px;
77
+ }
78
+
79
+ .runwell-bundle-system__tiers {
80
+ border: 0;
81
+ padding: 0;
82
+ margin: 0;
83
+ display: flex;
84
+ flex-direction: column;
85
+ gap: 12px;
86
+ }
87
+
88
+ .runwell-bundle-system__tier {
89
+ position: relative;
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: 8px;
93
+ padding: 16px;
94
+ min-height: 44px;
95
+ border: 2px solid color-mix(in srgb, currentColor 12%, transparent);
96
+ border-radius: var(--runwell-radius-md, 12px);
97
+ background: var(--runwell-surface-card, #fff);
98
+ cursor: pointer;
99
+ transition: border-color 120ms ease, background 120ms ease;
100
+ }
101
+
102
+ .runwell-bundle-system__tier:hover {
103
+ border-color: color-mix(in srgb, var(--runwell-accent, currentColor) 50%, transparent);
104
+ }
105
+
106
+ .runwell-bundle-system__tier-input {
107
+ position: absolute;
108
+ opacity: 0;
109
+ pointer-events: none;
110
+ }
111
+
112
+ .runwell-bundle-system__tier:has(.runwell-bundle-system__tier-input:checked) {
113
+ border-color: var(--runwell-accent, currentColor);
114
+ background: color-mix(in srgb, var(--runwell-accent, currentColor) 6%, var(--runwell-surface-card, #fff));
115
+ }
116
+
117
+ .runwell-bundle-system__tier-row {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 12px;
121
+ flex-wrap: wrap;
122
+ }
123
+
124
+ .runwell-bundle-system__tier-row--prices {
125
+ justify-content: space-between;
126
+ font-size: 0.95rem;
127
+ }
128
+
129
+ .runwell-bundle-system__tier-qty {
130
+ font-weight: 600;
131
+ font-size: 1rem;
132
+ }
133
+
134
+ .runwell-bundle-system__tier-savings-badge {
135
+ margin-left: auto;
136
+ padding: 4px 10px;
137
+ font-size: 0.8rem;
138
+ font-weight: 600;
139
+ border-radius: 999px;
140
+ background: var(--runwell-accent, currentColor);
141
+ color: var(--runwell-cream, #fff);
142
+ }
143
+
144
+ .runwell-bundle-system__tier-total {
145
+ font-weight: 700;
146
+ font-size: 1.05rem;
147
+ }
148
+
149
+ .runwell-bundle-system__tier-strikethrough {
150
+ text-decoration: line-through;
151
+ opacity: 0.55;
152
+ font-size: 0.9rem;
153
+ }
154
+
155
+ .runwell-bundle-system__tier-per-unit {
156
+ font-size: 0.85rem;
157
+ opacity: 0.7;
158
+ margin-left: auto;
159
+ }
160
+
161
+ .runwell-bundle-system__atc {
162
+ min-height: 48px;
163
+ font-size: 1rem;
164
+ font-weight: 600;
165
+ cursor: pointer;
166
+ }
167
+
168
+ /* ---------- Pricing block (shared, used by Mode B and bundle cards) ---------- */
169
+
170
+ .runwell-bundle-system__pricing {
171
+ display: flex;
172
+ align-items: baseline;
173
+ gap: 12px;
174
+ flex-wrap: wrap;
175
+ }
176
+
177
+ .runwell-bundle-system__pricing-current {
178
+ font-size: 1.5rem;
179
+ font-weight: 700;
180
+ }
181
+
182
+ .runwell-bundle-system__pricing-strikethrough {
183
+ text-decoration: line-through;
184
+ opacity: 0.55;
185
+ font-size: 1rem;
186
+ }
187
+
188
+ .runwell-bundle-system__pricing-badge {
189
+ padding: 4px 10px;
190
+ font-size: 0.8rem;
191
+ font-weight: 600;
192
+ border-radius: 999px;
193
+ background: var(--runwell-accent, currentColor);
194
+ color: var(--runwell-cream, #fff);
195
+ }
196
+
197
+ /* ---------- Components list (Mode B) ---------- */
198
+
199
+ .runwell-bundle-system__components {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: 8px;
203
+ padding: 16px;
204
+ border-radius: var(--runwell-radius-md, 12px);
205
+ background: var(--runwell-surface-card, #fff);
206
+ border: 1px solid color-mix(in srgb, currentColor 8%, transparent);
207
+ }
208
+
209
+ .runwell-bundle-system__components-heading {
210
+ margin: 0 0 4px 0;
211
+ font-size: 0.85rem;
212
+ font-weight: 600;
213
+ letter-spacing: 0.04em;
214
+ text-transform: uppercase;
215
+ opacity: 0.75;
216
+ }
217
+
218
+ .runwell-bundle-system__components-list {
219
+ list-style: none;
220
+ margin: 0;
221
+ padding: 0;
222
+ display: flex;
223
+ flex-direction: column;
224
+ gap: 10px;
225
+ }
226
+
227
+ .runwell-bundle-system__component {
228
+ display: grid;
229
+ grid-template-columns: auto auto 1fr auto;
230
+ align-items: center;
231
+ gap: 10px;
232
+ font-size: 0.95rem;
233
+ }
234
+
235
+ .runwell-bundle-system__component-thumb {
236
+ width: 60px;
237
+ height: 60px;
238
+ object-fit: cover;
239
+ border-radius: var(--runwell-radius-sm, 4px);
240
+ display: block;
241
+ }
242
+
243
+ .runwell-bundle-system__component-thumb--placeholder {
244
+ background: color-mix(in srgb, currentColor 6%, transparent);
245
+ }
246
+
247
+ .runwell-bundle-system__component-qty {
248
+ font-weight: 700;
249
+ font-variant-numeric: tabular-nums;
250
+ opacity: 0.8;
251
+ }
252
+
253
+ .runwell-bundle-system__component-name {
254
+ font-weight: 500;
255
+ line-height: 1.3;
256
+ }
257
+
258
+ .runwell-bundle-system__component-price {
259
+ font-weight: 600;
260
+ font-variant-numeric: tabular-nums;
261
+ }
262
+
263
+ .runwell-bundle-system__component--empty {
264
+ grid-template-columns: 1fr;
265
+ opacity: 0.7;
266
+ font-size: 0.9rem;
267
+ }
268
+
269
+ @media (min-width: 1024px) {
270
+ .runwell-bundle-system__component-thumb,
271
+ .runwell-bundle-system__component-thumb--placeholder {
272
+ width: 80px;
273
+ height: 80px;
274
+ }
275
+ }
276
+
277
+ /* ---------- Cross-supplier disclosure ---------- */
278
+
279
+ .runwell-bundle-system__cross-supplier {
280
+ display: flex;
281
+ align-items: flex-start;
282
+ gap: 10px;
283
+ margin: 0;
284
+ padding: 10px 12px;
285
+ border-radius: var(--runwell-radius-sm, 4px);
286
+ background: color-mix(in srgb, var(--runwell-blue, currentColor) 8%, transparent);
287
+ font-size: 0.85rem;
288
+ line-height: 1.4;
289
+ }
290
+
291
+ .runwell-bundle-system__cross-supplier-icon {
292
+ display: inline-flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ width: 18px;
296
+ height: 18px;
297
+ border-radius: 50%;
298
+ background: var(--runwell-blue, currentColor);
299
+ color: var(--runwell-cream, #fff);
300
+ font-size: 0.75rem;
301
+ font-weight: 700;
302
+ flex-shrink: 0;
303
+ }
304
+
305
+ /* ---------- FOMO ---------- */
306
+
307
+ .runwell-bundle-system__fomo {
308
+ display: flex;
309
+ flex-direction: column;
310
+ gap: 6px;
311
+ padding: 12px 14px;
312
+ border-radius: var(--runwell-radius-sm, 4px);
313
+ background: color-mix(in srgb, var(--runwell-accent, currentColor) 8%, transparent);
314
+ font-size: 0.9rem;
315
+ }
316
+
317
+ .runwell-bundle-system__fomo p {
318
+ margin: 0;
319
+ }
320
+
321
+ .runwell-bundle-system__fomo-label {
322
+ opacity: 0.75;
323
+ margin-right: 6px;
324
+ }
325
+
326
+ .runwell-bundle-system__fomo-time {
327
+ font-weight: 600;
328
+ font-variant-numeric: tabular-nums;
329
+ }
330
+
331
+ .runwell-bundle-system__fomo-scarcity strong {
332
+ color: var(--runwell-accent, currentColor);
333
+ }
334
+
335
+ /* ---------- Free gift ---------- */
336
+
337
+ .runwell-bundle-system__free-gift {
338
+ display: flex;
339
+ flex-direction: column;
340
+ gap: 8px;
341
+ padding: 12px 14px;
342
+ border-radius: var(--runwell-radius-md, 12px);
343
+ background: var(--runwell-surface-card-alt, #f5f5f5);
344
+ }
345
+
346
+ .runwell-bundle-system__free-gift-label {
347
+ margin: 0;
348
+ font-size: 0.85rem;
349
+ font-weight: 600;
350
+ letter-spacing: 0.04em;
351
+ text-transform: uppercase;
352
+ }
353
+
354
+ .runwell-bundle-system__free-gift-product {
355
+ display: flex;
356
+ align-items: center;
357
+ gap: 12px;
358
+ }
359
+
360
+ .runwell-bundle-system__free-gift-thumb {
361
+ width: 60px;
362
+ height: 60px;
363
+ object-fit: cover;
364
+ border-radius: var(--runwell-radius-sm, 4px);
365
+ }
366
+
367
+ .runwell-bundle-system__free-gift-name {
368
+ flex: 1;
369
+ font-size: 0.95rem;
370
+ }
371
+
372
+ .runwell-bundle-system__free-gift-price {
373
+ display: flex;
374
+ align-items: baseline;
375
+ gap: 6px;
376
+ font-size: 0.95rem;
377
+ }
378
+
379
+ /* ---------- Empty state ---------- */
380
+
381
+ .runwell-bundle-system__empty {
382
+ margin: 0;
383
+ padding: 16px;
384
+ border-radius: var(--runwell-radius-md, 12px);
385
+ background: var(--runwell-surface-card-alt, #f5f5f5);
386
+ font-size: 0.95rem;
387
+ opacity: 0.75;
388
+ }
389
+
390
+ /* ---------- Bundle card (shared by surfaces 1, 2, 3, 4, 6) ---------- */
391
+
392
+ .runwell-bundle-card {
393
+ display: flex;
394
+ flex-direction: column;
395
+ gap: 12px;
396
+ padding: 12px;
397
+ border-radius: var(--runwell-radius-md, 12px);
398
+ background: var(--runwell-surface-card, #fff);
399
+ text-decoration: none;
400
+ color: inherit;
401
+ transition: transform 200ms ease, box-shadow 200ms ease;
402
+ box-shadow: var(--runwell-shadow-card, 0 2px 8px rgba(0, 0, 0, 0.04));
403
+ }
404
+
405
+ .runwell-bundle-card:hover {
406
+ transform: translateY(-2px);
407
+ box-shadow: var(--runwell-shadow-elevated, 0 8px 24px rgba(0, 0, 0, 0.06));
408
+ }
409
+
410
+ .runwell-bundle-card__media {
411
+ position: relative;
412
+ border-radius: var(--runwell-radius-sm, 4px);
413
+ overflow: hidden;
414
+ aspect-ratio: 1 / 1;
415
+ }
416
+
417
+ .runwell-bundle-card__image {
418
+ width: 100%;
419
+ height: 100%;
420
+ object-fit: cover;
421
+ display: block;
422
+ }
423
+
424
+ .runwell-bundle-card__badge {
425
+ position: absolute;
426
+ top: 8px;
427
+ right: 8px;
428
+ padding: 4px 10px;
429
+ font-size: 0.75rem;
430
+ font-weight: 600;
431
+ border-radius: 999px;
432
+ background: var(--runwell-accent, currentColor);
433
+ color: var(--runwell-cream, #fff);
434
+ }
435
+
436
+ .runwell-bundle-card__badge--inline {
437
+ position: static;
438
+ font-size: 0.7rem;
439
+ }
440
+
441
+ .runwell-bundle-card__body {
442
+ display: flex;
443
+ flex-direction: column;
444
+ gap: 6px;
445
+ }
446
+
447
+ .runwell-bundle-card__title {
448
+ margin: 0;
449
+ font-size: 1.05rem;
450
+ font-weight: 600;
451
+ line-height: 1.3;
452
+ }
453
+
454
+ .runwell-bundle-card__meta {
455
+ margin: 0;
456
+ font-size: 0.8rem;
457
+ opacity: 0.7;
458
+ }
459
+
460
+ .runwell-bundle-card__price-row {
461
+ display: flex;
462
+ align-items: baseline;
463
+ gap: 8px;
464
+ flex-wrap: wrap;
465
+ font-size: 0.95rem;
466
+ }
467
+
468
+ .runwell-bundle-card__price {
469
+ font-weight: 700;
470
+ }
471
+
472
+ .runwell-bundle-card__strikethrough {
473
+ text-decoration: line-through;
474
+ opacity: 0.55;
475
+ font-size: 0.85rem;
476
+ }
477
+
478
+ .runwell-bundle-card__cta {
479
+ margin-top: 4px;
480
+ font-size: 0.85rem;
481
+ text-align: center;
482
+ padding: 8px 12px;
483
+ min-height: 40px;
484
+ }
485
+
486
+ /* Card variants */
487
+ .runwell-bundle-card--compact {
488
+ padding: 10px;
489
+ }
490
+
491
+ .runwell-bundle-card--compact .runwell-bundle-card__title {
492
+ font-size: 0.95rem;
493
+ }
494
+
495
+ .runwell-bundle-card--hero .runwell-bundle-card__title {
496
+ font-size: 1.25rem;
497
+ }
498
+
499
+ .runwell-bundle-card--hero .runwell-bundle-card__media {
500
+ aspect-ratio: 4 / 3;
501
+ }
502
+
503
+ /* ---------- Surface 2: PDP pairs-with ---------- */
504
+
505
+ .runwell-bundle-pdp-pairs-with {
506
+ font-family: inherit;
507
+ }
508
+
509
+ .runwell-bundle-pdp-pairs-with__inner {
510
+ display: flex;
511
+ flex-direction: column;
512
+ gap: 12px;
513
+ }
514
+
515
+ .runwell-bundle-pdp-pairs-with__eyebrow {
516
+ margin: 0;
517
+ font-size: 0.85rem;
518
+ letter-spacing: 0.06em;
519
+ text-transform: uppercase;
520
+ color: var(--runwell-accent, currentColor);
521
+ }
522
+
523
+ .runwell-bundle-pdp-pairs-with__heading {
524
+ margin: 0;
525
+ font-size: 1.5rem;
526
+ line-height: 1.2;
527
+ }
528
+
529
+ .runwell-bundle-pdp-pairs-with__cards {
530
+ display: grid;
531
+ grid-template-columns: 1fr;
532
+ gap: 12px;
533
+ }
534
+
535
+ @media (min-width: 768px) {
536
+ .runwell-bundle-pdp-pairs-with__cards {
537
+ grid-template-columns: repeat(2, 1fr);
538
+ }
539
+ }
540
+
541
+ /* ---------- Surface 3: home curated stacks ---------- */
542
+
543
+ .runwell-bundle-home-stacks {
544
+ font-family: inherit;
545
+ }
546
+
547
+ .runwell-bundle-home-stacks--bg-oat {
548
+ background: var(--runwell-oat, transparent);
549
+ }
550
+
551
+ .runwell-bundle-home-stacks--bg-celadon-tint {
552
+ background: color-mix(in srgb, var(--runwell-celadon, currentColor) 18%, white);
553
+ }
554
+
555
+ .runwell-bundle-home-stacks__inner {
556
+ display: flex;
557
+ flex-direction: column;
558
+ gap: 16px;
559
+ }
560
+
561
+ .runwell-bundle-home-stacks__eyebrow {
562
+ margin: 0;
563
+ font-size: 0.85rem;
564
+ letter-spacing: 0.06em;
565
+ text-transform: uppercase;
566
+ color: var(--runwell-accent, currentColor);
567
+ }
568
+
569
+ .runwell-bundle-home-stacks__heading {
570
+ margin: 0;
571
+ font-size: 1.75rem;
572
+ line-height: 1.2;
573
+ }
574
+
575
+ @media (min-width: 768px) {
576
+ .runwell-bundle-home-stacks__heading {
577
+ font-size: 2.25rem;
578
+ }
579
+ }
580
+
581
+ .runwell-bundle-home-stacks__cards {
582
+ display: grid;
583
+ grid-template-columns: 1fr;
584
+ gap: 16px;
585
+ margin-top: 8px;
586
+ }
587
+
588
+ @media (min-width: 768px) {
589
+ .runwell-bundle-home-stacks__cards {
590
+ grid-template-columns: repeat(2, 1fr);
591
+ gap: 20px;
592
+ }
593
+ }
594
+
595
+ @media (min-width: 1024px) {
596
+ .runwell-bundle-home-stacks__cards {
597
+ grid-template-columns: repeat(4, 1fr);
598
+ }
599
+ }
600
+
601
+ .runwell-bundle-home-stacks__empty {
602
+ margin: 0;
603
+ padding: 16px;
604
+ border-radius: var(--runwell-radius-md, 12px);
605
+ background: var(--runwell-surface-card-alt, #f5f5f5);
606
+ font-size: 0.9rem;
607
+ opacity: 0.7;
608
+ }
609
+
610
+ /* ---------- Mode C BYOB ---------- */
611
+
612
+ .runwell-bundle-system__byob-summary {
613
+ position: sticky;
614
+ top: 0;
615
+ z-index: 5;
616
+ display: flex;
617
+ flex-wrap: wrap;
618
+ align-items: center;
619
+ gap: 12px;
620
+ padding: 12px 14px;
621
+ border-radius: var(--runwell-radius-md, 12px);
622
+ background: var(--runwell-surface-card, #fff);
623
+ box-shadow: var(--runwell-shadow-card, 0 2px 8px rgba(0,0,0,0.04));
624
+ margin-bottom: 16px;
625
+ }
626
+
627
+ .runwell-bundle-system__byob-counter {
628
+ margin: 0;
629
+ font-size: 0.95rem;
630
+ font-weight: 600;
631
+ display: flex;
632
+ align-items: baseline;
633
+ gap: 4px;
634
+ }
635
+
636
+ .runwell-bundle-system__byob-counter-of,
637
+ .runwell-bundle-system__byob-counter-label {
638
+ font-weight: 400;
639
+ opacity: 0.75;
640
+ font-size: 0.85rem;
641
+ }
642
+
643
+ .runwell-bundle-system__byob-pricing {
644
+ margin-left: auto;
645
+ display: flex;
646
+ align-items: baseline;
647
+ gap: 8px;
648
+ flex-wrap: wrap;
649
+ }
650
+
651
+ .runwell-bundle-system__byob-pricing-subtotal {
652
+ opacity: 0.55;
653
+ font-size: 0.85rem;
654
+ }
655
+
656
+ .runwell-bundle-system__byob-pricing-current {
657
+ font-size: 1.2rem;
658
+ font-weight: 700;
659
+ }
660
+
661
+ .runwell-bundle-system__byob-pricing-badge {
662
+ padding: 4px 10px;
663
+ font-size: 0.78rem;
664
+ font-weight: 600;
665
+ border-radius: 999px;
666
+ background: var(--runwell-accent, currentColor);
667
+ color: var(--runwell-cream, #fff);
668
+ }
669
+
670
+ .runwell-bundle-system__byob-helper {
671
+ width: 100%;
672
+ margin: 0;
673
+ font-size: 0.8rem;
674
+ opacity: 0.75;
675
+ }
676
+
677
+ .runwell-bundle-system__byob-picker--grid {
678
+ display: grid;
679
+ grid-template-columns: repeat(2, 1fr);
680
+ gap: 10px;
681
+ }
682
+
683
+ @media (min-width: 640px) {
684
+ .runwell-bundle-system__byob-picker--grid {
685
+ grid-template-columns: repeat(3, 1fr);
686
+ gap: 12px;
687
+ }
688
+ }
689
+
690
+ @media (min-width: 1024px) {
691
+ .runwell-bundle-system__byob-picker--grid {
692
+ grid-template-columns: repeat(4, 1fr);
693
+ }
694
+ }
695
+
696
+ .runwell-bundle-system__byob-candidate {
697
+ position: relative;
698
+ display: flex;
699
+ flex-direction: column;
700
+ gap: 6px;
701
+ min-height: 44px;
702
+ padding: 10px;
703
+ border: 2px solid color-mix(in srgb, currentColor 10%, transparent);
704
+ border-radius: var(--runwell-radius-md, 12px);
705
+ background: var(--runwell-surface-card, #fff);
706
+ cursor: pointer;
707
+ transition: border-color 120ms ease, background 120ms ease;
708
+ }
709
+
710
+ .runwell-bundle-system__byob-candidate:hover {
711
+ border-color: color-mix(in srgb, var(--runwell-accent, currentColor) 50%, transparent);
712
+ }
713
+
714
+ .runwell-bundle-system__byob-candidate:has(.runwell-bundle-system__byob-input:checked) {
715
+ border-color: var(--runwell-accent, currentColor);
716
+ background: color-mix(in srgb, var(--runwell-accent, currentColor) 6%, var(--runwell-surface-card, #fff));
717
+ }
718
+
719
+ .runwell-bundle-system__byob-candidate--required {
720
+ border-style: dashed;
721
+ opacity: 0.95;
722
+ }
723
+
724
+ .runwell-bundle-system__byob-candidate--unavailable {
725
+ opacity: 0.55;
726
+ cursor: not-allowed;
727
+ }
728
+
729
+ .runwell-bundle-system__byob-input {
730
+ position: absolute;
731
+ opacity: 0;
732
+ pointer-events: none;
733
+ }
734
+
735
+ .runwell-bundle-system__byob-candidate-thumb {
736
+ width: 100%;
737
+ height: auto;
738
+ aspect-ratio: 1 / 1;
739
+ object-fit: cover;
740
+ border-radius: var(--runwell-radius-sm, 4px);
741
+ display: block;
742
+ }
743
+
744
+ .runwell-bundle-system__byob-candidate-body {
745
+ display: flex;
746
+ flex-direction: column;
747
+ gap: 2px;
748
+ }
749
+
750
+ .runwell-bundle-system__byob-candidate-title {
751
+ font-size: 0.9rem;
752
+ font-weight: 600;
753
+ line-height: 1.3;
754
+ }
755
+
756
+ .runwell-bundle-system__byob-candidate-price {
757
+ font-size: 0.85rem;
758
+ opacity: 0.8;
759
+ }
760
+
761
+ .runwell-bundle-system__byob-candidate-badge {
762
+ margin-top: 4px;
763
+ align-self: flex-start;
764
+ padding: 2px 8px;
765
+ font-size: 0.7rem;
766
+ font-weight: 600;
767
+ border-radius: 999px;
768
+ background: color-mix(in srgb, var(--runwell-blue, currentColor) 18%, transparent);
769
+ }
770
+
771
+ .runwell-bundle-system__byob-picker--accordion {
772
+ display: flex;
773
+ flex-direction: column;
774
+ gap: 8px;
775
+ }
776
+
777
+ .runwell-bundle-system__byob-accordion {
778
+ border: 1px solid color-mix(in srgb, currentColor 10%, transparent);
779
+ border-radius: var(--runwell-radius-md, 12px);
780
+ background: var(--runwell-surface-card, #fff);
781
+ }
782
+
783
+ .runwell-bundle-system__byob-accordion-summary {
784
+ display: flex;
785
+ align-items: center;
786
+ gap: 8px;
787
+ padding: 14px 16px;
788
+ min-height: 44px;
789
+ font-weight: 600;
790
+ cursor: pointer;
791
+ list-style: none;
792
+ }
793
+
794
+ .runwell-bundle-system__byob-accordion-summary::-webkit-details-marker {
795
+ display: none;
796
+ }
797
+
798
+ .runwell-bundle-system__byob-accordion-count {
799
+ margin-left: auto;
800
+ padding: 2px 10px;
801
+ font-size: 0.78rem;
802
+ font-weight: 600;
803
+ border-radius: 999px;
804
+ background: color-mix(in srgb, var(--runwell-accent, currentColor) 16%, transparent);
805
+ }
806
+
807
+ .runwell-bundle-system__byob-accordion-body {
808
+ display: grid;
809
+ grid-template-columns: repeat(2, 1fr);
810
+ gap: 10px;
811
+ padding: 0 16px 16px 16px;
812
+ }
813
+
814
+ @media (min-width: 768px) {
815
+ .runwell-bundle-system__byob-accordion-body {
816
+ grid-template-columns: repeat(3, 1fr);
817
+ }
818
+ }
819
+
820
+ .runwell-bundle-system__byob-picker--radio {
821
+ display: flex;
822
+ flex-direction: column;
823
+ gap: 16px;
824
+ }
825
+
826
+ .runwell-bundle-system__byob-radio-group {
827
+ border: 0;
828
+ margin: 0;
829
+ padding: 0;
830
+ display: flex;
831
+ flex-direction: column;
832
+ gap: 8px;
833
+ }
834
+
835
+ .runwell-bundle-system__byob-radio-legend {
836
+ font-size: 0.85rem;
837
+ font-weight: 600;
838
+ letter-spacing: 0.04em;
839
+ text-transform: uppercase;
840
+ opacity: 0.75;
841
+ margin-bottom: 4px;
842
+ }
843
+
844
+ .runwell-bundle-system__byob-candidate--radio {
845
+ flex-direction: row;
846
+ align-items: center;
847
+ padding: 10px 12px;
848
+ }
849
+
850
+ .runwell-bundle-system__byob-candidate--radio .runwell-bundle-system__byob-candidate-thumb {
851
+ width: 56px;
852
+ height: 56px;
853
+ aspect-ratio: 1 / 1;
854
+ }
855
+
856
+ /* ---------- Surface 4: cart drawer bundle cross-sell ---------- */
857
+
858
+ .runwell-bundle-cart-xsell {
859
+ display: block;
860
+ margin-top: 12px;
861
+ border-radius: var(--runwell-radius-md, 12px);
862
+ background: color-mix(in srgb, var(--runwell-accent, currentColor) 8%, var(--runwell-surface-card, #fff));
863
+ padding: 12px;
864
+ }
865
+
866
+ .runwell-bundle-cart-xsell:empty {
867
+ display: none;
868
+ }
869
+
870
+ .runwell-bundle-cart-xsell__eyebrow {
871
+ margin: 0 0 8px 0;
872
+ font-size: 0.78rem;
873
+ font-weight: 600;
874
+ letter-spacing: 0.06em;
875
+ text-transform: uppercase;
876
+ color: var(--runwell-accent, currentColor);
877
+ }
878
+
879
+ .runwell-bundle-cart-xsell__card {
880
+ display: flex;
881
+ align-items: center;
882
+ gap: 10px;
883
+ }
884
+
885
+ .runwell-bundle-cart-xsell__thumb {
886
+ width: 60px;
887
+ height: 60px;
888
+ object-fit: cover;
889
+ border-radius: var(--runwell-radius-sm, 4px);
890
+ flex-shrink: 0;
891
+ }
892
+
893
+ .runwell-bundle-cart-xsell__details {
894
+ flex: 1;
895
+ min-width: 0;
896
+ display: flex;
897
+ flex-direction: column;
898
+ gap: 2px;
899
+ }
900
+
901
+ .runwell-bundle-cart-xsell__name {
902
+ margin: 0;
903
+ font-size: 0.9rem;
904
+ font-weight: 600;
905
+ line-height: 1.3;
906
+ white-space: nowrap;
907
+ overflow: hidden;
908
+ text-overflow: ellipsis;
909
+ }
910
+
911
+ .runwell-bundle-cart-xsell__price {
912
+ margin: 0;
913
+ font-size: 0.85rem;
914
+ opacity: 0.75;
915
+ }
916
+
917
+ .runwell-bundle-cart-xsell__cta {
918
+ min-height: 44px;
919
+ padding: 0 14px;
920
+ font-size: 0.85rem;
921
+ font-weight: 600;
922
+ border-radius: var(--runwell-radius-sm, 4px);
923
+ border: 0;
924
+ background: var(--runwell-accent, currentColor);
925
+ color: var(--runwell-cream, #fff);
926
+ cursor: pointer;
927
+ white-space: nowrap;
928
+ }
929
+
930
+ .runwell-bundle-cart-xsell__cta:disabled {
931
+ opacity: 0.6;
932
+ cursor: not-allowed;
933
+ }
934
+
935
+ /* ---------- Surface 5: PDP bundle banner ---------- */
936
+
937
+ .runwell-bundle-pdp-banner {
938
+ display: flex;
939
+ align-items: center;
940
+ justify-content: space-between;
941
+ gap: 12px;
942
+ padding: 10px 14px;
943
+ min-height: 44px;
944
+ border-radius: var(--runwell-radius-sm, 4px);
945
+ background: color-mix(in srgb, var(--runwell-celadon, currentColor) 18%, white);
946
+ color: inherit;
947
+ text-decoration: none;
948
+ font-size: 0.9rem;
949
+ transition: background-color 150ms ease;
950
+ }
951
+
952
+ .runwell-bundle-pdp-banner:hover,
953
+ .runwell-bundle-pdp-banner:focus-visible {
954
+ background: color-mix(in srgb, var(--runwell-celadon, currentColor) 26%, white);
955
+ }
956
+
957
+ .runwell-bundle-pdp-banner__copy {
958
+ flex: 1;
959
+ font-weight: 500;
960
+ }
961
+
962
+ .runwell-bundle-pdp-banner__chevron {
963
+ font-size: 1.2rem;
964
+ font-weight: 700;
965
+ opacity: 0.6;
966
+ }
967
+
968
+ /* ---------- Surface 1: /bundles collection grid ---------- */
969
+
970
+ .runwell-bundle-collection {
971
+ font-family: inherit;
972
+ }
973
+
974
+ .runwell-bundle-collection__inner {
975
+ display: flex;
976
+ flex-direction: column;
977
+ gap: 24px;
978
+ }
979
+
980
+ .runwell-bundle-collection__heading {
981
+ display: flex;
982
+ flex-direction: column;
983
+ gap: 6px;
984
+ text-align: left;
985
+ }
986
+
987
+ .runwell-bundle-collection__title {
988
+ margin: 0;
989
+ font-size: 2rem;
990
+ line-height: 1.1;
991
+ }
992
+
993
+ @media (min-width: 768px) {
994
+ .runwell-bundle-collection__title {
995
+ font-size: 2.5rem;
996
+ }
997
+ }
998
+
999
+ .runwell-bundle-collection__subline {
1000
+ margin: 0;
1001
+ font-size: 1rem;
1002
+ opacity: 0.75;
1003
+ }
1004
+
1005
+ .runwell-bundle-collection__grid {
1006
+ display: grid;
1007
+ grid-template-columns: 1fr;
1008
+ gap: 24px;
1009
+ }
1010
+
1011
+ @media (min-width: 768px) {
1012
+ .runwell-bundle-collection__grid {
1013
+ grid-template-columns: repeat(2, 1fr);
1014
+ gap: 28px;
1015
+ }
1016
+ }
1017
+
1018
+ @media (min-width: 1024px) {
1019
+ .runwell-bundle-collection__grid {
1020
+ grid-template-columns: repeat(3, 1fr);
1021
+ gap: 32px;
1022
+ }
1023
+ }
1024
+
1025
+ .runwell-bundle-collection__grid > .runwell-bundle-card--hero {
1026
+ grid-column: 1 / -1;
1027
+ }
1028
+
1029
+ .runwell-bundle-collection__empty {
1030
+ margin: 0;
1031
+ padding: 24px;
1032
+ border-radius: var(--runwell-radius-md, 12px);
1033
+ background: var(--runwell-surface-card-alt, #f5f5f5);
1034
+ font-size: 0.95rem;
1035
+ opacity: 0.75;
1036
+ }
1037
+
1038
+ .runwell-bundle-collection__empty code {
1039
+ font-family: ui-monospace, SFMono-Regular, monospace;
1040
+ font-size: 0.85rem;
1041
+ padding: 2px 6px;
1042
+ border-radius: 3px;
1043
+ background: rgba(0, 0, 0, 0.06);
1044
+ }
1045
+
1046
+ /* ---------- Surface 6: collection page filter chip ---------- */
1047
+
1048
+ .runwell-bundle-collection--filter-chip {
1049
+ display: flex;
1050
+ flex-direction: column;
1051
+ gap: 16px;
1052
+ margin-bottom: 24px;
1053
+ }
1054
+
1055
+ .runwell-bundle-collection__chip {
1056
+ display: inline-flex;
1057
+ align-items: center;
1058
+ gap: 6px;
1059
+ padding: 10px 18px;
1060
+ min-height: 44px;
1061
+ align-self: flex-start;
1062
+ border: 2px solid color-mix(in srgb, currentColor 20%, transparent);
1063
+ border-radius: 999px;
1064
+ background: transparent;
1065
+ color: inherit;
1066
+ font-size: 0.9rem;
1067
+ font-weight: 600;
1068
+ cursor: pointer;
1069
+ transition: background-color 150ms ease, border-color 150ms ease;
1070
+ }
1071
+
1072
+ .runwell-bundle-collection__chip[aria-pressed="true"] {
1073
+ background: var(--runwell-accent, currentColor);
1074
+ color: var(--runwell-cream, #fff);
1075
+ border-color: var(--runwell-accent, currentColor);
1076
+ }
1077
+
1078
+ .runwell-bundle-collection__chip-count {
1079
+ opacity: 0.7;
1080
+ font-weight: 500;
1081
+ }
1082
+
1083
+ .runwell-bundle-collection__pinned {
1084
+ display: grid;
1085
+ grid-template-columns: 1fr;
1086
+ gap: 16px;
1087
+ }
1088
+
1089
+ @media (min-width: 768px) {
1090
+ .runwell-bundle-collection__pinned {
1091
+ grid-template-columns: repeat(2, 1fr);
1092
+ }
1093
+ }
1094
+
1095
+ /* ---------- Visually hidden helper (for legend) ---------- */
1096
+
1097
+ .runwell-bundle-system .visually-hidden {
1098
+ position: absolute;
1099
+ width: 1px;
1100
+ height: 1px;
1101
+ margin: -1px;
1102
+ padding: 0;
1103
+ overflow: hidden;
1104
+ clip: rect(0, 0, 0, 0);
1105
+ white-space: nowrap;
1106
+ border: 0;
1107
+ }