@lime-bundles/widget 4.3.0 → 4.4.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/dist/index.js CHANGED
@@ -60,6 +60,14 @@ function toCents(amount) {
60
60
  const n = parseFloat(amount);
61
61
  return Number.isFinite(n) ? Math.round(n * 100) : 0;
62
62
  }
63
+ function imageAspectRatio(image) {
64
+ const w = image?.width;
65
+ const h = image?.height;
66
+ if (typeof w !== "number" || typeof h !== "number" || w <= 0 || h <= 0) {
67
+ return null;
68
+ }
69
+ return w / h;
70
+ }
63
71
  function adaptVariant(v, requiredQty, fallbackCurrency) {
64
72
  return {
65
73
  id: numericId(v.id),
@@ -101,6 +109,7 @@ function adaptProduct(product, bundleId, opts) {
101
109
  title: product.title,
102
110
  url: product.handle ? "/products/" + product.handle : null,
103
111
  featuredImage: product.featuredImage?.url ?? null,
112
+ featuredImageRatio: imageAspectRatio(product.featuredImage),
104
113
  quantity: productQty,
105
114
  selectedVariantId: initial ? initial.id : "",
106
115
  // Option names come off a variant, since the Storefront product query
@@ -445,7 +454,12 @@ function buildRowSkeleton(product, t, opts) {
445
454
  }
446
455
  row.setAttribute("data-product-id", String(product.productId));
447
456
  if (opts.bogoRole) row.setAttribute("data-bogo-role", opts.bogoRole);
448
- row.appendChild(box("div", "lb-bundle-thumbnail", { "data-thumbnail": "" }));
457
+ const thumb = box("div", "lb-bundle-thumbnail", { "data-thumbnail": "" });
458
+ const ratio = product.featuredImageRatio;
459
+ if (opts.thumbnailRatio === "original" && ratio != null && ratio > 0) {
460
+ thumb.style.setProperty("--lb-row-thumb-ratio", String(ratio));
461
+ }
462
+ row.appendChild(thumb);
449
463
  const info = box("div", "lb-bundle-product-info");
450
464
  const title = document.createElement(opts.href ? "a" : "span");
451
465
  title.className = "lb-bundle-product-name";
@@ -754,6 +768,16 @@ var DEFAULT_STRINGS = {
754
768
  chooseMoreComplete: "Choose __COUNT__ more to complete your bundle",
755
769
  stepOf: "Step __STEP__ of __TOTAL__",
756
770
  stepsCompleted: "__COUNT__ of __TOTAL__ steps completed",
771
+ doorChoose: "Choose your products",
772
+ doorContinue: "Continue building",
773
+ doorQuickSteps: {
774
+ one: "__COUNT__ quick step",
775
+ other: "__COUNT__ quick steps"
776
+ },
777
+ doorStepsToGo: {
778
+ one: "__COUNT__ step to go",
779
+ other: "__COUNT__ steps to go"
780
+ },
757
781
  each: " each",
758
782
  buyQty: "Buy __COUNT__",
759
783
  itemCount: {
@@ -1211,7 +1235,8 @@ function renderFixedBundle(container, bundle, onAddToCart, onCleanup) {
1211
1235
  const isOos = !product.variants.some((v) => v.available);
1212
1236
  const row = buildRowSkeleton(product, t, {
1213
1237
  isOos,
1214
- href: product.url
1238
+ href: product.url,
1239
+ thumbnailRatio: wc.productList?.thumbnailRatio
1215
1240
  });
1216
1241
  shell.products.appendChild(row);
1217
1242
  if (isOos) continue;
@@ -3217,7 +3242,8 @@ function renderBogoBundle(container, bundle, onAddToCart, onCleanup) {
3217
3242
  href: side.url,
3218
3243
  bogoRole: side.role,
3219
3244
  inlineQuantity: isGet ? getQty : buyQty,
3220
- badgeText: isGet && !isOos ? badgeText : null
3245
+ badgeText: isGet && !isOos ? badgeText : null,
3246
+ thumbnailRatio: wc.productList?.thumbnailRatio
3221
3247
  });
3222
3248
  shell.products.appendChild(row);
3223
3249
  if (isOos) return;
@@ -3286,6 +3312,32 @@ function stepsCompletedLabel(completed, total, t) {
3286
3312
  function moreToGoLabel(remaining, t) {
3287
3313
  return remaining > 0 ? fill(t.moreToGo || "__COUNT__ more to go", { COUNT: remaining }) : t.complete || "Complete";
3288
3314
  }
3315
+ function fillPlural(map, count, locale) {
3316
+ const form = new Intl.PluralRules(locale || "en").select(count);
3317
+ return fill(map[form] || map.other || "__COUNT__", { COUNT: count });
3318
+ }
3319
+ function doorLabel(anyPicks, t) {
3320
+ return anyPicks ? t.doorContinue || "Continue building" : t.doorChoose || "Choose your products";
3321
+ }
3322
+ function doorSubLabel(anyPicks, remaining, total, t) {
3323
+ if (!anyPicks) {
3324
+ const quick = t.doorQuickSteps;
3325
+ if (typeof quick === "string") return fill(quick, { COUNT: total });
3326
+ return fillPlural(
3327
+ quick || { one: "__COUNT__ quick step", other: "__COUNT__ quick steps" },
3328
+ total,
3329
+ t.locale
3330
+ );
3331
+ }
3332
+ return fillPlural(
3333
+ t.doorStepsToGo || {
3334
+ one: "__COUNT__ step to go",
3335
+ other: "__COUNT__ steps to go"
3336
+ },
3337
+ remaining,
3338
+ t.locale
3339
+ );
3340
+ }
3289
3341
 
3290
3342
  // ../render/src/multi-step/rules.ts
3291
3343
  function unitsInStep(selections, i) {
@@ -3347,20 +3399,28 @@ function updateStepGroups(deps) {
3347
3399
  const { container, steps, selections, t } = deps;
3348
3400
  for (let i = 0; i < steps.length; i++) {
3349
3401
  const min = steps[i].minQuantity || 1;
3350
- const countEl = container.querySelector(
3351
- '[data-step-count="' + i + '"]'
3402
+ const section = container.querySelector(
3403
+ '[data-step-group="' + i + '"]'
3352
3404
  );
3353
- if (countEl) {
3354
- countEl.textContent = ofSelectedLabel(
3355
- Math.min(unitsInStep(selections, i), min),
3356
- min,
3357
- t
3358
- );
3359
- countEl.classList.toggle(
3360
- "lb-multi-step__group-count--met",
3361
- stepSatisfied(selections, steps, i)
3405
+ if (section) {
3406
+ section.setAttribute(
3407
+ "data-step-mode",
3408
+ selections[i].length > 0 ? "open" : "row"
3362
3409
  );
3363
3410
  }
3411
+ const countLabel = ofSelectedLabel(
3412
+ Math.min(unitsInStep(selections, i), min),
3413
+ min,
3414
+ t
3415
+ );
3416
+ const met = stepSatisfied(selections, steps, i);
3417
+ const countEls = container.querySelectorAll(
3418
+ '[data-step-count="' + i + '"]'
3419
+ );
3420
+ for (let c = 0; c < countEls.length; c++) {
3421
+ countEls[c].textContent = countLabel;
3422
+ countEls[c].classList.toggle("lb-multi-step__group-count--met", met);
3423
+ }
3364
3424
  const slotsWrap = container.querySelector(
3365
3425
  '[data-step-slots="' + i + '"]'
3366
3426
  );
@@ -3382,14 +3442,50 @@ function updateStepGroups(deps) {
3382
3442
  );
3383
3443
  }
3384
3444
  }
3385
- for (let ti = 0; ti < steps.length; ti++) {
3386
- const trigger = container.querySelector(
3387
- '[data-step-trigger="' + ti + '"]'
3388
- );
3389
- if (trigger) {
3390
- trigger.style.display = stepHeadroom(selections, steps, ti) === 0 ? "none" : "";
3445
+ }
3446
+ function updateDoor(deps) {
3447
+ const { container, steps, selections, t } = deps;
3448
+ const door = container.querySelector("[data-step-door]");
3449
+ if (!door) return;
3450
+ let firstUnsatisfied = -1;
3451
+ let remaining = 0;
3452
+ let anyPicks = false;
3453
+ for (let i = 0; i < steps.length; i++) {
3454
+ if (selections[i].length > 0) anyPicks = true;
3455
+ if (!stepSatisfied(selections, steps, i)) {
3456
+ remaining += 1;
3457
+ if (firstUnsatisfied === -1) firstUnsatisfied = i;
3391
3458
  }
3392
3459
  }
3460
+ if (firstUnsatisfied === -1) {
3461
+ door.style.display = "none";
3462
+ door.classList.add("lb-multi-step__door--hidden");
3463
+ const parent = door.parentElement;
3464
+ if (parent && parent.firstElementChild !== door) {
3465
+ parent.insertBefore(door, parent.firstElementChild);
3466
+ }
3467
+ return;
3468
+ }
3469
+ door.style.display = "";
3470
+ door.classList.remove("lb-multi-step__door--hidden");
3471
+ door.setAttribute("data-step-door", String(firstUnsatisfied));
3472
+ const label = doorLabel(anyPicks, t);
3473
+ const labelEl = door.querySelector(
3474
+ ".lb-mix-match__add-product-label"
3475
+ );
3476
+ if (labelEl) labelEl.textContent = label;
3477
+ const subEl = door.querySelector(".lb-multi-step__door-sub");
3478
+ if (subEl) {
3479
+ subEl.textContent = doorSubLabel(anyPicks, remaining, steps.length, t);
3480
+ }
3481
+ const stepName = steps[firstUnsatisfied].name || "";
3482
+ door.setAttribute("aria-label", stepName ? label + ": " + stepName : label);
3483
+ const target = container.querySelector(
3484
+ '[data-step-group="' + firstUnsatisfied + '"]'
3485
+ );
3486
+ if (target && target.parentElement && target.previousElementSibling !== door) {
3487
+ target.parentElement.insertBefore(door, target);
3488
+ }
3393
3489
  }
3394
3490
  function updatePricing3(deps, data, calcDiscount, paint) {
3395
3491
  const { container, steps, selections } = deps;
@@ -3833,10 +3929,12 @@ function createWizard(deps) {
3833
3929
  setTimeout(() => {
3834
3930
  if (!modalOpen) overlay.style.display = "none";
3835
3931
  }, CLOSE_TRANSITION_MS2);
3836
- const stepTrigger = container.querySelector(
3837
- '[data-step-trigger="' + stepIndex + '"]'
3838
- );
3839
- const elToFocus = stepTrigger && stepTrigger.offsetParent !== null ? stepTrigger : deps.ctaButton;
3932
+ const visible = (el2) => el2 && el2.offsetParent !== null ? el2 : null;
3933
+ const elToFocus = visible(
3934
+ container.querySelector(
3935
+ '[data-step-row="' + stepIndex + '"]'
3936
+ )
3937
+ ) || visible(container.querySelector("[data-step-door]")) || deps.ctaButton;
3840
3938
  if (elToFocus && typeof elToFocus.focus === "function") {
3841
3939
  setTimeout(() => elToFocus.focus(), 0);
3842
3940
  }
@@ -3889,6 +3987,29 @@ function createWizard(deps) {
3889
3987
  }
3890
3988
 
3891
3989
  // src/renderers/multi-step.ts
3990
+ function buildPlusIcon() {
3991
+ const NS = "http://www.w3.org/2000/svg";
3992
+ const svg = document.createElementNS(NS, "svg");
3993
+ svg.setAttribute("width", "18");
3994
+ svg.setAttribute("height", "18");
3995
+ svg.setAttribute("viewBox", "0 0 18 18");
3996
+ svg.setAttribute("fill", "none");
3997
+ for (const [x1, y1, x2, y2] of [
3998
+ ["9", "3", "9", "15"],
3999
+ ["3", "9", "15", "9"]
4000
+ ]) {
4001
+ const line = document.createElementNS(NS, "line");
4002
+ line.setAttribute("x1", x1);
4003
+ line.setAttribute("y1", y1);
4004
+ line.setAttribute("x2", x2);
4005
+ line.setAttribute("y2", y2);
4006
+ line.setAttribute("stroke", "currentColor");
4007
+ line.setAttribute("stroke-width", "2");
4008
+ line.setAttribute("stroke-linecap", "round");
4009
+ svg.appendChild(line);
4010
+ }
4011
+ return svg;
4012
+ }
3892
4013
  function renderMultiStepBundle(container, bundle, onAddToCart, onCleanup) {
3893
4014
  const wc = bundle.widgetConfig;
3894
4015
  const t = DEFAULT_STRINGS;
@@ -3943,31 +4064,65 @@ function renderMultiStepBundle(container, bundle, onAddToCart, onCleanup) {
3943
4064
  shell.products.before(buildProgressBar(steps.length));
3944
4065
  const groups = document.createElement("div");
3945
4066
  groups.className = "lb-multi-step__groups";
4067
+ groups.setAttribute("data-step-groups", "");
4068
+ const door = document.createElement("button");
4069
+ door.type = "button";
4070
+ door.className = "lb-mix-match__add-product lb-multi-step__door";
4071
+ door.setAttribute("data-step-door", "0");
4072
+ const doorIcon = document.createElement("span");
4073
+ doorIcon.className = "lb-mix-match__add-product-icon";
4074
+ doorIcon.setAttribute("aria-hidden", "true");
4075
+ doorIcon.appendChild(buildPlusIcon());
4076
+ door.appendChild(doorIcon);
4077
+ const doorCopy = document.createElement("span");
4078
+ doorCopy.className = "lb-multi-step__door-copy";
4079
+ const doorLabel2 = document.createElement("span");
4080
+ doorLabel2.className = "lb-mix-match__add-product-label";
4081
+ doorCopy.appendChild(doorLabel2);
4082
+ const doorSub = document.createElement("span");
4083
+ doorSub.className = "lb-multi-step__door-sub";
4084
+ doorCopy.appendChild(doorSub);
4085
+ door.appendChild(doorCopy);
4086
+ groups.appendChild(door);
3946
4087
  steps.forEach((step, i) => {
3947
- const group = document.createElement("div");
4088
+ const group = document.createElement("section");
3948
4089
  group.className = "lb-multi-step__group";
3949
4090
  group.setAttribute("data-step-group", String(i));
4091
+ group.setAttribute("data-step-mode", "row");
4092
+ const buildCount = () => {
4093
+ const count = document.createElement("span");
4094
+ count.className = "lb-multi-step__group-count";
4095
+ count.setAttribute("data-step-count", String(i));
4096
+ return count;
4097
+ };
4098
+ const row = document.createElement("button");
4099
+ row.type = "button";
4100
+ row.className = "lb-multi-step__step-row";
4101
+ row.setAttribute("data-step-row", String(i));
4102
+ row.setAttribute("aria-label", "Choose products: " + step.name);
4103
+ const ix = document.createElement("span");
4104
+ ix.className = "lb-multi-step__step-ix";
4105
+ ix.setAttribute("aria-hidden", "true");
4106
+ ix.textContent = String(i + 1);
4107
+ row.appendChild(ix);
4108
+ const rowName = document.createElement("span");
4109
+ rowName.className = "lb-multi-step__group-name";
4110
+ rowName.textContent = step.name;
4111
+ row.appendChild(rowName);
4112
+ row.appendChild(buildCount());
4113
+ group.appendChild(row);
3950
4114
  const heading = document.createElement("div");
3951
4115
  heading.className = "lb-multi-step__group-heading";
3952
4116
  const name = document.createElement("span");
3953
4117
  name.className = "lb-multi-step__group-name";
3954
4118
  name.textContent = step.name;
3955
4119
  heading.appendChild(name);
3956
- const count = document.createElement("span");
3957
- count.className = "lb-multi-step__group-count";
3958
- count.setAttribute("data-step-count", String(i));
3959
- heading.appendChild(count);
4120
+ heading.appendChild(buildCount());
3960
4121
  group.appendChild(heading);
3961
4122
  const slots = document.createElement("div");
3962
- slots.className = "lb-mix-match__slots lb-edge-fade";
4123
+ slots.className = "lb-mix-match__slots lb-edge-fade lb-multi-step__group-slots";
3963
4124
  slots.setAttribute("data-step-slots", String(i));
3964
4125
  group.appendChild(slots);
3965
- const trigger = document.createElement("button");
3966
- trigger.type = "button";
3967
- trigger.className = "lb-mix-match__add-product";
3968
- trigger.setAttribute("data-step-trigger", String(i));
3969
- trigger.textContent = "Add a product";
3970
- group.appendChild(trigger);
3971
4126
  groups.appendChild(group);
3972
4127
  });
3973
4128
  shell.products.replaceWith(groups);
@@ -4004,6 +4159,7 @@ function renderMultiStepBundle(container, bundle, onAddToCart, onCleanup) {
4004
4159
  };
4005
4160
  function updateAll() {
4006
4161
  updateStepGroups(bodyDeps);
4162
+ updateDoor(bodyDeps);
4007
4163
  updatePricing3(
4008
4164
  bodyDeps,
4009
4165
  {
@@ -4050,10 +4206,14 @@ function renderMultiStepBundle(container, bundle, onAddToCart, onCleanup) {
4050
4206
  },
4051
4207
  canRemove: (item) => canRemovePick2(selections, item, rulesMap)
4052
4208
  });
4053
- shell.root.querySelectorAll("[data-step-trigger]").forEach((el2) => {
4209
+ door.addEventListener("click", () => {
4210
+ if (wizard.isOpen()) return;
4211
+ wizard.open(parseInt(door.getAttribute("data-step-door") ?? "", 10) || 0);
4212
+ });
4213
+ shell.root.querySelectorAll("[data-step-row]").forEach((el2) => {
4054
4214
  el2.addEventListener("click", () => {
4055
4215
  if (wizard.isOpen()) return;
4056
- wizard.open(parseInt(el2.getAttribute("data-step-trigger") ?? "", 10) || 0);
4216
+ wizard.open(parseInt(el2.getAttribute("data-step-row") ?? "", 10) || 0);
4057
4217
  });
4058
4218
  });
4059
4219
  shell.cta.addEventListener("click", () => {
@@ -6247,12 +6407,19 @@ var BUNDLE_MULTI_STEP_CSS = `/**
6247
6407
  * Canon: WIDGET-DESIGN.md (spacing scale, radius system, chip family).
6248
6408
  */
6249
6409
 
6250
- /* \u2500\u2500 Step groups (widget body) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
6410
+ /* \u2500\u2500 Step groups (widget body) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
6411
+ One dashed door + one section per step. A step without picks shows a
6412
+ slim checklist row; a step with picks shows the heading + chosen
6413
+ cards. data-step-mode ("row" | "open") on the section picks the
6414
+ representation \u2014 both are in the markup, CSS hides the other, so the
6415
+ server-rendered untouched state IS the hydrated no-selection state.
6416
+ Spacing is per-pair rather than a flat gap: consecutive rows sit
6417
+ flush (hairline-separated), everything else breathes 16px. */
6251
6418
 
6252
6419
  .lb-multi-step__groups {
6253
6420
  display: flex;
6254
6421
  flex-direction: column;
6255
- gap: 16px;
6422
+ gap: 0;
6256
6423
  }
6257
6424
 
6258
6425
  .lb-multi-step__group {
@@ -6261,8 +6428,117 @@ var BUNDLE_MULTI_STEP_CSS = `/**
6261
6428
  gap: 8px;
6262
6429
  }
6263
6430
 
6431
+ .lb-multi-step__group + .lb-multi-step__group {
6432
+ margin-top: 16px;
6433
+ }
6434
+
6435
+ /* A run of empty-step rows reads as one checklist: flush, hairlines
6436
+ between (the first row of a run keeps no border). */
6437
+ .lb-multi-step__group[data-step-mode="row"] + .lb-multi-step__group[data-step-mode="row"] {
6438
+ margin-top: 0;
6439
+ }
6440
+
6441
+ .lb-multi-step__group[data-step-mode="row"]
6442
+ + .lb-multi-step__group[data-step-mode="row"]
6443
+ .lb-multi-step__step-row {
6444
+ border-top: var(--lb-border-width) solid var(--lb-border);
6445
+ }
6446
+
6447
+ /* Mode switch: a row-mode step hides its open chrome and vice versa. */
6448
+ .lb-multi-step__group[data-step-mode="row"] .lb-multi-step__group-heading,
6449
+ .lb-multi-step__group[data-step-mode="row"] .lb-multi-step__group-slots {
6450
+ display: none;
6451
+ }
6452
+
6453
+ .lb-multi-step__group[data-step-mode="open"] .lb-multi-step__step-row {
6454
+ display: none;
6455
+ }
6456
+
6457
+ /* Checklist row \u2014 the empty step's whole representation, and a tap
6458
+ target that deep-links the wizard to that step. Quiet by design: the
6459
+ door above it is the primary action. */
6460
+ .lb-multi-step__step-row {
6461
+ display: flex;
6462
+ align-items: center;
6463
+ gap: 12px;
6464
+ width: 100%;
6465
+ min-height: 48px;
6466
+ padding: 10px 2px;
6467
+ background: none;
6468
+ border: none;
6469
+ font-family: inherit;
6470
+ text-align: left;
6471
+ cursor: pointer;
6472
+ box-sizing: border-box;
6473
+ transition: background-color 0.25s ease;
6474
+ }
6475
+
6476
+ .lb-multi-step__step-row:hover {
6477
+ background: color-mix(in srgb, var(--lb-text) 3%, transparent);
6478
+ }
6479
+
6480
+ .lb-multi-step__step-row:focus-visible {
6481
+ outline: 2px solid var(--lb-primary-color);
6482
+ outline-offset: -2px;
6483
+ border-radius: var(--lb-radius-sm);
6484
+ }
6485
+
6486
+ .lb-multi-step__step-row .lb-multi-step__group-count {
6487
+ margin-left: auto;
6488
+ }
6489
+
6490
+ /* Step number \u2014 quiet index, tabular so multi-digit lists align. */
6491
+ .lb-multi-step__step-ix {
6492
+ width: 18px;
6493
+ min-width: 18px;
6494
+ font-size: 12px;
6495
+ font-weight: 500;
6496
+ color: color-mix(in srgb, var(--lb-text) 45%, transparent);
6497
+ font-variant-numeric: tabular-nums;
6498
+ }
6499
+
6500
+ /* The door \u2014 the single wizard entry point, reusing the dashed
6501
+ add-product recipe with a two-line label. JS moves it directly above
6502
+ the first unsatisfied step and hides it once every step is met. The
6503
+ add-product recipe's own margin-top is for its mix & match position
6504
+ (below the slot list); here the pair rules own all spacing. */
6505
+ .lb-multi-step__door {
6506
+ margin-top: 0;
6507
+ }
6508
+
6509
+ .lb-multi-step__door + .lb-multi-step__group {
6510
+ margin-top: 12px;
6511
+ }
6512
+
6513
+ .lb-multi-step__door + .lb-multi-step__group[data-step-mode="row"] {
6514
+ margin-top: 4px;
6515
+ }
6516
+
6517
+ .lb-multi-step__group + .lb-multi-step__door {
6518
+ margin-top: 16px;
6519
+ }
6520
+
6521
+ /* A hidden door is parked as the container's first child (updateDoor), so
6522
+ the group after it is really the first visible element \u2014 no door gap. */
6523
+ .lb-multi-step__door--hidden:first-child + .lb-multi-step__group {
6524
+ margin-top: 0;
6525
+ }
6526
+
6527
+ .lb-multi-step__door-copy {
6528
+ display: flex;
6529
+ flex-direction: column;
6530
+ gap: 2px;
6531
+ }
6532
+
6533
+ .lb-multi-step__door-sub {
6534
+ font-size: 13px;
6535
+ font-weight: 400;
6536
+ line-height: 1.2;
6537
+ color: color-mix(in srgb, var(--lb-text) 55%, transparent);
6538
+ }
6539
+
6264
6540
  /* Heading is a quiet, non-interactive row: step name left, live count
6265
- chip right. The step's dashed trigger below is the click target. */
6541
+ chip right. The step's chosen cards below are the edit targets. */
6266
6542
  .lb-multi-step__group-heading {
6267
6543
  display: flex;
6268
6544
  align-items: center;