tf-checkout-react 2.0.0-beta.1 → 2.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -4103,7 +4103,91 @@ var en = {
4103
4103
  "referral.inviteFriends": "Invite friends",
4104
4104
  "referral.howToInvite": "How do you invite your friends?",
4105
4105
  "referral.sendThisLink": "Send them this link:",
4106
- "referral.howMuchCheaper": "How much cheaper?"
4106
+ "referral.howMuchCheaper": "How much cheaper?",
4107
+ // --- Checkout body (localization pass) ---------------------------------
4108
+ "common.submit": "Submit",
4109
+ "common.each": "each",
4110
+ "billing.heading": "Billing Information",
4111
+ "billing.continueToPayment": "Continue to payment",
4112
+ "billing.ttfOptIn": "Keep me updated about future events from The Ticket Fairy",
4113
+ "billing.fieldRequired": "This field is required.",
4114
+ "billing.firstNamePlaceholder": "First name *",
4115
+ "billing.lastNamePlaceholder": "Last name *",
4116
+ "billing.emailMustMatch": "Email addresses must match.",
4117
+ "billing.emailInvalid": "Enter a valid email address.",
4118
+ "billing.emailRegistered": "This email is already registered.",
4119
+ "billing.loginAutofill": "Log in to autofill your details",
4120
+ "billing.loginAutofillPlain": "Log in to autofill your details.",
4121
+ "billing.firstNameRequired": "First name is required.",
4122
+ "billing.lastNameRequired": "Last name is required.",
4123
+ "billing.streetRequired": "Street address is required.",
4124
+ "billing.cityRequired": "City is required.",
4125
+ "billing.postcodeRequired": "ZIP / postcode is required.",
4126
+ "billing.countryRequired": "Country is required.",
4127
+ "billing.stateRequired": "State / county is required.",
4128
+ "billing.countryEmpty": "\u2014 country * \u2014",
4129
+ "billing.stateEmpty": "\u2014 state / county \u2014",
4130
+ "billing.stateEmptyRequired": "\u2014 state / county * \u2014",
4131
+ "billing.holderTitle": "Ticket {{number}}",
4132
+ "billing.nationality": "Nationality",
4133
+ "billing.gender": "Gender",
4134
+ "billing.instagramHandle": "Instagram handle",
4135
+ "billing.phoneOptional": "Phone",
4136
+ "billing.phoneAria": "Phone",
4137
+ "billing.phoneInvalid": "Enter a valid phone number.",
4138
+ "billing.phonePlaceholder": "Phone number",
4139
+ "billing.dob": "Date of birth *",
4140
+ "billing.dobWithAge": "Date of birth * (must be {{age}}+)",
4141
+ "billing.dobRequired": "Date of birth is required.",
4142
+ "billing.ageMinimum": "You must be {{age}} or older.",
4143
+ "billing.privacyAgree": "I have read and agree to {{brand}}",
4144
+ "billing.privacyLink": "Privacy Policy.",
4145
+ "tickets.getTickets": "Get tickets",
4146
+ "tickets.selectOnMap": "Select on map",
4147
+ "tickets.selectSeats": "Select seats",
4148
+ "tickets.hideInfo": "Hide info",
4149
+ "tickets.viewInfo": "View info",
4150
+ "tickets.salesNotStarted": "Sales not started",
4151
+ "tickets.salesEnded": "Sales Ended",
4152
+ "tickets.accessCode": "Access code",
4153
+ "tickets.promoCode": "Promo code",
4154
+ "tickets.reserving": "Reserving\u2026",
4155
+ "addons.eyebrow": "Get Your Tickets",
4156
+ "addons.heading": "UPGRADES & ADD-ONS",
4157
+ "addons.confirmSelection": "CONFIRM SELECTION",
4158
+ "addons.updating": "Updating\u2026",
4159
+ "payment.title": "Payment",
4160
+ "payment.card": "Card",
4161
+ "payment.paymentPlan": "Payment plan",
4162
+ "payment.oxxo": "OXXO (pay in cash)",
4163
+ "payment.submitPayment": "Submit Payment",
4164
+ "payment.completeRegistration": "Complete Registration",
4165
+ "payment.placing": "Placing\u2026",
4166
+ "payment.testCard": "Test card: 4242 4242 4242 4242 \xB7 any future date \xB7 any CVC",
4167
+ "payment.testCardXendit": "Test card: 4000 0000 0000 0002 \xB7 any future date \xB7 any CVC",
4168
+ "confirmation.pending": "Payment pending",
4169
+ "confirmation.confirmed": "Your Tickets are Confirmed!",
4170
+ "confirmation.pendingBody": "We\u2019ll email your tickets as soon as the payment settles.",
4171
+ "confirmation.alreadyPaid": "This order was already paid \u2014 nothing was charged again.",
4172
+ "confirmation.available": "Your tickets are available in the My Tickets section \u2014 please bring them with you to the event.",
4173
+ "referral.copied": "Copied!",
4174
+ "referral.copyLink": "Copy link",
4175
+ "timer.completePurchase": "Please complete your purchase before the timer reaches zero.",
4176
+ "auth.logIn": "Log in",
4177
+ "auth.signUp": "Sign Up",
4178
+ "auth.passwordReset": "Password reset",
4179
+ "auth.backToLogin": "Back to log in",
4180
+ "auth.sendResetInstructions": "Send reset instructions",
4181
+ "auth.createAccount": "Create Account",
4182
+ "auth.forgotPassword": "Forgot password?",
4183
+ "auth.forgotIntro": "Enter your email and we\u2019ll send you instructions to reset your password.",
4184
+ "auth.missingToken": "This password-reset link is missing its token.",
4185
+ "auth.passwordTooShort": "Password must have at least 8 characters.",
4186
+ "auth.passwordNeedsSpecial": "Password must contain at least one special character.",
4187
+ "auth.passwordsMustMatch": "Passwords must match.",
4188
+ "auth.passwordChanged": "Your password has been changed. You can now log in.",
4189
+ "auth.selectState": "Select state / region",
4190
+ "auth.notRequired": "Not required"
4107
4191
  };
4108
4192
 
4109
4193
  // ../tf-checkout-shared/src/i18n/resolve.ts
@@ -4235,7 +4319,91 @@ var esMX = {
4235
4319
  "referral.inviteFriends": "Invita a tus amigos",
4236
4320
  "referral.howToInvite": "\xBFC\xF3mo invitas a tus amigos?",
4237
4321
  "referral.sendThisLink": "Env\xEDales este enlace:",
4238
- "referral.howMuchCheaper": "\xBFCu\xE1nto m\xE1s barato?"
4322
+ "referral.howMuchCheaper": "\xBFCu\xE1nto m\xE1s barato?",
4323
+ // --- Checkout body (localization pass) ---------------------------------
4324
+ "common.submit": "Enviar",
4325
+ "common.each": "c/u",
4326
+ "billing.heading": "Informaci\xF3n de facturaci\xF3n",
4327
+ "billing.continueToPayment": "Continuar al pago",
4328
+ "billing.ttfOptIn": "Quiero recibir novedades sobre pr\xF3ximos eventos de The Ticket Fairy",
4329
+ "billing.fieldRequired": "Este campo es obligatorio.",
4330
+ "billing.firstNamePlaceholder": "Nombre *",
4331
+ "billing.lastNamePlaceholder": "Apellido *",
4332
+ "billing.emailMustMatch": "Los correos electr\xF3nicos deben coincidir.",
4333
+ "billing.emailInvalid": "Ingresa un correo electr\xF3nico v\xE1lido.",
4334
+ "billing.emailRegistered": "Este correo ya est\xE1 registrado.",
4335
+ "billing.loginAutofill": "Inicia sesi\xF3n para completar tus datos",
4336
+ "billing.loginAutofillPlain": "Inicia sesi\xF3n para completar tus datos.",
4337
+ "billing.firstNameRequired": "El nombre es obligatorio.",
4338
+ "billing.lastNameRequired": "El apellido es obligatorio.",
4339
+ "billing.streetRequired": "La calle y n\xFAmero son obligatorios.",
4340
+ "billing.cityRequired": "La ciudad es obligatoria.",
4341
+ "billing.postcodeRequired": "El c\xF3digo postal es obligatorio.",
4342
+ "billing.countryRequired": "El pa\xEDs es obligatorio.",
4343
+ "billing.stateRequired": "El estado es obligatorio.",
4344
+ "billing.countryEmpty": "\u2014 pa\xEDs * \u2014",
4345
+ "billing.stateEmpty": "\u2014 estado \u2014",
4346
+ "billing.stateEmptyRequired": "\u2014 estado * \u2014",
4347
+ "billing.holderTitle": "Boleto {{number}}",
4348
+ "billing.nationality": "Nacionalidad",
4349
+ "billing.gender": "G\xE9nero",
4350
+ "billing.instagramHandle": "Usuario de Instagram",
4351
+ "billing.phoneOptional": "Tel\xE9fono",
4352
+ "billing.phoneAria": "Tel\xE9fono",
4353
+ "billing.phoneInvalid": "Ingresa un n\xFAmero de tel\xE9fono v\xE1lido.",
4354
+ "billing.phonePlaceholder": "N\xFAmero de tel\xE9fono",
4355
+ "billing.dob": "Fecha de nacimiento *",
4356
+ "billing.dobWithAge": "Fecha de nacimiento * (debes tener {{age}}+)",
4357
+ "billing.dobRequired": "La fecha de nacimiento es obligatoria.",
4358
+ "billing.ageMinimum": "Debes tener {{age}} a\xF1os o m\xE1s.",
4359
+ "billing.privacyAgree": "He le\xEDdo y acepto el",
4360
+ "billing.privacyLink": "Aviso de Privacidad.",
4361
+ "tickets.getTickets": "Comprar boletos",
4362
+ "tickets.selectOnMap": "Seleccionar en el mapa",
4363
+ "tickets.selectSeats": "Seleccionar asientos",
4364
+ "tickets.hideInfo": "Ocultar informaci\xF3n",
4365
+ "tickets.viewInfo": "Ver informaci\xF3n",
4366
+ "tickets.salesNotStarted": "Venta no iniciada",
4367
+ "tickets.salesEnded": "Venta finalizada",
4368
+ "tickets.accessCode": "C\xF3digo de acceso",
4369
+ "tickets.promoCode": "C\xF3digo promocional",
4370
+ "tickets.reserving": "Reservando\u2026",
4371
+ "addons.eyebrow": "Obt\xE9n tus boletos",
4372
+ "addons.heading": "MEJORAS Y COMPLEMENTOS",
4373
+ "addons.confirmSelection": "CONFIRMAR SELECCI\xD3N",
4374
+ "addons.updating": "Actualizando\u2026",
4375
+ "payment.title": "Pago",
4376
+ "payment.card": "Tarjeta",
4377
+ "payment.paymentPlan": "Plan de pagos",
4378
+ "payment.oxxo": "OXXO (pago en efectivo)",
4379
+ "payment.submitPayment": "Pagar",
4380
+ "payment.completeRegistration": "Completar registro",
4381
+ "payment.placing": "Procesando\u2026",
4382
+ "payment.testCard": "Tarjeta de prueba: 4242 4242 4242 4242 \xB7 cualquier fecha futura \xB7 cualquier CVC",
4383
+ "payment.testCardXendit": "Tarjeta de prueba: 4000 0000 0000 0002 \xB7 cualquier fecha futura \xB7 cualquier CVC",
4384
+ "confirmation.pending": "Pago pendiente",
4385
+ "confirmation.confirmed": "\xA1Tus boletos est\xE1n confirmados!",
4386
+ "confirmation.pendingBody": "Te enviaremos tus boletos por correo en cuanto se acredite el pago.",
4387
+ "confirmation.alreadyPaid": "Esta orden ya estaba pagada: no se te cobr\xF3 de nuevo.",
4388
+ "confirmation.available": "Tus boletos est\xE1n disponibles en la secci\xF3n Mis boletos. Recuerda llevarlos contigo al evento.",
4389
+ "referral.copied": "\xA1Copiado!",
4390
+ "referral.copyLink": "Copiar enlace",
4391
+ "timer.completePurchase": "Completa tu compra antes de que el temporizador llegue a cero.",
4392
+ "auth.logIn": "Iniciar sesi\xF3n",
4393
+ "auth.signUp": "Crear cuenta",
4394
+ "auth.passwordReset": "Restablecer contrase\xF1a",
4395
+ "auth.backToLogin": "Volver a iniciar sesi\xF3n",
4396
+ "auth.sendResetInstructions": "Enviar instrucciones",
4397
+ "auth.createAccount": "Crear cuenta",
4398
+ "auth.forgotPassword": "\xBFOlvidaste tu contrase\xF1a?",
4399
+ "auth.forgotIntro": "Ingresa tu correo y te enviaremos instrucciones para restablecer tu contrase\xF1a.",
4400
+ "auth.missingToken": "A este enlace de restablecimiento le falta el token.",
4401
+ "auth.passwordTooShort": "La contrase\xF1a debe tener al menos 8 caracteres.",
4402
+ "auth.passwordNeedsSpecial": "La contrase\xF1a debe incluir al menos un car\xE1cter especial.",
4403
+ "auth.passwordsMustMatch": "Las contrase\xF1as deben coincidir.",
4404
+ "auth.passwordChanged": "Tu contrase\xF1a se cambi\xF3. Ya puedes iniciar sesi\xF3n.",
4405
+ "auth.selectState": "Selecciona estado / regi\xF3n",
4406
+ "auth.notRequired": "No requerido"
4239
4407
  };
4240
4408
 
4241
4409
  // ../tf-checkout-shared/src/i18n/locales/index.ts
@@ -5134,6 +5302,7 @@ Button.displayName = "Button";
5134
5302
 
5135
5303
  // src/ui/InstallmentPicker.tsx
5136
5304
  var useInstallmentPicker = () => {
5305
+ const t = useT();
5137
5306
  const [pending, setPending] = useState4(null);
5138
5307
  const onInstallmentOffers = useCallback3(
5139
5308
  (offers) => new Promise((resolve) => setPending({ offers, resolve })),
@@ -5148,9 +5317,9 @@ var useInstallmentPicker = () => {
5148
5317
  {
5149
5318
  className: "tf-checkout-installments",
5150
5319
  role: "dialog",
5151
- "aria-label": "Choose installments"
5320
+ "aria-label": t("payment.chooseInstallments")
5152
5321
  },
5153
- /* @__PURE__ */ React5.createElement("div", { className: "tf-checkout-installments__box" }, /* @__PURE__ */ React5.createElement("strong", null, "Pay in installments?"), /* @__PURE__ */ React5.createElement("div", { className: "tf-checkout-installments__list" }, pending.offers.map((o, i) => {
5322
+ /* @__PURE__ */ React5.createElement("div", { className: "tf-checkout-installments__box" }, /* @__PURE__ */ React5.createElement("strong", null, t("payment.payInInstallments")), /* @__PURE__ */ React5.createElement("div", { className: "tf-checkout-installments__list" }, pending.offers.map((o, i) => {
5154
5323
  var _a;
5155
5324
  return /* @__PURE__ */ React5.createElement(
5156
5325
  "button",
@@ -5496,63 +5665,73 @@ var PaymentMethods = ({
5496
5665
  children,
5497
5666
  inputSlotFor,
5498
5667
  className
5499
- }) => /* @__PURE__ */ React10.createElement(
5500
- "div",
5501
- {
5502
- className: cx("tf-checkout-payment__methods", className),
5503
- role: "radiogroup",
5504
- "aria-label": "Payment method"
5505
- },
5506
- options.map((o) => {
5507
- var _a, _b, _c, _d, _e, _f;
5508
- const isSelected = o.value === selected;
5509
- const extraValue = o.extra === "phoneNumber" ? (_a = extraValues[o.value]) == null ? void 0 : _a.phoneNumber : (_b = extraValues[o.value]) == null ? void 0 : _b.cashtag;
5510
- const extraInvalid = Boolean(isSelected && o.extra && showValidation) && !(extraValue == null ? void 0 : extraValue.trim());
5511
- return /* @__PURE__ */ React10.createElement(
5512
- "label",
5513
- {
5514
- key: o.value,
5515
- className: cx(
5516
- "tf-checkout-payment__method",
5517
- isSelected && "tf-checkout-payment__method--selected"
5518
- )
5519
- },
5520
- /* @__PURE__ */ React10.createElement("span", { className: "tf-checkout-payment__method-head" }, /* @__PURE__ */ React10.createElement(
5521
- "input",
5522
- {
5523
- type: "radio",
5524
- name: "tf-pay-method",
5525
- className: "tf-checkout-payment__method-radio",
5526
- checked: isSelected,
5527
- onChange: () => onSelect(o.value)
5528
- }
5529
- ), o.iconUrl && /* @__PURE__ */ React10.createElement("img", { className: "tf-checkout-payment__method-icon", src: o.iconUrl, alt: "" }), /* @__PURE__ */ React10.createElement("span", { className: "tf-checkout-payment__method-label" }, o.label)),
5530
- isSelected && (o.value === inputSlotFor || o.extra) && /* @__PURE__ */ React10.createElement("div", { className: "tf-checkout-payment__method-body" }, o.value === inputSlotFor && children, o.extra && /* @__PURE__ */ React10.createElement(
5531
- Field,
5668
+ }) => {
5669
+ const t = useT();
5670
+ return /* @__PURE__ */ React10.createElement(
5671
+ "div",
5672
+ {
5673
+ className: cx("tf-checkout-payment__methods", className),
5674
+ role: "radiogroup",
5675
+ "aria-label": t("payment.method")
5676
+ },
5677
+ options.map((o) => {
5678
+ var _a, _b, _c, _d, _e, _f;
5679
+ const isSelected = o.value === selected;
5680
+ const extraValue = o.extra === "phoneNumber" ? (_a = extraValues[o.value]) == null ? void 0 : _a.phoneNumber : (_b = extraValues[o.value]) == null ? void 0 : _b.cashtag;
5681
+ const extraInvalid = Boolean(isSelected && o.extra && showValidation) && !(extraValue == null ? void 0 : extraValue.trim());
5682
+ return /* @__PURE__ */ React10.createElement(
5683
+ "label",
5532
5684
  {
5533
- label: `${EXTRA_LABEL[o.extra]} *`,
5534
- error: extraInvalid ? "This field is required." : void 0,
5535
- invalid: extraInvalid
5685
+ key: o.value,
5686
+ className: cx(
5687
+ "tf-checkout-payment__method",
5688
+ isSelected && "tf-checkout-payment__method--selected"
5689
+ )
5536
5690
  },
5537
- /* @__PURE__ */ React10.createElement(
5538
- Input,
5691
+ /* @__PURE__ */ React10.createElement("span", { className: "tf-checkout-payment__method-head" }, /* @__PURE__ */ React10.createElement(
5692
+ "input",
5539
5693
  {
5540
- inputMode: o.extra === "phoneNumber" ? "tel" : "text",
5541
- required: true,
5542
- invalid: extraInvalid,
5543
- "aria-invalid": extraInvalid,
5544
- placeholder: o.extra === "phoneNumber" ? "e.g. 081234567890" : "$cashtag",
5545
- value: o.extra === "phoneNumber" ? (_d = (_c = extraValues[o.value]) == null ? void 0 : _c.phoneNumber) != null ? _d : "" : (_f = (_e = extraValues[o.value]) == null ? void 0 : _e.cashtag) != null ? _f : "",
5546
- onChange: (e) => onExtraChange(
5547
- o.value,
5548
- o.extra === "phoneNumber" ? { phoneNumber: e.target.value } : { cashtag: e.target.value }
5549
- )
5694
+ type: "radio",
5695
+ name: "tf-pay-method",
5696
+ className: "tf-checkout-payment__method-radio",
5697
+ checked: isSelected,
5698
+ onChange: () => onSelect(o.value)
5550
5699
  }
5551
- )
5552
- ))
5553
- );
5554
- })
5555
- );
5700
+ ), o.iconUrl && /* @__PURE__ */ React10.createElement(
5701
+ "img",
5702
+ {
5703
+ className: "tf-checkout-payment__method-icon",
5704
+ src: o.iconUrl,
5705
+ alt: ""
5706
+ }
5707
+ ), /* @__PURE__ */ React10.createElement("span", { className: "tf-checkout-payment__method-label" }, o.label)),
5708
+ isSelected && (o.value === inputSlotFor || o.extra) && /* @__PURE__ */ React10.createElement("div", { className: "tf-checkout-payment__method-body" }, o.value === inputSlotFor && children, o.extra && /* @__PURE__ */ React10.createElement(
5709
+ Field,
5710
+ {
5711
+ label: `${EXTRA_LABEL[o.extra]} *`,
5712
+ error: extraInvalid ? t("billing.fieldRequired") : void 0,
5713
+ invalid: extraInvalid
5714
+ },
5715
+ /* @__PURE__ */ React10.createElement(
5716
+ Input,
5717
+ {
5718
+ inputMode: o.extra === "phoneNumber" ? "tel" : "text",
5719
+ required: true,
5720
+ invalid: extraInvalid,
5721
+ "aria-invalid": extraInvalid,
5722
+ placeholder: o.extra === "phoneNumber" ? "e.g. 081234567890" : "$cashtag",
5723
+ value: o.extra === "phoneNumber" ? (_d = (_c = extraValues[o.value]) == null ? void 0 : _c.phoneNumber) != null ? _d : "" : (_f = (_e = extraValues[o.value]) == null ? void 0 : _e.cashtag) != null ? _f : "",
5724
+ onChange: (e) => onExtraChange(
5725
+ o.value,
5726
+ o.extra === "phoneNumber" ? { phoneNumber: e.target.value } : { cashtag: e.target.value }
5727
+ )
5728
+ }
5729
+ )
5730
+ ))
5731
+ );
5732
+ })
5733
+ );
5734
+ };
5556
5735
 
5557
5736
  // src/ui/Stepper.tsx
5558
5737
  import React11 from "react";
@@ -5641,9 +5820,10 @@ var clock2 = (s) => {
5641
5820
  var TimerBanner = ({
5642
5821
  seconds,
5643
5822
  urgentAt = 60,
5644
- message = "Please complete your purchase before the timer reaches zero.",
5823
+ message,
5645
5824
  className
5646
5825
  }) => {
5826
+ const t = useT();
5647
5827
  const [dismissed, setDismissed] = useState6(false);
5648
5828
  if (seconds === void 0 || seconds <= 0 || dismissed) return null;
5649
5829
  const urgent = seconds <= urgentAt;
@@ -5657,14 +5837,14 @@ var TimerBanner = ({
5657
5837
  className
5658
5838
  )
5659
5839
  },
5660
- /* @__PURE__ */ React15.createElement("span", { className: "tf-checkout-timerbanner__msg" }, message),
5840
+ /* @__PURE__ */ React15.createElement("span", { className: "tf-checkout-timerbanner__msg" }, message != null ? message : t("timer.completePurchase")),
5661
5841
  /* @__PURE__ */ React15.createElement("span", { className: "tf-checkout-timerbanner__clock" }, clock2(seconds)),
5662
5842
  /* @__PURE__ */ React15.createElement(
5663
5843
  "button",
5664
5844
  {
5665
5845
  type: "button",
5666
5846
  className: "tf-checkout-timerbanner__close",
5667
- "aria-label": "Dismiss",
5847
+ "aria-label": t("common.dismiss"),
5668
5848
  onClick: () => setDismissed(true)
5669
5849
  },
5670
5850
  "\xD7"
@@ -5697,9 +5877,9 @@ var ForgotPasswordForm = ({
5697
5877
  void onSubmit(email);
5698
5878
  };
5699
5879
  if (successMessage) {
5700
- return /* @__PURE__ */ React16.createElement("div", { className: "tf-checkout-auth__form" }, /* @__PURE__ */ React16.createElement("div", { className: "tf-checkout-auth__success", role: "status" }, successMessage), /* @__PURE__ */ React16.createElement(Button, { type: "button", block: true, onClick: () => onBackToLogin(email) }, "Back to log in"));
5880
+ return /* @__PURE__ */ React16.createElement("div", { className: "tf-checkout-auth__form" }, /* @__PURE__ */ React16.createElement("div", { className: "tf-checkout-auth__success", role: "status" }, successMessage), /* @__PURE__ */ React16.createElement(Button, { type: "button", block: true, onClick: () => onBackToLogin(email) }, t("auth.backToLogin")));
5701
5881
  }
5702
- return /* @__PURE__ */ React16.createElement("form", { className: "tf-checkout-auth__form", onSubmit: submit, noValidate: true }, /* @__PURE__ */ React16.createElement("p", { className: "tf-checkout-auth__intro" }, "Enter your email and we\u2019ll send you instructions to reset your password."), error && /* @__PURE__ */ React16.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, error), /* @__PURE__ */ React16.createElement(Field, { label: t("auth.email"), error: errors.email }, /* @__PURE__ */ React16.createElement(
5882
+ return /* @__PURE__ */ React16.createElement("form", { className: "tf-checkout-auth__form", onSubmit: submit, noValidate: true }, /* @__PURE__ */ React16.createElement("p", { className: "tf-checkout-auth__intro" }, t("auth.forgotIntro")), error && /* @__PURE__ */ React16.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, error), /* @__PURE__ */ React16.createElement(Field, { label: t("auth.email"), error: errors.email }, /* @__PURE__ */ React16.createElement(
5703
5883
  Input,
5704
5884
  {
5705
5885
  type: "email",
@@ -5714,14 +5894,14 @@ var ForgotPasswordForm = ({
5714
5894
  onFieldChange == null ? void 0 : onFieldChange();
5715
5895
  }
5716
5896
  }
5717
- )), /* @__PURE__ */ React16.createElement(Button, { type: "submit", block: true, loading }, "Send reset instructions"), /* @__PURE__ */ React16.createElement(
5897
+ )), /* @__PURE__ */ React16.createElement(Button, { type: "submit", block: true, loading }, t("auth.sendResetInstructions")), /* @__PURE__ */ React16.createElement(
5718
5898
  "button",
5719
5899
  {
5720
5900
  type: "button",
5721
5901
  className: "tf-checkout-auth__text-button tf-checkout-auth__back",
5722
5902
  onClick: () => onBackToLogin(email)
5723
5903
  },
5724
- "Back to log in"
5904
+ t("auth.backToLogin")
5725
5905
  ));
5726
5906
  };
5727
5907
 
@@ -5823,14 +6003,14 @@ var LoginForm = ({
5823
6003
  }
5824
6004
  }
5825
6005
  )
5826
- ), /* @__PURE__ */ React18.createElement(Button, { type: "submit", block: true, loading }, "Login"), allowPasswordReset && onForgotPassword && /* @__PURE__ */ React18.createElement(
6006
+ ), /* @__PURE__ */ React18.createElement(Button, { type: "submit", block: true, loading }, t("auth.logIn")), allowPasswordReset && onForgotPassword && /* @__PURE__ */ React18.createElement(
5827
6007
  "button",
5828
6008
  {
5829
6009
  type: "button",
5830
6010
  className: "tf-checkout-auth__text-button tf-checkout-auth__forgot",
5831
6011
  onClick: () => onForgotPassword(email)
5832
6012
  },
5833
- "Forgot password?"
6013
+ t("auth.forgotPassword")
5834
6014
  ));
5835
6015
  };
5836
6016
 
@@ -6057,7 +6237,7 @@ var RegisterForm = ({
6057
6237
  invalid: Boolean(errors.stateId),
6058
6238
  onChange: (event) => setField("stateId", event.target.value)
6059
6239
  },
6060
- /* @__PURE__ */ React19.createElement("option", { value: "" }, states.length > 0 ? "Select state / region" : "Not required"),
6240
+ /* @__PURE__ */ React19.createElement("option", { value: "" }, states.length > 0 ? t("auth.selectState") : t("auth.notRequired")),
6061
6241
  states.map((state) => /* @__PURE__ */ React19.createElement("option", { key: state.id, value: state.id }, state.name))
6062
6242
  )
6063
6243
  ), /* @__PURE__ */ React19.createElement(
@@ -6151,7 +6331,7 @@ var RegisterForm = ({
6151
6331
  }
6152
6332
  )
6153
6333
  )),
6154
- /* @__PURE__ */ React19.createElement(Button, { type: "submit", block: true, loading }, "Create Account")
6334
+ /* @__PURE__ */ React19.createElement(Button, { type: "submit", block: true, loading }, t("auth.createAccount"))
6155
6335
  );
6156
6336
  };
6157
6337
 
@@ -6243,7 +6423,7 @@ var AuthModal = ({
6243
6423
  if (event.target === event.currentTarget && !auth.isSubmitting) onClose();
6244
6424
  };
6245
6425
  const isPasswordReset = auth.view === "forgot-password";
6246
- const title = isPasswordReset ? "Password reset" : "Ticket Fairy account";
6426
+ const title = isPasswordReset ? t("auth.passwordReset") : t("auth.title");
6247
6427
  return /* @__PURE__ */ React20.createElement("div", { className: cx("tf-checkout-auth", className), onMouseDown: closeFromBackdrop }, /* @__PURE__ */ React20.createElement(
6248
6428
  "div",
6249
6429
  {
@@ -6285,7 +6465,7 @@ var AuthModal = ({
6285
6465
  ),
6286
6466
  onClick: () => auth.showLogin(auth.suggestedEmail)
6287
6467
  },
6288
- "Login"
6468
+ t("auth.logIn")
6289
6469
  ),
6290
6470
  /* @__PURE__ */ React20.createElement(
6291
6471
  "button",
@@ -6299,7 +6479,7 @@ var AuthModal = ({
6299
6479
  ),
6300
6480
  onClick: () => auth.showRegister(auth.suggestedEmail)
6301
6481
  },
6302
- "Sign Up"
6482
+ t("auth.signUp")
6303
6483
  )
6304
6484
  ),
6305
6485
  logoUrl && /* @__PURE__ */ React20.createElement("div", { className: "tf-checkout-auth__logo-wrap" }, /* @__PURE__ */ React20.createElement(
@@ -6368,9 +6548,9 @@ var ResetPasswordForm = ({
6368
6548
  const validation = useMemo3(() => {
6369
6549
  if (!submitted) return {};
6370
6550
  return {
6371
- token: token ? "" : "This password-reset link is missing its token.",
6372
- password: password.length < 8 ? "Password must have at least 8 characters." : !/[@$!%*#?&]/.test(password) ? "Password must contain at least one special character." : "",
6373
- confirmation: password !== confirmation ? "Passwords must match." : ""
6551
+ token: token ? "" : t("auth.missingToken"),
6552
+ password: password.length < 8 ? t("auth.passwordTooShort") : !/[@$!%*#?&]/.test(password) ? t("auth.passwordNeedsSpecial") : "",
6553
+ confirmation: password !== confirmation ? t("auth.passwordsMustMatch") : ""
6374
6554
  };
6375
6555
  }, [confirmation, password, submitted, token]);
6376
6556
  const reset = hooks_exports.useResetPassword({
@@ -6387,7 +6567,7 @@ var ResetPasswordForm = ({
6387
6567
  reset.mutate({ token, password, passwordConfirmation: confirmation });
6388
6568
  };
6389
6569
  if (success) {
6390
- return /* @__PURE__ */ React21.createElement("div", { className: "tf-checkout-auth__form" }, /* @__PURE__ */ React21.createElement("div", { className: "tf-checkout-auth__success", role: "status" }, "Your password has been changed. You can now log in."), onBackToLogin && /* @__PURE__ */ React21.createElement(Button, { type: "button", block: true, onClick: onBackToLogin }, "Log in"));
6570
+ return /* @__PURE__ */ React21.createElement("div", { className: "tf-checkout-auth__form" }, /* @__PURE__ */ React21.createElement("div", { className: "tf-checkout-auth__success", role: "status" }, t("auth.passwordChanged")), onBackToLogin && /* @__PURE__ */ React21.createElement(Button, { type: "button", block: true, onClick: onBackToLogin }, t("auth.logIn")));
6391
6571
  }
6392
6572
  return /* @__PURE__ */ React21.createElement("form", { className: "tf-checkout-auth__form", onSubmit: submit, noValidate: true }, /* @__PURE__ */ React21.createElement("h2", { className: "tf-checkout-auth__title" }, t("auth.changePassword")), validation.token && /* @__PURE__ */ React21.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, validation.token), reset.error && /* @__PURE__ */ React21.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, errorMessage(reset.error)), /* @__PURE__ */ React21.createElement(Field, { label: t("auth.newPassword"), error: validation.password }, /* @__PURE__ */ React21.createElement(
6393
6573
  Input,
@@ -6411,7 +6591,7 @@ var ResetPasswordForm = ({
6411
6591
  invalid: Boolean(validation.confirmation),
6412
6592
  onChange: (event) => setConfirmation(event.target.value)
6413
6593
  }
6414
- )), /* @__PURE__ */ React21.createElement(Button, { type: "submit", block: true, loading: reset.isPending, disabled: !token }, "Submit"));
6594
+ )), /* @__PURE__ */ React21.createElement(Button, { type: "submit", block: true, loading: reset.isPending, disabled: !token }, t("common.submit")));
6415
6595
  };
6416
6596
 
6417
6597
  // src/sections/Tickets.tsx
@@ -6471,7 +6651,7 @@ var Tickets = ({
6471
6651
  eventId,
6472
6652
  title = false,
6473
6653
  onContinue,
6474
- buttonLabel = "Get tickets",
6654
+ buttonLabel,
6475
6655
  timeSlotDates,
6476
6656
  step,
6477
6657
  onSelectSeats,
@@ -6481,7 +6661,9 @@ var Tickets = ({
6481
6661
  className
6482
6662
  }) => {
6483
6663
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
6664
+ const tr = useT();
6484
6665
  const checkout = useCheckoutContext();
6666
+ const buttonText = buttonLabel != null ? buttonLabel : tr("tickets.getTickets");
6485
6667
  const ticketsQuery = hooks_exports.useTicketsWithMeta(eventId);
6486
6668
  const promoMeta = (_a = ticketsQuery.data) == null ? void 0 : _a.promo;
6487
6669
  const showWaitingList = (_c = (_b = ticketsQuery.data) == null ? void 0 : _b.showWaitingList) != null ? _c : false;
@@ -6567,7 +6749,7 @@ var Tickets = ({
6567
6749
  const seatMapRow = (t) => isSeated && !t.allowDirectPurchase;
6568
6750
  const hasSeatMapTickets = tickets.some(seatMapRow);
6569
6751
  const directPurchasable = tickets.filter((t) => !seatMapRow(t));
6570
- const seatCtaLabel = (eventInfo == null ? void 0 : eventInfo.tableMapEnabled) ? "Select on map" : "Select seats";
6752
+ const seatCtaLabel = (eventInfo == null ? void 0 : eventInfo.tableMapEnabled) ? tr("tickets.selectOnMap") : tr("tickets.selectSeats");
6571
6753
  const firstTableIndex = tickets.findIndex((t) => t.isTable);
6572
6754
  const firstTableId = firstTableIndex > 0 && tickets.slice(0, firstTableIndex).some((t) => !t.isTable) ? tickets[firstTableIndex].id : void 0;
6573
6755
  const prime = () => {
@@ -6600,7 +6782,7 @@ var Tickets = ({
6600
6782
  const ticketIndex = tickets.findIndex((candidate) => candidate.id === t.id);
6601
6783
  const previousTicket = ticketIndex > 0 ? tickets[ticketIndex - 1] : void 0;
6602
6784
  const startsNamedGroup = Boolean(t.groupName) && t.groupName !== (previousTicket == null ? void 0 : previousTicket.groupName);
6603
- return /* @__PURE__ */ React22.createElement(Fragment, { key: t.id }, startsNamedGroup ? /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__group" }, t.groupName) : t.id === firstTableId && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__group" }, "Reserve tables"), /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__row-wrap" }, /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__row" }, /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__info" }, /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__name" }, /* @__PURE__ */ React22.createElement("span", null, t.name), t.descriptionRich && /* @__PURE__ */ React22.createElement(
6785
+ return /* @__PURE__ */ React22.createElement(Fragment, { key: t.id }, startsNamedGroup ? /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__group" }, t.groupName) : t.id === firstTableId && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__group" }, tr("tickets.reserveTables")), /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__row-wrap" }, /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__row" }, /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__info" }, /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__name" }, /* @__PURE__ */ React22.createElement("span", null, t.name), t.descriptionRich && /* @__PURE__ */ React22.createElement(
6604
6786
  "button",
6605
6787
  {
6606
6788
  type: "button",
@@ -6609,7 +6791,7 @@ var Tickets = ({
6609
6791
  "aria-controls": `ticket-description-${t.id}`,
6610
6792
  onClick: () => setVisibleDescription((current2) => current2 === t.id ? null : t.id)
6611
6793
  },
6612
- visibleDescription === t.id ? "Hide info" : "View info"
6794
+ visibleDescription === t.id ? tr("tickets.hideInfo") : tr("tickets.viewInfo")
6613
6795
  )), /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__price" }, discounted && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__old" }, money(sym, original)), /* @__PURE__ */ React22.createElement(
6614
6796
  "span",
6615
6797
  {
@@ -6619,7 +6801,7 @@ var Tickets = ({
6619
6801
  )
6620
6802
  },
6621
6803
  isFree ? "FREE" : money(sym, t.price)
6622
- ), !isFree && !t.soldOut && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__fees" }, "(", money(sym, t.priceWithFees), " with fees)"), t.depositPercent != null && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__deposit" }, t.depositPercent.toFixed(2), "% DEPOSIT"))), seatMapRow(t) ? null : unavailable ? /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__soldout" }, t.soldOut ? "Sold out" : notStarted ? "Sales not started" : "Sales Ended") : /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__qty" }, t.isTable && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__guests" }, "Guests"), /* @__PURE__ */ React22.createElement(
6804
+ ), !isFree && !t.soldOut && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__fees" }, "(", money(sym, t.priceWithFees), " with fees)"), t.depositPercent != null && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__deposit" }, t.depositPercent.toFixed(2), "% DEPOSIT"))), seatMapRow(t) ? null : unavailable ? /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__soldout" }, t.soldOut ? tr("tickets.soldOut") : notStarted ? tr("tickets.salesNotStarted") : tr("tickets.salesEnded")) : /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__qty" }, t.isTable && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__guests" }, tr("tickets.guests")), /* @__PURE__ */ React22.createElement(
6623
6805
  QuantitySelect,
6624
6806
  {
6625
6807
  value: (_a2 = qty[t.id]) != null ? _a2 : 0,
@@ -6666,7 +6848,7 @@ var Tickets = ({
6666
6848
  title: title || "",
6667
6849
  pills: listQuery.isFetching && !listQuery.isLoading ? /* @__PURE__ */ React22.createElement(Loader, null) : void 0
6668
6850
  }
6669
- ), listQuery.isLoading && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__loading" }, /* @__PURE__ */ React22.createElement(Loader, { className: "tf-checkout-tickets__loading-spinner" })), listQuery.error && /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-error-text" }, listQuery.error.message), isTimeSlot && dates.length > 0 && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__currency" }, /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__currency-label" }, "Date"), /* @__PURE__ */ React22.createElement(
6851
+ ), listQuery.isLoading && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__loading" }, /* @__PURE__ */ React22.createElement(Loader, { className: "tf-checkout-tickets__loading-spinner" })), listQuery.error && /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-error-text" }, listQuery.error.message), isTimeSlot && dates.length > 0 && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__currency" }, /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__currency-label" }, tr("common.date")), /* @__PURE__ */ React22.createElement(
6670
6852
  "select",
6671
6853
  {
6672
6854
  className: "tf-checkout-select",
@@ -6677,7 +6859,7 @@ var Tickets = ({
6677
6859
  }
6678
6860
  },
6679
6861
  dates.map((d) => /* @__PURE__ */ React22.createElement("option", { key: d, value: d }, d))
6680
- )), checkout.currency && checkout.currency.available.length > 1 && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__currency" }, /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__currency-label" }, "Currency"), /* @__PURE__ */ React22.createElement(
6862
+ )), checkout.currency && checkout.currency.available.length > 1 && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__currency" }, /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__currency-label" }, tr("common.currency")), /* @__PURE__ */ React22.createElement(
6681
6863
  "select",
6682
6864
  {
6683
6865
  className: "tf-checkout-select",
@@ -6685,7 +6867,7 @@ var Tickets = ({
6685
6867
  onChange: (e) => changeCurrency(e.target.value)
6686
6868
  },
6687
6869
  checkout.currency.available.map((c) => /* @__PURE__ */ React22.createElement("option", { key: c.code, value: c.code }, c.name, " (", c.code, ")"))
6688
- )), isTimeSlot && !slotQuery.isLoading && tickets.length === 0 && slotDate && /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-note" }, "No sessions available on this date."), isTimeSlot ? timeGroups.map((g) => /* @__PURE__ */ React22.createElement(Fragment, { key: g.time }, g.time && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__slot-time" }, g.time), g.items.map(renderRow))) : tickets.map(renderRow), showCodeInput && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__promo" }, !isAccess && !promoOpen ? /* @__PURE__ */ React22.createElement(
6870
+ )), isTimeSlot && !slotQuery.isLoading && tickets.length === 0 && slotDate && /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-note" }, tr("tickets.noSessions")), isTimeSlot ? timeGroups.map((g) => /* @__PURE__ */ React22.createElement(Fragment, { key: g.time }, g.time && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__slot-time" }, g.time), g.items.map(renderRow))) : tickets.map(renderRow), showCodeInput && /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__promo" }, !isAccess && !promoOpen ? /* @__PURE__ */ React22.createElement(
6689
6871
  "button",
6690
6872
  {
6691
6873
  type: "button",
@@ -6696,7 +6878,7 @@ var Tickets = ({
6696
6878
  ) : /* @__PURE__ */ React22.createElement(React22.Fragment, null, /* @__PURE__ */ React22.createElement(FieldRow, null, /* @__PURE__ */ React22.createElement(Field, null, /* @__PURE__ */ React22.createElement(
6697
6879
  Input,
6698
6880
  {
6699
- placeholder: isAccess ? "Access code" : "Promo code",
6881
+ placeholder: isAccess ? tr("tickets.accessCode") : tr("tickets.promoCode"),
6700
6882
  value: code,
6701
6883
  onChange: (e) => setCode(e.target.value),
6702
6884
  onKeyDown: (e) => e.key === "Enter" && applyCode()
@@ -6727,7 +6909,7 @@ var Tickets = ({
6727
6909
  loading: checkout.isBusy,
6728
6910
  disabled: checkout.isBusy || selected.length === 0
6729
6911
  },
6730
- checkout.isBusy ? "Reserving\u2026" : selectionIsTable ? "Reserve tables" : buttonLabel
6912
+ checkout.isBusy ? tr("tickets.reserving") : selectionIsTable ? tr("tickets.reserveTables") : buttonText
6731
6913
  ), hasSeatMapTickets && /* @__PURE__ */ React22.createElement(Button, { block: true, onClick: () => onSelectSeats == null ? void 0 : onSelectSeats() }, seatCtaLabel), (error || checkout.error) && /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-error-text" }, error || checkout.error));
6732
6914
  };
6733
6915
 
@@ -7093,13 +7275,17 @@ var AddOns = ({
7093
7275
  eventId,
7094
7276
  onContinue,
7095
7277
  onSkip,
7096
- buttonLabel = "CONFIRM SELECTION",
7097
- eyebrow = "Get Your Tickets",
7098
- heading = "UPGRADES & ADD-ONS",
7278
+ buttonLabel,
7279
+ eyebrow,
7280
+ heading,
7099
7281
  className
7100
7282
  }) => {
7101
7283
  var _a, _b, _c, _d, _e, _f, _g, _h;
7284
+ const t = useT();
7102
7285
  const checkout = useCheckoutContext();
7286
+ const buttonText = buttonLabel != null ? buttonLabel : t("addons.confirmSelection");
7287
+ const eyebrowText = eyebrow != null ? eyebrow : t("addons.eyebrow");
7288
+ const headingText = heading != null ? heading : t("addons.heading");
7103
7289
  const combined = !onContinue;
7104
7290
  const addonsQuery = hooks_exports.useEventAddons(eventId);
7105
7291
  const all = (_a = addonsQuery.data) != null ? _a : [];
@@ -7129,14 +7315,14 @@ var AddOns = ({
7129
7315
  return ((_a3 = selection[id]) != null ? _a3 : 0) > 0;
7130
7316
  })
7131
7317
  );
7132
- const t = setTimeout(() => {
7318
+ const t2 = setTimeout(() => {
7133
7319
  checkout.setAddonDataCapture(captureForSelected);
7134
7320
  checkout.setAddons(selection).catch((e) => setError(errorMessage(e)));
7135
7321
  }, 500);
7136
- return () => clearTimeout(t);
7322
+ return () => clearTimeout(t2);
7137
7323
  }, [combined, qty, capture]);
7138
7324
  const hasRequired = ((_f = checkout.requiredAddOns) != null ? _f : []).some((a) => a.required);
7139
- const head = /* @__PURE__ */ React24.createElement("div", { className: "tf-checkout-addons__head" }, eyebrow && /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-addons__eyebrow" }, eyebrow), /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-addons__heading" }, heading), onSkip && !hasRequired && /* @__PURE__ */ React24.createElement("button", { type: "button", className: "tf-checkout-addons__skip", onClick: onSkip }, "Skip"));
7325
+ const head = /* @__PURE__ */ React24.createElement("div", { className: "tf-checkout-addons__head" }, eyebrowText && /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-addons__eyebrow" }, eyebrowText), /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-addons__heading" }, headingText), onSkip && !hasRequired && /* @__PURE__ */ React24.createElement("button", { type: "button", className: "tf-checkout-addons__skip", onClick: onSkip }, "Skip"));
7140
7326
  if (addonsQuery.isLoading) {
7141
7327
  return /* @__PURE__ */ React24.createElement(Card, { className }, head, /* @__PURE__ */ React24.createElement("div", { className: "tf-checkout-section-loader" }, /* @__PURE__ */ React24.createElement(Loader, null)));
7142
7328
  }
@@ -7183,7 +7369,7 @@ var AddOns = ({
7183
7369
  className: "tf-checkout-addons__desc",
7184
7370
  dangerouslySetInnerHTML: { __html: a.description }
7185
7371
  }
7186
- )), soldOut(a) ? /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-tickets__soldout" }, "Sold out") : /* @__PURE__ */ React24.createElement(
7372
+ )), soldOut(a) ? /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-tickets__soldout" }, t("tickets.soldOut")) : /* @__PURE__ */ React24.createElement(
7187
7373
  QuantitySelect,
7188
7374
  {
7189
7375
  value: n,
@@ -7214,7 +7400,7 @@ var AddOns = ({
7214
7400
  loading: checkout.isBusy,
7215
7401
  disabled: checkout.isBusy || selectedCount === 0
7216
7402
  },
7217
- checkout.isBusy ? "Updating\u2026" : buttonLabel
7403
+ checkout.isBusy ? t("addons.updating") : buttonText
7218
7404
  ), missing.length > 0 && /* @__PURE__ */ React24.createElement("p", { className: "tf-checkout-note" }, "Required add-on: ", missing.join(", "), "."), (error || checkout.error) && /* @__PURE__ */ React24.createElement("p", { className: "tf-checkout-error-text" }, error || checkout.error));
7219
7405
  };
7220
7406
 
@@ -7238,17 +7424,18 @@ var BillingAddressFields = ({
7238
7424
  setBilling
7239
7425
  }) => {
7240
7426
  var _a, _b, _c, _d, _e;
7427
+ const t = useT();
7241
7428
  const setValue = (key) => (event) => setBilling((current2) => ({ ...current2, [key]: event.target.value }));
7242
- return /* @__PURE__ */ React25.createElement(React25.Fragment, null, /* @__PURE__ */ React25.createElement("div", { className: "tf-checkout-billing__section-label" }, "Billing address *"), /* @__PURE__ */ React25.createElement(
7429
+ return /* @__PURE__ */ React25.createElement(React25.Fragment, null, /* @__PURE__ */ React25.createElement("div", { className: "tf-checkout-billing__section-label" }, t("billing.address")), /* @__PURE__ */ React25.createElement(
7243
7430
  Field,
7244
7431
  {
7245
- error: fieldError("Street address", "Street address is required."),
7432
+ error: fieldError("Street address", t("billing.streetRequired")),
7246
7433
  invalid: Boolean(fieldError("Street address"))
7247
7434
  },
7248
7435
  /* @__PURE__ */ React25.createElement(
7249
7436
  Input,
7250
7437
  {
7251
- placeholder: "Street address *",
7438
+ placeholder: t("billing.streetPlaceholder"),
7252
7439
  autoComplete: "street-address",
7253
7440
  value: (_a = billing.streetAddress) != null ? _a : "",
7254
7441
  required: true,
@@ -7260,13 +7447,13 @@ var BillingAddressFields = ({
7260
7447
  ), /* @__PURE__ */ React25.createElement(FieldRow, null, /* @__PURE__ */ React25.createElement(
7261
7448
  Field,
7262
7449
  {
7263
- error: fieldError("City", "City is required."),
7450
+ error: fieldError("City", t("billing.cityRequired")),
7264
7451
  invalid: Boolean(fieldError("City"))
7265
7452
  },
7266
7453
  /* @__PURE__ */ React25.createElement(
7267
7454
  Input,
7268
7455
  {
7269
- placeholder: "City *",
7456
+ placeholder: t("billing.cityPlaceholder"),
7270
7457
  autoComplete: "address-level2",
7271
7458
  value: (_b = billing.city) != null ? _b : "",
7272
7459
  required: true,
@@ -7278,13 +7465,13 @@ var BillingAddressFields = ({
7278
7465
  ), /* @__PURE__ */ React25.createElement(
7279
7466
  Field,
7280
7467
  {
7281
- error: fieldError("ZIP / postcode", "ZIP / postcode is required."),
7468
+ error: fieldError("ZIP / postcode", t("billing.postcodeRequired")),
7282
7469
  invalid: Boolean(fieldError("ZIP / postcode"))
7283
7470
  },
7284
7471
  /* @__PURE__ */ React25.createElement(
7285
7472
  Input,
7286
7473
  {
7287
- placeholder: "ZIP / Postcode *",
7474
+ placeholder: t("billing.postcodePlaceholder"),
7288
7475
  autoComplete: "postal-code",
7289
7476
  value: (_c = billing.zip) != null ? _c : "",
7290
7477
  required: true,
@@ -7296,14 +7483,14 @@ var BillingAddressFields = ({
7296
7483
  )), /* @__PURE__ */ React25.createElement(FieldRow, null, /* @__PURE__ */ React25.createElement(
7297
7484
  Field,
7298
7485
  {
7299
- error: fieldError("Country", "Country is required."),
7486
+ error: fieldError("Country", t("billing.countryRequired")),
7300
7487
  invalid: Boolean(fieldError("Country"))
7301
7488
  },
7302
7489
  /* @__PURE__ */ React25.createElement(
7303
7490
  Select,
7304
7491
  {
7305
7492
  value: (_d = billing.countryId) != null ? _d : "",
7306
- "aria-label": "Country",
7493
+ "aria-label": t("billing.countryLabel"),
7307
7494
  required: true,
7308
7495
  invalid: Boolean(fieldError("Country")),
7309
7496
  "aria-invalid": Boolean(fieldError("Country")),
@@ -7323,13 +7510,13 @@ var BillingAddressFields = ({
7323
7510
  });
7324
7511
  }
7325
7512
  },
7326
- /* @__PURE__ */ React25.createElement("option", { value: "" }, "\u2014 country * \u2014"),
7513
+ /* @__PURE__ */ React25.createElement("option", { value: "" }, t("billing.countryEmpty")),
7327
7514
  countries.map((country) => /* @__PURE__ */ React25.createElement("option", { key: country.id, value: country.id }, country.name))
7328
7515
  )
7329
7516
  ), /* @__PURE__ */ React25.createElement(
7330
7517
  Field,
7331
7518
  {
7332
- error: fieldError("State / county", "State / county is required."),
7519
+ error: fieldError("State / county", t("billing.stateRequired")),
7333
7520
  invalid: Boolean(fieldError("State / county"))
7334
7521
  },
7335
7522
  /* @__PURE__ */ React25.createElement(
@@ -7337,7 +7524,7 @@ var BillingAddressFields = ({
7337
7524
  {
7338
7525
  value: (_e = billing.stateId) != null ? _e : "",
7339
7526
  disabled: !billing.countryId || states.length === 0,
7340
- "aria-label": "State / region",
7527
+ "aria-label": t("billing.stateLabel"),
7341
7528
  required: states.length > 0,
7342
7529
  invalid: Boolean(fieldError("State / county")),
7343
7530
  "aria-invalid": Boolean(fieldError("State / county")),
@@ -7352,7 +7539,7 @@ var BillingAddressFields = ({
7352
7539
  }));
7353
7540
  }
7354
7541
  },
7355
- /* @__PURE__ */ React25.createElement("option", { value: "" }, "\u2014 state / county", states.length > 0 ? " *" : "", " \u2014"),
7542
+ /* @__PURE__ */ React25.createElement("option", { value: "" }, states.length > 0 ? t("billing.stateEmptyRequired") : t("billing.stateEmpty")),
7356
7543
  states.map((state) => /* @__PURE__ */ React25.createElement("option", { key: state.id, value: state.id }, state.name))
7357
7544
  )
7358
7545
  )));
@@ -7432,114 +7619,121 @@ var TicketHoldersCard = ({
7432
7619
  fieldError,
7433
7620
  renderCustomFields,
7434
7621
  patchHolder
7435
- }) => /* @__PURE__ */ React27.createElement(Card, { className: "tf-checkout-billing__holders-card" }, /* @__PURE__ */ React27.createElement(SectionHeader, { title: "Ticket Holders" }), holders.map((holder, index) => {
7436
- const firstNameKey = `Ticket ${index + 1} holder first name`;
7437
- const lastNameKey = `Ticket ${index + 1} holder last name`;
7438
- const emailKey = `Ticket ${index + 1} holder email`;
7439
- const phoneKey = `Ticket ${index + 1} holder phone`;
7440
- return /* @__PURE__ */ React27.createElement("div", { key: index, className: "tf-checkout-billing__holder" }, /* @__PURE__ */ React27.createElement("div", { className: "tf-checkout-billing__holder-title" }, "Ticket ", index + 1), holderNamesRequired && /* @__PURE__ */ React27.createElement(FieldRow, null, /* @__PURE__ */ React27.createElement(
7441
- Field,
7442
- {
7443
- label: "First Name *",
7444
- error: fieldError(firstNameKey, "First name is required."),
7445
- invalid: Boolean(fieldError(firstNameKey))
7446
- },
7447
- /* @__PURE__ */ React27.createElement(
7448
- Input,
7622
+ }) => {
7623
+ const t = useT();
7624
+ return /* @__PURE__ */ React27.createElement(Card, { className: "tf-checkout-billing__holders-card" }, /* @__PURE__ */ React27.createElement(SectionHeader, { title: t("billing.ticketHolders") }), holders.map((holder, index) => {
7625
+ const firstNameKey = `Ticket ${index + 1} holder first name`;
7626
+ const lastNameKey = `Ticket ${index + 1} holder last name`;
7627
+ const emailKey = `Ticket ${index + 1} holder email`;
7628
+ const phoneKey = `Ticket ${index + 1} holder phone`;
7629
+ return /* @__PURE__ */ React27.createElement("div", { key: index, className: "tf-checkout-billing__holder" }, /* @__PURE__ */ React27.createElement("div", { className: "tf-checkout-billing__holder-title" }, t("billing.holderTitle", { number: index + 1 })), holderNamesRequired && /* @__PURE__ */ React27.createElement(FieldRow, null, /* @__PURE__ */ React27.createElement(
7630
+ Field,
7449
7631
  {
7450
- value: holder.firstName,
7451
- required: true,
7452
- invalid: Boolean(fieldError(firstNameKey)),
7453
- "aria-invalid": Boolean(fieldError(firstNameKey)),
7454
- onChange: (event) => patchHolder(index, { firstName: event.target.value })
7455
- }
7456
- )
7457
- ), /* @__PURE__ */ React27.createElement(
7458
- Field,
7459
- {
7460
- label: "Last Name *",
7461
- error: fieldError(lastNameKey, "Last name is required."),
7462
- invalid: Boolean(fieldError(lastNameKey))
7463
- },
7464
- /* @__PURE__ */ React27.createElement(
7465
- Input,
7632
+ label: t("billing.holderFirstName"),
7633
+ error: fieldError(firstNameKey, t("billing.firstNameRequired")),
7634
+ invalid: Boolean(fieldError(firstNameKey))
7635
+ },
7636
+ /* @__PURE__ */ React27.createElement(
7637
+ Input,
7638
+ {
7639
+ value: holder.firstName,
7640
+ required: true,
7641
+ invalid: Boolean(fieldError(firstNameKey)),
7642
+ "aria-invalid": Boolean(fieldError(firstNameKey)),
7643
+ onChange: (event) => patchHolder(index, { firstName: event.target.value })
7644
+ }
7645
+ )
7646
+ ), /* @__PURE__ */ React27.createElement(
7647
+ Field,
7466
7648
  {
7467
- value: holder.lastName,
7468
- required: true,
7469
- invalid: Boolean(fieldError(lastNameKey)),
7470
- "aria-invalid": Boolean(fieldError(lastNameKey)),
7471
- onChange: (event) => patchHolder(index, { lastName: event.target.value })
7472
- }
7473
- )
7474
- )), collectHolderContact && /* @__PURE__ */ React27.createElement(FieldRow, null, /* @__PURE__ */ React27.createElement(
7475
- Field,
7476
- {
7477
- label: "Email Address *",
7478
- error: fieldError(emailKey, "Enter a valid email address."),
7479
- invalid: Boolean(fieldError(emailKey))
7480
- },
7481
- /* @__PURE__ */ React27.createElement(
7482
- Input,
7649
+ label: t("billing.holderLastName"),
7650
+ error: fieldError(lastNameKey, t("billing.lastNameRequired")),
7651
+ invalid: Boolean(fieldError(lastNameKey))
7652
+ },
7653
+ /* @__PURE__ */ React27.createElement(
7654
+ Input,
7655
+ {
7656
+ value: holder.lastName,
7657
+ required: true,
7658
+ invalid: Boolean(fieldError(lastNameKey)),
7659
+ "aria-invalid": Boolean(fieldError(lastNameKey)),
7660
+ onChange: (event) => patchHolder(index, { lastName: event.target.value })
7661
+ }
7662
+ )
7663
+ )), collectHolderContact && /* @__PURE__ */ React27.createElement(FieldRow, null, /* @__PURE__ */ React27.createElement(
7664
+ Field,
7483
7665
  {
7484
- type: "email",
7485
- autoComplete: "email",
7486
- value: holder.email,
7487
- required: true,
7488
- invalid: Boolean(fieldError(emailKey)),
7489
- "aria-invalid": Boolean(fieldError(emailKey)),
7490
- onChange: (event) => patchHolder(index, { email: event.target.value })
7491
- }
7492
- )
7493
- ), /* @__PURE__ */ React27.createElement(
7494
- Field,
7495
- {
7496
- label: "Phone *",
7497
- error: fieldError(phoneKey, "Enter a valid phone number."),
7498
- invalid: Boolean(fieldError(phoneKey))
7499
- },
7500
- /* @__PURE__ */ React27.createElement(
7501
- PhoneInput2,
7666
+ label: t("billing.email"),
7667
+ error: fieldError(emailKey, t("billing.emailInvalid")),
7668
+ invalid: Boolean(fieldError(emailKey))
7669
+ },
7670
+ /* @__PURE__ */ React27.createElement(
7671
+ Input,
7672
+ {
7673
+ type: "email",
7674
+ autoComplete: "email",
7675
+ value: holder.email,
7676
+ required: true,
7677
+ invalid: Boolean(fieldError(emailKey)),
7678
+ "aria-invalid": Boolean(fieldError(emailKey)),
7679
+ onChange: (event) => patchHolder(index, { email: event.target.value })
7680
+ }
7681
+ )
7682
+ ), /* @__PURE__ */ React27.createElement(
7683
+ Field,
7502
7684
  {
7503
- className: "tf-checkout-phone",
7504
- inputClassName: `tf-checkout-input tf-checkout-phone__input${fieldError(phoneKey) ? " tf-checkout-input--invalid" : ""}`,
7505
- defaultCountry: phoneCountry,
7506
- disableDialCodeAndPrefix: true,
7507
- showDisabledDialCodeAndPrefix: true,
7508
- disableDialCodePrefill: true,
7509
- value: holder.phone,
7510
- required: true,
7511
- inputProps: {
7512
- autoComplete: "tel",
7513
- "aria-label": phoneKey,
7514
- "aria-invalid": Boolean(fieldError(phoneKey))
7515
- },
7516
- onChange: (phone) => patchHolder(index, { phone })
7517
- }
7518
- )
7519
- )), renderCustomFields(holder, index));
7520
- }));
7685
+ label: t("billing.phone"),
7686
+ error: fieldError(phoneKey, t("billing.phoneInvalid")),
7687
+ invalid: Boolean(fieldError(phoneKey))
7688
+ },
7689
+ /* @__PURE__ */ React27.createElement(
7690
+ PhoneInput2,
7691
+ {
7692
+ className: "tf-checkout-phone",
7693
+ inputClassName: `tf-checkout-input tf-checkout-phone__input${fieldError(phoneKey) ? " tf-checkout-input--invalid" : ""}`,
7694
+ defaultCountry: phoneCountry,
7695
+ disableDialCodeAndPrefix: true,
7696
+ showDisabledDialCodeAndPrefix: true,
7697
+ disableDialCodePrefill: true,
7698
+ value: holder.phone,
7699
+ required: true,
7700
+ inputProps: {
7701
+ autoComplete: "tel",
7702
+ "aria-label": phoneKey,
7703
+ "aria-invalid": Boolean(fieldError(phoneKey))
7704
+ },
7705
+ onChange: (phone) => patchHolder(index, { phone })
7706
+ }
7707
+ )
7708
+ )), renderCustomFields(holder, index));
7709
+ }));
7710
+ };
7521
7711
 
7522
7712
  // src/sections/BillingInfo.tsx
7523
7713
  var BillingInfo = ({
7524
7714
  eventId,
7525
7715
  onContinue,
7526
- heading = "Billing Information",
7527
- buttonLabel = "Continue to payment",
7716
+ heading,
7717
+ buttonLabel,
7528
7718
  onLogin,
7529
7719
  skipWhenProfileComplete = false,
7530
7720
  requireEmailConfirmation = false,
7531
7721
  collectTicketHolders = false,
7532
7722
  collectHolderContact = false,
7533
- ttfOptInLabel = "Keep me updated about future events from The Ticket Fairy",
7723
+ ttfOptInLabel,
7534
7724
  brandOptInLabel,
7535
7725
  privacyPolicy,
7536
7726
  showPrivacyError = false,
7537
7727
  step,
7538
7728
  className
7539
7729
  }) => {
7540
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D;
7730
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E;
7731
+ const t = useT();
7541
7732
  const checkout = useCheckoutContext();
7542
7733
  const validation = useCheckoutValidation();
7734
+ const headingText = heading != null ? heading : t("billing.heading");
7735
+ const buttonText = buttonLabel != null ? buttonLabel : t("billing.continueToPayment");
7736
+ const ttfOptInText = ttfOptInLabel != null ? ttfOptInLabel : t("billing.ttfOptIn");
7543
7737
  const profile = hooks_exports.useProfile({ retry: false });
7544
7738
  const event = hooks_exports.useEvent(eventId);
7545
7739
  const combined = !onContinue;
@@ -7680,11 +7874,11 @@ var BillingInfo = ({
7680
7874
  useEffect11(() => {
7681
7875
  const email = billing.email.trim();
7682
7876
  if (checkout.isLoggedIn || !isEmail(email)) return;
7683
- const t = setTimeout(
7877
+ const t2 = setTimeout(
7684
7878
  () => checkout.checkBuyerEmail(email).catch(() => void 0),
7685
7879
  600
7686
7880
  );
7687
- return () => clearTimeout(t);
7881
+ return () => clearTimeout(t2);
7688
7882
  }, [billing.email, checkout.isLoggedIn]);
7689
7883
  const emailTaken = !checkout.isLoggedIn && checkout.existingAccountEmail === billing.email.trim();
7690
7884
  const needsNationality = checkout.buyerFields.some((f) => f.kind === "nationality");
@@ -7808,7 +8002,7 @@ var BillingInfo = ({
7808
8002
  const complete = missingDetails.length === 0;
7809
8003
  const showValidation = validation.attempt > 0;
7810
8004
  const missingSet = new Set(missingDetails);
7811
- const fieldError = (key, message = "This field is required.") => showValidation && missingSet.has(key) ? message : void 0;
8005
+ const fieldError = (key, message = t("billing.fieldRequired")) => showValidation && missingSet.has(key) ? message : void 0;
7812
8006
  const dobError = showValidation ? missingDetails.find(
7813
8007
  (detail) => detail === "Date of birth" || detail.startsWith("Age ")
7814
8008
  ) : void 0;
@@ -7816,7 +8010,7 @@ var BillingInfo = ({
7816
8010
  const commit = () => {
7817
8011
  checkout.setBilling(committedBilling);
7818
8012
  checkout.setHolders(committedHolders);
7819
- if (ttfOptInLabel || brandOptInLabel) checkout.setConsent(consent);
8013
+ if (ttfOptInText || brandOptInLabel) checkout.setConsent(consent);
7820
8014
  };
7821
8015
  useEffect11(() => {
7822
8016
  if (combined) commit();
@@ -7838,7 +8032,7 @@ var BillingInfo = ({
7838
8032
  const hasEventSpecificDetails = checkout.buyerFields.length > 0 || checkout.customFields.some((group) => group.fields.length > 0) || showHolders || gates.showDob;
7839
8033
  const skipBilling = skipWhenProfileComplete && checkout.isLoggedIn && profile.isSuccess && complete && !hasEventSpecificDetails;
7840
8034
  if (skipBilling) return null;
7841
- return /* @__PURE__ */ React28.createElement(React28.Fragment, null, /* @__PURE__ */ React28.createElement(Card, { className }, /* @__PURE__ */ React28.createElement(SectionHeader, { step, title: heading }), onLogin && !checkout.isLoggedIn && /* @__PURE__ */ React28.createElement("div", { className: "tf-checkout-billing__login" }, /* @__PURE__ */ React28.createElement("span", null, "Login & skip ahead:"), /* @__PURE__ */ React28.createElement(
8035
+ return /* @__PURE__ */ React28.createElement(React28.Fragment, null, /* @__PURE__ */ React28.createElement(Card, { className }, /* @__PURE__ */ React28.createElement(SectionHeader, { step, title: headingText }), onLogin && !checkout.isLoggedIn && /* @__PURE__ */ React28.createElement("div", { className: "tf-checkout-billing__login" }, /* @__PURE__ */ React28.createElement("span", null, "Login & skip ahead:"), /* @__PURE__ */ React28.createElement(
7842
8036
  "button",
7843
8037
  {
7844
8038
  type: "button",
@@ -7855,7 +8049,7 @@ var BillingInfo = ({
7855
8049
  /* @__PURE__ */ React28.createElement(
7856
8050
  Input,
7857
8051
  {
7858
- placeholder: "First name *",
8052
+ placeholder: t("billing.firstNamePlaceholder"),
7859
8053
  value: billing.firstName,
7860
8054
  required: true,
7861
8055
  invalid: Boolean(fieldError("First name")),
@@ -7872,7 +8066,7 @@ var BillingInfo = ({
7872
8066
  /* @__PURE__ */ React28.createElement(
7873
8067
  Input,
7874
8068
  {
7875
- placeholder: "Last name *",
8069
+ placeholder: t("billing.lastNamePlaceholder"),
7876
8070
  value: billing.lastName,
7877
8071
  required: true,
7878
8072
  invalid: Boolean(fieldError("Last name")),
@@ -7891,7 +8085,7 @@ var BillingInfo = ({
7891
8085
  {
7892
8086
  type: "email",
7893
8087
  autoComplete: "email",
7894
- placeholder: "Email *",
8088
+ placeholder: t("billing.emailPlaceholder"),
7895
8089
  value: billing.email,
7896
8090
  required: true,
7897
8091
  invalid: Boolean(fieldError("Valid email address")),
@@ -7904,7 +8098,7 @@ var BillingInfo = ({
7904
8098
  {
7905
8099
  error: fieldError(
7906
8100
  "Matching email confirmation",
7907
- "Email addresses must match."
8101
+ t("billing.emailMustMatch")
7908
8102
  ),
7909
8103
  invalid: Boolean(fieldError("Matching email confirmation"))
7910
8104
  },
@@ -7913,7 +8107,7 @@ var BillingInfo = ({
7913
8107
  {
7914
8108
  type: "email",
7915
8109
  autoComplete: "email",
7916
- placeholder: "Confirm email *",
8110
+ placeholder: t("billing.confirmEmailPlaceholder"),
7917
8111
  value: (_C = billing.confirmEmail) != null ? _C : "",
7918
8112
  required: true,
7919
8113
  invalid: Boolean(fieldError("Matching email confirmation")),
@@ -7921,15 +8115,15 @@ var BillingInfo = ({
7921
8115
  onChange: setB("confirmEmail")
7922
8116
  }
7923
8117
  )
7924
- )), !showValidation && requireEmailConfirmation && billing.confirmEmail && billing.confirmEmail.trim().toLowerCase() !== billing.email.trim().toLowerCase() && /* @__PURE__ */ React28.createElement("p", { className: "tf-checkout-error-text" }, "The email addresses do not match."), emailTaken && /* @__PURE__ */ React28.createElement("p", { className: "tf-checkout-note tf-checkout-billing__email-taken" }, "This email is already registered.", " ", onLogin ? /* @__PURE__ */ React28.createElement(
8118
+ )), !showValidation && requireEmailConfirmation && billing.confirmEmail && billing.confirmEmail.trim().toLowerCase() !== billing.email.trim().toLowerCase() && /* @__PURE__ */ React28.createElement("p", { className: "tf-checkout-error-text" }, t("billing.emailMismatch")), emailTaken && /* @__PURE__ */ React28.createElement("p", { className: "tf-checkout-note tf-checkout-billing__email-taken" }, t("billing.emailRegistered"), " ", onLogin ? /* @__PURE__ */ React28.createElement(
7925
8119
  "button",
7926
8120
  {
7927
8121
  type: "button",
7928
8122
  className: "tf-checkout-billing__login-link",
7929
8123
  onClick: () => onLogin(billing.email)
7930
8124
  },
7931
- "Log in to autofill your details"
7932
- ) : "Log in to autofill your details."), checkout.buyerFields.map((f) => {
8125
+ t("billing.loginAutofill")
8126
+ ) : t("billing.loginAutofillPlain")), checkout.buyerFields.map((f) => {
7933
8127
  var _a2;
7934
8128
  return /* @__PURE__ */ React28.createElement(
7935
8129
  BuyerField,
@@ -7940,15 +8134,15 @@ var BillingInfo = ({
7940
8134
  onChange: (v) => setBilling((b) => ({ ...b, [f.key]: v })),
7941
8135
  countries,
7942
8136
  error: fieldError(
7943
- f.kind === "nationality" ? "Nationality" : f.kind === "gender" ? "Gender" : "Instagram handle"
8137
+ f.kind === "nationality" ? t("billing.nationality") : f.kind === "gender" ? t("billing.gender") : t("billing.instagramHandle")
7944
8138
  )
7945
8139
  }
7946
8140
  );
7947
8141
  }), gates.showPhone && /* @__PURE__ */ React28.createElement(
7948
8142
  Field,
7949
8143
  {
7950
- label: `Phone${gates.phoneRequired ? " *" : ""}`,
7951
- error: fieldError("Valid phone number", "Enter a valid phone number."),
8144
+ label: gates.phoneRequired ? t("billing.phone") : t("billing.phoneOptional"),
8145
+ error: fieldError("Valid phone number", t("billing.phoneInvalid")),
7952
8146
  invalid: Boolean(fieldError("Valid phone number"))
7953
8147
  },
7954
8148
  /* @__PURE__ */ React28.createElement(
@@ -7962,10 +8156,10 @@ var BillingInfo = ({
7962
8156
  disableDialCodePrefill: true,
7963
8157
  value: (_D = billing.phone) != null ? _D : "",
7964
8158
  required: gates.phoneRequired,
7965
- placeholder: "Phone number",
8159
+ placeholder: t("billing.phonePlaceholder"),
7966
8160
  inputProps: {
7967
8161
  autoComplete: "tel",
7968
- "aria-label": "Phone",
8162
+ "aria-label": t("billing.phoneAria"),
7969
8163
  "aria-invalid": Boolean(fieldError("Valid phone number"))
7970
8164
  },
7971
8165
  onChange: (phone) => setBilling((current2) => ({ ...current2, phone }))
@@ -7974,8 +8168,8 @@ var BillingInfo = ({
7974
8168
  ), gates.showDob && /* @__PURE__ */ React28.createElement(
7975
8169
  Field,
7976
8170
  {
7977
- label: `Date of birth *${gates.minimumAge ? ` (must be ${gates.minimumAge}+)` : ""}`,
7978
- error: dobError === "Date of birth" ? "Date of birth is required." : dobError ? `You must be ${gates.minimumAge} or older.` : void 0,
8171
+ label: gates.minimumAge ? t("billing.dobWithAge", { age: gates.minimumAge }) : t("billing.dob"),
8172
+ error: dobError === "Date of birth" ? t("billing.dobRequired") : dobError ? t("billing.ageMinimum", { age: (_E = gates.minimumAge) != null ? _E : "" }) : void 0,
7979
8173
  invalid: Boolean(dobError)
7980
8174
  },
7981
8175
  /* @__PURE__ */ React28.createElement(
@@ -8026,17 +8220,17 @@ var BillingInfo = ({
8026
8220
  "aria-invalid": (showPrivacyError || showValidation) && !consent.ttfOptIn,
8027
8221
  onChange: (e) => setConsent((c) => ({ ...c, ttfOptIn: e.target.checked })),
8028
8222
  className: "tf-checkout-checkbox--consent",
8029
- label: /* @__PURE__ */ React28.createElement(React28.Fragment, null, "I have read and agree to ", privacyPolicy.brandName, " ", /* @__PURE__ */ React28.createElement("a", { href: privacyPolicy.url, target: "_blank", rel: "noreferrer" }, privacyPolicy.linkLabel || "Privacy Policy."), " *")
8223
+ label: /* @__PURE__ */ React28.createElement(React28.Fragment, null, t("billing.privacyAgree", { brand: privacyPolicy.brandName }), " ", /* @__PURE__ */ React28.createElement("a", { href: privacyPolicy.url, target: "_blank", rel: "noreferrer" }, privacyPolicy.linkLabel || t("billing.privacyLink")), " *")
8030
8224
  }
8031
8225
  ),
8032
- (showPrivacyError || showValidation) && !consent.ttfOptIn && /* @__PURE__ */ React28.createElement("div", { className: "tf-checkout-consent__error" }, "Required")
8033
- ) : ttfOptInLabel ? /* @__PURE__ */ React28.createElement(
8226
+ (showPrivacyError || showValidation) && !consent.ttfOptIn && /* @__PURE__ */ React28.createElement("div", { className: "tf-checkout-consent__error" }, t("common.required"))
8227
+ ) : ttfOptInText ? /* @__PURE__ */ React28.createElement(
8034
8228
  Checkbox,
8035
8229
  {
8036
8230
  checked: consent.ttfOptIn,
8037
8231
  onChange: (e) => setConsent((c) => ({ ...c, ttfOptIn: e.target.checked })),
8038
8232
  className: "tf-checkout-checkbox--consent",
8039
- label: ttfOptInLabel
8233
+ label: ttfOptInText
8040
8234
  }
8041
8235
  ) : null, !combined && /* @__PURE__ */ React28.createElement(React28.Fragment, null, /* @__PURE__ */ React28.createElement(
8042
8236
  Button,
@@ -8051,7 +8245,7 @@ var BillingInfo = ({
8051
8245
  onContinue == null ? void 0 : onContinue();
8052
8246
  }
8053
8247
  },
8054
- buttonLabel
8248
+ buttonText
8055
8249
  ))), showHolders && /* @__PURE__ */ React28.createElement(
8056
8250
  TicketHoldersCard,
8057
8251
  {
@@ -8086,12 +8280,13 @@ import React30, { useEffect as useEffect12, useMemo as useMemo6, useRef as useRe
8086
8280
  import React29 from "react";
8087
8281
  var OrderSummary = ({ eventId, className }) => {
8088
8282
  var _a, _b, _c;
8283
+ const t = useT();
8089
8284
  const checkout = useCheckoutContext();
8090
8285
  const event = hooks_exports.useEvent(eventId);
8091
8286
  const breakdown = checkout.breakdown;
8092
8287
  const detailed = checkout.priceBreakdown;
8093
8288
  if (!breakdown || breakdown.tickets.length === 0) return null;
8094
- return /* @__PURE__ */ React29.createElement(Card, { className: ["tf-checkout-order-summary", className].filter(Boolean).join(" ") }, ((_a = event.data) == null ? void 0 : _a.name) && /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__group" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, "Event"), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__event" }, event.data.name)), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__group" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, "Your Tickets"), breakdown.tickets.map((ticket, index) => {
8289
+ return /* @__PURE__ */ React29.createElement(Card, { className: ["tf-checkout-order-summary", className].filter(Boolean).join(" ") }, ((_a = event.data) == null ? void 0 : _a.name) && /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__group" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, t("common.event")), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__event" }, event.data.name)), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__group" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, t("tickets.yourTickets")), breakdown.tickets.map((ticket, index) => {
8095
8290
  var _a2;
8096
8291
  const detail = detailed == null ? void 0 : detailed.tickets[index];
8097
8292
  return /* @__PURE__ */ React29.createElement(
@@ -8100,7 +8295,7 @@ var OrderSummary = ({ eventId, className }) => {
8100
8295
  key: `${ticket.ticketTypeId}-${index}`,
8101
8296
  className: "tf-checkout-order-summary__item"
8102
8297
  },
8103
- /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__ticket" }, ticket.quantity, " x ", ticket.name, " - ", (_a2 = detail == null ? void 0 : detail.unit_price) != null ? _a2 : ticket.unit, " ", "each"),
8298
+ /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__ticket" }, ticket.quantity, " x ", ticket.name, " - ", (_a2 = detail == null ? void 0 : detail.unit_price) != null ? _a2 : ticket.unit, " ", t("common.each")),
8104
8299
  (detail == null ? void 0 : detail.line_total) && detail.line_total !== detail.unit_price && /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__fees" }, "(", detail.line_total, " with fees)")
8105
8300
  );
8106
8301
  })), ((_b = detailed == null ? void 0 : detailed.add_ons.length) != null ? _b : 0) > 0 && /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__group" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, (detailed == null ? void 0 : detailed.add_ons_title) || "Add-ons"), detailed == null ? void 0 : detailed.add_ons.map((addOn, index) => /* @__PURE__ */ React29.createElement(
@@ -8109,8 +8304,8 @@ var OrderSummary = ({ eventId, className }) => {
8109
8304
  key: `${addOn.name}-${index}`,
8110
8305
  className: "tf-checkout-order-summary__item"
8111
8306
  },
8112
- /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__ticket" }, addOn.quantity, " x ", addOn.name, addOn.show_price ? ` - ${addOn.unit_price} each` : "")
8113
- ))), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__total" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, "Total"), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__amount" }, (_c = detailed == null ? void 0 : detailed.total) != null ? _c : `${breakdown.currencySymbol || `${breakdown.currencyCode} `}${Number(
8307
+ /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__ticket" }, addOn.quantity, " x ", addOn.name, addOn.show_price ? ` - ${addOn.unit_price} ${t("common.each")}` : "")
8308
+ ))), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__total" }, /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__label" }, t("common.total")), /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__amount" }, (_c = detailed == null ? void 0 : detailed.total) != null ? _c : `${breakdown.currencySymbol || `${breakdown.currencyCode} `}${Number(
8114
8309
  breakdown.total
8115
8310
  ).toFixed(2)}`)));
8116
8311
  };
@@ -8153,6 +8348,7 @@ var Payment = ({
8153
8348
  className
8154
8349
  }) => {
8155
8350
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
8351
+ const t = useT();
8156
8352
  const checkout = useCheckoutContext();
8157
8353
  const validation = useCheckoutValidation();
8158
8354
  const [error, setError] = useState16("");
@@ -8182,7 +8378,11 @@ var Payment = ({
8182
8378
  const out = [];
8183
8379
  if (isXendit) {
8184
8380
  if (methods.xenditCard)
8185
- out.push({ id: { kind: "xenditCard" }, value: "xenditCard", label: "Card" });
8381
+ out.push({
8382
+ id: { kind: "xenditCard" },
8383
+ value: "xenditCard",
8384
+ label: t("payment.card")
8385
+ });
8186
8386
  for (const w of methods.xenditEWallets)
8187
8387
  out.push({
8188
8388
  id: { kind: "xenditEWallet", walletKey: w.key },
@@ -8194,23 +8394,23 @@ var Payment = ({
8194
8394
  } else if (checkout.gateway === "razorpay") {
8195
8395
  out.push({ id: { kind: "razorpay" }, value: "razorpay", label: "Razorpay" });
8196
8396
  } else {
8197
- out.push({ id: { kind: "card" }, value: "card", label: "Card" });
8198
- for (const t of (_b2 = checkout.redirectPaymentMethods) != null ? _b2 : []) {
8199
- if (t === "paypal" && methods.paypal) continue;
8397
+ out.push({ id: { kind: "card" }, value: "card", label: t("payment.card") });
8398
+ for (const t2 of (_b2 = checkout.redirectPaymentMethods) != null ? _b2 : []) {
8399
+ if (t2 === "paypal" && methods.paypal) continue;
8200
8400
  out.push({
8201
- id: { kind: "redirect", methodType: t },
8202
- value: `rd:${t}`,
8203
- label: redirectLabel(t)
8401
+ id: { kind: "redirect", methodType: t2 },
8402
+ value: `rd:${t2}`,
8403
+ label: redirectLabel(t2)
8204
8404
  });
8205
8405
  }
8206
8406
  if ((_c2 = checkout.paymentPlan) == null ? void 0 : _c2.available)
8207
8407
  out.push({
8208
8408
  id: { kind: "paymentPlan" },
8209
8409
  value: "paymentPlan",
8210
- label: "Payment plan"
8410
+ label: t("payment.paymentPlan")
8211
8411
  });
8212
8412
  if (offersOxxo)
8213
- out.push({ id: { kind: "oxxo" }, value: "oxxo", label: "OXXO (pay in cash)" });
8413
+ out.push({ id: { kind: "oxxo" }, value: "oxxo", label: t("payment.oxxo") });
8214
8414
  }
8215
8415
  if (methods.paypal)
8216
8416
  out.push({ id: { kind: "paypal" }, value: "paypal", label: "PayPal" });
@@ -8267,7 +8467,7 @@ var Payment = ({
8267
8467
  const extra = selectedOption == null ? void 0 : selectedOption.extra;
8268
8468
  const extrasOk = !extra || (extra === "cashtag" ? Boolean((_i = (_h = extras[selected]) == null ? void 0 : _h.cashtag) == null ? void 0 : _i.trim()) : Boolean((_k = (_j = extras[selected]) == null ? void 0 : _j.phoneNumber) == null ? void 0 : _k.trim()));
8269
8469
  const privacyOk = !requirePrivacyPolicy || checkout.consent.ttfOptIn;
8270
- const payLabel = isFree ? "Complete Registration" : isPlanSelected ? planConfirmLabel((_l = checkout.paymentPlan) == null ? void 0 : _l.configuration) : "Submit Payment";
8470
+ const payLabel = isFree ? t("payment.completeRegistration") : isPlanSelected ? planConfirmLabel((_l = checkout.paymentPlan) == null ? void 0 : _l.configuration) : t("payment.submitPayment");
8271
8471
  const planTerms = paymentPlanTerms((_m = checkout.paymentPlan) == null ? void 0 : _m.configuration);
8272
8472
  const finalizing = checkout.status === "placing" || checkout.status === "succeeded";
8273
8473
  const pay = () => {
@@ -8348,15 +8548,15 @@ var Payment = ({
8348
8548
  }
8349
8549
  }
8350
8550
  ) : /* @__PURE__ */ React30.createElement(CardInput, null)
8351
- ), isXendit && cardAreaError && /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-error-text" }, cardAreaError), showTestCardHint && /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-note" }, isXendit ? "Test card: 4000 0000 0000 0002 \xB7 any future date \xB7 any CVC" : "Test card: 4242 4242 4242 4242 \xB7 any future date \xB7 any CVC")), isPlanSelected && planTerms.length > 0 && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__plan" }, /* @__PURE__ */ React30.createElement("strong", null, planTermsTitle(checkout.paymentPlan.configuration)), planTerms.map((part) => /* @__PURE__ */ React30.createElement("p", { key: part.id, className: "tf-checkout-note" }, part.text))), isPlanSelected && savedLast4 && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__plan-savedcard" }, /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-note" }, "Your payment will proceed with the card ending in", " ", /* @__PURE__ */ React30.createElement("strong", null, "**** ", savedLast4)), /* @__PURE__ */ React30.createElement(
8551
+ ), isXendit && cardAreaError && /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-error-text" }, cardAreaError), showTestCardHint && /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-note" }, isXendit ? t("payment.testCardXendit") : t("payment.testCard"))), isPlanSelected && planTerms.length > 0 && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__plan" }, /* @__PURE__ */ React30.createElement("strong", null, planTermsTitle(checkout.paymentPlan.configuration)), planTerms.map((part) => /* @__PURE__ */ React30.createElement("p", { key: part.id, className: "tf-checkout-note" }, part.text))), isPlanSelected && savedLast4 && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__plan-savedcard" }, /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-note" }, "Your payment will proceed with the card ending in", " ", /* @__PURE__ */ React30.createElement("strong", null, "**** ", savedLast4)), /* @__PURE__ */ React30.createElement(
8352
8552
  Checkbox,
8353
8553
  {
8354
8554
  checked: useSavedCard,
8355
8555
  onChange: (e) => setUseSavedCard(e.target.checked),
8356
- label: "Use this card"
8556
+ label: t("payment.useThisCard")
8357
8557
  }
8358
8558
  )));
8359
- return /* @__PURE__ */ React30.createElement("div", { className: ["tf-checkout-payment-stack", className].filter(Boolean).join(" ") }, /* @__PURE__ */ React30.createElement(Card, null, /* @__PURE__ */ React30.createElement(SectionHeader, { title: "Payment" }), !isFree && /* @__PURE__ */ React30.createElement(React30.Fragment, null, !singleCard && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__label" }, "Payment method"), !methods ? /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__cardbox" }, /* @__PURE__ */ React30.createElement(Loader, null)) : singleCard ? paymentInput : /* @__PURE__ */ React30.createElement(
8559
+ return /* @__PURE__ */ React30.createElement("div", { className: ["tf-checkout-payment-stack", className].filter(Boolean).join(" ") }, /* @__PURE__ */ React30.createElement(Card, null, /* @__PURE__ */ React30.createElement(SectionHeader, { title: t("payment.title") }), !isFree && /* @__PURE__ */ React30.createElement(React30.Fragment, null, !singleCard && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__label" }, t("payment.method")), !methods ? /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__cardbox" }, /* @__PURE__ */ React30.createElement(Loader, null)) : singleCard ? paymentInput : /* @__PURE__ */ React30.createElement(
8360
8560
  PaymentMethods,
8361
8561
  {
8362
8562
  options,
@@ -8397,7 +8597,7 @@ var Payment = ({
8397
8597
  loading: finalizing,
8398
8598
  disabled: checkout.isBusy || finalizing || !isFree && !methods
8399
8599
  },
8400
- finalizing ? "Placing\u2026" : payLabel
8600
+ finalizing ? t("payment.placing") : payLabel
8401
8601
  )), bottomError && /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-error-text" }, bottomError));
8402
8602
  };
8403
8603
 
@@ -8444,6 +8644,7 @@ var Confirmation = ({
8444
8644
  children,
8445
8645
  className
8446
8646
  }) => {
8647
+ const t = useT();
8447
8648
  const checkout = useCheckoutContext();
8448
8649
  const order = checkout.order;
8449
8650
  const [copied, setCopied] = useState18(false);
@@ -8477,7 +8678,7 @@ var Confirmation = ({
8477
8678
  () => void 0
8478
8679
  );
8479
8680
  };
8480
- return /* @__PURE__ */ React32.createElement(Card, { className: cx("tf-checkout-confirmation", className) }, /* @__PURE__ */ React32.createElement("span", { className: "tf-checkout-confirmation__check" }, pending ? "\u23F3" : "\u2713"), /* @__PURE__ */ React32.createElement("strong", { className: "tf-checkout-confirmation__title" }, pending ? "Payment pending" : "Your Tickets are Confirmed!"), /* @__PURE__ */ React32.createElement("p", { className: "tf-checkout-note" }, pending ? "We\u2019ll email your tickets as soon as the payment settles." : order.alreadyPaid ? "This order was already paid \u2014 nothing was charged again." : "Your tickets are available in the My Tickets section \u2014 please bring them with you to the event."), order.orderHash && /* @__PURE__ */ React32.createElement("p", { className: "tf-checkout-confirmation__ref" }, "Reference: ", order.orderHash), pending && order.pendingVoucherUrl && /* @__PURE__ */ React32.createElement(
8681
+ return /* @__PURE__ */ React32.createElement(Card, { className: cx("tf-checkout-confirmation", className) }, /* @__PURE__ */ React32.createElement("span", { className: "tf-checkout-confirmation__check" }, pending ? "\u23F3" : "\u2713"), /* @__PURE__ */ React32.createElement("strong", { className: "tf-checkout-confirmation__title" }, pending ? t("confirmation.pending") : t("confirmation.confirmed")), /* @__PURE__ */ React32.createElement("p", { className: "tf-checkout-note" }, pending ? t("confirmation.pendingBody") : order.alreadyPaid ? t("confirmation.alreadyPaid") : t("confirmation.available")), order.orderHash && /* @__PURE__ */ React32.createElement("p", { className: "tf-checkout-confirmation__ref" }, "Reference: ", order.orderHash), pending && order.pendingVoucherUrl && /* @__PURE__ */ React32.createElement(
8481
8682
  "a",
8482
8683
  {
8483
8684
  className: "tf-checkout-button tf-checkout-button--secondary tf-checkout-button--block",
@@ -8493,7 +8694,7 @@ var Confirmation = ({
8493
8694
  href: viewOrderUrl
8494
8695
  },
8495
8696
  "View my tickets"
8496
- ), children, !pending && url && /* @__PURE__ */ React32.createElement("div", { className: "tf-checkout-confirmation__share" }, /* @__PURE__ */ React32.createElement("strong", null, "Your tickets can be cheaper \u2014 or even FREE!"), /* @__PURE__ */ React32.createElement("p", { className: "tf-checkout-note" }, "Invite friends with your link. When they buy, you get rewarded."), /* @__PURE__ */ React32.createElement("div", { className: "tf-checkout-confirmation__share-link" }, /* @__PURE__ */ React32.createElement("input", { className: "tf-checkout-input", readOnly: true, value: url }), /* @__PURE__ */ React32.createElement(Button, { variant: "secondary", onClick: copy }, copied ? "Copied!" : "Copy link")), /* @__PURE__ */ React32.createElement("div", { className: "tf-checkout-confirmation__socials" }, shares.map((s) => /* @__PURE__ */ React32.createElement(
8697
+ ), children, !pending && url && /* @__PURE__ */ React32.createElement("div", { className: "tf-checkout-confirmation__share" }, /* @__PURE__ */ React32.createElement("strong", null, t("referral.cheaperOrFree")), /* @__PURE__ */ React32.createElement("p", { className: "tf-checkout-note" }, "Invite friends with your link. When they buy, you get rewarded."), /* @__PURE__ */ React32.createElement("div", { className: "tf-checkout-confirmation__share-link" }, /* @__PURE__ */ React32.createElement("input", { className: "tf-checkout-input", readOnly: true, value: url }), /* @__PURE__ */ React32.createElement(Button, { variant: "secondary", onClick: copy }, copied ? t("referral.copied") : t("referral.copyLink"))), /* @__PURE__ */ React32.createElement("div", { className: "tf-checkout-confirmation__socials" }, shares.map((s) => /* @__PURE__ */ React32.createElement(
8497
8698
  "a",
8498
8699
  {
8499
8700
  key: s.label,
@@ -8909,32 +9110,41 @@ var EmbeddedCheckout = ({
8909
9110
  locale,
8910
9111
  messages,
8911
9112
  className
8912
- }) => /* @__PURE__ */ React35.createElement(CheckoutProvider, { theme, locale, messages, className }, /* @__PURE__ */ React35.createElement(
8913
- Flow,
9113
+ }) => /* @__PURE__ */ React35.createElement(
9114
+ CheckoutProvider,
8914
9115
  {
8915
- key: eventId,
8916
- eventId,
8917
- onComplete,
8918
- confirmationMode,
8919
- initialView,
8920
- onViewChange,
8921
- autoScroll,
8922
- requireEmailConfirmation,
8923
- collectTicketHolders,
8924
- collectHolderContact,
8925
- onLogin,
8926
- auth,
8927
- skipBillingWhenProfileComplete,
8928
- ttfOptInLabel,
8929
- brandOptInLabel,
8930
- privacyPolicy,
8931
- additionalConditions,
8932
- initialPromoCode,
8933
- referrer,
8934
- readAttributionFromUrl,
8935
- showTestCardHint
8936
- }
8937
- ));
9116
+ theme,
9117
+ locale,
9118
+ messages,
9119
+ className
9120
+ },
9121
+ /* @__PURE__ */ React35.createElement(
9122
+ Flow,
9123
+ {
9124
+ key: eventId,
9125
+ eventId,
9126
+ onComplete,
9127
+ confirmationMode,
9128
+ initialView,
9129
+ onViewChange,
9130
+ autoScroll,
9131
+ requireEmailConfirmation,
9132
+ collectTicketHolders,
9133
+ collectHolderContact,
9134
+ onLogin,
9135
+ auth,
9136
+ skipBillingWhenProfileComplete,
9137
+ ttfOptInLabel,
9138
+ brandOptInLabel,
9139
+ privacyPolicy,
9140
+ additionalConditions,
9141
+ initialPromoCode,
9142
+ referrer,
9143
+ readAttributionFromUrl,
9144
+ showTestCardHint
9145
+ }
9146
+ )
9147
+ );
8938
9148
 
8939
9149
  // src/ResumedCheckout.tsx
8940
9150
  import React36, { useEffect as useEffect16, useRef as useRef11, useState as useState22 } from "react";