@semiont/react-ui 0.2.28-build.40
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/README.md +287 -0
- package/dist/TranslationManager-Co_5fSxl.d.mts +118 -0
- package/dist/ar-TQSFB35U.mjs +325 -0
- package/dist/ar-TQSFB35U.mjs.map +1 -0
- package/dist/bn-525U24T3.mjs +325 -0
- package/dist/bn-525U24T3.mjs.map +1 -0
- package/dist/chunk-3JTO27MH.mjs +50 -0
- package/dist/chunk-3JTO27MH.mjs.map +1 -0
- package/dist/chunk-BHAP6MVA.mjs +325 -0
- package/dist/chunk-BHAP6MVA.mjs.map +1 -0
- package/dist/chunk-W6E2UESX.mjs +387 -0
- package/dist/chunk-W6E2UESX.mjs.map +1 -0
- package/dist/cs-OYWTGLFM.mjs +325 -0
- package/dist/cs-OYWTGLFM.mjs.map +1 -0
- package/dist/da-BDXG2ITK.mjs +325 -0
- package/dist/da-BDXG2ITK.mjs.map +1 -0
- package/dist/de-NB5JLMES.mjs +325 -0
- package/dist/de-NB5JLMES.mjs.map +1 -0
- package/dist/el-3SVXEAJI.mjs +325 -0
- package/dist/el-3SVXEAJI.mjs.map +1 -0
- package/dist/en-DVB4OE2R.mjs +39 -0
- package/dist/en-DVB4OE2R.mjs.map +1 -0
- package/dist/es-YBOFA3W5.mjs +325 -0
- package/dist/es-YBOFA3W5.mjs.map +1 -0
- package/dist/fa-7MU36AMY.mjs +325 -0
- package/dist/fa-7MU36AMY.mjs.map +1 -0
- package/dist/fi-PQKJB32G.mjs +325 -0
- package/dist/fi-PQKJB32G.mjs.map +1 -0
- package/dist/fr-U4HK5GM6.mjs +325 -0
- package/dist/fr-U4HK5GM6.mjs.map +1 -0
- package/dist/he-F5MNZHAL.mjs +325 -0
- package/dist/he-F5MNZHAL.mjs.map +1 -0
- package/dist/hi-2PHI37ZX.mjs +325 -0
- package/dist/hi-2PHI37ZX.mjs.map +1 -0
- package/dist/id-JPRBNCGS.mjs +325 -0
- package/dist/id-JPRBNCGS.mjs.map +1 -0
- package/dist/index.d.mts +3003 -0
- package/dist/index.mjs +51026 -0
- package/dist/index.mjs.map +1 -0
- package/dist/it-MRLWI5OS.mjs +325 -0
- package/dist/it-MRLWI5OS.mjs.map +1 -0
- package/dist/ja-YQ6RPI2T.mjs +325 -0
- package/dist/ja-YQ6RPI2T.mjs.map +1 -0
- package/dist/ko-DUAVCEXX.mjs +325 -0
- package/dist/ko-DUAVCEXX.mjs.map +1 -0
- package/dist/magic-string.es-7FJ3LUGB.mjs +1310 -0
- package/dist/magic-string.es-7FJ3LUGB.mjs.map +1 -0
- package/dist/ms-FBHSR4PG.mjs +325 -0
- package/dist/ms-FBHSR4PG.mjs.map +1 -0
- package/dist/nl-IC2MPZXN.mjs +325 -0
- package/dist/nl-IC2MPZXN.mjs.map +1 -0
- package/dist/no-LLD43NRM.mjs +325 -0
- package/dist/no-LLD43NRM.mjs.map +1 -0
- package/dist/pl-DDOJBR4D.mjs +325 -0
- package/dist/pl-DDOJBR4D.mjs.map +1 -0
- package/dist/pt-7TFHQRRN.mjs +325 -0
- package/dist/pt-7TFHQRRN.mjs.map +1 -0
- package/dist/ro-P4PJEGDU.mjs +325 -0
- package/dist/ro-P4PJEGDU.mjs.map +1 -0
- package/dist/sv-LF3VEQD2.mjs +325 -0
- package/dist/sv-LF3VEQD2.mjs.map +1 -0
- package/dist/test-utils.d.mts +104 -0
- package/dist/test-utils.mjs +34240 -0
- package/dist/test-utils.mjs.map +1 -0
- package/dist/th-YUQAOFXF.mjs +325 -0
- package/dist/th-YUQAOFXF.mjs.map +1 -0
- package/dist/tr-CSIGLMJC.mjs +325 -0
- package/dist/tr-CSIGLMJC.mjs.map +1 -0
- package/dist/uk-LW3QBKSR.mjs +325 -0
- package/dist/uk-LW3QBKSR.mjs.map +1 -0
- package/dist/vi-W464Y6ZC.mjs +325 -0
- package/dist/vi-W464Y6ZC.mjs.map +1 -0
- package/dist/zh-R5XLM3EI.mjs +325 -0
- package/dist/zh-R5XLM3EI.mjs.map +1 -0
- package/package.json +62 -0
- package/translations/ar.json +287 -0
- package/translations/bn.json +287 -0
- package/translations/cs.json +287 -0
- package/translations/da.json +287 -0
- package/translations/de.json +287 -0
- package/translations/el.json +287 -0
- package/translations/en.json +287 -0
- package/translations/es.json +287 -0
- package/translations/fa.json +287 -0
- package/translations/fi.json +287 -0
- package/translations/fr.json +287 -0
- package/translations/he.json +287 -0
- package/translations/hi.json +287 -0
- package/translations/id.json +287 -0
- package/translations/it.json +287 -0
- package/translations/ja.json +287 -0
- package/translations/ko.json +287 -0
- package/translations/ms.json +287 -0
- package/translations/nl.json +287 -0
- package/translations/no.json +287 -0
- package/translations/pl.json +287 -0
- package/translations/pt.json +287 -0
- package/translations/ro.json +287 -0
- package/translations/sv.json +287 -0
- package/translations/th.json +287 -0
- package/translations/tr.json +287 -0
- package/translations/uk.json +287 -0
- package/translations/vi.json +287 -0
- package/translations/zh.json +287 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import {
|
|
3
|
+
en_default
|
|
4
|
+
} from "./chunk-BHAP6MVA.mjs";
|
|
5
|
+
import {
|
|
6
|
+
__glob
|
|
7
|
+
} from "./chunk-3JTO27MH.mjs";
|
|
8
|
+
|
|
9
|
+
// src/contexts/ApiClientContext.tsx
|
|
10
|
+
import { createContext, useContext } from "react";
|
|
11
|
+
import { jsx } from "react/jsx-runtime";
|
|
12
|
+
var ApiClientContext = createContext(null);
|
|
13
|
+
function ApiClientProvider({
|
|
14
|
+
apiClientManager,
|
|
15
|
+
children
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsx(ApiClientContext.Provider, { value: apiClientManager, children });
|
|
18
|
+
}
|
|
19
|
+
function useApiClient() {
|
|
20
|
+
const context = useContext(ApiClientContext);
|
|
21
|
+
if (!context) {
|
|
22
|
+
throw new Error("useApiClient must be used within an ApiClientProvider");
|
|
23
|
+
}
|
|
24
|
+
return context.client;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/contexts/SessionContext.tsx
|
|
28
|
+
import { createContext as createContext2, useContext as useContext2 } from "react";
|
|
29
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
30
|
+
var SessionContext = createContext2(null);
|
|
31
|
+
function SessionProvider({
|
|
32
|
+
sessionManager,
|
|
33
|
+
children
|
|
34
|
+
}) {
|
|
35
|
+
return /* @__PURE__ */ jsx2(SessionContext.Provider, { value: sessionManager, children });
|
|
36
|
+
}
|
|
37
|
+
function useSessionContext() {
|
|
38
|
+
const context = useContext2(SessionContext);
|
|
39
|
+
if (!context) {
|
|
40
|
+
throw new Error("useSessionContext must be used within SessionProvider");
|
|
41
|
+
}
|
|
42
|
+
return context;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/contexts/OpenResourcesContext.tsx
|
|
46
|
+
import { createContext as createContext3, useContext as useContext3 } from "react";
|
|
47
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
48
|
+
var OpenResourcesContext = createContext3(void 0);
|
|
49
|
+
function OpenResourcesProvider({
|
|
50
|
+
openResourcesManager,
|
|
51
|
+
children
|
|
52
|
+
}) {
|
|
53
|
+
return /* @__PURE__ */ jsx3(OpenResourcesContext.Provider, { value: openResourcesManager, children });
|
|
54
|
+
}
|
|
55
|
+
function useOpenResources() {
|
|
56
|
+
const context = useContext3(OpenResourcesContext);
|
|
57
|
+
if (context === void 0) {
|
|
58
|
+
throw new Error("useOpenResources must be used within an OpenResourcesProvider");
|
|
59
|
+
}
|
|
60
|
+
return context;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/contexts/TranslationContext.tsx
|
|
64
|
+
import { createContext as createContext4, useContext as useContext4, useState, useEffect, useMemo } from "react";
|
|
65
|
+
import { Fragment, jsx as jsx4 } from "react/jsx-runtime";
|
|
66
|
+
|
|
67
|
+
// import("../../translations/**/*.json") in src/contexts/TranslationContext.tsx
|
|
68
|
+
var globImport_translations_json = __glob({
|
|
69
|
+
"../../translations/ar.json": () => import("./ar-TQSFB35U.mjs"),
|
|
70
|
+
"../../translations/bn.json": () => import("./bn-525U24T3.mjs"),
|
|
71
|
+
"../../translations/cs.json": () => import("./cs-OYWTGLFM.mjs"),
|
|
72
|
+
"../../translations/da.json": () => import("./da-BDXG2ITK.mjs"),
|
|
73
|
+
"../../translations/de.json": () => import("./de-NB5JLMES.mjs"),
|
|
74
|
+
"../../translations/el.json": () => import("./el-3SVXEAJI.mjs"),
|
|
75
|
+
"../../translations/en.json": () => import("./en-DVB4OE2R.mjs"),
|
|
76
|
+
"../../translations/es.json": () => import("./es-YBOFA3W5.mjs"),
|
|
77
|
+
"../../translations/fa.json": () => import("./fa-7MU36AMY.mjs"),
|
|
78
|
+
"../../translations/fi.json": () => import("./fi-PQKJB32G.mjs"),
|
|
79
|
+
"../../translations/fr.json": () => import("./fr-U4HK5GM6.mjs"),
|
|
80
|
+
"../../translations/he.json": () => import("./he-F5MNZHAL.mjs"),
|
|
81
|
+
"../../translations/hi.json": () => import("./hi-2PHI37ZX.mjs"),
|
|
82
|
+
"../../translations/id.json": () => import("./id-JPRBNCGS.mjs"),
|
|
83
|
+
"../../translations/it.json": () => import("./it-MRLWI5OS.mjs"),
|
|
84
|
+
"../../translations/ja.json": () => import("./ja-YQ6RPI2T.mjs"),
|
|
85
|
+
"../../translations/ko.json": () => import("./ko-DUAVCEXX.mjs"),
|
|
86
|
+
"../../translations/ms.json": () => import("./ms-FBHSR4PG.mjs"),
|
|
87
|
+
"../../translations/nl.json": () => import("./nl-IC2MPZXN.mjs"),
|
|
88
|
+
"../../translations/no.json": () => import("./no-LLD43NRM.mjs"),
|
|
89
|
+
"../../translations/pl.json": () => import("./pl-DDOJBR4D.mjs"),
|
|
90
|
+
"../../translations/pt.json": () => import("./pt-7TFHQRRN.mjs"),
|
|
91
|
+
"../../translations/ro.json": () => import("./ro-P4PJEGDU.mjs"),
|
|
92
|
+
"../../translations/sv.json": () => import("./sv-LF3VEQD2.mjs"),
|
|
93
|
+
"../../translations/th.json": () => import("./th-YUQAOFXF.mjs"),
|
|
94
|
+
"../../translations/tr.json": () => import("./tr-CSIGLMJC.mjs"),
|
|
95
|
+
"../../translations/uk.json": () => import("./uk-LW3QBKSR.mjs"),
|
|
96
|
+
"../../translations/vi.json": () => import("./vi-W464Y6ZC.mjs"),
|
|
97
|
+
"../../translations/zh.json": () => import("./zh-R5XLM3EI.mjs")
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// src/contexts/TranslationContext.tsx
|
|
101
|
+
var TranslationContext = createContext4(null);
|
|
102
|
+
var translationCache = /* @__PURE__ */ new Map();
|
|
103
|
+
var AVAILABLE_LOCALES = [
|
|
104
|
+
"ar",
|
|
105
|
+
// Arabic
|
|
106
|
+
"bn",
|
|
107
|
+
// Bengali
|
|
108
|
+
"cs",
|
|
109
|
+
// Czech
|
|
110
|
+
"da",
|
|
111
|
+
// Danish
|
|
112
|
+
"de",
|
|
113
|
+
// German
|
|
114
|
+
"el",
|
|
115
|
+
// Greek
|
|
116
|
+
"en",
|
|
117
|
+
// English
|
|
118
|
+
"es",
|
|
119
|
+
// Spanish
|
|
120
|
+
"fa",
|
|
121
|
+
// Persian/Farsi
|
|
122
|
+
"fi",
|
|
123
|
+
// Finnish
|
|
124
|
+
"fr",
|
|
125
|
+
// French
|
|
126
|
+
"he",
|
|
127
|
+
// Hebrew
|
|
128
|
+
"hi",
|
|
129
|
+
// Hindi
|
|
130
|
+
"id",
|
|
131
|
+
// Indonesian
|
|
132
|
+
"it",
|
|
133
|
+
// Italian
|
|
134
|
+
"ja",
|
|
135
|
+
// Japanese
|
|
136
|
+
"ko",
|
|
137
|
+
// Korean
|
|
138
|
+
"ms",
|
|
139
|
+
// Malay
|
|
140
|
+
"nl",
|
|
141
|
+
// Dutch
|
|
142
|
+
"no",
|
|
143
|
+
// Norwegian
|
|
144
|
+
"pl",
|
|
145
|
+
// Polish
|
|
146
|
+
"pt",
|
|
147
|
+
// Portuguese
|
|
148
|
+
"ro",
|
|
149
|
+
// Romanian
|
|
150
|
+
"sv",
|
|
151
|
+
// Swedish
|
|
152
|
+
"th",
|
|
153
|
+
// Thai
|
|
154
|
+
"tr",
|
|
155
|
+
// Turkish
|
|
156
|
+
"uk",
|
|
157
|
+
// Ukrainian
|
|
158
|
+
"vi",
|
|
159
|
+
// Vietnamese
|
|
160
|
+
"zh"
|
|
161
|
+
// Chinese
|
|
162
|
+
];
|
|
163
|
+
async function loadTranslations(locale) {
|
|
164
|
+
if (translationCache.has(locale)) {
|
|
165
|
+
return translationCache.get(locale);
|
|
166
|
+
}
|
|
167
|
+
if (locale === "en") {
|
|
168
|
+
translationCache.set("en", en_default);
|
|
169
|
+
return en_default;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const translations = await globImport_translations_json(`../../translations/${locale}.json`);
|
|
173
|
+
const translationData = translations.default || translations;
|
|
174
|
+
translationCache.set(locale, translationData);
|
|
175
|
+
return translationData;
|
|
176
|
+
} catch (error) {
|
|
177
|
+
console.error(`Failed to load translations for locale: ${locale}`, error);
|
|
178
|
+
return en_default;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
var defaultTranslationManager = {
|
|
182
|
+
t: (namespace, key, params) => {
|
|
183
|
+
const translations = en_default;
|
|
184
|
+
const translation = translations[namespace]?.[key];
|
|
185
|
+
if (!translation) {
|
|
186
|
+
console.warn(`Translation not found for ${namespace}.${key}`);
|
|
187
|
+
return `${namespace}.${key}`;
|
|
188
|
+
}
|
|
189
|
+
if (params && typeof translation === "string") {
|
|
190
|
+
let result = translation;
|
|
191
|
+
Object.entries(params).forEach(([paramKey, paramValue]) => {
|
|
192
|
+
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
193
|
+
});
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
return translation;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
function TranslationProvider({
|
|
200
|
+
translationManager,
|
|
201
|
+
locale,
|
|
202
|
+
loadingComponent = null,
|
|
203
|
+
children
|
|
204
|
+
}) {
|
|
205
|
+
const [loadedTranslations, setLoadedTranslations] = useState(null);
|
|
206
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
207
|
+
useEffect(() => {
|
|
208
|
+
if (locale && !translationManager) {
|
|
209
|
+
setIsLoading(true);
|
|
210
|
+
loadTranslations(locale).then((translations) => {
|
|
211
|
+
setLoadedTranslations(translations);
|
|
212
|
+
setIsLoading(false);
|
|
213
|
+
}).catch((error) => {
|
|
214
|
+
console.error("Failed to load translations:", error);
|
|
215
|
+
setLoadedTranslations(en_default);
|
|
216
|
+
setIsLoading(false);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}, [locale, translationManager]);
|
|
220
|
+
const localeManager = useMemo(() => {
|
|
221
|
+
if (!loadedTranslations) return null;
|
|
222
|
+
return {
|
|
223
|
+
t: (namespace, key, params) => {
|
|
224
|
+
const translation = loadedTranslations[namespace]?.[key];
|
|
225
|
+
if (!translation) {
|
|
226
|
+
console.warn(`Translation not found for ${namespace}.${key} in locale ${locale}`);
|
|
227
|
+
return `${namespace}.${key}`;
|
|
228
|
+
}
|
|
229
|
+
if (params && typeof translation === "string") {
|
|
230
|
+
let result = translation;
|
|
231
|
+
Object.entries(params).forEach(([paramKey, paramValue]) => {
|
|
232
|
+
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
233
|
+
});
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
return translation;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
}, [loadedTranslations, locale]);
|
|
240
|
+
if (translationManager) {
|
|
241
|
+
return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: translationManager, children });
|
|
242
|
+
}
|
|
243
|
+
if (locale && isLoading) {
|
|
244
|
+
return /* @__PURE__ */ jsx4(Fragment, { children: loadingComponent });
|
|
245
|
+
}
|
|
246
|
+
if (locale && localeManager) {
|
|
247
|
+
return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: localeManager, children });
|
|
248
|
+
}
|
|
249
|
+
return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: defaultTranslationManager, children });
|
|
250
|
+
}
|
|
251
|
+
function useTranslations(namespace) {
|
|
252
|
+
const context = useContext4(TranslationContext);
|
|
253
|
+
if (!context) {
|
|
254
|
+
return (key, params) => {
|
|
255
|
+
const translations = en_default;
|
|
256
|
+
const translation = translations[namespace]?.[key];
|
|
257
|
+
if (!translation) {
|
|
258
|
+
console.warn(`Translation not found for ${namespace}.${key}`);
|
|
259
|
+
return `${namespace}.${key}`;
|
|
260
|
+
}
|
|
261
|
+
if (params && typeof translation === "string") {
|
|
262
|
+
let result = translation;
|
|
263
|
+
Object.entries(params).forEach(([paramKey, paramValue]) => {
|
|
264
|
+
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
265
|
+
});
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
return translation;
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
return (key, params) => context.t(namespace, key, params);
|
|
272
|
+
}
|
|
273
|
+
function usePreloadTranslations() {
|
|
274
|
+
return {
|
|
275
|
+
preload: async (locale) => {
|
|
276
|
+
try {
|
|
277
|
+
await loadTranslations(locale);
|
|
278
|
+
return true;
|
|
279
|
+
} catch (error) {
|
|
280
|
+
console.error(`Failed to preload translations for ${locale}:`, error);
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
isLoaded: (locale) => translationCache.has(locale)
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// src/components/Toast.tsx
|
|
289
|
+
import React4, { useEffect as useEffect2, useState as useState2 } from "react";
|
|
290
|
+
import { createPortal } from "react-dom";
|
|
291
|
+
import { jsx as jsx5, jsxs } from "react/jsx-runtime";
|
|
292
|
+
var icons = {
|
|
293
|
+
success: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
|
|
294
|
+
error: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
|
|
295
|
+
warning: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }),
|
|
296
|
+
info: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) })
|
|
297
|
+
};
|
|
298
|
+
var styles = {
|
|
299
|
+
success: "bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 border-green-200 dark:border-green-800",
|
|
300
|
+
error: "bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 border-red-200 dark:border-red-800",
|
|
301
|
+
warning: "bg-yellow-50 dark:bg-yellow-900/20 text-yellow-800 dark:text-yellow-200 border-yellow-200 dark:border-yellow-800",
|
|
302
|
+
info: "bg-blue-50 dark:bg-blue-900/20 text-blue-800 dark:text-blue-200 border-blue-200 dark:border-blue-800"
|
|
303
|
+
};
|
|
304
|
+
function Toast({ toast, onClose }) {
|
|
305
|
+
useEffect2(() => {
|
|
306
|
+
const timer = setTimeout(() => {
|
|
307
|
+
onClose(toast.id);
|
|
308
|
+
}, toast.duration || 3e3);
|
|
309
|
+
return () => clearTimeout(timer);
|
|
310
|
+
}, [toast, onClose]);
|
|
311
|
+
return /* @__PURE__ */ jsxs(
|
|
312
|
+
"div",
|
|
313
|
+
{
|
|
314
|
+
className: `flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg transition-all duration-300 transform ${styles[toast.type]}`,
|
|
315
|
+
role: "alert",
|
|
316
|
+
children: [
|
|
317
|
+
/* @__PURE__ */ jsx5("div", { className: "flex-shrink-0", children: icons[toast.type] }),
|
|
318
|
+
/* @__PURE__ */ jsx5("p", { className: "text-sm font-medium", children: toast.message }),
|
|
319
|
+
/* @__PURE__ */ jsx5(
|
|
320
|
+
"button",
|
|
321
|
+
{
|
|
322
|
+
onClick: () => onClose(toast.id),
|
|
323
|
+
className: "ml-auto flex-shrink-0 hover:opacity-70 transition-opacity",
|
|
324
|
+
"aria-label": "Close",
|
|
325
|
+
children: /* @__PURE__ */ jsx5("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
326
|
+
}
|
|
327
|
+
)
|
|
328
|
+
]
|
|
329
|
+
}
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
function ToastContainer({ toasts, onClose }) {
|
|
333
|
+
const [mounted, setMounted] = useState2(false);
|
|
334
|
+
useEffect2(() => {
|
|
335
|
+
setMounted(true);
|
|
336
|
+
return () => setMounted(false);
|
|
337
|
+
}, []);
|
|
338
|
+
if (!mounted) return null;
|
|
339
|
+
return createPortal(
|
|
340
|
+
/* @__PURE__ */ jsx5("div", { className: "fixed top-4 right-4 z-50 space-y-2 max-w-sm", children: toasts.map((toast) => /* @__PURE__ */ jsx5(Toast, { toast, onClose }, toast.id)) }),
|
|
341
|
+
document.body
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
var ToastContext = React4.createContext(void 0);
|
|
345
|
+
function ToastProvider({ children }) {
|
|
346
|
+
const [toasts, setToasts] = useState2([]);
|
|
347
|
+
const showToast = (message, type = "info", duration) => {
|
|
348
|
+
const id = Date.now().toString();
|
|
349
|
+
const newToast = duration !== void 0 ? { id, message, type, duration } : { id, message, type };
|
|
350
|
+
setToasts((prev) => [...prev, newToast]);
|
|
351
|
+
};
|
|
352
|
+
const showSuccess = (message, duration) => showToast(message, "success", duration);
|
|
353
|
+
const showError = (message, duration) => showToast(message, "error", duration);
|
|
354
|
+
const showWarning = (message, duration) => showToast(message, "warning", duration);
|
|
355
|
+
const showInfo = (message, duration) => showToast(message, "info", duration);
|
|
356
|
+
const handleClose = (id) => {
|
|
357
|
+
setToasts((prev) => prev.filter((toast) => toast.id !== id));
|
|
358
|
+
};
|
|
359
|
+
return /* @__PURE__ */ jsxs(ToastContext.Provider, { value: { showToast, showSuccess, showError, showWarning, showInfo }, children: [
|
|
360
|
+
children,
|
|
361
|
+
/* @__PURE__ */ jsx5(ToastContainer, { toasts, onClose: handleClose })
|
|
362
|
+
] });
|
|
363
|
+
}
|
|
364
|
+
function useToast() {
|
|
365
|
+
const context = React4.useContext(ToastContext);
|
|
366
|
+
if (context === void 0) {
|
|
367
|
+
throw new Error("useToast must be used within a ToastProvider");
|
|
368
|
+
}
|
|
369
|
+
return context;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export {
|
|
373
|
+
ApiClientProvider,
|
|
374
|
+
useApiClient,
|
|
375
|
+
SessionProvider,
|
|
376
|
+
useSessionContext,
|
|
377
|
+
OpenResourcesProvider,
|
|
378
|
+
useOpenResources,
|
|
379
|
+
AVAILABLE_LOCALES,
|
|
380
|
+
TranslationProvider,
|
|
381
|
+
useTranslations,
|
|
382
|
+
usePreloadTranslations,
|
|
383
|
+
ToastContainer,
|
|
384
|
+
ToastProvider,
|
|
385
|
+
useToast
|
|
386
|
+
};
|
|
387
|
+
//# sourceMappingURL=chunk-W6E2UESX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/ApiClientContext.tsx","../src/contexts/SessionContext.tsx","../src/contexts/OpenResourcesContext.tsx","../src/contexts/TranslationContext.tsx","../src/components/Toast.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport type { ApiClientManager } from '../types/ApiClientManager';\n\nconst ApiClientContext = createContext<ApiClientManager | null>(null);\n\nexport interface ApiClientProviderProps {\n apiClientManager: ApiClientManager;\n children: ReactNode;\n}\n\n/**\n * Provider for API client management\n * Apps must provide an ApiClientManager implementation\n */\nexport function ApiClientProvider({\n apiClientManager,\n children,\n}: ApiClientProviderProps) {\n return (\n <ApiClientContext.Provider value={apiClientManager}>\n {children}\n </ApiClientContext.Provider>\n );\n}\n\n/**\n * Hook to access the API client\n * Must be used within an ApiClientProvider\n * @returns API client instance (null if not authenticated)\n */\nexport function useApiClient() {\n const context = useContext(ApiClientContext);\n\n if (!context) {\n throw new Error('useApiClient must be used within an ApiClientProvider');\n }\n\n return context.client;\n}\n","'use client';\n\nimport { createContext, useContext, ReactNode } from 'react';\nimport type { SessionManager } from '../types/SessionManager';\n\nconst SessionContext = createContext<SessionManager | null>(null);\n\n/**\n * Provider Pattern: Accepts SessionManager implementation as prop\n * and makes it available to child components via Context.\n *\n * Apps provide their own implementation (next-auth, custom auth, etc.)\n * and pass it to this provider at the root level.\n *\n * @example\n * ```tsx\n * // In app root\n * const sessionManager = useSessionManager(); // App's implementation\n *\n * <SessionProvider sessionManager={sessionManager}>\n * <App />\n * </SessionProvider>\n * ```\n */\nexport function SessionProvider({\n sessionManager,\n children\n}: {\n sessionManager: SessionManager;\n children: ReactNode;\n}) {\n return (\n <SessionContext.Provider value={sessionManager}>\n {children}\n </SessionContext.Provider>\n );\n}\n\n/**\n * Hook to access SessionManager from Context\n * Components use this hook to access session state and expiry information\n */\nexport function useSessionContext() {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSessionContext must be used within SessionProvider');\n }\n return context;\n}","'use client';\n\nimport React, { createContext, useContext } from 'react';\nimport type { OpenResourcesManager } from '../types/OpenResourcesManager';\n\nconst OpenResourcesContext = createContext<OpenResourcesManager | undefined>(undefined);\n\n/**\n * Provider Pattern: Accepts OpenResourcesManager implementation as prop\n * and makes it available to child components via Context.\n *\n * Apps provide their own implementation (localStorage, sessionStorage, database, etc.)\n * and pass it to this provider at the root level.\n *\n * @example\n * ```tsx\n * // In app root\n * const openResourcesManager = useOpenResourcesManager(); // App's implementation\n *\n * <OpenResourcesProvider openResourcesManager={openResourcesManager}>\n * <App />\n * </OpenResourcesProvider>\n * ```\n */\nexport function OpenResourcesProvider({\n openResourcesManager,\n children\n}: {\n openResourcesManager: OpenResourcesManager;\n children: React.ReactNode;\n}) {\n return (\n <OpenResourcesContext.Provider value={openResourcesManager}>\n {children}\n </OpenResourcesContext.Provider>\n );\n}\n\n/**\n * Hook to access OpenResourcesManager from Context\n * Components use this hook to access open resources functionality\n */\nexport function useOpenResources(): OpenResourcesManager {\n const context = useContext(OpenResourcesContext);\n if (context === undefined) {\n throw new Error('useOpenResources must be used within an OpenResourcesProvider');\n }\n return context;\n}","'use client';\n\nimport React, { createContext, useContext, ReactNode, useState, useEffect, useMemo } from 'react';\nimport type { TranslationManager } from '../types/TranslationManager';\n\n// Static import for default English only - always needed as fallback\nimport enTranslations from '../../translations/en.json';\n\nconst TranslationContext = createContext<TranslationManager | null>(null);\n\n// Cache for dynamically loaded translations\nconst translationCache = new Map<string, any>();\n\n// List of available locales (can be extended without importing all files)\nexport const AVAILABLE_LOCALES = [\n 'ar', // Arabic\n 'bn', // Bengali\n 'cs', // Czech\n 'da', // Danish\n 'de', // German\n 'el', // Greek\n 'en', // English\n 'es', // Spanish\n 'fa', // Persian/Farsi\n 'fi', // Finnish\n 'fr', // French\n 'he', // Hebrew\n 'hi', // Hindi\n 'id', // Indonesian\n 'it', // Italian\n 'ja', // Japanese\n 'ko', // Korean\n 'ms', // Malay\n 'nl', // Dutch\n 'no', // Norwegian\n 'pl', // Polish\n 'pt', // Portuguese\n 'ro', // Romanian\n 'sv', // Swedish\n 'th', // Thai\n 'tr', // Turkish\n 'uk', // Ukrainian\n 'vi', // Vietnamese\n 'zh', // Chinese\n] as const;\nexport type AvailableLocale = typeof AVAILABLE_LOCALES[number];\n\n// Lazy load translations for a specific locale\nasync function loadTranslations(locale: string): Promise<any> {\n // Check cache first\n if (translationCache.has(locale)) {\n return translationCache.get(locale);\n }\n\n // English is already loaded statically\n if (locale === 'en') {\n translationCache.set('en', enTranslations);\n return enTranslations;\n }\n\n try {\n // Dynamic import for all other locales\n const translations = await import(`../../translations/${locale}.json`);\n const translationData = translations.default || translations;\n translationCache.set(locale, translationData);\n return translationData;\n } catch (error) {\n console.error(`Failed to load translations for locale: ${locale}`, error);\n // Fall back to English\n return enTranslations;\n }\n}\n\n// Default English translation manager (using static import)\nconst defaultTranslationManager: TranslationManager = {\n t: (namespace: string, key: string, params?: Record<string, any>) => {\n const translations = enTranslations as Record<string, Record<string, string>>;\n const translation = translations[namespace]?.[key];\n\n if (!translation) {\n console.warn(`Translation not found for ${namespace}.${key}`);\n return `${namespace}.${key}`;\n }\n\n // Handle parameter interpolation\n if (params && typeof translation === 'string') {\n let result = translation;\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n }\n\n return translation;\n },\n};\n\nexport interface TranslationProviderProps {\n /**\n * Option 1: Provide a complete TranslationManager implementation\n */\n translationManager?: TranslationManager;\n\n /**\n * Option 2: Use built-in translations by specifying a locale\n * When adding new locales, just add the JSON file and update AVAILABLE_LOCALES\n */\n locale?: string;\n\n /**\n * Loading component to show while translations are being loaded\n * Only relevant when using dynamic locale loading\n */\n loadingComponent?: ReactNode;\n\n children: ReactNode;\n}\n\n/**\n * Provider for translation management with dynamic loading\n *\n * Three modes of operation:\n * 1. No provider: Components use default English strings\n * 2. With locale prop: Dynamically loads translations for that locale\n * 3. With translationManager: Use custom translation implementation\n */\nexport function TranslationProvider({\n translationManager,\n locale,\n loadingComponent = null,\n children,\n}: TranslationProviderProps) {\n const [loadedTranslations, setLoadedTranslations] = useState<any>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n // Load translations when locale changes\n useEffect(() => {\n if (locale && !translationManager) {\n setIsLoading(true);\n loadTranslations(locale)\n .then(translations => {\n setLoadedTranslations(translations);\n setIsLoading(false);\n })\n .catch(error => {\n console.error('Failed to load translations:', error);\n setLoadedTranslations(enTranslations); // Fall back to English\n setIsLoading(false);\n });\n }\n }, [locale, translationManager]);\n\n // Create translation manager from loaded translations\n const localeManager = useMemo<TranslationManager | null>(() => {\n if (!loadedTranslations) return null;\n\n return {\n t: (namespace: string, key: string, params?: Record<string, any>) => {\n const translation = loadedTranslations[namespace]?.[key];\n\n if (!translation) {\n console.warn(`Translation not found for ${namespace}.${key} in locale ${locale}`);\n return `${namespace}.${key}`;\n }\n\n // Handle parameter interpolation\n if (params && typeof translation === 'string') {\n let result = translation;\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n }\n\n return translation;\n },\n };\n }, [loadedTranslations, locale]);\n\n // If custom translation manager provided, use it\n if (translationManager) {\n return (\n <TranslationContext.Provider value={translationManager}>\n {children}\n </TranslationContext.Provider>\n );\n }\n\n // If locale provided and still loading, show loading component\n if (locale && isLoading) {\n return <>{loadingComponent}</>;\n }\n\n // If locale provided and translations loaded, use them\n if (locale && localeManager) {\n return (\n <TranslationContext.Provider value={localeManager}>\n {children}\n </TranslationContext.Provider>\n );\n }\n\n // Default: use English translations\n return (\n <TranslationContext.Provider value={defaultTranslationManager}>\n {children}\n </TranslationContext.Provider>\n );\n}\n\n/**\n * Hook to access translations within a namespace\n *\n * Works in three modes:\n * 1. Without provider: Returns default English translations\n * 2. With provider using locale: Returns dynamically loaded translations for that locale\n * 3. With custom provider: Uses the custom translation manager\n *\n * @param namespace - Translation namespace (e.g., 'Toolbar', 'ResourceViewer')\n * @returns Function to translate keys within the namespace\n */\nexport function useTranslations(namespace: string) {\n const context = useContext(TranslationContext);\n\n // If no context (no provider), use default English translations\n if (!context) {\n return (key: string, params?: Record<string, any>) => {\n const translations = enTranslations as Record<string, Record<string, string>>;\n const translation = translations[namespace]?.[key];\n\n if (!translation) {\n console.warn(`Translation not found for ${namespace}.${key}`);\n return `${namespace}.${key}`;\n }\n\n // Handle parameter interpolation\n if (params && typeof translation === 'string') {\n let result = translation;\n Object.entries(params).forEach(([paramKey, paramValue]) => {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, 'g'), String(paramValue));\n });\n return result;\n }\n\n return translation;\n };\n }\n\n // Return a function that translates keys within this namespace\n return (key: string, params?: Record<string, any>) => context.t(namespace, key, params);\n}\n\n/**\n * Hook to preload translations for a locale\n * Useful for preloading translations before navigation\n */\nexport function usePreloadTranslations() {\n return {\n preload: async (locale: string) => {\n try {\n await loadTranslations(locale);\n return true;\n } catch (error) {\n console.error(`Failed to preload translations for ${locale}:`, error);\n return false;\n }\n },\n isLoaded: (locale: string) => translationCache.has(locale),\n };\n}","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\nexport interface ToastMessage {\n id: string;\n message: string;\n type: ToastType;\n duration?: number;\n}\n\ninterface ToastProps {\n toast: ToastMessage;\n onClose: (id: string) => void;\n}\n\nconst icons = {\n success: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n error: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ),\n warning: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n ),\n info: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n ),\n};\n\nconst styles = {\n success: 'bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 border-green-200 dark:border-green-800',\n error: 'bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 border-red-200 dark:border-red-800',\n warning: 'bg-yellow-50 dark:bg-yellow-900/20 text-yellow-800 dark:text-yellow-200 border-yellow-200 dark:border-yellow-800',\n info: 'bg-blue-50 dark:bg-blue-900/20 text-blue-800 dark:text-blue-200 border-blue-200 dark:border-blue-800',\n};\n\nfunction Toast({ toast, onClose }: ToastProps) {\n useEffect(() => {\n const timer = setTimeout(() => {\n onClose(toast.id);\n }, toast.duration || 3000);\n\n return () => clearTimeout(timer);\n }, [toast, onClose]);\n\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg transition-all duration-300 transform ${styles[toast.type]}`}\n role=\"alert\"\n >\n <div className=\"flex-shrink-0\">{icons[toast.type]}</div>\n <p className=\"text-sm font-medium\">{toast.message}</p>\n <button\n onClick={() => onClose(toast.id)}\n className=\"ml-auto flex-shrink-0 hover:opacity-70 transition-opacity\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n );\n}\n\ninterface ToastContainerProps {\n toasts: ToastMessage[];\n onClose: (id: string) => void;\n}\n\nexport function ToastContainer({ toasts, onClose }: ToastContainerProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted) return null;\n\n return createPortal(\n <div className=\"fixed top-4 right-4 z-50 space-y-2 max-w-sm\">\n {toasts.map((toast) => (\n <Toast key={toast.id} toast={toast} onClose={onClose} />\n ))}\n </div>,\n document.body\n );\n}\n\n// Toast context and hook for global toast management\ninterface ToastContextType {\n showToast: (message: string, type?: ToastType, duration?: number) => void;\n showSuccess: (message: string, duration?: number) => void;\n showError: (message: string, duration?: number) => void;\n showWarning: (message: string, duration?: number) => void;\n showInfo: (message: string, duration?: number) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextType | undefined>(undefined);\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<ToastMessage[]>([]);\n\n const showToast = (message: string, type: ToastType = 'info', duration?: number) => {\n const id = Date.now().toString();\n const newToast: ToastMessage = duration !== undefined \n ? { id, message, type, duration }\n : { id, message, type };\n setToasts((prev) => [...prev, newToast]);\n };\n\n const showSuccess = (message: string, duration?: number) => showToast(message, 'success', duration);\n const showError = (message: string, duration?: number) => showToast(message, 'error', duration);\n const showWarning = (message: string, duration?: number) => showToast(message, 'warning', duration);\n const showInfo = (message: string, duration?: number) => showToast(message, 'info', duration);\n\n const handleClose = (id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n };\n\n return (\n <ToastContext.Provider value={{ showToast, showSuccess, showError, showWarning, showInfo }}>\n {children}\n <ToastContainer toasts={toasts} onClose={handleClose} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = React.useContext(ToastContext);\n if (context === undefined) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n}"],"mappings":";;;;;;;;;AAEA,SAAgB,eAAe,kBAA6B;AAmBxD;AAhBJ,IAAM,mBAAmB,cAAuC,IAAI;AAW7D,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAA2B;AACzB,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,kBAC/B,UACH;AAEJ;AAOO,SAAS,eAAe;AAC7B,QAAM,UAAU,WAAW,gBAAgB;AAE3C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,SAAO,QAAQ;AACjB;;;ACtCA,SAAS,iBAAAA,gBAAe,cAAAC,mBAA6B;AA8BjD,gBAAAC,YAAA;AA3BJ,IAAM,iBAAiBF,eAAqC,IAAI;AAmBzD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAE,KAAC,eAAe,UAAf,EAAwB,OAAO,gBAC7B,UACH;AAEJ;AAMO,SAAS,oBAAoB;AAClC,QAAM,UAAUD,YAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO;AACT;;;AC9CA,SAAgB,iBAAAE,gBAAe,cAAAC,mBAAkB;AA8B7C,gBAAAC,YAAA;AA3BJ,IAAM,uBAAuBF,eAAgD,MAAS;AAmB/E,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAE,KAAC,qBAAqB,UAArB,EAA8B,OAAO,sBACnC,UACH;AAEJ;AAMO,SAAS,mBAAyC;AACvD,QAAM,UAAUD,YAAW,oBAAoB;AAC/C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO;AACT;;;AC9CA,SAAgB,iBAAAE,gBAAe,cAAAC,aAAuB,UAAU,WAAW,eAAe;AAoLpF,SAQK,UARL,OAAAC,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA9KN,IAAM,qBAAqBC,eAAyC,IAAI;AAGxE,IAAM,mBAAmB,oBAAI,IAAiB;AAGvC,IAAM,oBAAoB;AAAA,EAC/B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAIA,eAAe,iBAAiB,QAA8B;AAE5D,MAAI,iBAAiB,IAAI,MAAM,GAAG;AAChC,WAAO,iBAAiB,IAAI,MAAM;AAAA,EACpC;AAGA,MAAI,WAAW,MAAM;AACnB,qBAAiB,IAAI,MAAM,UAAc;AACzC,WAAO;AAAA,EACT;AAEA,MAAI;AAEF,UAAM,eAAe,MAAa,mDAAsB,MAAM;AAC9D,UAAM,kBAAkB,aAAa,WAAW;AAChD,qBAAiB,IAAI,QAAQ,eAAe;AAC5C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,2CAA2C,MAAM,IAAI,KAAK;AAExE,WAAO;AAAA,EACT;AACF;AAGA,IAAM,4BAAgD;AAAA,EACpD,GAAG,CAAC,WAAmB,KAAa,WAAiC;AACnE,UAAM,eAAe;AACrB,UAAM,cAAc,aAAa,SAAS,IAAI,GAAG;AAEjD,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK,6BAA6B,SAAS,IAAI,GAAG,EAAE;AAC5D,aAAO,GAAG,SAAS,IAAI,GAAG;AAAA,IAC5B;AAGA,QAAI,UAAU,OAAO,gBAAgB,UAAU;AAC7C,UAAI,SAAS;AACb,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACzD,iBAAS,OAAO,QAAQ,IAAI,OAAO,MAAM,QAAQ,OAAO,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,MAClF,CAAC;AACD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AACF;AA+BO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AACF,GAA6B;AAC3B,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAc,IAAI;AACtE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAGhD,YAAU,MAAM;AACd,QAAI,UAAU,CAAC,oBAAoB;AACjC,mBAAa,IAAI;AACjB,uBAAiB,MAAM,EACpB,KAAK,kBAAgB;AACpB,8BAAsB,YAAY;AAClC,qBAAa,KAAK;AAAA,MACpB,CAAC,EACA,MAAM,WAAS;AACd,gBAAQ,MAAM,gCAAgC,KAAK;AACnD,8BAAsB,UAAc;AACpC,qBAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACL;AAAA,EACF,GAAG,CAAC,QAAQ,kBAAkB,CAAC;AAG/B,QAAM,gBAAgB,QAAmC,MAAM;AAC7D,QAAI,CAAC,mBAAoB,QAAO;AAEhC,WAAO;AAAA,MACL,GAAG,CAAC,WAAmB,KAAa,WAAiC;AACnE,cAAM,cAAc,mBAAmB,SAAS,IAAI,GAAG;AAEvD,YAAI,CAAC,aAAa;AAChB,kBAAQ,KAAK,6BAA6B,SAAS,IAAI,GAAG,cAAc,MAAM,EAAE;AAChF,iBAAO,GAAG,SAAS,IAAI,GAAG;AAAA,QAC5B;AAGA,YAAI,UAAU,OAAO,gBAAgB,UAAU;AAC7C,cAAI,SAAS;AACb,iBAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACzD,qBAAS,OAAO,QAAQ,IAAI,OAAO,MAAM,QAAQ,OAAO,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,UAClF,CAAC;AACD,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,GAAG,CAAC,oBAAoB,MAAM,CAAC;AAG/B,MAAI,oBAAoB;AACtB,WACE,gBAAAC,KAAC,mBAAmB,UAAnB,EAA4B,OAAO,oBACjC,UACH;AAAA,EAEJ;AAGA,MAAI,UAAU,WAAW;AACvB,WAAO,gBAAAA,KAAA,YAAG,4BAAiB;AAAA,EAC7B;AAGA,MAAI,UAAU,eAAe;AAC3B,WACE,gBAAAA,KAAC,mBAAmB,UAAnB,EAA4B,OAAO,eACjC,UACH;AAAA,EAEJ;AAGA,SACE,gBAAAA,KAAC,mBAAmB,UAAnB,EAA4B,OAAO,2BACjC,UACH;AAEJ;AAaO,SAAS,gBAAgB,WAAmB;AACjD,QAAM,UAAUC,YAAW,kBAAkB;AAG7C,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC,KAAa,WAAiC;AACpD,YAAM,eAAe;AACrB,YAAM,cAAc,aAAa,SAAS,IAAI,GAAG;AAEjD,UAAI,CAAC,aAAa;AAChB,gBAAQ,KAAK,6BAA6B,SAAS,IAAI,GAAG,EAAE;AAC5D,eAAO,GAAG,SAAS,IAAI,GAAG;AAAA,MAC5B;AAGA,UAAI,UAAU,OAAO,gBAAgB,UAAU;AAC7C,YAAI,SAAS;AACb,eAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACzD,mBAAS,OAAO,QAAQ,IAAI,OAAO,MAAM,QAAQ,OAAO,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,QAClF,CAAC;AACD,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,SAAO,CAAC,KAAa,WAAiC,QAAQ,EAAE,WAAW,KAAK,MAAM;AACxF;AAMO,SAAS,yBAAyB;AACvC,SAAO;AAAA,IACL,SAAS,OAAO,WAAmB;AACjC,UAAI;AACF,cAAM,iBAAiB,MAAM;AAC7B,eAAO;AAAA,MACT,SAAS,OAAO;AACd,gBAAQ,MAAM,sCAAsC,MAAM,KAAK,KAAK;AACpE,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAmB,iBAAiB,IAAI,MAAM;AAAA,EAC3D;AACF;;;AC3QA,OAAOC,UAAS,aAAAC,YAAW,YAAAC,iBAAgB;AAC3C,SAAS,oBAAoB;AAmBvB,gBAAAC,MAqCF,YArCE;AAHN,IAAM,QAAQ;AAAA,EACZ,SACE,gBAAAA,KAAC,SAAI,WAAU,WAAU,MAAK,QAAO,QAAO,gBAAe,SAAQ,aACjE,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,kBAAiB,GACxF;AAAA,EAEF,OACE,gBAAAA,KAAC,SAAI,WAAU,WAAU,MAAK,QAAO,QAAO,gBAAe,SAAQ,aACjE,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wBAAuB,GAC9F;AAAA,EAEF,SACE,gBAAAA,KAAC,SAAI,WAAU,WAAU,MAAK,QAAO,QAAO,gBAAe,SAAQ,aACjE,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wIAAuI,GAC9M;AAAA,EAEF,MACE,gBAAAA,KAAC,SAAI,WAAU,WAAU,MAAK,QAAO,QAAO,gBAAe,SAAQ,aACjE,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,6DAA4D,GACnI;AAEJ;AAEA,IAAM,SAAS;AAAA,EACb,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAEA,SAAS,MAAM,EAAE,OAAO,QAAQ,GAAe;AAC7C,EAAAF,WAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM;AAC7B,cAAQ,MAAM,EAAE;AAAA,IAClB,GAAG,MAAM,YAAY,GAAI;AAEzB,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,OAAO,CAAC;AAEnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,uGAAuG,OAAO,MAAM,IAAI,CAAC;AAAA,MACpI,MAAK;AAAA,MAEL;AAAA,wBAAAE,KAAC,SAAI,WAAU,iBAAiB,gBAAM,MAAM,IAAI,GAAE;AAAA,QAClD,gBAAAA,KAAC,OAAE,WAAU,uBAAuB,gBAAM,SAAQ;AAAA,QAClD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,QAAQ,MAAM,EAAE;AAAA,YAC/B,WAAU;AAAA,YACV,cAAW;AAAA,YAEX,0BAAAA,KAAC,SAAI,WAAU,WAAU,MAAK,QAAO,QAAO,gBAAe,SAAQ,aACjE,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wBAAuB,GAC9F;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAOO,SAAS,eAAe,EAAE,QAAQ,QAAQ,GAAwB;AACvE,QAAM,CAAC,SAAS,UAAU,IAAID,UAAS,KAAK;AAE5C,EAAAD,WAAU,MAAM;AACd,eAAW,IAAI;AACf,WAAO,MAAM,WAAW,KAAK;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO;AAAA,IACL,gBAAAE,KAAC,SAAI,WAAU,+CACZ,iBAAO,IAAI,CAAC,UACX,gBAAAA,KAAC,SAAqB,OAAc,WAAxB,MAAM,EAAoC,CACvD,GACH;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAWA,IAAM,eAAeH,OAAM,cAA4C,MAAS;AAEzE,SAAS,cAAc,EAAE,SAAS,GAAkC;AACzE,QAAM,CAAC,QAAQ,SAAS,IAAIE,UAAyB,CAAC,CAAC;AAEvD,QAAM,YAAY,CAAC,SAAiB,OAAkB,QAAQ,aAAsB;AAClF,UAAM,KAAK,KAAK,IAAI,EAAE,SAAS;AAC/B,UAAM,WAAyB,aAAa,SACxC,EAAE,IAAI,SAAS,MAAM,SAAS,IAC9B,EAAE,IAAI,SAAS,KAAK;AACxB,cAAU,CAAC,SAAS,CAAC,GAAG,MAAM,QAAQ,CAAC;AAAA,EACzC;AAEA,QAAM,cAAc,CAAC,SAAiB,aAAsB,UAAU,SAAS,WAAW,QAAQ;AAClG,QAAM,YAAY,CAAC,SAAiB,aAAsB,UAAU,SAAS,SAAS,QAAQ;AAC9F,QAAM,cAAc,CAAC,SAAiB,aAAsB,UAAU,SAAS,WAAW,QAAQ;AAClG,QAAM,WAAW,CAAC,SAAiB,aAAsB,UAAU,SAAS,QAAQ,QAAQ;AAE5F,QAAM,cAAc,CAAC,OAAe;AAClC,cAAU,CAAC,SAAS,KAAK,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,EAC7D;AAEA,SACE,qBAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,WAAW,aAAa,WAAW,aAAa,SAAS,GACtF;AAAA;AAAA,IACD,gBAAAC,KAAC,kBAAe,QAAgB,SAAS,aAAa;AAAA,KACxD;AAEJ;AAEO,SAAS,WAAW;AACzB,QAAM,UAAUH,OAAM,WAAW,YAAY;AAC7C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO;AACT;","names":["createContext","useContext","jsx","createContext","useContext","jsx","createContext","useContext","jsx","createContext","jsx","useContext","React","useEffect","useState","jsx"]}
|