@getmicdrop/venue-calendar 4.0.163 → 4.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CartView-BkRTBDXZ.js → CartView-DYabQwHC.js} +9 -9
- package/dist/CartView-DYabQwHC.js.map +1 -0
- package/dist/{Checkout-C8kEhq77.js → Checkout-C9SOzGlj.js} +9 -9
- package/dist/Checkout-C9SOzGlj.js.map +1 -0
- package/dist/{Checkout-rSZjE7ZX.js → Checkout-DIVV0L0F.js} +7 -7
- package/dist/Checkout-DIVV0L0F.js.map +1 -0
- package/dist/{CheckoutTimer-CCoBtfvN.js → CheckoutTimer-B_SlgvFU.js} +5 -5
- package/dist/CheckoutTimer-B_SlgvFU.js.map +1 -0
- package/dist/{ClockIcon-TC9h_DgF.js → ClockIcon-PHXURS1M.js} +2 -2
- package/dist/ClockIcon-PHXURS1M.js.map +1 -0
- package/dist/{CollectionView-8095UIbe.js → CollectionView-BCA1R0PJ.js} +5 -5
- package/dist/CollectionView-BCA1R0PJ.js.map +1 -0
- package/dist/{Event-D5qSa4qP.js → Event-BErjd7aD.js} +183 -175
- package/dist/Event-BErjd7aD.js.map +1 -0
- package/dist/{EventPage-B0i9SYgi.js → EventPage-DV-MVPHg.js} +8 -8
- package/dist/EventPage-DV-MVPHg.js.map +1 -0
- package/dist/{Heading-BFbWZKav.js → Heading-Ci8L45Wr.js} +2 -2
- package/dist/Heading-Ci8L45Wr.js.map +1 -0
- package/dist/{ScarcityBadge-B1jjs4xL.js → ScarcityBadge-Cdwyg52F.js} +2 -2
- package/dist/ScarcityBadge-Cdwyg52F.js.map +1 -0
- package/dist/{SeriesPage-Q9vQLIEZ.js → SeriesPage-BoA70wuP.js} +5 -5
- package/dist/{SeriesPage-Q9vQLIEZ.js.map → SeriesPage-BoA70wuP.js.map} +1 -1
- package/dist/{Spinner-tiRQ2I2B.js → Spinner-jozFw0lx.js} +2 -2
- package/dist/Spinner-jozFw0lx.js.map +1 -0
- package/dist/{Success-CsIw4bxU.js → Success-HolOJLu3.js} +9 -9
- package/dist/Success-HolOJLu3.js.map +1 -0
- package/dist/{Text-KbMXo7g6.js → Text-BjAFX0Oh.js} +2 -2
- package/dist/Text-BjAFX0Oh.js.map +1 -0
- package/dist/{VenueCalendar-Czx0Kn4d.js → VenueCalendar-BDW-jkLN.js} +16 -15
- package/dist/VenueCalendar-BDW-jkLN.js.map +1 -0
- package/dist/{ViewTicketsEmbed-Bew7UA7B.js → ViewTicketsEmbed-DBkDPXp1.js} +5 -5
- package/dist/ViewTicketsEmbed-DBkDPXp1.js.map +1 -0
- package/dist/api/api/route-manifest.d.ts +35 -8
- package/dist/api/api.cjs.map +1 -1
- package/dist/api/api.mjs.map +1 -1
- package/dist/{es-Czctk5do.js → es-CltuJW7p.js} +2 -1
- package/dist/es-CltuJW7p.js.map +1 -0
- package/dist/{index-HngV5Tmp.js → index-EHtVTS-p.js} +3 -3
- package/dist/index-EHtVTS-p.js.map +1 -0
- package/dist/{modalManager.svelte-JZXVYH3m.js → modalManager.svelte-DmLABgNg.js} +2 -2
- package/dist/modalManager.svelte-DmLABgNg.js.map +1 -0
- package/dist/{promo-dsT5Iw68.js → promo-C9oFaeEp.js} +2 -2
- package/dist/{promo-dsT5Iw68.js.map → promo-C9oFaeEp.js.map} +1 -1
- package/dist/{serverTotals-D5dQ_beP.js → serverTotals-CJHVQkJo.js} +2 -2
- package/dist/{serverTotals-D5dQ_beP.js.map → serverTotals-CJHVQkJo.js.map} +1 -1
- package/dist/{shareCopyFeedback.svelte-CvE7h_Wn.js → shareCopyFeedback.svelte-BvXv8plI.js} +2 -2
- package/dist/shareCopyFeedback.svelte-BvXv8plI.js.map +1 -0
- package/dist/{showcase-state-options-DmmK-lzB.js → showcase-state-options-BZiy68Tm.js} +2 -2
- package/dist/{showcase-state-options-DmmK-lzB.js.map → showcase-state-options-BZiy68Tm.js.map} +1 -1
- package/dist/{transform-CpUt4pIr.js → transform-BH-qIBIv.js} +2 -2
- package/dist/transform-BH-qIBIv.js.map +1 -0
- package/dist/{utm-CfowKK2u.js → utm-B6GLtZhc.js} +2 -2
- package/dist/{utm-CfowKK2u.js.map → utm-B6GLtZhc.js.map} +1 -1
- package/dist/venue-calendar.css +1 -1
- package/dist/venue-calendar.es.js +2 -2
- package/dist/venue-calendar.iife.js +6 -6
- package/dist/venue-calendar.iife.js.map +1 -1
- package/dist/venue-calendar.umd.js +5 -5
- package/dist/venue-calendar.umd.js.map +1 -1
- package/package.json +2 -2
- package/dist/CartView-BkRTBDXZ.js.map +0 -1
- package/dist/Checkout-C8kEhq77.js.map +0 -1
- package/dist/Checkout-rSZjE7ZX.js.map +0 -1
- package/dist/CheckoutTimer-CCoBtfvN.js.map +0 -1
- package/dist/ClockIcon-TC9h_DgF.js.map +0 -1
- package/dist/CollectionView-8095UIbe.js.map +0 -1
- package/dist/Event-D5qSa4qP.js.map +0 -1
- package/dist/EventPage-B0i9SYgi.js.map +0 -1
- package/dist/Heading-BFbWZKav.js.map +0 -1
- package/dist/ScarcityBadge-B1jjs4xL.js.map +0 -1
- package/dist/Spinner-tiRQ2I2B.js.map +0 -1
- package/dist/Success-CsIw4bxU.js.map +0 -1
- package/dist/Text-KbMXo7g6.js.map +0 -1
- package/dist/VenueCalendar-Czx0Kn4d.js.map +0 -1
- package/dist/ViewTicketsEmbed-Bew7UA7B.js.map +0 -1
- package/dist/es-Czctk5do.js.map +0 -1
- package/dist/index-HngV5Tmp.js.map +0 -1
- package/dist/modalManager.svelte-JZXVYH3m.js.map +0 -1
- package/dist/shareCopyFeedback.svelte-CvE7h_Wn.js.map +0 -1
- package/dist/transform-CpUt4pIr.js.map +0 -1
|
@@ -380,6 +380,7 @@ const e = {
|
|
|
380
380
|
giftCardScheduleDesc: "Elige una fecha y hora",
|
|
381
381
|
giftCardDeliveryDate: "Fecha de entrega",
|
|
382
382
|
giftCardDeliveryTime: "Hora de entrega",
|
|
383
|
+
giftCardDeliveryDateMax: "La entrega puede programarse con hasta 1 año de antelación",
|
|
383
384
|
giftCardScheduledFor: "Programado para:",
|
|
384
385
|
locale: "es",
|
|
385
386
|
ticketAriaLabel: "Boleto de {title}",
|
|
@@ -413,4 +414,4 @@ const e = {
|
|
|
413
414
|
export {
|
|
414
415
|
e as es
|
|
415
416
|
};
|
|
416
|
-
//# sourceMappingURL=es-
|
|
417
|
+
//# sourceMappingURL=es-CltuJW7p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"es-CltuJW7p.js","sources":["../src/lib/i18n/locales/es.js"],"sourcesContent":["/**\r\n * Spanish (es) labels.\r\n *\r\n * Generated from src/lib/i18n/defaultLabels.js, which is the canonical key set.\r\n * Anything absent here falls back to English via mergeLabels().\r\n *\r\n * Regenerate with: node scripts/i18n/generate-locales.js --locale es\r\n */\r\nexport const es = {\r\n viewList: 'Lista',\r\n viewGallery: 'Galería',\r\n viewCalendar: 'Calendario',\r\n searchPlaceholder: 'Buscar eventos',\r\n searchAriaLabel: 'Buscar eventos',\r\n listView: 'Vista de lista',\r\n galleryView: 'Vista de galería',\r\n calendarView: 'Vista de calendario',\r\n eventCalendarTitle: 'Calendario de eventos',\r\n noUpcomingEvents: 'No hay próximos eventos',\r\n noUpcomingEventsSubtext:\r\n 'No hay eventos programados en este momento — vuelve pronto para ver nuevos shows',\r\n loadingEvents: 'Cargando eventos',\r\n loadingEventsWait: 'Cargando eventos, por favor espera...',\r\n loading: 'Cargando...',\r\n loadingMoreEvents: 'Cargando más eventos...',\r\n loadingMoreShows: 'Cargando más shows...',\r\n statusOnSale: 'A la venta',\r\n statusSoldOut: 'Agotado',\r\n statusSellingFast: 'Vendiéndose rápido',\r\n statusAlmostSoldOut: 'Casi agotado',\r\n statusCancelled: 'Cancelado',\r\n statusPostponed: 'Aplazado',\r\n statusPastEvent: 'Evento pasado',\r\n statusSalesEnded: 'Ventas cerradas',\r\n statusComingSoon: 'Próximamente',\r\n statusFewTicketsLeft: 'Pocos boletos disponibles',\r\n scarcityOnlyNLeft: 'Solo quedan {remaining}',\r\n scarcityLowAvailability: 'Pocas disponibilidades',\r\n getTickets: 'Comprar boletos',\r\n schedule: 'Horario',\r\n pressEnterToView: 'Presiona Enter para ver detalles',\r\n pressEnterToGetTickets: 'Presiona Enter para comprar boletos',\r\n pressEnterToPurchase: 'Presiona Enter para comprar',\r\n upcomingEvents: 'Próximos eventos',\r\n eventsCarousel: 'Carrusel de eventos',\r\n eventsGallery: 'Galería de eventos',\r\n eventListings: 'Listado de eventos',\r\n eventListGroupedByDate: 'Lista de eventos agrupados por fecha',\r\n featuredEvent: 'Evento destacado',\r\n scrollLeft: 'Desplazar a la izquierda',\r\n scrollRight: 'Desplazar a la derecha',\r\n previousMonth: 'Mes anterior',\r\n nextMonth: 'Mes siguiente',\r\n calendarSearchAndViewOptions: 'Opciones de vista y búsqueda del calendario',\r\n calendarMonthNavigation: 'Navegación por meses del calendario',\r\n switchView: 'Cambiar vista',\r\n viewOptions: 'Opciones de vista',\r\n dialogActions: 'Acciones del diálogo',\r\n availableShowtimes: 'Horarios disponibles',\r\n eventsForSelectedDay: 'Eventos para el día seleccionado',\r\n chooseDate: 'Elegir fecha',\r\n today: 'Hoy',\r\n noEvents: 'Sin eventos',\r\n eventCount: '{count} evento',\r\n eventsCount: '{count} eventos',\r\n pressEnterToViewDay: 'Pulsa Enter para ver',\r\n eventsSelected:\r\n '{count} evento{count, plural, one { seleccionado} other {s seleccionados}}. Usa Tab para navegar por los eventos',\r\n daySun: 'Dom',\r\n dayMon: 'Lun',\r\n dayTue: 'Mar',\r\n dayWed: 'Mié',\r\n dayThu: 'Jue',\r\n dayFri: 'Vie',\r\n daySat: 'Sáb',\r\n daySunFull: 'Domingo',\r\n dayMonFull: 'Lunes',\r\n dayTueFull: 'Martes',\r\n dayWedFull: 'Miércoles',\r\n dayThuFull: 'Jueves',\r\n dayFriFull: 'Viernes',\r\n daySatFull: 'Sábado',\r\n monthJanuary: 'Enero',\r\n monthFebruary: 'Febrero',\r\n monthMarch: 'Marzo',\r\n monthApril: 'Abril',\r\n monthMay: 'Mayo',\r\n monthJune: 'Junio',\r\n monthJuly: 'Julio',\r\n monthAugust: 'Agosto',\r\n monthSeptember: 'Septiembre',\r\n monthOctober: 'Octubre',\r\n monthNovember: 'Noviembre',\r\n monthDecember: 'Diciembre',\r\n series: 'Serie',\r\n collection: 'Colección',\r\n noUpcomingEventsToFeature: 'No hay eventos próximos para destacar',\r\n nextEventAt: 'Próximo: {date} a las {time}',\r\n tonight: 'Esta noche',\r\n tomorrow: 'Mañana',\r\n thisWeekend: 'Este fin de semana',\r\n nextWeek: 'La próxima semana',\r\n comingUp: 'Próximamente',\r\n noUpcomingShowsScheduled: 'No hay espectáculos programados',\r\n nothingOn: 'Sin programación',\r\n noUpcomingEventsScheduled: 'No hay eventos programados',\r\n nextUp: 'A continuación:',\r\n on: 'el',\r\n jumpTo: 'Ir a',\r\n connectionError: 'Error de conexión',\r\n networkErrorMessage:\r\n 'No pudimos conectar con nuestros servidores. Comprueba tu conexión a internet e inténtalo de nuevo',\r\n networkErrorRetry: 'Reintentar',\r\n networkErrorCancel: 'Cancelar',\r\n retryingConnection: 'Reintentando conexión',\r\n couldNotLoadEvents:\r\n 'No pudimos cargar los eventos. Comprueba tu conexión a internet e inténtalo de nuevo',\r\n offlineMessage:\r\n 'Estás sin conexión. Es posible que algunas funciones no estén disponibles hasta que te reconectes',\r\n poweredBy: 'Con la tecnología de',\r\n micdropAriaLabel: 'MicDrop - Plataforma de venta de entradas para eventos',\r\n giftCardsLink: 'Tarjetas de regalo',\r\n giftCardsLinkAriaLabel: 'Compra una tarjeta de regalo para este lugar',\r\n datePickerToday: 'Hoy',\r\n datePickerClear: 'Borrar',\r\n pastDatesNotAvailable: 'Las fechas pasadas no están disponibles',\r\n dayNotAvailable: 'Este día de la semana no está disponible',\r\n preview: 'vista previa',\r\n loadingEvent: 'Cargando evento...',\r\n loadingCollection: 'Cargando colección...',\r\n loadingYourOrder: 'Cargando tu pedido...',\r\n loadingSecurePaymentForm: 'Cargando el formulario de pago seguro...',\r\n errorPrefix: 'Error:',\r\n goBack: 'Volver',\r\n goBackToCalendar: 'Volver al calendario',\r\n goBackToEventDetails: 'Volver a los detalles del evento',\r\n goBackToTicketSelection: 'Volver a la selección de boletos',\r\n eventDetails: 'Detalles del evento',\r\n eventPoster: 'Póster del evento',\r\n passwordProtectedTitle: 'Este evento está protegido con contraseña',\r\n passwordProtectedDescription:\r\n 'Introduce la contraseña del evento para ver los detalles y comprar entradas',\r\n enterPassword: 'Introduce la contraseña',\r\n enterEventPassword: 'Introduce la contraseña del evento',\r\n passwordModalDescription:\r\n 'Este evento requiere contraseña para verse. Introduce la contraseña proporcionada por el organizador del evento',\r\n passwordLabel: 'Contraseña',\r\n unlockEvent: 'Desbloquear evento',\r\n incorrectPassword: 'Contraseña incorrecta. Inténtalo de nuevo',\r\n unableToVerifyPassword:\r\n 'No se pudo verificar la contraseña. Inténtalo de nuevo',\r\n collectionPrivateTitle: 'Esta colección es privada',\r\n collectionPrivateDescription: 'Ingresa la contraseña para ver esta colección',\r\n viewCollection: 'Ver colección',\r\n eventCancelledTitle: 'Este evento ha sido cancelado',\r\n eventCancelledMessage: 'Lo sentimos, este evento ya no se llevará a cabo',\r\n eventCancelledRefund: 'Información de reembolso:',\r\n eventCancelledRefundDetails:\r\n 'Si compraste entradas, recibirás un reembolso completo automáticamente en tu método de pago original en un plazo de 5 a 10 días hábiles. Revisa tu correo electrónico para ver la confirmación',\r\n learnMore: 'Más información',\r\n cancelledRefundAuto:\r\n 'Si se cancela tu evento, reembolsaremos automáticamente la tarjeta de crédito utilizada para la compra* (por lo general, dentro de los 30 días hábiles posteriores al anuncio de cancelación)',\r\n cancelledRefundBoxOffice:\r\n '¿Compraste tus entradas en la taquilla del recinto? Por favor, preséntalas directamente en la taquilla para recibir tu reembolso',\r\n cancelledRefundFootnote:\r\n '*Ten en cuenta que no podemos procesar el reembolso en una tarjeta diferente. Si tu número de tarjeta de crédito cambió desde que realizaste la compra, esto no debería afectar la recepción del reembolso',\r\n eventCanceledTitle: 'Evento cancelado',\r\n eventPostponedTitle: 'Evento aplazado',\r\n eventCanceledBody: 'Este evento fue cancelado — no se te cobró',\r\n eventPostponedBody:\r\n 'Las ventas están pausadas mientras se reprograma el show — no se te cobró',\r\n backToEvents: 'Volver a los eventos',\r\n eventHasEnded: 'El evento ya terminó',\r\n eventEndedMessage:\r\n 'No se guardaron tus cargos porque no puedes cambiar los detalles de un evento que ya terminó',\r\n thisEventHasEnded: 'Este evento ya terminó',\r\n ticketsNoLongerAvailable: 'Ya no hay boletos disponibles para este evento',\r\n ok: 'Aceptar',\r\n tabAboutTheShow: 'Sobre el show',\r\n tabFeaturing: 'Con',\r\n tabFAQs: 'Preguntas frecuentes',\r\n tabDisclaimers: 'Avisos',\r\n disclaimer: 'Aviso',\r\n allAges: 'Todas las edades',\r\n agesPlus: 'Edad {age}+',\r\n doorsOpen: 'Puertas abren {time}',\r\n venue: 'Lugar',\r\n generalAdmission: 'Admisión general',\r\n eventCancelled: 'Evento cancelado',\r\n salesEnded: 'Ventas cerradas',\r\n soldOut: 'Agotado',\r\n joinWaitlist: 'Unirse a la lista de espera',\r\n getNotifiedWhenAvailable: 'Te avisamos cuando haya boletos disponibles',\r\n reserve: 'Reservar',\r\n reserveASpot: 'Reservar un lugar',\r\n secureCheckout: 'Pago seguro',\r\n from: 'Desde',\r\n startsFrom: 'Desde',\r\n free: 'Gratis',\r\n inclFee: 'incl. {fee} de cargo',\r\n includingFee: 'incluye {fee} de cargo por servicio',\r\n originalPrice: 'Precio original:',\r\n ticketPurchase: 'Compra de boletos',\r\n ticketPurchaseOptions: 'Opciones de compra de boletos',\r\n loadingPrice: 'Cargando precio',\r\n discountApplied: 'Descuento aplicado',\r\n unlocked: 'Desbloqueado',\r\n salesStart: 'Las ventas comienzan {salesStart}',\r\n salesEndPrefix: 'Las ventas terminan',\r\n quantity: 'Cantidad:',\r\n quantityNoun: 'cantidad',\r\n decreaseQuantity: 'Reducir la cantidad de {title}',\r\n increaseQuantity: 'Aumentar la cantidad de {title}',\r\n quantitySelector: 'Selector de cantidad para {title}',\r\n donationAmountLabel: 'Monto de la donación en dólares',\r\n minimumDonation: 'Mínimo $1.00',\r\n inNMinute: 'en {n} minuto',\r\n inNMinutes: 'en {n} minutos',\r\n inNHour: 'en {n} hora',\r\n inNHours: 'en {n} horas',\r\n tomorrowAtTime: 'mañana a las {time}',\r\n onDayAtTime: 'el {day} a las {time}',\r\n onDate: 'el {date}',\r\n noTicketsAvailable: 'No hay boletos disponibles',\r\n noTicketsAvailableDescription:\r\n 'Por ahora no hay boletos disponibles para este evento',\r\n availableTickets: 'Boletos disponibles',\r\n selectedTickets: 'Boletos seleccionados',\r\n other: 'Otros',\r\n ticketsInSection: 'Boletos en {section}',\r\n subtotal: 'Subtotal',\r\n serviceFees: 'Cargos por servicio',\r\n fees: 'Cargos',\r\n taxes: 'Impuestos',\r\n promoDiscount: 'Descuento promocional',\r\n total: 'Total',\r\n priceUnavailable:\r\n 'No pudimos cargar el precio de este pedido — actualiza la página o comunícate con el lugar',\r\n orderBreakdown: 'Desglose del pedido',\r\n priceBreakdown: 'Desglose del precio',\r\n yourDetails: 'Tus datos',\r\n billingInformation: 'Datos de facturación',\r\n firstName: 'Nombre',\r\n lastName: 'Apellido',\r\n emailAddress: 'Correo electrónico',\r\n phoneNumber: 'Teléfono',\r\n keepMeUpdated: 'Quiero recibir novedades y más eventos',\r\n subscribeToUpdates: 'Suscribirme a novedades y avisos de eventos',\r\n ticketN: 'Boleto {index} - {name}',\r\n sameAsPersonalDetails: 'Igual que los datos personales',\r\n payment: 'Pago',\r\n payWith: 'Pagar con',\r\n paymentMethodSelection: 'Selección del método de pago',\r\n creditOrDebitCard: 'Tarjeta de crédito o débito',\r\n applePay: 'Apple Pay',\r\n googlePay: 'Google Pay',\r\n cardPaymentForm: 'Formulario de pago con tarjeta',\r\n payWithCard: 'Pagar con tarjeta de crédito o débito',\r\n payWithApplePay: 'Pagar con Apple Pay',\r\n payWithGooglePay: 'Pagar con Google Pay',\r\n placeOrder: 'Confirmar pedido',\r\n processing: 'Procesando...',\r\n processingYourOrder: 'Procesando tu pedido',\r\n termsPrefix: 'Al elegir Confirmar pedido, acepto los',\r\n termsOfService: 'términos del servicio',\r\n termsAndConditions: 'Términos y condiciones',\r\n agreeToTerms: 'Acepto los',\r\n termsAndConditionsLink: 'términos y condiciones',\r\n haveAGiftCard: '¿Tienes una tarjeta de regalo?',\r\n addAnotherGiftCard: 'Agregar otra tarjeta de regalo',\r\n giftCardAlreadyApplied: 'Esa tarjeta de regalo ya está aplicada',\r\n enterGiftCardCode: 'Ingresa el código de la tarjeta de regalo',\r\n apply: 'Aplicar',\r\n giftCardApplied: 'Tarjeta de regalo aplicada',\r\n removeGiftCard: 'Quitar la tarjeta de regalo',\r\n appliedToOrder: 'Aplicado al pedido',\r\n fullyCoveredByGiftCard: 'Cubierto por completo con la tarjeta de regalo',\r\n remainingToPay: 'Queda por pagar',\r\n invalidGiftCardCode: 'El código de la tarjeta de regalo no es válido',\r\n failedToApplyGiftCard:\r\n 'No se pudo aplicar la tarjeta de regalo. Inténtalo de nuevo',\r\n failedToRemoveGiftCard:\r\n 'No se pudo quitar la tarjeta de regalo. Inténtalo de nuevo',\r\n giftCardNoPaymentRequired: 'No se requiere pago',\r\n giftCardCompleteOrder: 'Completar el pedido',\r\n havePromoCode: '¿Tienes un código promocional?',\r\n promoCode: 'Código promocional',\r\n promoCodeEntry: 'Ingreso del código promocional',\r\n remove: 'Quitar',\r\n checking: 'Comprobando...',\r\n pleaseEnterPromoCode: 'Ingresa un código promocional',\r\n invalidOrExpiredPromoCode: 'El código promocional no es válido o ya expiró',\r\n unableToValidatePromoCode:\r\n 'No pudimos validar el código promocional. Inténtalo de nuevo',\r\n hiddenTicketsVisible: 'Ya puedes ver los boletos ocultos',\r\n dollarDiscountAvailable: 'Hay un descuento de {amount} disponible',\r\n percentDiscountAvailable: 'Hay un descuento del {amount}% disponible',\r\n promoApplied: '{code} aplicado',\r\n removePromoCode: 'Quitar el código promocional',\r\n applyPromoCode: 'Aplicar el código promocional',\r\n checkingPromoCode: 'Comprobando el código promocional',\r\n waitlistTitle: 'Este show está agotado',\r\n waitlistDescription: '¿Quieres que te avisemos si hay entradas disponibles?',\r\n waitlistEmailLabel: 'Correo electrónico',\r\n waitlistEmailPlaceholder: 'tu@ejemplo.com',\r\n waitlistPhonePlaceholder: '(555) 123-4567',\r\n pleaseEnterValidEmail: 'Ingresa un correo electrónico válido',\r\n pleaseEnterValidEmailAddress:\r\n 'Ingresa una dirección de correo electrónico válida',\r\n pleaseEnterValidPhone: 'Ingresa un número de teléfono válido',\r\n smsOptIn: 'Envíame un mensaje de texto cuando haya entradas disponibles',\r\n smsDisclaimer:\r\n 'Pueden aplicarse tarifas de mensajes y datos. Responde STOP para darte de baja',\r\n joining: 'Uniéndote...',\r\n notifyMe: 'Avísame',\r\n done: 'Listo',\r\n cancel: 'Cancelar',\r\n youreOnTheList: 'Estás en la lista de espera',\r\n waitlistAdded: 'Estás en la lista de espera para {eventName}',\r\n waitlistNotifyByEmail: 'Te avisaremos si hay entradas disponibles',\r\n waitlistSmsAlerts: 'También recibirás alertas por SMS',\r\n waitlistLinkExpired: 'Este enlace ha expirado. Sigues en la lista de espera',\r\n waitlistLinkUsed: 'Este enlace ya se ha usado. Sigues en la lista de espera',\r\n waitlistLinkEmailMismatch:\r\n 'Este enlace se envió a otra dirección de correo. Sigues en la lista de espera',\r\n waitlistLinkInventoryExhausted:\r\n 'Esos boletos acaban de reclamarse. Sigues en la lista de espera — te avisaremos por correo si se liberan más',\r\n waitlistLinkInvalid:\r\n 'Este enlace no es válido. Sigues en la lista de espera — te avisaremos por correo si se liberan boletos',\r\n checkout: 'Finalizar compra',\r\n unableToReserveTickets: 'No se pudieron reservar los boletos',\r\n connectionIssue: 'Problema de conexión',\r\n cartFailedMessage:\r\n 'No pudimos reservar tus boletos. Puede ser un problema de conexión, o puede que los boletos ya no estén disponibles',\r\n pleaseGoBackAndTryAgain: 'Vuelve atrás e inténtalo de nuevo',\r\n cartSuccessMessage: 'Tus boletos están reservados y apartados para ti',\r\n cartSuccessNetworkError:\r\n 'Aun así, hubo un problema de conexión. Actualiza la página para continuar con el pago',\r\n refreshPage: 'Actualizar la página',\r\n limitedAvailability: 'Disponibilidad limitada',\r\n onlyNAvailable: 'Solo quedan {available} (seleccionaste {requested})',\r\n soldOutYouSelected: 'Agotado (seleccionaste {requested})',\r\n ticketsNoLongerAvailableMessage:\r\n 'Algunos boletos que seleccionaste ya no están disponibles en las cantidades pedidas:',\r\n ticketAvailabilityChanges: 'Cambios en la disponibilidad de boletos',\r\n continueWithAvailable: 'Continuar con los disponibles',\r\n cartExpiredTitle: 'Tu carrito ha expirado',\r\n cartExpiredMessage:\r\n 'Tu carrito ha expirado. Por favor inicia tu compra de nuevo',\r\n startOver: 'Empezar de nuevo',\r\n noCheckoutSession:\r\n 'No encontramos una sesión de pago. Selecciona primero tus boletos',\r\n failedToCreatePaymentIntent:\r\n 'No se pudo iniciar el cobro. Inténtalo de nuevo',\r\n paymentConfigError: 'Error en la configuración del pago. Inténtalo de nuevo',\r\n failedToInitPayment: 'No se pudo inicializar el pago. Inténtalo de nuevo',\r\n paymentFormNotReady:\r\n 'El formulario de pago aún no está listo. Espera un momento e inténtalo de nuevo',\r\n paymentSystemNotInitialized:\r\n 'El sistema de pago no se inicializó. Actualiza la página',\r\n paymentAmountMismatch:\r\n 'El monto del pago no coincide. Actualiza la página e inténtalo de nuevo',\r\n paymentValidationFailed: 'No se pudo validar el pago. Inténtalo de nuevo',\r\n promoCodeNotApplied:\r\n 'No pudimos aplicar el código promocional {code}. No está incluido en este total — vuelve para introducirlo de nuevo, o continúa al precio completo',\r\n paymentReinitializing:\r\n 'Actualizando tu total. Espera un momento e inténtalo de nuevo',\r\n timeLeft: 'Tiempo restante',\r\n reservationHeld: 'Reserva apartada',\r\n completeSoon: 'Completa pronto',\r\n sessionExpiringSoon: 'Tu sesión está por expirar',\r\n sessionExpireMessage: 'Tu sesión expirará en',\r\n sessionExtendQuestion: '¿Quieres más tiempo para completar tu compra?',\r\n sessionExtendButton: 'Ampliar el tiempo (+5 min)',\r\n sessionNoThanks: 'No, gracias',\r\n sessionExtendAria: 'Ampliar la sesión 5 minutos',\r\n sessionDismissAria: 'Descartar y continuar sin ampliar',\r\n noEventIdProvided: 'No se proporcionó un identificador de evento',\r\n failedToLoadEvent: 'No se pudo cargar el evento',\r\n failedToLoadTickets: 'No se pudieron cargar los boletos',\r\n noCollectionIdProvided: 'No se proporcionó ningún ID de colección',\r\n failedToLoadCollection: 'Error al cargar la colección',\r\n failedToCompleteOrder: 'No se pudo completar el pedido. Inténtalo de nuevo',\r\n viewOrderDetails: 'Ver los detalles del pedido',\r\n partialAvailabilityContinue:\r\n '¿Quieres continuar con los boletos disponibles?',\r\n allTicketsSoldOut:\r\n 'Lamentablemente, todos los boletos que seleccionaste se agotaron',\r\n failedToLoadEventData: 'No se pudieron cargar los datos del evento',\r\n ticketFallbackName: 'Boleto',\r\n paymentNotConfirmedTitle: 'Pago sin confirmar',\r\n paymentNotConfirmedMessage:\r\n 'Todavía no podemos confirmar este pago. Si se completa, recibirás un correo de confirmación en breve — no vuelvas a intentarlo hasta entonces',\r\n paymentNotCompletedTitle: 'El pago no se completó',\r\n paymentNotCompletedMessage:\r\n 'El pago no se procesó, así que no se emitieron boletos. Puedes volver al evento e intentarlo de nuevo',\r\n backToEvent: 'Volver al evento',\r\n ariaEventBooking: 'Reserva del evento',\r\n ariaGetTickets: 'Comprar boletos',\r\n ariaItemTotal: 'Total del artículo',\r\n ariaCloseAndReturn: 'Cerrar y volver al inicio',\r\n ariaEventDateTime: 'Fecha y hora del evento',\r\n ariaOrderTotal: 'Total del pedido: {total}',\r\n giftCardRecipientInfo: 'Datos del destinatario',\r\n giftCardRecipientName: 'Nombre del destinatario',\r\n giftCardRecipientNamePlaceholder: 'Ingresa el nombre del destinatario',\r\n giftCardRecipientNameRequired: 'El nombre del destinatario es obligatorio',\r\n giftCardRecipientEmail: 'Correo del destinatario',\r\n giftCardRecipientEmailPlaceholder: 'Ingresa el correo del destinatario',\r\n giftCardRecipientEmailRequired: 'El correo del destinatario es obligatorio',\r\n giftCardInvalidEmail: 'Ingresa una dirección de correo válida',\r\n giftCardPersonalMessage: 'Mensaje personal',\r\n giftCardOptional: '(opcional)',\r\n giftCardMessagePlaceholder:\r\n 'Escribe un mensaje personal para incluir con la tarjeta de regalo...',\r\n giftCardCharsRemaining: 'caracteres restantes',\r\n giftCardSelectAmount: 'Elige el monto',\r\n giftCardCustom: 'Personalizado',\r\n giftCardCustomAmountAria: 'Monto personalizado',\r\n giftCardAmountHelp: 'Ingresa un monto entre $1.00 y $500.00',\r\n giftCardInvalidAmount: 'Ingresa un monto válido',\r\n giftCardMinAmount: 'El monto mínimo es $1.00',\r\n giftCardMaxAmount: 'El monto máximo es $500.00',\r\n giftCardDeliveryOptions: 'Opciones de entrega',\r\n giftCardSendImmediately: 'Enviar de inmediato',\r\n giftCardSendImmediatelyDesc:\r\n 'La tarjeta de regalo se enviará justo después de la compra',\r\n giftCardScheduleForLater: 'Programar para más tarde',\r\n giftCardScheduleDesc: 'Elige una fecha y hora',\r\n giftCardDeliveryDate: 'Fecha de entrega',\r\n giftCardDeliveryTime: 'Hora de entrega',\r\n giftCardDeliveryDateMax: 'La entrega puede programarse con hasta 1 año de antelación',\r\n giftCardScheduledFor: 'Programado para:',\r\n locale: 'es',\r\n ticketAriaLabel: 'Boleto de {title}',\r\n ticketSoldOutSuffix: ', agotado',\r\n ticketSalesNotStartedSuffix: ', las ventas aún no comienzan',\r\n ticketSalesEndedSuffix: ', ventas cerradas',\r\n discountedPriceLabel: 'Precio con descuento',\r\n priceLabel: 'Precio',\r\n statusLabel: 'Estado:',\r\n checkoutFormLabel: 'Formulario de pago',\r\n loadingContent: 'Cargando contenido',\r\n loadingTicketInfo: 'Cargando la información del boleto',\r\n loadingOrderSummary: 'Cargando el resumen del pedido',\r\n close: 'Cerrar',\r\n selectShowtimeFor: 'Selecciona el horario para {name}',\r\n viewShowtimes: 'Ver horarios',\r\n pickAShowtime: 'Elige un horario',\r\n checkBackSoon: 'Vuelve pronto para ver nuevos shows',\r\n nUpcomingDates: '{n} próximas fechas',\r\n nMore: '{n} más',\r\n nShows: '{n} shows',\r\n previousSlide: 'Diapositiva anterior',\r\n nextSlide: 'Siguiente diapositiva',\r\n goToSlide: 'Ir a la diapositiva {n}',\r\n eventCarousel: 'Carrusel de eventos',\r\n hasEvents: 'Tiene eventos',\r\n viewMode: 'Modo de vista',\r\n goToCurrentMonth: 'Ir al mes actual',\r\n nShowtimes: '{n} horarios',\r\n};\r\n"],"names":["es"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "svelte/internal/disclose-version";
|
|
2
2
|
import * as e from "svelte/internal/client";
|
|
3
|
-
import { u as B, ao as j, ap as O, ba as G, bb as M, aq as U, bc as W, D as R, ak as Q, Q as Z, au as $, aj as J, bd as X } from "./VenueCalendar-
|
|
3
|
+
import { u as B, ao as j, ap as O, ba as G, bb as M, aq as U, bc as W, D as R, ak as Q, Q as Z, au as $, aj as J, bd as X } from "./VenueCalendar-BDW-jkLN.js";
|
|
4
4
|
import { d as F } from "./labels-Dna_YObX.js";
|
|
5
|
-
import { T as v } from "./Text-
|
|
5
|
+
import { T as v } from "./Text-BjAFX0Oh.js";
|
|
6
6
|
var Y = e.from_svg('<path d="M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM112,184a8,8,0,0,1-16,0V132.94l-4.42,2.22a8,8,0,0,1-7.16-14.32l16-8A8,8,0,0,1,112,120Zm56-8a8,8,0,0,1,0,16H136a8,8,0,0,1-6.4-12.8l28.78-38.37A8,8,0,1,0,145.07,132a8,8,0,1,1-13.85-8A24,24,0,0,1,176,136a23.76,23.76,0,0,1-4.84,14.45L152,176ZM48,80V48H72v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80Z"></path>'), K = e.from_svg('<rect x="40" y="40" width="176" height="176" rx="8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></rect><line x1="176" y1="24" x2="176" y2="56" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line><line x1="80" y1="24" x2="80" y2="56" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line><line x1="40" y1="88" x2="216" y2="88" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line><polyline points="88 128 104 120 104 184" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></polyline><path d="M138.14,128a16,16,0,1,1,26.64,17.63L136,184h32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></path>', 1), ee = e.from_svg('<svg aria-hidden="true" viewBox="0 0 256 256" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><!></svg>');
|
|
7
7
|
function fe(s, t) {
|
|
8
8
|
e.push(t, !0);
|
|
@@ -676,4 +676,4 @@ export {
|
|
|
676
676
|
_e as f,
|
|
677
677
|
ke as g
|
|
678
678
|
};
|
|
679
|
-
//# sourceMappingURL=index-
|
|
679
|
+
//# sourceMappingURL=index-EHtVTS-p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-EHtVTS-p.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/phosphor/CalendarIcon.svelte","../src/lib/api/cta.ts","../src/lib/public-calendar-flow/defaults.ts","../src/lib/public-calendar-flow/OrderSummary.svelte","../src/lib/public-calendar-flow/i18n/locales/es.js","../src/lib/public-calendar-flow/i18n/index.js"],"sourcesContent":["<script lang=\"ts\">\n /**\n * Calendar — Phosphor icon (canonical Micdrop icon family).\n * Outline by default; pass `weight=\"fill\"` for solid, or let a stateful parent\n * (NavItem / Tabs / BottomNav / status badge) drive it via icon-weight context.\n */\n import { useIconWeight, type IconWeight } from './iconWeight.js';\n\n interface Props {\n /** Pixel size (width + height). */\n size?: string;\n /** Icon color; defaults to `currentColor` (inherits text color). */\n color?: string;\n /** Extra classes. */\n class?: string;\n /** `regular` (outline) or `fill` (solid). Overrides ambient state weight. */\n weight?: IconWeight;\n }\n\n let { size = '24', color = 'currentColor', class: className = '', weight }: Props = $props();\n\n const ctx = useIconWeight();\n let resolved: IconWeight = $derived(weight ?? ctx?.weight ?? 'regular');\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n style:color={color === 'currentColor' ? undefined : color}\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n {#if resolved === 'fill'}<path d=\"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM112,184a8,8,0,0,1-16,0V132.94l-4.42,2.22a8,8,0,0,1-7.16-14.32l16-8A8,8,0,0,1,112,120Zm56-8a8,8,0,0,1,0,16H136a8,8,0,0,1-6.4-12.8l28.78-38.37A8,8,0,1,0,145.07,132a8,8,0,1,1-13.85-8A24,24,0,0,1,176,136a23.76,23.76,0,0,1-4.84,14.45L152,176ZM48,80V48H72v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80Z\"/>{:else}<rect x=\"40\" y=\"40\" width=\"176\" height=\"176\" rx=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"176\" y1=\"24\" x2=\"176\" y2=\"56\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"80\" y1=\"24\" x2=\"80\" y2=\"56\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"40\" y1=\"88\" x2=\"216\" y2=\"88\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><polyline points=\"88 128 104 120 104 184\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M138.14,128a16,16,0,1,1,26.64,17.63L136,184h32\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>{/if}\n</svg>\n","/**\r\n * CTA state computation.\r\n *\r\n * Pure function (no I/O) — derives the buy-button state from an event and\r\n * its ticket list. Lives in `api/` because it is the canonical, single\r\n * source of truth that replaces the duplicate implementations previously\r\n * scattered across utils/api.js, core/api-client.js, and a few components.\r\n */\r\n\r\n// Import from the specific subpath (not the bare entry) so the api/\r\n// bundle doesn't pull in the entire SC component graph (Accordion etc.)\r\n// and break `npm run build:api`. `formatLocal` is the sanctioned browser-local\r\n// (no-timezone) Intl label home — these \"On sale …\" countdown labels render in\r\n// the viewer's own clock, so no venue timezone applies. The datetime subpath is\r\n// leaf/component-free; only `formatLocal` (→ Intl) is pulled, no date-fns.\r\nimport {\r\n browserNow,\r\n compareInstants,\r\n formatLocal,\r\n toInstantOrNull,\r\n} from '@getmicdrop/svelte-components/datetime';\r\n// Hidden-ticket predicate from the `/transforms` leaf subpath (no component\r\n// graph, so `npm run build:api` stays clean). SC's copy was pinned FROM this\r\n// body (dedup #392) and additionally honours the backend-resolved\r\n// `effectiveSales*` window for relative-offset tickets (#388). Imported (not\r\n// just re-exported) so it stays in local scope for `computeCtaState` below.\r\nimport { isHiddenTicketPurchasable } from '@getmicdrop/svelte-components/transforms';\r\n\r\nexport interface CtaStateOptions {\r\n cancelled?: boolean;\r\n isRegistration?: boolean;\r\n waitlistEnabled?: boolean;\r\n}\r\n\r\nexport interface CtaState {\r\n text: string;\r\n disabled: boolean;\r\n reason:\r\n | 'cancelled'\r\n | 'event_past'\r\n | 'no_tickets'\r\n | 'available'\r\n | 'coming_soon'\r\n | 'sold_out_waitlist'\r\n | 'sold_out'\r\n | 'sales_ended'\r\n | 'hidden_only';\r\n}\r\n\r\ninterface CtaEvent {\r\n startDateTime?: string | null;\r\n endDateTime?: string | null;\r\n hasPurchasableHiddenTickets?: boolean;\r\n}\r\n\r\ninterface CtaTicket {\r\n salesChannel?: number;\r\n salesBegin?: string | null;\r\n salesStart?: string | null;\r\n saleBegin?: string | null;\r\n onSaleStart?: string | null;\r\n salesEnd?: string | null;\r\n saleEnd?: string | null;\r\n onSaleEnd?: string | null;\r\n remainingCapacity?: number | null;\r\n quantityRemaining?: number | null;\r\n quantity?: number | null;\r\n soldOut?: boolean;\r\n isHidden?: boolean;\r\n visibility?: number;\r\n}\r\n\r\n// A hidden ticket (visibility>=2 or isHidden) that's still on sale drives the\r\n// \"Sales ended\" / \"Sold out\" / \"No tickets\" → \"Get tickets\" override. The user\r\n// just needs the promo code to see it. Re-exported from the SC canonical so\r\n// existing consumers (cta.test.ts, computeCtaState) keep their import path while\r\n// the single-source body lives in SC (dedup #392).\r\nexport { isHiddenTicketPurchasable };\r\n\r\nexport function computeCtaState(\r\n event: CtaEvent,\r\n tickets: CtaTicket[] | undefined,\r\n options: CtaStateOptions = {}\r\n): CtaState {\r\n const {\r\n cancelled = false,\r\n isRegistration = false,\r\n waitlistEnabled = false,\r\n } = options;\r\n const now = browserNow();\r\n\r\n if (cancelled)\r\n return { text: 'Cancelled', disabled: true, reason: 'cancelled' };\r\n\r\n const eventEnd = toInstantOrNull(event.endDateTime || event.startDateTime);\r\n if (eventEnd && compareInstants(eventEnd, now) < 0) {\r\n return { text: 'Sales ended', disabled: true, reason: 'event_past' };\r\n }\r\n\r\n const hiddenAvailable =\r\n event?.hasPurchasableHiddenTickets === true ||\r\n (Array.isArray(tickets) && tickets.some(isHiddenTicketPurchasable));\r\n\r\n const publicTickets = (tickets || []).filter(\r\n t =>\r\n t.salesChannel !== 2 &&\r\n !t.isHidden &&\r\n !(typeof t.visibility === 'number' && t.visibility >= 2)\r\n );\r\n if (publicTickets.length === 0) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n return {\r\n text: 'No tickets available',\r\n disabled: true,\r\n reason: 'no_tickets',\r\n };\r\n }\r\n\r\n let hasPurchasable = false;\r\n let allSoldOut = true;\r\n let allComingSoon = true;\r\n let earliestSalesStart: Date | null = null;\r\n\r\n for (const ticket of publicTickets) {\r\n const salesBegin = toInstantOrNull(\r\n ticket.salesBegin ||\r\n ticket.salesStart ||\r\n ticket.saleBegin ||\r\n ticket.onSaleStart\r\n );\r\n const salesEnd = toInstantOrNull(\r\n ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd\r\n );\r\n const remaining =\r\n ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\r\n const isSoldOut =\r\n ticket.soldOut ||\r\n (remaining !== null && remaining !== undefined && remaining <= 0);\r\n\r\n const isScheduled = salesBegin\r\n ? compareInstants(salesBegin, now) > 0\r\n : false;\r\n const hasSalesEnded = salesEnd ? compareInstants(salesEnd, now) < 0 : false;\r\n const isPurchasable = !isSoldOut && !isScheduled && !hasSalesEnded;\r\n\r\n if (isPurchasable) hasPurchasable = true;\r\n if (!isSoldOut) allSoldOut = false;\r\n if (!isScheduled) allComingSoon = false;\r\n\r\n if (isScheduled && salesBegin && !isSoldOut && !hasSalesEnded) {\r\n if (\r\n !earliestSalesStart ||\r\n compareInstants(salesBegin, earliestSalesStart) < 0\r\n ) {\r\n earliestSalesStart = salesBegin;\r\n }\r\n }\r\n }\r\n\r\n if (hasPurchasable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'available',\r\n };\r\n }\r\n\r\n if (allComingSoon && earliestSalesStart) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n const diffMs = compareInstants(earliestSalesStart, now);\r\n const diffHours = diffMs / (1000 * 60 * 60);\r\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\r\n // Viewer-local time label (\"8:00 PM\") — the shape shared by the <24h branch\r\n // and the >7d composite. Matches the deprecated `formatTime(d,{hour12:true})`\r\n // defaults-merge exactly.\r\n const timeLabel = (d: Date) =>\r\n formatLocal(\r\n d,\r\n { hour: 'numeric', minute: '2-digit', hour12: true },\r\n 'en-US'\r\n );\r\n let dateText: string;\r\n if (diffHours < 24) {\r\n dateText = timeLabel(earliestSalesStart);\r\n } else if (diffDays <= 7) {\r\n dateText = formatLocal(\r\n earliestSalesStart,\r\n { weekday: 'short', hour: 'numeric', minute: '2-digit', hour12: true },\r\n 'en-US'\r\n );\r\n } else {\r\n const d = formatLocal(\r\n earliestSalesStart,\r\n { month: 'short', day: 'numeric' },\r\n 'en-US'\r\n );\r\n dateText = `${d} ${timeLabel(earliestSalesStart)}`;\r\n }\r\n return {\r\n text: `On sale ${dateText}`,\r\n disabled: true,\r\n reason: 'coming_soon',\r\n };\r\n }\r\n\r\n if (allSoldOut) {\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n if (waitlistEnabled) {\r\n return {\r\n text: 'Join Waitlist',\r\n disabled: false,\r\n reason: 'sold_out_waitlist',\r\n };\r\n }\r\n return { text: 'Sold out', disabled: true, reason: 'sold_out' };\r\n }\r\n\r\n if (hiddenAvailable) {\r\n return {\r\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\r\n disabled: false,\r\n reason: 'hidden_only',\r\n };\r\n }\r\n\r\n return { text: 'Sales ended', disabled: true, reason: 'sales_ended' };\r\n}\r\n","// @currency-escape: feeCents / 100 in calculateServiceFee is arithmetic,\r\n// not display. Produces a dollar-magnitude number used in the fee formula\r\n// `price * (feePercentage / 100) + feeCents / 100`. Per Atlas\r\n// utility-currency convergence record; the no-handrolled-currency\r\n// ESLint rule's divideByHundred detector treats variable-name `Cents`\r\n// as drift but here it's real math.\r\n\r\n// Premium Ticket Experience — Constants & Defaults\r\n// Used by all design variants. DO NOT MODIFY per-variant.\r\n\r\n// This file is the canonical formatter module for public-calendar-flow: it\r\n// wraps + re-exports the timezone-aware production date/time formatters, plus\r\n// the shared sales-countdown formatter (formatSmartSalesDate) hoisted into\r\n// svelte-components (SC #471). No raw Intl date formatting lives here anymore.\r\n\r\nimport type {\r\n EventData,\r\n TicketTypeData,\r\n ScarcityLevel,\r\n CtaConfig,\r\n PromoCodeState,\r\n} from './types';\r\nimport { computeCtaState } from '$lib/api';\r\nimport {\r\n computeScarcityLevel,\r\n SCARCITY_THRESHOLDS,\r\n} from '$lib/constants/scarcity';\r\nimport type { Cents } from '@getmicdrop/svelte-components';\r\nimport { roundCurrency } from '@getmicdrop/svelte-components';\r\nimport {\r\n formatCurrency,\r\n formatSmartSalesDate,\r\n} from '@getmicdrop/svelte-components/utils/formatters';\r\nimport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n} from '$lib/utils/datetime.js';\r\n\r\n// --- Re-export production date/time formatters (timezone-aware) ---\r\nexport {\r\n formatFullDate,\r\n formatFullDateCompact,\r\n formatEventTime,\r\n formatTimeRange,\r\n formatDoorsTime,\r\n formatSalesDate,\r\n formatBrowseDate,\r\n formatEventDate,\r\n formatCleanTimeRange,\r\n getDateParts,\r\n};\r\n\r\n// Shared sales-countdown formatter, adopted from svelte-components (SC #471).\r\n// Kept as a re-export so public-calendar-flow consumers import it from this\r\n// module unchanged. English defaults match VC's prior copy; the clock time,\r\n// weekday, and \"tomorrow\" calendar-day identity all resolve in the viewer's\r\n// timezone, or in `labels.timeZone` when a caller pins one (SC #772).\r\n//\r\n// This module used to document the clock as UTC. That was the vc#446 bug, not\r\n// a decision: the clock hardcoded UTC while the weekday beside it rendered\r\n// viewer-local, so the pair could name a wall clock the buyer never had.\r\nexport { formatSmartSalesDate };\r\n\r\n// --- Scarcity Badge Rules ---\r\n// Threshold logic lives in the ONE canonical computeScarcityLevel\r\n// ($lib/constants/scarcity) — including the sliding floor/cap that keeps a\r\n// 1,000-seat show from flagging \"Selling fast\" at 200 left. This module only\r\n// adapts the canon's tier enum ('sold-out'/'plenty') to public-calendar-flow's\r\n// display enum ('sold_out'/'none') and renders the copy.\r\nexport function getScarcityLevel(\r\n remaining: number,\r\n total: number\r\n): ScarcityLevel {\r\n const level = computeScarcityLevel(remaining, total);\r\n if (level === 'sold-out') return 'sold_out';\r\n if (level === 'plenty') return 'none';\r\n return level; // 'urgent' | 'low' — identical between the two enums\r\n}\r\n\r\nexport function getScarcityText(\r\n level: ScarcityLevel,\r\n remaining: number,\r\n context: 'browse' | 'event' | 'ticket',\r\n options?: { isFree?: boolean }\r\n): string | null {\r\n if (level === 'none') return null;\r\n if (level === 'sold_out') return 'Sold out';\r\n // No scarcity badges on free events/tickets — nothing to lose = no urgency\r\n if (options?.isFree) return null;\r\n if (\r\n level === 'urgent' &&\r\n context !== 'browse' &&\r\n remaining <= SCARCITY_THRESHOLDS.MAX_EXACT_COUNT\r\n ) {\r\n return `Only ${remaining} left`;\r\n }\r\n if (level === 'low' || level === 'urgent') return 'Selling fast';\r\n return null;\r\n}\r\n\r\n// --- CTA Rules ---\r\n// Delegates to production computeCtaState() but adapts our EventData shape.\r\n// Components keep calling getCtaConfig(event) — internal logic is production-aligned.\r\nexport function getCtaConfig(event: EventData): CtaConfig {\r\n // Map our EventData tickets to the shape computeCtaState expects.\r\n // `isHidden` flows through so computeCtaState can apply the hidden-only\r\n // \"Sales ended\" → \"Get tickets\" override (MIC-1039).\r\n const apiTickets = event.tickets.map(t => ({\r\n salesBegin: t.salesStartDate,\r\n salesEnd: t.salesEndDate,\r\n remainingCapacity: t.quantityAvailable,\r\n totalCapacity: t.quantityTotal,\r\n soldOut: t.status === 'sold_out',\r\n salesChannel: 1, // All our tickets are online (not \"at the door only\")\r\n isHidden: t.isHidden,\r\n }));\r\n\r\n // Handle statuses that computeCtaState doesn't compute from tickets\r\n if (event.status === 'cancelled') {\r\n return {\r\n text: 'Cancelled',\r\n disabled: true,\r\n reason: 'This event has been cancelled',\r\n };\r\n }\r\n if (event.status === 'past') {\r\n return {\r\n text: 'Event ended',\r\n disabled: true,\r\n reason: 'This event has ended',\r\n };\r\n }\r\n\r\n const result = computeCtaState(\r\n { startDateTime: event.startDateTime, endDateTime: event.endDateTime },\r\n apiTickets,\r\n {\r\n cancelled: false,\r\n isRegistration: event.isRegistrationEvent,\r\n waitlistEnabled: false,\r\n }\r\n );\r\n\r\n return {\r\n text: result.text,\r\n disabled: result.disabled,\r\n reason: result.disabled ? toFriendlyReason(result.reason) : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * computeCtaState() returns machine-enum reasons ('event_past', 'sold_out',\r\n * 'coming_soon', etc) intended for branching, not display. The BookingWidget\r\n * and MobileCta render `reason` directly as supplementary copy below the\r\n * button text — which leaks raw enum strings to users.\r\n *\r\n * Map each enum to a friendly sentence, OR return undefined when the button\r\n * `text` already says everything (\"Sales ended\" / \"Sold out\" — no need for\r\n * a second line repeating it).\r\n */\r\nfunction toFriendlyReason(reason: string | undefined): string | undefined {\r\n if (!reason) return undefined;\r\n switch (reason) {\r\n case 'cancelled':\r\n return 'This event has been cancelled.';\r\n case 'event_past':\r\n return 'This event has already happened.';\r\n case 'no_tickets':\r\n return 'There are no tickets configured for this event.';\r\n case 'coming_soon':\r\n return undefined; // text already shows \"On sale <date>\"\r\n case 'sold_out':\r\n return undefined; // text already shows \"Sold out\"\r\n case 'sold_out_waitlist':\r\n return 'All tickets are claimed. Join the waitlist to be notified.';\r\n case 'sales_ended':\r\n return undefined; // text already shows \"Sales ended\"\r\n default:\r\n return undefined; // unknown enum — never leak it\r\n }\r\n}\r\n\r\n// --- Price Display Rules (from DECISIONS.md #1) ---\r\nexport function getPriceDisplay(event: EventData): string | null {\r\n const visibleTickets = event.tickets.filter(\r\n t => t.status === 'on_sale' && !t.isHidden\r\n );\r\n if (visibleTickets.length === 0) return null;\r\n\r\n const hasDonation = visibleTickets.some(\r\n t => t.isDonation || t.ticketType === 2\r\n );\r\n const paidTickets = visibleTickets.filter(\r\n t => !t.isDonation && t.ticketType !== 2\r\n );\r\n const hasFree = paidTickets.some(t => t.price === 0);\r\n const pricedTickets = paidTickets.filter(t => t.price > 0);\r\n\r\n // Only donation tickets → \"Donation\"\r\n if (pricedTickets.length === 0 && !hasFree && hasDonation) return 'Donation';\r\n\r\n // Only free tickets (no paid, no donation) → null (BookingWidget shows \"Free\" via isFreeEvent)\r\n if (pricedTickets.length === 0 && hasFree) return null;\r\n\r\n const minPrice = Math.min(...pricedTickets.map(t => t.price));\r\n\r\n // Free + paid → \"Free\" (free dominates the display). Non-donation free tickets\r\n // outrank the paid options in the headline, matching the shared \"Free\" label\r\n // every other price surface uses. Returning null here left the widget blank.\r\n if (hasFree) return 'Free';\r\n\r\n // Money display goes through the SC formatCurrency canonical (drift-c13 money\r\n // convergence), never a hand-rolled dollar template literal. Fraction digits\r\n // 0-2 reproduce the bare-dollar headline this surface has always shown (\"$25\",\r\n // \"$25.99\"), while gaining canonical thousands separators for >= $1,000 prices.\r\n const price = formatCurrency(minPrice, {\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 2,\r\n });\r\n\r\n // Donation + paid → \"From $X\" (donation is an alternative option)\r\n if (hasDonation) return `From ${price}`;\r\n\r\n // Single paid ticket type → \"$X\"\r\n if (pricedTickets.length === 1) return price;\r\n\r\n // Multiple paid ticket types → \"From $X\"\r\n return `From ${price}`;\r\n}\r\n\r\n// --- Fee Calculation ---\r\nexport function calculateFee(\r\n price: number,\r\n feePercentage: number,\r\n feeCents: Cents\r\n): number {\r\n return roundCurrency(price * (feePercentage / 100) + feeCents / 100);\r\n}\r\n\r\nexport function calculateTax(amount: number, taxPercentage: number): number {\r\n return roundCurrency(amount * (taxPercentage / 100));\r\n}\r\n\r\n// --- Date Formatting ---\r\n// PREFERRED: Use the timezone-aware production formatters re-exported above:\r\n// formatBrowseDate(iso, tz) → \"Fri, Feb 20\"\r\n// formatFullDateCompact(iso, tz) → \"Friday, February 20\"\r\n// formatEventTime(iso, tz) → \"8:00 PM\"\r\n// formatTimeRange(start, end, tz) → \"8:00 PM - 10:00 PM\"\r\n// formatDoorsTime(doors, tz) → \"7:00 PM\"\r\n\r\n// --- Animation Durations ---\r\nexport const DURATION = {\r\n instant: 100,\r\n micro: 150,\r\n fast: 200,\r\n normal: 300,\r\n slow: 400,\r\n elaborate: 600,\r\n} as const;\r\n\r\n// --- Promo Code State Factory ---\r\nexport function createDefaultPromoState(): PromoCodeState {\r\n return {\r\n code: '',\r\n isApplied: false,\r\n isValidating: false,\r\n error: '',\r\n hint: '',\r\n discountAmount: 0,\r\n discountType: '',\r\n discountTicketIds: [],\r\n revealHiddenTickets: false,\r\n revealTicketIds: [],\r\n };\r\n}\r\n\r\n// --- Ticket helpers ---\r\nexport function getAvailableTickets(\r\n tickets: TicketTypeData[]\r\n): TicketTypeData[] {\r\n return tickets.filter(t => !t.isHidden && t.status === 'on_sale');\r\n}\r\n","<!-- @style-escape: widget-intentional. -->\n<script lang=\"ts\">\n import { defaultLabels } from '$lib/public-calendar-flow/i18n/labels.js';\n import { Text, formatCurrency, toUSD } from '@getmicdrop/svelte-components';\n import type { OrderTotals } from '$lib/public-calendar-flow/types';\n import { formatPriceOrFree } from '$lib/core';\n import { DURATION } from '$lib/public-calendar-flow/defaults';\n\n interface Props {\n orderTotals: OrderTotals;\n labels?: Record<string, string>;\n /**\n * Which section to render.\n * - `full` (default): ticket lines + totals stacked together.\n * - `lines` : ticket-line items only. Use when the parent scrolls\n * this section in a flex column.\n * - `totals` : subtotal/fees/taxes/promo/total only. Use in a fixed\n * footer alongside the action button.\n *\n * Splitting via `lines` / `totals` lets the sticky sidebars scroll\n * just the variable-length ticket list while keeping the summary\n * block and CTA always visible.\n */\n mode?: 'full' | 'lines' | 'totals';\n }\n\n let { orderTotals, labels = defaultLabels, mode = 'full' }: Props = $props();\n\n // A missing wire price renders an em-dash, never a coerced $0 (mf#2383 /\n // vc#619). A genuine free/zero value is a real number and formats normally.\n const PRICE_DASH = '—';\n function moneyOrDash(value: number | null): string {\n return value == null ? PRICE_DASH : formatCurrency(toUSD(value));\n }\n</script>\n\n<div class=\"space-y-2\" style=\"transition-duration: {DURATION.normal}ms;\">\n {#if mode !== 'totals'}\n <!-- Line items -->\n {#each orderTotals.lines as line (line.ticketId)}\n <div class=\"flex justify-between\">\n <Text size=\"sm\">{line.quantity}x {line.ticketName}</Text>\n <Text size=\"sm\"\n >{#if line.subtotal == null}{PRICE_DASH}{:else if line.isDonation}{formatCurrency(\n toUSD(line.subtotal)\n )}{:else}{formatPriceOrFree(line.subtotal, labels)}{/if}</Text\n >\n </div>\n {/each}\n {/if}\n\n {#if mode !== 'lines'}\n <!-- Subtotal. In `totals` mode the parent supplies the separator above\n\t\t this block (BookingWidget wraps the totals block in border-t); a\n\t\t second internal border would render as a double line. Only show\n\t\t the internal border-t in `full` mode where lines + totals stack\n\t\t in one container with no external separator. -->\n {#if mode === 'full' && orderTotals.lines.length > 1}\n <div class=\"flex justify-between pt-1 border-t border-default\">\n <Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\n <Text size=\"sm\" color=\"muted\">{moneyOrDash(orderTotals.subtotal)}</Text>\n </div>\n {:else if orderTotals.lines.length > 1}\n <div class=\"flex justify-between\">\n <Text size=\"sm\" color=\"muted\">{labels.subtotal || 'Subtotal'}</Text>\n <Text size=\"sm\" color=\"muted\">{moneyOrDash(orderTotals.subtotal)}</Text>\n </div>\n {/if}\n\n <!-- Promo discount — directly under the subtotal so the receipt reads as a\n running total: subtotal − discount, then fees + taxes on the reduced\n base. Placing it after taxes made the on-screen arithmetic look wrong. -->\n {#if orderTotals.promoDiscount > 0}\n <div class=\"flex justify-between\">\n <Text size=\"sm\" color=\"success\"\n >{labels.promoDiscount || 'Promo discount'}</Text\n >\n <Text size=\"sm\" color=\"success\"\n >-{formatCurrency(toUSD(orderTotals.promoDiscount))}</Text\n >\n </div>\n {/if}\n\n <!-- Fees -->\n {#if orderTotals.fees > 0}\n <div class=\"flex justify-between\">\n <Text size=\"sm\" color=\"muted\"\n >{labels.serviceFees || 'Service fees'}</Text\n >\n <Text size=\"sm\" color=\"muted\"\n >{formatCurrency(toUSD(orderTotals.fees))}</Text\n >\n </div>\n {/if}\n\n <!-- Taxes -->\n {#if orderTotals.taxes > 0}\n <div class=\"flex justify-between\">\n <Text size=\"sm\" color=\"muted\">{labels.taxes || 'Taxes'}</Text>\n <Text size=\"sm\" color=\"muted\"\n >{formatCurrency(toUSD(orderTotals.taxes))}</Text\n >\n </div>\n {/if}\n\n <!-- Gift card — deduction from the amount due; `total` already reflects it -->\n {#if orderTotals.giftCardAmount > 0}\n <div class=\"flex justify-between\">\n <Text size=\"sm\" color=\"success\">{labels.giftCard || 'Gift card'}</Text>\n <Text size=\"sm\" color=\"success\"\n >-{formatCurrency(toUSD(orderTotals.giftCardAmount))}</Text\n >\n </div>\n {/if}\n\n <!-- Total -->\n <div class=\"flex justify-between pt-2 border-t border-default\">\n <Text size=\"base\" weight=\"semibold\">{labels.total || 'Total'}</Text>\n <Text size=\"base\" weight=\"semibold\">{moneyOrDash(orderTotals.total)}</Text\n >\n </div>\n {/if}\n</div>\n","/**\r\n * Spanish (es) labels for the public-calendar-flow catalogue.\r\n *\r\n * Mirrors the key set of src/lib/public-calendar-flow/i18n/labels.js\r\n * (`defaultLabels`, the English source). Anything absent here falls back to\r\n * English via the shared mergeLabels() seam — the same merge the main\r\n * $lib/i18n catalogue uses. Terminology matches $lib/i18n/locales/es.js so the\r\n * two bundles read as one es-MX voice (\"tus boletos\", \"Agotado\", \"Gratis\",\r\n * \"Finalizar compra\", etc.).\r\n *\r\n * Section comments + key order follow labels.js exactly so a reviewer can diff\r\n * the two files side by side.\r\n */\r\nexport const es = {\r\n // ── Ticket quantity controls ──────────────────────────────────────\r\n // `quantityNoun` is the lowercase composing noun (per labels.js it is NOT\r\n // the main catalogue's `quantity`, whose value is the 'Cantidad:' prefix).\r\n decrease: 'Reducir',\r\n increase: 'Aumentar',\r\n quantityNoun: 'cantidad',\r\n\r\n // ── Ticket states ─────────────────────────────────────────────────\r\n soldOut: 'Agotado',\r\n free: 'Gratis',\r\n unavailable: 'No disponible',\r\n eventSoldOut: 'Este evento está agotado',\r\n\r\n // ── Event unavailable (canceled / postponed / sales closed) ───────\r\n eventPostponed: 'Evento aplazado',\r\n eventUnavailable: 'Evento no disponible',\r\n salesClosed: 'Ventas cerradas',\r\n eventPostponedBanner:\r\n 'Este evento se ha aplazado. La venta de boletos está pausada',\r\n eventCanceledBanner: 'Este evento ya no está disponible para su compra',\r\n\r\n // ── Price display ─────────────────────────────────────────────────\r\n includesFees: 'Incluye',\r\n fees: 'cargos',\r\n fee: 'cargo',\r\n\r\n // ── Checkout CTAs ─────────────────────────────────────────────────\r\n checkout: 'Finalizar compra',\r\n getTickets: 'Comprar boletos',\r\n selectTickets: 'Selecciona los boletos',\r\n selectTicketsBelow: 'Selecciona los boletos abajo',\r\n selectTicketsToContinue: 'Selecciona boletos para continuar',\r\n reserveASpot: 'Reservar un lugar',\r\n\r\n // ── Password modal / gate ─────────────────────────────────────────\r\n enterPassword: 'Introduce la contraseña',\r\n enterEventPassword: 'Introduce la contraseña del evento',\r\n passwordRequired: 'Se requiere contraseña',\r\n passwordRequiredShort: 'Se requiere contraseña',\r\n eventRequiresPassword:\r\n 'Este evento requiere una contraseña para comprar boletos',\r\n eventRequiresPasswordAccess:\r\n 'Este evento requiere una contraseña para acceder a los boletos',\r\n enterEventPasswordToView:\r\n 'Introduce la contraseña del evento para ver los boletos',\r\n enterEventPasswordToViewAvailable:\r\n 'Introduce la contraseña del evento para ver los boletos disponibles',\r\n eventPassword: 'Contraseña del evento',\r\n password: 'Contraseña',\r\n pleaseEnterPassword: 'Introduce la contraseña del evento',\r\n pleaseEnterAPassword: 'Introduce una contraseña',\r\n eventRequiresPasswordShort: 'Este evento requiere una contraseña',\r\n unlockTickets: 'Desbloquear boletos',\r\n cancel: 'Cancelar',\r\n continue: 'Continuar',\r\n submit: 'Enviar',\r\n\r\n // ── Order summary ─────────────────────────────────────────────────\r\n subtotal: 'Subtotal',\r\n serviceFees: 'Cargos por servicio',\r\n taxes: 'Impuestos',\r\n tax: 'Impuesto',\r\n promoDiscount: 'Descuento promocional',\r\n giftCard: 'Tarjeta de regalo',\r\n total: 'Total',\r\n priceUnavailable:\r\n 'No pudimos cargar el precio de este pedido — actualiza la página o comunícate con el lugar',\r\n orderSummary: 'Resumen del pedido',\r\n yourOrder: 'Tu pedido',\r\n\r\n // ── Ticket counts (used in CTA buttons) ───────────────────────────\r\n ticket: 'boleto',\r\n tickets: 'boletos',\r\n\r\n // ── Checkout form (public-calendar-flow) ───────────────────────────────\r\n yourDetails: 'Tus datos',\r\n attendeeDetails: 'Datos del asistente',\r\n attendee: 'Asistente',\r\n sameAsPurchaser: 'Igual que el comprador',\r\n payment: 'Pago',\r\n noPaymentRequired: 'No se requiere pago',\r\n freeEventMessage:\r\n 'Este es un evento gratuito. Completa el formulario de arriba para reservar tu lugar',\r\n firstName: 'Nombre',\r\n lastName: 'Apellido',\r\n emailAddress: 'Correo electrónico',\r\n email: 'Correo electrónico',\r\n emailPlaceholder: 'tu@ejemplo.com',\r\n attendeeEmailPlaceholder: 'asistente@ejemplo.com',\r\n cardNumber: 'Número de tarjeta',\r\n cardPlaceholder: '4242 4242 4242 4242',\r\n expiryDate: 'Fecha de vencimiento',\r\n expiryPlaceholder: 'MM / AA',\r\n cvc: 'CVC',\r\n cvcPlaceholder: '123',\r\n keepMeUpdated: 'Mantenme informado sobre este evento y eventos similares',\r\n agreeToTerms: 'Acepto los',\r\n termsAndConditionsLink: 'términos y condiciones',\r\n goBack: 'Volver',\r\n goBackToEventDetails: 'Volver a los detalles del evento',\r\n loadingPaymentForm: 'Cargando el formulario de pago seguro...',\r\n\r\n // ── Ended event ───────────────────────────────────────────────────\r\n thisEventHasEnded: 'Este evento ya terminó',\r\n ticketsNoLongerAvailable: 'Ya no hay boletos disponibles para este evento',\r\n\r\n // ── Checkout form validation ──────────────────────────────────────\r\n firstNameRequired: 'El nombre es obligatorio',\r\n lastNameRequired: 'El apellido es obligatorio',\r\n emailRequired: 'El correo electrónico es obligatorio',\r\n emailInvalid: 'Ingresa una dirección de correo electrónico válida',\r\n emailInvalidShort: 'Ingresa un correo electrónico válido',\r\n cardNumberRequired: 'El número de tarjeta es obligatorio',\r\n expiryRequired: 'La fecha de vencimiento es obligatoria',\r\n cvcRequired: 'El CVC es obligatorio',\r\n mustAgreeTerms: 'Debes aceptar los términos',\r\n\r\n // ── Place order CTAs ──────────────────────────────────────────────\r\n placeOrder: 'Confirmar pedido',\r\n completeOrder: 'Completar el pedido',\r\n placingOrder: 'Confirmando el pedido...',\r\n\r\n // ── Promo code ────────────────────────────────────────────────────\r\n havePromoCode: '¿Tienes un código promocional?',\r\n promoCode: 'Código promocional',\r\n enterCode: 'Ingresa el código',\r\n apply: 'Aplicar',\r\n remove: 'Quitar',\r\n removePromoCode: 'Quitar el código promocional',\r\n applyPromoCode: 'Aplicar el código promocional',\r\n checkingPromoCode: 'Comprobando el código promocional',\r\n checking: 'Comprobando...',\r\n promoApplied: 'Promoción aplicada',\r\n\r\n // ── Navigation tabs (app-segments) ────────────────────────────────\r\n about: 'Información',\r\n ticketsTab: 'Boletos',\r\n eventSections: 'Secciones del evento',\r\n\r\n // ── Event details ─────────────────────────────────────────────────\r\n eventDetails: 'Detalles del evento',\r\n performers: 'Artistas',\r\n faq: 'Preguntas frecuentes',\r\n frequentlyAskedQuestions: 'Preguntas frecuentes',\r\n doors: 'Puertas',\r\n doorsOpenAt: 'Las puertas abren a las',\r\n\r\n // ── Series occurrences ────────────────────────────────────────────\r\n upcomingDates: 'Próximas fechas',\r\n showtimeDifferentLocation: 'Lugar diferente:',\r\n\r\n // ── Close / dismiss ───────────────────────────────────────────────\r\n closeTicketSelection: 'Cerrar la selección de boletos',\r\n closeTicketSelector: 'Cerrar el selector de boletos',\r\n\r\n // ── Accessibility ─────────────────────────────────────────────────\r\n ticketSelection: 'selección de boletos',\r\n ticketsSelected: 'boletos seleccionados',\r\n view: 'Ver',\r\n\r\n // ── Success page (public-calendar-flow) ────────────────────────────────\r\n youreIn: 'Estás dentro',\r\n youreRegistered: 'Estás registrado',\r\n confirmed: 'confirmado',\r\n viewTickets: 'Ver boletos',\r\n order: 'Pedido',\r\n confirmationSentTo: 'Confirmación enviada a',\r\n addToCalendar: 'Agregar al calendario',\r\n googleCalendar: 'Google Calendar',\r\n appleCalendar: 'Apple Calendar (.ics)',\r\n share: 'Compartir',\r\n map: 'Mapa',\r\n backToEvent: 'Volver al evento',\r\n needHelp: '¿Necesitas ayuda?',\r\n linkCopied: 'Enlace copiado al portapapeles',\r\n copyLink: 'Copia este enlace:',\r\n addToAppleWallet: 'Agregar a Apple Wallet',\r\n saveToGoogleWallet: 'Guardar en Google Wallet',\r\n walletComingSoon:\r\n 'Los pases de wallet estarán disponibles pronto. Tu boleto está confirmado — revisa tu correo electrónico',\r\n\r\n // ── Session timer / expiration modals ─────────────────────────────\r\n reservationHeld: 'Reserva apartada',\r\n completeSoon: 'Completa pronto',\r\n sessionExpiringSoon: 'Tu sesión está por expirar',\r\n sessionExpiringSoonMessage:\r\n 'Tu sesión de pago expirará en {time}. Los boletos que seleccionaste se devolverán al inventario',\r\n extensionsRemaining: 'Te queda{plural} {count} ampliación',\r\n continueCheckout: 'Continuar con el pago',\r\n okIllHurry: 'De acuerdo, me apuro',\r\n maxExtensionsReached: 'Se alcanzó el máximo de ampliaciones',\r\n wantToKeepTickets: '¿Quieres conservar tus boletos?',\r\n sessionExpiredMessage:\r\n 'Tu sesión de pago ha expirado y los boletos que seleccionaste se han liberado',\r\n sessionExpired: 'Sesión expirada',\r\n reservationTimedOut:\r\n 'Tu reserva ha expirado. Selecciona tus boletos de nuevo para continuar',\r\n keepMyTickets: 'Conservar mis boletos',\r\n selectTicketsAgain: 'Seleccionar los boletos de nuevo',\r\n extendingSession: 'Ampliando...',\r\n\r\n // ── MobileCta ─────────────────────────────────────────────────────\r\n selectTicketsLabel: 'Selecciona los boletos',\r\n collapseOrderSummary: 'Contraer el resumen del pedido',\r\n expandOrderSummary: 'Expandir el resumen del pedido',\r\n\r\n // ── Waitlist (sold-out gating + tokenized unlock) ─────────────────\r\n joinWaitlist: 'Unirse a la lista de espera',\r\n getNotifiedWhenAvailable: 'Te avisamos cuando haya boletos disponibles',\r\n waitlistLinkInvalid:\r\n 'Este enlace no es válido. Sigues en la lista de espera — te avisaremos por correo si se liberan boletos',\r\n waitlistLinkExpired: 'Este enlace ha expirado. Sigues en la lista de espera',\r\n waitlistLinkUsed: 'Este enlace ya se ha usado. Sigues en la lista de espera',\r\n waitlistLinkEmailMismatch:\r\n 'Este enlace se envió a otra dirección de correo. Sigues en la lista de espera',\r\n waitlistLinkInventoryExhausted:\r\n 'Esos boletos acaban de reclamarse. Sigues en la lista de espera — te avisaremos por correo si se liberan más',\r\n dismiss: 'Descartar',\r\n};\r\n","/**\r\n * i18n module — the public-calendar-flow (checkout / event / success)\r\n * catalogue.\r\n *\r\n * Before vc#693 this catalogue had NO locale mechanism: its `defaultLabels`\r\n * were merged straight from English, so `locale=\"es\"` translated the main\r\n * calendar surface while the buyer's checkout stayed in English — a silently\r\n * half-applied translation. It now resolves through the SAME `createI18n`\r\n * mechanism as the main catalogue (`src/lib/i18n/`); this file is just this\r\n * catalogue's instance of it.\r\n *\r\n * Resolution order (highest priority first):\r\n * 1. user-supplied `labels` prop (per-render override)\r\n * 2. locale-specific bundle (`./locales/<locale>.js`)\r\n * 3. English defaults (`./labels.js`)\r\n *\r\n * Locales bundled: `en`, `es`. A locale this catalogue does not carry (e.g.\r\n * `fr`) resolves to `en` — the buyer sees an English checkout, never a blank\r\n * or a crash. Filling the remaining platform languages here is the drain that\r\n * follows the mechanism (see vc#709), not part of vc#693.\r\n */\r\n\r\nimport { defaultLabels } from './labels.js';\r\nimport { en } from './locales/en.js';\r\nimport { es } from './locales/es.js';\r\nimport { createI18n } from '../../i18n/createI18n.js';\r\n\r\nexport { defaultLabels } from './labels.js';\r\nexport { detectLocale } from '../../i18n/createI18n.js';\r\n\r\n/** All bundled locales. Keys are BCP-47 base tags, lowercase. */\r\nconst LOCALES = { en, es };\r\n\r\nconst flowI18n = createI18n({ defaults: defaultLabels, locales: LOCALES });\r\n\r\n/**\r\n * Resolve a locale tag to a bundled locale for this catalogue.\r\n * @type {(tag?: string) => { labels: object, locale: string }}\r\n */\r\nexport const resolveLocale = flowI18n.resolveLocale;\r\n\r\n/**\r\n * Build the final checkout-flow label set for a given locale + user override.\r\n * Equivalent to defaults < locale bundle < user labels.\r\n * @type {(locale?: string, userLabels?: object) => object}\r\n */\r\nexport const getLabelsForLocale = flowI18n.getLabelsForLocale;\r\n\r\n/** List of bundled locale tags. */\r\nexport const listLocales = flowI18n.listLocales;\r\n"],"names":["size","$","$$props","color","className","ctx","useIconWeight","resolved","svg","root_2","path","root","$$render","consequent","alternate","styles","computeCtaState","event","tickets","options","cancelled","isRegistration","waitlistEnabled","now","browserNow","eventEnd","toInstantOrNull","compareInstants","hiddenAvailable","isHiddenTicketPurchasable","publicTickets","t","hasPurchasable","allSoldOut","allComingSoon","earliestSalesStart","ticket","salesBegin","salesEnd","remaining","isSoldOut","isScheduled","hasSalesEnded","diffMs","diffHours","diffDays","timeLabel","d","formatLocal","dateText","getScarcityLevel","total","level","computeScarcityLevel","getScarcityText","context","SCARCITY_THRESHOLDS","getCtaConfig","apiTickets","result","toFriendlyReason","reason","getPriceDisplay","visibleTickets","hasDonation","paidTickets","hasFree","pricedTickets","minPrice","price","formatCurrency","calculateTax","amount","taxPercentage","roundCurrency","DURATION","createDefaultPromoState","labels","defaultLabels","mode","PRICE_DASH","moneyOrDash","value","toUSD","div","root_3","node_1","line","div_1","Text","node_2","text","node_3","$0","text_2","text_3","formatPriceOrFree","consequent_1","consequent_2","div_2","root_1","node_7","node_8","text_5","div_3","node_9","node_10","text_7","consequent_3","consequent_4","div_4","node_12","node_13","consequent_5","div_5","node_15","node_16","consequent_6","div_6","node_18","node_19","consequent_7","div_7","node_21","node_22","consequent_8","div_8","node_20","node_23","node_24","text_17","consequent_9","es","LOCALES","en","flowI18n","createI18n","getLabelsForLocale"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "svelte/internal/disclose-version";
|
|
2
2
|
import * as e from "svelte/internal/client";
|
|
3
|
-
import { aW as u, aX as d } from "./VenueCalendar-
|
|
3
|
+
import { aW as u, aX as d } from "./VenueCalendar-BDW-jkLN.js";
|
|
4
4
|
var f = e.from_html("<div><!></div>");
|
|
5
5
|
function g(t, s) {
|
|
6
6
|
e.push(s, !0), u();
|
|
@@ -53,4 +53,4 @@ export {
|
|
|
53
53
|
g as M,
|
|
54
54
|
m as c
|
|
55
55
|
};
|
|
56
|
-
//# sourceMappingURL=modalManager.svelte-
|
|
56
|
+
//# sourceMappingURL=modalManager.svelte-DmLABgNg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modalManager.svelte-DmLABgNg.js","sources":["../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/ModalHeader.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/modalManager.svelte.js"],"sourcesContent":["<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { getModalContext } from './context.js';\n import { cn } from '../../utils/classNames.js';\n\n interface Props {\n class?: string;\n children?: Snippet;\n }\n\n let { class: className, children }: Props = $props();\n\n // Validates this component is inside ModalRoot\n getModalContext();\n</script>\n\n<div class={cn('shrink-0 px-6 pt-6 pb-3', className)}>\n {#if children}{@render children()}{/if}\n</div>\n","/**\n * behavior-modal-orchestration canonical (R-MODAL-1/3).\n *\n * Two rune primitives for modal open-state — pick by modal count:\n *\n * - `createModalState<T>()` — ONE modal. Replaces the dominant\n * `let showFooModal = $state(false)` + `let fooData = $state(null)` pair.\n * Use: `modal.isOpen`, `modal.data`, `modal.open(data?)`, `modal.close()`.\n *\n * - `createModalManager<Id>()` — a page with 3+ modals. Replaces N booleans\n * with one registry: `m.open(id, payload?)`, `m.close(id)`, `m.isOpen(id)`,\n * `m.payload(id)`, `m.active`, `m.closeAll()`. Coordinates exclusive-open\n * (opening one closes the others) and focus-return (focus goes back to the\n * element that was active before the first modal opened) in one place,\n * instead of the implicit-by-convention mutual exclusion seen across the\n * 4-modal accounts page and the 3-modal checkout hand-off chains.\n *\n * `createModalState` is lifted verbatim from micdrop-frontend's storeUtils\n * (zero consumers there); `createModalManager` is new — no modal coordinator\n * existed in any of the four repos.\n *\n * ## Binding to `ModalRoot` (`bind()`)\n * Both factories expose a `bind(...)` helper returning the props to spread onto a\n * `ModalRoot`, wiring its open-state to the manager:\n *\n * <ModalRoot {...modals.bind('edit')}>…</ModalRoot> // multi\n * <ModalRoot {...editModal.bind()}>…</ModalRoot> // single\n *\n * `bind()` returns a `{ get open, set open, oncancel }` object. The `open`\n * **getter** keeps `ModalRoot` reading the manager's live open-state (so opening\n * the modal anywhere re-renders it); `oncancel` closes the modal through the\n * manager. `ModalRoot`'s only self-close path (`resetModal`) always fires\n * `oncancel` before flipping its own local `open`, so escape / backdrop dismissal\n * routes back through the manager and the two never desync.\n *\n * This deliberately avoids the foot-gun it replaces: you can't write\n * `bind:open={modals.isOpen('edit')}` (a method call isn't an assignable lvalue),\n * and feeding `bind:open` a `$derived` is the read-only binding runtime bug. The\n * getter + `oncancel` spread sidesteps both — no per-page `$state` boolean, no\n * accidental derived binding. The `set open` setter completes the\n * getter/setter pair so the object also reads/writes cleanly when assigned to\n * programmatically. Scroll-lock + focus-trap stay in `ModalRoot`; the manager\n * owns only open-state, payload, exclusivity, and focus-return.\n */\n/**\n * Reactive open/close state for a single modal, with optional context data.\n *\n * @example\n * const editModal = createModalState<User>();\n * editModal.open(user); // editModal.isOpen === true, editModal.data === user\n * editModal.close(); // isOpen === false, data === null\n *\n * // Compose with ModalRoot by spreading the bind() props:\n * // <ModalRoot {...editModal.bind()}>…</ModalRoot>\n */\nexport function createModalState() {\n let isOpen = $state(false);\n let data = $state(null);\n return {\n get isOpen() {\n return isOpen;\n },\n get data() {\n return data;\n },\n open(newData) {\n data = newData ?? null;\n isOpen = true;\n },\n close() {\n isOpen = false;\n data = null;\n },\n toggle(newData) {\n if (isOpen) {\n isOpen = false;\n data = null;\n }\n else {\n data = newData ?? null;\n isOpen = true;\n }\n },\n bind() {\n return {\n get open() {\n return isOpen;\n },\n set open(value) {\n // Binding-driven open carries no data (data stays null); use the\n // explicit open(data) call when a payload is needed.\n if (value)\n isOpen = true;\n else {\n isOpen = false;\n data = null;\n }\n },\n oncancel() {\n isOpen = false;\n data = null;\n },\n };\n },\n };\n}\n/**\n * Coordinate a set of named modals on one page. See module docs for when to\n * reach for this over `createModalState`.\n *\n * @example\n * const modals = createModalManager<'create' | 'edit' | 'delete'>();\n * modals.open('edit', user);\n * modals.isOpen('edit'); // true\n * modals.payload<User>('edit');\n * modals.open('delete'); // 'edit' auto-closes (exclusive)\n * modals.closeAll(); // focus returns to the original trigger\n *\n * // Compose with ModalRoot by spreading the bind() props:\n * // <ModalRoot {...modals.bind('edit')}>…</ModalRoot>\n */\nexport function createModalManager(options = {}) {\n const exclusive = options.exclusive ?? true;\n const restoreFocus = options.restoreFocus ?? true;\n const modals = $state({});\n let returnFocusEl = null;\n function anyOpen() {\n return Object.values(modals).some((m) => m.open);\n }\n function isOpen(id) {\n return modals[id]?.open ?? false;\n }\n /** Remember the active element when transitioning from \"none open\" → \"open\". */\n function captureReturnFocus() {\n if (!restoreFocus || typeof document === 'undefined')\n return;\n if (!anyOpen()) {\n const el = document.activeElement;\n returnFocusEl = el instanceof HTMLElement ? el : null;\n }\n }\n /** Return focus to the captured trigger once everything is closed. */\n function restoreReturnFocus() {\n if (!restoreFocus)\n return;\n if (!anyOpen() && returnFocusEl) {\n returnFocusEl.focus();\n returnFocusEl = null;\n }\n }\n function open(id, payload) {\n captureReturnFocus();\n if (exclusive) {\n for (const key of Object.keys(modals)) {\n if (key !== id) {\n modals[key].open = false;\n modals[key].payload = null;\n }\n }\n }\n modals[id] = { open: true, payload: payload ?? null };\n }\n function close(id) {\n const entry = modals[id];\n if (entry) {\n entry.open = false;\n entry.payload = null;\n }\n restoreReturnFocus();\n }\n function toggle(id, payload) {\n if (isOpen(id))\n close(id);\n else\n open(id, payload);\n }\n function closeAll() {\n for (const key of Object.keys(modals)) {\n modals[key].open = false;\n modals[key].payload = null;\n }\n restoreReturnFocus();\n }\n return {\n isOpen,\n payload(id) {\n return modals[id]?.payload ?? null;\n },\n get active() {\n return Object.keys(modals).filter((key) => modals[key].open);\n },\n open,\n close,\n toggle,\n closeAll,\n bind(id) {\n return {\n get open() {\n return isOpen(id);\n },\n set open(value) {\n // Binding-driven open carries no payload; use open(id, payload) for that.\n if (value)\n open(id);\n else\n close(id);\n },\n oncancel() {\n close(id);\n },\n };\n },\n };\n}\n"],"names":["getModalContext","div","root","$0","$","cn","$$props","createModalState","isOpen","data","newData","value"],"mappings":";;;;iBAAA;iBAaEA,EAAe;MAGhBC,IAAGC,EAAA,eAAHD,CAAG;;;;;;;;;;UAAHA,CAAG,wCAAHA,GAAG,GAAAE,CAAA,GAAA,CAAA,MAAAC,EAAA,KAAQC,EAAG,2BAAyBC,EAAA,KAAA,CAAA,CAAA,CAAA,eAAvCL,CAAG;AAFI;ACyCD,SAASM,IAAmB;AAC/B,MAAIC,IAASJ,EAAA,MAAO,EAAK,GACrBK,IAAOL,EAAA,MAAO,IAAI;AACtB,SAAM;AAAA,IACF,IAAI,SAAS;AACT,mBAAOI,CAAM;AAAA,IACjB;AAAA,IACA,IAAI,OAAO;AACP,mBAAOC,CAAI;AAAA,IACf;AAAA,IACA,KAAKC,GAAS;YACVD,GAAOC,KAAW,MAAI,EAAA,GACtBN,EAAA,IAAAI,GAAS,EAAI;AAAA,IACjB;AAAA,IACA,QAAQ;AACJ,MAAAJ,EAAA,IAAAI,GAAS,EAAK,GACdJ,EAAA,IAAAK,GAAO,IAAI;AAAA,IACf;AAAA,IACA,OAAOC,GAAS;AACZ,MAAEN,EAAA,IAAEI,CAAM,KACNJ,EAAA,IAAAI,GAAS,EAAK,GACdJ,EAAA,IAAAK,GAAO,IAAI,YAGXA,GAAOC,KAAW,MAAI,EAAA,GACtBN,EAAA,IAAAI,GAAS,EAAI;AAAA,IAErB;AAAA,IACA,OAAO;AACH,aAAM;AAAA,QACF,IAAI,OAAO;AACP,uBAAOA,CAAM;AAAA,QACjB;AAAA,QACA,IAAI,KAAKG,GAAO;AAGZ,UAAIA,IAAKP,EAAA,IACLI,GAAS,EAAI,KAEbJ,EAAA,IAAAI,GAAS,EAAK,GACdJ,EAAA,IAAAK,GAAO,IAAI;AAAA,QAEnB;AAAA,QACA,WAAW;AACP,UAAAL,EAAA,IAAAI,GAAS,EAAK,GACdJ,EAAA,IAAAK,GAAO,IAAI;AAAA,QACf;AAAA;IAER;AAAA;AAER;","x_google_ignoreList":[0,1]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aC as c, at as f, aD as D, aE as m } from "./VenueCalendar-
|
|
1
|
+
import { aC as c, at as f, aD as D, aE as m } from "./VenueCalendar-BDW-jkLN.js";
|
|
2
2
|
function l(r) {
|
|
3
3
|
return r === "percentage" || r === "%";
|
|
4
4
|
}
|
|
@@ -26,4 +26,4 @@ export {
|
|
|
26
26
|
l as i,
|
|
27
27
|
o as r
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=promo-
|
|
29
|
+
//# sourceMappingURL=promo-C9oFaeEp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promo-
|
|
1
|
+
{"version":3,"file":"promo-C9oFaeEp.js","sources":["../src/lib/utils/promo.ts"],"sourcesContent":["// Canonical promo-discount resolver.\r\n//\r\n// The promo apply endpoint returns a discount as { amount, discountType } where\r\n// a percentage promo's `amount` is the raw percent (e.g. 10 for \"10%\"). The\r\n// order-summary display path stores that raw number in the per-event\r\n// `checkout-promo-discount-${eventID}` cookie and subtracts it from the\r\n// subtotal as if it were dollars — so a \"10%\" promo renders as a flat \"$10 off\"\r\n// regardless of cart size. PromocodeInput cannot fix this at write-time: it has no subtotal\r\n// (it can even auto-apply before any ticket is chosen). The correct dollar\r\n// value is subtotal-dependent, so it must be resolved wherever the subtotal is\r\n// known, using the stored discount type.\r\n//\r\n// Single source of truth for that resolution. Two discountType vocabularies\r\n// exist in the codebase — the API/cookie form ('percentage' | 'fixed') and the\r\n// per-ticket/pcf form ('%' | '$') — so both are accepted.\r\n\r\nimport {\r\n dollarsToCents,\r\n mulCents,\r\n sumCents,\r\n centsToDollars,\r\n} from '@getmicdrop/svelte-components';\r\n\r\n// The meaningful discount-type values. The resolver accepts any string (the\r\n// value comes from a cookie / promo-change event, i.e. an untyped `string`) and\r\n// treats anything that isn't a percentage marker as a fixed dollar amount.\r\nexport type PromoDiscountType =\r\n | 'percentage'\r\n | 'fixed'\r\n | '%'\r\n | '$'\r\n | ''\r\n | null\r\n | undefined;\r\n\r\ntype PromoDiscountTypeInput = PromoDiscountType | string;\r\n\r\n/**\r\n * Is this promo a percentage promo?\r\n *\r\n * Callers need this to know WHERE a promo may be shown, not just how to size\r\n * it. A percentage promo is *per-ticket*: 20% off each unit summed over the\r\n * cart is exactly 20% off the subtotal, so a ticket row can show it and still\r\n * agree with the order summary. A fixed promo is *order-level*: \"$5 off\" is\r\n * taken once against the subtotal, so a row that shows \"$5 off\" on every unit\r\n * promises `amount × (qty − 1)` more than the order will give.\r\n *\r\n * Anything that isn't a percentage marker is treated as a fixed dollar amount\r\n * (the value arrives from a cookie / promo-change event, i.e. an untyped\r\n * `string`).\r\n */\r\nexport function isPercentageDiscount(\r\n discountType: PromoDiscountTypeInput\r\n): boolean {\r\n return discountType === 'percentage' || discountType === '%';\r\n}\r\n\r\n/**\r\n * Resolve a promo discount to a dollar amount against the current subtotal.\r\n *\r\n * @param subtotal - order subtotal in dollars.\r\n * @param rawAmount - the discount value from the promo response: a percent for\r\n * a percentage promo, a dollar amount for a fixed promo.\r\n * @param discountType - 'percentage'/'%' or 'fixed'/'$' (or empty → fixed).\r\n * @returns the discount in dollars, clamped to [0, subtotal].\r\n */\r\nexport function resolvePromoDiscountDollars(\r\n subtotal: number,\r\n rawAmount: number,\r\n discountType: PromoDiscountTypeInput\r\n): number {\r\n if (!(rawAmount > 0) || !(subtotal > 0)) return 0;\r\n\r\n const dollars = isPercentageDiscount(discountType)\r\n ? (subtotal * rawAmount) / 100\r\n : rawAmount;\r\n\r\n const clamped = Math.max(0, Math.min(subtotal, dollars));\r\n // Round to cents so the deduction matches the currency-formatted display.\r\n return Math.round(clamped * 100) / 100;\r\n}\r\n\r\n/** One cart line: a ticket's unit price (dollars) and how many are in the cart. */\r\nexport interface PromoDiscountLine {\r\n unitPrice: number;\r\n quantity: number;\r\n}\r\n\r\n/**\r\n * Resolve a promo discount for the WHOLE ORDER, rounding the SAME way the\r\n * ticket rows do — so the row and the order summary can never disagree by a\r\n * cent.\r\n *\r\n * A percentage promo shows on every ticket ROW. A row renders a unit price\r\n * rounded to cents, so the discount a buyer reads off the rows is\r\n * `Σ quantity × round(unitPrice × pct)`. If the summary instead rounds\r\n * `pct × subtotal` ONCE, the two round independently and can land up to a cent\r\n * apart per line — the buyer sees two different numbers for the same discount.\r\n * So the summary sums the per-unit rounded discounts: one rounding decision\r\n * (per unit), shared by both surfaces. Each per-unit discount comes from the\r\n * same canonical {@link resolvePromoDiscountDollars} the row calls, so there is\r\n * no second copy of the math.\r\n *\r\n * A fixed promo is order-level and never shown on a row, so it resolves once\r\n * against the subtotal, exactly as before.\r\n *\r\n * @param lines - the cart's ticket lines (unit price × quantity).\r\n * @param subtotal - order subtotal in dollars (used for a fixed, order-level promo).\r\n * @param rawAmount - a percent for a percentage promo, dollars for a fixed one.\r\n * @param discountType - 'percentage'/'%' or 'fixed'/'$' (or empty → fixed).\r\n * @returns the order discount in dollars.\r\n */\r\nexport function resolveOrderPromoDiscountDollars(\r\n lines: readonly PromoDiscountLine[],\r\n subtotal: number,\r\n rawAmount: number,\r\n discountType: PromoDiscountTypeInput\r\n): number {\r\n if (!(rawAmount > 0)) return 0;\r\n\r\n // A fixed promo is order-level and never rendered on a row, so it resolves\r\n // once against the subtotal — unchanged from the single-line resolver.\r\n if (!isPercentageDiscount(discountType)) {\r\n return resolvePromoDiscountDollars(subtotal, rawAmount, discountType);\r\n }\r\n\r\n // Percentage promo: round per unit exactly as the row does, then sum. The\r\n // canonical Cents algebra keeps the sum exact — 0.01 + 0.01 in floats is\r\n // 0.020000000000000004, and this feeds a currency display.\r\n const lineCents = lines\r\n .filter(({ quantity }) => quantity > 0)\r\n .map(({ unitPrice, quantity }) =>\r\n mulCents(\r\n dollarsToCents(\r\n resolvePromoDiscountDollars(unitPrice, rawAmount, discountType)\r\n ),\r\n quantity\r\n )\r\n );\r\n return centsToDollars(sumCents(lineCents));\r\n}\r\n"],"names":["isPercentageDiscount","discountType","resolvePromoDiscountDollars","subtotal","rawAmount","dollars","clamped","resolveOrderPromoDiscountDollars","lines","lineCents","quantity","unitPrice","mulCents","dollarsToCents","centsToDollars","sumCents"],"mappings":";AAmDO,SAASA,EACdC,GACS;AACT,SAAOA,MAAiB,gBAAgBA,MAAiB;AAC3D;AAWO,SAASC,EACdC,GACAC,GACAH,GACQ;AACR,MAAI,EAAEG,IAAY,MAAM,EAAED,IAAW,GAAI,QAAO;AAEhD,QAAME,IAAUL,EAAqBC,CAAY,IAC5CE,IAAWC,IAAa,MACzBA,GAEEE,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIH,GAAUE,CAAO,CAAC;AAEvD,SAAO,KAAK,MAAMC,IAAU,GAAG,IAAI;AACrC;AAgCO,SAASC,EACdC,GACAL,GACAC,GACAH,GACQ;AACR,MAAI,EAAEG,IAAY,GAAI,QAAO;AAI7B,MAAI,CAACJ,EAAqBC,CAAY;AACpC,WAAOC,EAA4BC,GAAUC,GAAWH,CAAY;AAMtE,QAAMQ,IAAYD,EACf,OAAO,CAAC,EAAE,UAAAE,QAAeA,IAAW,CAAC,EACrC;AAAA,IAAI,CAAC,EAAE,WAAAC,GAAW,UAAAD,EAAA,MACjBE;AAAA,MACEC;AAAA,QACEX,EAA4BS,GAAWP,GAAWH,CAAY;AAAA,MAAA;AAAA,MAEhES;AAAA,IAAA;AAAA,EACF;AAEJ,SAAOI,EAAeC,EAASN,CAAS,CAAC;AAC3C;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aD as C, ac as R } from "./VenueCalendar-
|
|
1
|
+
import { aD as C, ac as R } from "./VenueCalendar-BDW-jkLN.js";
|
|
2
2
|
var ye;
|
|
3
3
|
function c(e, t, n) {
|
|
4
4
|
function r(u, a) {
|
|
@@ -3082,4 +3082,4 @@ export {
|
|
|
3082
3082
|
is as b,
|
|
3083
3083
|
ss as f
|
|
3084
3084
|
};
|
|
3085
|
-
//# sourceMappingURL=serverTotals-
|
|
3085
|
+
//# sourceMappingURL=serverTotals-CJHVQkJo.js.map
|