@asksable/site-connector 0.2.0 → 0.3.1

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.
@@ -0,0 +1,284 @@
1
+ export type Locale = 'en' | 'es';
2
+ export declare const DEFAULT_LOCALE: Locale;
3
+ export declare const TRANSLATIONS: {
4
+ readonly en: {
5
+ readonly pageTitle: "Schedule your visit";
6
+ readonly rescheduleTitle: "Reschedule appointment";
7
+ readonly rescheduleTitleNamed: "Reschedule {name}'s appointment";
8
+ readonly stepChooseService: "Choose a service";
9
+ readonly stepPickDateTime: "Pick a date & time";
10
+ readonly stepYourDetails: "Your details";
11
+ readonly stepReviewConfirm: "Review & confirm";
12
+ readonly stepBooking: "Booking";
13
+ readonly selectedService: "Selected service";
14
+ readonly btnChange: "Change";
15
+ readonly selectService: "Select Service";
16
+ readonly chooseYourService: "Choose your service";
17
+ readonly selectProvider: "Select a provider";
18
+ readonly chooseProviderAria: "Choose a provider";
19
+ readonly providerAny: "Any";
20
+ readonly providerFirstAvailable: "First available";
21
+ readonly providerUnavailable: "Unavailable";
22
+ readonly prevMonth: "Previous month";
23
+ readonly nextMonth: "Next month";
24
+ readonly closeMonthPicker: "Close month picker";
25
+ readonly weekdaySun: "Sun";
26
+ readonly weekdayMon: "Mon";
27
+ readonly weekdayTue: "Tue";
28
+ readonly weekdayWed: "Wed";
29
+ readonly weekdayThu: "Thu";
30
+ readonly weekdayFri: "Fri";
31
+ readonly weekdaySat: "Sat";
32
+ readonly calendarSelectServicePrompt: "Please select a service to see availability.";
33
+ readonly calendarLoadError: "Unable to load booking availability.";
34
+ readonly selectTimePrompt: "Select an available time";
35
+ readonly slotsHeading: "Available times";
36
+ readonly slotSecuring: "Securing...";
37
+ readonly slotsEmptyForDate: "No available times for this date.";
38
+ readonly slotsSelectServicePrompt: "Please select a service.";
39
+ readonly contactFullName: "Full name";
40
+ readonly contactEmail: "Email";
41
+ readonly contactPhone: "Phone";
42
+ readonly contactEmailInvalid: "Enter a valid email address.";
43
+ readonly placeholderFullName: "John Doe";
44
+ readonly placeholderEmail: "jane@example.com";
45
+ readonly placeholderPhone: "+1 (555) 000-0000";
46
+ readonly notesLabel: "Additional notes";
47
+ readonly notesLabelReschedule: "Reason for reschedule";
48
+ readonly notesPlaceholder: "Any preferences or special requests...";
49
+ readonly notesPlaceholderReschedule: "Let your provider know why...";
50
+ readonly selectFieldPlaceholder: "Select";
51
+ readonly repeatItemLabel: "Box {index}";
52
+ readonly repeatRemove: "Remove";
53
+ readonly repeatAdd: "Add another box";
54
+ readonly reviewBookingDetails: "Booking details";
55
+ readonly reviewYourDetails: "Your details";
56
+ readonly reviewAdditionalInfo: "Additional info";
57
+ readonly reviewNotesSection: "Notes";
58
+ readonly reviewYes: "Yes";
59
+ readonly reviewNo: "No";
60
+ readonly reviewNotProvided: "Not provided";
61
+ readonly summaryTitleCreate: "Booking Summary";
62
+ readonly summaryTitleReschedule: "Reschedule Summary";
63
+ readonly summaryReservationHold: "Reservation hold";
64
+ readonly summaryService: "Service";
65
+ readonly summaryProvider: "Provider";
66
+ readonly summaryDate: "Date";
67
+ readonly summaryTime: "Time";
68
+ readonly summaryWhen: "When";
69
+ readonly summaryNewTime: "New time";
70
+ readonly summaryDuration: "Duration";
71
+ readonly summaryEstimatedTotal: "Estimated total";
72
+ readonly summaryCalculating: "Calculating...";
73
+ readonly summaryFormerTime: "Former time";
74
+ readonly summaryFormerService: "Former service";
75
+ readonly summaryFormerStaff: "Former staff";
76
+ readonly backToDifferentTime: "Pick a different time";
77
+ readonly backToDifferentService: "Pick a different service";
78
+ readonly btnNext: "Next";
79
+ readonly btnConfirmBooking: "Confirm Booking";
80
+ readonly btnConfirmReschedule: "Confirm Reschedule";
81
+ readonly btnBooking: "Booking...";
82
+ readonly btnRescheduling: "Rescheduling...";
83
+ readonly btnContinueToPayment: "Continue to payment";
84
+ readonly btnPayAndConfirm: "Pay {price} & Confirm";
85
+ readonly btnPayDepositAndConfirm: "Pay deposit & Confirm";
86
+ readonly helpCalculating: "Calculating your price...";
87
+ readonly helpComplete: "Complete required fields to continue:";
88
+ readonly helpMoreFields: "{count} more required fields";
89
+ readonly blockerDateTime: "Date and time";
90
+ readonly blockerContactName: "Contact: Full name";
91
+ readonly blockerContactEmail: "Contact: Email";
92
+ readonly blockerContactEmailInvalid: "Contact: Enter a valid email address";
93
+ readonly blockerCalculatedPrice: "Calculated price";
94
+ readonly errorNoStaffForSlot: "No staff is available for that time.";
95
+ readonly errorHoldFailed: "Unable to reserve that time.";
96
+ readonly errorHoldExpired: "Your reservation hold expired. Please pick a time again.";
97
+ readonly errorConfirmFailed: "Unable to confirm booking.";
98
+ readonly errorNoServices: "No bookable services are available yet.";
99
+ readonly paymentHeader: "Summary";
100
+ readonly paymentSubtotal: "Subtotal";
101
+ readonly paymentTax: "Tax";
102
+ readonly paymentTotal: "Total";
103
+ readonly paymentChargedToday: "Charged today";
104
+ readonly paymentDueAtVisit: "Due at visit";
105
+ readonly paymentCardDetails: "Card details";
106
+ readonly paymentCardNumber: "Card number";
107
+ readonly paymentExpiry: "MM / YY";
108
+ readonly paymentCvc: "CVC";
109
+ readonly paymentZip: "ZIP";
110
+ readonly paymentSecureNote: "Payments are processed securely by Stripe.";
111
+ readonly paymentSecureLabel: "Secure payment";
112
+ readonly paymentProcessing: "Processing...";
113
+ readonly paymentPayAndConfirm: "Pay & confirm";
114
+ readonly paymentTotalDueToday: "Total due today";
115
+ readonly successTitleCreate: "You're All Set!";
116
+ readonly successTitleReschedule: "All set.";
117
+ readonly successBodyCreate: "Your booking request has been submitted. We'll follow up using the email you provided if anything needs confirmation.";
118
+ readonly successBodyReschedule: "Your appointment has been rescheduled. We've sent a confirmation to the email on file and notified your provider.";
119
+ readonly successCtaBackHome: "Back to home";
120
+ readonly successBookingConfirmed: "Booking confirmed.";
121
+ readonly successRescheduleConfirmed: "Reschedule confirmed.";
122
+ readonly successPaymentReceived: "Payment received. Your booking is being confirmed.";
123
+ readonly cancelledTitle: "Booking cancelled";
124
+ readonly cancelledBody: "Your appointment has been cancelled. We've let your provider know. You can book a new visit any time.";
125
+ readonly cancelledCta: "Book a new visit";
126
+ };
127
+ readonly es: {
128
+ readonly pageTitle: "Agenda tu visita";
129
+ readonly rescheduleTitle: "Cambiar cita";
130
+ readonly rescheduleTitleNamed: "Cambiar la cita de {name}";
131
+ readonly stepChooseService: "Elegir un servicio";
132
+ readonly stepPickDateTime: "Elegir fecha y hora";
133
+ readonly stepYourDetails: "Tus datos";
134
+ readonly stepReviewConfirm: "Revisar y confirmar";
135
+ readonly stepBooking: "Reserva";
136
+ readonly selectedService: "Servicio seleccionado";
137
+ readonly btnChange: "Cambiar";
138
+ readonly selectService: "Seleccionar servicio";
139
+ readonly chooseYourService: "Elige tu servicio";
140
+ readonly selectProvider: "Seleccionar proveedor";
141
+ readonly chooseProviderAria: "Elegir proveedor";
142
+ readonly providerAny: "Cualquiera";
143
+ readonly providerFirstAvailable: "Primero disponible";
144
+ readonly providerUnavailable: "No disponible";
145
+ readonly prevMonth: "Mes anterior";
146
+ readonly nextMonth: "Mes siguiente";
147
+ readonly closeMonthPicker: "Cerrar selector de mes";
148
+ readonly weekdaySun: "Dom";
149
+ readonly weekdayMon: "Lun";
150
+ readonly weekdayTue: "Mar";
151
+ readonly weekdayWed: "Mié";
152
+ readonly weekdayThu: "Jue";
153
+ readonly weekdayFri: "Vie";
154
+ readonly weekdaySat: "Sáb";
155
+ readonly calendarSelectServicePrompt: "Selecciona un servicio para ver la disponibilidad.";
156
+ readonly calendarLoadError: "No se pudo cargar la disponibilidad.";
157
+ readonly selectTimePrompt: "Elige un horario disponible";
158
+ readonly slotsHeading: "Horarios disponibles";
159
+ readonly slotSecuring: "Reservando...";
160
+ readonly slotsEmptyForDate: "No hay horarios disponibles para esta fecha.";
161
+ readonly slotsSelectServicePrompt: "Selecciona un servicio.";
162
+ readonly contactFullName: "Nombre completo";
163
+ readonly contactEmail: "Correo";
164
+ readonly contactPhone: "Teléfono";
165
+ readonly contactEmailInvalid: "Ingresa un correo válido.";
166
+ readonly placeholderFullName: "Juan Pérez";
167
+ readonly placeholderEmail: "ejemplo@correo.com";
168
+ readonly placeholderPhone: "+1 (555) 000-0000";
169
+ readonly notesLabel: "Notas adicionales";
170
+ readonly notesLabelReschedule: "Motivo del cambio";
171
+ readonly notesPlaceholder: "Preferencias o solicitudes especiales...";
172
+ readonly notesPlaceholderReschedule: "Cuéntale a tu proveedor por qué...";
173
+ readonly selectFieldPlaceholder: "Selecciona";
174
+ readonly repeatItemLabel: "Caja {index}";
175
+ readonly repeatRemove: "Quitar";
176
+ readonly repeatAdd: "Agregar otra caja";
177
+ readonly reviewBookingDetails: "Detalles de la reserva";
178
+ readonly reviewYourDetails: "Tus datos";
179
+ readonly reviewAdditionalInfo: "Información adicional";
180
+ readonly reviewNotesSection: "Notas";
181
+ readonly reviewYes: "Sí";
182
+ readonly reviewNo: "No";
183
+ readonly reviewNotProvided: "No proporcionado";
184
+ readonly summaryTitleCreate: "Resumen de la reserva";
185
+ readonly summaryTitleReschedule: "Resumen del cambio de cita";
186
+ readonly summaryReservationHold: "Reservado por";
187
+ readonly summaryService: "Servicio";
188
+ readonly summaryProvider: "Proveedor";
189
+ readonly summaryDate: "Fecha";
190
+ readonly summaryTime: "Hora";
191
+ readonly summaryWhen: "Fecha y hora";
192
+ readonly summaryNewTime: "Nueva hora";
193
+ readonly summaryDuration: "Duración";
194
+ readonly summaryEstimatedTotal: "Total estimado";
195
+ readonly summaryCalculating: "Calculando...";
196
+ readonly summaryFormerTime: "Hora anterior";
197
+ readonly summaryFormerService: "Servicio anterior";
198
+ readonly summaryFormerStaff: "Proveedor anterior";
199
+ readonly backToDifferentTime: "Elegir otra hora";
200
+ readonly backToDifferentService: "Elegir otro servicio";
201
+ readonly btnNext: "Siguiente";
202
+ readonly btnConfirmBooking: "Confirmar reserva";
203
+ readonly btnConfirmReschedule: "Confirmar cambio";
204
+ readonly btnBooking: "Reservando...";
205
+ readonly btnRescheduling: "Cambiando cita...";
206
+ readonly btnContinueToPayment: "Continuar al pago";
207
+ readonly btnPayAndConfirm: "Pagar {price} y confirmar";
208
+ readonly btnPayDepositAndConfirm: "Pagar depósito y confirmar";
209
+ readonly helpCalculating: "Calculando tu precio...";
210
+ readonly helpComplete: "Completa los campos requeridos para continuar:";
211
+ readonly helpMoreFields: "{count} campos requeridos restantes";
212
+ readonly blockerDateTime: "Fecha y hora";
213
+ readonly blockerContactName: "Contacto: Nombre completo";
214
+ readonly blockerContactEmail: "Contacto: Correo";
215
+ readonly blockerContactEmailInvalid: "Contacto: Ingresa un correo válido";
216
+ readonly blockerCalculatedPrice: "Precio calculado";
217
+ readonly errorNoStaffForSlot: "No hay un proveedor disponible para esa hora.";
218
+ readonly errorHoldFailed: "No se pudo reservar ese horario.";
219
+ readonly errorHoldExpired: "Tu reserva temporal expiró. Por favor escoge un horario otra vez.";
220
+ readonly errorConfirmFailed: "No se pudo confirmar la reserva.";
221
+ readonly errorNoServices: "No hay servicios disponibles para reservar todavía.";
222
+ readonly paymentHeader: "Resumen";
223
+ readonly paymentSubtotal: "Subtotal";
224
+ readonly paymentTax: "Impuestos";
225
+ readonly paymentTotal: "Total";
226
+ readonly paymentChargedToday: "Cobrado hoy";
227
+ readonly paymentDueAtVisit: "A pagar en la visita";
228
+ readonly paymentCardDetails: "Datos de la tarjeta";
229
+ readonly paymentCardNumber: "Número de tarjeta";
230
+ readonly paymentExpiry: "MM / AA";
231
+ readonly paymentCvc: "CVC";
232
+ readonly paymentZip: "ZIP";
233
+ readonly paymentSecureNote: "Los pagos se procesan de forma segura con Stripe.";
234
+ readonly paymentSecureLabel: "Pago seguro";
235
+ readonly paymentProcessing: "Procesando...";
236
+ readonly paymentPayAndConfirm: "Pagar y confirmar";
237
+ readonly paymentTotalDueToday: "Total a pagar hoy";
238
+ readonly successTitleCreate: "¡Todo listo!";
239
+ readonly successTitleReschedule: "¡Listo!";
240
+ readonly successBodyCreate: "Tu solicitud de reserva fue enviada. Te escribiremos al correo que nos diste si algo necesita confirmación.";
241
+ readonly successBodyReschedule: "Tu cita fue reprogramada. Enviamos la confirmación al correo registrado y avisamos a tu proveedor.";
242
+ readonly successCtaBackHome: "Volver al inicio";
243
+ readonly successBookingConfirmed: "Reserva confirmada.";
244
+ readonly successRescheduleConfirmed: "Cambio confirmado.";
245
+ readonly successPaymentReceived: "Pago recibido. Tu reserva está siendo confirmada.";
246
+ readonly cancelledTitle: "Reserva cancelada";
247
+ readonly cancelledBody: "Tu cita fue cancelada. Avisamos a tu proveedor. Puedes reservar otra visita cuando quieras.";
248
+ readonly cancelledCta: "Reservar otra visita";
249
+ };
250
+ };
251
+ export type TranslationKey = keyof (typeof TRANSLATIONS)['en'];
252
+ export type TranslationOverrides = Partial<Record<Locale, Partial<Record<TranslationKey, string>>>>;
253
+ export declare function createTranslator(locale: Locale, overrides?: TranslationOverrides): (key: TranslationKey, vars?: Record<string, string | number>) => string;
254
+ /**
255
+ * Picks the best matching field from an object with locale-suffixed variants.
256
+ *
257
+ * The base field (`name`, `title`, `description`) is the CANONICAL SOURCE
258
+ * — operator's own input, in whatever language they wrote it. Locale-
259
+ * suffixed siblings (`nameEs`, `nameEn`, ...) are auto-translations
260
+ * derived from the base.
261
+ *
262
+ * Lookup order:
263
+ * 1. Locale-suffixed field for the requested locale (`nameEs` for 'es').
264
+ * 2. Base field (`name`) — the operator's source text.
265
+ *
266
+ * We do NOT fall back through an "English first" default, because the
267
+ * base field already IS the source of truth and may itself be Spanish
268
+ * (or any other source language). Falling through to `nameEn` when
269
+ * the operator's source is Spanish would surface the auto-translated
270
+ * English copy to a Spanish-mode viewer, which is the wrong result.
271
+ *
272
+ * Example: pickLocaleField({ name: 'Envío en oficina', nameEn: 'Office delivery' }, 'name', 'es')
273
+ * - 'es' suffix: `nameEs` is undefined → skip
274
+ * - Falls through to base `name` → 'Envío en oficina' ✓
275
+ *
276
+ * Example: pickLocaleField({ name: 'Envío en oficina', nameEn: 'Office delivery' }, 'name', 'en')
277
+ * - 'en' suffix: `nameEn` is 'Office delivery' → return ✓
278
+ */
279
+ export declare function pickLocaleField<T extends Record<string, unknown>>(obj: T | null | undefined, baseField: string, locale: Locale): string | undefined;
280
+ /**
281
+ * Maps the package locale to an Intl BCP-47 tag for date/time/currency formatting.
282
+ */
283
+ export declare function localeToIntl(locale: Locale): string;
284
+ //# sourceMappingURL=translations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhC,eAAO,MAAM,cAAc,EAAE,MAAa,CAAA;AAE1C,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiUkC,CAAA;AAE3D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,CAAA;AAE9D,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAUnG,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,oBAAoB,IAEd,KAAK,cAAc,EAAE,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,YAQ9E;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAQpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQnD"}
@@ -0,0 +1,350 @@
1
+ export const DEFAULT_LOCALE = 'en';
2
+ export const TRANSLATIONS = {
3
+ en: {
4
+ // Page title & mobile steps
5
+ pageTitle: 'Schedule your visit',
6
+ rescheduleTitle: 'Reschedule appointment',
7
+ rescheduleTitleNamed: "Reschedule {name}'s appointment",
8
+ stepChooseService: 'Choose a service',
9
+ stepPickDateTime: 'Pick a date & time',
10
+ stepYourDetails: 'Your details',
11
+ stepReviewConfirm: 'Review & confirm',
12
+ stepBooking: 'Booking',
13
+ // Service picker
14
+ selectedService: 'Selected service',
15
+ btnChange: 'Change',
16
+ selectService: 'Select Service',
17
+ chooseYourService: 'Choose your service',
18
+ // Provider (staff) picker
19
+ selectProvider: 'Select a provider',
20
+ chooseProviderAria: 'Choose a provider',
21
+ providerAny: 'Any',
22
+ providerFirstAvailable: 'First available',
23
+ providerUnavailable: 'Unavailable',
24
+ // Calendar
25
+ prevMonth: 'Previous month',
26
+ nextMonth: 'Next month',
27
+ closeMonthPicker: 'Close month picker',
28
+ weekdaySun: 'Sun',
29
+ weekdayMon: 'Mon',
30
+ weekdayTue: 'Tue',
31
+ weekdayWed: 'Wed',
32
+ weekdayThu: 'Thu',
33
+ weekdayFri: 'Fri',
34
+ weekdaySat: 'Sat',
35
+ calendarSelectServicePrompt: 'Please select a service to see availability.',
36
+ calendarLoadError: 'Unable to load booking availability.',
37
+ // Time slots
38
+ selectTimePrompt: 'Select an available time',
39
+ slotsHeading: 'Available times',
40
+ slotSecuring: 'Securing...',
41
+ slotsEmptyForDate: 'No available times for this date.',
42
+ slotsSelectServicePrompt: 'Please select a service.',
43
+ // Contact form
44
+ contactFullName: 'Full name',
45
+ contactEmail: 'Email',
46
+ contactPhone: 'Phone',
47
+ contactEmailInvalid: 'Enter a valid email address.',
48
+ placeholderFullName: 'John Doe',
49
+ placeholderEmail: 'jane@example.com',
50
+ placeholderPhone: '+1 (555) 000-0000',
51
+ // Notes field
52
+ notesLabel: 'Additional notes',
53
+ notesLabelReschedule: 'Reason for reschedule',
54
+ notesPlaceholder: 'Any preferences or special requests...',
55
+ notesPlaceholderReschedule: 'Let your provider know why...',
56
+ // Intake / repeatable groups
57
+ selectFieldPlaceholder: 'Select',
58
+ repeatItemLabel: 'Box {index}',
59
+ repeatRemove: 'Remove',
60
+ repeatAdd: 'Add another box',
61
+ // Review step section headers
62
+ reviewBookingDetails: 'Booking details',
63
+ reviewYourDetails: 'Your details',
64
+ reviewAdditionalInfo: 'Additional info',
65
+ reviewNotesSection: 'Notes',
66
+ reviewYes: 'Yes',
67
+ reviewNo: 'No',
68
+ reviewNotProvided: 'Not provided',
69
+ // Booking summary
70
+ summaryTitleCreate: 'Booking Summary',
71
+ summaryTitleReschedule: 'Reschedule Summary',
72
+ summaryReservationHold: 'Reservation hold',
73
+ summaryService: 'Service',
74
+ summaryProvider: 'Provider',
75
+ summaryDate: 'Date',
76
+ summaryTime: 'Time',
77
+ summaryWhen: 'When',
78
+ summaryNewTime: 'New time',
79
+ summaryDuration: 'Duration',
80
+ summaryEstimatedTotal: 'Estimated total',
81
+ summaryCalculating: 'Calculating...',
82
+ summaryFormerTime: 'Former time',
83
+ summaryFormerService: 'Former service',
84
+ summaryFormerStaff: 'Former staff',
85
+ // Back buttons
86
+ backToDifferentTime: 'Pick a different time',
87
+ backToDifferentService: 'Pick a different service',
88
+ // Submit / pay buttons
89
+ btnNext: 'Next',
90
+ btnConfirmBooking: 'Confirm Booking',
91
+ btnConfirmReschedule: 'Confirm Reschedule',
92
+ btnBooking: 'Booking...',
93
+ btnRescheduling: 'Rescheduling...',
94
+ btnContinueToPayment: 'Continue to payment',
95
+ btnPayAndConfirm: 'Pay {price} & Confirm',
96
+ btnPayDepositAndConfirm: 'Pay deposit & Confirm',
97
+ // Form blocker / help text
98
+ helpCalculating: 'Calculating your price...',
99
+ helpComplete: 'Complete required fields to continue:',
100
+ helpMoreFields: '{count} more required fields',
101
+ blockerDateTime: 'Date and time',
102
+ blockerContactName: 'Contact: Full name',
103
+ blockerContactEmail: 'Contact: Email',
104
+ blockerContactEmailInvalid: 'Contact: Enter a valid email address',
105
+ blockerCalculatedPrice: 'Calculated price',
106
+ // Inline errors
107
+ errorNoStaffForSlot: 'No staff is available for that time.',
108
+ errorHoldFailed: 'Unable to reserve that time.',
109
+ errorHoldExpired: 'Your reservation hold expired. Please pick a time again.',
110
+ errorConfirmFailed: 'Unable to confirm booking.',
111
+ errorNoServices: 'No bookable services are available yet.',
112
+ // Payment
113
+ paymentHeader: 'Summary',
114
+ paymentSubtotal: 'Subtotal',
115
+ paymentTax: 'Tax',
116
+ paymentTotal: 'Total',
117
+ paymentChargedToday: 'Charged today',
118
+ paymentDueAtVisit: 'Due at visit',
119
+ paymentCardDetails: 'Card details',
120
+ paymentCardNumber: 'Card number',
121
+ paymentExpiry: 'MM / YY',
122
+ paymentCvc: 'CVC',
123
+ paymentZip: 'ZIP',
124
+ paymentSecureNote: 'Payments are processed securely by Stripe.',
125
+ paymentSecureLabel: 'Secure payment',
126
+ paymentProcessing: 'Processing...',
127
+ paymentPayAndConfirm: 'Pay & confirm',
128
+ paymentTotalDueToday: 'Total due today',
129
+ // Success states
130
+ successTitleCreate: "You're All Set!",
131
+ successTitleReschedule: 'All set.',
132
+ successBodyCreate: "Your booking request has been submitted. We'll follow up using the email you provided if anything needs confirmation.",
133
+ successBodyReschedule: "Your appointment has been rescheduled. We've sent a confirmation to the email on file and notified your provider.",
134
+ successCtaBackHome: 'Back to home',
135
+ successBookingConfirmed: 'Booking confirmed.',
136
+ successRescheduleConfirmed: 'Reschedule confirmed.',
137
+ successPaymentReceived: 'Payment received. Your booking is being confirmed.',
138
+ // Cancelled state
139
+ cancelledTitle: 'Booking cancelled',
140
+ cancelledBody: "Your appointment has been cancelled. We've let your provider know. You can book a new visit any time.",
141
+ cancelledCta: 'Book a new visit',
142
+ },
143
+ es: {
144
+ // Page title & mobile steps
145
+ pageTitle: 'Agenda tu visita',
146
+ rescheduleTitle: 'Cambiar cita',
147
+ rescheduleTitleNamed: 'Cambiar la cita de {name}',
148
+ stepChooseService: 'Elegir un servicio',
149
+ stepPickDateTime: 'Elegir fecha y hora',
150
+ stepYourDetails: 'Tus datos',
151
+ stepReviewConfirm: 'Revisar y confirmar',
152
+ stepBooking: 'Reserva',
153
+ // Service picker
154
+ selectedService: 'Servicio seleccionado',
155
+ btnChange: 'Cambiar',
156
+ selectService: 'Seleccionar servicio',
157
+ chooseYourService: 'Elige tu servicio',
158
+ // Provider (staff) picker
159
+ selectProvider: 'Seleccionar proveedor',
160
+ chooseProviderAria: 'Elegir proveedor',
161
+ providerAny: 'Cualquiera',
162
+ providerFirstAvailable: 'Primero disponible',
163
+ providerUnavailable: 'No disponible',
164
+ // Calendar
165
+ prevMonth: 'Mes anterior',
166
+ nextMonth: 'Mes siguiente',
167
+ closeMonthPicker: 'Cerrar selector de mes',
168
+ weekdaySun: 'Dom',
169
+ weekdayMon: 'Lun',
170
+ weekdayTue: 'Mar',
171
+ weekdayWed: 'Mié',
172
+ weekdayThu: 'Jue',
173
+ weekdayFri: 'Vie',
174
+ weekdaySat: 'Sáb',
175
+ calendarSelectServicePrompt: 'Selecciona un servicio para ver la disponibilidad.',
176
+ calendarLoadError: 'No se pudo cargar la disponibilidad.',
177
+ // Time slots
178
+ selectTimePrompt: 'Elige un horario disponible',
179
+ slotsHeading: 'Horarios disponibles',
180
+ slotSecuring: 'Reservando...',
181
+ slotsEmptyForDate: 'No hay horarios disponibles para esta fecha.',
182
+ slotsSelectServicePrompt: 'Selecciona un servicio.',
183
+ // Contact form
184
+ contactFullName: 'Nombre completo',
185
+ contactEmail: 'Correo',
186
+ contactPhone: 'Teléfono',
187
+ contactEmailInvalid: 'Ingresa un correo válido.',
188
+ placeholderFullName: 'Juan Pérez',
189
+ placeholderEmail: 'ejemplo@correo.com',
190
+ placeholderPhone: '+1 (555) 000-0000',
191
+ // Notes field
192
+ notesLabel: 'Notas adicionales',
193
+ notesLabelReschedule: 'Motivo del cambio',
194
+ notesPlaceholder: 'Preferencias o solicitudes especiales...',
195
+ notesPlaceholderReschedule: 'Cuéntale a tu proveedor por qué...',
196
+ // Intake / repeatable groups
197
+ selectFieldPlaceholder: 'Selecciona',
198
+ repeatItemLabel: 'Caja {index}',
199
+ repeatRemove: 'Quitar',
200
+ repeatAdd: 'Agregar otra caja',
201
+ // Review step section headers
202
+ reviewBookingDetails: 'Detalles de la reserva',
203
+ reviewYourDetails: 'Tus datos',
204
+ reviewAdditionalInfo: 'Información adicional',
205
+ reviewNotesSection: 'Notas',
206
+ reviewYes: 'Sí',
207
+ reviewNo: 'No',
208
+ reviewNotProvided: 'No proporcionado',
209
+ // Booking summary
210
+ summaryTitleCreate: 'Resumen de la reserva',
211
+ summaryTitleReschedule: 'Resumen del cambio de cita',
212
+ summaryReservationHold: 'Reservado por',
213
+ summaryService: 'Servicio',
214
+ summaryProvider: 'Proveedor',
215
+ summaryDate: 'Fecha',
216
+ summaryTime: 'Hora',
217
+ summaryWhen: 'Fecha y hora',
218
+ summaryNewTime: 'Nueva hora',
219
+ summaryDuration: 'Duración',
220
+ summaryEstimatedTotal: 'Total estimado',
221
+ summaryCalculating: 'Calculando...',
222
+ summaryFormerTime: 'Hora anterior',
223
+ summaryFormerService: 'Servicio anterior',
224
+ summaryFormerStaff: 'Proveedor anterior',
225
+ // Back buttons
226
+ backToDifferentTime: 'Elegir otra hora',
227
+ backToDifferentService: 'Elegir otro servicio',
228
+ // Submit / pay buttons
229
+ btnNext: 'Siguiente',
230
+ btnConfirmBooking: 'Confirmar reserva',
231
+ btnConfirmReschedule: 'Confirmar cambio',
232
+ btnBooking: 'Reservando...',
233
+ btnRescheduling: 'Cambiando cita...',
234
+ btnContinueToPayment: 'Continuar al pago',
235
+ btnPayAndConfirm: 'Pagar {price} y confirmar',
236
+ btnPayDepositAndConfirm: 'Pagar depósito y confirmar',
237
+ // Form blocker / help text
238
+ helpCalculating: 'Calculando tu precio...',
239
+ helpComplete: 'Completa los campos requeridos para continuar:',
240
+ helpMoreFields: '{count} campos requeridos restantes',
241
+ blockerDateTime: 'Fecha y hora',
242
+ blockerContactName: 'Contacto: Nombre completo',
243
+ blockerContactEmail: 'Contacto: Correo',
244
+ blockerContactEmailInvalid: 'Contacto: Ingresa un correo válido',
245
+ blockerCalculatedPrice: 'Precio calculado',
246
+ // Inline errors
247
+ errorNoStaffForSlot: 'No hay un proveedor disponible para esa hora.',
248
+ errorHoldFailed: 'No se pudo reservar ese horario.',
249
+ errorHoldExpired: 'Tu reserva temporal expiró. Por favor escoge un horario otra vez.',
250
+ errorConfirmFailed: 'No se pudo confirmar la reserva.',
251
+ errorNoServices: 'No hay servicios disponibles para reservar todavía.',
252
+ // Payment
253
+ paymentHeader: 'Resumen',
254
+ paymentSubtotal: 'Subtotal',
255
+ paymentTax: 'Impuestos',
256
+ paymentTotal: 'Total',
257
+ paymentChargedToday: 'Cobrado hoy',
258
+ paymentDueAtVisit: 'A pagar en la visita',
259
+ paymentCardDetails: 'Datos de la tarjeta',
260
+ paymentCardNumber: 'Número de tarjeta',
261
+ paymentExpiry: 'MM / AA',
262
+ paymentCvc: 'CVC',
263
+ paymentZip: 'ZIP',
264
+ paymentSecureNote: 'Los pagos se procesan de forma segura con Stripe.',
265
+ paymentSecureLabel: 'Pago seguro',
266
+ paymentProcessing: 'Procesando...',
267
+ paymentPayAndConfirm: 'Pagar y confirmar',
268
+ paymentTotalDueToday: 'Total a pagar hoy',
269
+ // Success states
270
+ successTitleCreate: '¡Todo listo!',
271
+ successTitleReschedule: '¡Listo!',
272
+ successBodyCreate: 'Tu solicitud de reserva fue enviada. Te escribiremos al correo que nos diste si algo necesita confirmación.',
273
+ successBodyReschedule: 'Tu cita fue reprogramada. Enviamos la confirmación al correo registrado y avisamos a tu proveedor.',
274
+ successCtaBackHome: 'Volver al inicio',
275
+ successBookingConfirmed: 'Reserva confirmada.',
276
+ successRescheduleConfirmed: 'Cambio confirmado.',
277
+ successPaymentReceived: 'Pago recibido. Tu reserva está siendo confirmada.',
278
+ // Cancelled state
279
+ cancelledTitle: 'Reserva cancelada',
280
+ cancelledBody: 'Tu cita fue cancelada. Avisamos a tu proveedor. Puedes reservar otra visita cuando quieras.',
281
+ cancelledCta: 'Reservar otra visita',
282
+ },
283
+ };
284
+ function applyVars(template, vars) {
285
+ if (!vars)
286
+ return template;
287
+ return template.replace(/\{(\w+)\}/g, (_match, key) => {
288
+ const value = vars[key];
289
+ return value === undefined || value === null ? `{${key}}` : String(value);
290
+ });
291
+ }
292
+ export function createTranslator(locale, overrides) {
293
+ return function t(key, vars) {
294
+ const overrideValue = overrides?.[locale]?.[key];
295
+ const value = overrideValue !== undefined
296
+ ? overrideValue
297
+ : TRANSLATIONS[locale]?.[key] ?? TRANSLATIONS[DEFAULT_LOCALE][key];
298
+ return applyVars(value, vars);
299
+ };
300
+ }
301
+ /**
302
+ * Picks the best matching field from an object with locale-suffixed variants.
303
+ *
304
+ * The base field (`name`, `title`, `description`) is the CANONICAL SOURCE
305
+ * — operator's own input, in whatever language they wrote it. Locale-
306
+ * suffixed siblings (`nameEs`, `nameEn`, ...) are auto-translations
307
+ * derived from the base.
308
+ *
309
+ * Lookup order:
310
+ * 1. Locale-suffixed field for the requested locale (`nameEs` for 'es').
311
+ * 2. Base field (`name`) — the operator's source text.
312
+ *
313
+ * We do NOT fall back through an "English first" default, because the
314
+ * base field already IS the source of truth and may itself be Spanish
315
+ * (or any other source language). Falling through to `nameEn` when
316
+ * the operator's source is Spanish would surface the auto-translated
317
+ * English copy to a Spanish-mode viewer, which is the wrong result.
318
+ *
319
+ * Example: pickLocaleField({ name: 'Envío en oficina', nameEn: 'Office delivery' }, 'name', 'es')
320
+ * - 'es' suffix: `nameEs` is undefined → skip
321
+ * - Falls through to base `name` → 'Envío en oficina' ✓
322
+ *
323
+ * Example: pickLocaleField({ name: 'Envío en oficina', nameEn: 'Office delivery' }, 'name', 'en')
324
+ * - 'en' suffix: `nameEn` is 'Office delivery' → return ✓
325
+ */
326
+ export function pickLocaleField(obj, baseField, locale) {
327
+ if (!obj)
328
+ return undefined;
329
+ const suffix = locale.charAt(0).toUpperCase() + locale.slice(1);
330
+ const localized = obj[`${baseField}${suffix}`];
331
+ if (typeof localized === 'string' && localized.length > 0)
332
+ return localized;
333
+ const base = obj[baseField];
334
+ if (typeof base === 'string' && base.length > 0)
335
+ return base;
336
+ return undefined;
337
+ }
338
+ /**
339
+ * Maps the package locale to an Intl BCP-47 tag for date/time/currency formatting.
340
+ */
341
+ export function localeToIntl(locale) {
342
+ switch (locale) {
343
+ case 'es':
344
+ return 'es-US';
345
+ case 'en':
346
+ default:
347
+ return 'en-US';
348
+ }
349
+ }
350
+ //# sourceMappingURL=translations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.js","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"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"}