@clicka1/booking 0.2.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.
@@ -0,0 +1,548 @@
1
+ 'use client';
2
+ import { createContext, useContext } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ // ../../lib/service-category-inference.ts
6
+ function normalizeCategoryLabel(raw) {
7
+ const t = raw.trim().replace(/\s+/g, " ");
8
+ if (!t) return "";
9
+ return t.charAt(0).toUpperCase() + t.slice(1);
10
+ }
11
+
12
+ // ../../lib/salon-service-categories.ts
13
+ function resolveServiceCategory(service) {
14
+ return normalizeCategoryLabel(service.category ?? "");
15
+ }
16
+ function enrichServiceCategories(services) {
17
+ const out = services.map((s) => ({
18
+ ...s,
19
+ category: resolveServiceCategory(s) || void 0
20
+ }));
21
+ let last = "";
22
+ for (const item of out) {
23
+ if (item.category) {
24
+ last = item.category;
25
+ } else if (last) {
26
+ item.category = last;
27
+ }
28
+ }
29
+ return out;
30
+ }
31
+ function buildServiceCategoryTabs(services) {
32
+ const labels = /* @__PURE__ */ new Set();
33
+ for (const svc of services) {
34
+ const cat = resolveServiceCategory(svc);
35
+ if (cat) labels.add(cat);
36
+ }
37
+ const sorted = [...labels].sort((a, b) => a.localeCompare(b, "bg"));
38
+ return [{ id: null, label: "\u0412\u0441\u0438\u0447\u043A\u0438" }, ...sorted.map((cat) => ({ id: cat, label: cat }))];
39
+ }
40
+ function serviceMatchesCategory(service, selectedCategory) {
41
+ if (!selectedCategory) return true;
42
+ return resolveServiceCategory(service) === selectedCategory;
43
+ }
44
+
45
+ // ../../locales/bg.json
46
+ var bg_default = {
47
+ booking: {
48
+ modal: {
49
+ ariaLabel: "\u0420\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F",
50
+ titleDefault: "\u0420\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F",
51
+ titleWithStaff: "\u043F\u0440\u0438 {name}",
52
+ closeAria: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438",
53
+ confirmClose: "\u0421\u0438\u0433\u0443\u0440\u043D\u0438 \u043B\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043A\u0430\u0442\u0435 \u0434\u0430 \u0437\u0430\u0442\u0432\u043E\u0440\u0438\u0442\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430?",
54
+ stepService: "\u0423\u0441\u043B\u0443\u0433\u0430",
55
+ stepSpecialist: "\u0421\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0441\u0442",
56
+ stepTime: "\u0427\u0430\u0441",
57
+ stepDetails: "\u0414\u0430\u043D\u043D\u0438",
58
+ stepAria: "\u0421\u0442\u044A\u043F\u043A\u0430 {n}: {label}",
59
+ selectedServices: "\u0418\u0437\u0431\u0440\u0430\u043D\u0438 \u0443\u0441\u043B\u0443\u0433\u0438",
60
+ services: "\u0423\u0441\u043B\u0443\u0433\u0438",
61
+ serviceCountOne: "{count} \u0443\u0441\u043B\u0443\u0433\u0430",
62
+ serviceCountMany: "{count} \u0443\u0441\u043B\u0443\u0433\u0438",
63
+ minSuffix: "\u043C\u0438\u043D",
64
+ remove: "\u041F\u0440\u0435\u043C\u0430\u0445\u043D\u0438",
65
+ removeAria: "\u041F\u0440\u0435\u043C\u0430\u0445\u043D\u0438 \u0443\u0441\u043B\u0443\u0433\u0430",
66
+ addMoreServices: "\u0414\u043E\u0431\u0430\u0432\u0438 \u043E\u0449\u0435 \u0443\u0441\u043B\u0443\u0433\u0438",
67
+ hideList: "\u0421\u043A\u0440\u0438\u0439 \u0441\u043F\u0438\u0441\u044A\u043A\u0430 \xB7 {count} \u0438\u0437\u0431\u0440\u0430\u043D\u0438",
68
+ add: "\u0414\u043E\u0431\u0430\u0432\u0438",
69
+ addService: "\u0414\u043E\u0431\u0430\u0432\u0438 \u0443\u0441\u043B\u0443\u0433\u0430",
70
+ noServicesInCategory: "\u041D\u044F\u043C\u0430 \u0443\u0441\u043B\u0443\u0433\u0438 \u0432 \u0438\u0437\u0431\u0440\u0430\u043D\u0430\u0442\u0430 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F.",
71
+ selectSpecialist: "\u0418\u0437\u0431\u0435\u0440\u0438 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u0438\u0441\u0442",
72
+ availableFor: "\u041D\u0430\u043B\u0438\u0447\u043D\u0438 \u0437\u0430",
73
+ serviceUnavailable: "\u0422\u0430\u0437\u0438 \u0443\u0441\u043B\u0443\u0433\u0430 \u043D\u0435 \u0435 \u043D\u0430\u043B\u0438\u0447\u043D\u0430 \u0437\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F \u0432 \u043C\u043E\u043C\u0435\u043D\u0442\u0430.",
74
+ selectOtherService: "\u0418\u0437\u0431\u0435\u0440\u0438 \u0434\u0440\u0443\u0433\u0430 \u0443\u0441\u043B\u0443\u0433\u0430",
75
+ dateTime: "\u0414\u0430\u0442\u0430 \u0438 \u0447\u0430\u0441",
76
+ timeWithStaff: "\u0427\u0430\u0441 \u043F\u0440\u0438 {name}",
77
+ date: "\u0414\u0430\u0442\u0430",
78
+ time: "\u0427\u0430\u0441",
79
+ selectDateFirst: "\u041F\u044A\u0440\u0432\u043E \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u0430\u0442\u0430.",
80
+ dayClosed: "\u0412 \u0442\u043E\u0437\u0438 \u0434\u0435\u043D \u0441\u0430\u043B\u043E\u043D\u044A\u0442 \u0435 \u0437\u0430\u0442\u0432\u043E\u0440\u0435\u043D.",
81
+ noSlots: "\u041D\u044F\u043C\u0430 \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u0438 \u0447\u0430\u0441\u043E\u0432\u0435 \u0437\u0430 \u0438\u0437\u0431\u0440\u0430\u043D\u0438\u0442\u0435 \u0443\u0441\u043B\u0443\u0433\u0438.",
82
+ selectServiceFirst: "\u041F\u044A\u0440\u0432\u043E \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0443\u0441\u043B\u0443\u0433\u0430.",
83
+ contactDetails: "\u0414\u0430\u043D\u043D\u0438 \u0437\u0430 \u043A\u043E\u043D\u0442\u0430\u043A\u0442",
84
+ name: "\u0418\u043C\u0435",
85
+ phone: "\u0422\u0435\u043B\u0435\u0444\u043E\u043D",
86
+ email: "\u0418\u043C\u0435\u0439\u043B",
87
+ notes: "\u0411\u0435\u043B\u0435\u0436\u043A\u0438 (\u043F\u043E \u0436\u0435\u043B\u0430\u043D\u0438\u0435)",
88
+ smsConsentPre: "\u0421\u044A\u0433\u043B\u0430\u0441\u044F\u0432\u0430\u043C \u0441\u0435 \u0434\u0430 \u043F\u043E\u043B\u0443\u0447\u0430\u0432\u0430\u043C SMS \u043D\u0430\u043F\u043E\u043C\u043D\u044F\u043D\u0438\u044F \u0437\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430 \u043E\u0442",
89
+ smsConsentPost: "\u043D\u0430 \u043F\u043E\u0441\u043E\u0447\u0435\u043D\u0438\u044F \u0442\u0435\u043B\u0435\u0444\u043E\u043D. \u041F\u0440\u043E\u0447\u0435\u0442\u043E\u0445",
90
+ smsConsentAnd: "\u0438",
91
+ terms: "\u041E\u0431\u0449\u0438\u0442\u0435 \u0443\u0441\u043B\u043E\u0432\u0438\u044F",
92
+ privacy: "\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430\u0442\u0430 \u0437\u0430 \u043F\u043E\u0432\u0435\u0440\u0438\u0442\u0435\u043B\u043D\u043E\u0441\u0442",
93
+ smsConsentNote: "\u0411\u0435\u0437 \u043E\u0442\u043C\u0435\u0442\u043A\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430 \u0432\u0438 \u043E\u0441\u0442\u0430\u0432\u0430 \u0432\u0430\u043B\u0438\u0434\u043D\u0430, \u043D\u043E \u043D\u044F\u043C\u0430 \u0434\u0430 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u0435 SMS \u043D\u0430\u043F\u043E\u043C\u043D\u044F\u043D\u0438\u0435 \u043E\u0442 \u0441\u0430\u043B\u043E\u043D\u0430.",
94
+ totalDuration: "\u041E\u0431\u0449\u043E: {min} \u043C\u0438\u043D",
95
+ totalPrice: "\u041E\u0431\u0449\u043E: {price}",
96
+ startTime: "\u0421\u0442\u0430\u0440\u0442 {start} \xB7 \u0413\u043E\u0442\u043E\u0432\u0438 \u043E\u043A\u043E\u043B\u043E {end}",
97
+ depositRequired: "\u0418\u0437\u0438\u0441\u043A\u0432\u0430 \u0441\u0435 \u0434\u0435\u043F\u043E\u0437\u0438\u0442 \u043E\u0442",
98
+ paymentFrom: "\u041F\u043B\u0430\u0449\u0430\u043D\u0435 \u043E\u0442",
99
+ securePayment: "\u0417\u0430\u0449\u0438\u0442\u0435\u043D\u043E \u043F\u043B\u0430\u0449\u0430\u043D\u0435 \u0447\u0440\u0435\u0437",
100
+ back: "\u041D\u0430\u0437\u0430\u0434",
101
+ continue: "\u041F\u0440\u043E\u0434\u044A\u043B\u0436\u0438",
102
+ sendRequest: "\u0418\u0437\u043F\u0440\u0430\u0442\u0438 \u0437\u0430\u044F\u0432\u043A\u0430",
103
+ payAndBook: "\u041F\u043B\u0430\u0442\u0438 \u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0430\u0439",
104
+ disclaimerPre: "\u0417\u0430 \u0434\u0430 \u0437\u0430\u0432\u044A\u0440\u0448\u0438\u0448 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430 \u0441\u0430 \u043D\u0443\u0436\u043D\u0438 \u0438\u043C\u0435, \u0442\u0435\u043B\u0435\u0444\u043E\u043D \u0438 \u0438\u043C\u0435\u0439\u043B \u2014 \u0438\u0437\u043F\u043E\u043B\u0437\u0432\u0430\u043C\u0435 \u0433\u0438 \u0441\u0430\u043C\u043E \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430, \u043F\u043E\u0442\u0432\u044A\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0438 \u043D\u0430\u043F\u043E\u043C\u043D\u044F\u043D\u0438\u044F.",
105
+ disclaimerAccept: "\u0421 \u0438\u0437\u043F\u0440\u0430\u0449\u0430\u043D\u0435\u0442\u043E \u043F\u0440\u0438\u0435\u043C\u0430\u0448"
106
+ },
107
+ success: {
108
+ confirmed: "\u0420\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430 \u0435 \u043F\u043E\u0442\u0432\u044A\u0440\u0434\u0435\u043D\u0430",
109
+ waitingAt: "\u041E\u0447\u0430\u043A\u0432\u0430\u043C\u0435 \u0432\u0438 \u0432",
110
+ labelService: "\u0423\u0441\u043B\u0443\u0433\u0430",
111
+ labelWhen: "\u041A\u043E\u0433\u0430",
112
+ timeFormat: "{date}, {time} \u0447.",
113
+ done: "\u0413\u043E\u0442\u043E\u0432\u043E"
114
+ },
115
+ errors: {
116
+ noService: "\u041C\u043E\u043B\u044F, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043F\u043E\u043D\u0435 \u0435\u0434\u043D\u0430 \u0443\u0441\u043B\u0443\u0433\u0430.",
117
+ noName: "\u041C\u043E\u043B\u044F, \u0432\u044A\u0432\u0435\u0434\u0435\u0442\u0435 \u0432\u0430\u0448\u0435\u0442\u043E \u0438\u043C\u0435.",
118
+ noPhone: "\u041C\u043E\u043B\u044F, \u0432\u044A\u0432\u0435\u0434\u0435\u0442\u0435 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0435\u043D \u043D\u043E\u043C\u0435\u0440.",
119
+ noEmail: "\u041C\u043E\u043B\u044F, \u0432\u044A\u0432\u0435\u0434\u0435\u0442\u0435 \u0438\u043C\u0435\u0439\u043B.",
120
+ noDate: "\u041C\u043E\u043B\u044F, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0434\u0430\u0442\u0430.",
121
+ noTime: "\u041C\u043E\u043B\u044F, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0447\u0430\u0441.",
122
+ saveFailed: "\u0420\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F\u0442\u0430 \u043D\u0435 \u043C\u043E\u0436\u0430 \u0434\u0430 \u0431\u044A\u0434\u0435 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u0430. \u041C\u043E\u043B\u044F \u043E\u043F\u0438\u0442\u0430\u0439\u0442\u0435 \u043E\u0442\u043D\u043E\u0432\u043E.",
123
+ httpError: "\u0413\u0440\u0435\u0448\u043A\u0430 {status}",
124
+ paymentFailed: "\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0430\u043D\u0435 \u043D\u0430 \u043F\u043B\u0430\u0449\u0430\u043D\u0435\u0442\u043E.",
125
+ generic: "\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044F."
126
+ }
127
+ },
128
+ adminAuth: {
129
+ loading: "\u0417\u0430\u0440\u0435\u0436\u0434\u0430\u043D\u0435\u2026",
130
+ signIn: {
131
+ title: "\u0412\u0445\u043E\u0434",
132
+ subtitle: "\u0412\u044A\u0432\u0435\u0434\u0435\u0442\u0435 \u0438\u043C\u0435\u0439\u043B \u0438 \u043F\u0430\u0440\u043E\u043B\u0430 \u0437\u0430 \u0434\u043E\u0441\u0442\u044A\u043F \u0434\u043E \u043F\u0430\u043D\u0435\u043B\u0430.",
133
+ emailLabel: "\u0418\u043C\u0435\u0439\u043B",
134
+ emailPlaceholder: "ime@example.com",
135
+ passwordLabel: "\u041F\u0430\u0440\u043E\u043B\u0430",
136
+ passwordPlaceholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
137
+ showPassword: "\u041F\u043E\u043A\u0430\u0436\u0438 \u043F\u0430\u0440\u043E\u043B\u0430\u0442\u0430",
138
+ hidePassword: "\u0421\u043A\u0440\u0438\u0439 \u043F\u0430\u0440\u043E\u043B\u0430\u0442\u0430",
139
+ submit: "\u0412\u043B\u0435\u0437",
140
+ submitting: "\u0412\u043B\u0438\u0437\u0430\u043D\u0435\u2026",
141
+ forgot: "\u0417\u0430\u0431\u0440\u0430\u0432\u0435\u043D\u0430 \u043F\u0430\u0440\u043E\u043B\u0430?",
142
+ errorGeneric: "\u0413\u0440\u0435\u0448\u043A\u0430",
143
+ errorLogin: "\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438 \u0432\u0445\u043E\u0434"
144
+ },
145
+ forgot: {
146
+ back: "\u2190 \u041D\u0430\u0437\u0430\u0434",
147
+ title: "\u0417\u0430\u0431\u0440\u0430\u0432\u0435\u043D\u0430 \u043F\u0430\u0440\u043E\u043B\u0430",
148
+ subtitle: "\u0412\u044A\u0432\u0435\u0434\u0435\u0442\u0435 \u0438\u043C\u0435\u0439\u043B\u0430 \u043D\u0430 \u0430\u043A\u0430\u0443\u043D\u0442\u0430. \u0429\u0435 \u0438\u0437\u043F\u0440\u0430\u0442\u0438\u043C \u043B\u0438\u043D\u043A \u0437\u0430 \u0437\u0430\u0434\u0430\u0432\u0430\u043D\u0435 \u043D\u0430 \u043D\u043E\u0432\u0430 \u043F\u0430\u0440\u043E\u043B\u0430.",
149
+ submit: "\u0418\u0437\u043F\u0440\u0430\u0442\u0438 \u043B\u0438\u043D\u043A",
150
+ submitting: "\u0418\u0437\u043F\u0440\u0430\u0449\u0430\u043D\u0435\u2026",
151
+ sentTitle: "\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u043F\u043E\u0449\u0430\u0442\u0430 \u0441\u0438",
152
+ sentBody: "\u0418\u0437\u043F\u0440\u0430\u0442\u0438\u0445\u043C\u0435 \u043B\u0438\u043D\u043A \u0437\u0430 \u0437\u0430\u0434\u0430\u0432\u0430\u043D\u0435 \u043D\u0430 \u043D\u043E\u0432\u0430 \u043F\u0430\u0440\u043E\u043B\u0430.",
153
+ backToSignIn: "\u041D\u0430\u0437\u0430\u0434 \u043A\u044A\u043C \u0432\u0445\u043E\u0434"
154
+ },
155
+ setPassword: {
156
+ invalidLink: "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043B\u0438\u043D\u043A.",
157
+ invalidLinkHint: "\u041F\u043E\u0438\u0441\u043A\u0430\u0439\u0442\u0435 \u043D\u043E\u0432 \u043E\u0442 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430\u0442\u0430 \u0437\u0430 \u0432\u0445\u043E\u0434.",
158
+ titleCreate: "\u0417\u0430\u0434\u0430\u0439 \u043F\u0430\u0440\u043E\u043B\u0430",
159
+ titleReset: "\u041D\u043E\u0432\u0430 \u043F\u0430\u0440\u043E\u043B\u0430",
160
+ subtitleCreate: "\u0412\u044A\u0432\u0435\u0434\u0438 \u0438\u043C\u0435\u0442\u043E \u0441\u0438 \u0438 \u0438\u0437\u0431\u0435\u0440\u0438 \u043F\u0430\u0440\u043E\u043B\u0430 \u0437\u0430 \u0434\u043E\u0441\u0442\u044A\u043F \u0434\u043E \u043F\u0430\u043D\u0435\u043B\u0430.",
161
+ subtitleReset: "\u0412\u044A\u0432\u0435\u0434\u0438 \u043D\u043E\u0432\u0430 \u043F\u0430\u0440\u043E\u043B\u0430 \u0437\u0430 \u0442\u0432\u043E\u044F \u043F\u0430\u043D\u0435\u043B.",
162
+ nameLabel: "\u0418\u043C\u0435",
163
+ namePlaceholder: "\u0412\u0430\u0448\u0435\u0442\u043E \u0438\u043C\u0435",
164
+ emailLabel: "\u0418\u043C\u0435\u0439\u043B",
165
+ emailPlaceholder: "ime@example.com",
166
+ passwordLabel: "\u041F\u0430\u0440\u043E\u043B\u0430",
167
+ passwordPlaceholder: "\u041F\u043E\u043D\u0435 8 \u0441\u0438\u043C\u0432\u043E\u043B\u0430",
168
+ confirmLabel: "\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0438 \u043F\u0430\u0440\u043E\u043B\u0430\u0442\u0430",
169
+ confirmPlaceholder: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438 \u043F\u0430\u0440\u043E\u043B\u0430\u0442\u0430",
170
+ show: "\u041F\u043E\u043A\u0430\u0436\u0438",
171
+ hide: "\u0421\u043A\u0440\u0438\u0439",
172
+ submitCreate: "\u0421\u044A\u0437\u0434\u0430\u0439 \u0430\u043A\u0430\u0443\u043D\u0442 \u2192",
173
+ submitReset: "\u0421\u043C\u0435\u043D\u0438 \u043F\u0430\u0440\u043E\u043B\u0430\u0442\u0430 \u2192",
174
+ submittingCreate: "\u0421\u044A\u0437\u0434\u0430\u0432\u0430\u043D\u0435\u2026",
175
+ submittingReset: "\u0417\u0430\u043F\u0430\u0437\u0432\u0430\u043D\u0435\u2026",
176
+ mismatch: "\u041F\u0430\u0440\u043E\u043B\u0438\u0442\u0435 \u043D\u0435 \u0441\u044A\u0432\u043F\u0430\u0434\u0430\u0442.",
177
+ doneCreate: "\u0410\u043A\u0430\u0443\u043D\u0442\u044A\u0442 \u0435 \u0441\u044A\u0437\u0434\u0430\u0434\u0435\u043D!",
178
+ doneReset: "\u041F\u0430\u0440\u043E\u043B\u0430\u0442\u0430 \u0435 \u0441\u043C\u0435\u043D\u0435\u043D\u0430!",
179
+ doneRedirect: "\u0412\u043B\u0438\u0437\u0430\u0448 \u0432 \u043F\u0430\u043D\u0435\u043B\u0430\u2026",
180
+ haveAccount: "\u0412\u0435\u0447\u0435 \u0438\u043C\u0430\u0448 \u0430\u043A\u0430\u0443\u043D\u0442?",
181
+ signInLink: "\u0412\u043B\u0435\u0437",
182
+ errorGeneric: "\u0413\u0440\u0435\u0448\u043A\u0430"
183
+ }
184
+ },
185
+ common: {
186
+ days: {
187
+ monday: "\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A",
188
+ tuesday: "\u0412\u0442\u043E\u0440\u043D\u0438\u043A",
189
+ wednesday: "\u0421\u0440\u044F\u0434\u0430",
190
+ thursday: "\u0427\u0435\u0442\u0432\u044A\u0440\u0442\u044A\u043A",
191
+ friday: "\u041F\u0435\u0442\u044A\u043A",
192
+ saturday: "\u0421\u044A\u0431\u043E\u0442\u0430",
193
+ sunday: "\u041D\u0435\u0434\u0435\u043B\u044F"
194
+ }
195
+ },
196
+ adminDashboard: {
197
+ navigation: "\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F",
198
+ tabs: {
199
+ site: "\u0421\u0430\u0439\u0442",
200
+ images: "\u0421\u043D\u0438\u043C\u043A\u0438 \u0437\u0430 \u0441\u0430\u0439\u0442\u0430",
201
+ specialist: "\u041F\u0440\u043E\u0444\u0438\u043B \u043D\u0430 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u0438\u043A\u0430",
202
+ staff: "\u0415\u043A\u0438\u043F",
203
+ services: "\u0423\u0441\u043B\u0443\u0433\u0438 \u0437\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u0438",
204
+ offers: "\u041E\u0444\u0435\u0440\u0442\u0438",
205
+ brands: "\u0411\u0440\u0430\u043D\u0434\u043E\u0432\u0435",
206
+ blog: "\u0411\u043B\u043E\u0433",
207
+ hours: "\u0420\u0430\u0431\u043E\u0442\u043D\u043E \u0432\u0440\u0435\u043C\u0435",
208
+ bookings: "\u0420\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u0438",
209
+ clients: "\u041A\u043B\u0438\u0435\u043D\u0442\u0438",
210
+ domain: "\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D \u0434\u043E\u043C\u0435\u0439\u043D",
211
+ payments: "\u041F\u043B\u0430\u0449\u0430\u043D\u0438\u044F",
212
+ integrations: "\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438",
213
+ marketing: "\u041C\u0430\u0440\u043A\u0435\u0442\u0438\u043D\u0433",
214
+ legal: "\u041F\u0440\u0430\u0432\u043D\u0438",
215
+ account: "\u0410\u043A\u0430\u0443\u043D\u0442"
216
+ },
217
+ groups: {
218
+ navigation: "\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F",
219
+ content: "\u0421\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435",
220
+ team: "\u0415\u043A\u0438\u043F",
221
+ settings: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438",
222
+ site: "\u0421\u0430\u0439\u0442",
223
+ engine: "\u0420\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u043E\u043D\u0435\u043D \u043C\u043E\u0434\u0443\u043B",
224
+ publicSite: "\u041F\u0443\u0431\u043B\u0438\u0447\u0435\u043D \u0441\u0430\u0439\u0442",
225
+ delivery: "\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u0438 \u0434\u043E\u043C\u0435\u0439\u043D",
226
+ account: "\u0410\u043A\u0430\u0443\u043D\u0442"
227
+ },
228
+ actions: {
229
+ save: "\u0417\u0430\u043F\u0430\u0437\u0438",
230
+ copyLink: "\u041A\u043E\u043F\u0438\u0440\u0430\u0439 \u043B\u0438\u043D\u043A\u0430",
231
+ qrCode: "QR \u043A\u043E\u0434",
232
+ closeMenu: "\u0417\u0430\u0442\u0432\u043E\u0440\u0438 \u043C\u0435\u043D\u044E\u0442\u043E"
233
+ },
234
+ notices: {
235
+ siteSaved: "\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F\u0442\u0430 \u0435 \u0437\u0430\u043F\u0430\u0437\u0435\u043D\u0430.",
236
+ profileSaved: "\u041F\u0440\u043E\u0444\u0438\u043B\u044A\u0442 \u0435 \u0437\u0430\u043F\u0430\u0437\u0435\u043D.",
237
+ imagesSaved: "\u0421\u043D\u0438\u043C\u043A\u0438\u0442\u0435 \u0441\u0430 \u0437\u0430\u043F\u0430\u0437\u0435\u043D\u0438.",
238
+ imagesUploadNeedsSave: '\u0421\u043D\u0438\u043C\u043A\u0438\u0442\u0435 \u0441\u0430 \u043A\u0430\u0447\u0435\u043D\u0438, \u043D\u043E \u043D\u0435 \u0443\u0441\u043F\u044F\u0445\u043C\u0435 \u0434\u0430 \u0433\u0438 \u0437\u0430\u043F\u0430\u0437\u0438\u043C. \u041D\u0430\u0442\u0438\u0441\u043D\u0438 \u201E\u0417\u0430\u043F\u0430\u0437\u0438".',
239
+ servicesSaved: "\u0423\u0441\u043B\u0443\u0433\u0438\u0442\u0435 \u0441\u0430 \u0437\u0430\u043F\u0430\u0437\u0435\u043D\u0438.",
240
+ hoursSaved: "\u0420\u0430\u0431\u043E\u0442\u043D\u043E\u0442\u043E \u0432\u0440\u0435\u043C\u0435 \u0435 \u0437\u0430\u043F\u0430\u0437\u0435\u043D\u043E.",
241
+ linkCopied: "\u041B\u0438\u043D\u043A\u044A\u0442 \u0435 \u043A\u043E\u043F\u0438\u0440\u0430\u043D!"
242
+ },
243
+ siteTab: {
244
+ sections: {
245
+ basics: "\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u0438",
246
+ address: "WWW.",
247
+ addressMobile: "\u0410\u0434\u0440\u0435\u0441 / WWW",
248
+ about: "\u0417\u0430 \u0441\u0430\u043B\u043E\u043D\u0430",
249
+ faq: "FAQ",
250
+ amenities: "\u0414\u043E\u043F\u044A\u043B\u043D\u0438\u0442\u0435\u043B\u043D\u0430",
251
+ amenitiesMobile: "\u0414\u043E\u043F. \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F"
252
+ },
253
+ fields: {
254
+ salonName: "\u0418\u043C\u0435 \u043D\u0430 \u0441\u0430\u043B\u043E\u043D\u0430",
255
+ category: "\u041A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F",
256
+ phone: "\u0422\u0435\u043B\u0435\u0444\u043E\u043D",
257
+ email: "\u0418\u043C\u0435\u0439\u043B",
258
+ city: "\u0413\u0440\u0430\u0434",
259
+ language: "\u0415\u0437\u0438\u043A",
260
+ address: "\u0410\u0434\u0440\u0435\u0441"
261
+ },
262
+ languageOptions: {
263
+ bg: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438",
264
+ en: "\u0410\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438"
265
+ },
266
+ locationFallback: "\u041B\u043E\u043A\u0430\u0446\u0438\u044F",
267
+ viewAppleMaps: "\u0412\u0438\u0436 \u0432 Apple Maps",
268
+ socialPlaceholder: "salonnaprimer",
269
+ connectedDomain: "\u0421\u0432\u044A\u0440\u0437\u0430\u043D \u0434\u043E\u043C\u0435\u0439\u043D",
270
+ manage: "\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0432\u0430\u0439",
271
+ connectOwnDomain: "\u0421\u0432\u044A\u0440\u0436\u0438 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D \u0434\u043E\u043C\u0435\u0439\u043D",
272
+ connectOwnDomainHint: "\u0412\u044A\u0432\u0435\u0434\u0438 \u0434\u043E\u043C\u0435\u0439\u043D, \u043A\u043E\u0439\u0442\u043E \u0432\u0435\u0447\u0435 \u0441\u0438 \u043A\u0443\u043F\u0438\u043B, \u0438 \u0433\u043E \u043D\u0430\u0441\u043E\u0447\u0438 \u043A\u044A\u043C \u0441\u0430\u0439\u0442\u0430."
273
+ }
274
+ }
275
+ };
276
+
277
+ // ../../locales/en.json
278
+ var en_default = {
279
+ booking: {
280
+ modal: {
281
+ ariaLabel: "Booking",
282
+ titleDefault: "Book",
283
+ titleWithStaff: "with {name}",
284
+ closeAria: "Close",
285
+ confirmClose: "Are you sure you want to close the booking?",
286
+ stepService: "Service",
287
+ stepSpecialist: "Specialist",
288
+ stepTime: "Time",
289
+ stepDetails: "Details",
290
+ stepAria: "Step {n}: {label}",
291
+ selectedServices: "Selected services",
292
+ services: "Services",
293
+ serviceCountOne: "{count} service",
294
+ serviceCountMany: "{count} services",
295
+ minSuffix: "min",
296
+ remove: "Remove",
297
+ removeAria: "Remove service",
298
+ addMoreServices: "Add more services",
299
+ hideList: "Hide list \xB7 {count} selected",
300
+ add: "Add",
301
+ addService: "Add service",
302
+ noServicesInCategory: "No services in this category.",
303
+ selectSpecialist: "Choose a specialist",
304
+ availableFor: "Available for",
305
+ serviceUnavailable: "This service is not available for booking right now.",
306
+ selectOtherService: "Choose a different service",
307
+ dateTime: "Date & time",
308
+ timeWithStaff: "Time with {name}",
309
+ date: "Date",
310
+ time: "Time",
311
+ selectDateFirst: "Please select a date first.",
312
+ dayClosed: "The salon is closed on this day.",
313
+ noSlots: "No available slots for the selected services.",
314
+ selectServiceFirst: "Please select a service first.",
315
+ contactDetails: "Your details",
316
+ name: "Name",
317
+ phone: "Phone",
318
+ email: "Email",
319
+ notes: "Notes (optional)",
320
+ smsConsentPre: "I agree to receive SMS reminders for this booking from",
321
+ smsConsentPost: "to the phone number provided. I have read the",
322
+ smsConsentAnd: "and",
323
+ terms: "Terms & Conditions",
324
+ privacy: "Privacy Policy",
325
+ smsConsentNote: "Without this, your booking is still valid \u2014 you just won't receive SMS reminders from the salon.",
326
+ totalDuration: "Total: {min} min",
327
+ totalPrice: "Total: {price}",
328
+ startTime: "Starts {start} \xB7 Done around {end}",
329
+ depositRequired: "Deposit required:",
330
+ paymentFrom: "Payment of",
331
+ securePayment: "Secure payment via",
332
+ back: "Back",
333
+ continue: "Continue",
334
+ sendRequest: "Request booking",
335
+ payAndBook: "Pay & book",
336
+ disclaimerPre: "To complete your booking we need your name, phone and email \u2014 used only to manage your appointment, send confirmations and reminders.",
337
+ disclaimerAccept: "By submitting you accept the"
338
+ },
339
+ success: {
340
+ confirmed: "Booking confirmed",
341
+ waitingAt: "We'll see you at",
342
+ labelService: "Service",
343
+ labelWhen: "When",
344
+ timeFormat: "{date} at {time}",
345
+ done: "Done"
346
+ },
347
+ errors: {
348
+ noService: "Please select at least one service.",
349
+ noName: "Please enter your name.",
350
+ noPhone: "Please enter your phone number.",
351
+ noEmail: "Please enter your email.",
352
+ noDate: "Please select a date.",
353
+ noTime: "Please select a time.",
354
+ saveFailed: "Your booking could not be saved. Please try again.",
355
+ httpError: "Error {status}",
356
+ paymentFailed: "Could not initialise payment. Please try again.",
357
+ generic: "Something went wrong. Please try again."
358
+ }
359
+ },
360
+ adminAuth: {
361
+ loading: "Loading\u2026",
362
+ signIn: {
363
+ title: "Sign in",
364
+ subtitle: "Enter your email and password to access the panel.",
365
+ emailLabel: "Email",
366
+ emailPlaceholder: "name@example.com",
367
+ passwordLabel: "Password",
368
+ passwordPlaceholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",
369
+ showPassword: "Show password",
370
+ hidePassword: "Hide password",
371
+ submit: "Sign in",
372
+ submitting: "Signing in\u2026",
373
+ forgot: "Forgot password?",
374
+ errorGeneric: "Error",
375
+ errorLogin: "Sign-in failed"
376
+ },
377
+ forgot: {
378
+ back: "\u2190 Back",
379
+ title: "Forgot password",
380
+ subtitle: "Enter the account email. We will send a link to set a new password.",
381
+ submit: "Send link",
382
+ submitting: "Sending\u2026",
383
+ sentTitle: "Check your inbox",
384
+ sentBody: "We sent a link to set a new password.",
385
+ backToSignIn: "Back to sign in"
386
+ },
387
+ setPassword: {
388
+ invalidLink: "Invalid link.",
389
+ invalidLinkHint: "Request a new one from the sign-in page.",
390
+ titleCreate: "Set password",
391
+ titleReset: "New password",
392
+ subtitleCreate: "Enter your name and choose a password to access the panel.",
393
+ subtitleReset: "Enter a new password for your panel.",
394
+ nameLabel: "Name",
395
+ namePlaceholder: "Your name",
396
+ emailLabel: "Email",
397
+ emailPlaceholder: "name@example.com",
398
+ passwordLabel: "Password",
399
+ passwordPlaceholder: "At least 8 characters",
400
+ confirmLabel: "Confirm password",
401
+ confirmPlaceholder: "Repeat the password",
402
+ show: "Show",
403
+ hide: "Hide",
404
+ submitCreate: "Create account \u2192",
405
+ submitReset: "Change password \u2192",
406
+ submittingCreate: "Creating\u2026",
407
+ submittingReset: "Saving\u2026",
408
+ mismatch: "Passwords do not match.",
409
+ doneCreate: "Account created!",
410
+ doneReset: "Password changed!",
411
+ doneRedirect: "Signing you in\u2026",
412
+ haveAccount: "Already have an account?",
413
+ signInLink: "Sign in",
414
+ errorGeneric: "Error"
415
+ }
416
+ },
417
+ common: {
418
+ days: {
419
+ monday: "Monday",
420
+ tuesday: "Tuesday",
421
+ wednesday: "Wednesday",
422
+ thursday: "Thursday",
423
+ friday: "Friday",
424
+ saturday: "Saturday",
425
+ sunday: "Sunday"
426
+ }
427
+ },
428
+ adminDashboard: {
429
+ navigation: "Navigation",
430
+ tabs: {
431
+ site: "Website",
432
+ images: "Site images",
433
+ specialist: "Owner profile",
434
+ staff: "Team",
435
+ services: "Booking services",
436
+ offers: "Offers",
437
+ brands: "Brands",
438
+ blog: "Blog",
439
+ hours: "Working hours",
440
+ bookings: "Booking",
441
+ clients: "Clients",
442
+ domain: "Custom domain",
443
+ payments: "Payments",
444
+ integrations: "Integrations",
445
+ marketing: "Marketing",
446
+ legal: "Legal",
447
+ account: "Account"
448
+ },
449
+ groups: {
450
+ navigation: "Navigation",
451
+ content: "Content",
452
+ team: "Team",
453
+ settings: "Settings",
454
+ site: "Site",
455
+ engine: "Booking engine",
456
+ publicSite: "Public site",
457
+ delivery: "Delivery",
458
+ account: "Account"
459
+ },
460
+ actions: {
461
+ save: "Save",
462
+ copyLink: "Copy link",
463
+ qrCode: "QR code",
464
+ closeMenu: "Close menu"
465
+ },
466
+ notices: {
467
+ siteSaved: "Information saved.",
468
+ profileSaved: "Profile saved.",
469
+ imagesSaved: "Images saved.",
470
+ imagesUploadNeedsSave: 'The images were uploaded, but we could not save them. Press "Save".',
471
+ servicesSaved: "Services saved.",
472
+ hoursSaved: "Working hours saved.",
473
+ linkCopied: "Link copied!"
474
+ },
475
+ siteTab: {
476
+ sections: {
477
+ basics: "Contacts",
478
+ address: "WWW.",
479
+ addressMobile: "Address / WWW",
480
+ about: "About",
481
+ faq: "FAQ",
482
+ amenities: "Additional",
483
+ amenitiesMobile: "More info"
484
+ },
485
+ fields: {
486
+ salonName: "Salon name",
487
+ category: "Category",
488
+ phone: "Phone",
489
+ email: "Email",
490
+ city: "City",
491
+ language: "Language",
492
+ address: "Address"
493
+ },
494
+ languageOptions: {
495
+ bg: "Bulgarian",
496
+ en: "English"
497
+ },
498
+ locationFallback: "Location",
499
+ viewAppleMaps: "View in Apple Maps",
500
+ socialPlaceholder: "salonexample",
501
+ connectedDomain: "Connected domain",
502
+ manage: "Manage",
503
+ connectOwnDomain: "Connect your own domain",
504
+ connectOwnDomainHint: "Enter a domain you already bought and point it to the site."
505
+ }
506
+ }
507
+ };
508
+
509
+ // ../../lib/i18n.ts
510
+ var dict = { bg: bg_default, en: en_default };
511
+ function resolve(obj, keys) {
512
+ let cur = obj;
513
+ for (const k of keys) {
514
+ if (cur == null || typeof cur !== "object") return void 0;
515
+ cur = cur[k];
516
+ }
517
+ return typeof cur === "string" ? cur : void 0;
518
+ }
519
+ function interpolate(str, vars) {
520
+ return str.replace(/\{(\w+)\}/g, (_, k) => String(vars[k] ?? `{${k}}`));
521
+ }
522
+ function normalizeLocale(value) {
523
+ const normalized = String(value ?? "").trim().toLowerCase();
524
+ return normalized === "en" || normalized.startsWith("en-") ? "en" : "bg";
525
+ }
526
+ function getT(locale) {
527
+ const translations = dict[locale] ?? dict.bg;
528
+ return function t(key, vars) {
529
+ const parts = key.split(".");
530
+ let value = resolve(translations, parts);
531
+ if (value === void 0) {
532
+ value = resolve(dict.bg, parts) ?? key;
533
+ }
534
+ return vars ? interpolate(value, vars) : value;
535
+ };
536
+ }
537
+ var I18nContext = createContext(getT("bg"));
538
+ function I18nProvider({ locale, children }) {
539
+ const t = getT(locale);
540
+ return /* @__PURE__ */ jsx(I18nContext.Provider, { value: t, children });
541
+ }
542
+ function useT() {
543
+ return useContext(I18nContext);
544
+ }
545
+
546
+ export { I18nProvider, buildServiceCategoryTabs, enrichServiceCategories, normalizeLocale, serviceMatchesCategory, useT };
547
+ //# sourceMappingURL=chunk-HA7DFBYI.js.map
548
+ //# sourceMappingURL=chunk-HA7DFBYI.js.map