@mj-biz-apps/orders-ng 5.36.0 → 5.37.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 (25) hide show
  1. package/dist/checkout-element/main.js +491 -154
  2. package/dist/lib/checkout-widget/checkout-complete.d.ts +53 -0
  3. package/dist/lib/checkout-widget/checkout-complete.d.ts.map +1 -0
  4. package/dist/lib/checkout-widget/checkout-complete.js +92 -0
  5. package/dist/lib/checkout-widget/checkout-complete.js.map +1 -0
  6. package/dist/lib/checkout-widget/checkout-draft-line.d.ts +7 -1
  7. package/dist/lib/checkout-widget/checkout-draft-line.d.ts.map +1 -1
  8. package/dist/lib/checkout-widget/checkout-draft-line.js +18 -0
  9. package/dist/lib/checkout-widget/checkout-draft-line.js.map +1 -1
  10. package/dist/lib/checkout-widget/checkout-public-host.component.d.ts +56 -0
  11. package/dist/lib/checkout-widget/checkout-public-host.component.d.ts.map +1 -1
  12. package/dist/lib/checkout-widget/checkout-public-host.component.js +245 -113
  13. package/dist/lib/checkout-widget/checkout-public-host.component.js.map +1 -1
  14. package/dist/lib/checkout-widget/checkout-widget.component.d.ts +35 -2
  15. package/dist/lib/checkout-widget/checkout-widget.component.d.ts.map +1 -1
  16. package/dist/lib/checkout-widget/checkout-widget.component.js +145 -45
  17. package/dist/lib/checkout-widget/checkout-widget.component.js.map +1 -1
  18. package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts +7 -0
  19. package/dist/lib/custom/OrderHeader/order-lines-editor.component.d.ts.map +1 -1
  20. package/dist/lib/custom/OrderHeader/order-lines-editor.component.js +23 -22
  21. package/dist/lib/custom/OrderHeader/order-lines-editor.component.js.map +1 -1
  22. package/dist/lib/data/orders-queries.d.ts +3 -1
  23. package/dist/lib/data/orders-queries.d.ts.map +1 -1
  24. package/dist/lib/data/orders-queries.js.map +1 -1
  25. package/package.json +2 -2
@@ -37189,7 +37189,7 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Conditional_3_Template(r
37189
37189
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_4_Template(rf, ctx) {
37190
37190
  if (rf & 1) {
37191
37191
  const _r3 = \u0275\u0275getCurrentView();
37192
- \u0275\u0275elementStart(0, "textarea", 38);
37192
+ \u0275\u0275elementStart(0, "textarea", 37);
37193
37193
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_4_Template_textarea_ngModelChange_0_listener($event) {
37194
37194
  \u0275\u0275restoreView(_r3);
37195
37195
  const field_r4 = \u0275\u0275nextContext().$implicit;
@@ -37222,7 +37222,7 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_5_For_4_Template(rf
37222
37222
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_5_Template(rf, ctx) {
37223
37223
  if (rf & 1) {
37224
37224
  const _r5 = \u0275\u0275getCurrentView();
37225
- \u0275\u0275elementStart(0, "select", 39);
37225
+ \u0275\u0275elementStart(0, "select", 38);
37226
37226
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_5_Template_select_ngModelChange_0_listener($event) {
37227
37227
  \u0275\u0275restoreView(_r5);
37228
37228
  const field_r4 = \u0275\u0275nextContext().$implicit;
@@ -37251,7 +37251,7 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_5_Template(rf, ctx)
37251
37251
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_6_Template(rf, ctx) {
37252
37252
  if (rf & 1) {
37253
37253
  const _r7 = \u0275\u0275getCurrentView();
37254
- \u0275\u0275elementStart(0, "label", 34)(1, "input", 40);
37254
+ \u0275\u0275elementStart(0, "label", 34)(1, "input", 39);
37255
37255
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_6_Template_input_ngModelChange_1_listener($event) {
37256
37256
  \u0275\u0275restoreView(_r7);
37257
37257
  const field_r4 = \u0275\u0275nextContext().$implicit;
@@ -37276,7 +37276,7 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_6_Template(rf, ctx)
37276
37276
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_7_Template(rf, ctx) {
37277
37277
  if (rf & 1) {
37278
37278
  const _r8 = \u0275\u0275getCurrentView();
37279
- \u0275\u0275elementStart(0, "input", 41);
37279
+ \u0275\u0275elementStart(0, "input", 40);
37280
37280
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_7_Template_input_ngModelChange_0_listener($event) {
37281
37281
  \u0275\u0275restoreView(_r8);
37282
37282
  const field_r4 = \u0275\u0275nextContext().$implicit;
@@ -37295,7 +37295,7 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_7_Template(rf, ctx)
37295
37295
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_8_Template(rf, ctx) {
37296
37296
  if (rf & 1) {
37297
37297
  const _r9 = \u0275\u0275getCurrentView();
37298
- \u0275\u0275elementStart(0, "input", 42);
37298
+ \u0275\u0275elementStart(0, "input", 41);
37299
37299
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_8_Template_input_ngModelChange_0_listener($event) {
37300
37300
  \u0275\u0275restoreView(_r9);
37301
37301
  const field_r4 = \u0275\u0275nextContext().$implicit;
@@ -37311,10 +37311,17 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_8_Template(rf, ctx)
37311
37311
  \u0275\u0275property("ngModel", (tmp_12_0 = ctx_r0.units()[0]) == null ? null : tmp_12_0[field_r4.name])("required", field_r4.required || false);
37312
37312
  }
37313
37313
  }
37314
+ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Conditional_1_Template(rf, ctx) {
37315
+ if (rf & 1) {
37316
+ \u0275\u0275elementStart(0, "p", 43);
37317
+ \u0275\u0275text(1, "Your member discount is tied to this verified e-mail.");
37318
+ \u0275\u0275elementEnd();
37319
+ }
37320
+ }
37314
37321
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Template(rf, ctx) {
37315
37322
  if (rf & 1) {
37316
37323
  const _r10 = \u0275\u0275getCurrentView();
37317
- \u0275\u0275elementStart(0, "input", 43);
37324
+ \u0275\u0275elementStart(0, "input", 42);
37318
37325
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Template_input_ngModelChange_0_listener($event) {
37319
37326
  \u0275\u0275restoreView(_r10);
37320
37327
  const field_r4 = \u0275\u0275nextContext().$implicit;
@@ -37322,12 +37329,15 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Template(rf, ctx)
37322
37329
  return \u0275\u0275resetView(ctx_r0.updateUnitField(0, field_r4.name, $event));
37323
37330
  });
37324
37331
  \u0275\u0275elementEnd();
37332
+ \u0275\u0275conditionalCreate(1, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Conditional_1_Template, 2, 0, "p", 43);
37325
37333
  }
37326
37334
  if (rf & 2) {
37327
37335
  let tmp_13_0;
37328
37336
  const field_r4 = \u0275\u0275nextContext().$implicit;
37329
37337
  const ctx_r0 = \u0275\u0275nextContext(2);
37330
- \u0275\u0275property("type", field_r4.name.toLowerCase().includes("email") ? "email" : "text")("ngModel", (tmp_13_0 = ctx_r0.units()[0]) == null ? null : tmp_13_0[field_r4.name])("placeholder", field_r4.placeholder || "")("required", field_r4.required || false);
37338
+ \u0275\u0275property("type", field_r4.name.toLowerCase().includes("email") ? "email" : "text")("ngModel", (tmp_13_0 = ctx_r0.units()[0]) == null ? null : tmp_13_0[field_r4.name])("placeholder", field_r4.placeholder || "")("readonly", ctx_r0.isLockedEmail(0, field_r4.name))("required", field_r4.required || false);
37339
+ \u0275\u0275advance();
37340
+ \u0275\u0275conditional(ctx_r0.isLockedEmail(0, field_r4.name) ? 1 : -1);
37331
37341
  }
37332
37342
  }
37333
37343
  function MJCheckoutWidgetComponent_Conditional_17_For_4_Template(rf, ctx) {
@@ -37336,7 +37346,7 @@ function MJCheckoutWidgetComponent_Conditional_17_For_4_Template(rf, ctx) {
37336
37346
  \u0275\u0275text(2);
37337
37347
  \u0275\u0275conditionalCreate(3, MJCheckoutWidgetComponent_Conditional_17_For_4_Conditional_3_Template, 2, 0, "span", 19);
37338
37348
  \u0275\u0275elementEnd();
37339
- \u0275\u0275conditionalCreate(4, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_4_Template, 2, 3, "textarea", 32)(5, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_5_Template, 5, 4, "select", 33)(6, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_6_Template, 4, 2, "label", 34)(7, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_7_Template, 1, 3, "input", 35)(8, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_8_Template, 1, 2, "input", 36)(9, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Template, 1, 4, "input", 37);
37349
+ \u0275\u0275conditionalCreate(4, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_4_Template, 2, 3, "textarea", 32)(5, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_5_Template, 5, 4, "select", 33)(6, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_6_Template, 4, 2, "label", 34)(7, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_7_Template, 1, 3, "input", 35)(8, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_8_Template, 1, 2, "input", 36)(9, MJCheckoutWidgetComponent_Conditional_17_For_4_Case_9_Template, 2, 6);
37340
37350
  \u0275\u0275elementEnd();
37341
37351
  }
37342
37352
  if (rf & 2) {
@@ -37376,7 +37386,7 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Conditional_3_Temp
37376
37386
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_4_Template(rf, ctx) {
37377
37387
  if (rf & 1) {
37378
37388
  const _r12 = \u0275\u0275getCurrentView();
37379
- \u0275\u0275elementStart(0, "textarea", 38);
37389
+ \u0275\u0275elementStart(0, "textarea", 37);
37380
37390
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_4_Template_textarea_ngModelChange_0_listener($event) {
37381
37391
  \u0275\u0275restoreView(_r12);
37382
37392
  const ctx_r12 = \u0275\u0275nextContext();
@@ -37410,7 +37420,7 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_5_For_4_Templ
37410
37420
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_5_Template(rf, ctx) {
37411
37421
  if (rf & 1) {
37412
37422
  const _r17 = \u0275\u0275getCurrentView();
37413
- \u0275\u0275elementStart(0, "select", 39);
37423
+ \u0275\u0275elementStart(0, "select", 38);
37414
37424
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_5_Template_select_ngModelChange_0_listener($event) {
37415
37425
  \u0275\u0275restoreView(_r17);
37416
37426
  const ctx_r12 = \u0275\u0275nextContext();
@@ -37440,7 +37450,7 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_5_Template(rf
37440
37450
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_6_Template(rf, ctx) {
37441
37451
  if (rf & 1) {
37442
37452
  const _r19 = \u0275\u0275getCurrentView();
37443
- \u0275\u0275elementStart(0, "label", 34)(1, "input", 40);
37453
+ \u0275\u0275elementStart(0, "label", 34)(1, "input", 39);
37444
37454
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_6_Template_input_ngModelChange_1_listener($event) {
37445
37455
  \u0275\u0275restoreView(_r19);
37446
37456
  const ctx_r12 = \u0275\u0275nextContext();
@@ -37466,7 +37476,7 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_6_Template(rf
37466
37476
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_7_Template(rf, ctx) {
37467
37477
  if (rf & 1) {
37468
37478
  const _r20 = \u0275\u0275getCurrentView();
37469
- \u0275\u0275elementStart(0, "input", 41);
37479
+ \u0275\u0275elementStart(0, "input", 40);
37470
37480
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_7_Template_input_ngModelChange_0_listener($event) {
37471
37481
  \u0275\u0275restoreView(_r20);
37472
37482
  const ctx_r12 = \u0275\u0275nextContext();
@@ -37486,7 +37496,7 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_7_Template(rf
37486
37496
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_8_Template(rf, ctx) {
37487
37497
  if (rf & 1) {
37488
37498
  const _r21 = \u0275\u0275getCurrentView();
37489
- \u0275\u0275elementStart(0, "input", 42);
37499
+ \u0275\u0275elementStart(0, "input", 41);
37490
37500
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_8_Template_input_ngModelChange_0_listener($event) {
37491
37501
  \u0275\u0275restoreView(_r21);
37492
37502
  const ctx_r12 = \u0275\u0275nextContext();
@@ -37503,10 +37513,17 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_8_Template(rf
37503
37513
  \u0275\u0275property("ngModel", unit_r16[field_r14.name])("required", field_r14.required || false);
37504
37514
  }
37505
37515
  }
37516
+ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Conditional_1_Template(rf, ctx) {
37517
+ if (rf & 1) {
37518
+ \u0275\u0275elementStart(0, "p", 43);
37519
+ \u0275\u0275text(1, "Your member discount is tied to this verified e-mail.");
37520
+ \u0275\u0275elementEnd();
37521
+ }
37522
+ }
37506
37523
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Template(rf, ctx) {
37507
37524
  if (rf & 1) {
37508
37525
  const _r22 = \u0275\u0275getCurrentView();
37509
- \u0275\u0275elementStart(0, "input", 43);
37526
+ \u0275\u0275elementStart(0, "input", 42);
37510
37527
  \u0275\u0275listener("ngModelChange", function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Template_input_ngModelChange_0_listener($event) {
37511
37528
  \u0275\u0275restoreView(_r22);
37512
37529
  const ctx_r12 = \u0275\u0275nextContext();
@@ -37516,11 +37533,17 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Template(rf
37516
37533
  return \u0275\u0275resetView(ctx_r0.updateUnitField($index_r15, field_r14.name, $event));
37517
37534
  });
37518
37535
  \u0275\u0275elementEnd();
37536
+ \u0275\u0275conditionalCreate(1, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Conditional_1_Template, 2, 0, "p", 43);
37519
37537
  }
37520
37538
  if (rf & 2) {
37521
- const field_r14 = \u0275\u0275nextContext().$implicit;
37539
+ const ctx_r12 = \u0275\u0275nextContext();
37540
+ const field_r14 = ctx_r12.$implicit;
37541
+ const $index_r15 = ctx_r12.$index;
37522
37542
  const unit_r16 = \u0275\u0275nextContext().$implicit;
37523
- \u0275\u0275property("type", field_r14.name.toLowerCase().includes("email") ? "email" : "text")("ngModel", unit_r16[field_r14.name])("placeholder", field_r14.placeholder || "")("required", field_r14.required || false);
37543
+ const ctx_r0 = \u0275\u0275nextContext(2);
37544
+ \u0275\u0275property("type", field_r14.name.toLowerCase().includes("email") ? "email" : "text")("ngModel", unit_r16[field_r14.name])("placeholder", field_r14.placeholder || "")("readonly", ctx_r0.isLockedEmail($index_r15, field_r14.name))("required", field_r14.required || false);
37545
+ \u0275\u0275advance();
37546
+ \u0275\u0275conditional(ctx_r0.isLockedEmail($index_r15, field_r14.name) ? 1 : -1);
37524
37547
  }
37525
37548
  }
37526
37549
  function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Template(rf, ctx) {
@@ -37529,7 +37552,7 @@ function MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Template(rf, ctx)
37529
37552
  \u0275\u0275text(2);
37530
37553
  \u0275\u0275conditionalCreate(3, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Conditional_3_Template, 2, 0, "span", 19);
37531
37554
  \u0275\u0275elementEnd();
37532
- \u0275\u0275conditionalCreate(4, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_4_Template, 2, 3, "textarea", 32)(5, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_5_Template, 5, 4, "select", 33)(6, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_6_Template, 4, 2, "label", 34)(7, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_7_Template, 1, 3, "input", 35)(8, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_8_Template, 1, 2, "input", 36)(9, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Template, 1, 4, "input", 37);
37555
+ \u0275\u0275conditionalCreate(4, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_4_Template, 2, 3, "textarea", 32)(5, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_5_Template, 5, 4, "select", 33)(6, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_6_Template, 4, 2, "label", 34)(7, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_7_Template, 1, 3, "input", 35)(8, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_8_Template, 1, 2, "input", 36)(9, MJCheckoutWidgetComponent_Conditional_18_For_7_For_5_Case_9_Template, 2, 6);
37533
37556
  \u0275\u0275elementEnd();
37534
37557
  }
37535
37558
  if (rf & 2) {
@@ -37839,7 +37862,7 @@ function MJCheckoutWidgetComponent_For_41_Template(rf, ctx) {
37839
37862
  }
37840
37863
  function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_7_Template(rf, ctx) {
37841
37864
  if (rf & 1) {
37842
- \u0275\u0275elementStart(0, "p", 75);
37865
+ \u0275\u0275elementStart(0, "p", 76);
37843
37866
  \u0275\u0275text(1);
37844
37867
  \u0275\u0275elementEnd();
37845
37868
  }
@@ -37851,7 +37874,7 @@ function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_7_T
37851
37874
  }
37852
37875
  function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_8_Template(rf, ctx) {
37853
37876
  if (rf & 1) {
37854
- \u0275\u0275elementStart(0, "p", 76);
37877
+ \u0275\u0275elementStart(0, "p", 77);
37855
37878
  \u0275\u0275text(1);
37856
37879
  \u0275\u0275elementEnd();
37857
37880
  }
@@ -37865,10 +37888,10 @@ function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_8_T
37865
37888
  function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template(rf, ctx) {
37866
37889
  if (rf & 1) {
37867
37890
  const _r35 = \u0275\u0275getCurrentView();
37868
- \u0275\u0275elementStart(0, "div", 66)(1, "label", 71);
37891
+ \u0275\u0275elementStart(0, "div", 66)(1, "label", 72);
37869
37892
  \u0275\u0275text(2, "Promo code");
37870
37893
  \u0275\u0275elementEnd();
37871
- \u0275\u0275elementStart(3, "div", 72)(4, "input", 73);
37894
+ \u0275\u0275elementStart(3, "div", 73)(4, "input", 74);
37872
37895
  \u0275\u0275listener("input", function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template_input_input_4_listener($event) {
37873
37896
  \u0275\u0275restoreView(_r35);
37874
37897
  const ctx_r0 = \u0275\u0275nextContext(2);
@@ -37879,7 +37902,7 @@ function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template(rf, ct
37879
37902
  return \u0275\u0275resetView(ctx_r0.applyPromotionCode());
37880
37903
  });
37881
37904
  \u0275\u0275elementEnd();
37882
- \u0275\u0275elementStart(5, "button", 74);
37905
+ \u0275\u0275elementStart(5, "button", 75);
37883
37906
  \u0275\u0275listener("click", function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template_button_click_5_listener() {
37884
37907
  \u0275\u0275restoreView(_r35);
37885
37908
  const ctx_r0 = \u0275\u0275nextContext(2);
@@ -37887,7 +37910,7 @@ function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template(rf, ct
37887
37910
  });
37888
37911
  \u0275\u0275text(6, "Apply");
37889
37912
  \u0275\u0275elementEnd()();
37890
- \u0275\u0275conditionalCreate(7, MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_7_Template, 2, 1, "p", 75)(8, MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_8_Template, 2, 3, "p", 76);
37913
+ \u0275\u0275conditionalCreate(7, MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_7_Template, 2, 1, "p", 76)(8, MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Conditional_8_Template, 2, 3, "p", 77);
37891
37914
  \u0275\u0275elementEnd();
37892
37915
  }
37893
37916
  if (rf & 2) {
@@ -37905,10 +37928,23 @@ function MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template(rf, ct
37905
37928
  }
37906
37929
  function MJCheckoutWidgetComponent_Conditional_42_Conditional_11_Template(rf, ctx) {
37907
37930
  if (rf & 1) {
37908
- const _r37 = \u0275\u0275getCurrentView();
37909
- \u0275\u0275elementStart(0, "label", 67)(1, "input", 60);
37910
- \u0275\u0275listener("change", function MJCheckoutWidgetComponent_Conditional_42_Conditional_11_Template_input_change_1_listener($event) {
37911
- \u0275\u0275restoreView(_r37);
37931
+ \u0275\u0275elementStart(0, "p", 67);
37932
+ \u0275\u0275text(1);
37933
+ \u0275\u0275elementEnd();
37934
+ }
37935
+ if (rf & 2) {
37936
+ const member_r37 = ctx;
37937
+ const ctx_r0 = \u0275\u0275nextContext(2);
37938
+ \u0275\u0275advance();
37939
+ \u0275\u0275textInterpolate3(" ", member_r37.code ? member_r37.code + " member discount" : "Member discount", ": \u2212", ctx_r0.currencySymbol(), "", member_r37.discount.toFixed(2), " ");
37940
+ }
37941
+ }
37942
+ function MJCheckoutWidgetComponent_Conditional_42_Conditional_12_Template(rf, ctx) {
37943
+ if (rf & 1) {
37944
+ const _r38 = \u0275\u0275getCurrentView();
37945
+ \u0275\u0275elementStart(0, "label", 68)(1, "input", 60);
37946
+ \u0275\u0275listener("change", function MJCheckoutWidgetComponent_Conditional_42_Conditional_12_Template_input_change_1_listener($event) {
37947
+ \u0275\u0275restoreView(_r38);
37912
37948
  const ctx_r0 = \u0275\u0275nextContext(2);
37913
37949
  return \u0275\u0275resetView(ctx_r0.autoRenewConsent.set($event.target.checked));
37914
37950
  });
@@ -37925,12 +37961,12 @@ function MJCheckoutWidgetComponent_Conditional_42_Conditional_11_Template(rf, ct
37925
37961
  \u0275\u0275textInterpolate(ctx);
37926
37962
  }
37927
37963
  }
37928
- function MJCheckoutWidgetComponent_Conditional_42_Conditional_12_Template(rf, ctx) {
37964
+ function MJCheckoutWidgetComponent_Conditional_42_Conditional_13_Template(rf, ctx) {
37929
37965
  if (rf & 1) {
37930
- \u0275\u0275elementStart(0, "div", 68)(1, "span", 69);
37966
+ \u0275\u0275elementStart(0, "div", 69)(1, "span", 70);
37931
37967
  \u0275\u0275text(2, "Sales Tax");
37932
37968
  \u0275\u0275elementEnd();
37933
- \u0275\u0275elementStart(3, "span", 70);
37969
+ \u0275\u0275elementStart(3, "span", 71);
37934
37970
  \u0275\u0275text(4);
37935
37971
  \u0275\u0275elementEnd()();
37936
37972
  }
@@ -37954,31 +37990,35 @@ function MJCheckoutWidgetComponent_Conditional_42_Template(rf, ctx) {
37954
37990
  \u0275\u0275text(9, "Secured by Stripe \u2022 PCI-DSS Level 1 Certified \u2022 End-to-end Encrypted");
37955
37991
  \u0275\u0275elementEnd()()()();
37956
37992
  \u0275\u0275conditionalCreate(10, MJCheckoutWidgetComponent_Conditional_42_Conditional_10_Template, 9, 8, "div", 66);
37957
- \u0275\u0275conditionalCreate(11, MJCheckoutWidgetComponent_Conditional_42_Conditional_11_Template, 4, 3, "label", 67);
37958
- \u0275\u0275conditionalCreate(12, MJCheckoutWidgetComponent_Conditional_42_Conditional_12_Template, 5, 2, "div", 68);
37959
- \u0275\u0275elementStart(13, "div", 68)(14, "span", 69);
37960
- \u0275\u0275text(15, "Total Due");
37993
+ \u0275\u0275conditionalCreate(11, MJCheckoutWidgetComponent_Conditional_42_Conditional_11_Template, 2, 3, "p", 67);
37994
+ \u0275\u0275conditionalCreate(12, MJCheckoutWidgetComponent_Conditional_42_Conditional_12_Template, 4, 3, "label", 68);
37995
+ \u0275\u0275conditionalCreate(13, MJCheckoutWidgetComponent_Conditional_42_Conditional_13_Template, 5, 2, "div", 69);
37996
+ \u0275\u0275elementStart(14, "div", 69)(15, "span", 70);
37997
+ \u0275\u0275text(16, "Total Due");
37961
37998
  \u0275\u0275elementEnd();
37962
- \u0275\u0275elementStart(16, "span", 70);
37963
- \u0275\u0275text(17);
37999
+ \u0275\u0275elementStart(17, "span", 71);
38000
+ \u0275\u0275text(18);
37964
38001
  \u0275\u0275elementEnd()();
37965
38002
  }
37966
38003
  if (rf & 2) {
37967
38004
  let tmp_2_0;
38005
+ let tmp_3_0;
37968
38006
  const ctx_r0 = \u0275\u0275nextContext();
37969
38007
  \u0275\u0275advance(10);
37970
38008
  \u0275\u0275conditional(ctx_r0.allowsPromotionCodes() ? 10 : -1);
37971
38009
  \u0275\u0275advance();
37972
- \u0275\u0275conditional((tmp_2_0 = ctx_r0.autoRenewConsentText()) ? 11 : -1, tmp_2_0);
38010
+ \u0275\u0275conditional((tmp_2_0 = ctx_r0.activeMemberDiscount()) ? 11 : -1, tmp_2_0);
38011
+ \u0275\u0275advance();
38012
+ \u0275\u0275conditional((tmp_3_0 = ctx_r0.autoRenewConsentText()) ? 12 : -1, tmp_3_0);
37973
38013
  \u0275\u0275advance();
37974
- \u0275\u0275conditional(ctx_r0.quotedTax !== null ? 12 : -1);
38014
+ \u0275\u0275conditional(ctx_r0.quotedTax !== null ? 13 : -1);
37975
38015
  \u0275\u0275advance(5);
37976
38016
  \u0275\u0275textInterpolate2("", ctx_r0.currencySymbol(), "", ctx_r0.totalGross().toFixed(2));
37977
38017
  }
37978
38018
  }
37979
38019
  function MJCheckoutWidgetComponent_Conditional_45_Template(rf, ctx) {
37980
38020
  if (rf & 1) {
37981
- \u0275\u0275element(0, "span", 77);
38021
+ \u0275\u0275element(0, "span", 78);
37982
38022
  \u0275\u0275elementStart(1, "span");
37983
38023
  \u0275\u0275text(2, "Processing...");
37984
38024
  \u0275\u0275elementEnd();
@@ -38046,6 +38086,23 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38046
38086
  }
38047
38087
  /** Why the last code could not be used, in the server's words. Set by the host. */
38048
38088
  promotionError = null;
38089
+ _memberDiscount = signal(null, ...ngDevMode ? [{ debugName: "_memberDiscount" }] : []);
38090
+ /**
38091
+ * The verified member's discount the server priced this checkout with, or null (#919). Set by the
38092
+ * host from a draft. While it holds, the widget shows it as a discount line and hides the
38093
+ * promo-code box: the member code is the one the order carries, as it was on CDP's checkout.
38094
+ */
38095
+ set memberDiscount(val) {
38096
+ this._memberDiscount.set(val);
38097
+ }
38098
+ get memberDiscount() {
38099
+ return this._memberDiscount();
38100
+ }
38101
+ /**
38102
+ * True when the e-mail is the one a member token was signed for (#919). The field is read-only,
38103
+ * since the discount is bound to that address and a changed one would price at full rate.
38104
+ */
38105
+ lockEmail = false;
38049
38106
  _serverPricedTotal = signal(null, ...ngDevMode ? [{ debugName: "_serverPricedTotal" }] : []);
38050
38107
  /**
38051
38108
  * The total the server last priced this checkout at, or null. Set by the host after a draft, so a
@@ -38082,6 +38139,12 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38082
38139
  cancelled = new EventEmitter();
38083
38140
  /** Emitted when an input that changes the price (quantity, location) changes, so the host drops its quote. */
38084
38141
  quoteInvalidated = new EventEmitter();
38142
+ /**
38143
+ * The form as it stands, with no typed code, each time a price input changes while the e-mail
38144
+ * and billing location are complete (#919). A host with a member token prices it in the
38145
+ * background so the buyer sees the member discount before Pay; other hosts ignore it.
38146
+ */
38147
+ quoteRequested = new EventEmitter();
38085
38148
  // Internal error message for client-side validation failures
38086
38149
  internalErrorMessage = signal(null, ...ngDevMode ? [{ debugName: "internalErrorMessage" }] : []);
38087
38150
  displayErrorMessage = computed(() => this._errorMessage() || this.internalErrorMessage(), ...ngDevMode ? [{ debugName: "displayErrorMessage" }] : []);
@@ -38221,8 +38284,16 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38221
38284
  const price = this._config()?.unitPrice ?? 0;
38222
38285
  return price * this.quantity();
38223
38286
  }, ...ngDevMode ? [{ debugName: "subtotal" }] : []);
38224
- /** Whether this widget takes promotion codes — only for a paid checkout whose configuration invites them. */
38225
- allowsPromotionCodes = computed(() => this._config()?.allowCoupons === true && !this.isFree(), ...ngDevMode ? [{ debugName: "allowsPromotionCodes" }] : []);
38287
+ /** The member discount, when it was priced for the current quantity; a stale one is ignored. */
38288
+ activeMemberDiscount = computed(() => {
38289
+ const discount = this._memberDiscount();
38290
+ return discount && discount.quantity === this.quantity() ? discount : null;
38291
+ }, ...ngDevMode ? [{ debugName: "activeMemberDiscount" }] : []);
38292
+ /**
38293
+ * Whether this widget takes promotion codes — only for a paid checkout whose configuration invites
38294
+ * them, and not while a verified member's discount applies (#919).
38295
+ */
38296
+ allowsPromotionCodes = computed(() => this._config()?.allowCoupons === true && !this.isFree() && !this.activeMemberDiscount(), ...ngDevMode ? [{ debugName: "allowsPromotionCodes" }] : []);
38226
38297
  /** The applied promotion, when it was priced for the current quantity; a stale one is ignored. */
38227
38298
  activePromotion = computed(() => {
38228
38299
  const applied = this._appliedPromotion();
@@ -38361,20 +38432,38 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38361
38432
  this.quantity.set(clamped);
38362
38433
  this.syncUnits();
38363
38434
  this.quoteInvalidated.emit();
38435
+ this.requestQuote();
38364
38436
  this.executeLifecycleHook("onQuantityChange", { quantity: clamped });
38365
38437
  }
38366
38438
  onBillingCountryChange(country) {
38367
38439
  this.billingCountry.set(country ?? "");
38368
38440
  this.billingRegion.set("");
38369
38441
  this.quoteInvalidated.emit();
38442
+ this.requestQuote();
38370
38443
  }
38371
38444
  onBillingRegionChange(region) {
38372
38445
  this.billingRegion.set(region ?? "");
38373
38446
  this.quoteInvalidated.emit();
38447
+ this.requestQuote();
38374
38448
  }
38375
38449
  onBillingPostalCodeChange(postalCode) {
38376
38450
  this.billingPostalCode.set(postalCode ?? "");
38377
38451
  this.quoteInvalidated.emit();
38452
+ this.requestQuote();
38453
+ }
38454
+ /** The buyer's e-mail looks complete: the same check `isFormValid` makes. */
38455
+ hasValidEmail() {
38456
+ const em = String(this.units()[0]?.["email"] || this.email()).trim();
38457
+ return em.includes("@");
38458
+ }
38459
+ /**
38460
+ * Ask the host for a background price once the e-mail and the billing location are complete
38461
+ * (#919). Never blocks the form; the host decides whether to price at all.
38462
+ */
38463
+ requestQuote() {
38464
+ if (!this.hasValidEmail() || !this.isBillingLocationValid())
38465
+ return;
38466
+ this.quoteRequested.emit({ ...this.buildSubmission(), promotionCode: void 0 });
38378
38467
  }
38379
38468
  syncUnits() {
38380
38469
  const currentQty = this.quantity();
@@ -38433,8 +38522,17 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38433
38522
  this.title.set(String(value ?? ""));
38434
38523
  }
38435
38524
  this.units.set(list);
38525
+ if (index === 0 && fieldName === "email") {
38526
+ if (this._memberDiscount())
38527
+ this.quoteInvalidated.emit();
38528
+ this.requestQuote();
38529
+ }
38436
38530
  }
38437
38531
  }
38532
+ /** True for the first unit's e-mail field while it is locked to a member token's address (#919). */
38533
+ isLockedEmail(index, fieldName) {
38534
+ return this.lockEmail && index === 0 && fieldName.toLowerCase() === "email";
38535
+ }
38438
38536
  updateAttendee(index, field, value) {
38439
38537
  this.updateUnitField(index, field, value);
38440
38538
  }
@@ -38564,13 +38662,15 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38564
38662
  stripePaymentMethodId: this.isFree() ? void 0 : this.stripePaymentMethodId ?? void 0,
38565
38663
  sessionKey: finalSessionKey,
38566
38664
  autoRenewConsent: this.autoRenewConsentText() ? this.autoRenewConsent() : void 0,
38665
+ // allowsPromotionCodes is false while a member discount applies: the box is hidden, so a
38666
+ // code typed before it appeared is not sent behind the buyer's back.
38567
38667
  promotionCode: this.allowsPromotionCodes() && typedCode ? typedCode : void 0
38568
38668
  };
38569
38669
  }
38570
38670
  static \u0275fac = function MJCheckoutWidgetComponent_Factory(__ngFactoryType__) {
38571
38671
  return new (__ngFactoryType__ || _MJCheckoutWidgetComponent)(\u0275\u0275directiveInject(ElementRef), \u0275\u0275directiveInject(Renderer2));
38572
38672
  };
38573
- static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _MJCheckoutWidgetComponent, selectors: [["mj-checkout-widget"]], inputs: { config: "config", distributionSlug: "distributionSlug", sessionKey: "sessionKey", isProcessing: "isProcessing", errorMessage: "errorMessage", isPaymentReady: "isPaymentReady", stripePaymentMethodId: "stripePaymentMethodId", prefillEmail: "prefillEmail", appliedPromotion: "appliedPromotion", promotionError: "promotionError", serverPricedTotal: "serverPricedTotal", quotedTotal: "quotedTotal", quotedTax: "quotedTax" }, outputs: { submitted: "submitted", promotionCodeApplied: "promotionCodeApplied", cancelled: "cancelled", quoteInvalidated: "quoteInvalidated" }, features: [\u0275\u0275NgOnChangesFeature], decls: 50, vars: 35, consts: [[1, "mj-checkout-widget-container"], [1, "mj-widget-header"], [1, "mj-widget-title"], [1, "mj-widget-description"], ["role", "alert", 1, "mj-widget-error-banner"], [1, "mj-widget-summary-card"], [1, "mj-summary-row"], [1, "mj-summary-item-info"], [1, "mj-product-name"], [1, "mj-badge-free"], [1, "mj-summary-price"], [1, "mj-price-free"], [1, "mj-price-amount"], [1, "mj-quantity-selector-row"], [1, "mj-widget-form-section"], [1, "mj-section-title"], [1, "mj-form-grid"], [1, "mj-form-group"], [1, "mj-label"], [1, "mj-required"], ["autocomplete", "country", "required", "", 1, "mj-select", 3, "ngModelChange", "id", "ngModel"], [3, "ngValue"], ["type", "text", "autocomplete", "postal-code", "maxlength", "20", 1, "mj-input", 3, "ngModelChange", "id", "ngModel", "required"], [1, "mj-widget-actions"], ["type", "button", 1, "mj-btn-submit", 3, "click", "disabled"], ["type", "button", 1, "mj-btn-cancel", 3, "click", "disabled"], [1, "mj-error-icon"], ["for", "quantityInput", 1, "mj-label"], [1, "mj-qty-controls"], ["type", "button", 1, "mj-qty-btn", 3, "click", "disabled"], ["id", "quantityInput", "type", "number", "min", "1", 1, "mj-qty-input", 3, "ngModelChange", "ngModel", "max"], [1, "mj-form-group", 3, "full-width"], [1, "mj-input", "mj-textarea", 3, "ngModel", "placeholder", "required"], [1, "mj-select", 3, "ngModel", "required"], [1, "mj-checkbox-label"], ["type", "number", 1, "mj-input", 3, "ngModel", "placeholder", "required"], ["type", "date", 1, "mj-input", 3, "ngModel", "required"], [1, "mj-input", 3, "type", "ngModel", "placeholder", "required"], [1, "mj-input", "mj-textarea", 3, "ngModelChange", "ngModel", "placeholder", "required"], [1, "mj-select", 3, "ngModelChange", "ngModel", "required"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "mj-input", 3, "ngModelChange", "ngModel", "placeholder", "required"], ["type", "date", 1, "mj-input", 3, "ngModelChange", "ngModel", "required"], [1, "mj-input", 3, "ngModelChange", "type", "ngModel", "placeholder", "required"], [1, "mj-multi-attendee-header"], ["type", "button", 1, "mj-btn-link", 3, "click"], [1, "mj-attendee-matrix"], [1, "mj-attendee-card"], [1, "mj-attendee-card-title"], ["autocomplete", "address-level1", "required", "", 1, "mj-select", 3, "ngModelChange", "id", "ngModel"], [1, "mj-form-group", "full-width"], ["type", "text", 1, "mj-input", 3, "id", "ngModel", "required"], [1, "mj-select", 3, "ngModelChange", "id", "ngModel", "required"], ["type", "text", "placeholder", "Please specify", "required", "", 1, "mj-input", "mj-question-other", 3, "ngModel"], ["type", "text", "placeholder", "Please specify", "required", "", 1, "mj-input", "mj-question-other", 3, "ngModelChange", "ngModel"], ["type", "text", 1, "mj-input", 3, "ngModelChange", "id", "ngModel", "required"], [1, "mj-choice-group"], [1, "mj-choice-count"], [1, "mj-choice-options"], [1, "mj-checkbox-label", 3, "is-disabled"], ["type", "checkbox", 3, "change", "checked", "disabled"], [1, "mj-widget-payment-section"], [1, "mj-stripe-container"], ["id", "stripe-card-element", 1, "mj-stripe-mount-point"], [1, "mj-stripe-badge"], [1, "mj-stripe-lock-icon"], [1, "mj-checkout-promo"], [1, "mj-checkout-consent"], [1, "mj-checkout-total-row"], [1, "mj-total-label"], [1, "mj-total-amount"], [1, "mj-checkout-promo__label", 3, "for"], [1, "mj-checkout-promo__row"], ["type", "text", "autocomplete", "off", "maxlength", "60", 1, "mj-input", "mj-checkout-promo__input", 3, "input", "keydown.enter", "id", "value", "disabled"], ["type", "button", 1, "mj-checkout-promo__apply", 3, "click", "disabled"], ["role", "alert", 1, "mj-checkout-promo__error"], ["role", "status", 1, "mj-checkout-promo__applied"], [1, "mj-spinner"]], template: function MJCheckoutWidgetComponent_Template(rf, ctx) {
38673
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _MJCheckoutWidgetComponent, selectors: [["mj-checkout-widget"]], inputs: { config: "config", distributionSlug: "distributionSlug", sessionKey: "sessionKey", isProcessing: "isProcessing", errorMessage: "errorMessage", isPaymentReady: "isPaymentReady", stripePaymentMethodId: "stripePaymentMethodId", prefillEmail: "prefillEmail", appliedPromotion: "appliedPromotion", promotionError: "promotionError", memberDiscount: "memberDiscount", lockEmail: "lockEmail", serverPricedTotal: "serverPricedTotal", quotedTotal: "quotedTotal", quotedTax: "quotedTax" }, outputs: { submitted: "submitted", promotionCodeApplied: "promotionCodeApplied", cancelled: "cancelled", quoteInvalidated: "quoteInvalidated", quoteRequested: "quoteRequested" }, features: [\u0275\u0275NgOnChangesFeature], decls: 50, vars: 35, consts: [[1, "mj-checkout-widget-container"], [1, "mj-widget-header"], [1, "mj-widget-title"], [1, "mj-widget-description"], ["role", "alert", 1, "mj-widget-error-banner"], [1, "mj-widget-summary-card"], [1, "mj-summary-row"], [1, "mj-summary-item-info"], [1, "mj-product-name"], [1, "mj-badge-free"], [1, "mj-summary-price"], [1, "mj-price-free"], [1, "mj-price-amount"], [1, "mj-quantity-selector-row"], [1, "mj-widget-form-section"], [1, "mj-section-title"], [1, "mj-form-grid"], [1, "mj-form-group"], [1, "mj-label"], [1, "mj-required"], ["autocomplete", "country", "required", "", 1, "mj-select", 3, "ngModelChange", "id", "ngModel"], [3, "ngValue"], ["type", "text", "autocomplete", "postal-code", "maxlength", "20", 1, "mj-input", 3, "ngModelChange", "id", "ngModel", "required"], [1, "mj-widget-actions"], ["type", "button", 1, "mj-btn-submit", 3, "click", "disabled"], ["type", "button", 1, "mj-btn-cancel", 3, "click", "disabled"], [1, "mj-error-icon"], ["for", "quantityInput", 1, "mj-label"], [1, "mj-qty-controls"], ["type", "button", 1, "mj-qty-btn", 3, "click", "disabled"], ["id", "quantityInput", "type", "number", "min", "1", 1, "mj-qty-input", 3, "ngModelChange", "ngModel", "max"], [1, "mj-form-group", 3, "full-width"], [1, "mj-input", "mj-textarea", 3, "ngModel", "placeholder", "required"], [1, "mj-select", 3, "ngModel", "required"], [1, "mj-checkbox-label"], ["type", "number", 1, "mj-input", 3, "ngModel", "placeholder", "required"], ["type", "date", 1, "mj-input", 3, "ngModel", "required"], [1, "mj-input", "mj-textarea", 3, "ngModelChange", "ngModel", "placeholder", "required"], [1, "mj-select", 3, "ngModelChange", "ngModel", "required"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "mj-input", 3, "ngModelChange", "ngModel", "placeholder", "required"], ["type", "date", 1, "mj-input", 3, "ngModelChange", "ngModel", "required"], [1, "mj-input", 3, "ngModelChange", "type", "ngModel", "placeholder", "readonly", "required"], [1, "mj-field-hint"], [1, "mj-multi-attendee-header"], ["type", "button", 1, "mj-btn-link", 3, "click"], [1, "mj-attendee-matrix"], [1, "mj-attendee-card"], [1, "mj-attendee-card-title"], ["autocomplete", "address-level1", "required", "", 1, "mj-select", 3, "ngModelChange", "id", "ngModel"], [1, "mj-form-group", "full-width"], ["type", "text", 1, "mj-input", 3, "id", "ngModel", "required"], [1, "mj-select", 3, "ngModelChange", "id", "ngModel", "required"], ["type", "text", "placeholder", "Please specify", "required", "", 1, "mj-input", "mj-question-other", 3, "ngModel"], ["type", "text", "placeholder", "Please specify", "required", "", 1, "mj-input", "mj-question-other", 3, "ngModelChange", "ngModel"], ["type", "text", 1, "mj-input", 3, "ngModelChange", "id", "ngModel", "required"], [1, "mj-choice-group"], [1, "mj-choice-count"], [1, "mj-choice-options"], [1, "mj-checkbox-label", 3, "is-disabled"], ["type", "checkbox", 3, "change", "checked", "disabled"], [1, "mj-widget-payment-section"], [1, "mj-stripe-container"], ["id", "stripe-card-element", 1, "mj-stripe-mount-point"], [1, "mj-stripe-badge"], [1, "mj-stripe-lock-icon"], [1, "mj-checkout-promo"], ["role", "status", 1, "mj-checkout-promo__applied", "mj-checkout-member-discount"], [1, "mj-checkout-consent"], [1, "mj-checkout-total-row"], [1, "mj-total-label"], [1, "mj-total-amount"], [1, "mj-checkout-promo__label", 3, "for"], [1, "mj-checkout-promo__row"], ["type", "text", "autocomplete", "off", "maxlength", "60", 1, "mj-input", "mj-checkout-promo__input", 3, "input", "keydown.enter", "id", "value", "disabled"], ["type", "button", 1, "mj-checkout-promo__apply", 3, "click", "disabled"], ["role", "alert", 1, "mj-checkout-promo__error"], ["role", "status", 1, "mj-checkout-promo__applied"], [1, "mj-spinner"]], template: function MJCheckoutWidgetComponent_Template(rf, ctx) {
38574
38674
  if (rf & 1) {
38575
38675
  \u0275\u0275elementStart(0, "div", 0)(1, "header", 1)(2, "h2", 2);
38576
38676
  \u0275\u0275text(3);
@@ -38620,7 +38720,7 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38620
38720
  \u0275\u0275elementEnd()()()();
38621
38721
  \u0275\u0275conditionalCreate(39, MJCheckoutWidgetComponent_Conditional_39_Template, 6, 0, "section", 14);
38622
38722
  \u0275\u0275repeaterCreate(40, MJCheckoutWidgetComponent_For_41_Template, 10, 3, "section", 14, _forTrack1);
38623
- \u0275\u0275conditionalCreate(42, MJCheckoutWidgetComponent_Conditional_42_Template, 18, 5);
38723
+ \u0275\u0275conditionalCreate(42, MJCheckoutWidgetComponent_Conditional_42_Template, 19, 6);
38624
38724
  \u0275\u0275elementStart(43, "div", 23)(44, "button", 24);
38625
38725
  \u0275\u0275listener("click", function MJCheckoutWidgetComponent_Template_button_click_44_listener() {
38626
38726
  return ctx.handleSubmit();
@@ -38687,7 +38787,7 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38687
38787
  \u0275\u0275advance(3);
38688
38788
  \u0275\u0275property("disabled", ctx.isProcessing);
38689
38789
  }
38690
- }, dependencies: [CommonModule, FormsModule, NgSelectOption, \u0275NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, NgControlStatus, RequiredValidator, MaxLengthValidator, MinValidator, MaxValidator, NgModel], styles: ['[_nghost-%COMP%] {\n display: block;\n font-family: var(--mj-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);\n color: var(--mj-text-color, #1e293b);\n}\n\n.mj-checkout-widget-container[_ngcontent-%COMP%] {\n max-width: 560px;\n margin: 0 auto;\n background: var(--mj-bg-color, #ffffff);\n border: 1px solid #e2e8f0;\n border-radius: var(--mj-border-radius, 8px);\n padding: 24px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);\n}\n\n.mj-widget-header[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.mj-widget-title[_ngcontent-%COMP%] {\n margin: 0 0 6px 0;\n font-size: 1.35rem;\n font-weight: 700;\n color: var(--mj-text-color, #0f172a);\n}\n\n.mj-widget-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9rem;\n color: #64748b;\n line-height: 1.4;\n}\n\n.mj-widget-error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #fef2f2;\n border: 1px solid #f87171;\n color: #991b1b;\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 18px;\n font-size: 0.875rem;\n}\n\n.mj-error-icon[_ngcontent-%COMP%] {\n font-size: 1rem;\n}\n\n.mj-widget-summary-card[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px 16px;\n margin-bottom: 20px;\n}\n\n.mj-summary-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.mj-summary-price[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.mj-widget-form-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.mj-summary-item-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-product-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 1rem;\n color: #1e293b;\n}\n\n.mj-badge-free[_ngcontent-%COMP%] {\n background: #dcfce7;\n color: #166534;\n font-size: 0.75rem;\n font-weight: 700;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.mj-price-free[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #166534;\n font-size: 1.1rem;\n}\n\n.mj-price-amount[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #0f172a;\n font-size: 1.1rem;\n}\n\n.mj-quantity-selector-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #cbd5e1;\n}\n\n.mj-qty-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-qty-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mj-qty-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.mj-qty-input[_ngcontent-%COMP%] {\n width: 44px;\n height: 28px;\n text-align: center;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.mj-section-title[_ngcontent-%COMP%] {\n font-size: 1rem;\n font-weight: 600;\n margin: 0 0 12px 0;\n color: #334155;\n}\n\n.mj-form-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.mj-form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.mj-form-group.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.mj-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: #475569;\n}\n\n.mj-required[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.mj-input[_ngcontent-%COMP%], .mj-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 0.9rem;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n background: #ffffff;\n color: #1e293b;\n outline: none;\n transition: border-color 0.15s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.mj-textarea[_ngcontent-%COMP%] {\n min-height: 70px;\n resize: vertical;\n font-family: inherit;\n}\n\n.mj-select[_ngcontent-%COMP%] {\n min-height: 38px;\n}\n\n.mj-checkbox-label[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 0.9rem;\n font-weight: 400;\n color: #334155;\n margin-top: 4px;\n}\n\n\n\n.mj-question-other[_ngcontent-%COMP%] {\n margin-top: 8px;\n}\n\n\n\n.mj-choice-group[_ngcontent-%COMP%] {\n border: 0;\n margin: 0;\n padding: 0;\n}\n\n.mj-choice-count[_ngcontent-%COMP%] {\n font-weight: normal;\n color: #64748b;\n}\n\n.mj-choice-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-checkbox-label.is-disabled[_ngcontent-%COMP%] {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.mj-input[_ngcontent-%COMP%]:focus, .mj-select[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-primary-color, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n}\n\n.mj-multi-attendee-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.mj-btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-primary-color, #2563eb);\n font-size: 0.8rem;\n cursor: pointer;\n text-decoration: underline;\n padding: 0;\n}\n\n.mj-attendee-matrix[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n margin-bottom: 20px;\n}\n\n.mj-attendee-card[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px 14px;\n}\n\n.mj-attendee-card-title[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 600;\n color: #475569;\n margin-bottom: 10px;\n}\n\n\n\n.mj-widget-payment-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e2e8f0;\n}\n\n.mj-stripe-container[_ngcontent-%COMP%] {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px;\n margin-bottom: 16px;\n}\n\n.mj-stripe-mount-point[_ngcontent-%COMP%] {\n min-height: 40px;\n}\n\n.mj-stripe-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n font-size: 0.75rem;\n color: #64748b;\n}\n\n.mj-stripe-lock-icon[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n.mj-checkout-total-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n border-top: 1px solid #e2e8f0;\n margin-top: 10px;\n margin-bottom: 18px;\n}\n\n.mj-total-label[_ngcontent-%COMP%] {\n font-weight: 700;\n font-size: 1.05rem;\n color: #0f172a;\n}\n\n.mj-total-amount[_ngcontent-%COMP%] {\n font-weight: 800;\n font-size: 1.25rem;\n color: var(--mj-primary-color, #2563eb);\n}\n\n.mj-widget-actions[_ngcontent-%COMP%] {\n margin-top: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.mj-btn-submit[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n background: var(--mj-primary-color, #2563eb);\n color: #ffffff;\n font-size: 1rem;\n font-weight: 600;\n border: none;\n border-radius: var(--mj-border-radius, 8px);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: opacity 0.15s ease;\n}\n\n.mj-btn-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 0.92;\n}\n\n.mj-btn-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-btn-cancel[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n color: #64748b;\n font-size: 0.875rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n text-align: center;\n}\n\n.mj-btn-cancel[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: #334155;\n text-decoration: underline;\n}\n\n.mj-spinner[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border: 2px solid #ffffff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_mj-spin 0.8s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_mj-spin {\n to { transform: rotate(360deg); }\n}\n\n.mj-checkout-consent[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n align-items: flex-start;\n margin: 0.75rem 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.4;\n}\n.mj-checkout-consent[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n margin-top: 0.2rem;\n}\n\n\n\n\n\n.mj-checkbox-label[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%], \n.mj-checkout-consent[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%] {\n width: auto;\n height: auto;\n padding: 0;\n border: 0;\n flex: 0 0 auto;\n}\n\n.mj-checkout-promo[_ngcontent-%COMP%] {\n margin: 0.75rem 0;\n}\n.mj-checkout-promo__label[_ngcontent-%COMP%] {\n display: block;\n font-size: 0.875rem;\n margin-bottom: 0.25rem;\n}\n.mj-checkout-promo__row[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n}\n.mj-checkout-promo__input[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n}\n.mj-checkout-promo__error[_ngcontent-%COMP%] {\n color: var(--mj-error-color, #b91c1c);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-promo__applied[_ngcontent-%COMP%] {\n color: var(--mj-success-color, #15803d);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-promo__apply[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n padding: 8px 14px;\n background: transparent;\n color: var(--mj-primary-color, #2563eb);\n border: 1px solid var(--mj-border-color, #cbd5e1);\n border-radius: var(--mj-border-radius, 8px);\n font-size: 0.875rem;\n font-weight: 600;\n cursor: pointer;\n}\n.mj-checkout-promo__apply[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}'], changeDetection: 0 });
38790
+ }, dependencies: [CommonModule, FormsModule, NgSelectOption, \u0275NgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, NgControlStatus, RequiredValidator, MaxLengthValidator, MinValidator, MaxValidator, NgModel], styles: ['[_nghost-%COMP%] {\n display: block;\n font-family: var(--mj-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);\n color: var(--mj-text-color, #1e293b);\n}\n\n.mj-checkout-widget-container[_ngcontent-%COMP%] {\n max-width: 560px;\n margin: 0 auto;\n background: var(--mj-bg-color, #ffffff);\n border: 1px solid #e2e8f0;\n border-radius: var(--mj-border-radius, 8px);\n padding: 24px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);\n}\n\n.mj-widget-header[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.mj-widget-title[_ngcontent-%COMP%] {\n margin: 0 0 6px 0;\n font-size: 1.35rem;\n font-weight: 700;\n color: var(--mj-text-color, #0f172a);\n}\n\n.mj-widget-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9rem;\n color: #64748b;\n line-height: 1.4;\n}\n\n.mj-widget-error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #fef2f2;\n border: 1px solid #f87171;\n color: #991b1b;\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 18px;\n font-size: 0.875rem;\n}\n\n.mj-error-icon[_ngcontent-%COMP%] {\n font-size: 1rem;\n}\n\n.mj-widget-summary-card[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px 16px;\n margin-bottom: 20px;\n}\n\n.mj-summary-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.mj-summary-price[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.mj-widget-form-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.mj-summary-item-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-product-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 1rem;\n color: #1e293b;\n}\n\n.mj-badge-free[_ngcontent-%COMP%] {\n background: #dcfce7;\n color: #166534;\n font-size: 0.75rem;\n font-weight: 700;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.mj-price-free[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #166534;\n font-size: 1.1rem;\n}\n\n.mj-price-amount[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #0f172a;\n font-size: 1.1rem;\n}\n\n.mj-quantity-selector-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #cbd5e1;\n}\n\n.mj-qty-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-qty-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mj-qty-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.mj-qty-input[_ngcontent-%COMP%] {\n width: 44px;\n height: 28px;\n text-align: center;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.mj-section-title[_ngcontent-%COMP%] {\n font-size: 1rem;\n font-weight: 600;\n margin: 0 0 12px 0;\n color: #334155;\n}\n\n.mj-form-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.mj-form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.mj-form-group.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.mj-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n font-weight: 500;\n color: #475569;\n}\n\n.mj-required[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.mj-input[_ngcontent-%COMP%], .mj-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 0.9rem;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n background: #ffffff;\n color: #1e293b;\n outline: none;\n transition: border-color 0.15s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.mj-textarea[_ngcontent-%COMP%] {\n min-height: 70px;\n resize: vertical;\n font-family: inherit;\n}\n\n.mj-select[_ngcontent-%COMP%] {\n min-height: 38px;\n}\n\n.mj-checkbox-label[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 0.9rem;\n font-weight: 400;\n color: #334155;\n margin-top: 4px;\n}\n\n\n\n.mj-question-other[_ngcontent-%COMP%] {\n margin-top: 8px;\n}\n\n\n\n.mj-choice-group[_ngcontent-%COMP%] {\n border: 0;\n margin: 0;\n padding: 0;\n}\n\n.mj-choice-count[_ngcontent-%COMP%] {\n font-weight: normal;\n color: #64748b;\n}\n\n.mj-choice-options[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-checkbox-label.is-disabled[_ngcontent-%COMP%] {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.mj-input[_ngcontent-%COMP%]:focus, .mj-select[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-primary-color, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n}\n\n\n\n.mj-input[readonly][_ngcontent-%COMP%] {\n background: #f1f5f9;\n color: #475569;\n cursor: default;\n}\n\n.mj-field-hint[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: #64748b;\n margin: 0.25rem 0 0;\n}\n\n.mj-multi-attendee-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.mj-btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-primary-color, #2563eb);\n font-size: 0.8rem;\n cursor: pointer;\n text-decoration: underline;\n padding: 0;\n}\n\n.mj-attendee-matrix[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 14px;\n margin-bottom: 20px;\n}\n\n.mj-attendee-card[_ngcontent-%COMP%] {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px 14px;\n}\n\n.mj-attendee-card-title[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 600;\n color: #475569;\n margin-bottom: 10px;\n}\n\n\n\n.mj-widget-payment-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e2e8f0;\n}\n\n.mj-stripe-container[_ngcontent-%COMP%] {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px;\n margin-bottom: 16px;\n}\n\n.mj-stripe-mount-point[_ngcontent-%COMP%] {\n min-height: 40px;\n}\n\n.mj-stripe-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n font-size: 0.75rem;\n color: #64748b;\n}\n\n.mj-stripe-lock-icon[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n.mj-checkout-total-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n border-top: 1px solid #e2e8f0;\n margin-top: 10px;\n margin-bottom: 18px;\n}\n\n.mj-total-label[_ngcontent-%COMP%] {\n font-weight: 700;\n font-size: 1.05rem;\n color: #0f172a;\n}\n\n.mj-total-amount[_ngcontent-%COMP%] {\n font-weight: 800;\n font-size: 1.25rem;\n color: var(--mj-primary-color, #2563eb);\n}\n\n.mj-widget-actions[_ngcontent-%COMP%] {\n margin-top: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.mj-btn-submit[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n background: var(--mj-primary-color, #2563eb);\n color: #ffffff;\n font-size: 1rem;\n font-weight: 600;\n border: none;\n border-radius: var(--mj-border-radius, 8px);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: opacity 0.15s ease;\n}\n\n.mj-btn-submit[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 0.92;\n}\n\n.mj-btn-submit[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-btn-cancel[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n color: #64748b;\n font-size: 0.875rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n text-align: center;\n}\n\n.mj-btn-cancel[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: #334155;\n text-decoration: underline;\n}\n\n.mj-spinner[_ngcontent-%COMP%] {\n width: 16px;\n height: 16px;\n border: 2px solid #ffffff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_mj-spin 0.8s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_mj-spin {\n to { transform: rotate(360deg); }\n}\n\n.mj-checkout-consent[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n align-items: flex-start;\n margin: 0.75rem 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.4;\n}\n.mj-checkout-consent[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n margin-top: 0.2rem;\n}\n\n\n\n\n\n.mj-checkbox-label[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%], \n.mj-checkout-consent[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%] {\n width: auto;\n height: auto;\n padding: 0;\n border: 0;\n flex: 0 0 auto;\n}\n\n.mj-checkout-promo[_ngcontent-%COMP%] {\n margin: 0.75rem 0;\n}\n.mj-checkout-promo__label[_ngcontent-%COMP%] {\n display: block;\n font-size: 0.875rem;\n margin-bottom: 0.25rem;\n}\n.mj-checkout-promo__row[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n}\n.mj-checkout-promo__input[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n}\n.mj-checkout-promo__error[_ngcontent-%COMP%] {\n color: var(--mj-error-color, #b91c1c);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-promo__applied[_ngcontent-%COMP%] {\n color: var(--mj-success-color, #15803d);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-member-discount[_ngcontent-%COMP%] {\n margin: 0.75rem 0;\n}\n.mj-checkout-promo__apply[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n padding: 8px 14px;\n background: transparent;\n color: var(--mj-primary-color, #2563eb);\n border: 1px solid var(--mj-border-color, #cbd5e1);\n border-radius: var(--mj-border-radius, 8px);\n font-size: 0.875rem;\n font-weight: 600;\n cursor: pointer;\n}\n.mj-checkout-promo__apply[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}'], changeDetection: 0 });
38691
38791
  };
38692
38792
  (() => {
38693
38793
  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MJCheckoutWidgetComponent, [{
@@ -38816,7 +38916,11 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38816
38916
  [ngModel]="units()[0]?.[field.name]"
38817
38917
  (ngModelChange)="updateUnitField(0, field.name, $event)"
38818
38918
  [placeholder]="field.placeholder || ''"
38919
+ [readonly]="isLockedEmail(0, field.name)"
38819
38920
  [required]="field.required || false" />
38921
+ @if (isLockedEmail(0, field.name)) {
38922
+ <p class="mj-field-hint">Your member discount is tied to this verified e-mail.</p>
38923
+ }
38820
38924
  }
38821
38925
  }
38822
38926
  </div>
@@ -38898,7 +39002,11 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
38898
39002
  [ngModel]="unit[field.name]"
38899
39003
  (ngModelChange)="updateUnitField($index, field.name, $event)"
38900
39004
  [placeholder]="field.placeholder || ''"
39005
+ [readonly]="isLockedEmail($index, field.name)"
38901
39006
  [required]="field.required || false" />
39007
+ @if (isLockedEmail($index, field.name)) {
39008
+ <p class="mj-field-hint">Your member discount is tied to this verified e-mail.</p>
39009
+ }
38902
39010
  }
38903
39011
  }
38904
39012
  </div>
@@ -39088,6 +39196,12 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
39088
39196
  </div>
39089
39197
  }
39090
39198
 
39199
+ @if (activeMemberDiscount(); as member) {
39200
+ <p class="mj-checkout-promo__applied mj-checkout-member-discount" role="status">
39201
+ {{ member.code ? member.code + ' member discount' : 'Member discount' }}: \u2212{{ currencySymbol() }}{{ member.discount.toFixed(2) }}
39202
+ </p>
39203
+ }
39204
+
39091
39205
  @if (autoRenewConsentText(); as consentText) {
39092
39206
  <label class="mj-checkout-consent">
39093
39207
  <input type="checkbox"
@@ -39129,7 +39243,7 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
39129
39243
  </button>
39130
39244
  </div>
39131
39245
  </div>
39132
- `, styles: [':host {\n display: block;\n font-family: var(--mj-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);\n color: var(--mj-text-color, #1e293b);\n}\n\n.mj-checkout-widget-container {\n max-width: 560px;\n margin: 0 auto;\n background: var(--mj-bg-color, #ffffff);\n border: 1px solid #e2e8f0;\n border-radius: var(--mj-border-radius, 8px);\n padding: 24px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);\n}\n\n.mj-widget-header {\n margin-bottom: 20px;\n}\n\n.mj-widget-title {\n margin: 0 0 6px 0;\n font-size: 1.35rem;\n font-weight: 700;\n color: var(--mj-text-color, #0f172a);\n}\n\n.mj-widget-description {\n margin: 0;\n font-size: 0.9rem;\n color: #64748b;\n line-height: 1.4;\n}\n\n.mj-widget-error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #fef2f2;\n border: 1px solid #f87171;\n color: #991b1b;\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 18px;\n font-size: 0.875rem;\n}\n\n.mj-error-icon {\n font-size: 1rem;\n}\n\n.mj-widget-summary-card {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px 16px;\n margin-bottom: 20px;\n}\n\n.mj-summary-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.mj-summary-price {\n display: flex;\n align-items: center;\n}\n\n.mj-widget-form-section {\n margin-bottom: 20px;\n}\n\n.mj-summary-item-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-product-name {\n font-weight: 600;\n font-size: 1rem;\n color: #1e293b;\n}\n\n.mj-badge-free {\n background: #dcfce7;\n color: #166534;\n font-size: 0.75rem;\n font-weight: 700;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.mj-price-free {\n font-weight: 700;\n color: #166534;\n font-size: 1.1rem;\n}\n\n.mj-price-amount {\n font-weight: 700;\n color: #0f172a;\n font-size: 1.1rem;\n}\n\n.mj-quantity-selector-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #cbd5e1;\n}\n\n.mj-qty-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-qty-btn {\n width: 28px;\n height: 28px;\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mj-qty-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.mj-qty-input {\n width: 44px;\n height: 28px;\n text-align: center;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.mj-section-title {\n font-size: 1rem;\n font-weight: 600;\n margin: 0 0 12px 0;\n color: #334155;\n}\n\n.mj-form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.mj-form-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.mj-form-group.full-width {\n grid-column: 1 / -1;\n}\n\n.mj-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: #475569;\n}\n\n.mj-required {\n color: #ef4444;\n}\n\n.mj-input, .mj-select {\n padding: 8px 12px;\n font-size: 0.9rem;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n background: #ffffff;\n color: #1e293b;\n outline: none;\n transition: border-color 0.15s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.mj-textarea {\n min-height: 70px;\n resize: vertical;\n font-family: inherit;\n}\n\n.mj-select {\n min-height: 38px;\n}\n\n.mj-checkbox-label {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 0.9rem;\n font-weight: 400;\n color: #334155;\n margin-top: 4px;\n}\n\n/* The free-text answer that appears under a question\'s "Other" choice. */\n.mj-question-other {\n margin-top: 8px;\n}\n\n/* A choice group: its options stacked, with how many to pick beside the heading. */\n.mj-choice-group {\n border: 0;\n margin: 0;\n padding: 0;\n}\n\n.mj-choice-count {\n font-weight: normal;\n color: #64748b;\n}\n\n.mj-choice-options {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-checkbox-label.is-disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.mj-input:focus, .mj-select:focus {\n border-color: var(--mj-primary-color, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n}\n\n.mj-multi-attendee-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.mj-btn-link {\n background: none;\n border: none;\n color: var(--mj-primary-color, #2563eb);\n font-size: 0.8rem;\n cursor: pointer;\n text-decoration: underline;\n padding: 0;\n}\n\n.mj-attendee-matrix {\n display: flex;\n flex-direction: column;\n gap: 14px;\n margin-bottom: 20px;\n}\n\n.mj-attendee-card {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px 14px;\n}\n\n.mj-attendee-card-title {\n font-size: 0.85rem;\n font-weight: 600;\n color: #475569;\n margin-bottom: 10px;\n}\n\n/* Stripe Payment Container */\n.mj-widget-payment-section {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e2e8f0;\n}\n\n.mj-stripe-container {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px;\n margin-bottom: 16px;\n}\n\n.mj-stripe-mount-point {\n min-height: 40px;\n}\n\n.mj-stripe-badge {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n font-size: 0.75rem;\n color: #64748b;\n}\n\n.mj-stripe-lock-icon {\n font-size: 0.85rem;\n}\n\n.mj-checkout-total-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n border-top: 1px solid #e2e8f0;\n margin-top: 10px;\n margin-bottom: 18px;\n}\n\n.mj-total-label {\n font-weight: 700;\n font-size: 1.05rem;\n color: #0f172a;\n}\n\n.mj-total-amount {\n font-weight: 800;\n font-size: 1.25rem;\n color: var(--mj-primary-color, #2563eb);\n}\n\n.mj-widget-actions {\n margin-top: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.mj-btn-submit {\n width: 100%;\n padding: 12px;\n background: var(--mj-primary-color, #2563eb);\n color: #ffffff;\n font-size: 1rem;\n font-weight: 600;\n border: none;\n border-radius: var(--mj-border-radius, 8px);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: opacity 0.15s ease;\n}\n\n.mj-btn-submit:hover:not(:disabled) {\n opacity: 0.92;\n}\n\n.mj-btn-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-btn-cancel {\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n color: #64748b;\n font-size: 0.875rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n text-align: center;\n}\n\n.mj-btn-cancel:hover:not(:disabled) {\n color: #334155;\n text-decoration: underline;\n}\n\n.mj-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid #ffffff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: mj-spin 0.8s linear infinite;\n}\n\n@keyframes mj-spin {\n to { transform: rotate(360deg); }\n}\n\n.mj-checkout-consent {\n display: flex;\n gap: 0.5rem;\n align-items: flex-start;\n margin: 0.75rem 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.4;\n}\n.mj-checkout-consent input {\n margin-top: 0.2rem;\n}\n\n/* Checkboxes keep their native size even when the host page styles every input\n (e.g. `input { width: 100% }`): this rule is scoped to the widget, so it outranks\n a plain element or class selector on the host page. */\n.mj-checkbox-label input[type=checkbox],\n.mj-checkout-consent input[type=checkbox] {\n width: auto;\n height: auto;\n padding: 0;\n border: 0;\n flex: 0 0 auto;\n}\n\n.mj-checkout-promo {\n margin: 0.75rem 0;\n}\n.mj-checkout-promo__label {\n display: block;\n font-size: 0.875rem;\n margin-bottom: 0.25rem;\n}\n.mj-checkout-promo__row {\n display: flex;\n gap: 0.5rem;\n}\n.mj-checkout-promo__input {\n flex: 1 1 auto;\n}\n.mj-checkout-promo__error {\n color: var(--mj-error-color, #b91c1c);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-promo__applied {\n color: var(--mj-success-color, #15803d);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-promo__apply {\n flex: 0 0 auto;\n padding: 8px 14px;\n background: transparent;\n color: var(--mj-primary-color, #2563eb);\n border: 1px solid var(--mj-border-color, #cbd5e1);\n border-radius: var(--mj-border-radius, 8px);\n font-size: 0.875rem;\n font-weight: 600;\n cursor: pointer;\n}\n.mj-checkout-promo__apply:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n'] }]
39246
+ `, styles: [':host {\n display: block;\n font-family: var(--mj-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);\n color: var(--mj-text-color, #1e293b);\n}\n\n.mj-checkout-widget-container {\n max-width: 560px;\n margin: 0 auto;\n background: var(--mj-bg-color, #ffffff);\n border: 1px solid #e2e8f0;\n border-radius: var(--mj-border-radius, 8px);\n padding: 24px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);\n}\n\n.mj-widget-header {\n margin-bottom: 20px;\n}\n\n.mj-widget-title {\n margin: 0 0 6px 0;\n font-size: 1.35rem;\n font-weight: 700;\n color: var(--mj-text-color, #0f172a);\n}\n\n.mj-widget-description {\n margin: 0;\n font-size: 0.9rem;\n color: #64748b;\n line-height: 1.4;\n}\n\n.mj-widget-error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #fef2f2;\n border: 1px solid #f87171;\n color: #991b1b;\n padding: 10px 14px;\n border-radius: 6px;\n margin-bottom: 18px;\n font-size: 0.875rem;\n}\n\n.mj-error-icon {\n font-size: 1rem;\n}\n\n.mj-widget-summary-card {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px 16px;\n margin-bottom: 20px;\n}\n\n.mj-summary-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.mj-summary-price {\n display: flex;\n align-items: center;\n}\n\n.mj-widget-form-section {\n margin-bottom: 20px;\n}\n\n.mj-summary-item-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-product-name {\n font-weight: 600;\n font-size: 1rem;\n color: #1e293b;\n}\n\n.mj-badge-free {\n background: #dcfce7;\n color: #166534;\n font-size: 0.75rem;\n font-weight: 700;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n.mj-price-free {\n font-weight: 700;\n color: #166534;\n font-size: 1.1rem;\n}\n\n.mj-price-amount {\n font-weight: 700;\n color: #0f172a;\n font-size: 1.1rem;\n}\n\n.mj-quantity-selector-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #cbd5e1;\n}\n\n.mj-qty-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-qty-btn {\n width: 28px;\n height: 28px;\n background: #ffffff;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n cursor: pointer;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mj-qty-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.mj-qty-input {\n width: 44px;\n height: 28px;\n text-align: center;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.mj-section-title {\n font-size: 1rem;\n font-weight: 600;\n margin: 0 0 12px 0;\n color: #334155;\n}\n\n.mj-form-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px;\n margin-bottom: 18px;\n}\n\n.mj-form-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.mj-form-group.full-width {\n grid-column: 1 / -1;\n}\n\n.mj-label {\n font-size: 0.8rem;\n font-weight: 500;\n color: #475569;\n}\n\n.mj-required {\n color: #ef4444;\n}\n\n.mj-input, .mj-select {\n padding: 8px 12px;\n font-size: 0.9rem;\n border: 1px solid #cbd5e1;\n border-radius: 4px;\n background: #ffffff;\n color: #1e293b;\n outline: none;\n transition: border-color 0.15s ease;\n width: 100%;\n box-sizing: border-box;\n}\n\n.mj-textarea {\n min-height: 70px;\n resize: vertical;\n font-family: inherit;\n}\n\n.mj-select {\n min-height: 38px;\n}\n\n.mj-checkbox-label {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 0.9rem;\n font-weight: 400;\n color: #334155;\n margin-top: 4px;\n}\n\n/* The free-text answer that appears under a question\'s "Other" choice. */\n.mj-question-other {\n margin-top: 8px;\n}\n\n/* A choice group: its options stacked, with how many to pick beside the heading. */\n.mj-choice-group {\n border: 0;\n margin: 0;\n padding: 0;\n}\n\n.mj-choice-count {\n font-weight: normal;\n color: #64748b;\n}\n\n.mj-choice-options {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-checkbox-label.is-disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.mj-input:focus, .mj-select:focus {\n border-color: var(--mj-primary-color, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n}\n\n/* The e-mail a member token was signed for (#919): shown, not editable. */\n.mj-input[readonly] {\n background: #f1f5f9;\n color: #475569;\n cursor: default;\n}\n\n.mj-field-hint {\n font-size: 0.8rem;\n color: #64748b;\n margin: 0.25rem 0 0;\n}\n\n.mj-multi-attendee-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.mj-btn-link {\n background: none;\n border: none;\n color: var(--mj-primary-color, #2563eb);\n font-size: 0.8rem;\n cursor: pointer;\n text-decoration: underline;\n padding: 0;\n}\n\n.mj-attendee-matrix {\n display: flex;\n flex-direction: column;\n gap: 14px;\n margin-bottom: 20px;\n}\n\n.mj-attendee-card {\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 12px 14px;\n}\n\n.mj-attendee-card-title {\n font-size: 0.85rem;\n font-weight: 600;\n color: #475569;\n margin-bottom: 10px;\n}\n\n/* Stripe Payment Container */\n.mj-widget-payment-section {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #e2e8f0;\n}\n\n.mj-stripe-container {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n padding: 14px;\n margin-bottom: 16px;\n}\n\n.mj-stripe-mount-point {\n min-height: 40px;\n}\n\n.mj-stripe-badge {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n font-size: 0.75rem;\n color: #64748b;\n}\n\n.mj-stripe-lock-icon {\n font-size: 0.85rem;\n}\n\n.mj-checkout-total-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n border-top: 1px solid #e2e8f0;\n margin-top: 10px;\n margin-bottom: 18px;\n}\n\n.mj-total-label {\n font-weight: 700;\n font-size: 1.05rem;\n color: #0f172a;\n}\n\n.mj-total-amount {\n font-weight: 800;\n font-size: 1.25rem;\n color: var(--mj-primary-color, #2563eb);\n}\n\n.mj-widget-actions {\n margin-top: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.mj-btn-submit {\n width: 100%;\n padding: 12px;\n background: var(--mj-primary-color, #2563eb);\n color: #ffffff;\n font-size: 1rem;\n font-weight: 600;\n border: none;\n border-radius: var(--mj-border-radius, 8px);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: opacity 0.15s ease;\n}\n\n.mj-btn-submit:hover:not(:disabled) {\n opacity: 0.92;\n}\n\n.mj-btn-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-btn-cancel {\n width: 100%;\n padding: 8px 12px;\n background: transparent;\n color: #64748b;\n font-size: 0.875rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n text-align: center;\n}\n\n.mj-btn-cancel:hover:not(:disabled) {\n color: #334155;\n text-decoration: underline;\n}\n\n.mj-spinner {\n width: 16px;\n height: 16px;\n border: 2px solid #ffffff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: mj-spin 0.8s linear infinite;\n}\n\n@keyframes mj-spin {\n to { transform: rotate(360deg); }\n}\n\n.mj-checkout-consent {\n display: flex;\n gap: 0.5rem;\n align-items: flex-start;\n margin: 0.75rem 0;\n font-size: 0.875rem;\n font-weight: 400;\n line-height: 1.4;\n}\n.mj-checkout-consent input {\n margin-top: 0.2rem;\n}\n\n/* Checkboxes keep their native size even when the host page styles every input\n (e.g. `input { width: 100% }`): this rule is scoped to the widget, so it outranks\n a plain element or class selector on the host page. */\n.mj-checkbox-label input[type=checkbox],\n.mj-checkout-consent input[type=checkbox] {\n width: auto;\n height: auto;\n padding: 0;\n border: 0;\n flex: 0 0 auto;\n}\n\n.mj-checkout-promo {\n margin: 0.75rem 0;\n}\n.mj-checkout-promo__label {\n display: block;\n font-size: 0.875rem;\n margin-bottom: 0.25rem;\n}\n.mj-checkout-promo__row {\n display: flex;\n gap: 0.5rem;\n}\n.mj-checkout-promo__input {\n flex: 1 1 auto;\n}\n.mj-checkout-promo__error {\n color: var(--mj-error-color, #b91c1c);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-promo__applied {\n color: var(--mj-success-color, #15803d);\n font-size: 0.875rem;\n margin: 0.35rem 0 0;\n}\n.mj-checkout-member-discount {\n margin: 0.75rem 0;\n}\n.mj-checkout-promo__apply {\n flex: 0 0 auto;\n padding: 8px 14px;\n background: transparent;\n color: var(--mj-primary-color, #2563eb);\n border: 1px solid var(--mj-border-color, #cbd5e1);\n border-radius: var(--mj-border-radius, 8px);\n font-size: 0.875rem;\n font-weight: 600;\n cursor: pointer;\n}\n.mj-checkout-promo__apply:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n'] }]
39133
39247
  }], () => [{ type: ElementRef }, { type: Renderer2 }], { config: [{
39134
39248
  type: Input
39135
39249
  }], distributionSlug: [{
@@ -39150,6 +39264,10 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
39150
39264
  type: Input
39151
39265
  }], promotionError: [{
39152
39266
  type: Input
39267
+ }], memberDiscount: [{
39268
+ type: Input
39269
+ }], lockEmail: [{
39270
+ type: Input
39153
39271
  }], serverPricedTotal: [{
39154
39272
  type: Input
39155
39273
  }], quotedTotal: [{
@@ -39164,6 +39282,8 @@ var MJCheckoutWidgetComponent = class _MJCheckoutWidgetComponent {
39164
39282
  type: Output
39165
39283
  }], quoteInvalidated: [{
39166
39284
  type: Output
39285
+ }], quoteRequested: [{
39286
+ type: Output
39167
39287
  }] });
39168
39288
  })();
39169
39289
  (() => {
@@ -39225,6 +39345,19 @@ function memberDiscountNotice(draft, alreadyShown) {
39225
39345
  const typedCodePriced = Array.isArray(applied) && applied.length > 0;
39226
39346
  return typedCodePriced ? `${message} Submit again to continue.` : `${message} Submit again to continue at the standard rate.`;
39227
39347
  }
39348
+ function memberDiscountFromDraft(draft, quantity) {
39349
+ if (!draft?.["Success"] || draft["MemberDiscountApplied"] !== true) {
39350
+ return null;
39351
+ }
39352
+ const applied = draft["AppliedPromotionCodes"];
39353
+ const code = Array.isArray(applied) && typeof applied[0] === "string" ? applied[0] : "";
39354
+ return {
39355
+ code,
39356
+ discount: Number(draft["Discount"] ?? 0),
39357
+ total: Number(draft["TotalGross"] ?? 0),
39358
+ quantity
39359
+ };
39360
+ }
39228
39361
 
39229
39362
  // dist/lib/checkout-widget/checkout-turnstile.js
39230
39363
  var TURNSTILE_SCRIPT_URL = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit";
@@ -39326,6 +39459,66 @@ var TurnstileWidget = class {
39326
39459
  }
39327
39460
  };
39328
39461
 
39462
+ // dist/lib/checkout-widget/checkout-complete.js
39463
+ var COMPLETE_RETRY_INTERVAL_MS = 3e3;
39464
+ var COMPLETE_RETRY_TIMEOUT_MS = 12e4;
39465
+ var COMPLETE_FINISHING_MESSAGE = "Payment received. Finishing your order\u2026";
39466
+ var COMPLETE_DELAYED_MESSAGE = "Your payment went through, but confirming your order is taking longer than usual. Please do not pay again. Contact support if you need your order confirmation.";
39467
+ var CHECKOUT_UNREACHABLE_MESSAGE = "Checkout could not reach the server. Please try again.";
39468
+ var CheckoutTransportError = class extends Error {
39469
+ HttpStatus;
39470
+ constructor(HttpStatus) {
39471
+ super(CHECKOUT_UNREACHABLE_MESSAGE);
39472
+ this.HttpStatus = HttpStatus;
39473
+ this.name = "CheckoutTransportError";
39474
+ }
39475
+ };
39476
+ async function ReadCheckoutReply(res) {
39477
+ let json;
39478
+ try {
39479
+ json = await res.json();
39480
+ } catch {
39481
+ throw new CheckoutTransportError(res.status);
39482
+ }
39483
+ if (!json || typeof json !== "object" || Array.isArray(json)) {
39484
+ throw new CheckoutTransportError(res.status);
39485
+ }
39486
+ const reply = json;
39487
+ reply._httpStatus = res.status;
39488
+ return reply;
39489
+ }
39490
+ function CompleteStillProcessing(reply) {
39491
+ return !!reply && reply.Success !== true && reply.Status === "Processing";
39492
+ }
39493
+ async function CompleteWithRetry(send, options = {}) {
39494
+ const interval = options.intervalMs ?? COMPLETE_RETRY_INTERVAL_MS;
39495
+ const now = options.now ?? (() => Date.now());
39496
+ const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
39497
+ const deadline = now() + (options.timeoutMs ?? COMPLETE_RETRY_TIMEOUT_MS);
39498
+ let waiting = false;
39499
+ for (; ; ) {
39500
+ let reply = null;
39501
+ try {
39502
+ reply = await send();
39503
+ } catch (err) {
39504
+ if (!(err instanceof CheckoutTransportError)) {
39505
+ throw err;
39506
+ }
39507
+ }
39508
+ if (reply && !CompleteStillProcessing(reply)) {
39509
+ return reply;
39510
+ }
39511
+ if (!waiting) {
39512
+ waiting = true;
39513
+ options.onWaiting?.();
39514
+ }
39515
+ if (now() >= deadline) {
39516
+ return null;
39517
+ }
39518
+ await sleep(interval);
39519
+ }
39520
+ }
39521
+
39329
39522
  // dist/lib/checkout-widget/checkout-renewal.js
39330
39523
  function ReadRenewalPayment(response) {
39331
39524
  if (!response || typeof response !== "object")
@@ -39369,7 +39562,7 @@ function CheckoutPublicHostComponent_Conditional_1_Template(rf, ctx) {
39369
39562
  }
39370
39563
  function CheckoutPublicHostComponent_Conditional_2_Conditional_7_Template(rf, ctx) {
39371
39564
  if (rf & 1) {
39372
- \u0275\u0275elementStart(0, "p", 9);
39565
+ \u0275\u0275elementStart(0, "p", 10);
39373
39566
  \u0275\u0275text(1);
39374
39567
  \u0275\u0275elementEnd();
39375
39568
  }
@@ -39381,7 +39574,7 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_7_Template(rf, ct
39381
39574
  }
39382
39575
  function CheckoutPublicHostComponent_Conditional_2_Conditional_8_Template(rf, ctx) {
39383
39576
  if (rf & 1) {
39384
- \u0275\u0275elementStart(0, "p", 13);
39577
+ \u0275\u0275elementStart(0, "p", 14);
39385
39578
  \u0275\u0275text(1);
39386
39579
  \u0275\u0275elementEnd();
39387
39580
  }
@@ -39394,14 +39587,14 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_8_Template(rf, ct
39394
39587
  }
39395
39588
  function CheckoutPublicHostComponent_Conditional_2_Conditional_9_Template(rf, ctx) {
39396
39589
  if (rf & 1) {
39397
- \u0275\u0275elementStart(0, "p", 11);
39590
+ \u0275\u0275elementStart(0, "p", 12);
39398
39591
  \u0275\u0275text(1, "Setting up your account\u2026");
39399
39592
  \u0275\u0275elementEnd();
39400
39593
  }
39401
39594
  }
39402
39595
  function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_3_Template(rf, ctx) {
39403
39596
  if (rf & 1) {
39404
- \u0275\u0275elementStart(0, "p", 16);
39597
+ \u0275\u0275elementStart(0, "p", 17);
39405
39598
  \u0275\u0275text(1);
39406
39599
  \u0275\u0275elementEnd();
39407
39600
  }
@@ -39413,7 +39606,7 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_3_
39413
39606
  }
39414
39607
  function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_10_Template(rf, ctx) {
39415
39608
  if (rf & 1) {
39416
- \u0275\u0275elementStart(0, "p", 21);
39609
+ \u0275\u0275elementStart(0, "p", 22);
39417
39610
  \u0275\u0275text(1);
39418
39611
  \u0275\u0275elementEnd();
39419
39612
  }
@@ -39426,42 +39619,42 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_10
39426
39619
  function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template(rf, ctx) {
39427
39620
  if (rf & 1) {
39428
39621
  const _r2 = \u0275\u0275getCurrentView();
39429
- \u0275\u0275elementStart(0, "form", 14);
39622
+ \u0275\u0275elementStart(0, "form", 15);
39430
39623
  \u0275\u0275listener("submit", function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template_form_submit_0_listener($event) {
39431
39624
  \u0275\u0275restoreView(_r2);
39432
39625
  const ctx_r0 = \u0275\u0275nextContext(2);
39433
39626
  $event.preventDefault();
39434
39627
  return \u0275\u0275resetView(ctx_r0.submitPassword());
39435
39628
  });
39436
- \u0275\u0275elementStart(1, "h2", 15);
39629
+ \u0275\u0275elementStart(1, "h2", 16);
39437
39630
  \u0275\u0275text(2, "Set a password for your account");
39438
39631
  \u0275\u0275elementEnd();
39439
- \u0275\u0275conditionalCreate(3, CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_3_Template, 2, 1, "p", 16);
39440
- \u0275\u0275elementStart(4, "label", 17);
39632
+ \u0275\u0275conditionalCreate(3, CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_3_Template, 2, 1, "p", 17);
39633
+ \u0275\u0275elementStart(4, "label", 18);
39441
39634
  \u0275\u0275text(5, "Password");
39442
39635
  \u0275\u0275elementEnd();
39443
- \u0275\u0275elementStart(6, "input", 18);
39636
+ \u0275\u0275elementStart(6, "input", 19);
39444
39637
  \u0275\u0275listener("input", function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template_input_input_6_listener($event) {
39445
39638
  \u0275\u0275restoreView(_r2);
39446
39639
  const ctx_r0 = \u0275\u0275nextContext(2);
39447
39640
  return \u0275\u0275resetView(ctx_r0.password = $event.target.value);
39448
39641
  });
39449
39642
  \u0275\u0275elementEnd();
39450
- \u0275\u0275elementStart(7, "label", 19);
39643
+ \u0275\u0275elementStart(7, "label", 20);
39451
39644
  \u0275\u0275text(8, "Confirm password");
39452
39645
  \u0275\u0275elementEnd();
39453
- \u0275\u0275elementStart(9, "input", 20);
39646
+ \u0275\u0275elementStart(9, "input", 21);
39454
39647
  \u0275\u0275listener("input", function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template_input_input_9_listener($event) {
39455
39648
  \u0275\u0275restoreView(_r2);
39456
39649
  const ctx_r0 = \u0275\u0275nextContext(2);
39457
39650
  return \u0275\u0275resetView(ctx_r0.passwordConfirmation = $event.target.value);
39458
39651
  });
39459
39652
  \u0275\u0275elementEnd();
39460
- \u0275\u0275conditionalCreate(10, CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_10_Template, 2, 1, "p", 21);
39461
- \u0275\u0275elementStart(11, "button", 22);
39653
+ \u0275\u0275conditionalCreate(10, CheckoutPublicHostComponent_Conditional_2_Conditional_10_Conditional_10_Template, 2, 1, "p", 22);
39654
+ \u0275\u0275elementStart(11, "button", 23);
39462
39655
  \u0275\u0275text(12);
39463
39656
  \u0275\u0275elementEnd();
39464
- \u0275\u0275elementStart(13, "button", 23);
39657
+ \u0275\u0275elementStart(13, "button", 24);
39465
39658
  \u0275\u0275listener("click", function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template_button_click_13_listener() {
39466
39659
  \u0275\u0275restoreView(_r2);
39467
39660
  const ctx_r0 = \u0275\u0275nextContext(2);
@@ -39491,7 +39684,7 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template(rf, c
39491
39684
  function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Conditional_3_Template(rf, ctx) {
39492
39685
  if (rf & 1) {
39493
39686
  const _r4 = \u0275\u0275getCurrentView();
39494
- \u0275\u0275elementStart(0, "button", 27);
39687
+ \u0275\u0275elementStart(0, "button", 28);
39495
39688
  \u0275\u0275listener("click", function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Conditional_3_Template_button_click_0_listener() {
39496
39689
  \u0275\u0275restoreView(_r4);
39497
39690
  const ctx_r0 = \u0275\u0275nextContext(4);
@@ -39504,7 +39697,7 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_
39504
39697
  function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Template(rf, ctx) {
39505
39698
  if (rf & 1) {
39506
39699
  const _r3 = \u0275\u0275getCurrentView();
39507
- \u0275\u0275elementStart(0, "div", 24)(1, "button", 25);
39700
+ \u0275\u0275elementStart(0, "div", 25)(1, "button", 26);
39508
39701
  \u0275\u0275listener("click", function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Template_button_click_1_listener() {
39509
39702
  \u0275\u0275restoreView(_r3);
39510
39703
  const ctx_r0 = \u0275\u0275nextContext(3);
@@ -39512,7 +39705,7 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_
39512
39705
  });
39513
39706
  \u0275\u0275text(2, "Try again");
39514
39707
  \u0275\u0275elementEnd();
39515
- \u0275\u0275conditionalCreate(3, CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Conditional_3_Template, 2, 0, "button", 26);
39708
+ \u0275\u0275conditionalCreate(3, CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Conditional_3_Template, 2, 0, "button", 27);
39516
39709
  \u0275\u0275elementEnd();
39517
39710
  }
39518
39711
  if (rf & 2) {
@@ -39523,10 +39716,10 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_
39523
39716
  }
39524
39717
  function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Template(rf, ctx) {
39525
39718
  if (rf & 1) {
39526
- \u0275\u0275elementStart(0, "p", 11);
39719
+ \u0275\u0275elementStart(0, "p", 12);
39527
39720
  \u0275\u0275text(1);
39528
39721
  \u0275\u0275elementEnd();
39529
- \u0275\u0275conditionalCreate(2, CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Template, 4, 1, "div", 24);
39722
+ \u0275\u0275conditionalCreate(2, CheckoutPublicHostComponent_Conditional_2_Conditional_11_Conditional_2_Template, 4, 1, "div", 25);
39530
39723
  }
39531
39724
  if (rf & 2) {
39532
39725
  const ctx_r0 = \u0275\u0275nextContext(2);
@@ -39538,18 +39731,18 @@ function CheckoutPublicHostComponent_Conditional_2_Conditional_11_Template(rf, c
39538
39731
  }
39539
39732
  function CheckoutPublicHostComponent_Conditional_2_Template(rf, ctx) {
39540
39733
  if (rf & 1) {
39541
- \u0275\u0275elementStart(0, "div", 2)(1, "div", 6);
39734
+ \u0275\u0275elementStart(0, "div", 2)(1, "div", 7);
39542
39735
  \u0275\u0275text(2, "\u2713");
39543
39736
  \u0275\u0275elementEnd();
39544
- \u0275\u0275elementStart(3, "h1", 7);
39737
+ \u0275\u0275elementStart(3, "h1", 8);
39545
39738
  \u0275\u0275text(4, "You're all set");
39546
39739
  \u0275\u0275elementEnd();
39547
- \u0275\u0275elementStart(5, "p", 8);
39740
+ \u0275\u0275elementStart(5, "p", 9);
39548
39741
  \u0275\u0275text(6);
39549
39742
  \u0275\u0275elementEnd();
39550
- \u0275\u0275conditionalCreate(7, CheckoutPublicHostComponent_Conditional_2_Conditional_7_Template, 2, 1, "p", 9);
39551
- \u0275\u0275conditionalCreate(8, CheckoutPublicHostComponent_Conditional_2_Conditional_8_Template, 2, 3, "p", 10);
39552
- \u0275\u0275conditionalCreate(9, CheckoutPublicHostComponent_Conditional_2_Conditional_9_Template, 2, 0, "p", 11)(10, CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template, 15, 7, "form", 12)(11, CheckoutPublicHostComponent_Conditional_2_Conditional_11_Template, 3, 2);
39743
+ \u0275\u0275conditionalCreate(7, CheckoutPublicHostComponent_Conditional_2_Conditional_7_Template, 2, 1, "p", 10);
39744
+ \u0275\u0275conditionalCreate(8, CheckoutPublicHostComponent_Conditional_2_Conditional_8_Template, 2, 3, "p", 11);
39745
+ \u0275\u0275conditionalCreate(9, CheckoutPublicHostComponent_Conditional_2_Conditional_9_Template, 2, 0, "p", 12)(10, CheckoutPublicHostComponent_Conditional_2_Conditional_10_Template, 15, 7, "form", 13)(11, CheckoutPublicHostComponent_Conditional_2_Conditional_11_Template, 3, 2);
39553
39746
  \u0275\u0275elementEnd();
39554
39747
  }
39555
39748
  if (rf & 2) {
@@ -39566,14 +39759,26 @@ function CheckoutPublicHostComponent_Conditional_2_Template(rf, ctx) {
39566
39759
  }
39567
39760
  function CheckoutPublicHostComponent_Conditional_3_Template(rf, ctx) {
39568
39761
  if (rf & 1) {
39569
- \u0275\u0275elementStart(0, "p", 3);
39762
+ \u0275\u0275elementStart(0, "div", 3)(1, "p", 9);
39763
+ \u0275\u0275text(2);
39764
+ \u0275\u0275elementEnd()();
39765
+ }
39766
+ if (rf & 2) {
39767
+ const ctx_r0 = \u0275\u0275nextContext();
39768
+ \u0275\u0275advance(2);
39769
+ \u0275\u0275textInterpolate(ctx_r0.finishingMessage);
39770
+ }
39771
+ }
39772
+ function CheckoutPublicHostComponent_Conditional_4_Template(rf, ctx) {
39773
+ if (rf & 1) {
39774
+ \u0275\u0275elementStart(0, "p", 4);
39570
39775
  \u0275\u0275text(1, "Loading checkout\u2026");
39571
39776
  \u0275\u0275elementEnd();
39572
39777
  }
39573
39778
  }
39574
- function CheckoutPublicHostComponent_Conditional_4_Conditional_6_Template(rf, ctx) {
39779
+ function CheckoutPublicHostComponent_Conditional_5_Conditional_6_Template(rf, ctx) {
39575
39780
  if (rf & 1) {
39576
- \u0275\u0275elementStart(0, "div", 32)(1, "dt");
39781
+ \u0275\u0275elementStart(0, "div", 33)(1, "dt");
39577
39782
  \u0275\u0275text(2, "Renewal of");
39578
39783
  \u0275\u0275elementEnd();
39579
39784
  \u0275\u0275elementStart(3, "dd");
@@ -39586,9 +39791,9 @@ function CheckoutPublicHostComponent_Conditional_4_Conditional_6_Template(rf, ct
39586
39791
  \u0275\u0275textInterpolate(ctx_r0.renewal.Description);
39587
39792
  }
39588
39793
  }
39589
- function CheckoutPublicHostComponent_Conditional_4_Conditional_7_Template(rf, ctx) {
39794
+ function CheckoutPublicHostComponent_Conditional_5_Conditional_7_Template(rf, ctx) {
39590
39795
  if (rf & 1) {
39591
- \u0275\u0275elementStart(0, "div", 32)(1, "dt");
39796
+ \u0275\u0275elementStart(0, "div", 33)(1, "dt");
39592
39797
  \u0275\u0275text(2, "Subscription");
39593
39798
  \u0275\u0275elementEnd();
39594
39799
  \u0275\u0275elementStart(3, "dd");
@@ -39601,9 +39806,9 @@ function CheckoutPublicHostComponent_Conditional_4_Conditional_7_Template(rf, ct
39601
39806
  \u0275\u0275textInterpolate(ctx_r0.renewal.SubscriptionNumber);
39602
39807
  }
39603
39808
  }
39604
- function CheckoutPublicHostComponent_Conditional_4_Conditional_13_Template(rf, ctx) {
39809
+ function CheckoutPublicHostComponent_Conditional_5_Conditional_13_Template(rf, ctx) {
39605
39810
  if (rf & 1) {
39606
- \u0275\u0275elementStart(0, "div", 32)(1, "dt");
39811
+ \u0275\u0275elementStart(0, "div", 33)(1, "dt");
39607
39812
  \u0275\u0275text(2, "Due");
39608
39813
  \u0275\u0275elementEnd();
39609
39814
  \u0275\u0275elementStart(3, "dd");
@@ -39616,15 +39821,15 @@ function CheckoutPublicHostComponent_Conditional_4_Conditional_13_Template(rf, c
39616
39821
  \u0275\u0275textInterpolate(ctx_r0.renewal.DueDate);
39617
39822
  }
39618
39823
  }
39619
- function CheckoutPublicHostComponent_Conditional_4_Conditional_19_Template(rf, ctx) {
39824
+ function CheckoutPublicHostComponent_Conditional_5_Conditional_19_Template(rf, ctx) {
39620
39825
  if (rf & 1) {
39621
- \u0275\u0275elementStart(0, "label", 36);
39826
+ \u0275\u0275elementStart(0, "label", 37);
39622
39827
  \u0275\u0275text(1, "Card");
39623
39828
  \u0275\u0275elementEnd();
39624
- \u0275\u0275element(2, "div", 37);
39829
+ \u0275\u0275element(2, "div", 38);
39625
39830
  }
39626
39831
  }
39627
- function CheckoutPublicHostComponent_Conditional_4_Conditional_22_Template(rf, ctx) {
39832
+ function CheckoutPublicHostComponent_Conditional_5_Conditional_22_Template(rf, ctx) {
39628
39833
  if (rf & 1) {
39629
39834
  \u0275\u0275elementStart(0, "div", 1);
39630
39835
  \u0275\u0275text(1);
@@ -39636,44 +39841,44 @@ function CheckoutPublicHostComponent_Conditional_4_Conditional_22_Template(rf, c
39636
39841
  \u0275\u0275textInterpolate(ctx_r0.errorMessage);
39637
39842
  }
39638
39843
  }
39639
- function CheckoutPublicHostComponent_Conditional_4_Template(rf, ctx) {
39844
+ function CheckoutPublicHostComponent_Conditional_5_Template(rf, ctx) {
39640
39845
  if (rf & 1) {
39641
39846
  const _r5 = \u0275\u0275getCurrentView();
39642
- \u0275\u0275elementStart(0, "form", 28);
39643
- \u0275\u0275listener("submit", function CheckoutPublicHostComponent_Conditional_4_Template_form_submit_0_listener($event) {
39847
+ \u0275\u0275elementStart(0, "form", 29);
39848
+ \u0275\u0275listener("submit", function CheckoutPublicHostComponent_Conditional_5_Template_form_submit_0_listener($event) {
39644
39849
  \u0275\u0275restoreView(_r5);
39645
39850
  const ctx_r0 = \u0275\u0275nextContext();
39646
39851
  $event.preventDefault();
39647
39852
  return \u0275\u0275resetView(ctx_r0.payRenewal());
39648
39853
  });
39649
- \u0275\u0275elementStart(1, "h1", 29);
39854
+ \u0275\u0275elementStart(1, "h1", 30);
39650
39855
  \u0275\u0275text(2, "Renew your subscription");
39651
39856
  \u0275\u0275elementEnd();
39652
- \u0275\u0275elementStart(3, "p", 30);
39857
+ \u0275\u0275elementStart(3, "p", 31);
39653
39858
  \u0275\u0275text(4, "Your saved card could not be charged. Pay with a new card to keep your subscription active.");
39654
39859
  \u0275\u0275elementEnd();
39655
- \u0275\u0275elementStart(5, "dl", 31);
39656
- \u0275\u0275conditionalCreate(6, CheckoutPublicHostComponent_Conditional_4_Conditional_6_Template, 5, 1, "div", 32);
39657
- \u0275\u0275conditionalCreate(7, CheckoutPublicHostComponent_Conditional_4_Conditional_7_Template, 5, 1, "div", 32);
39658
- \u0275\u0275elementStart(8, "div", 32)(9, "dt");
39860
+ \u0275\u0275elementStart(5, "dl", 32);
39861
+ \u0275\u0275conditionalCreate(6, CheckoutPublicHostComponent_Conditional_5_Conditional_6_Template, 5, 1, "div", 33);
39862
+ \u0275\u0275conditionalCreate(7, CheckoutPublicHostComponent_Conditional_5_Conditional_7_Template, 5, 1, "div", 33);
39863
+ \u0275\u0275elementStart(8, "div", 33)(9, "dt");
39659
39864
  \u0275\u0275text(10, "Renewal order");
39660
39865
  \u0275\u0275elementEnd();
39661
39866
  \u0275\u0275elementStart(11, "dd");
39662
39867
  \u0275\u0275text(12);
39663
39868
  \u0275\u0275elementEnd()();
39664
- \u0275\u0275conditionalCreate(13, CheckoutPublicHostComponent_Conditional_4_Conditional_13_Template, 5, 1, "div", 32);
39665
- \u0275\u0275elementStart(14, "div", 33)(15, "dt");
39869
+ \u0275\u0275conditionalCreate(13, CheckoutPublicHostComponent_Conditional_5_Conditional_13_Template, 5, 1, "div", 33);
39870
+ \u0275\u0275elementStart(14, "div", 34)(15, "dt");
39666
39871
  \u0275\u0275text(16, "Amount due");
39667
39872
  \u0275\u0275elementEnd();
39668
39873
  \u0275\u0275elementStart(17, "dd");
39669
39874
  \u0275\u0275text(18);
39670
39875
  \u0275\u0275elementEnd()()();
39671
- \u0275\u0275conditionalCreate(19, CheckoutPublicHostComponent_Conditional_4_Conditional_19_Template, 3, 0);
39672
- \u0275\u0275elementStart(20, "p", 34);
39876
+ \u0275\u0275conditionalCreate(19, CheckoutPublicHostComponent_Conditional_5_Conditional_19_Template, 3, 0);
39877
+ \u0275\u0275elementStart(20, "p", 35);
39673
39878
  \u0275\u0275text(21, "The card you pay with will be charged for future renewals.");
39674
39879
  \u0275\u0275elementEnd();
39675
- \u0275\u0275conditionalCreate(22, CheckoutPublicHostComponent_Conditional_4_Conditional_22_Template, 2, 1, "div", 1);
39676
- \u0275\u0275elementStart(23, "button", 35);
39880
+ \u0275\u0275conditionalCreate(22, CheckoutPublicHostComponent_Conditional_5_Conditional_22_Template, 2, 1, "div", 1);
39881
+ \u0275\u0275elementStart(23, "button", 36);
39677
39882
  \u0275\u0275text(24);
39678
39883
  \u0275\u0275elementEnd()();
39679
39884
  }
@@ -39699,37 +39904,41 @@ function CheckoutPublicHostComponent_Conditional_4_Template(rf, ctx) {
39699
39904
  \u0275\u0275textInterpolate1(" ", ctx_r0.processing ? "Processing\u2026" : "Pay " + ctx_r0.renewalAmount, " ");
39700
39905
  }
39701
39906
  }
39702
- function CheckoutPublicHostComponent_Conditional_5_For_1_Template(rf, ctx) {
39907
+ function CheckoutPublicHostComponent_Conditional_6_For_1_Template(rf, ctx) {
39703
39908
  if (rf & 1) {
39704
39909
  const _r6 = \u0275\u0275getCurrentView();
39705
- \u0275\u0275elementStart(0, "mj-checkout-widget", 39);
39706
- \u0275\u0275listener("promotionCodeApplied", function CheckoutPublicHostComponent_Conditional_5_For_1_Template_mj_checkout_widget_promotionCodeApplied_0_listener($event) {
39910
+ \u0275\u0275elementStart(0, "mj-checkout-widget", 40);
39911
+ \u0275\u0275listener("promotionCodeApplied", function CheckoutPublicHostComponent_Conditional_6_For_1_Template_mj_checkout_widget_promotionCodeApplied_0_listener($event) {
39707
39912
  \u0275\u0275restoreView(_r6);
39708
39913
  const ctx_r0 = \u0275\u0275nextContext(2);
39709
39914
  return \u0275\u0275resetView(ctx_r0.onPromotionCodeApplied($event));
39710
- })("submitted", function CheckoutPublicHostComponent_Conditional_5_For_1_Template_mj_checkout_widget_submitted_0_listener($event) {
39915
+ })("submitted", function CheckoutPublicHostComponent_Conditional_6_For_1_Template_mj_checkout_widget_submitted_0_listener($event) {
39711
39916
  \u0275\u0275restoreView(_r6);
39712
39917
  const ctx_r0 = \u0275\u0275nextContext(2);
39713
39918
  return \u0275\u0275resetView(ctx_r0.onSubmitted($event));
39714
- })("cancelled", function CheckoutPublicHostComponent_Conditional_5_For_1_Template_mj_checkout_widget_cancelled_0_listener() {
39919
+ })("cancelled", function CheckoutPublicHostComponent_Conditional_6_For_1_Template_mj_checkout_widget_cancelled_0_listener() {
39715
39920
  \u0275\u0275restoreView(_r6);
39716
39921
  const ctx_r0 = \u0275\u0275nextContext(2);
39717
39922
  return \u0275\u0275resetView(ctx_r0.onCancelled());
39718
- })("quoteInvalidated", function CheckoutPublicHostComponent_Conditional_5_For_1_Template_mj_checkout_widget_quoteInvalidated_0_listener() {
39923
+ })("quoteInvalidated", function CheckoutPublicHostComponent_Conditional_6_For_1_Template_mj_checkout_widget_quoteInvalidated_0_listener() {
39719
39924
  \u0275\u0275restoreView(_r6);
39720
39925
  const ctx_r0 = \u0275\u0275nextContext(2);
39721
39926
  return \u0275\u0275resetView(ctx_r0.onQuoteInvalidated());
39927
+ })("quoteRequested", function CheckoutPublicHostComponent_Conditional_6_For_1_Template_mj_checkout_widget_quoteRequested_0_listener($event) {
39928
+ \u0275\u0275restoreView(_r6);
39929
+ const ctx_r0 = \u0275\u0275nextContext(2);
39930
+ return \u0275\u0275resetView(ctx_r0.onQuoteRequested($event));
39722
39931
  });
39723
39932
  \u0275\u0275elementEnd();
39724
39933
  }
39725
39934
  if (rf & 2) {
39726
39935
  const ctx_r0 = \u0275\u0275nextContext(2);
39727
- \u0275\u0275property("config", ctx_r0.config)("distributionSlug", ctx_r0.slug)("sessionKey", ctx_r0.sessionKey)("isProcessing", ctx_r0.processing)("isPaymentReady", ctx_r0.isPaymentReady)("stripePaymentMethodId", ctx_r0.stripePaymentMethodId)("prefillEmail", ctx_r0.prefillEmail)("errorMessage", ctx_r0.errorMessage)("appliedPromotion", ctx_r0.appliedPromotion)("serverPricedTotal", ctx_r0.serverPricedTotal)("promotionError", ctx_r0.promotionError)("quotedTotal", ctx_r0.quotedTotal)("quotedTax", ctx_r0.quotedTax);
39936
+ \u0275\u0275property("config", ctx_r0.config)("distributionSlug", ctx_r0.slug)("sessionKey", ctx_r0.sessionKey)("isProcessing", ctx_r0.processing)("isPaymentReady", ctx_r0.isPaymentReady)("stripePaymentMethodId", ctx_r0.stripePaymentMethodId)("prefillEmail", ctx_r0.prefillEmail)("errorMessage", ctx_r0.errorMessage)("appliedPromotion", ctx_r0.appliedPromotion)("serverPricedTotal", ctx_r0.serverPricedTotal)("memberDiscount", ctx_r0.memberDiscount)("lockEmail", ctx_r0.emailLocked)("promotionError", ctx_r0.promotionError)("quotedTotal", ctx_r0.quotedTotal)("quotedTax", ctx_r0.quotedTax);
39728
39937
  }
39729
39938
  }
39730
- function CheckoutPublicHostComponent_Conditional_5_Template(rf, ctx) {
39939
+ function CheckoutPublicHostComponent_Conditional_6_Template(rf, ctx) {
39731
39940
  if (rf & 1) {
39732
- \u0275\u0275repeaterCreate(0, CheckoutPublicHostComponent_Conditional_5_For_1_Template, 1, 13, "mj-checkout-widget", 38, \u0275\u0275repeaterTrackByIdentity);
39941
+ \u0275\u0275repeaterCreate(0, CheckoutPublicHostComponent_Conditional_6_For_1_Template, 1, 15, "mj-checkout-widget", 39, \u0275\u0275repeaterTrackByIdentity);
39733
39942
  }
39734
39943
  if (rf & 2) {
39735
39944
  const ctx_r0 = \u0275\u0275nextContext();
@@ -39778,6 +39987,26 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
39778
39987
  /** The server's total and tax for the details last drafted — shown before the buyer is charged. */
39779
39988
  quotedTotal = null;
39780
39989
  quotedTax = null;
39990
+ /** The verified member's discount the server last priced, shown before Pay (#919). */
39991
+ memberDiscount = null;
39992
+ /** How long the form must be still before a member's price is asked for. A field so a test can shorten it. */
39993
+ quoteDebounceMs = 400;
39994
+ quoteTimer = null;
39995
+ /** Bumped by every price change; a background answer for an older generation is dropped. */
39996
+ quoteGeneration = 0;
39997
+ /**
39998
+ * Every background draft still in flight. Pay and Apply wait for all of them, not only the latest: an older
39999
+ * one that lands after Pay's own draft would replace it on the session, and `/payment-intent` charges the
40000
+ * total the session's last draft saved.
40001
+ */
40002
+ backgroundQuotes = /* @__PURE__ */ new Set();
40003
+ /**
40004
+ * The e-mail is locked while a member token is attached and the host supplied the address (#919):
40005
+ * the discount is bound to it. Without a prefilled address the buyer must still be able to type one.
40006
+ */
40007
+ get emailLocked() {
40008
+ return !!this.memberToken && !!this.prefillEmail?.trim();
40009
+ }
39781
40010
  /** The post-payment account step, when the host registered one (#292). */
39782
40011
  account = null;
39783
40012
  password = "";
@@ -39802,6 +40031,14 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
39802
40031
  accessPollTimeoutMs = ACCESS_POLL_TIMEOUT_MS;
39803
40032
  /** True while access is being asked for; the redirect waits on it. */
39804
40033
  accessTracking = false;
40034
+ /**
40035
+ * Shown in place of the form once the buyer has paid and `/complete` has not given a final
40036
+ * answer (the reply was a gateway error page, or the session is still Processing).
40037
+ */
40038
+ finishingMessage = null;
40039
+ /** How often, and for how long, `/complete` is asked again. Fields so a test can shorten them. */
40040
+ completeRetryIntervalMs = COMPLETE_RETRY_INTERVAL_MS;
40041
+ completeRetryTimeoutMs = COMPLETE_RETRY_TIMEOUT_MS;
39805
40042
  get accessMessage() {
39806
40043
  return AccessMessage(this.accessState, this.config?.accessMessages);
39807
40044
  }
@@ -39893,6 +40130,7 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
39893
40130
  }
39894
40131
  ngOnDestroy() {
39895
40132
  this.destroyed = true;
40133
+ this.cancelBackgroundQuote();
39896
40134
  this.turnstile.Destroy();
39897
40135
  this.hostEl?.nativeElement?.removeEventListener?.(CHECKOUT_RESET_REQUEST_EVENT, this.onResetRequested);
39898
40136
  try {
@@ -39908,18 +40146,8 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
39908
40146
  this.processing = true;
39909
40147
  this.promotionError = null;
39910
40148
  try {
39911
- const draft = await this.post("/draft", {
39912
- sessionId: this.sessionId,
39913
- clientSessionKey: this.sessionKey,
39914
- email: event.email,
39915
- lines: [buildCheckoutDraftLine(this.config.productId, event)],
39916
- billingAddress: event.billingAddress,
39917
- answers: event.answers,
39918
- choices: event.choices,
39919
- ...this.attributionSource ? { attribution: { source: this.attributionSource, reference: this.attributionReference } } : {},
39920
- ...this.memberToken ? { memberToken: this.memberToken } : {},
39921
- promotionCodes: [event.promotionCode]
39922
- });
40149
+ await this.settleBackgroundQuote();
40150
+ const draft = await this.post("/draft", this.draftBody(this.config.productId, event, [event.promotionCode]));
39923
40151
  this.applyPromotionOutcome(draft, event);
39924
40152
  } catch {
39925
40153
  this.promotionError = "The code could not be checked. Please try again.";
@@ -40016,6 +40244,8 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40016
40244
  this.errorMessage = null;
40017
40245
  this.stripePaymentMethodId = null;
40018
40246
  this.serverPricedTotal = null;
40247
+ this.memberDiscount = null;
40248
+ this.cancelBackgroundQuote();
40019
40249
  try {
40020
40250
  this.card?.destroy?.();
40021
40251
  } catch {
@@ -40031,6 +40261,87 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40031
40261
  this.quotedTax = null;
40032
40262
  this.serverPricedTotal = null;
40033
40263
  this.appliedPromotion = null;
40264
+ this.memberDiscount = null;
40265
+ this.cancelBackgroundQuote();
40266
+ }
40267
+ /**
40268
+ * The widget's e-mail and billing location are complete and a price input changed (#919). With a
40269
+ * member token, the form is drafted in the background once it has been still for
40270
+ * `quoteDebounceMs`, so a verified member sees the discount, the total and the Pay button at the
40271
+ * member price before pressing Pay, and one press pays. Without a token nothing is sent.
40272
+ */
40273
+ onQuoteRequested(event) {
40274
+ if (!this.memberToken || this.renewalToken || !this.config?.productId) {
40275
+ return;
40276
+ }
40277
+ this.cancelBackgroundQuote();
40278
+ const generation = this.quoteGeneration;
40279
+ this.quoteTimer = setTimeout(() => {
40280
+ this.quoteTimer = null;
40281
+ const run = this.priceInBackground(event, generation);
40282
+ this.backgroundQuotes.add(run);
40283
+ void run.finally(() => this.backgroundQuotes.delete(run));
40284
+ }, this.quoteDebounceMs);
40285
+ }
40286
+ /**
40287
+ * Drafts the form with the member token and no typed code. Never blocks the form and never
40288
+ * reports an error: on any failure the price stays as it is, and Pay drafts it again. An answer
40289
+ * for an older generation, or one that arrives while Pay is being processed, is dropped. A token
40290
+ * that earned nothing changes nothing here; Pay shows its notice as before.
40291
+ */
40292
+ async priceInBackground(event, generation) {
40293
+ const productId = this.config?.productId;
40294
+ if (!productId || this.processing || this.destroyed) {
40295
+ return;
40296
+ }
40297
+ let draft;
40298
+ try {
40299
+ draft = await this.post("/draft", this.draftBody(productId, event, []));
40300
+ } catch {
40301
+ return;
40302
+ }
40303
+ if (generation !== this.quoteGeneration || this.processing || this.destroyed) {
40304
+ return;
40305
+ }
40306
+ this.memberDiscount = memberDiscountFromDraft(draft, event.quantity);
40307
+ if (this.memberDiscount) {
40308
+ const tax = typeof draft.Tax === "number" ? draft.Tax : 0;
40309
+ this.serverPricedTotal = { total: this.memberDiscount.total, quantity: event.quantity };
40310
+ this.quotedTotal = this.memberDiscount.total;
40311
+ this.quotedTax = tax > 0 ? tax : null;
40312
+ }
40313
+ this.cdr.detectChanges();
40314
+ }
40315
+ /** Drops a pending background draft and makes any answer already on its way stale. */
40316
+ cancelBackgroundQuote() {
40317
+ if (this.quoteTimer) {
40318
+ clearTimeout(this.quoteTimer);
40319
+ this.quoteTimer = null;
40320
+ }
40321
+ this.quoteGeneration++;
40322
+ }
40323
+ /**
40324
+ * Before Pay or Apply drafts: no background draft may start after it, and every one already sent is
40325
+ * waited for, so the server's session holds the buyer's draft rather than a background one.
40326
+ */
40327
+ async settleBackgroundQuote() {
40328
+ this.cancelBackgroundQuote();
40329
+ await Promise.all([...this.backgroundQuotes]);
40330
+ }
40331
+ /** The `/draft` body for a widget submission, priced with the given typed codes. */
40332
+ draftBody(productId, event, promotionCodes) {
40333
+ return {
40334
+ sessionId: this.sessionId,
40335
+ clientSessionKey: this.sessionKey,
40336
+ email: event.email,
40337
+ lines: [buildCheckoutDraftLine(productId, event)],
40338
+ billingAddress: event.billingAddress,
40339
+ answers: event.answers,
40340
+ ...this.attributionSource ? { attribution: { source: this.attributionSource, reference: this.attributionReference } } : {},
40341
+ choices: event.choices,
40342
+ ...this.memberToken ? { memberToken: this.memberToken } : {},
40343
+ promotionCodes
40344
+ };
40034
40345
  }
40035
40346
  async onSubmitted(event) {
40036
40347
  if (this.processing || !this.config?.productId) {
@@ -40040,19 +40351,8 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40040
40351
  this.errorMessage = null;
40041
40352
  this.setState("PROCESSING");
40042
40353
  try {
40043
- const line = buildCheckoutDraftLine(this.config.productId, event);
40044
- const draft = await this.post("/draft", {
40045
- sessionId: this.sessionId,
40046
- clientSessionKey: this.sessionKey,
40047
- email: event.email,
40048
- lines: [line],
40049
- billingAddress: event.billingAddress,
40050
- answers: event.answers,
40051
- ...this.attributionSource ? { attribution: { source: this.attributionSource, reference: this.attributionReference } } : {},
40052
- choices: event.choices,
40053
- ...this.memberToken ? { memberToken: this.memberToken } : {},
40054
- promotionCodes: event.promotionCode ? [event.promotionCode] : []
40055
- });
40354
+ await this.settleBackgroundQuote();
40355
+ const draft = await this.post("/draft", this.draftBody(this.config.productId, event, event.promotionCode ? [event.promotionCode] : []));
40056
40356
  if (!this.applyPromotionOutcome(draft, event)) {
40057
40357
  return;
40058
40358
  }
@@ -40061,6 +40361,9 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40061
40361
  throw new Error(this.str(draft?.ErrorMessage, "Could not price this checkout."));
40062
40362
  }
40063
40363
  this.serverPricedTotal = { total: Number(draft.TotalGross ?? 0), quantity: event.quantity };
40364
+ if (this.memberToken) {
40365
+ this.memberDiscount = memberDiscountFromDraft(draft, event.quantity);
40366
+ }
40064
40367
  const notice = memberDiscountNotice(draft, this.memberNoticeShown);
40065
40368
  if (notice) {
40066
40369
  this.memberNoticeShown = true;
@@ -40167,12 +40470,15 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40167
40470
  }
40168
40471
  }
40169
40472
  }
40170
- const done = await this.post("/complete", {
40473
+ const done = await this.completeAfterPayment(() => this.post("/complete", {
40171
40474
  sessionId: this.sessionId,
40172
40475
  clientSessionKey: this.sessionKey
40173
- });
40174
- if (!done?.Success) {
40175
- throw new Error(this.str(done?.ErrorMessage, "Could not complete the payment."));
40476
+ }));
40477
+ if (!done) {
40478
+ return;
40479
+ }
40480
+ if (!done.Success) {
40481
+ throw new Error(this.str(done.ErrorMessage, "Could not complete the payment."));
40176
40482
  }
40177
40483
  this.orderNumber = this.renewal.OrderNumber;
40178
40484
  this.successMessage = RenewalPaidMessage(this.renewal);
@@ -40217,12 +40523,15 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40217
40523
  }
40218
40524
  async finish() {
40219
40525
  this.rememberCompleting(this.sessionId);
40220
- const done = await this.postGated("/complete", {
40526
+ const done = await this.completeAfterPayment(() => this.postGated("/complete", {
40221
40527
  sessionId: this.sessionId,
40222
40528
  clientSessionKey: this.sessionKey
40223
- });
40224
- if (!done?.Success) {
40225
- throw new Error(this.str(done?.ErrorMessage, "Could not complete checkout."));
40529
+ }));
40530
+ if (!done) {
40531
+ return;
40532
+ }
40533
+ if (!done.Success) {
40534
+ throw new Error(this.str(done.ErrorMessage, "Could not complete checkout."));
40226
40535
  }
40227
40536
  this.orderNumber = done.OrderNumber ? String(done.OrderNumber) : null;
40228
40537
  this.successMessage = this.config?.successMessage || (this.orderNumber ? `Thank you. Order ${this.orderNumber} is confirmed.` : "Thank you. Your order is confirmed.");
@@ -40554,16 +40863,37 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40554
40863
  return null;
40555
40864
  }
40556
40865
  }
40557
- async post(path, body) {
40558
- const res = await fetch(`${this.apiRoot}${path}`, {
40559
- method: "POST",
40560
- headers: { "Content-Type": "application/json" },
40561
- credentials: "same-origin",
40562
- body: JSON.stringify(body)
40866
+ /**
40867
+ * Sends `/complete` for a checkout the buyer has paid for, asking again while the server may
40868
+ * still be finishing. Returns the server's final answer, or null when the wait ran out; the
40869
+ * buyer then sees that the payment went through, never a failure.
40870
+ */
40871
+ async completeAfterPayment(send) {
40872
+ const done = await CompleteWithRetry(send, {
40873
+ intervalMs: this.completeRetryIntervalMs,
40874
+ timeoutMs: this.completeRetryTimeoutMs,
40875
+ onWaiting: () => {
40876
+ this.finishingMessage = COMPLETE_FINISHING_MESSAGE;
40877
+ this.cdr.detectChanges();
40878
+ }
40563
40879
  });
40564
- const json = await res.json();
40565
- json._httpStatus = res.status;
40566
- return json;
40880
+ this.finishingMessage = done ? null : COMPLETE_DELAYED_MESSAGE;
40881
+ return done;
40882
+ }
40883
+ /** Throws {@link CheckoutTransportError}, whose message is written for the buyer, when no JSON reply arrives. */
40884
+ async post(path, body) {
40885
+ let res;
40886
+ try {
40887
+ res = await fetch(`${this.apiRoot}${path}`, {
40888
+ method: "POST",
40889
+ headers: { "Content-Type": "application/json" },
40890
+ credentials: "same-origin",
40891
+ body: JSON.stringify(body)
40892
+ });
40893
+ } catch {
40894
+ throw new CheckoutTransportError(null);
40895
+ }
40896
+ return ReadCheckoutReply(res);
40567
40897
  }
40568
40898
  /** `/initialize` and `/complete`: sends a Turnstile token when the widget requires one. */
40569
40899
  postGated(path, body) {
@@ -40590,16 +40920,16 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40590
40920
  static \u0275fac = function CheckoutPublicHostComponent_Factory(__ngFactoryType__) {
40591
40921
  return new (__ngFactoryType__ || _CheckoutPublicHostComponent)();
40592
40922
  };
40593
- static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _CheckoutPublicHostComponent, selectors: [["mj-orders-checkout"]], inputs: { slug: "slug", apiRoot: "apiRoot", memberToken: "memberToken", renewalToken: "renewalToken" }, outputs: { alreadySubscribed: "checkout-already-subscribed" }, decls: 7, vars: 1, consts: [[1, "mj-checkout-public"], ["role", "alert", 1, "mj-widget-error-banner"], ["role", "status", 1, "mj-checkout-success"], ["role", "status", 1, "mj-checkout-public__status"], [1, "mj-checkout-renewal"], [1, "mj-checkout-public__turnstile"], ["aria-hidden", "true", 1, "mj-checkout-success__icon"], [1, "mj-checkout-success__title"], [1, "mj-checkout-success__msg"], [1, "mj-checkout-success__order"], ["role", "status", 1, "mj-checkout-success__access", 3, "is-failed"], ["role", "status", 1, "mj-checkout-account__msg"], [1, "mj-checkout-account"], ["role", "status", 1, "mj-checkout-success__access"], [1, "mj-checkout-account", 3, "submit"], [1, "mj-checkout-account__title"], [1, "mj-checkout-account__note"], ["for", "mj-checkout-password", 1, "mj-checkout-account__label"], ["id", "mj-checkout-password", "type", "password", "autocomplete", "new-password", 1, "mj-checkout-account__input", 3, "input", "value"], ["for", "mj-checkout-password-confirm", 1, "mj-checkout-account__label"], ["id", "mj-checkout-password-confirm", "type", "password", "autocomplete", "new-password", 1, "mj-checkout-account__input", 3, "input", "value"], ["role", "alert", 1, "mj-checkout-account__error"], ["type", "submit", 1, "mj-checkout-account__submit", 3, "disabled"], ["type", "button", 1, "mj-checkout-account__skip", 3, "click", "disabled"], [1, "mj-checkout-account", "mj-checkout-account--actions"], ["type", "button", 1, "mj-checkout-account__submit", 3, "click"], ["type", "button", 1, "mj-checkout-account__skip"], ["type", "button", 1, "mj-checkout-account__skip", 3, "click"], [1, "mj-checkout-renewal", 3, "submit"], [1, "mj-checkout-renewal__title"], [1, "mj-checkout-renewal__lead"], [1, "mj-checkout-renewal__summary"], [1, "mj-checkout-renewal__row"], [1, "mj-checkout-renewal__row", "mj-checkout-renewal__row--total"], [1, "mj-checkout-renewal__note"], ["type", "submit", 1, "mj-checkout-renewal__pay", 3, "disabled"], ["for", "stripe-card-element", 1, "mj-checkout-renewal__label"], ["id", "stripe-card-element", 1, "mj-checkout-renewal__card"], [3, "config", "distributionSlug", "sessionKey", "isProcessing", "isPaymentReady", "stripePaymentMethodId", "prefillEmail", "errorMessage", "appliedPromotion", "serverPricedTotal", "promotionError", "quotedTotal", "quotedTax"], [3, "promotionCodeApplied", "submitted", "cancelled", "quoteInvalidated", "config", "distributionSlug", "sessionKey", "isProcessing", "isPaymentReady", "stripePaymentMethodId", "prefillEmail", "errorMessage", "appliedPromotion", "serverPricedTotal", "promotionError", "quotedTotal", "quotedTax"]], template: function CheckoutPublicHostComponent_Template(rf, ctx) {
40923
+ static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _CheckoutPublicHostComponent, selectors: [["mj-orders-checkout"]], inputs: { slug: "slug", apiRoot: "apiRoot", memberToken: "memberToken", renewalToken: "renewalToken" }, outputs: { alreadySubscribed: "checkout-already-subscribed" }, decls: 8, vars: 1, consts: [[1, "mj-checkout-public"], ["role", "alert", 1, "mj-widget-error-banner"], ["role", "status", 1, "mj-checkout-success"], ["role", "status", "aria-live", "polite", 1, "mj-checkout-success"], ["role", "status", 1, "mj-checkout-public__status"], [1, "mj-checkout-renewal"], [1, "mj-checkout-public__turnstile"], ["aria-hidden", "true", 1, "mj-checkout-success__icon"], [1, "mj-checkout-success__title"], [1, "mj-checkout-success__msg"], [1, "mj-checkout-success__order"], ["role", "status", 1, "mj-checkout-success__access", 3, "is-failed"], ["role", "status", 1, "mj-checkout-account__msg"], [1, "mj-checkout-account"], ["role", "status", 1, "mj-checkout-success__access"], [1, "mj-checkout-account", 3, "submit"], [1, "mj-checkout-account__title"], [1, "mj-checkout-account__note"], ["for", "mj-checkout-password", 1, "mj-checkout-account__label"], ["id", "mj-checkout-password", "type", "password", "autocomplete", "new-password", 1, "mj-checkout-account__input", 3, "input", "value"], ["for", "mj-checkout-password-confirm", 1, "mj-checkout-account__label"], ["id", "mj-checkout-password-confirm", "type", "password", "autocomplete", "new-password", 1, "mj-checkout-account__input", 3, "input", "value"], ["role", "alert", 1, "mj-checkout-account__error"], ["type", "submit", 1, "mj-checkout-account__submit", 3, "disabled"], ["type", "button", 1, "mj-checkout-account__skip", 3, "click", "disabled"], [1, "mj-checkout-account", "mj-checkout-account--actions"], ["type", "button", 1, "mj-checkout-account__submit", 3, "click"], ["type", "button", 1, "mj-checkout-account__skip"], ["type", "button", 1, "mj-checkout-account__skip", 3, "click"], [1, "mj-checkout-renewal", 3, "submit"], [1, "mj-checkout-renewal__title"], [1, "mj-checkout-renewal__lead"], [1, "mj-checkout-renewal__summary"], [1, "mj-checkout-renewal__row"], [1, "mj-checkout-renewal__row", "mj-checkout-renewal__row--total"], [1, "mj-checkout-renewal__note"], ["type", "submit", 1, "mj-checkout-renewal__pay", 3, "disabled"], ["for", "stripe-card-element", 1, "mj-checkout-renewal__label"], ["id", "stripe-card-element", 1, "mj-checkout-renewal__card"], [3, "config", "distributionSlug", "sessionKey", "isProcessing", "isPaymentReady", "stripePaymentMethodId", "prefillEmail", "errorMessage", "appliedPromotion", "serverPricedTotal", "memberDiscount", "lockEmail", "promotionError", "quotedTotal", "quotedTax"], [3, "promotionCodeApplied", "submitted", "cancelled", "quoteInvalidated", "quoteRequested", "config", "distributionSlug", "sessionKey", "isProcessing", "isPaymentReady", "stripePaymentMethodId", "prefillEmail", "errorMessage", "appliedPromotion", "serverPricedTotal", "memberDiscount", "lockEmail", "promotionError", "quotedTotal", "quotedTax"]], template: function CheckoutPublicHostComponent_Template(rf, ctx) {
40594
40924
  if (rf & 1) {
40595
40925
  \u0275\u0275elementStart(0, "div", 0);
40596
- \u0275\u0275conditionalCreate(1, CheckoutPublicHostComponent_Conditional_1_Template, 2, 1, "div", 1)(2, CheckoutPublicHostComponent_Conditional_2_Template, 12, 4, "div", 2)(3, CheckoutPublicHostComponent_Conditional_3_Template, 2, 0, "p", 3)(4, CheckoutPublicHostComponent_Conditional_4_Template, 25, 9, "form", 4)(5, CheckoutPublicHostComponent_Conditional_5_Template, 2, 2);
40597
- \u0275\u0275element(6, "div", 5);
40926
+ \u0275\u0275conditionalCreate(1, CheckoutPublicHostComponent_Conditional_1_Template, 2, 1, "div", 1)(2, CheckoutPublicHostComponent_Conditional_2_Template, 12, 4, "div", 2)(3, CheckoutPublicHostComponent_Conditional_3_Template, 3, 1, "div", 3)(4, CheckoutPublicHostComponent_Conditional_4_Template, 2, 0, "p", 4)(5, CheckoutPublicHostComponent_Conditional_5_Template, 25, 9, "form", 5)(6, CheckoutPublicHostComponent_Conditional_6_Template, 2, 2);
40927
+ \u0275\u0275element(7, "div", 6);
40598
40928
  \u0275\u0275elementEnd();
40599
40929
  }
40600
40930
  if (rf & 2) {
40601
40931
  \u0275\u0275advance();
40602
- \u0275\u0275conditional(ctx.loadError ? 1 : ctx.successMessage ? 2 : !ctx.config ? 3 : ctx.renewal ? 4 : 5);
40932
+ \u0275\u0275conditional(ctx.loadError ? 1 : ctx.successMessage ? 2 : ctx.finishingMessage ? 3 : !ctx.config ? 4 : ctx.renewal ? 5 : 6);
40603
40933
  }
40604
40934
  }, dependencies: [CommonModule, MJCheckoutWidgetComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.mj-checkout-public[_ngcontent-%COMP%] {\n max-width: 580px;\n margin: 0 auto;\n}\n\n.mj-checkout-public__status[_ngcontent-%COMP%] {\n text-align: center;\n color: #64748b;\n font-size: 0.95rem;\n padding: 2rem 0;\n}\n\n.mj-widget-error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #fef2f2;\n border: 1px solid #f87171;\n color: #991b1b;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 0.875rem;\n}\n\n.mj-checkout-success[_ngcontent-%COMP%] {\n text-align: center;\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n padding: 2rem 1.5rem;\n box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);\n}\n\n.mj-checkout-success__icon[_ngcontent-%COMP%] {\n width: 3rem;\n height: 3rem;\n margin: 0 auto 1rem;\n border-radius: 50%;\n background: #dcfce7;\n color: #16a34a;\n font-size: 1.5rem;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mj-checkout-success__title[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem;\n font-size: 1.5rem;\n font-weight: 800;\n color: #0f172a;\n}\n\n.mj-checkout-success__msg[_ngcontent-%COMP%], \n.mj-checkout-success__order[_ngcontent-%COMP%] {\n margin: 0;\n color: #64748b;\n font-size: 0.95rem;\n line-height: 1.5;\n}\n\n.mj-checkout-success__order[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n font-weight: 600;\n color: #334155;\n}\n\n\n\n.mj-checkout-success__access[_ngcontent-%COMP%] {\n margin: 0.75rem 0 0;\n color: #334155;\n font-size: 0.95rem;\n}\n\n.mj-checkout-success__access.is-failed[_ngcontent-%COMP%] {\n color: #991b1b;\n}\n\n\n\n.mj-checkout-account[_ngcontent-%COMP%] {\n margin: 1.5rem auto 0;\n max-width: 320px;\n text-align: left;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.mj-checkout-account__title[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem;\n font-size: 1.05rem;\n font-weight: 700;\n color: #0f172a;\n text-align: center;\n}\n\n.mj-checkout-account__label[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 600;\n color: #334155;\n}\n\n.mj-checkout-account__input[_ngcontent-%COMP%] {\n padding: 8px 10px;\n border: 1px solid #cbd5e1;\n border-radius: 6px;\n font-size: 0.95rem;\n font-family: inherit;\n}\n\n.mj-checkout-account__input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-primary-color, #2563eb);\n box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);\n}\n\n.mj-checkout-account__error[_ngcontent-%COMP%] {\n margin: 4px 0 0;\n color: #991b1b;\n font-size: 0.85rem;\n}\n\n.mj-checkout-account__submit[_ngcontent-%COMP%] {\n margin-top: 10px;\n padding: 10px;\n border: 0;\n border-radius: 6px;\n background: var(--mj-primary-color, #2563eb);\n color: #ffffff;\n font-weight: 600;\n cursor: pointer;\n}\n\n.mj-checkout-account__skip[_ngcontent-%COMP%] {\n padding: 6px;\n border: 0;\n background: none;\n color: #64748b;\n font-size: 0.85rem;\n cursor: pointer;\n}\n\n.mj-checkout-account__submit[_ngcontent-%COMP%]:disabled, \n.mj-checkout-account__skip[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.mj-checkout-account__msg[_ngcontent-%COMP%] {\n margin: 1rem 0 0;\n color: #334155;\n font-size: 0.95rem;\n line-height: 1.5;\n}\n\n.mj-checkout-account__note[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem;\n color: #475569;\n font-size: 0.85rem;\n line-height: 1.45;\n text-align: center;\n}\n\n.mj-checkout-account--actions[_ngcontent-%COMP%] {\n margin-top: 0.75rem;\n}\n\n\n\n.mj-checkout-public__turnstile[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n margin-top: 0.75rem;\n}\n\n\n\n\n.mj-checkout-renewal[_ngcontent-%COMP%] {\n background: #ffffff;\n border: 1px solid #e2e8f0;\n border-radius: 10px;\n padding: 1.75rem 1.5rem;\n box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.mj-checkout-renewal__title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.4rem;\n font-weight: 800;\n color: #0f172a;\n}\n\n.mj-checkout-renewal__lead[_ngcontent-%COMP%], \n.mj-checkout-renewal__note[_ngcontent-%COMP%] {\n margin: 0;\n color: #475569;\n font-size: 0.95rem;\n line-height: 1.5;\n}\n\n.mj-checkout-renewal__note[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n}\n\n.mj-checkout-renewal__summary[_ngcontent-%COMP%] {\n margin: 0.25rem 0;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n padding: 0.25rem 0.9rem;\n}\n\n.mj-checkout-renewal__row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.55rem 0;\n border-bottom: 1px solid #f1f5f9;\n font-size: 0.92rem;\n}\n\n.mj-checkout-renewal__row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.mj-checkout-renewal__row[_ngcontent-%COMP%] dt[_ngcontent-%COMP%] {\n color: #64748b;\n}\n\n.mj-checkout-renewal__row[_ngcontent-%COMP%] dd[_ngcontent-%COMP%] {\n margin: 0;\n color: #0f172a;\n text-align: right;\n}\n\n.mj-checkout-renewal__row--total[_ngcontent-%COMP%] dt[_ngcontent-%COMP%], \n.mj-checkout-renewal__row--total[_ngcontent-%COMP%] dd[_ngcontent-%COMP%] {\n font-weight: 700;\n color: #0f172a;\n}\n\n.mj-checkout-renewal__label[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 600;\n color: #334155;\n}\n\n.mj-checkout-renewal__card[_ngcontent-%COMP%] {\n border: 1px solid #cbd5e1;\n border-radius: 6px;\n padding: 0.75rem;\n background: #ffffff;\n}\n\n.mj-checkout-renewal__pay[_ngcontent-%COMP%] {\n margin-top: 0.25rem;\n padding: 0.8rem 1rem;\n border: none;\n border-radius: 6px;\n background: var(--mj-checkout-primary, #2563eb);\n color: #ffffff;\n font-size: 1rem;\n font-weight: 700;\n cursor: pointer;\n}\n\n.mj-checkout-renewal__pay[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}"] });
40605
40935
  };
@@ -40666,6 +40996,10 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40666
40996
  }
40667
40997
  }
40668
40998
  </div>
40999
+ } @else if (finishingMessage) {
41000
+ <div class="mj-checkout-success" role="status" aria-live="polite">
41001
+ <p class="mj-checkout-success__msg">{{ finishingMessage }}</p>
41002
+ </div>
40669
41003
  } @else if (!config) {
40670
41004
  <p class="mj-checkout-public__status" role="status">Loading checkout\u2026</p>
40671
41005
  } @else if (renewal) {
@@ -40725,13 +41059,16 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40725
41059
  [errorMessage]="errorMessage"
40726
41060
  [appliedPromotion]="appliedPromotion"
40727
41061
  [serverPricedTotal]="serverPricedTotal"
41062
+ [memberDiscount]="memberDiscount"
41063
+ [lockEmail]="emailLocked"
40728
41064
  [promotionError]="promotionError"
40729
41065
  (promotionCodeApplied)="onPromotionCodeApplied($event)"
40730
41066
  [quotedTotal]="quotedTotal"
40731
41067
  [quotedTax]="quotedTax"
40732
41068
  (submitted)="onSubmitted($event)"
40733
41069
  (cancelled)="onCancelled()"
40734
- (quoteInvalidated)="onQuoteInvalidated()">
41070
+ (quoteInvalidated)="onQuoteInvalidated()"
41071
+ (quoteRequested)="onQuoteRequested($event)">
40735
41072
  </mj-checkout-widget>
40736
41073
  }
40737
41074
  }
@@ -40752,7 +41089,7 @@ var CheckoutPublicHostComponent = class _CheckoutPublicHostComponent {
40752
41089
  }] });
40753
41090
  })();
40754
41091
  (() => {
40755
- (typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(CheckoutPublicHostComponent, { className: "CheckoutPublicHostComponent", filePath: "lib/checkout-widget/checkout-public-host.component.ts", lineNumber: 112 });
41092
+ (typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(CheckoutPublicHostComponent, { className: "CheckoutPublicHostComponent", filePath: "lib/checkout-widget/checkout-public-host.component.ts", lineNumber: 122 });
40756
41093
  })();
40757
41094
 
40758
41095
  // scripts/checkout-element-entry.ts