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

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
@@ -1467,7 +1467,7 @@ var buildXenditCheckoutHtml = (options) => {
1467
1467
 
1468
1468
  // ../tf-checkout-shared/src/engine/errors.ts
1469
1469
  var errorMessage = (error) => toTtfError(error).message;
1470
- var EXPIRED_WORDS = /expir|caduc|scadut|abgelaufen|verlopen|udløbet|löpt ut|utløpt|vypršel|wygasł|истек|expirou|kedaluwarsa|hết hạn|期限切れ|已过期|已過期|만료/i;
1470
+ var EXPIRED_WORDS = /expir|caduc|scadut|abgelaufen|verlopen|udløbet|löpt ut|utløpt|vypršel|wygasł|истек|expirou|kedaluwarsa|vanhentu|hết hạn|期限切れ|已过期|已過期|만료/i;
1471
1471
  var isCartExpiredError = (error) => {
1472
1472
  const e = toTtfError(error);
1473
1473
  if (e.status !== 422) return false;
@@ -1869,8 +1869,12 @@ var removeReservedSeats = async (eventId, tierId, seatIds) => (
1869
1869
  var refreshReservation = async (eventId, orderId) => patch(ENDPOINTS.seatmap.refreshReservation(eventId), { order_id: orderId });
1870
1870
 
1871
1871
  // ../tf-checkout-shared/src/api/events.ts
1872
+ var badgeOf = (raw) => {
1873
+ const text = typeof raw === "string" ? raw.trim() : "";
1874
+ return text || null;
1875
+ };
1872
1876
  var mapTicket = (t) => {
1873
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
1877
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
1874
1878
  return {
1875
1879
  id: String(t.id),
1876
1880
  name: (_a = t.displayName) != null ? _a : "",
@@ -1898,7 +1902,8 @@ var mapTicket = (t) => {
1898
1902
  allowDirectPurchase: Boolean(t.allowDirectPurchase),
1899
1903
  waitingListEnabled: Boolean(t.waitingListEnabled),
1900
1904
  waitingListMaxQuantity: t.waitingListMaxQuantity != null ? Number(t.waitingListMaxQuantity) : void 0,
1901
- descriptionRich: (_m = t.descriptionRich) != null ? _m : null
1905
+ descriptionRich: (_m = t.descriptionRich) != null ? _m : null,
1906
+ badgeText: badgeOf((_n = t.badgeText) != null ? _n : t.badge_text)
1902
1907
  };
1903
1908
  };
1904
1909
  var getEventTickets = async (eventId) => {
@@ -1952,7 +1957,7 @@ var getEventConditions = async (eventId) => {
1952
1957
  }).filter((c) => c.content || c.name);
1953
1958
  };
1954
1959
  var getEventTimeSlotTickets = async (eventId, date, options) => {
1955
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
1960
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
1956
1961
  const body = await get(ENDPOINTS.events.timeSlotByDate(eventId), {
1957
1962
  params: {
1958
1963
  date,
@@ -1989,6 +1994,7 @@ var getEventTimeSlotTickets = async (eventId, date, options) => {
1989
1994
  isTable: Boolean(s.is_table),
1990
1995
  allowDirectPurchase: true,
1991
1996
  descriptionRich: (_t = s.description) != null ? _t : null,
1997
+ badgeText: badgeOf((_u = s.badge_text) != null ? _u : s.badgeText),
1992
1998
  timeSlot: { date: slotDate, time: timeKey }
1993
1999
  });
1994
2000
  }
@@ -4103,7 +4109,137 @@ var en = {
4103
4109
  "referral.inviteFriends": "Invite friends",
4104
4110
  "referral.howToInvite": "How do you invite your friends?",
4105
4111
  "referral.sendThisLink": "Send them this link:",
4106
- "referral.howMuchCheaper": "How much cheaper?"
4112
+ "referral.howMuchCheaper": "How much cheaper?",
4113
+ // --- Checkout body (localization pass) ---------------------------------
4114
+ "common.submit": "Submit",
4115
+ "common.each": "each",
4116
+ "billing.heading": "Billing Information",
4117
+ "billing.continueToPayment": "Continue to payment",
4118
+ "billing.ttfOptIn": "Keep me updated about future events from The Ticket Fairy",
4119
+ "billing.fieldRequired": "This field is required.",
4120
+ "billing.firstNamePlaceholder": "First name *",
4121
+ "billing.lastNamePlaceholder": "Last name *",
4122
+ "billing.emailMustMatch": "Email addresses must match.",
4123
+ "billing.emailInvalid": "Enter a valid email address.",
4124
+ "billing.emailRegistered": "This email is already registered.",
4125
+ "billing.loginAutofill": "Log in to autofill your details",
4126
+ "billing.loginAutofillPlain": "Log in to autofill your details.",
4127
+ "billing.firstNameRequired": "First name is required.",
4128
+ "billing.lastNameRequired": "Last name is required.",
4129
+ "billing.streetRequired": "Street address is required.",
4130
+ "billing.cityRequired": "City is required.",
4131
+ "billing.postcodeRequired": "ZIP / postcode is required.",
4132
+ "billing.countryRequired": "Country is required.",
4133
+ "billing.stateRequired": "State / county is required.",
4134
+ "billing.countryEmpty": "\u2014 country * \u2014",
4135
+ "billing.stateEmpty": "\u2014 state / county \u2014",
4136
+ "billing.stateEmptyRequired": "\u2014 state / county * \u2014",
4137
+ "billing.holderTitle": "Ticket {{number}}",
4138
+ "billing.nationality": "Nationality",
4139
+ "billing.gender": "Gender",
4140
+ "billing.instagramHandle": "Instagram handle",
4141
+ "billing.phoneOptional": "Phone",
4142
+ "billing.phoneAria": "Phone",
4143
+ "billing.phoneInvalid": "Enter a valid phone number.",
4144
+ "billing.phonePlaceholder": "Phone number",
4145
+ "billing.dob": "Date of birth *",
4146
+ "billing.dobWithAge": "Date of birth * (must be {{age}}+)",
4147
+ "billing.dobRequired": "Date of birth is required.",
4148
+ "billing.ageMinimum": "You must be {{age}} or older.",
4149
+ "billing.privacyAgree": "I have read and agree to {{brand}}",
4150
+ "billing.privacyLink": "Privacy Policy.",
4151
+ "tickets.getTickets": "Get tickets",
4152
+ "tickets.selectOnMap": "Select on map",
4153
+ "tickets.selectSeats": "Select seats",
4154
+ "tickets.hideInfo": "Hide info",
4155
+ "tickets.viewInfo": "View info",
4156
+ "tickets.salesNotStarted": "Sales not started",
4157
+ "tickets.salesEnded": "Sales Ended",
4158
+ "tickets.accessCode": "Access code",
4159
+ "tickets.promoCode": "Promo code",
4160
+ "tickets.reserving": "Reserving\u2026",
4161
+ "addons.eyebrow": "Get Your Tickets",
4162
+ "addons.heading": "UPGRADES & ADD-ONS",
4163
+ "addons.confirmSelection": "CONFIRM SELECTION",
4164
+ "addons.updating": "Updating\u2026",
4165
+ "payment.title": "Payment",
4166
+ "payment.card": "Card",
4167
+ "payment.paymentPlan": "Payment plan",
4168
+ "payment.oxxo": "OXXO (pay in cash)",
4169
+ "payment.submitPayment": "Submit Payment",
4170
+ "payment.completeRegistration": "Complete Registration",
4171
+ "payment.placing": "Placing\u2026",
4172
+ "payment.testCard": "Test card: 4242 4242 4242 4242 \xB7 any future date \xB7 any CVC",
4173
+ "payment.testCardXendit": "Test card: 4000 0000 0000 0002 \xB7 any future date \xB7 any CVC",
4174
+ "confirmation.pending": "Payment pending",
4175
+ "confirmation.confirmed": "Your Tickets are Confirmed!",
4176
+ "confirmation.pendingBody": "We\u2019ll email your tickets as soon as the payment settles.",
4177
+ "confirmation.alreadyPaid": "This order was already paid \u2014 nothing was charged again.",
4178
+ "confirmation.available": "Your tickets are available in the My Tickets section \u2014 please bring them with you to the event.",
4179
+ "referral.copied": "Copied!",
4180
+ "referral.copyLink": "Copy link",
4181
+ "timer.completePurchase": "Please complete your purchase before the timer reaches zero.",
4182
+ "auth.logIn": "Log in",
4183
+ "auth.signUp": "Sign Up",
4184
+ "auth.passwordReset": "Password reset",
4185
+ "auth.backToLogin": "Back to log in",
4186
+ "auth.sendResetInstructions": "Send reset instructions",
4187
+ "auth.createAccount": "Create Account",
4188
+ "auth.forgotPassword": "Forgot password?",
4189
+ "auth.forgotIntro": "Enter your email and we\u2019ll send you instructions to reset your password.",
4190
+ "auth.missingToken": "This password-reset link is missing its token.",
4191
+ "auth.passwordTooShort": "Password must have at least 8 characters.",
4192
+ "auth.passwordNeedsSpecial": "Password must contain at least one special character.",
4193
+ "auth.passwordsMustMatch": "Passwords must match.",
4194
+ "auth.passwordChanged": "Your password has been changed. You can now log in.",
4195
+ "auth.selectState": "Select state / region",
4196
+ "auth.notRequired": "Not required",
4197
+ // --- Previously hardcoded in components ---------------------------------
4198
+ "tickets.waitingListJoined": "You\u2019re on the waiting list \u2014 we\u2019ll email you if a spot opens.",
4199
+ "tickets.firstName": "First name",
4200
+ "tickets.lastName": "Last name",
4201
+ "tickets.email": "Email",
4202
+ "tickets.joinWaitingList": "Join the waiting list",
4203
+ "tickets.free": "FREE",
4204
+ "tickets.withFees": "({{price}} with fees)",
4205
+ "tickets.deposit": "{{percent}}% DEPOSIT",
4206
+ "tickets.gotPromoCode": "Got a promo code? Click here",
4207
+ "payment.conditionRequired": "You must accept this condition to continue.",
4208
+ "payment.payInFull": "Pay in full instead",
4209
+ "payment.installmentTotal": "{{amount}} total",
4210
+ "confirmation.viewVoucher": "View payment voucher",
4211
+ "confirmation.viewTickets": "View my tickets",
4212
+ "confirmation.orderConfirmed": "Your order has been confirmed!",
4213
+ "confirmation.emailed": "Your tickets have been emailed to you",
4214
+ "confirmation.inMyTickets": "Your tickets are available in My Tickets.",
4215
+ "confirmation.bringThem": "Please bring them with you to the event",
4216
+ "confirmation.viewOrder": "View Order",
4217
+ "confirmation.missingReference": "The order reference is missing.",
4218
+ "referral.titleStart": "Your ticket can become",
4219
+ "referral.titleCheaper": "cheaper",
4220
+ "referral.titleOr": "or even",
4221
+ "referral.titleFree": "FREE!",
4222
+ "referral.inviteMiddle": "and we'll refund up to",
4223
+ "referral.inviteEnd": "of your ticket money, if they buy tickets as well!",
4224
+ "referral.copy": "Copy",
4225
+ "referral.currentPrice": "Your ticket is currently",
4226
+ "referral.ifFriendsBuy": "If your friends buy {{count}} tickets",
4227
+ "referral.becomes": "Your ticket becomes",
4228
+ "referral.goesDownTo": "Your ticket goes down to",
4229
+ "verification.title": "Account Verification",
4230
+ "verification.checking": "Checking your verification status\u2026",
4231
+ "verification.idle": "To complete the purchase, please verify your identity.",
4232
+ "verification.starting": "Opening the verification page\u2026",
4233
+ "verification.polling": "Waiting for verification to complete in the other tab\u2026",
4234
+ "verification.verified": "Identity verified \u2014 your tickets are on their way.",
4235
+ "verification.timeoutCheckAgain": "Still not confirmed. Finish in the other tab, then check again.",
4236
+ "verification.timeoutSafe": "Verification is taking longer than usual. Your payment is safe.",
4237
+ "verification.error": "We couldn\u2019t reach the verification service. Try again.",
4238
+ "verification.verify": "Verify",
4239
+ "verification.verifying": "Verifying\u2026",
4240
+ "verification.checkAgain": "Check again",
4241
+ "verification.tryAgain": "Try again",
4242
+ "auth.existingAccount": "This email already has an account. Log in to autofill your checkout details."
4107
4243
  };
4108
4244
 
4109
4245
  // ../tf-checkout-shared/src/i18n/resolve.ts
@@ -4235,7 +4371,137 @@ var esMX = {
4235
4371
  "referral.inviteFriends": "Invita a tus amigos",
4236
4372
  "referral.howToInvite": "\xBFC\xF3mo invitas a tus amigos?",
4237
4373
  "referral.sendThisLink": "Env\xEDales este enlace:",
4238
- "referral.howMuchCheaper": "\xBFCu\xE1nto m\xE1s barato?"
4374
+ "referral.howMuchCheaper": "\xBFCu\xE1nto m\xE1s barato?",
4375
+ // --- Checkout body (localization pass) ---------------------------------
4376
+ "common.submit": "Enviar",
4377
+ "common.each": "c/u",
4378
+ "billing.heading": "Informaci\xF3n de facturaci\xF3n",
4379
+ "billing.continueToPayment": "Continuar al pago",
4380
+ "billing.ttfOptIn": "Quiero recibir novedades sobre pr\xF3ximos eventos de The Ticket Fairy",
4381
+ "billing.fieldRequired": "Este campo es obligatorio.",
4382
+ "billing.firstNamePlaceholder": "Nombre *",
4383
+ "billing.lastNamePlaceholder": "Apellido *",
4384
+ "billing.emailMustMatch": "Los correos electr\xF3nicos deben coincidir.",
4385
+ "billing.emailInvalid": "Ingresa un correo electr\xF3nico v\xE1lido.",
4386
+ "billing.emailRegistered": "Este correo ya est\xE1 registrado.",
4387
+ "billing.loginAutofill": "Inicia sesi\xF3n para completar tus datos",
4388
+ "billing.loginAutofillPlain": "Inicia sesi\xF3n para completar tus datos.",
4389
+ "billing.firstNameRequired": "El nombre es obligatorio.",
4390
+ "billing.lastNameRequired": "El apellido es obligatorio.",
4391
+ "billing.streetRequired": "La calle y n\xFAmero son obligatorios.",
4392
+ "billing.cityRequired": "La ciudad es obligatoria.",
4393
+ "billing.postcodeRequired": "El c\xF3digo postal es obligatorio.",
4394
+ "billing.countryRequired": "El pa\xEDs es obligatorio.",
4395
+ "billing.stateRequired": "El estado es obligatorio.",
4396
+ "billing.countryEmpty": "\u2014 pa\xEDs * \u2014",
4397
+ "billing.stateEmpty": "\u2014 estado \u2014",
4398
+ "billing.stateEmptyRequired": "\u2014 estado * \u2014",
4399
+ "billing.holderTitle": "Boleto {{number}}",
4400
+ "billing.nationality": "Nacionalidad",
4401
+ "billing.gender": "G\xE9nero",
4402
+ "billing.instagramHandle": "Usuario de Instagram",
4403
+ "billing.phoneOptional": "Tel\xE9fono",
4404
+ "billing.phoneAria": "Tel\xE9fono",
4405
+ "billing.phoneInvalid": "Ingresa un n\xFAmero de tel\xE9fono v\xE1lido.",
4406
+ "billing.phonePlaceholder": "N\xFAmero de tel\xE9fono",
4407
+ "billing.dob": "Fecha de nacimiento *",
4408
+ "billing.dobWithAge": "Fecha de nacimiento * (debes tener {{age}}+)",
4409
+ "billing.dobRequired": "La fecha de nacimiento es obligatoria.",
4410
+ "billing.ageMinimum": "Debes tener {{age}} a\xF1os o m\xE1s.",
4411
+ "billing.privacyAgree": "He le\xEDdo y acepto el",
4412
+ "billing.privacyLink": "Aviso de Privacidad.",
4413
+ "tickets.getTickets": "Comprar boletos",
4414
+ "tickets.selectOnMap": "Seleccionar en el mapa",
4415
+ "tickets.selectSeats": "Seleccionar asientos",
4416
+ "tickets.hideInfo": "Ocultar informaci\xF3n",
4417
+ "tickets.viewInfo": "Ver informaci\xF3n",
4418
+ "tickets.salesNotStarted": "Venta no iniciada",
4419
+ "tickets.salesEnded": "Venta finalizada",
4420
+ "tickets.accessCode": "C\xF3digo de acceso",
4421
+ "tickets.promoCode": "C\xF3digo promocional",
4422
+ "tickets.reserving": "Reservando\u2026",
4423
+ "addons.eyebrow": "Obt\xE9n tus boletos",
4424
+ "addons.heading": "MEJORAS Y COMPLEMENTOS",
4425
+ "addons.confirmSelection": "CONFIRMAR SELECCI\xD3N",
4426
+ "addons.updating": "Actualizando\u2026",
4427
+ "payment.title": "Pago",
4428
+ "payment.card": "Tarjeta",
4429
+ "payment.paymentPlan": "Plan de pagos",
4430
+ "payment.oxxo": "OXXO (pago en efectivo)",
4431
+ "payment.submitPayment": "Pagar",
4432
+ "payment.completeRegistration": "Completar registro",
4433
+ "payment.placing": "Procesando\u2026",
4434
+ "payment.testCard": "Tarjeta de prueba: 4242 4242 4242 4242 \xB7 cualquier fecha futura \xB7 cualquier CVC",
4435
+ "payment.testCardXendit": "Tarjeta de prueba: 4000 0000 0000 0002 \xB7 cualquier fecha futura \xB7 cualquier CVC",
4436
+ "confirmation.pending": "Pago pendiente",
4437
+ "confirmation.confirmed": "\xA1Tus boletos est\xE1n confirmados!",
4438
+ "confirmation.pendingBody": "Te enviaremos tus boletos por correo en cuanto se acredite el pago.",
4439
+ "confirmation.alreadyPaid": "Esta orden ya estaba pagada: no se te cobr\xF3 de nuevo.",
4440
+ "confirmation.available": "Tus boletos est\xE1n disponibles en la secci\xF3n Mis boletos. Recuerda llevarlos contigo al evento.",
4441
+ "referral.copied": "\xA1Copiado!",
4442
+ "referral.copyLink": "Copiar enlace",
4443
+ "timer.completePurchase": "Completa tu compra antes de que el temporizador llegue a cero.",
4444
+ "auth.logIn": "Iniciar sesi\xF3n",
4445
+ "auth.signUp": "Crear cuenta",
4446
+ "auth.passwordReset": "Restablecer contrase\xF1a",
4447
+ "auth.backToLogin": "Volver a iniciar sesi\xF3n",
4448
+ "auth.sendResetInstructions": "Enviar instrucciones",
4449
+ "auth.createAccount": "Crear cuenta",
4450
+ "auth.forgotPassword": "\xBFOlvidaste tu contrase\xF1a?",
4451
+ "auth.forgotIntro": "Ingresa tu correo y te enviaremos instrucciones para restablecer tu contrase\xF1a.",
4452
+ "auth.missingToken": "A este enlace de restablecimiento le falta el token.",
4453
+ "auth.passwordTooShort": "La contrase\xF1a debe tener al menos 8 caracteres.",
4454
+ "auth.passwordNeedsSpecial": "La contrase\xF1a debe incluir al menos un car\xE1cter especial.",
4455
+ "auth.passwordsMustMatch": "Las contrase\xF1as deben coincidir.",
4456
+ "auth.passwordChanged": "Tu contrase\xF1a se cambi\xF3. Ya puedes iniciar sesi\xF3n.",
4457
+ "auth.selectState": "Selecciona estado / regi\xF3n",
4458
+ "auth.notRequired": "No requerido",
4459
+ // --- Previously hardcoded in components ---------------------------------
4460
+ "tickets.waitingListJoined": "Ya est\xE1s en la lista de espera \u2014 te escribiremos si se libera un lugar.",
4461
+ "tickets.firstName": "Nombre",
4462
+ "tickets.lastName": "Apellido",
4463
+ "tickets.email": "Correo electr\xF3nico",
4464
+ "tickets.joinWaitingList": "Unirme a la lista de espera",
4465
+ "tickets.free": "GRATIS",
4466
+ "tickets.withFees": "({{price}} con cargos)",
4467
+ "tickets.deposit": "{{percent}}% DE ANTICIPO",
4468
+ "tickets.gotPromoCode": "\xBFTienes un c\xF3digo promocional? Haz clic aqu\xED",
4469
+ "payment.conditionRequired": "Debes aceptar esta condici\xF3n para continuar.",
4470
+ "payment.payInFull": "Mejor pagar en una sola exhibici\xF3n",
4471
+ "payment.installmentTotal": "{{amount}} en total",
4472
+ "confirmation.viewVoucher": "Ver ficha de pago",
4473
+ "confirmation.viewTickets": "Ver mis boletos",
4474
+ "confirmation.orderConfirmed": "\xA1Tu pedido est\xE1 confirmado!",
4475
+ "confirmation.emailed": "Te enviamos tus boletos por correo",
4476
+ "confirmation.inMyTickets": "Tus boletos est\xE1n disponibles en Mis boletos.",
4477
+ "confirmation.bringThem": "Ll\xE9valos contigo al evento",
4478
+ "confirmation.viewOrder": "Ver pedido",
4479
+ "confirmation.missingReference": "Falta la referencia del pedido.",
4480
+ "referral.titleStart": "Tu boleto puede salirte",
4481
+ "referral.titleCheaper": "m\xE1s barato",
4482
+ "referral.titleOr": "o incluso",
4483
+ "referral.titleFree": "\xA1GRATIS!",
4484
+ "referral.inviteMiddle": "y te reembolsamos hasta el",
4485
+ "referral.inviteEnd": "de lo que pagaste por tu boleto si ellos tambi\xE9n compran.",
4486
+ "referral.copy": "Copiar",
4487
+ "referral.currentPrice": "Tu boleto cuesta ahora",
4488
+ "referral.ifFriendsBuy": "Si tus amigos compran {{count}} boletos",
4489
+ "referral.becomes": "Tu boleto queda",
4490
+ "referral.goesDownTo": "Tu boleto baja a",
4491
+ "verification.title": "Verificaci\xF3n de cuenta",
4492
+ "verification.checking": "Revisando el estado de tu verificaci\xF3n\u2026",
4493
+ "verification.idle": "Para completar la compra, verifica tu identidad.",
4494
+ "verification.starting": "Abriendo la p\xE1gina de verificaci\xF3n\u2026",
4495
+ "verification.polling": "Esperando a que termines la verificaci\xF3n en la otra pesta\xF1a\u2026",
4496
+ "verification.verified": "Identidad verificada \u2014 tus boletos van en camino.",
4497
+ "verification.timeoutCheckAgain": "A\xFAn no se confirma. Termina en la otra pesta\xF1a y vuelve a revisar.",
4498
+ "verification.timeoutSafe": "La verificaci\xF3n est\xE1 tardando m\xE1s de lo normal. Tu pago est\xE1 seguro.",
4499
+ "verification.error": "No pudimos conectar con el servicio de verificaci\xF3n. Int\xE9ntalo de nuevo.",
4500
+ "verification.verify": "Verificar",
4501
+ "verification.verifying": "Verificando\u2026",
4502
+ "verification.checkAgain": "Revisar de nuevo",
4503
+ "verification.tryAgain": "Intentar de nuevo",
4504
+ "auth.existingAccount": "Este correo ya tiene una cuenta. Inicia sesi\xF3n para autocompletar tus datos de compra."
4239
4505
  };
4240
4506
 
4241
4507
  // ../tf-checkout-shared/src/i18n/locales/index.ts
@@ -5101,14 +5367,17 @@ import React4, { forwardRef } from "react";
5101
5367
 
5102
5368
  // src/ui/Loader.tsx
5103
5369
  import React3 from "react";
5104
- var Loader = ({ className }) => /* @__PURE__ */ React3.createElement(
5105
- "span",
5106
- {
5107
- className: cx("tf-checkout-loader", className),
5108
- role: "status",
5109
- "aria-label": "Loading"
5110
- }
5111
- );
5370
+ var Loader = ({ className }) => {
5371
+ const t = useT();
5372
+ return /* @__PURE__ */ React3.createElement(
5373
+ "span",
5374
+ {
5375
+ className: cx("tf-checkout-loader", className),
5376
+ role: "status",
5377
+ "aria-label": t("common.loading")
5378
+ }
5379
+ );
5380
+ };
5112
5381
 
5113
5382
  // src/ui/Button.tsx
5114
5383
  var Button = forwardRef(
@@ -5134,6 +5403,7 @@ Button.displayName = "Button";
5134
5403
 
5135
5404
  // src/ui/InstallmentPicker.tsx
5136
5405
  var useInstallmentPicker = () => {
5406
+ const t = useT();
5137
5407
  const [pending, setPending] = useState4(null);
5138
5408
  const onInstallmentOffers = useCallback3(
5139
5409
  (offers) => new Promise((resolve) => setPending({ offers, resolve })),
@@ -5148,9 +5418,9 @@ var useInstallmentPicker = () => {
5148
5418
  {
5149
5419
  className: "tf-checkout-installments",
5150
5420
  role: "dialog",
5151
- "aria-label": "Choose installments"
5421
+ "aria-label": t("payment.chooseInstallments")
5152
5422
  },
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) => {
5423
+ /* @__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
5424
  var _a;
5155
5425
  return /* @__PURE__ */ React5.createElement(
5156
5426
  "button",
@@ -5161,9 +5431,9 @@ var useInstallmentPicker = () => {
5161
5431
  onClick: () => choose(o)
5162
5432
  },
5163
5433
  /* @__PURE__ */ React5.createElement("span", null, o.count, " \xD7 ", (_a = o.per_installment_formatted) != null ? _a : o.per_installment),
5164
- /* @__PURE__ */ React5.createElement("span", { className: "tf-checkout-installments__meta" }, o.total_formatted ? `${o.total_formatted} total` : "", o.diff_from_original_formatted ? ` \xB7 ${o.diff_from_original_formatted}` : "")
5434
+ /* @__PURE__ */ React5.createElement("span", { className: "tf-checkout-installments__meta" }, o.total_formatted ? t("payment.installmentTotal", { amount: o.total_formatted }) : "", o.diff_from_original_formatted ? ` \xB7 ${o.diff_from_original_formatted}` : "")
5165
5435
  );
5166
- })), /* @__PURE__ */ React5.createElement(Button, { variant: "ghost", block: true, onClick: () => choose(null) }, "Pay in full instead"))
5436
+ })), /* @__PURE__ */ React5.createElement(Button, { variant: "ghost", block: true, onClick: () => choose(null) }, t("payment.payInFull")))
5167
5437
  ) : null;
5168
5438
  return { onInstallmentOffers, picker };
5169
5439
  };
@@ -5496,87 +5766,100 @@ var PaymentMethods = ({
5496
5766
  children,
5497
5767
  inputSlotFor,
5498
5768
  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,
5769
+ }) => {
5770
+ const t = useT();
5771
+ return /* @__PURE__ */ React10.createElement(
5772
+ "div",
5773
+ {
5774
+ className: cx("tf-checkout-payment__methods", className),
5775
+ role: "radiogroup",
5776
+ "aria-label": t("payment.method")
5777
+ },
5778
+ options.map((o) => {
5779
+ var _a, _b, _c, _d, _e, _f;
5780
+ const isSelected = o.value === selected;
5781
+ const extraValue = o.extra === "phoneNumber" ? (_a = extraValues[o.value]) == null ? void 0 : _a.phoneNumber : (_b = extraValues[o.value]) == null ? void 0 : _b.cashtag;
5782
+ const extraInvalid = Boolean(isSelected && o.extra && showValidation) && !(extraValue == null ? void 0 : extraValue.trim());
5783
+ return /* @__PURE__ */ React10.createElement(
5784
+ "label",
5532
5785
  {
5533
- label: `${EXTRA_LABEL[o.extra]} *`,
5534
- error: extraInvalid ? "This field is required." : void 0,
5535
- invalid: extraInvalid
5786
+ key: o.value,
5787
+ className: cx(
5788
+ "tf-checkout-payment__method",
5789
+ isSelected && "tf-checkout-payment__method--selected"
5790
+ )
5536
5791
  },
5537
- /* @__PURE__ */ React10.createElement(
5538
- Input,
5792
+ /* @__PURE__ */ React10.createElement("span", { className: "tf-checkout-payment__method-head" }, /* @__PURE__ */ React10.createElement(
5793
+ "input",
5539
5794
  {
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
- )
5795
+ type: "radio",
5796
+ name: "tf-pay-method",
5797
+ className: "tf-checkout-payment__method-radio",
5798
+ checked: isSelected,
5799
+ onChange: () => onSelect(o.value)
5550
5800
  }
5551
- )
5552
- ))
5553
- );
5554
- })
5555
- );
5801
+ ), o.iconUrl && /* @__PURE__ */ React10.createElement(
5802
+ "img",
5803
+ {
5804
+ className: "tf-checkout-payment__method-icon",
5805
+ src: o.iconUrl,
5806
+ alt: ""
5807
+ }
5808
+ ), /* @__PURE__ */ React10.createElement("span", { className: "tf-checkout-payment__method-label" }, o.label)),
5809
+ 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(
5810
+ Field,
5811
+ {
5812
+ label: `${EXTRA_LABEL[o.extra]} *`,
5813
+ error: extraInvalid ? t("billing.fieldRequired") : void 0,
5814
+ invalid: extraInvalid
5815
+ },
5816
+ /* @__PURE__ */ React10.createElement(
5817
+ Input,
5818
+ {
5819
+ inputMode: o.extra === "phoneNumber" ? "tel" : "text",
5820
+ required: true,
5821
+ invalid: extraInvalid,
5822
+ "aria-invalid": extraInvalid,
5823
+ placeholder: o.extra === "phoneNumber" ? "e.g. 081234567890" : "$cashtag",
5824
+ 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 : "",
5825
+ onChange: (e) => onExtraChange(
5826
+ o.value,
5827
+ o.extra === "phoneNumber" ? { phoneNumber: e.target.value } : { cashtag: e.target.value }
5828
+ )
5829
+ }
5830
+ )
5831
+ ))
5832
+ );
5833
+ })
5834
+ );
5835
+ };
5556
5836
 
5557
5837
  // src/ui/Stepper.tsx
5558
5838
  import React11 from "react";
5559
- var Stepper = ({ value, onChange, min = 0, max = Infinity, step = 1, disabled, className }) => /* @__PURE__ */ React11.createElement("div", { className: cx("tf-checkout-stepper", className) }, /* @__PURE__ */ React11.createElement(
5560
- "button",
5561
- {
5562
- type: "button",
5563
- className: "tf-checkout-stepper__btn",
5564
- "aria-label": "Decrease",
5565
- disabled: disabled || value <= min,
5566
- onClick: () => onChange(Math.max(min, value - step))
5567
- },
5568
- "\u2212"
5569
- ), /* @__PURE__ */ React11.createElement("span", { className: "tf-checkout-stepper__value" }, value), /* @__PURE__ */ React11.createElement(
5570
- "button",
5571
- {
5572
- type: "button",
5573
- className: "tf-checkout-stepper__btn",
5574
- "aria-label": "Increase",
5575
- disabled: disabled || value >= max,
5576
- onClick: () => onChange(Math.min(max, value + step))
5577
- },
5578
- "+"
5579
- ));
5839
+ var Stepper = ({ value, onChange, min = 0, max = Infinity, step = 1, disabled, className }) => {
5840
+ const t = useT();
5841
+ return /* @__PURE__ */ React11.createElement("div", { className: cx("tf-checkout-stepper", className) }, /* @__PURE__ */ React11.createElement(
5842
+ "button",
5843
+ {
5844
+ type: "button",
5845
+ className: "tf-checkout-stepper__btn",
5846
+ "aria-label": t("common.decrease"),
5847
+ disabled: disabled || value <= min,
5848
+ onClick: () => onChange(Math.max(min, value - step))
5849
+ },
5850
+ "\u2212"
5851
+ ), /* @__PURE__ */ React11.createElement("span", { className: "tf-checkout-stepper__value" }, value), /* @__PURE__ */ React11.createElement(
5852
+ "button",
5853
+ {
5854
+ type: "button",
5855
+ className: "tf-checkout-stepper__btn",
5856
+ "aria-label": t("common.increase"),
5857
+ disabled: disabled || value >= max,
5858
+ onClick: () => onChange(Math.min(max, value + step))
5859
+ },
5860
+ "+"
5861
+ ));
5862
+ };
5580
5863
 
5581
5864
  // src/ui/QuantitySelect.tsx
5582
5865
  import React12 from "react";
@@ -5641,9 +5924,10 @@ var clock2 = (s) => {
5641
5924
  var TimerBanner = ({
5642
5925
  seconds,
5643
5926
  urgentAt = 60,
5644
- message = "Please complete your purchase before the timer reaches zero.",
5927
+ message,
5645
5928
  className
5646
5929
  }) => {
5930
+ const t = useT();
5647
5931
  const [dismissed, setDismissed] = useState6(false);
5648
5932
  if (seconds === void 0 || seconds <= 0 || dismissed) return null;
5649
5933
  const urgent = seconds <= urgentAt;
@@ -5657,14 +5941,14 @@ var TimerBanner = ({
5657
5941
  className
5658
5942
  )
5659
5943
  },
5660
- /* @__PURE__ */ React15.createElement("span", { className: "tf-checkout-timerbanner__msg" }, message),
5944
+ /* @__PURE__ */ React15.createElement("span", { className: "tf-checkout-timerbanner__msg" }, message != null ? message : t("timer.completePurchase")),
5661
5945
  /* @__PURE__ */ React15.createElement("span", { className: "tf-checkout-timerbanner__clock" }, clock2(seconds)),
5662
5946
  /* @__PURE__ */ React15.createElement(
5663
5947
  "button",
5664
5948
  {
5665
5949
  type: "button",
5666
5950
  className: "tf-checkout-timerbanner__close",
5667
- "aria-label": "Dismiss",
5951
+ "aria-label": t("common.dismiss"),
5668
5952
  onClick: () => setDismissed(true)
5669
5953
  },
5670
5954
  "\xD7"
@@ -5697,9 +5981,9 @@ var ForgotPasswordForm = ({
5697
5981
  void onSubmit(email);
5698
5982
  };
5699
5983
  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"));
5984
+ 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
5985
  }
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(
5986
+ 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
5987
  Input,
5704
5988
  {
5705
5989
  type: "email",
@@ -5714,14 +5998,14 @@ var ForgotPasswordForm = ({
5714
5998
  onFieldChange == null ? void 0 : onFieldChange();
5715
5999
  }
5716
6000
  }
5717
- )), /* @__PURE__ */ React16.createElement(Button, { type: "submit", block: true, loading }, "Send reset instructions"), /* @__PURE__ */ React16.createElement(
6001
+ )), /* @__PURE__ */ React16.createElement(Button, { type: "submit", block: true, loading }, t("auth.sendResetInstructions")), /* @__PURE__ */ React16.createElement(
5718
6002
  "button",
5719
6003
  {
5720
6004
  type: "button",
5721
6005
  className: "tf-checkout-auth__text-button tf-checkout-auth__back",
5722
6006
  onClick: () => onBackToLogin(email)
5723
6007
  },
5724
- "Back to log in"
6008
+ t("auth.backToLogin")
5725
6009
  ));
5726
6010
  };
5727
6011
 
@@ -5823,14 +6107,14 @@ var LoginForm = ({
5823
6107
  }
5824
6108
  }
5825
6109
  )
5826
- ), /* @__PURE__ */ React18.createElement(Button, { type: "submit", block: true, loading }, "Login"), allowPasswordReset && onForgotPassword && /* @__PURE__ */ React18.createElement(
6110
+ ), /* @__PURE__ */ React18.createElement(Button, { type: "submit", block: true, loading }, t("auth.logIn")), allowPasswordReset && onForgotPassword && /* @__PURE__ */ React18.createElement(
5827
6111
  "button",
5828
6112
  {
5829
6113
  type: "button",
5830
6114
  className: "tf-checkout-auth__text-button tf-checkout-auth__forgot",
5831
6115
  onClick: () => onForgotPassword(email)
5832
6116
  },
5833
- "Forgot password?"
6117
+ t("auth.forgotPassword")
5834
6118
  ));
5835
6119
  };
5836
6120
 
@@ -6057,7 +6341,7 @@ var RegisterForm = ({
6057
6341
  invalid: Boolean(errors.stateId),
6058
6342
  onChange: (event) => setField("stateId", event.target.value)
6059
6343
  },
6060
- /* @__PURE__ */ React19.createElement("option", { value: "" }, states.length > 0 ? "Select state / region" : "Not required"),
6344
+ /* @__PURE__ */ React19.createElement("option", { value: "" }, states.length > 0 ? t("auth.selectState") : t("auth.notRequired")),
6061
6345
  states.map((state) => /* @__PURE__ */ React19.createElement("option", { key: state.id, value: state.id }, state.name))
6062
6346
  )
6063
6347
  ), /* @__PURE__ */ React19.createElement(
@@ -6151,7 +6435,7 @@ var RegisterForm = ({
6151
6435
  }
6152
6436
  )
6153
6437
  )),
6154
- /* @__PURE__ */ React19.createElement(Button, { type: "submit", block: true, loading }, "Create Account")
6438
+ /* @__PURE__ */ React19.createElement(Button, { type: "submit", block: true, loading }, t("auth.createAccount"))
6155
6439
  );
6156
6440
  };
6157
6441
 
@@ -6243,7 +6527,7 @@ var AuthModal = ({
6243
6527
  if (event.target === event.currentTarget && !auth.isSubmitting) onClose();
6244
6528
  };
6245
6529
  const isPasswordReset = auth.view === "forgot-password";
6246
- const title = isPasswordReset ? "Password reset" : "Ticket Fairy account";
6530
+ const title = isPasswordReset ? t("auth.passwordReset") : t("auth.title");
6247
6531
  return /* @__PURE__ */ React20.createElement("div", { className: cx("tf-checkout-auth", className), onMouseDown: closeFromBackdrop }, /* @__PURE__ */ React20.createElement(
6248
6532
  "div",
6249
6533
  {
@@ -6285,7 +6569,7 @@ var AuthModal = ({
6285
6569
  ),
6286
6570
  onClick: () => auth.showLogin(auth.suggestedEmail)
6287
6571
  },
6288
- "Login"
6572
+ t("auth.logIn")
6289
6573
  ),
6290
6574
  /* @__PURE__ */ React20.createElement(
6291
6575
  "button",
@@ -6299,7 +6583,7 @@ var AuthModal = ({
6299
6583
  ),
6300
6584
  onClick: () => auth.showRegister(auth.suggestedEmail)
6301
6585
  },
6302
- "Sign Up"
6586
+ t("auth.signUp")
6303
6587
  )
6304
6588
  ),
6305
6589
  logoUrl && /* @__PURE__ */ React20.createElement("div", { className: "tf-checkout-auth__logo-wrap" }, /* @__PURE__ */ React20.createElement(
@@ -6368,9 +6652,9 @@ var ResetPasswordForm = ({
6368
6652
  const validation = useMemo3(() => {
6369
6653
  if (!submitted) return {};
6370
6654
  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." : ""
6655
+ token: token ? "" : t("auth.missingToken"),
6656
+ password: password.length < 8 ? t("auth.passwordTooShort") : !/[@$!%*#?&]/.test(password) ? t("auth.passwordNeedsSpecial") : "",
6657
+ confirmation: password !== confirmation ? t("auth.passwordsMustMatch") : ""
6374
6658
  };
6375
6659
  }, [confirmation, password, submitted, token]);
6376
6660
  const reset = hooks_exports.useResetPassword({
@@ -6387,7 +6671,7 @@ var ResetPasswordForm = ({
6387
6671
  reset.mutate({ token, password, passwordConfirmation: confirmation });
6388
6672
  };
6389
6673
  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"));
6674
+ 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
6675
  }
6392
6676
  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
6677
  Input,
@@ -6411,7 +6695,7 @@ var ResetPasswordForm = ({
6411
6695
  invalid: Boolean(validation.confirmation),
6412
6696
  onChange: (event) => setConfirmation(event.target.value)
6413
6697
  }
6414
- )), /* @__PURE__ */ React21.createElement(Button, { type: "submit", block: true, loading: reset.isPending, disabled: !token }, "Submit"));
6698
+ )), /* @__PURE__ */ React21.createElement(Button, { type: "submit", block: true, loading: reset.isPending, disabled: !token }, t("common.submit")));
6415
6699
  };
6416
6700
 
6417
6701
  // src/sections/Tickets.tsx
@@ -6422,30 +6706,31 @@ import React22, {
6422
6706
  useState as useState12
6423
6707
  } from "react";
6424
6708
  var WaitingListForm = ({ ticket, onJoin }) => {
6709
+ const tr = useT();
6425
6710
  const [form, setForm] = useState12({ firstName: "", lastName: "", email: "" });
6426
6711
  const [state, setState] = useState12("idle");
6427
6712
  const [error, setError] = useState12("");
6428
6713
  const ok = form.firstName.trim() && form.lastName.trim() && form.email.trim();
6429
6714
  if (state === "done")
6430
- return /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-note tf-checkout-tickets__wl-done" }, "You\u2019re on the waiting list \u2014 we\u2019ll email you if a spot opens.");
6715
+ return /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-note tf-checkout-tickets__wl-done" }, tr("tickets.waitingListJoined"));
6431
6716
  return /* @__PURE__ */ React22.createElement("div", { className: "tf-checkout-tickets__wl" }, /* @__PURE__ */ React22.createElement(FieldRow, null, /* @__PURE__ */ React22.createElement(Field, null, /* @__PURE__ */ React22.createElement(
6432
6717
  Input,
6433
6718
  {
6434
- placeholder: "First name",
6719
+ placeholder: tr("tickets.firstName"),
6435
6720
  value: form.firstName,
6436
6721
  onChange: (e) => setForm((f) => ({ ...f, firstName: e.target.value }))
6437
6722
  }
6438
6723
  )), /* @__PURE__ */ React22.createElement(Field, null, /* @__PURE__ */ React22.createElement(
6439
6724
  Input,
6440
6725
  {
6441
- placeholder: "Last name",
6726
+ placeholder: tr("tickets.lastName"),
6442
6727
  value: form.lastName,
6443
6728
  onChange: (e) => setForm((f) => ({ ...f, lastName: e.target.value }))
6444
6729
  }
6445
6730
  ))), /* @__PURE__ */ React22.createElement(Field, null, /* @__PURE__ */ React22.createElement(
6446
6731
  Input,
6447
6732
  {
6448
- placeholder: "Email",
6733
+ placeholder: tr("tickets.email"),
6449
6734
  value: form.email,
6450
6735
  onChange: (e) => setForm((f) => ({ ...f, email: e.target.value }))
6451
6736
  }
@@ -6464,14 +6749,14 @@ var WaitingListForm = ({ ticket, onJoin }) => {
6464
6749
  disabled: !ok || state === "busy",
6465
6750
  variant: "secondary"
6466
6751
  },
6467
- "Join the waiting list"
6752
+ tr("tickets.joinWaitingList")
6468
6753
  ), error && /* @__PURE__ */ React22.createElement("p", { className: "tf-checkout-error-text" }, error));
6469
6754
  };
6470
6755
  var Tickets = ({
6471
6756
  eventId,
6472
6757
  title = false,
6473
6758
  onContinue,
6474
- buttonLabel = "Get tickets",
6759
+ buttonLabel,
6475
6760
  timeSlotDates,
6476
6761
  step,
6477
6762
  onSelectSeats,
@@ -6481,7 +6766,9 @@ var Tickets = ({
6481
6766
  className
6482
6767
  }) => {
6483
6768
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
6769
+ const tr = useT();
6484
6770
  const checkout = useCheckoutContext();
6771
+ const buttonText = buttonLabel != null ? buttonLabel : tr("tickets.getTickets");
6485
6772
  const ticketsQuery = hooks_exports.useTicketsWithMeta(eventId);
6486
6773
  const promoMeta = (_a = ticketsQuery.data) == null ? void 0 : _a.promo;
6487
6774
  const showWaitingList = (_c = (_b = ticketsQuery.data) == null ? void 0 : _b.showWaitingList) != null ? _c : false;
@@ -6567,7 +6854,7 @@ var Tickets = ({
6567
6854
  const seatMapRow = (t) => isSeated && !t.allowDirectPurchase;
6568
6855
  const hasSeatMapTickets = tickets.some(seatMapRow);
6569
6856
  const directPurchasable = tickets.filter((t) => !seatMapRow(t));
6570
- const seatCtaLabel = (eventInfo == null ? void 0 : eventInfo.tableMapEnabled) ? "Select on map" : "Select seats";
6857
+ const seatCtaLabel = (eventInfo == null ? void 0 : eventInfo.tableMapEnabled) ? tr("tickets.selectOnMap") : tr("tickets.selectSeats");
6571
6858
  const firstTableIndex = tickets.findIndex((t) => t.isTable);
6572
6859
  const firstTableId = firstTableIndex > 0 && tickets.slice(0, firstTableIndex).some((t) => !t.isTable) ? tickets[firstTableIndex].id : void 0;
6573
6860
  const prime = () => {
@@ -6600,7 +6887,7 @@ var Tickets = ({
6600
6887
  const ticketIndex = tickets.findIndex((candidate) => candidate.id === t.id);
6601
6888
  const previousTicket = ticketIndex > 0 ? tickets[ticketIndex - 1] : void 0;
6602
6889
  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(
6890
+ 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
6891
  "button",
6605
6892
  {
6606
6893
  type: "button",
@@ -6609,8 +6896,8 @@ var Tickets = ({
6609
6896
  "aria-controls": `ticket-description-${t.id}`,
6610
6897
  onClick: () => setVisibleDescription((current2) => current2 === t.id ? null : t.id)
6611
6898
  },
6612
- visibleDescription === t.id ? "Hide info" : "View info"
6613
- )), /* @__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(
6899
+ visibleDescription === t.id ? tr("tickets.hideInfo") : tr("tickets.viewInfo")
6900
+ )), t.badgeText && !unavailable && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__badge" }, t.badgeText), /* @__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
6901
  "span",
6615
6902
  {
6616
6903
  className: cx(
@@ -6618,8 +6905,8 @@ var Tickets = ({
6618
6905
  isFree && "tf-checkout-tickets__amount--free"
6619
6906
  )
6620
6907
  },
6621
- 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(
6908
+ isFree ? tr("tickets.free") : money(sym, t.price)
6909
+ ), !isFree && !t.soldOut && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__fees" }, tr("tickets.withFees", { price: money(sym, t.priceWithFees) })), t.depositPercent != null && /* @__PURE__ */ React22.createElement("span", { className: "tf-checkout-tickets__deposit" }, tr("tickets.deposit", { percent: t.depositPercent.toFixed(2) })))), 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
6910
  QuantitySelect,
6624
6911
  {
6625
6912
  value: (_a2 = qty[t.id]) != null ? _a2 : 0,
@@ -6648,7 +6935,7 @@ var Tickets = ({
6648
6935
  className: "tf-checkout-tickets__wl-toggle",
6649
6936
  onClick: () => setWlOpen((w) => ({ ...w, [t.id]: true }))
6650
6937
  },
6651
- "Join the waiting list"
6938
+ tr("tickets.joinWaitingList")
6652
6939
  ))));
6653
6940
  };
6654
6941
  const timeGroups = [];
@@ -6666,7 +6953,7 @@ var Tickets = ({
6666
6953
  title: title || "",
6667
6954
  pills: listQuery.isFetching && !listQuery.isLoading ? /* @__PURE__ */ React22.createElement(Loader, null) : void 0
6668
6955
  }
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(
6956
+ ), 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
6957
  "select",
6671
6958
  {
6672
6959
  className: "tf-checkout-select",
@@ -6677,7 +6964,7 @@ var Tickets = ({
6677
6964
  }
6678
6965
  },
6679
6966
  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(
6967
+ )), 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
6968
  "select",
6682
6969
  {
6683
6970
  className: "tf-checkout-select",
@@ -6685,18 +6972,18 @@ var Tickets = ({
6685
6972
  onChange: (e) => changeCurrency(e.target.value)
6686
6973
  },
6687
6974
  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(
6975
+ )), 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
6976
  "button",
6690
6977
  {
6691
6978
  type: "button",
6692
6979
  className: "tf-checkout-tickets__promo-toggle",
6693
6980
  onClick: () => setPromoOpen(true)
6694
6981
  },
6695
- "Got a promo code? Click here"
6982
+ tr("tickets.gotPromoCode")
6696
6983
  ) : /* @__PURE__ */ React22.createElement(React22.Fragment, null, /* @__PURE__ */ React22.createElement(FieldRow, null, /* @__PURE__ */ React22.createElement(Field, null, /* @__PURE__ */ React22.createElement(
6697
6984
  Input,
6698
6985
  {
6699
- placeholder: isAccess ? "Access code" : "Promo code",
6986
+ placeholder: isAccess ? tr("tickets.accessCode") : tr("tickets.promoCode"),
6700
6987
  value: code,
6701
6988
  onChange: (e) => setCode(e.target.value),
6702
6989
  onKeyDown: (e) => e.key === "Enter" && applyCode()
@@ -6727,7 +7014,7 @@ var Tickets = ({
6727
7014
  loading: checkout.isBusy,
6728
7015
  disabled: checkout.isBusy || selected.length === 0
6729
7016
  },
6730
- checkout.isBusy ? "Reserving\u2026" : selectionIsTable ? "Reserve tables" : buttonLabel
7017
+ checkout.isBusy ? tr("tickets.reserving") : selectionIsTable ? tr("tickets.reserveTables") : buttonText
6731
7018
  ), 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
7019
  };
6733
7020
 
@@ -7093,13 +7380,17 @@ var AddOns = ({
7093
7380
  eventId,
7094
7381
  onContinue,
7095
7382
  onSkip,
7096
- buttonLabel = "CONFIRM SELECTION",
7097
- eyebrow = "Get Your Tickets",
7098
- heading = "UPGRADES & ADD-ONS",
7383
+ buttonLabel,
7384
+ eyebrow,
7385
+ heading,
7099
7386
  className
7100
7387
  }) => {
7101
7388
  var _a, _b, _c, _d, _e, _f, _g, _h;
7389
+ const t = useT();
7102
7390
  const checkout = useCheckoutContext();
7391
+ const buttonText = buttonLabel != null ? buttonLabel : t("addons.confirmSelection");
7392
+ const eyebrowText = eyebrow != null ? eyebrow : t("addons.eyebrow");
7393
+ const headingText = heading != null ? heading : t("addons.heading");
7103
7394
  const combined = !onContinue;
7104
7395
  const addonsQuery = hooks_exports.useEventAddons(eventId);
7105
7396
  const all = (_a = addonsQuery.data) != null ? _a : [];
@@ -7129,14 +7420,14 @@ var AddOns = ({
7129
7420
  return ((_a3 = selection[id]) != null ? _a3 : 0) > 0;
7130
7421
  })
7131
7422
  );
7132
- const t = setTimeout(() => {
7423
+ const t2 = setTimeout(() => {
7133
7424
  checkout.setAddonDataCapture(captureForSelected);
7134
7425
  checkout.setAddons(selection).catch((e) => setError(errorMessage(e)));
7135
7426
  }, 500);
7136
- return () => clearTimeout(t);
7427
+ return () => clearTimeout(t2);
7137
7428
  }, [combined, qty, capture]);
7138
7429
  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"));
7430
+ 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
7431
  if (addonsQuery.isLoading) {
7141
7432
  return /* @__PURE__ */ React24.createElement(Card, { className }, head, /* @__PURE__ */ React24.createElement("div", { className: "tf-checkout-section-loader" }, /* @__PURE__ */ React24.createElement(Loader, null)));
7142
7433
  }
@@ -7183,7 +7474,7 @@ var AddOns = ({
7183
7474
  className: "tf-checkout-addons__desc",
7184
7475
  dangerouslySetInnerHTML: { __html: a.description }
7185
7476
  }
7186
- )), soldOut(a) ? /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-tickets__soldout" }, "Sold out") : /* @__PURE__ */ React24.createElement(
7477
+ )), soldOut(a) ? /* @__PURE__ */ React24.createElement("span", { className: "tf-checkout-tickets__soldout" }, t("tickets.soldOut")) : /* @__PURE__ */ React24.createElement(
7187
7478
  QuantitySelect,
7188
7479
  {
7189
7480
  value: n,
@@ -7214,7 +7505,7 @@ var AddOns = ({
7214
7505
  loading: checkout.isBusy,
7215
7506
  disabled: checkout.isBusy || selectedCount === 0
7216
7507
  },
7217
- checkout.isBusy ? "Updating\u2026" : buttonLabel
7508
+ checkout.isBusy ? t("addons.updating") : buttonText
7218
7509
  ), 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
7510
  };
7220
7511
 
@@ -7238,17 +7529,18 @@ var BillingAddressFields = ({
7238
7529
  setBilling
7239
7530
  }) => {
7240
7531
  var _a, _b, _c, _d, _e;
7532
+ const t = useT();
7241
7533
  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(
7534
+ return /* @__PURE__ */ React25.createElement(React25.Fragment, null, /* @__PURE__ */ React25.createElement("div", { className: "tf-checkout-billing__section-label" }, t("billing.address")), /* @__PURE__ */ React25.createElement(
7243
7535
  Field,
7244
7536
  {
7245
- error: fieldError("Street address", "Street address is required."),
7537
+ error: fieldError("Street address", t("billing.streetRequired")),
7246
7538
  invalid: Boolean(fieldError("Street address"))
7247
7539
  },
7248
7540
  /* @__PURE__ */ React25.createElement(
7249
7541
  Input,
7250
7542
  {
7251
- placeholder: "Street address *",
7543
+ placeholder: t("billing.streetPlaceholder"),
7252
7544
  autoComplete: "street-address",
7253
7545
  value: (_a = billing.streetAddress) != null ? _a : "",
7254
7546
  required: true,
@@ -7260,13 +7552,13 @@ var BillingAddressFields = ({
7260
7552
  ), /* @__PURE__ */ React25.createElement(FieldRow, null, /* @__PURE__ */ React25.createElement(
7261
7553
  Field,
7262
7554
  {
7263
- error: fieldError("City", "City is required."),
7555
+ error: fieldError("City", t("billing.cityRequired")),
7264
7556
  invalid: Boolean(fieldError("City"))
7265
7557
  },
7266
7558
  /* @__PURE__ */ React25.createElement(
7267
7559
  Input,
7268
7560
  {
7269
- placeholder: "City *",
7561
+ placeholder: t("billing.cityPlaceholder"),
7270
7562
  autoComplete: "address-level2",
7271
7563
  value: (_b = billing.city) != null ? _b : "",
7272
7564
  required: true,
@@ -7278,13 +7570,13 @@ var BillingAddressFields = ({
7278
7570
  ), /* @__PURE__ */ React25.createElement(
7279
7571
  Field,
7280
7572
  {
7281
- error: fieldError("ZIP / postcode", "ZIP / postcode is required."),
7573
+ error: fieldError("ZIP / postcode", t("billing.postcodeRequired")),
7282
7574
  invalid: Boolean(fieldError("ZIP / postcode"))
7283
7575
  },
7284
7576
  /* @__PURE__ */ React25.createElement(
7285
7577
  Input,
7286
7578
  {
7287
- placeholder: "ZIP / Postcode *",
7579
+ placeholder: t("billing.postcodePlaceholder"),
7288
7580
  autoComplete: "postal-code",
7289
7581
  value: (_c = billing.zip) != null ? _c : "",
7290
7582
  required: true,
@@ -7296,14 +7588,14 @@ var BillingAddressFields = ({
7296
7588
  )), /* @__PURE__ */ React25.createElement(FieldRow, null, /* @__PURE__ */ React25.createElement(
7297
7589
  Field,
7298
7590
  {
7299
- error: fieldError("Country", "Country is required."),
7591
+ error: fieldError("Country", t("billing.countryRequired")),
7300
7592
  invalid: Boolean(fieldError("Country"))
7301
7593
  },
7302
7594
  /* @__PURE__ */ React25.createElement(
7303
7595
  Select,
7304
7596
  {
7305
7597
  value: (_d = billing.countryId) != null ? _d : "",
7306
- "aria-label": "Country",
7598
+ "aria-label": t("billing.countryLabel"),
7307
7599
  required: true,
7308
7600
  invalid: Boolean(fieldError("Country")),
7309
7601
  "aria-invalid": Boolean(fieldError("Country")),
@@ -7323,13 +7615,13 @@ var BillingAddressFields = ({
7323
7615
  });
7324
7616
  }
7325
7617
  },
7326
- /* @__PURE__ */ React25.createElement("option", { value: "" }, "\u2014 country * \u2014"),
7618
+ /* @__PURE__ */ React25.createElement("option", { value: "" }, t("billing.countryEmpty")),
7327
7619
  countries.map((country) => /* @__PURE__ */ React25.createElement("option", { key: country.id, value: country.id }, country.name))
7328
7620
  )
7329
7621
  ), /* @__PURE__ */ React25.createElement(
7330
7622
  Field,
7331
7623
  {
7332
- error: fieldError("State / county", "State / county is required."),
7624
+ error: fieldError("State / county", t("billing.stateRequired")),
7333
7625
  invalid: Boolean(fieldError("State / county"))
7334
7626
  },
7335
7627
  /* @__PURE__ */ React25.createElement(
@@ -7337,7 +7629,7 @@ var BillingAddressFields = ({
7337
7629
  {
7338
7630
  value: (_e = billing.stateId) != null ? _e : "",
7339
7631
  disabled: !billing.countryId || states.length === 0,
7340
- "aria-label": "State / region",
7632
+ "aria-label": t("billing.stateLabel"),
7341
7633
  required: states.length > 0,
7342
7634
  invalid: Boolean(fieldError("State / county")),
7343
7635
  "aria-invalid": Boolean(fieldError("State / county")),
@@ -7352,7 +7644,7 @@ var BillingAddressFields = ({
7352
7644
  }));
7353
7645
  }
7354
7646
  },
7355
- /* @__PURE__ */ React25.createElement("option", { value: "" }, "\u2014 state / county", states.length > 0 ? " *" : "", " \u2014"),
7647
+ /* @__PURE__ */ React25.createElement("option", { value: "" }, states.length > 0 ? t("billing.stateEmptyRequired") : t("billing.stateEmpty")),
7356
7648
  states.map((state) => /* @__PURE__ */ React25.createElement("option", { key: state.id, value: state.id }, state.name))
7357
7649
  )
7358
7650
  )));
@@ -7432,114 +7724,121 @@ var TicketHoldersCard = ({
7432
7724
  fieldError,
7433
7725
  renderCustomFields,
7434
7726
  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,
7727
+ }) => {
7728
+ const t = useT();
7729
+ return /* @__PURE__ */ React27.createElement(Card, { className: "tf-checkout-billing__holders-card" }, /* @__PURE__ */ React27.createElement(SectionHeader, { title: t("billing.ticketHolders") }), holders.map((holder, index) => {
7730
+ const firstNameKey = `Ticket ${index + 1} holder first name`;
7731
+ const lastNameKey = `Ticket ${index + 1} holder last name`;
7732
+ const emailKey = `Ticket ${index + 1} holder email`;
7733
+ const phoneKey = `Ticket ${index + 1} holder phone`;
7734
+ 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(
7735
+ Field,
7449
7736
  {
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,
7737
+ label: t("billing.holderFirstName"),
7738
+ error: fieldError(firstNameKey, t("billing.firstNameRequired")),
7739
+ invalid: Boolean(fieldError(firstNameKey))
7740
+ },
7741
+ /* @__PURE__ */ React27.createElement(
7742
+ Input,
7743
+ {
7744
+ value: holder.firstName,
7745
+ required: true,
7746
+ invalid: Boolean(fieldError(firstNameKey)),
7747
+ "aria-invalid": Boolean(fieldError(firstNameKey)),
7748
+ onChange: (event) => patchHolder(index, { firstName: event.target.value })
7749
+ }
7750
+ )
7751
+ ), /* @__PURE__ */ React27.createElement(
7752
+ Field,
7466
7753
  {
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,
7754
+ label: t("billing.holderLastName"),
7755
+ error: fieldError(lastNameKey, t("billing.lastNameRequired")),
7756
+ invalid: Boolean(fieldError(lastNameKey))
7757
+ },
7758
+ /* @__PURE__ */ React27.createElement(
7759
+ Input,
7760
+ {
7761
+ value: holder.lastName,
7762
+ required: true,
7763
+ invalid: Boolean(fieldError(lastNameKey)),
7764
+ "aria-invalid": Boolean(fieldError(lastNameKey)),
7765
+ onChange: (event) => patchHolder(index, { lastName: event.target.value })
7766
+ }
7767
+ )
7768
+ )), collectHolderContact && /* @__PURE__ */ React27.createElement(FieldRow, null, /* @__PURE__ */ React27.createElement(
7769
+ Field,
7483
7770
  {
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,
7771
+ label: t("billing.email"),
7772
+ error: fieldError(emailKey, t("billing.emailInvalid")),
7773
+ invalid: Boolean(fieldError(emailKey))
7774
+ },
7775
+ /* @__PURE__ */ React27.createElement(
7776
+ Input,
7777
+ {
7778
+ type: "email",
7779
+ autoComplete: "email",
7780
+ value: holder.email,
7781
+ required: true,
7782
+ invalid: Boolean(fieldError(emailKey)),
7783
+ "aria-invalid": Boolean(fieldError(emailKey)),
7784
+ onChange: (event) => patchHolder(index, { email: event.target.value })
7785
+ }
7786
+ )
7787
+ ), /* @__PURE__ */ React27.createElement(
7788
+ Field,
7502
7789
  {
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
- }));
7790
+ label: t("billing.phone"),
7791
+ error: fieldError(phoneKey, t("billing.phoneInvalid")),
7792
+ invalid: Boolean(fieldError(phoneKey))
7793
+ },
7794
+ /* @__PURE__ */ React27.createElement(
7795
+ PhoneInput2,
7796
+ {
7797
+ className: "tf-checkout-phone",
7798
+ inputClassName: `tf-checkout-input tf-checkout-phone__input${fieldError(phoneKey) ? " tf-checkout-input--invalid" : ""}`,
7799
+ defaultCountry: phoneCountry,
7800
+ disableDialCodeAndPrefix: true,
7801
+ showDisabledDialCodeAndPrefix: true,
7802
+ disableDialCodePrefill: true,
7803
+ value: holder.phone,
7804
+ required: true,
7805
+ inputProps: {
7806
+ autoComplete: "tel",
7807
+ "aria-label": phoneKey,
7808
+ "aria-invalid": Boolean(fieldError(phoneKey))
7809
+ },
7810
+ onChange: (phone) => patchHolder(index, { phone })
7811
+ }
7812
+ )
7813
+ )), renderCustomFields(holder, index));
7814
+ }));
7815
+ };
7521
7816
 
7522
7817
  // src/sections/BillingInfo.tsx
7523
7818
  var BillingInfo = ({
7524
7819
  eventId,
7525
7820
  onContinue,
7526
- heading = "Billing Information",
7527
- buttonLabel = "Continue to payment",
7821
+ heading,
7822
+ buttonLabel,
7528
7823
  onLogin,
7529
7824
  skipWhenProfileComplete = false,
7530
7825
  requireEmailConfirmation = false,
7531
7826
  collectTicketHolders = false,
7532
7827
  collectHolderContact = false,
7533
- ttfOptInLabel = "Keep me updated about future events from The Ticket Fairy",
7828
+ ttfOptInLabel,
7534
7829
  brandOptInLabel,
7535
7830
  privacyPolicy,
7536
7831
  showPrivacyError = false,
7537
7832
  step,
7538
7833
  className
7539
7834
  }) => {
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;
7835
+ 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;
7836
+ const t = useT();
7541
7837
  const checkout = useCheckoutContext();
7542
7838
  const validation = useCheckoutValidation();
7839
+ const headingText = heading != null ? heading : t("billing.heading");
7840
+ const buttonText = buttonLabel != null ? buttonLabel : t("billing.continueToPayment");
7841
+ const ttfOptInText = ttfOptInLabel != null ? ttfOptInLabel : t("billing.ttfOptIn");
7543
7842
  const profile = hooks_exports.useProfile({ retry: false });
7544
7843
  const event = hooks_exports.useEvent(eventId);
7545
7844
  const combined = !onContinue;
@@ -7680,11 +7979,11 @@ var BillingInfo = ({
7680
7979
  useEffect11(() => {
7681
7980
  const email = billing.email.trim();
7682
7981
  if (checkout.isLoggedIn || !isEmail(email)) return;
7683
- const t = setTimeout(
7982
+ const t2 = setTimeout(
7684
7983
  () => checkout.checkBuyerEmail(email).catch(() => void 0),
7685
7984
  600
7686
7985
  );
7687
- return () => clearTimeout(t);
7986
+ return () => clearTimeout(t2);
7688
7987
  }, [billing.email, checkout.isLoggedIn]);
7689
7988
  const emailTaken = !checkout.isLoggedIn && checkout.existingAccountEmail === billing.email.trim();
7690
7989
  const needsNationality = checkout.buyerFields.some((f) => f.kind === "nationality");
@@ -7808,7 +8107,7 @@ var BillingInfo = ({
7808
8107
  const complete = missingDetails.length === 0;
7809
8108
  const showValidation = validation.attempt > 0;
7810
8109
  const missingSet = new Set(missingDetails);
7811
- const fieldError = (key, message = "This field is required.") => showValidation && missingSet.has(key) ? message : void 0;
8110
+ const fieldError = (key, message = t("billing.fieldRequired")) => showValidation && missingSet.has(key) ? message : void 0;
7812
8111
  const dobError = showValidation ? missingDetails.find(
7813
8112
  (detail) => detail === "Date of birth" || detail.startsWith("Age ")
7814
8113
  ) : void 0;
@@ -7816,7 +8115,7 @@ var BillingInfo = ({
7816
8115
  const commit = () => {
7817
8116
  checkout.setBilling(committedBilling);
7818
8117
  checkout.setHolders(committedHolders);
7819
- if (ttfOptInLabel || brandOptInLabel) checkout.setConsent(consent);
8118
+ if (ttfOptInText || brandOptInLabel) checkout.setConsent(consent);
7820
8119
  };
7821
8120
  useEffect11(() => {
7822
8121
  if (combined) commit();
@@ -7838,7 +8137,7 @@ var BillingInfo = ({
7838
8137
  const hasEventSpecificDetails = checkout.buyerFields.length > 0 || checkout.customFields.some((group) => group.fields.length > 0) || showHolders || gates.showDob;
7839
8138
  const skipBilling = skipWhenProfileComplete && checkout.isLoggedIn && profile.isSuccess && complete && !hasEventSpecificDetails;
7840
8139
  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(
8140
+ 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
8141
  "button",
7843
8142
  {
7844
8143
  type: "button",
@@ -7855,7 +8154,7 @@ var BillingInfo = ({
7855
8154
  /* @__PURE__ */ React28.createElement(
7856
8155
  Input,
7857
8156
  {
7858
- placeholder: "First name *",
8157
+ placeholder: t("billing.firstNamePlaceholder"),
7859
8158
  value: billing.firstName,
7860
8159
  required: true,
7861
8160
  invalid: Boolean(fieldError("First name")),
@@ -7872,7 +8171,7 @@ var BillingInfo = ({
7872
8171
  /* @__PURE__ */ React28.createElement(
7873
8172
  Input,
7874
8173
  {
7875
- placeholder: "Last name *",
8174
+ placeholder: t("billing.lastNamePlaceholder"),
7876
8175
  value: billing.lastName,
7877
8176
  required: true,
7878
8177
  invalid: Boolean(fieldError("Last name")),
@@ -7891,7 +8190,7 @@ var BillingInfo = ({
7891
8190
  {
7892
8191
  type: "email",
7893
8192
  autoComplete: "email",
7894
- placeholder: "Email *",
8193
+ placeholder: t("billing.emailPlaceholder"),
7895
8194
  value: billing.email,
7896
8195
  required: true,
7897
8196
  invalid: Boolean(fieldError("Valid email address")),
@@ -7904,7 +8203,7 @@ var BillingInfo = ({
7904
8203
  {
7905
8204
  error: fieldError(
7906
8205
  "Matching email confirmation",
7907
- "Email addresses must match."
8206
+ t("billing.emailMustMatch")
7908
8207
  ),
7909
8208
  invalid: Boolean(fieldError("Matching email confirmation"))
7910
8209
  },
@@ -7913,7 +8212,7 @@ var BillingInfo = ({
7913
8212
  {
7914
8213
  type: "email",
7915
8214
  autoComplete: "email",
7916
- placeholder: "Confirm email *",
8215
+ placeholder: t("billing.confirmEmailPlaceholder"),
7917
8216
  value: (_C = billing.confirmEmail) != null ? _C : "",
7918
8217
  required: true,
7919
8218
  invalid: Boolean(fieldError("Matching email confirmation")),
@@ -7921,15 +8220,15 @@ var BillingInfo = ({
7921
8220
  onChange: setB("confirmEmail")
7922
8221
  }
7923
8222
  )
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(
8223
+ )), !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
8224
  "button",
7926
8225
  {
7927
8226
  type: "button",
7928
8227
  className: "tf-checkout-billing__login-link",
7929
8228
  onClick: () => onLogin(billing.email)
7930
8229
  },
7931
- "Log in to autofill your details"
7932
- ) : "Log in to autofill your details."), checkout.buyerFields.map((f) => {
8230
+ t("billing.loginAutofill")
8231
+ ) : t("billing.loginAutofillPlain")), checkout.buyerFields.map((f) => {
7933
8232
  var _a2;
7934
8233
  return /* @__PURE__ */ React28.createElement(
7935
8234
  BuyerField,
@@ -7940,15 +8239,15 @@ var BillingInfo = ({
7940
8239
  onChange: (v) => setBilling((b) => ({ ...b, [f.key]: v })),
7941
8240
  countries,
7942
8241
  error: fieldError(
7943
- f.kind === "nationality" ? "Nationality" : f.kind === "gender" ? "Gender" : "Instagram handle"
8242
+ f.kind === "nationality" ? t("billing.nationality") : f.kind === "gender" ? t("billing.gender") : t("billing.instagramHandle")
7944
8243
  )
7945
8244
  }
7946
8245
  );
7947
8246
  }), gates.showPhone && /* @__PURE__ */ React28.createElement(
7948
8247
  Field,
7949
8248
  {
7950
- label: `Phone${gates.phoneRequired ? " *" : ""}`,
7951
- error: fieldError("Valid phone number", "Enter a valid phone number."),
8249
+ label: gates.phoneRequired ? t("billing.phone") : t("billing.phoneOptional"),
8250
+ error: fieldError("Valid phone number", t("billing.phoneInvalid")),
7952
8251
  invalid: Boolean(fieldError("Valid phone number"))
7953
8252
  },
7954
8253
  /* @__PURE__ */ React28.createElement(
@@ -7962,10 +8261,10 @@ var BillingInfo = ({
7962
8261
  disableDialCodePrefill: true,
7963
8262
  value: (_D = billing.phone) != null ? _D : "",
7964
8263
  required: gates.phoneRequired,
7965
- placeholder: "Phone number",
8264
+ placeholder: t("billing.phonePlaceholder"),
7966
8265
  inputProps: {
7967
8266
  autoComplete: "tel",
7968
- "aria-label": "Phone",
8267
+ "aria-label": t("billing.phoneAria"),
7969
8268
  "aria-invalid": Boolean(fieldError("Valid phone number"))
7970
8269
  },
7971
8270
  onChange: (phone) => setBilling((current2) => ({ ...current2, phone }))
@@ -7974,8 +8273,8 @@ var BillingInfo = ({
7974
8273
  ), gates.showDob && /* @__PURE__ */ React28.createElement(
7975
8274
  Field,
7976
8275
  {
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,
8276
+ label: gates.minimumAge ? t("billing.dobWithAge", { age: gates.minimumAge }) : t("billing.dob"),
8277
+ error: dobError === "Date of birth" ? t("billing.dobRequired") : dobError ? t("billing.ageMinimum", { age: (_E = gates.minimumAge) != null ? _E : "" }) : void 0,
7979
8278
  invalid: Boolean(dobError)
7980
8279
  },
7981
8280
  /* @__PURE__ */ React28.createElement(
@@ -8026,17 +8325,17 @@ var BillingInfo = ({
8026
8325
  "aria-invalid": (showPrivacyError || showValidation) && !consent.ttfOptIn,
8027
8326
  onChange: (e) => setConsent((c) => ({ ...c, ttfOptIn: e.target.checked })),
8028
8327
  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."), " *")
8328
+ 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
8329
  }
8031
8330
  ),
8032
- (showPrivacyError || showValidation) && !consent.ttfOptIn && /* @__PURE__ */ React28.createElement("div", { className: "tf-checkout-consent__error" }, "Required")
8033
- ) : ttfOptInLabel ? /* @__PURE__ */ React28.createElement(
8331
+ (showPrivacyError || showValidation) && !consent.ttfOptIn && /* @__PURE__ */ React28.createElement("div", { className: "tf-checkout-consent__error" }, t("common.required"))
8332
+ ) : ttfOptInText ? /* @__PURE__ */ React28.createElement(
8034
8333
  Checkbox,
8035
8334
  {
8036
8335
  checked: consent.ttfOptIn,
8037
8336
  onChange: (e) => setConsent((c) => ({ ...c, ttfOptIn: e.target.checked })),
8038
8337
  className: "tf-checkout-checkbox--consent",
8039
- label: ttfOptInLabel
8338
+ label: ttfOptInText
8040
8339
  }
8041
8340
  ) : null, !combined && /* @__PURE__ */ React28.createElement(React28.Fragment, null, /* @__PURE__ */ React28.createElement(
8042
8341
  Button,
@@ -8051,7 +8350,7 @@ var BillingInfo = ({
8051
8350
  onContinue == null ? void 0 : onContinue();
8052
8351
  }
8053
8352
  },
8054
- buttonLabel
8353
+ buttonText
8055
8354
  ))), showHolders && /* @__PURE__ */ React28.createElement(
8056
8355
  TicketHoldersCard,
8057
8356
  {
@@ -8086,12 +8385,13 @@ import React30, { useEffect as useEffect12, useMemo as useMemo6, useRef as useRe
8086
8385
  import React29 from "react";
8087
8386
  var OrderSummary = ({ eventId, className }) => {
8088
8387
  var _a, _b, _c;
8388
+ const t = useT();
8089
8389
  const checkout = useCheckoutContext();
8090
8390
  const event = hooks_exports.useEvent(eventId);
8091
8391
  const breakdown = checkout.breakdown;
8092
8392
  const detailed = checkout.priceBreakdown;
8093
8393
  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) => {
8394
+ 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
8395
  var _a2;
8096
8396
  const detail = detailed == null ? void 0 : detailed.tickets[index];
8097
8397
  return /* @__PURE__ */ React29.createElement(
@@ -8100,7 +8400,7 @@ var OrderSummary = ({ eventId, className }) => {
8100
8400
  key: `${ticket.ticketTypeId}-${index}`,
8101
8401
  className: "tf-checkout-order-summary__item"
8102
8402
  },
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"),
8403
+ /* @__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
8404
  (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
8405
  );
8106
8406
  })), ((_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 +8409,8 @@ var OrderSummary = ({ eventId, className }) => {
8109
8409
  key: `${addOn.name}-${index}`,
8110
8410
  className: "tf-checkout-order-summary__item"
8111
8411
  },
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(
8412
+ /* @__PURE__ */ React29.createElement("div", { className: "tf-checkout-order-summary__ticket" }, addOn.quantity, " x ", addOn.name, addOn.show_price ? ` - ${addOn.unit_price} ${t("common.each")}` : "")
8413
+ ))), /* @__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
8414
  breakdown.total
8115
8415
  ).toFixed(2)}`)));
8116
8416
  };
@@ -8153,6 +8453,7 @@ var Payment = ({
8153
8453
  className
8154
8454
  }) => {
8155
8455
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
8456
+ const t = useT();
8156
8457
  const checkout = useCheckoutContext();
8157
8458
  const validation = useCheckoutValidation();
8158
8459
  const [error, setError] = useState16("");
@@ -8182,7 +8483,11 @@ var Payment = ({
8182
8483
  const out = [];
8183
8484
  if (isXendit) {
8184
8485
  if (methods.xenditCard)
8185
- out.push({ id: { kind: "xenditCard" }, value: "xenditCard", label: "Card" });
8486
+ out.push({
8487
+ id: { kind: "xenditCard" },
8488
+ value: "xenditCard",
8489
+ label: t("payment.card")
8490
+ });
8186
8491
  for (const w of methods.xenditEWallets)
8187
8492
  out.push({
8188
8493
  id: { kind: "xenditEWallet", walletKey: w.key },
@@ -8194,23 +8499,23 @@ var Payment = ({
8194
8499
  } else if (checkout.gateway === "razorpay") {
8195
8500
  out.push({ id: { kind: "razorpay" }, value: "razorpay", label: "Razorpay" });
8196
8501
  } 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;
8502
+ out.push({ id: { kind: "card" }, value: "card", label: t("payment.card") });
8503
+ for (const t2 of (_b2 = checkout.redirectPaymentMethods) != null ? _b2 : []) {
8504
+ if (t2 === "paypal" && methods.paypal) continue;
8200
8505
  out.push({
8201
- id: { kind: "redirect", methodType: t },
8202
- value: `rd:${t}`,
8203
- label: redirectLabel(t)
8506
+ id: { kind: "redirect", methodType: t2 },
8507
+ value: `rd:${t2}`,
8508
+ label: redirectLabel(t2)
8204
8509
  });
8205
8510
  }
8206
8511
  if ((_c2 = checkout.paymentPlan) == null ? void 0 : _c2.available)
8207
8512
  out.push({
8208
8513
  id: { kind: "paymentPlan" },
8209
8514
  value: "paymentPlan",
8210
- label: "Payment plan"
8515
+ label: t("payment.paymentPlan")
8211
8516
  });
8212
8517
  if (offersOxxo)
8213
- out.push({ id: { kind: "oxxo" }, value: "oxxo", label: "OXXO (pay in cash)" });
8518
+ out.push({ id: { kind: "oxxo" }, value: "oxxo", label: t("payment.oxxo") });
8214
8519
  }
8215
8520
  if (methods.paypal)
8216
8521
  out.push({ id: { kind: "paypal" }, value: "paypal", label: "PayPal" });
@@ -8267,7 +8572,7 @@ var Payment = ({
8267
8572
  const extra = selectedOption == null ? void 0 : selectedOption.extra;
8268
8573
  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
8574
  const privacyOk = !requirePrivacyPolicy || checkout.consent.ttfOptIn;
8270
- const payLabel = isFree ? "Complete Registration" : isPlanSelected ? planConfirmLabel((_l = checkout.paymentPlan) == null ? void 0 : _l.configuration) : "Submit Payment";
8575
+ const payLabel = isFree ? t("payment.completeRegistration") : isPlanSelected ? planConfirmLabel((_l = checkout.paymentPlan) == null ? void 0 : _l.configuration) : t("payment.submitPayment");
8271
8576
  const planTerms = paymentPlanTerms((_m = checkout.paymentPlan) == null ? void 0 : _m.configuration);
8272
8577
  const finalizing = checkout.status === "placing" || checkout.status === "succeeded";
8273
8578
  const pay = () => {
@@ -8348,15 +8653,15 @@ var Payment = ({
8348
8653
  }
8349
8654
  }
8350
8655
  ) : /* @__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(
8656
+ ), 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
8657
  Checkbox,
8353
8658
  {
8354
8659
  checked: useSavedCard,
8355
8660
  onChange: (e) => setUseSavedCard(e.target.checked),
8356
- label: "Use this card"
8661
+ label: t("payment.useThisCard")
8357
8662
  }
8358
8663
  )));
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(
8664
+ 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
8665
  PaymentMethods,
8361
8666
  {
8362
8667
  options,
@@ -8388,7 +8693,7 @@ var Payment = ({
8388
8693
  label: /* @__PURE__ */ React30.createElement(React30.Fragment, null, /* @__PURE__ */ React30.createElement("span", { dangerouslySetInnerHTML: { __html: c.content || c.name } }), c.isRequired && " *")
8389
8694
  }
8390
8695
  ),
8391
- invalid && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-consent__error" }, "You must accept this condition to continue.")
8696
+ invalid && /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-consent__error" }, t("payment.conditionRequired"))
8392
8697
  );
8393
8698
  })), /* @__PURE__ */ React30.createElement(OrderSummary, { eventId }), /* @__PURE__ */ React30.createElement("div", { className: "tf-checkout-payment__cta" }, /* @__PURE__ */ React30.createElement(
8394
8699
  Button,
@@ -8397,21 +8702,22 @@ var Payment = ({
8397
8702
  loading: finalizing,
8398
8703
  disabled: checkout.isBusy || finalizing || !isFree && !methods
8399
8704
  },
8400
- finalizing ? "Placing\u2026" : payLabel
8705
+ finalizing ? t("payment.placing") : payLabel
8401
8706
  )), bottomError && /* @__PURE__ */ React30.createElement("p", { className: "tf-checkout-error-text" }, bottomError));
8402
8707
  };
8403
8708
 
8404
8709
  // src/sections/IDVerification.tsx
8405
8710
  import React31, { useState as useState17 } from "react";
8406
8711
  var MESSAGE = {
8407
- idle: "To complete the purchase, please verify your identity.",
8408
- starting: "Opening the verification page\u2026",
8409
- polling: "Waiting for verification to complete in the other tab\u2026",
8410
- verified: "Identity verified \u2014 your tickets are on their way.",
8411
- timeout: "Still not confirmed. Finish in the other tab, then check again.",
8412
- error: "We couldn\u2019t reach the verification service. Try again."
8712
+ idle: "verification.idle",
8713
+ starting: "verification.starting",
8714
+ polling: "verification.polling",
8715
+ verified: "verification.verified",
8716
+ timeout: "verification.timeoutCheckAgain",
8717
+ error: "verification.error"
8413
8718
  };
8414
8719
  var IDVerification = ({ className }) => {
8720
+ const t = useT();
8415
8721
  const checkout = useCheckoutContext();
8416
8722
  const order = checkout.order;
8417
8723
  const [phase, setPhase] = useState17("idle");
@@ -8432,7 +8738,7 @@ var IDVerification = ({ className }) => {
8432
8738
  setError(errorMessage(e));
8433
8739
  });
8434
8740
  };
8435
- return /* @__PURE__ */ React31.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ React31.createElement(SectionHeader, { title: "Account Verification" }), /* @__PURE__ */ React31.createElement("p", { className: cx("tf-checkout-note", done && "tf-checkout-idverify__done") }, MESSAGE[phase]), !done && /* @__PURE__ */ React31.createElement(Button, { block: true, onClick: run, loading: running, disabled: running }, phase === "idle" ? "Verify" : running ? "Verifying\u2026" : "Check again"), error && /* @__PURE__ */ React31.createElement("p", { className: "tf-checkout-error-text" }, error));
8741
+ return /* @__PURE__ */ React31.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ React31.createElement(SectionHeader, { title: t("verification.title") }), /* @__PURE__ */ React31.createElement("p", { className: cx("tf-checkout-note", done && "tf-checkout-idverify__done") }, t(MESSAGE[phase])), !done && /* @__PURE__ */ React31.createElement(Button, { block: true, onClick: run, loading: running, disabled: running }, phase === "idle" ? t("verification.verify") : running ? t("verification.verifying") : t("verification.checkAgain")), error && /* @__PURE__ */ React31.createElement("p", { className: "tf-checkout-error-text" }, error));
8436
8742
  };
8437
8743
 
8438
8744
  // src/sections/Confirmation.tsx
@@ -8444,6 +8750,7 @@ var Confirmation = ({
8444
8750
  children,
8445
8751
  className
8446
8752
  }) => {
8753
+ const t = useT();
8447
8754
  const checkout = useCheckoutContext();
8448
8755
  const order = checkout.order;
8449
8756
  const [copied, setCopied] = useState18(false);
@@ -8477,7 +8784,7 @@ var Confirmation = ({
8477
8784
  () => void 0
8478
8785
  );
8479
8786
  };
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(
8787
+ 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
8788
  "a",
8482
8789
  {
8483
8790
  className: "tf-checkout-button tf-checkout-button--secondary tf-checkout-button--block",
@@ -8485,15 +8792,15 @@ var Confirmation = ({
8485
8792
  target: "_blank",
8486
8793
  rel: "noopener noreferrer"
8487
8794
  },
8488
- "View payment voucher"
8795
+ t("confirmation.viewVoucher")
8489
8796
  ), viewOrderUrl && /* @__PURE__ */ React32.createElement(
8490
8797
  "a",
8491
8798
  {
8492
8799
  className: "tf-checkout-button tf-checkout-button--secondary tf-checkout-button--block",
8493
8800
  href: viewOrderUrl
8494
8801
  },
8495
- "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(
8802
+ t("confirmation.viewTickets")
8803
+ ), 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
8804
  "a",
8498
8805
  {
8499
8806
  key: s.label,
@@ -8515,9 +8822,10 @@ var attributesOf = (response) => {
8515
8822
  if (data && typeof data === "object") return data;
8516
8823
  return response;
8517
8824
  };
8825
+ var MISSING_REFERENCE = "\0missing-reference";
8518
8826
  var OrderConfirmation = ({
8519
8827
  orderHash,
8520
- title = "Your order has been confirmed!",
8828
+ title,
8521
8829
  message,
8522
8830
  helper,
8523
8831
  eventTitle,
@@ -8531,6 +8839,7 @@ var OrderConfirmation = ({
8531
8839
  className
8532
8840
  }) => {
8533
8841
  var _a, _b, _c, _d;
8842
+ const t = useT();
8534
8843
  const [data, setData] = useState19(null);
8535
8844
  const [failure, setFailure] = useState19("");
8536
8845
  const [copied, setCopied] = useState19(false);
@@ -8542,7 +8851,7 @@ var OrderConfirmation = ({
8542
8851
  }, [onError, onLoaded]);
8543
8852
  useEffect13(() => {
8544
8853
  if (!orderHash) {
8545
- setFailure("The order reference is missing.");
8854
+ setFailure(MISSING_REFERENCE);
8546
8855
  return;
8547
8856
  }
8548
8857
  let active = true;
@@ -8567,7 +8876,7 @@ var OrderConfirmation = ({
8567
8876
  };
8568
8877
  }, [orderHash]);
8569
8878
  if (failure) {
8570
- return /* @__PURE__ */ React33.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ React33.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, failure));
8879
+ return /* @__PURE__ */ React33.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ React33.createElement("div", { className: "tf-checkout-auth__alert", role: "alert" }, failure === MISSING_REFERENCE ? t("confirmation.missingReference") : failure));
8571
8880
  }
8572
8881
  if (!data) {
8573
8882
  return /* @__PURE__ */ React33.createElement("div", { className: "tf-checkout-confirmation-page__loading" }, /* @__PURE__ */ React33.createElement(Loader, { className: "tf-checkout-loader--page" }));
@@ -8583,14 +8892,14 @@ var OrderConfirmation = ({
8583
8892
  const pricing = [
8584
8893
  ...Number.isFinite(currentPrice) ? [
8585
8894
  {
8586
- label: "Your ticket is currently",
8895
+ label: t("referral.currentPrice"),
8587
8896
  price: `${symbol}${currentPrice.toFixed(2)}`
8588
8897
  }
8589
8898
  ] : [],
8590
8899
  ...sales.map((sale) => ({
8591
- label: `If your friends buy ${sale.sales} tickets`,
8592
- subLabel: Number(sale.price) === 0 ? "Your ticket becomes" : "Your ticket goes down to",
8593
- price: Number(sale.price) === 0 ? "FREE!" : `${symbol}${Number(sale.price).toFixed(2)}`
8900
+ label: t("referral.ifFriendsBuy", { count: sale.sales }),
8901
+ subLabel: Number(sale.price) === 0 ? t("referral.becomes") : t("referral.goesDownTo"),
8902
+ price: Number(sale.price) === 0 ? t("referral.titleFree") : `${symbol}${Number(sale.price).toFixed(2)}`
8594
8903
  }))
8595
8904
  ];
8596
8905
  const copy = () => {
@@ -8600,20 +8909,20 @@ var OrderConfirmation = ({
8600
8909
  window.setTimeout(() => setCopied(false), 1500);
8601
8910
  });
8602
8911
  };
8603
- return /* @__PURE__ */ React33.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ React33.createElement("div", { className: "header-container" }, /* @__PURE__ */ React33.createElement("div", { className: "header-product-text" }, /* @__PURE__ */ React33.createElement("p", { className: "title" }, title), (eventTitle || eventDate || eventLocation) && /* @__PURE__ */ React33.createElement("div", { className: "event-details" }, eventTitle && /* @__PURE__ */ React33.createElement("div", { className: "event-title" }, eventTitle), eventDate && /* @__PURE__ */ React33.createElement("div", { className: "event-date" }, eventDate), eventLocation && /* @__PURE__ */ React33.createElement("div", { className: "event-location" }, eventLocation)), /* @__PURE__ */ React33.createElement("div", { className: "share-message-section" }, customReplacement ? /* @__PURE__ */ React33.createElement("div", { dangerouslySetInnerHTML: { __html: customText } }) : /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement("span", { className: "main" }, attachTickets ? "Your tickets have been emailed to you" : message != null ? message : "Your tickets are available in My Tickets."), /* @__PURE__ */ React33.createElement("span", { className: "helper" }, attachTickets ? "Please bring them with you to the event" : helper))))), customText && !customReplacement && /* @__PURE__ */ React33.createElement(
8912
+ return /* @__PURE__ */ React33.createElement("div", { className: cx("confirmation-page tf-checkout-confirmation-page", className) }, /* @__PURE__ */ React33.createElement("div", { className: "header-container" }, /* @__PURE__ */ React33.createElement("div", { className: "header-product-text" }, /* @__PURE__ */ React33.createElement("p", { className: "title" }, title != null ? title : t("confirmation.orderConfirmed")), (eventTitle || eventDate || eventLocation) && /* @__PURE__ */ React33.createElement("div", { className: "event-details" }, eventTitle && /* @__PURE__ */ React33.createElement("div", { className: "event-title" }, eventTitle), eventDate && /* @__PURE__ */ React33.createElement("div", { className: "event-date" }, eventDate), eventLocation && /* @__PURE__ */ React33.createElement("div", { className: "event-location" }, eventLocation)), /* @__PURE__ */ React33.createElement("div", { className: "share-message-section" }, customReplacement ? /* @__PURE__ */ React33.createElement("div", { dangerouslySetInnerHTML: { __html: customText } }) : /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement("span", { className: "main" }, attachTickets ? t("confirmation.emailed") : message != null ? message : t("confirmation.inMyTickets")), /* @__PURE__ */ React33.createElement("span", { className: "helper" }, attachTickets ? t("confirmation.bringThem") : helper))))), customText && !customReplacement && /* @__PURE__ */ React33.createElement(
8604
8913
  "div",
8605
8914
  {
8606
8915
  className: "custom-confirmation-page-text tf-checkout-confirmation-page__custom",
8607
8916
  dangerouslySetInnerHTML: { __html: customText }
8608
8917
  }
8609
- ), orderUrl && /* @__PURE__ */ React33.createElement("div", { className: "order-details-button-container" }, /* @__PURE__ */ React33.createElement("a", { className: "view-order-button", href: orderUrl }, "View Order")), showReferral && data.disable_referral === false && shareUrl && /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement("div", { className: "referral_text_image_section" }, /* @__PURE__ */ React33.createElement("div", { className: "referral_text_section" }, /* @__PURE__ */ React33.createElement("div", { className: "referral_title_text" }, "Your ticket can become", /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, " cheaper "), "or even", /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, " FREE!")), /* @__PURE__ */ React33.createElement("div", { className: "referral_text" }, /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, "Invite friends "), "and we'll refund up to", /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, " 100% "), "of your ticket money, if they buy tickets as well!"))), /* @__PURE__ */ React33.createElement("div", { className: "share_wrapper" }, /* @__PURE__ */ React33.createElement("div", { className: "share_section" }, /* @__PURE__ */ React33.createElement("div", { className: "invitation_section" }, /* @__PURE__ */ React33.createElement("div", { className: "invitation_title" }, "How do you invite your friends?"), /* @__PURE__ */ React33.createElement("div", { className: "share_buttons" }, /* @__PURE__ */ React33.createElement("div", { className: "share-by-link" }, /* @__PURE__ */ React33.createElement("h5", { className: "share-by-link label" }, "Send them this link:"), /* @__PURE__ */ React33.createElement("div", { className: "share-btn-inner" }, /* @__PURE__ */ React33.createElement("input", { className: "share-input", readOnly: true, value: shareUrl }), /* @__PURE__ */ React33.createElement(
8918
+ ), orderUrl && /* @__PURE__ */ React33.createElement("div", { className: "order-details-button-container" }, /* @__PURE__ */ React33.createElement("a", { className: "view-order-button", href: orderUrl }, t("confirmation.viewOrder"))), showReferral && data.disable_referral === false && shareUrl && /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement("div", { className: "referral_text_image_section" }, /* @__PURE__ */ React33.createElement("div", { className: "referral_text_section" }, /* @__PURE__ */ React33.createElement("div", { className: "referral_title_text" }, t("referral.titleStart"), /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, " ", t("referral.titleCheaper"), " "), t("referral.titleOr"), /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, " ", t("referral.titleFree"))), /* @__PURE__ */ React33.createElement("div", { className: "referral_text" }, /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, t("referral.inviteFriends"), " "), t("referral.inviteMiddle"), /* @__PURE__ */ React33.createElement("span", { className: "strong-text" }, " 100% "), t("referral.inviteEnd")))), /* @__PURE__ */ React33.createElement("div", { className: "share_wrapper" }, /* @__PURE__ */ React33.createElement("div", { className: "share_section" }, /* @__PURE__ */ React33.createElement("div", { className: "invitation_section" }, /* @__PURE__ */ React33.createElement("div", { className: "invitation_title" }, t("referral.howToInvite")), /* @__PURE__ */ React33.createElement("div", { className: "share_buttons" }, /* @__PURE__ */ React33.createElement("div", { className: "share-by-link" }, /* @__PURE__ */ React33.createElement("h5", { className: "share-by-link label" }, t("referral.sendThisLink")), /* @__PURE__ */ React33.createElement("div", { className: "share-btn-inner" }, /* @__PURE__ */ React33.createElement("input", { className: "share-input", readOnly: true, value: shareUrl }), /* @__PURE__ */ React33.createElement(
8610
8919
  "button",
8611
8920
  {
8612
8921
  className: "share-by-link-copy-icon",
8613
8922
  type: "button",
8614
8923
  onClick: copy
8615
8924
  },
8616
- /* @__PURE__ */ React33.createElement("span", { className: "copy-icon" }, copied ? "Copied!" : "Copy")
8925
+ /* @__PURE__ */ React33.createElement("span", { className: "copy-icon" }, copied ? t("referral.copied") : t("referral.copy"))
8617
8926
  ))), showShareButtons && /* @__PURE__ */ React33.createElement("div", { className: "social-media-btns" }, /* @__PURE__ */ React33.createElement(
8618
8927
  "a",
8619
8928
  {
@@ -8634,31 +8943,33 @@ var OrderConfirmation = ({
8634
8943
  rel: "noopener noreferrer"
8635
8944
  },
8636
8945
  "WhatsApp"
8637
- ))))), pricing.length > 0 && /* @__PURE__ */ React33.createElement("div", { className: "pricing-section" }, /* @__PURE__ */ React33.createElement("div", { className: "invitation_title" }, "How much cheaper?"), pricing.map((item, index) => /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_wrapper", key: `${item.label}-${index}` }, /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_label" }, item.label, item.subLabel && /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_sublabel" }, item.subLabel)), /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_price" }, item.price)))))));
8946
+ ))))), pricing.length > 0 && /* @__PURE__ */ React33.createElement("div", { className: "pricing-section" }, /* @__PURE__ */ React33.createElement("div", { className: "invitation_title" }, t("referral.howMuchCheaper")), pricing.map((item, index) => /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_wrapper", key: `${item.label}-${index}` }, /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_label" }, item.label, item.subLabel && /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_sublabel" }, item.subLabel)), /* @__PURE__ */ React33.createElement("div", { className: "pricing-section_price" }, item.price)))))));
8638
8947
  };
8639
8948
 
8640
8949
  // src/sections/OrderIDVerification.tsx
8641
8950
  import React34, { useEffect as useEffect14, useState as useState20 } from "react";
8642
8951
  var PHASE_MESSAGE = {
8643
- checking: "Checking your verification status\u2026",
8644
- idle: "To complete the purchase, please verify your identity.",
8645
- starting: "Opening the verification page\u2026",
8646
- polling: "Waiting for verification to complete in the other tab\u2026",
8647
- verified: "Identity verified \u2014 your tickets are on their way.",
8648
- timeout: "Verification is taking longer than usual. Your payment is safe.",
8649
- error: "We couldn\u2019t reach the verification service. Try again."
8650
- };
8952
+ checking: "verification.checking",
8953
+ idle: "verification.idle",
8954
+ starting: "verification.starting",
8955
+ polling: "verification.polling",
8956
+ verified: "verification.verified",
8957
+ timeout: "verification.timeoutSafe",
8958
+ error: "verification.error"
8959
+ };
8960
+ var MISSING_REFERENCE2 = "\0missing-reference";
8651
8961
  var OrderIDVerification = ({
8652
8962
  orderHash,
8653
8963
  onVerified,
8654
8964
  className
8655
8965
  }) => {
8966
+ const t = useT();
8656
8967
  const [phase, setPhase] = useState20("checking");
8657
8968
  const [failure, setFailure] = useState20("");
8658
8969
  useEffect14(() => {
8659
8970
  if (!orderHash) {
8660
8971
  setPhase("error");
8661
- setFailure("The order reference is missing.");
8972
+ setFailure(MISSING_REFERENCE2);
8662
8973
  return;
8663
8974
  }
8664
8975
  let active = true;
@@ -8711,7 +9022,7 @@ var OrderIDVerification = ({
8711
9022
  }
8712
9023
  );
8713
9024
  };
8714
- return /* @__PURE__ */ React34.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ React34.createElement(SectionHeader, { title: "Account Verification" }), /* @__PURE__ */ React34.createElement(
9025
+ return /* @__PURE__ */ React34.createElement(Card, { className: cx("tf-checkout-idverify", className) }, /* @__PURE__ */ React34.createElement(SectionHeader, { title: t("verification.title") }), /* @__PURE__ */ React34.createElement(
8715
9026
  "p",
8716
9027
  {
8717
9028
  className: cx(
@@ -8719,8 +9030,8 @@ var OrderIDVerification = ({
8719
9030
  phase === "verified" && "tf-checkout-idverify__done"
8720
9031
  )
8721
9032
  },
8722
- failure || PHASE_MESSAGE[phase]
8723
- ), phase !== "verified" && orderHash && /* @__PURE__ */ React34.createElement(Button, { block: true, onClick: run, loading: running, disabled: running || !orderHash }, phase === "idle" ? "Verify" : running ? "Verifying\u2026" : "Try again"));
9033
+ failure === MISSING_REFERENCE2 ? t("confirmation.missingReference") : failure || t(PHASE_MESSAGE[phase])
9034
+ ), phase !== "verified" && orderHash && /* @__PURE__ */ React34.createElement(Button, { block: true, onClick: run, loading: running, disabled: running || !orderHash }, phase === "idle" ? t("verification.verify") : running ? t("verification.verifying") : t("verification.tryAgain")));
8724
9035
  };
8725
9036
 
8726
9037
  // src/EmbeddedCheckout.tsx
@@ -8748,6 +9059,7 @@ var Flow = ({
8748
9059
  showTestCardHint
8749
9060
  }) => {
8750
9061
  var _a;
9062
+ const t = useT();
8751
9063
  const checkout = useCheckoutContext();
8752
9064
  const [view, setView] = useState21(initialView);
8753
9065
  const [selectionView, setSelectionView] = useState21(initialView);
@@ -8874,7 +9186,7 @@ var Flow = ({
8874
9186
  key: authRequest.key,
8875
9187
  open: true,
8876
9188
  initialEmail: authRequest.email,
8877
- message: authRequest.email ? "This email already has an account. Log in to autofill your checkout details." : void 0,
9189
+ message: authRequest.email ? t("auth.existingAccount") : void 0,
8878
9190
  allowRegistration: auth == null ? void 0 : auth.allowRegistration,
8879
9191
  allowPasswordReset: auth == null ? void 0 : auth.allowPasswordReset,
8880
9192
  requireRegistrationAddress: auth == null ? void 0 : auth.requireRegistrationAddress,
@@ -8909,32 +9221,41 @@ var EmbeddedCheckout = ({
8909
9221
  locale,
8910
9222
  messages,
8911
9223
  className
8912
- }) => /* @__PURE__ */ React35.createElement(CheckoutProvider, { theme, locale, messages, className }, /* @__PURE__ */ React35.createElement(
8913
- Flow,
9224
+ }) => /* @__PURE__ */ React35.createElement(
9225
+ CheckoutProvider,
8914
9226
  {
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
- ));
9227
+ theme,
9228
+ locale,
9229
+ messages,
9230
+ className
9231
+ },
9232
+ /* @__PURE__ */ React35.createElement(
9233
+ Flow,
9234
+ {
9235
+ key: eventId,
9236
+ eventId,
9237
+ onComplete,
9238
+ confirmationMode,
9239
+ initialView,
9240
+ onViewChange,
9241
+ autoScroll,
9242
+ requireEmailConfirmation,
9243
+ collectTicketHolders,
9244
+ collectHolderContact,
9245
+ onLogin,
9246
+ auth,
9247
+ skipBillingWhenProfileComplete,
9248
+ ttfOptInLabel,
9249
+ brandOptInLabel,
9250
+ privacyPolicy,
9251
+ additionalConditions,
9252
+ initialPromoCode,
9253
+ referrer,
9254
+ readAttributionFromUrl,
9255
+ showTestCardHint
9256
+ }
9257
+ )
9258
+ );
8938
9259
 
8939
9260
  // src/ResumedCheckout.tsx
8940
9261
  import React36, { useEffect as useEffect16, useRef as useRef11, useState as useState22 } from "react";