@semiont/react-ui 0.4.15 → 0.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{KnowledgeBaseSessionContext-CpYaCbnC.d.mts → KnowledgeBaseSessionContext-BNNunwzO.d.mts} +2 -1
- package/dist/{ar-R4CRNXEF.mjs → ar-3W37O3R3.mjs} +9 -3
- package/dist/ar-3W37O3R3.mjs.map +1 -0
- package/dist/{bn-CZKGRHTA.mjs → bn-JZTJLMVE.mjs} +9 -3
- package/dist/bn-JZTJLMVE.mjs.map +1 -0
- package/dist/{chunk-R2U7P4TK.mjs → chunk-FAI3S4BM.mjs} +34 -34
- package/dist/chunk-FAI3S4BM.mjs.map +1 -0
- package/dist/{chunk-HVMAGUFA.mjs → chunk-NOD3NCXE.mjs} +3 -1
- package/dist/chunk-NOD3NCXE.mjs.map +1 -0
- package/dist/{cs-4WIB2IHH.mjs → cs-XYHH7HNE.mjs} +9 -3
- package/dist/cs-XYHH7HNE.mjs.map +1 -0
- package/dist/{da-JWYEUYPX.mjs → da-MZKIECVT.mjs} +9 -3
- package/dist/da-MZKIECVT.mjs.map +1 -0
- package/dist/{de-GWUQZGER.mjs → de-AYXTMRQW.mjs} +9 -3
- package/dist/de-AYXTMRQW.mjs.map +1 -0
- package/dist/{el-DM2GT7P5.mjs → el-A6CVQWAW.mjs} +9 -3
- package/dist/el-A6CVQWAW.mjs.map +1 -0
- package/dist/{en-IUV4ZXKH.mjs → en-YPQQBI4T.mjs} +2 -2
- package/dist/{es-6LVQIM3D.mjs → es-M2HXLJGT.mjs} +9 -3
- package/dist/es-M2HXLJGT.mjs.map +1 -0
- package/dist/{fa-IRUJY3QI.mjs → fa-V6JZJDYP.mjs} +9 -3
- package/dist/fa-V6JZJDYP.mjs.map +1 -0
- package/dist/{fi-53FBOEVT.mjs → fi-ONDTZ5H7.mjs} +9 -3
- package/dist/fi-ONDTZ5H7.mjs.map +1 -0
- package/dist/{fr-Q5KY7QL6.mjs → fr-PAPV4H4G.mjs} +9 -3
- package/dist/fr-PAPV4H4G.mjs.map +1 -0
- package/dist/{he-HJNKULBY.mjs → he-F6VTLJLW.mjs} +9 -3
- package/dist/he-F6VTLJLW.mjs.map +1 -0
- package/dist/{hi-UYZ4X6CR.mjs → hi-CFUAV4BF.mjs} +9 -3
- package/dist/hi-CFUAV4BF.mjs.map +1 -0
- package/dist/{id-UAQMH6U2.mjs → id-NBKLCCI7.mjs} +9 -3
- package/dist/id-NBKLCCI7.mjs.map +1 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +268 -240
- package/dist/index.mjs.map +1 -1
- package/dist/{it-C7QEBNFA.mjs → it-SLSOWVVU.mjs} +9 -3
- package/dist/it-SLSOWVVU.mjs.map +1 -0
- package/dist/{ja-THS6AOSJ.mjs → ja-L5IG4ECE.mjs} +9 -3
- package/dist/ja-L5IG4ECE.mjs.map +1 -0
- package/dist/{ko-XKK3TWQG.mjs → ko-QYMTULKK.mjs} +9 -3
- package/dist/ko-QYMTULKK.mjs.map +1 -0
- package/dist/{ms-GSK7LIF7.mjs → ms-5DGSFKM2.mjs} +9 -3
- package/dist/ms-5DGSFKM2.mjs.map +1 -0
- package/dist/{nl-KUBWITGY.mjs → nl-VZPCGONO.mjs} +9 -3
- package/dist/nl-VZPCGONO.mjs.map +1 -0
- package/dist/{no-ECWZUHT6.mjs → no-MF6F352I.mjs} +9 -3
- package/dist/no-MF6F352I.mjs.map +1 -0
- package/dist/{pl-PLVWSZWS.mjs → pl-WIK72JUO.mjs} +9 -3
- package/dist/pl-WIK72JUO.mjs.map +1 -0
- package/dist/{pt-AL74ZTKB.mjs → pt-RRP5ZF6A.mjs} +9 -3
- package/dist/pt-RRP5ZF6A.mjs.map +1 -0
- package/dist/{ro-WTPHLHGS.mjs → ro-XHQLC3T7.mjs} +9 -3
- package/dist/ro-XHQLC3T7.mjs.map +1 -0
- package/dist/{sv-QCLI7SG4.mjs → sv-EWULDN6E.mjs} +9 -3
- package/dist/sv-EWULDN6E.mjs.map +1 -0
- package/dist/test-utils.d.mts +1 -1
- package/dist/test-utils.mjs +2 -2
- package/dist/{th-WCKVZU6U.mjs → th-TGOBHFG4.mjs} +9 -3
- package/dist/th-TGOBHFG4.mjs.map +1 -0
- package/dist/{tr-2CAFS2XS.mjs → tr-LMMPBMV7.mjs} +9 -3
- package/dist/tr-LMMPBMV7.mjs.map +1 -0
- package/dist/{uk-TDE4JLCY.mjs → uk-IPGRRJY6.mjs} +9 -3
- package/dist/uk-IPGRRJY6.mjs.map +1 -0
- package/dist/{vi-KKXZ4PCX.mjs → vi-Q676OJQS.mjs} +9 -3
- package/dist/vi-Q676OJQS.mjs.map +1 -0
- package/dist/{zh-VH4XN5PV.mjs → zh-F3MTWQDX.mjs} +9 -3
- package/dist/zh-F3MTWQDX.mjs.map +1 -0
- package/package.json +1 -1
- package/src/components/resource/HistoryEvent.tsx +3 -2
- package/src/components/resource/__tests__/HistoryEvent.test.tsx +1 -0
- package/src/components/resource/event-formatting.ts +36 -0
- package/src/components/resource/panels/ResourceInfoPanel.tsx +10 -0
- package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +23 -0
- package/src/features/resource-compose/components/ResourceComposePage.tsx +10 -1
- package/src/features/resource-viewer/components/ResourceViewerPage.tsx +2 -0
- package/src/styles/features/compose.css +63 -0
- package/translations/ar.json +6 -2
- package/translations/bn.json +6 -2
- package/translations/cs.json +6 -2
- package/translations/da.json +6 -2
- package/translations/de.json +6 -2
- package/translations/el.json +6 -2
- package/translations/en.json +2 -0
- package/translations/es.json +6 -2
- package/translations/fa.json +6 -2
- package/translations/fi.json +6 -2
- package/translations/fr.json +6 -2
- package/translations/he.json +6 -2
- package/translations/hi.json +6 -2
- package/translations/id.json +6 -2
- package/translations/it.json +6 -2
- package/translations/ja.json +6 -2
- package/translations/ko.json +6 -2
- package/translations/ms.json +6 -2
- package/translations/nl.json +6 -2
- package/translations/no.json +6 -2
- package/translations/pl.json +6 -2
- package/translations/pt.json +6 -2
- package/translations/ro.json +6 -2
- package/translations/sv.json +6 -2
- package/translations/th.json +6 -2
- package/translations/tr.json +6 -2
- package/translations/uk.json +6 -2
- package/translations/vi.json +6 -2
- package/translations/zh.json +6 -2
- package/dist/ar-R4CRNXEF.mjs.map +0 -1
- package/dist/bn-CZKGRHTA.mjs.map +0 -1
- package/dist/chunk-HVMAGUFA.mjs.map +0 -1
- package/dist/chunk-R2U7P4TK.mjs.map +0 -1
- package/dist/cs-4WIB2IHH.mjs.map +0 -1
- package/dist/da-JWYEUYPX.mjs.map +0 -1
- package/dist/de-GWUQZGER.mjs.map +0 -1
- package/dist/el-DM2GT7P5.mjs.map +0 -1
- package/dist/es-6LVQIM3D.mjs.map +0 -1
- package/dist/fa-IRUJY3QI.mjs.map +0 -1
- package/dist/fi-53FBOEVT.mjs.map +0 -1
- package/dist/fr-Q5KY7QL6.mjs.map +0 -1
- package/dist/he-HJNKULBY.mjs.map +0 -1
- package/dist/hi-UYZ4X6CR.mjs.map +0 -1
- package/dist/id-UAQMH6U2.mjs.map +0 -1
- package/dist/it-C7QEBNFA.mjs.map +0 -1
- package/dist/ja-THS6AOSJ.mjs.map +0 -1
- package/dist/ko-XKK3TWQG.mjs.map +0 -1
- package/dist/ms-GSK7LIF7.mjs.map +0 -1
- package/dist/nl-KUBWITGY.mjs.map +0 -1
- package/dist/no-ECWZUHT6.mjs.map +0 -1
- package/dist/pl-PLVWSZWS.mjs.map +0 -1
- package/dist/pt-AL74ZTKB.mjs.map +0 -1
- package/dist/ro-WTPHLHGS.mjs.map +0 -1
- package/dist/sv-QCLI7SG4.mjs.map +0 -1
- package/dist/th-WCKVZU6U.mjs.map +0 -1
- package/dist/tr-2CAFS2XS.mjs.map +0 -1
- package/dist/uk-TDE4JLCY.mjs.map +0 -1
- package/dist/vi-KKXZ4PCX.mjs.map +0 -1
- package/dist/zh-VH4XN5PV.mjs.map +0 -1
- /package/dist/{en-IUV4ZXKH.mjs.map → en-YPQQBI4T.mjs.map} +0 -0
|
@@ -89,6 +89,7 @@ interface KnowledgeBase {
|
|
|
89
89
|
port: number;
|
|
90
90
|
protocol: 'http' | 'https';
|
|
91
91
|
email: string;
|
|
92
|
+
gitBranch?: string;
|
|
92
93
|
}
|
|
93
94
|
/**
|
|
94
95
|
* Input shape for adding a new KB. The id is generated by the provider.
|
|
@@ -144,7 +145,7 @@ interface KnowledgeBaseSessionValue {
|
|
|
144
145
|
addKnowledgeBase: (kb: NewKnowledgeBase, access: string, refresh: string) => KnowledgeBase;
|
|
145
146
|
removeKnowledgeBase: (id: string) => void;
|
|
146
147
|
setActiveKnowledgeBase: (id: string) => void;
|
|
147
|
-
updateKnowledgeBase: (id: string, updates: Partial<
|
|
148
|
+
updateKnowledgeBase: (id: string, updates: Partial<KnowledgeBase>) => void;
|
|
148
149
|
/** Re-auth on an existing KB: store the new tokens and refresh the session. */
|
|
149
150
|
signIn: (id: string, access: string, refresh: string) => void;
|
|
150
151
|
/** Sign out of a KB: clear its stored tokens. If it's the active KB, clear in-memory session too. */
|
|
@@ -31,7 +31,8 @@ var ResourceInfoPanel = {
|
|
|
31
31
|
creationMethod: "\u0637\u0631\u064A\u0642\u0629 \u0627\u0644\u0625\u0646\u0634\u0627\u0621",
|
|
32
32
|
attributedTo: "\u0645\u0646\u0633\u0648\u0628 \u0625\u0644\u0649",
|
|
33
33
|
derivedFrom: "\u0645\u0634\u062A\u0642 \u0645\u0646",
|
|
34
|
-
generatedBy: "\u0623\u064F\u0646\u0634\u0626 \u0628\u0648\u0627\u0633\u0637\u0629"
|
|
34
|
+
generatedBy: "\u0623\u064F\u0646\u0634\u0626 \u0628\u0648\u0627\u0633\u0637\u0629",
|
|
35
|
+
storageUri: "\u0627\u0644\u062A\u062E\u0632\u064A\u0646"
|
|
35
36
|
};
|
|
36
37
|
var CollaborationPanel = {
|
|
37
38
|
title: "\u0627\u0644\u062A\u0639\u0627\u0648\u0646",
|
|
@@ -377,6 +378,9 @@ var ReferenceWizard = {
|
|
|
377
378
|
searching: "\u062C\u0627\u0631\u064A \u0627\u0644\u0628\u062D\u062B...",
|
|
378
379
|
search: "\u0628\u062D\u062B"
|
|
379
380
|
};
|
|
381
|
+
var History = {
|
|
382
|
+
embeddingComputed: "\u062A\u0645 \u062D\u0633\u0627\u0628 \u0627\u0644\u062A\u0636\u0645\u064A\u0646"
|
|
383
|
+
};
|
|
380
384
|
var ar_default = {
|
|
381
385
|
Toolbar,
|
|
382
386
|
ResourceInfoPanel,
|
|
@@ -395,7 +399,8 @@ var ar_default = {
|
|
|
395
399
|
ResourceViewer,
|
|
396
400
|
Settings,
|
|
397
401
|
AnnotateView,
|
|
398
|
-
ReferenceWizard
|
|
402
|
+
ReferenceWizard,
|
|
403
|
+
History
|
|
399
404
|
};
|
|
400
405
|
export {
|
|
401
406
|
AnnotateToolbar,
|
|
@@ -406,6 +411,7 @@ export {
|
|
|
406
411
|
CollapsibleResourceNavigation,
|
|
407
412
|
CommentsPanel,
|
|
408
413
|
HighlightPanel,
|
|
414
|
+
History,
|
|
409
415
|
KeyboardShortcuts,
|
|
410
416
|
ReferenceWizard,
|
|
411
417
|
ReferencesPanel,
|
|
@@ -418,4 +424,4 @@ export {
|
|
|
418
424
|
UnifiedAnnotationsPanel,
|
|
419
425
|
ar_default as default
|
|
420
426
|
};
|
|
421
|
-
//# sourceMappingURL=ar-
|
|
427
|
+
//# sourceMappingURL=ar-3W37O3R3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../translations/ar.json"],"sourcesContent":["{\n \"Toolbar\": {\n \"annotations\": \"التعليقات التوضيحية\",\n \"history\": \"السجل\",\n \"resourceInfo\": \"معلومات المورد\",\n \"collaboration\": \"التعاون\",\n \"userAccount\": \"حساب المستخدم\",\n \"settings\": \"الإعدادات\",\n \"knowledgeBase\": \"قاعدة المعرفة\"\n },\n \"ResourceInfoPanel\": {\n \"title\": \"معلومات المورد\",\n \"locale\": \"اللغة المحلية\",\n \"notSpecified\": \"غير محدد\",\n \"entityTypeTags\": \"علامات نوع الكيان\",\n \"representation\": \"التمثيل\",\n \"mediaType\": \"نوع الوسائط\",\n \"byteSize\": \"الحجم\",\n \"clone\": \"استنساخ\",\n \"cloneDescription\": \"إنشاء رابط استنساخ قابل للمشاركة لهذا المورد\",\n \"archive\": \"أرشفة\",\n \"archiveDescription\": \"نقل هذا المورد إلى حالة الأرشيف\",\n \"unarchive\": \"إلغاء الأرشفة\",\n \"unarchiveDescription\": \"استعادة هذا المورد إلى الحالة النشطة\",\n \"provenance\": \"المصدر والسلسلة\",\n \"createdAt\": \"تاريخ الإنشاء\",\n \"modifiedAt\": \"تاريخ التعديل\",\n \"creationMethod\": \"طريقة الإنشاء\",\n \"attributedTo\": \"منسوب إلى\",\n \"derivedFrom\": \"مشتق من\",\n \"generatedBy\": \"أُنشئ بواسطة\",\n \"storageUri\": \"التخزين\"\n },\n \"CollaborationPanel\": {\n \"title\": \"التعاون\",\n \"connectionStatus\": \"حالة الاتصال\",\n \"live\": \"مباشر\",\n \"disconnected\": \"غير متصل\",\n \"events\": \"{{count}} أحداث\",\n \"lastSync\": \"آخر مزامنة:\",\n \"noActivity\": \"لا يوجد نشاط بعد\",\n \"justNow\": \"الآن\",\n \"secondsAgo\": \"منذ {{count}} ثوانٍ\",\n \"minuteAgo\": \"منذ دقيقة واحدة\",\n \"minutesAgo\": \"منذ {{count}} دقائق\",\n \"hourAgo\": \"منذ ساعة واحدة\",\n \"hoursAgo\": \"منذ {{count}} ساعات\",\n \"realtimeActive\": \"التحديثات في الوقت الفعلي نشطة\",\n \"reconnecting\": \"جارٍ إعادة الاتصال بالخادم...\",\n \"sharing\": \"المشاركة\",\n \"collaborationComingSoon\": \"ميزات التعاون قادمة قريبًا\"\n },\n \"AnnotationHistory\": {\n \"history\": \"السجل\",\n \"loading\": \"جارٍ التحميل...\",\n \"user\": \"المستخدم\",\n \"method\": \"الطريقة\",\n \"viewOriginal\": \"عرض الأصل\",\n \"viewAnnotation\": \"عرض التعليق التوضيحي: {{content}}\",\n \"resourceCreated\": \"تم إنشاء المورد\",\n \"resourceCloned\": \"تم الاستنساخ\",\n \"resourceArchived\": \"تمت الأرشفة\",\n \"resourceUnarchived\": \"تم إلغاء الأرشفة\",\n \"highlightAdded\": \"تمت إضافة تمييز\",\n \"highlightRemoved\": \"تمت إزالة التمييز\",\n \"referenceCreated\": \"تم إنشاء مرجع\",\n \"referenceResolved\": \"تم حل المرجع\",\n \"referenceDeleted\": \"تم حذف المرجع\",\n \"entitytagAdded\": \"تمت إضافة علامة\",\n \"entitytagRemoved\": \"تمت إزالة العلامة\",\n \"assessmentAdded\": \"تمت إضافة تقييم\",\n \"assessmentRemoved\": \"تمت إزالة التقييم\",\n \"annotationAdded\": \"تمت إضافة تعليق توضيحي\",\n \"annotationRemoved\": \"تمت إزالة التعليق التوضيحي\",\n \"annotationBodyUpdated\": \"تم تحديث التعليق التوضيحي\",\n \"jobEvent\": \"حدث مهمة\",\n \"justNow\": \"الآن\",\n \"minutesAgo\": \"منذ {{count}}د\",\n \"hoursAgo\": \"منذ {{count}}س\",\n \"daysAgo\": \"منذ {{count}}ي\"\n },\n \"CommentsPanel\": {\n \"title\": \"التعليقات\",\n \"noComments\": \"لا توجد تعليقات بعد. حدد نصًا وانقر على تعليق لإضافة واحد.\",\n \"commentPlaceholder\": \"اكتب تعليقك هنا...\",\n \"save\": \"حفظ\",\n \"cancel\": \"إلغاء\",\n \"edit\": \"تعديل\",\n \"annotateComments\": \"توضيح التعليقات\",\n \"instructions\": \"التعليمات\",\n \"optional\": \"(اختياري)\",\n \"instructionsPlaceholder\": \"مثال: التركيز على المصطلحات التقنية...\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"toneLabel\": \"النبرة\",\n \"toneOptional\": \"(اختياري)\",\n \"toneScholarly\": \"أكاديمي\",\n \"toneExplanatory\": \"توضيحي\",\n \"toneConversational\": \"حواري\",\n \"toneTechnical\": \"تقني\",\n \"densityLabel\": \"الكثافة\",\n \"densitySparse\": \"متفرق\",\n \"densityDense\": \"كثيف\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\",\n \"closeProgress\": \"إغلاق\"\n },\n \"HighlightPanel\": {\n \"title\": \"التمييزات\",\n \"noHighlights\": \"لا توجد تمييزات بعد. استخدم التوضيح بالذكاء الاصطناعي للعثور على الفقرات المهمة.\",\n \"annotateHighlights\": \"توضيح التمييزات\",\n \"instructions\": \"التعليمات\",\n \"optional\": \"(اختياري)\",\n \"instructionsPlaceholder\": \"مثال: التركيز على المفاهيم التقنية الرئيسية...\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"cancel\": \"إلغاء\",\n \"densityLabel\": \"الكثافة\",\n \"densitySparse\": \"متفرق\",\n \"densityDense\": \"كثيف\",\n \"closeProgress\": \"إغلاق\"\n },\n \"AssessmentPanel\": {\n \"title\": \"التقييمات\",\n \"noAssessments\": \"لا توجد تقييمات بعد. استخدم التوضيح بالذكاء الاصطناعي لتقييم الفقرات.\",\n \"assessmentPlaceholder\": \"اكتب تقييمك هنا...\",\n \"save\": \"حفظ\",\n \"cancel\": \"إلغاء\",\n \"annotateAssessments\": \"توضيح التقييمات\",\n \"instructions\": \"التعليمات\",\n \"optional\": \"(اختياري)\",\n \"instructionsPlaceholder\": \"مثال: تقييم الادعاءات من حيث الدقة والأدلة...\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"toneLabel\": \"النبرة\",\n \"toneOptional\": \"(اختياري)\",\n \"toneAnalytical\": \"تحليلي\",\n \"toneCritical\": \"نقدي\",\n \"toneBalanced\": \"متوازن\",\n \"toneConstructive\": \"بنّاء\",\n \"densityLabel\": \"الكثافة\",\n \"densitySparse\": \"متفرق\",\n \"densityDense\": \"كثيف\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\",\n \"closeProgress\": \"إغلاق\"\n },\n \"TaggingPanel\": {\n \"title\": \"العلامات\",\n \"noTags\": \"لا توجد علامات بعد. استخدم التوضيح بالذكاء الاصطناعي لتحديد الأدوار الهيكلية.\",\n \"annotateTags\": \"توضيح العلامات\",\n \"selectSchema\": \"اختيار الإطار\",\n \"schemaLegal\": \"التحليل القانوني (IRAC)\",\n \"schemaScientific\": \"الورقة العلمية (IMRAD)\",\n \"schemaArgument\": \"بنية الحجة (Toulmin)\",\n \"selectCategories\": \"اختيار الفئات\",\n \"categoryIssue\": \"القضية\",\n \"categoryRule\": \"القاعدة\",\n \"categoryApplication\": \"التطبيق\",\n \"categoryConclusion\": \"الخاتمة\",\n \"categoryIntroduction\": \"المقدمة\",\n \"categoryMethods\": \"المناهج\",\n \"categoryResults\": \"النتائج\",\n \"categoryDiscussion\": \"المناقشة\",\n \"categoryClaim\": \"الادعاء\",\n \"categoryEvidence\": \"الدليل\",\n \"categoryWarrant\": \"المبرر\",\n \"categoryCounterargument\": \"الحجة المضادة\",\n \"categoryRebuttal\": \"الدحض\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"cancel\": \"إلغاء\",\n \"selectAll\": \"تحديد الكل\",\n \"deselectAll\": \"إلغاء تحديد الكل\",\n \"categoriesSelected\": \"{count, plural, =0 {لم يتم تحديد فئات} =1 {فئة واحدة محددة} other {# فئات محددة}}\",\n \"createTagForSelection\": \"إنشاء علامة للتحديد\",\n \"selectCategory\": \"اختيار الفئة\",\n \"chooseCategory\": \"اختر فئة...\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\"\n },\n \"UnifiedAnnotationsPanel\": {\n \"title\": \"التعليقات التوضيحية\",\n \"statistics\": \"الإحصائيات\",\n \"highlight\": \"التمييزات\",\n \"reference\": \"المراجع\",\n \"assessment\": \"التقييمات\",\n \"comment\": \"التعليقات\",\n \"tag\": \"العلامات\"\n },\n \"StatisticsPanel\": {\n \"title\": \"الإحصائيات\",\n \"highlights\": \"التمييزات\",\n \"comments\": \"التعليقات\",\n \"assessments\": \"التقييمات\",\n \"tags\": \"العلامات\",\n \"references\": \"المراجع\",\n \"stub\": \"مبدئي\",\n \"resolved\": \"محلول\",\n \"entityTypes\": \"أنواع الكيانات\"\n },\n \"ReferencesPanel\": {\n \"title\": \"المراجع\",\n \"noReferences\": \"لا توجد مراجع بعد. حدد نصًا لإنشاء مراجع لموارد أخرى.\",\n \"outgoingReferences\": \"المراجع الصادرة\",\n \"incomingReferences\": \"المراجع الواردة\",\n \"noIncomingReferences\": \"لا توجد مراجع واردة\",\n \"stub\": \"مرجع مبدئي (غير مربوط)\",\n \"resolved\": \"مرجع محلول (مربوط)\",\n \"open\": \"فتح\",\n \"unlink\": \"إلغاء الربط\",\n \"resolve\": \"حل المرجع\",\n \"cancel\": \"إلغاء\",\n \"createReference\": \"إنشاء مرجع\",\n \"entityTypesOptional\": \"أنواع الكيانات (اختياري)\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\",\n \"annotateReferences\": \"توضيح المراجع\",\n \"selectEntityTypes\": \"أنواع الكيانات:\",\n \"select\": \"تحديد\",\n \"deselect\": \"إلغاء التحديد\",\n \"noEntityTypes\": \"لا توجد أنواع كيانات متاحة\",\n \"typesSelected\": \"{count, plural, =1 {نوع واحد محدد} other {# أنواع محددة}}\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"includeDescriptiveReferences\": \"تضمين المراجع الوصفية\",\n \"descriptiveReferencesTooltip\": \"البحث أيضًا عن عبارات مثل 'الرئيس التنفيذي'، 'عملاق التكنولوجيا'، 'الفيزيائي' (بالإضافة إلى الأسماء)\",\n \"annotationProgressTitle\": \"توضيح مراجع الكيانات\",\n \"cancelAnnotation\": \"إلغاء التوضيح\",\n \"found\": \"تم العثور على {{count}}\",\n \"complete\": \"اكتمل التوضيح!\",\n \"failed\": \"فشل التوضيح\",\n \"current\": \"الحالي: {{entityType}}\",\n \"closeProgress\": \"إغلاق\",\n \"loading\": \"جارٍ التحميل...\",\n \"loadingEllipsis\": \"جارٍ التحميل...\",\n \"untitledResource\": \"مورد بدون عنوان\",\n \"noText\": \"لا يوجد نص\"\n },\n \"KeyboardShortcuts\": {\n \"title\": \"اختصارات لوحة المفاتيح\",\n \"closeDialog\": \"إغلاق مربع الحوار\",\n \"or\": \"أو\",\n \"navigationTitle\": \"التنقل\",\n \"navOpenSearch\": \"فتح البحث الشامل\",\n \"navOpenSearchAlt\": \"فتح البحث الشامل (بديل)\",\n \"navCreateResource\": \"إنشاء مورد جديد\",\n \"navCloseOverlays\": \"إغلاق جميع الطبقات العلوية (ضغط مزدوج)\",\n \"navShowHelp\": \"عرض مساعدة اختصارات لوحة المفاتيح\",\n \"sidebarTitle\": \"الشريط الجانبي للمعرفة\",\n \"sidebarCollapse\": \"طي الشريط الجانبي\",\n \"sidebarExpand\": \"توسيع الشريط الجانبي\",\n \"sidebarPickup\": \"التقاط علامة تبويب المورد (عند التركيز)\",\n \"sidebarMove\": \"نقل علامة تبويب المورد (أثناء السحب)\",\n \"sidebarDrop\": \"إفلات علامة تبويب المورد (أثناء السحب)\",\n \"sidebarCancel\": \"إلغاء عملية السحب\",\n \"annotationsTitle\": \"تعليقات المورد التوضيحية\",\n \"annotHighlight\": \"إنشاء تمييز من التعليق التوضيحي (مباشر)\",\n \"annotReference\": \"فتح نافذة المرجع المنبثقة للتعليق التوضيحي\",\n \"annotDelete\": \"حذف التعليق التوضيحي المركّز عليه\",\n \"annotNavigate\": \"التنقل عبر التعليقات التوضيحية\",\n \"annotNavigateBack\": \"التنقل عبر التعليقات التوضيحية للخلف\",\n \"listsTitle\": \"القوائم والشبكات\",\n \"listsFilterNav\": \"التنقل بين مرشحات أنواع الكيانات\",\n \"listsGridNav\": \"التنقل في شبكة الموارد\",\n \"listsJumpFirst\": \"الانتقال إلى العنصر الأول\",\n \"listsJumpLast\": \"الانتقال إلى العنصر الأخير\",\n \"searchModalTitle\": \"في نافذة البحث\",\n \"searchNav\": \"التنقل في نتائج البحث\",\n \"searchSelect\": \"اختيار النتيجة\",\n \"searchClose\": \"إغلاق البحث\",\n \"modalTitle\": \"عناصر التحكم في النوافذ المنبثقة\",\n \"modalClose\": \"إغلاق النافذة المنبثقة النشطة\",\n \"modalNavForward\": \"التنقل للأمام عبر الأزرار\",\n \"modalNavBackward\": \"التنقل للخلف عبر الأزرار\",\n \"modalActivate\": \"تفعيل الزر المركّز عليه\",\n \"accessibilityTitle\": \"إمكانية الوصول\",\n \"a11ySkipLinks\": \"الانتقال إلى روابط التخطي (عند بداية الصفحة)\",\n \"a11yFollowLink\": \"اتباع رابط التخطي\",\n \"macNote\": \"استخدام اختصارات لوحة مفاتيح Mac. ⌘ هو مفتاح Command.\",\n \"windowsNote\": \"استخدام اختصارات لوحة مفاتيح Windows/Linux. Ctrl هو مفتاح التحكم.\",\n \"footerHint\": \"اضغط {{key}} في أي وقت لعرض هذه المساعدة\",\n \"close\": \"إغلاق\"\n },\n \"AnnotateToolbar\": {\n \"modeGroup\": \"الوضع\",\n \"browse\": \"تصفح\",\n \"annotate\": \"توضيح\",\n \"selectionGroup\": \"الدافع\",\n \"clickGroup\": \"النقر\",\n \"shapeGroup\": \"الشكل\",\n \"none\": \"لا شيء\",\n \"linking\": \"مرجع\",\n \"highlighting\": \"تمييز\",\n \"assessing\": \"تقييم\",\n \"commenting\": \"تعليق\",\n \"tagging\": \"علامة\",\n \"detail\": \"تفصيل\",\n \"follow\": \"متابعة\",\n \"deleting\": \"حذف\",\n \"jsonld\": \"JSON-LD\",\n \"rectangle\": \"مستطيل\",\n \"circle\": \"دائرة\",\n \"polygon\": \"مضلع\"\n },\n \"CollapsibleResourceNavigation\": {\n \"title\": \"التنقل\",\n \"collapseSidebar\": \"طي الشريط الجانبي\",\n \"expandSidebar\": \"توسيع الشريط الجانبي\",\n \"dragToReorder\": \"اسحب لإعادة الترتيب\",\n \"dragToReorderDoc\": \"اسحب لإعادة ترتيب {{name}}\",\n \"closeResource\": \"إغلاق المورد\",\n \"dragInstructions\": \"لإعادة ترتيب الموارد: استخدم Tab للانتقال إلى مورد. اضغط Alt+سهم لأعلى للتحريك لأعلى أو Alt+سهم لأسفل للتحريك لأسفل. للسحب والإفلات: اضغط على شريط المسافة لالتقاط العنصر. استخدم مفاتيح الأسهم لتحريكه. اضغط على شريط المسافة مرة أخرى للإفلات.\"\n },\n \"ResourceViewer\": {\n \"deleteConfirmationTitle\": \"حذف التعليق التوضيحي\",\n \"deleteConfirmationMessage\": \"هل أنت متأكد أنك تريد حذف هذا التعليق التوضيحي؟ لا يمكن التراجع عن هذا الإجراء.\",\n \"deleteConfirmationCancel\": \"إلغاء\",\n \"deleteConfirmationDelete\": \"حذف\"\n },\n \"Settings\": {\n \"title\": \"الإعدادات\",\n \"lineNumbers\": \"أرقام الأسطر\",\n \"lineNumbersVisible\": \"مرئية\",\n \"lineNumbersHidden\": \"مخفية\",\n \"theme\": \"السمة\",\n \"themeLight\": \"فاتح\",\n \"themeDark\": \"داكن\",\n \"themeSystem\": \"النظام\",\n \"themeSystemActive\": \"النظام ({{mode}})\",\n \"themeModeActive\": \"استخدام وضع {{mode}}\",\n \"language\": \"اللغة\",\n \"languageHint\": \"تغيير اللغة في شريط التنقل الرئيسي\",\n \"languageChanging\": \"جارٍ تغيير اللغة...\",\n \"hoverDelay\": \"تأخير التمرير\",\n \"hoverDelayFast\": \"سريع\",\n \"hoverDelaySlow\": \"بطيء\",\n \"hoverDelayDescription\": \"تأخير {{delay}} ميلي ثانية قبل ظهور تأثيرات التمرير\"\n },\n \"AnnotateView\": {},\n \"ReferenceWizard\": {\n \"gatherTitle\": \"السياق المُجمَّع\",\n \"configureGenerationTitle\": \"تكوين التوليد\",\n \"configureSearchTitle\": \"إعدادات البحث\",\n \"searchResultsTitle\": \"نتائج البحث\",\n \"sourceContextLabel\": \"سياق التعليق التوضيحي في المورد\",\n \"connectionsLabel\": \"التعليقات التوضيحية للأقران\",\n \"citedByLabel\": \"المورد مُستشهد به من قِبل\",\n \"userHintLabel\": \"تلميح\",\n \"userHintPlaceholder\": \"صف ما يشير إليه هذا التعليق التوضيحي...\",\n \"loadingContext\": \"جارٍ جمع السياق...\",\n \"failedContext\": \"فشل في جمع السياق\",\n \"cancel\": \"إلغاء\",\n \"generate\": \"توليد\",\n \"compose\": \"تأليف\",\n \"resolutionStrategyLabel\": \"استراتيجية الحل\",\n \"back\": \"رجوع\",\n \"link\": \"رابط\",\n \"score\": \"درجة\",\n \"noResults\": \"لم يتم العثور على نتائج\",\n \"resourceTitle\": \"عنوان المورد\",\n \"resourceTitlePlaceholder\": \"أدخل عنوان المورد...\",\n \"additionalInstructions\": \"تعليمات إضافية\",\n \"additionalInstructionsPlaceholder\": \"أدخل تعليمات إضافية...\",\n \"language\": \"اللغة\",\n \"languageHelp\": \"لغة المحتوى المُولَّد\",\n \"creativity\": \"الإبداع\",\n \"creativityFocused\": \"مركّز\",\n \"creativityCreative\": \"إبداعي\",\n \"maxLength\": \"الحد الأقصى للطول\",\n \"maxLengthHelp\": \"العدد الأقصى من الرموز\",\n \"maxResults\": \"الحد الأقصى للنتائج\",\n \"semanticScoring\": \"التقييم الدلالي\",\n \"semanticScoringHelp\": \"استخدام الذكاء الاصطناعي لتقييم النتائج حسب الصلة الدلالية\",\n \"searching\": \"جاري البحث...\",\n \"search\": \"بحث\"\n },\n \"History\": {\n \"embeddingComputed\": \"تم حساب التضمين\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -31,7 +31,8 @@ var ResourceInfoPanel = {
|
|
|
31
31
|
creationMethod: "\u09A4\u09C8\u09B0\u09BF\u09B0 \u09AA\u09A6\u09CD\u09A7\u09A4\u09BF",
|
|
32
32
|
attributedTo: "\u09B8\u09AE\u09CD\u09AA\u09BE\u09A6\u0995\u0995\u09C3\u09A4",
|
|
33
33
|
derivedFrom: "\u09A5\u09C7\u0995\u09C7 \u0989\u09CE\u09AA\u09A8\u09CD\u09A8",
|
|
34
|
-
generatedBy: "\u09A4\u09C8\u09B0\u09BF\u0995\u09BE\u09B0\u0995"
|
|
34
|
+
generatedBy: "\u09A4\u09C8\u09B0\u09BF\u0995\u09BE\u09B0\u0995",
|
|
35
|
+
storageUri: "\u09B8\u099E\u09CD\u099A\u09AF\u09BC\u09B8\u09CD\u09A5\u09BE\u09A8"
|
|
35
36
|
};
|
|
36
37
|
var CollaborationPanel = {
|
|
37
38
|
title: "\u09B8\u09B9\u09AF\u09CB\u0997\u09BF\u09A4\u09BE",
|
|
@@ -377,6 +378,9 @@ var ReferenceWizard = {
|
|
|
377
378
|
searching: "\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09BE \u09B9\u099A\u09CD\u099B\u09C7...",
|
|
378
379
|
search: "\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8"
|
|
379
380
|
};
|
|
381
|
+
var History = {
|
|
382
|
+
embeddingComputed: "\u098F\u09AE\u09AC\u09C7\u09A1\u09BF\u0982 \u0997\u09A3\u09A8\u09BE \u0995\u09B0\u09BE \u09B9\u09AF\u09BC\u09C7\u099B\u09C7"
|
|
383
|
+
};
|
|
380
384
|
var bn_default = {
|
|
381
385
|
Toolbar,
|
|
382
386
|
ResourceInfoPanel,
|
|
@@ -395,7 +399,8 @@ var bn_default = {
|
|
|
395
399
|
ResourceViewer,
|
|
396
400
|
Settings,
|
|
397
401
|
AnnotateView,
|
|
398
|
-
ReferenceWizard
|
|
402
|
+
ReferenceWizard,
|
|
403
|
+
History
|
|
399
404
|
};
|
|
400
405
|
export {
|
|
401
406
|
AnnotateToolbar,
|
|
@@ -406,6 +411,7 @@ export {
|
|
|
406
411
|
CollapsibleResourceNavigation,
|
|
407
412
|
CommentsPanel,
|
|
408
413
|
HighlightPanel,
|
|
414
|
+
History,
|
|
409
415
|
KeyboardShortcuts,
|
|
410
416
|
ReferenceWizard,
|
|
411
417
|
ReferencesPanel,
|
|
@@ -418,4 +424,4 @@ export {
|
|
|
418
424
|
UnifiedAnnotationsPanel,
|
|
419
425
|
bn_default as default
|
|
420
426
|
};
|
|
421
|
-
//# sourceMappingURL=bn-
|
|
427
|
+
//# sourceMappingURL=bn-JZTJLMVE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../translations/bn.json"],"sourcesContent":["{\n \"Toolbar\": {\n \"annotations\": \"টীকাসমূহ\",\n \"history\": \"ইতিহাস\",\n \"resourceInfo\": \"সম্পদের তথ্য\",\n \"collaboration\": \"সহযোগিতা\",\n \"userAccount\": \"ব্যবহারকারীর অ্যাকাউন্ট\",\n \"settings\": \"সেটিংস\",\n \"knowledgeBase\": \"জ্ঞান ভান্ডার\"\n },\n \"ResourceInfoPanel\": {\n \"title\": \"সম্পদের তথ্য\",\n \"locale\": \"লোকেল\",\n \"notSpecified\": \"নির্দিষ্ট করা হয়নি\",\n \"entityTypeTags\": \"সত্তার ধরনের ট্যাগ\",\n \"representation\": \"উপস্থাপনা\",\n \"mediaType\": \"মিডিয়ার ধরন\",\n \"byteSize\": \"আকার\",\n \"clone\": \"ক্লোন\",\n \"cloneDescription\": \"এই সম্পদের জন্য একটি শেয়ারযোগ্য ক্লোন লিঙ্ক তৈরি করুন\",\n \"archive\": \"সংরক্ষণাগারভুক্ত করুন\",\n \"archiveDescription\": \"এই সম্পদটিকে সংরক্ষণাগারভুক্ত অবস্থায় স্থানান্তর করুন\",\n \"unarchive\": \"সংরক্ষণাগার থেকে পুনরুদ্ধার করুন\",\n \"unarchiveDescription\": \"এই সম্পদটিকে সক্রিয় অবস্থায় পুনরুদ্ধার করুন\",\n \"provenance\": \"উৎস ও উদ্ভব\",\n \"createdAt\": \"তৈরির তারিখ\",\n \"modifiedAt\": \"পরিবর্তনের তারিখ\",\n \"creationMethod\": \"তৈরির পদ্ধতি\",\n \"attributedTo\": \"সম্পাদককৃত\",\n \"derivedFrom\": \"থেকে উৎপন্ন\",\n \"generatedBy\": \"তৈরিকারক\",\n \"storageUri\": \"সঞ্চয়স্থান\"\n },\n \"CollaborationPanel\": {\n \"title\": \"সহযোগিতা\",\n \"connectionStatus\": \"সংযোগের অবস্থা\",\n \"live\": \"সরাসরি\",\n \"disconnected\": \"সংযোগ বিচ্ছিন্ন\",\n \"events\": \"{{count}} ঘটনা\",\n \"lastSync\": \"সর্বশেষ সিঙ্ক:\",\n \"noActivity\": \"এখনো কোনো কার্যকলাপ নেই\",\n \"justNow\": \"এইমাত্র\",\n \"secondsAgo\": \"{{count}} সেকেন্ড আগে\",\n \"minuteAgo\": \"১ মিনিট আগে\",\n \"minutesAgo\": \"{{count}} মিনিট আগে\",\n \"hourAgo\": \"১ ঘণ্টা আগে\",\n \"hoursAgo\": \"{{count}} ঘণ্টা আগে\",\n \"realtimeActive\": \"রিয়েল-টাইম আপডেট সক্রিয় আছে\",\n \"reconnecting\": \"সার্ভারে পুনরায় সংযোগ হচ্ছে...\",\n \"sharing\": \"শেয়ারিং\",\n \"collaborationComingSoon\": \"সহযোগিতা বৈশিষ্ট্য শীঘ্রই আসছে\"\n },\n \"AnnotationHistory\": {\n \"history\": \"ইতিহাস\",\n \"loading\": \"লোড হচ্ছে...\",\n \"user\": \"ব্যবহারকারী\",\n \"method\": \"পদ্ধতি\",\n \"viewOriginal\": \"মূল দেখুন\",\n \"viewAnnotation\": \"টীকা দেখুন: {{content}}\",\n \"resourceCreated\": \"সম্পদ তৈরি হয়েছে\",\n \"resourceCloned\": \"ক্লোন করা হয়েছে\",\n \"resourceArchived\": \"সংরক্ষণাগারভুক্ত\",\n \"resourceUnarchived\": \"সংরক্ষণাগার থেকে পুনরুদ্ধারকৃত\",\n \"highlightAdded\": \"হাইলাইট যোগ করা হয়েছে\",\n \"highlightRemoved\": \"হাইলাইট অপসারিত হয়েছে\",\n \"referenceCreated\": \"রেফারেন্স তৈরি হয়েছে\",\n \"referenceResolved\": \"রেফারেন্স সমাধান হয়েছে\",\n \"referenceDeleted\": \"রেফারেন্স মুছে ফেলা হয়েছে\",\n \"entitytagAdded\": \"ট্যাগ যোগ করা হয়েছে\",\n \"entitytagRemoved\": \"ট্যাগ অপসারিত হয়েছে\",\n \"assessmentAdded\": \"মূল্যায়ন যোগ করা হয়েছে\",\n \"assessmentRemoved\": \"মূল্যায়ন অপসারিত হয়েছে\",\n \"annotationAdded\": \"টীকা যোগ করা হয়েছে\",\n \"annotationRemoved\": \"টীকা অপসারিত হয়েছে\",\n \"annotationBodyUpdated\": \"টীকা আপডেট হয়েছে\",\n \"jobEvent\": \"কাজের ঘটনা\",\n \"justNow\": \"এইমাত্র\",\n \"minutesAgo\": \"{{count}} মি. আগে\",\n \"hoursAgo\": \"{{count}} ঘ. আগে\",\n \"daysAgo\": \"{{count}} দি. আগে\"\n },\n \"CommentsPanel\": {\n \"title\": \"মন্তব্যসমূহ\",\n \"noComments\": \"এখনো কোনো মন্তব্য নেই। পাঠ্য নির্বাচন করুন এবং একটি যোগ করতে মন্তব্যে ক্লিক করুন।\",\n \"commentPlaceholder\": \"এখানে আপনার মন্তব্য লিখুন...\",\n \"save\": \"সংরক্ষণ করুন\",\n \"cancel\": \"বাতিল করুন\",\n \"edit\": \"সম্পাদনা করুন\",\n \"annotateComments\": \"মন্তব্য টীকাকরণ\",\n \"instructions\": \"নির্দেশনা\",\n \"optional\": \"(ঐচ্ছিক)\",\n \"instructionsPlaceholder\": \"যেমন, প্রযুক্তিগত পরিভাষায় মনোযোগ দিন...\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"toneLabel\": \"সুর\",\n \"toneOptional\": \"(ঐচ্ছিক)\",\n \"toneScholarly\": \"পাণ্ডিত্যপূর্ণ\",\n \"toneExplanatory\": \"ব্যাখ্যামূলক\",\n \"toneConversational\": \"কথোপকথনমূলক\",\n \"toneTechnical\": \"প্রযুক্তিগত\",\n \"densityLabel\": \"ঘনত্ব\",\n \"densitySparse\": \"বিরল\",\n \"densityDense\": \"ঘন\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\",\n \"closeProgress\": \"বন্ধ করুন\"\n },\n \"HighlightPanel\": {\n \"title\": \"হাইলাইটসমূহ\",\n \"noHighlights\": \"এখনো কোনো হাইলাইট নেই। গুরুত্বপূর্ণ অনুচ্ছেদ খুঁজতে AI টীকাকরণ ব্যবহার করুন।\",\n \"annotateHighlights\": \"হাইলাইট টীকাকরণ\",\n \"instructions\": \"নির্দেশনা\",\n \"optional\": \"(ঐচ্ছিক)\",\n \"instructionsPlaceholder\": \"যেমন, মূল প্রযুক্তিগত ধারণাগুলিতে মনোযোগ দিন...\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"cancel\": \"বাতিল করুন\",\n \"densityLabel\": \"ঘনত্ব\",\n \"densitySparse\": \"বিরল\",\n \"densityDense\": \"ঘন\",\n \"closeProgress\": \"বন্ধ করুন\"\n },\n \"AssessmentPanel\": {\n \"title\": \"মূল্যায়নসমূহ\",\n \"noAssessments\": \"এখনো কোনো মূল্যায়ন নেই। অনুচ্ছেদ মূল্যায়ন করতে AI টীকাকরণ ব্যবহার করুন।\",\n \"assessmentPlaceholder\": \"এখানে আপনার মূল্যায়ন লিখুন...\",\n \"save\": \"সংরক্ষণ করুন\",\n \"cancel\": \"বাতিল করুন\",\n \"annotateAssessments\": \"মূল্যায়ন টীকাকরণ\",\n \"instructions\": \"নির্দেশনা\",\n \"optional\": \"(ঐচ্ছিক)\",\n \"instructionsPlaceholder\": \"যেমন, সঠিকতা এবং প্রমাণের জন্য দাবিগুলি মূল্যায়ন করুন...\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"toneLabel\": \"সুর\",\n \"toneOptional\": \"(ঐচ্ছিক)\",\n \"toneAnalytical\": \"বিশ্লেষণাত্মক\",\n \"toneCritical\": \"সমালোচনামূলক\",\n \"toneBalanced\": \"ভারসাম্যপূর্ণ\",\n \"toneConstructive\": \"গঠনমূলক\",\n \"densityLabel\": \"ঘনত্ব\",\n \"densitySparse\": \"বিরল\",\n \"densityDense\": \"ঘন\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\",\n \"closeProgress\": \"বন্ধ করুন\"\n },\n \"TaggingPanel\": {\n \"title\": \"ট্যাগসমূহ\",\n \"noTags\": \"এখনো কোনো ট্যাগ নেই। কাঠামোগত ভূমিকা শনাক্ত করতে AI টীকাকরণ ব্যবহার করুন।\",\n \"annotateTags\": \"ট্যাগ টীকাকরণ\",\n \"selectSchema\": \"ফ্রেমওয়ার্ক নির্বাচন করুন\",\n \"schemaLegal\": \"আইনি বিশ্লেষণ (IRAC)\",\n \"schemaScientific\": \"বৈজ্ঞানিক গবেষণাপত্র (IMRAD)\",\n \"schemaArgument\": \"যুক্তি কাঠামো (Toulmin)\",\n \"selectCategories\": \"বিভাগ নির্বাচন করুন\",\n \"categoryIssue\": \"বিষয়\",\n \"categoryRule\": \"নিয়ম\",\n \"categoryApplication\": \"প্রয়োগ\",\n \"categoryConclusion\": \"উপসংহার\",\n \"categoryIntroduction\": \"ভূমিকা\",\n \"categoryMethods\": \"পদ্ধতি\",\n \"categoryResults\": \"ফলাফল\",\n \"categoryDiscussion\": \"আলোচনা\",\n \"categoryClaim\": \"দাবি\",\n \"categoryEvidence\": \"প্রমাণ\",\n \"categoryWarrant\": \"যুক্তিসূত্র\",\n \"categoryCounterargument\": \"প্রতিযুক্তি\",\n \"categoryRebuttal\": \"খণ্ডন\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"cancel\": \"বাতিল করুন\",\n \"selectAll\": \"সমস্ত নির্বাচন করুন\",\n \"deselectAll\": \"সমস্ত অনির্বাচন করুন\",\n \"categoriesSelected\": \"{count, plural, =0 {কোনো বিভাগ নির্বাচিত নয়} =1 {১টি বিভাগ নির্বাচিত} other {# টি বিভাগ নির্বাচিত}}\",\n \"createTagForSelection\": \"নির্বাচনের জন্য ট্যাগ তৈরি করুন\",\n \"selectCategory\": \"বিভাগ নির্বাচন করুন\",\n \"chooseCategory\": \"একটি বিভাগ বেছে নিন...\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\"\n },\n \"UnifiedAnnotationsPanel\": {\n \"title\": \"টীকাসমূহ\",\n \"statistics\": \"পরিসংখ্যান\",\n \"highlight\": \"হাইলাইটসমূহ\",\n \"reference\": \"রেফারেন্সসমূহ\",\n \"assessment\": \"মূল্যায়নসমূহ\",\n \"comment\": \"মন্তব্যসমূহ\",\n \"tag\": \"ট্যাগসমূহ\"\n },\n \"StatisticsPanel\": {\n \"title\": \"পরিসংখ্যান\",\n \"highlights\": \"হাইলাইটসমূহ\",\n \"comments\": \"মন্তব্যসমূহ\",\n \"assessments\": \"মূল্যায়নসমূহ\",\n \"tags\": \"ট্যাগসমূহ\",\n \"references\": \"রেফারেন্সসমূহ\",\n \"stub\": \"অসম্পূর্ণ\",\n \"resolved\": \"সমাধানকৃত\",\n \"entityTypes\": \"সত্তার ধরন\"\n },\n \"ReferencesPanel\": {\n \"title\": \"রেফারেন্সসমূহ\",\n \"noReferences\": \"এখনো কোনো রেফারেন্স নেই। অন্যান্য সম্পদের রেফারেন্স তৈরি করতে পাঠ্য নির্বাচন করুন।\",\n \"outgoingReferences\": \"বহির্গামী রেফারেন্স\",\n \"incomingReferences\": \"আগত রেফারেন্স\",\n \"noIncomingReferences\": \"কোনো আগত রেফারেন্স নেই\",\n \"stub\": \"অসম্পূর্ণ রেফারেন্স (সংযুক্ত নয়)\",\n \"resolved\": \"সমাধানকৃত রেফারেন্স (সংযুক্ত)\",\n \"open\": \"খুলুন\",\n \"unlink\": \"সংযোগ বিচ্ছিন্ন করুন\",\n \"resolve\": \"রেফারেন্স সমাধান করুন\",\n \"cancel\": \"বাতিল করুন\",\n \"createReference\": \"রেফারেন্স তৈরি করুন\",\n \"entityTypesOptional\": \"সত্তার ধরন (ঐচ্ছিক)\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\",\n \"annotateReferences\": \"রেফারেন্স টীকাকরণ\",\n \"selectEntityTypes\": \"সত্তার ধরন:\",\n \"select\": \"নির্বাচন করুন\",\n \"deselect\": \"অনির্বাচন করুন\",\n \"noEntityTypes\": \"কোনো সত্তার ধরন উপলব্ধ নেই\",\n \"typesSelected\": \"{count, plural, =1 {১টি ধরন নির্বাচিত} other {# টি ধরন নির্বাচিত}}\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"includeDescriptiveReferences\": \"বর্ণনামূলক রেফারেন্স অন্তর্ভুক্ত করুন\",\n \"descriptiveReferencesTooltip\": \"নামের পাশাপাশি 'সিইও', 'প্রযুক্তি জায়ান্ট', 'পদার্থবিদ' এর মতো বাক্যাংশও খুঁজুন\",\n \"annotationProgressTitle\": \"সত্তা রেফারেন্স টীকাকরণ হচ্ছে\",\n \"cancelAnnotation\": \"টীকাকরণ বাতিল করুন\",\n \"found\": \"{{count}} টি পাওয়া গেছে\",\n \"complete\": \"টীকাকরণ সম্পূর্ণ!\",\n \"failed\": \"টীকাকরণ ব্যর্থ\",\n \"current\": \"বর্তমান: {{entityType}}\",\n \"closeProgress\": \"বন্ধ করুন\",\n \"loading\": \"লোড হচ্ছে...\",\n \"loadingEllipsis\": \"লোড হচ্ছে...\",\n \"untitledResource\": \"শিরোনামবিহীন সম্পদ\",\n \"noText\": \"কোনো পাঠ্য নেই\"\n },\n \"KeyboardShortcuts\": {\n \"title\": \"কীবোর্ড শর্টকাট\",\n \"closeDialog\": \"ডায়ালগ বন্ধ করুন\",\n \"or\": \"অথবা\",\n \"navigationTitle\": \"নেভিগেশন\",\n \"navOpenSearch\": \"গ্লোবাল অনুসন্ধান খুলুন\",\n \"navOpenSearchAlt\": \"গ্লোবাল অনুসন্ধান খুলুন (বিকল্প)\",\n \"navCreateResource\": \"নতুন সম্পদ তৈরি করুন\",\n \"navCloseOverlays\": \"সমস্ত ওভারলে বন্ধ করুন (দুইবার চাপুন)\",\n \"navShowHelp\": \"কীবোর্ড শর্টকাট সাহায্য দেখান\",\n \"sidebarTitle\": \"জ্ঞান সাইডবার\",\n \"sidebarCollapse\": \"সাইডবার সংকুচিত করুন\",\n \"sidebarExpand\": \"সাইডবার প্রসারিত করুন\",\n \"sidebarPickup\": \"সম্পদ ট্যাব তুলে নিন (ফোকাসে থাকলে)\",\n \"sidebarMove\": \"সম্পদ ট্যাব সরান (টানাটানির সময়)\",\n \"sidebarDrop\": \"সম্পদ ট্যাব ছেড়ে দিন (টানাটানির সময়)\",\n \"sidebarCancel\": \"টানাটানি কার্যক্রম বাতিল করুন\",\n \"annotationsTitle\": \"সম্পদ টীকাসমূহ\",\n \"annotHighlight\": \"টীকা থেকে হাইলাইট তৈরি করুন (সরাসরি)\",\n \"annotReference\": \"টীকার জন্য রেফারেন্স পপআপ খুলুন\",\n \"annotDelete\": \"ফোকাসকৃত টীকা মুছে ফেলুন\",\n \"annotNavigate\": \"টীকাসমূহের মধ্যে নেভিগেট করুন\",\n \"annotNavigateBack\": \"টীকাসমূহে পেছনে নেভিগেট করুন\",\n \"listsTitle\": \"তালিকা এবং গ্রিড\",\n \"listsFilterNav\": \"সত্তার ধরনের ফিল্টার নেভিগেট করুন\",\n \"listsGridNav\": \"সম্পদ গ্রিড নেভিগেট করুন\",\n \"listsJumpFirst\": \"প্রথম আইটেমে যান\",\n \"listsJumpLast\": \"শেষ আইটেমে যান\",\n \"searchModalTitle\": \"অনুসন্ধান মোডালে\",\n \"searchNav\": \"অনুসন্ধান ফলাফল নেভিগেট করুন\",\n \"searchSelect\": \"ফলাফল নির্বাচন করুন\",\n \"searchClose\": \"অনুসন্ধান বন্ধ করুন\",\n \"modalTitle\": \"মোডাল নিয়ন্ত্রণ\",\n \"modalClose\": \"সক্রিয় মোডাল বন্ধ করুন\",\n \"modalNavForward\": \"বোতামগুলির মধ্যে সামনে নেভিগেট করুন\",\n \"modalNavBackward\": \"বোতামগুলির মধ্যে পেছনে নেভিগেট করুন\",\n \"modalActivate\": \"ফোকাসকৃত বোতাম সক্রিয় করুন\",\n \"accessibilityTitle\": \"অভিগম্যতা\",\n \"a11ySkipLinks\": \"স্কিপ লিঙ্কে নেভিগেট করুন (পৃষ্ঠার শুরুতে থাকলে)\",\n \"a11yFollowLink\": \"স্কিপ লিঙ্ক অনুসরণ করুন\",\n \"macNote\": \"Mac কীবোর্ড শর্টকাট ব্যবহার হচ্ছে। ⌘ হলো Command কী।\",\n \"windowsNote\": \"Windows/Linux কীবোর্ড শর্টকাট ব্যবহার হচ্ছে। Ctrl হলো Control কী।\",\n \"footerHint\": \"এই সাহায্য দেখাতে যেকোনো সময় {{key}} চাপুন\",\n \"close\": \"বন্ধ করুন\"\n },\n \"AnnotateToolbar\": {\n \"modeGroup\": \"মোড\",\n \"browse\": \"ব্রাউজ\",\n \"annotate\": \"টীকাকরণ\",\n \"selectionGroup\": \"উদ্দেশ্য\",\n \"clickGroup\": \"ক্লিক\",\n \"shapeGroup\": \"আকৃতি\",\n \"none\": \"কিছু নয়\",\n \"linking\": \"রেফারেন্স\",\n \"highlighting\": \"হাইলাইট\",\n \"assessing\": \"মূল্যায়ন\",\n \"commenting\": \"মন্তব্য\",\n \"tagging\": \"ট্যাগ\",\n \"detail\": \"বিস্তারিত\",\n \"follow\": \"অনুসরণ\",\n \"deleting\": \"মুছে ফেলুন\",\n \"jsonld\": \"JSON-LD\",\n \"rectangle\": \"আয়তক্ষেত্র\",\n \"circle\": \"বৃত্ত\",\n \"polygon\": \"বহুভুজ\"\n },\n \"CollapsibleResourceNavigation\": {\n \"title\": \"নেভিগেশন\",\n \"collapseSidebar\": \"সাইডবার সংকুচিত করুন\",\n \"expandSidebar\": \"সাইডবার প্রসারিত করুন\",\n \"dragToReorder\": \"পুনর্বিন্যাস করতে টানুন\",\n \"dragToReorderDoc\": \"{{name}} পুনর্বিন্যাস করতে টানুন\",\n \"closeResource\": \"সম্পদ বন্ধ করুন\",\n \"dragInstructions\": \"সম্পদ পুনর্বিন্যাস করতে: একটি সম্পদে নেভিগেট করতে Tab ব্যবহার করুন। উপরে যেতে Alt+উপরের তীর বা নিচে যেতে Alt+নিচের তীর চাপুন। টানা এবং ছাড়ার জন্য: আইটেম তুলে নিতে স্পেসবার চাপুন। সরাতে তীর কী ব্যবহার করুন। ছেড়ে দিতে আবার স্পেসবার চাপুন।\"\n },\n \"ResourceViewer\": {\n \"deleteConfirmationTitle\": \"টীকা মুছে ফেলুন\",\n \"deleteConfirmationMessage\": \"আপনি কি নিশ্চিতভাবে এই টীকাটি মুছে ফেলতে চান? এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না।\",\n \"deleteConfirmationCancel\": \"বাতিল করুন\",\n \"deleteConfirmationDelete\": \"মুছে ফেলুন\"\n },\n \"Settings\": {\n \"title\": \"সেটিংস\",\n \"lineNumbers\": \"লাইন নম্বর\",\n \"lineNumbersVisible\": \"দৃশ্যমান\",\n \"lineNumbersHidden\": \"লুকানো\",\n \"theme\": \"থিম\",\n \"themeLight\": \"হালকা\",\n \"themeDark\": \"গাঢ়\",\n \"themeSystem\": \"সিস্টেম\",\n \"themeSystemActive\": \"সিস্টেম ({{mode}})\",\n \"themeModeActive\": \"{{mode}} মোড ব্যবহার হচ্ছে\",\n \"language\": \"ভাষা\",\n \"languageHint\": \"প্রধান নেভিগেশনে ভাষা পরিবর্তন করুন\",\n \"languageChanging\": \"ভাষা পরিবর্তন হচ্ছে...\",\n \"hoverDelay\": \"হোভার বিলম্ব\",\n \"hoverDelayFast\": \"দ্রুত\",\n \"hoverDelaySlow\": \"ধীর\",\n \"hoverDelayDescription\": \"হোভার প্রভাব প্রদর্শনের আগে {{delay}}মি.সে. বিলম্ব\"\n },\n \"AnnotateView\": {},\n \"ReferenceWizard\": {\n \"gatherTitle\": \"সংগৃহীত প্রসঙ্গ\",\n \"configureGenerationTitle\": \"জেনারেশন কনফিগার করুন\",\n \"configureSearchTitle\": \"অনুসন্ধান কনফিগার করুন\",\n \"searchResultsTitle\": \"অনুসন্ধান ফলাফল\",\n \"sourceContextLabel\": \"সম্পদে টীকার প্রসঙ্গ\",\n \"connectionsLabel\": \"সমকক্ষ টীকাসমূহ\",\n \"citedByLabel\": \"সম্পদ উদ্ধৃতকারী\",\n \"userHintLabel\": \"ইঙ্গিত\",\n \"userHintPlaceholder\": \"এই টীকাটি কী বোঝায় তা বর্ণনা করুন...\",\n \"loadingContext\": \"প্রসঙ্গ সংগ্রহ হচ্ছে...\",\n \"failedContext\": \"প্রসঙ্গ সংগ্রহ ব্যর্থ\",\n \"cancel\": \"বাতিল করুন\",\n \"generate\": \"তৈরি করুন\",\n \"compose\": \"রচনা করুন\",\n \"resolutionStrategyLabel\": \"রেজোলিউশন কৌশল\",\n \"back\": \"পিছনে\",\n \"link\": \"লিঙ্ক\",\n \"score\": \"স্কোর\",\n \"noResults\": \"কোনো ফলাফল পাওয়া যায়নি\",\n \"resourceTitle\": \"সম্পদের শিরোনাম\",\n \"resourceTitlePlaceholder\": \"সম্পদের শিরোনাম লিখুন...\",\n \"additionalInstructions\": \"অতিরিক্ত নির্দেশনা\",\n \"additionalInstructionsPlaceholder\": \"অতিরিক্ত নির্দেশনা লিখুন...\",\n \"language\": \"ভাষা\",\n \"languageHelp\": \"তৈরি করা বিষয়বস্তুর ভাষা\",\n \"creativity\": \"সৃজনশীলতা\",\n \"creativityFocused\": \"কেন্দ্রীভূত\",\n \"creativityCreative\": \"সৃজনশীল\",\n \"maxLength\": \"সর্বোচ্চ দৈর্ঘ্য\",\n \"maxLengthHelp\": \"সর্বোচ্চ টোকেন সংখ্যা\",\n \"maxResults\": \"সর্বোচ্চ ফলাফল\",\n \"semanticScoring\": \"অর্থগত স্কোরিং\",\n \"semanticScoringHelp\": \"অর্থগত প্রাসঙ্গিকতা অনুযায়ী ফলাফল স্কোর করতে AI ব্যবহার করুন\",\n \"searching\": \"অনুসন্ধান করা হচ্ছে...\",\n \"search\": \"অনুসন্ধান\"\n },\n \"History\": {\n \"embeddingComputed\": \"এমবেডিং গণনা করা হয়েছে\"\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
en_default
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-NOD3NCXE.mjs";
|
|
5
5
|
import {
|
|
6
6
|
__glob
|
|
7
7
|
} from "./chunk-D4GAAQMM.mjs";
|
|
@@ -577,35 +577,35 @@ import { Fragment, jsx as jsx4 } from "react/jsx-runtime";
|
|
|
577
577
|
|
|
578
578
|
// import("../../translations/**/*.json") in src/contexts/TranslationContext.tsx
|
|
579
579
|
var globImport_translations_json = __glob({
|
|
580
|
-
"../../translations/ar.json": () => import("./ar-
|
|
581
|
-
"../../translations/bn.json": () => import("./bn-
|
|
582
|
-
"../../translations/cs.json": () => import("./cs-
|
|
583
|
-
"../../translations/da.json": () => import("./da-
|
|
584
|
-
"../../translations/de.json": () => import("./de-
|
|
585
|
-
"../../translations/el.json": () => import("./el-
|
|
586
|
-
"../../translations/en.json": () => import("./en-
|
|
587
|
-
"../../translations/es.json": () => import("./es-
|
|
588
|
-
"../../translations/fa.json": () => import("./fa-
|
|
589
|
-
"../../translations/fi.json": () => import("./fi-
|
|
590
|
-
"../../translations/fr.json": () => import("./fr-
|
|
591
|
-
"../../translations/he.json": () => import("./he-
|
|
592
|
-
"../../translations/hi.json": () => import("./hi-
|
|
593
|
-
"../../translations/id.json": () => import("./id-
|
|
594
|
-
"../../translations/it.json": () => import("./it-
|
|
595
|
-
"../../translations/ja.json": () => import("./ja-
|
|
596
|
-
"../../translations/ko.json": () => import("./ko-
|
|
597
|
-
"../../translations/ms.json": () => import("./ms-
|
|
598
|
-
"../../translations/nl.json": () => import("./nl-
|
|
599
|
-
"../../translations/no.json": () => import("./no-
|
|
600
|
-
"../../translations/pl.json": () => import("./pl-
|
|
601
|
-
"../../translations/pt.json": () => import("./pt-
|
|
602
|
-
"../../translations/ro.json": () => import("./ro-
|
|
603
|
-
"../../translations/sv.json": () => import("./sv-
|
|
604
|
-
"../../translations/th.json": () => import("./th-
|
|
605
|
-
"../../translations/tr.json": () => import("./tr-
|
|
606
|
-
"../../translations/uk.json": () => import("./uk-
|
|
607
|
-
"../../translations/vi.json": () => import("./vi-
|
|
608
|
-
"../../translations/zh.json": () => import("./zh-
|
|
580
|
+
"../../translations/ar.json": () => import("./ar-3W37O3R3.mjs"),
|
|
581
|
+
"../../translations/bn.json": () => import("./bn-JZTJLMVE.mjs"),
|
|
582
|
+
"../../translations/cs.json": () => import("./cs-XYHH7HNE.mjs"),
|
|
583
|
+
"../../translations/da.json": () => import("./da-MZKIECVT.mjs"),
|
|
584
|
+
"../../translations/de.json": () => import("./de-AYXTMRQW.mjs"),
|
|
585
|
+
"../../translations/el.json": () => import("./el-A6CVQWAW.mjs"),
|
|
586
|
+
"../../translations/en.json": () => import("./en-YPQQBI4T.mjs"),
|
|
587
|
+
"../../translations/es.json": () => import("./es-M2HXLJGT.mjs"),
|
|
588
|
+
"../../translations/fa.json": () => import("./fa-V6JZJDYP.mjs"),
|
|
589
|
+
"../../translations/fi.json": () => import("./fi-ONDTZ5H7.mjs"),
|
|
590
|
+
"../../translations/fr.json": () => import("./fr-PAPV4H4G.mjs"),
|
|
591
|
+
"../../translations/he.json": () => import("./he-F6VTLJLW.mjs"),
|
|
592
|
+
"../../translations/hi.json": () => import("./hi-CFUAV4BF.mjs"),
|
|
593
|
+
"../../translations/id.json": () => import("./id-NBKLCCI7.mjs"),
|
|
594
|
+
"../../translations/it.json": () => import("./it-SLSOWVVU.mjs"),
|
|
595
|
+
"../../translations/ja.json": () => import("./ja-L5IG4ECE.mjs"),
|
|
596
|
+
"../../translations/ko.json": () => import("./ko-QYMTULKK.mjs"),
|
|
597
|
+
"../../translations/ms.json": () => import("./ms-5DGSFKM2.mjs"),
|
|
598
|
+
"../../translations/nl.json": () => import("./nl-VZPCGONO.mjs"),
|
|
599
|
+
"../../translations/no.json": () => import("./no-MF6F352I.mjs"),
|
|
600
|
+
"../../translations/pl.json": () => import("./pl-WIK72JUO.mjs"),
|
|
601
|
+
"../../translations/pt.json": () => import("./pt-RRP5ZF6A.mjs"),
|
|
602
|
+
"../../translations/ro.json": () => import("./ro-XHQLC3T7.mjs"),
|
|
603
|
+
"../../translations/sv.json": () => import("./sv-EWULDN6E.mjs"),
|
|
604
|
+
"../../translations/th.json": () => import("./th-TGOBHFG4.mjs"),
|
|
605
|
+
"../../translations/tr.json": () => import("./tr-LMMPBMV7.mjs"),
|
|
606
|
+
"../../translations/uk.json": () => import("./uk-IPGRRJY6.mjs"),
|
|
607
|
+
"../../translations/vi.json": () => import("./vi-Q676OJQS.mjs"),
|
|
608
|
+
"../../translations/zh.json": () => import("./zh-F3MTWQDX.mjs")
|
|
609
609
|
});
|
|
610
610
|
|
|
611
611
|
// src/contexts/TranslationContext.tsx
|
|
@@ -745,7 +745,7 @@ var defaultTranslationManager = {
|
|
|
745
745
|
let result = translation;
|
|
746
746
|
result = processPluralFormat(result, params);
|
|
747
747
|
Object.entries(params).forEach(([paramKey, paramValue]) => {
|
|
748
|
-
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
748
|
+
result = result.replace(new RegExp(`\\{\\{${paramKey}\\}\\}`, "g"), String(paramValue));
|
|
749
749
|
});
|
|
750
750
|
return result;
|
|
751
751
|
}
|
|
@@ -786,7 +786,7 @@ function TranslationProvider({
|
|
|
786
786
|
let result = translation;
|
|
787
787
|
result = processPluralFormat(result, params);
|
|
788
788
|
Object.entries(params).forEach(([paramKey, paramValue]) => {
|
|
789
|
-
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
789
|
+
result = result.replace(new RegExp(`\\{\\{${paramKey}\\}\\}`, "g"), String(paramValue));
|
|
790
790
|
});
|
|
791
791
|
return result;
|
|
792
792
|
}
|
|
@@ -819,7 +819,7 @@ function useTranslations(namespace) {
|
|
|
819
819
|
let result = translation;
|
|
820
820
|
result = processPluralFormat(result, params);
|
|
821
821
|
Object.entries(params).forEach(([paramKey, paramValue]) => {
|
|
822
|
-
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
822
|
+
result = result.replace(new RegExp(`\\{\\{${paramKey}\\}\\}`, "g"), String(paramValue));
|
|
823
823
|
});
|
|
824
824
|
return result;
|
|
825
825
|
}
|
|
@@ -862,4 +862,4 @@ export {
|
|
|
862
862
|
useTranslations,
|
|
863
863
|
usePreloadTranslations
|
|
864
864
|
};
|
|
865
|
-
//# sourceMappingURL=chunk-
|
|
865
|
+
//# sourceMappingURL=chunk-FAI3S4BM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/knowledge-base-session/storage.ts","../src/contexts/knowledge-base-session/notify.ts","../src/contexts/KnowledgeBaseSessionContext.tsx","../src/contexts/knowledge-base-session/refresh.ts","../src/components/Toast.tsx","../src/contexts/OpenResourcesContext.tsx","../src/contexts/TranslationContext.tsx"],"sourcesContent":["/**\n * Pure helpers for the KnowledgeBaseSession provider.\n *\n * Contains:\n * - localStorage shape and read/write helpers for KB list, active KB id,\n * and per-KB sessions\n * - JWT expiry parsing and \"is expired\" check\n * - URL/protocol helpers for KB instances\n * - The public `getKbSessionStatus(kbId)` helper that the KB-list UI uses\n * to color status dots without subscribing to context changes\n *\n * No React imports, no module-scoped state, no side effects beyond\n * localStorage. Splitting these out of the provider file makes them\n * unit-testable in isolation and keeps the React provider focused on\n * lifecycle and state.\n */\n\nimport type { KnowledgeBase, KbSessionStatus } from '../../types/knowledge-base';\n\n// ---------- Storage keys ----------\n\nconst SESSION_PREFIX = 'semiont.session.';\nexport const STORAGE_KEY = 'semiont.knowledgeBases';\nexport const ACTIVE_KEY = 'semiont.activeKnowledgeBaseId';\n\n/** Refresh the access token this many milliseconds before it expires. */\nexport const REFRESH_BEFORE_EXP_MS = 5 * 60 * 1000;\n\n/** The shape persisted to localStorage per KB. */\nexport interface StoredSession {\n access: string;\n refresh: string;\n}\n\nexport function sessionKey(kbId: string): string {\n return `${SESSION_PREFIX}${kbId}`;\n}\n\n// ---------- Per-KB session storage ----------\n\nexport function getStoredSession(kbId: string): StoredSession | null {\n const raw = localStorage.getItem(sessionKey(kbId));\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.access === 'string' && typeof parsed.refresh === 'string') {\n return { access: parsed.access, refresh: parsed.refresh };\n }\n } catch {\n // malformed entry — treat as no session\n }\n return null;\n}\n\nexport function setStoredSession(kbId: string, session: StoredSession): void {\n localStorage.setItem(sessionKey(kbId), JSON.stringify(session));\n}\n\nexport function clearStoredSession(kbId: string): void {\n localStorage.removeItem(sessionKey(kbId));\n}\n\n// ---------- JWT helpers ----------\n\nexport function parseJwtExpiry(token: string): Date | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3 || !parts[1]) return null;\n const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n if (!payload.exp) return null;\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\nexport function isJwtExpired(token: string): boolean {\n const expiry = parseJwtExpiry(token);\n if (!expiry) return true;\n return expiry.getTime() < Date.now();\n}\n\n// ---------- KB list storage ----------\n\nfunction migrateLegacyEntry(entry: any): KnowledgeBase {\n if (entry.host !== undefined) return entry as KnowledgeBase;\n // Legacy format: { id, label, backendUrl }\n try {\n const url = new URL(entry.backendUrl);\n return {\n id: entry.id,\n label: entry.label,\n host: url.hostname,\n port: parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n email: '',\n };\n } catch {\n return {\n id: entry.id,\n label: entry.label || 'Unknown',\n host: 'localhost',\n port: 4000,\n protocol: 'http',\n email: '',\n };\n }\n}\n\nexport function loadKnowledgeBases(): KnowledgeBase[] {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return [];\n const entries = JSON.parse(raw) as any[];\n return entries.map(migrateLegacyEntry);\n } catch {\n return [];\n }\n}\n\nexport function saveKnowledgeBases(knowledgeBases: KnowledgeBase[]): void {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(knowledgeBases));\n}\n\n// ---------- Public pure helpers ----------\n\nexport function defaultProtocol(host: string): 'http' | 'https' {\n return host === 'localhost' || host === '127.0.0.1' ? 'http' : 'https';\n}\n\nexport function kbBackendUrl(kb: KnowledgeBase): string {\n return `${kb.protocol}://${kb.host}:${kb.port}`;\n}\n\n/**\n * Read the locally-stored credential status for a KB. Pure / synchronous —\n * does not subscribe to context changes. Used by KB-list UI to color status\n * dots without requiring re-renders on every tick.\n */\nexport function getKbSessionStatus(kbId: string): KbSessionStatus {\n const stored = getStoredSession(kbId);\n if (!stored) return 'signed-out';\n return isJwtExpired(stored.access) ? 'expired' : 'authenticated';\n}\n\nexport function generateKbId(): string {\n return crypto.randomUUID();\n}\n","/**\n * Module-scoped session-expired / permission-denied notifier.\n *\n * The provider registers itself with this module-scoped slot on mount and\n * unregisters on unmount via {@link registerAuthNotifyHandlers}. Code outside\n * the React tree (notably the React Query QueryCache.onError handler in app\n * providers) calls {@link notifySessionExpired} or {@link notifyPermissionDenied}\n * to reach the active provider.\n *\n * When no provider is mounted (e.g. on the landing page), these calls are\n * no-ops — there is nothing to notify.\n *\n * No React imports — this is plain module state. The provider effect that\n * calls `registerAuthNotifyHandlers` runs inside React but the module itself\n * is React-agnostic.\n */\n\ntype Notify = (message?: string) => void;\n\nlet activeOnSessionExpired: Notify | null = null;\nlet activeOnPermissionDenied: Notify | null = null;\n\nexport function notifySessionExpired(message?: string): void {\n activeOnSessionExpired?.(message);\n}\n\nexport function notifyPermissionDenied(message?: string): void {\n activeOnPermissionDenied?.(message);\n}\n\n/**\n * Install handlers for session-expired and permission-denied notifications.\n * Returns an unregister callback. Intended to be called from a React useEffect\n * with the cleanup callback returned from the effect.\n *\n * Only one provider is expected to be mounted at a time. If a second provider\n * mounts before the first unmounts, its handlers replace the previous ones —\n * the previous provider becomes deaf to notifications. In practice this only\n * happens during the brief window of a React StrictMode double-mount or a\n * test that mounts and unmounts multiple providers rapidly.\n */\nexport function registerAuthNotifyHandlers(handlers: {\n onSessionExpired: Notify;\n onPermissionDenied: Notify;\n}): () => void {\n activeOnSessionExpired = handlers.onSessionExpired;\n activeOnPermissionDenied = handlers.onPermissionDenied;\n return () => {\n activeOnSessionExpired = null;\n activeOnPermissionDenied = null;\n };\n}\n","/**\n * KnowledgeBaseSessionContext — single source of truth for \"which KB and\n * what's the session against it.\"\n *\n * This provider merges what used to be three separate concerns in the\n * frontend (KnowledgeBaseProvider + KnowledgeBaseAuthBridge + AuthProvider)\n * plus the library-side SessionProvider, into one coherent unit.\n *\n * Why merged: a session in this app is always a session against a specific\n * KB. There is no auth without a KB. Switching KBs means switching sessions\n * atomically.\n *\n * What it owns:\n * - The list of configured KBs (persisted to localStorage)\n * - Which KB is currently active (persisted to localStorage)\n * - The validated session (token + user) for the active KB\n * - The \"session expired\" and \"permission denied\" flags that drive the modals\n * - JWT expiry derivations (for the session-timer UI)\n * - Mount-time validation flow with manual 401 recovery\n * - Proactive refresh: a timer that fires before the access token expires\n * - Cross-tab sync: when another tab refreshes or signs out, this tab updates\n *\n * Implementation is split across the `knowledge-base-session/` directory:\n * - `storage.ts` — localStorage shape, JWT helpers, KB list helpers\n * - `refresh.ts` — `performRefresh` and the in-flight Promise dedup map\n * - `notify.ts` — module-scoped notify functions and the register helper\n *\n * Mounting: must be inside `EventBusProvider` and `TranslationProvider` (it\n * uses neither, but the modals it sits next to do). It does NOT depend on\n * any other library context. Mount it inside the protected layout boundary.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { SemiontApiClient, APIError } from '@semiont/api-client';\nimport { baseUrl, EventBus, accessToken } from '@semiont/core';\nimport type { components } from '@semiont/core';\nimport type {\n KnowledgeBase,\n NewKnowledgeBase,\n} from '../types/knowledge-base';\nimport {\n ACTIVE_KEY,\n REFRESH_BEFORE_EXP_MS,\n clearStoredSession,\n generateKbId,\n getStoredSession,\n isJwtExpired,\n kbBackendUrl,\n loadKnowledgeBases,\n parseJwtExpiry,\n saveKnowledgeBases,\n sessionKey,\n setStoredSession,\n} from './knowledge-base-session/storage';\nimport { performRefresh } from './knowledge-base-session/refresh';\nimport { registerAuthNotifyHandlers } from './knowledge-base-session/notify';\nimport type { StoredSession } from './knowledge-base-session/storage';\n\ntype UserInfo = components['schemas']['UserResponse'];\n\nexport interface AuthSession {\n token: string;\n user: UserInfo;\n}\n\n// Re-export the public surface so consumers can keep importing from this module\nexport {\n defaultProtocol,\n kbBackendUrl,\n getKbSessionStatus,\n} from './knowledge-base-session/storage';\nexport type { StoredSession } from './knowledge-base-session/storage';\nexport {\n notifySessionExpired,\n notifyPermissionDenied,\n} from './knowledge-base-session/notify';\n\n// ---------- Context value ----------\n\ninterface KnowledgeBaseSessionValue {\n // KB list\n knowledgeBases: KnowledgeBase[];\n activeKnowledgeBase: KnowledgeBase | null;\n\n // Session state for the active KB\n session: AuthSession | null;\n isLoading: boolean;\n\n // Derived auth fields (memoized off `session.user`)\n user: UserInfo | null;\n token: string | null;\n isAuthenticated: boolean;\n hasValidBackendToken: boolean;\n isFullyAuthenticated: boolean;\n displayName: string;\n avatarUrl: string | null;\n userDomain: string | undefined;\n isAdmin: boolean;\n isModerator: boolean;\n\n // JWT expiry (derived from session.token)\n expiresAt: Date | null;\n\n // Modal-driving flags\n sessionExpiredAt: number | null;\n sessionExpiredMessage: string | null;\n permissionDeniedAt: number | null;\n permissionDeniedMessage: string | null;\n\n // Mutations\n addKnowledgeBase: (kb: NewKnowledgeBase, access: string, refresh: string) => KnowledgeBase;\n removeKnowledgeBase: (id: string) => void;\n setActiveKnowledgeBase: (id: string) => void;\n updateKnowledgeBase: (id: string, updates: Partial<KnowledgeBase>) => void;\n /** Re-auth on an existing KB: store the new tokens and refresh the session. */\n signIn: (id: string, access: string, refresh: string) => void;\n /** Sign out of a KB: clear its stored tokens. If it's the active KB, clear in-memory session too. */\n signOut: (id: string) => void;\n\n /**\n * Refresh the active KB's access token. Returns the new access token, or\n * null if no refresh token is available or the refresh failed. Concurrent\n * calls deduplicate via an in-flight Promise per KB. Used by the api-client's\n * 401-recovery hook and by the proactive refresh timer.\n */\n refreshActive: () => Promise<string | null>;\n\n // Modal acks\n acknowledgeSessionExpired: () => void;\n acknowledgePermissionDenied: () => void;\n}\n\n/**\n * Raw context export. Exposed for test utilities that need to construct\n * a mock provider without going through localStorage and JWT validation.\n * Production code should always use {@link useKnowledgeBaseSession} instead.\n */\nexport const KnowledgeBaseSessionContext = createContext<KnowledgeBaseSessionValue | undefined>(undefined);\n\nexport type { KnowledgeBaseSessionValue };\n\n// ---------- Provider ----------\n\nexport function KnowledgeBaseSessionProvider({ children }: { children: React.ReactNode }) {\n // KB list and active selection\n const [knowledgeBases, setKnowledgeBases] = useState<KnowledgeBase[]>(() => loadKnowledgeBases());\n const [activeKnowledgeBaseId, setActiveKnowledgeBaseId] = useState<string | null>(() => {\n const saved = localStorage.getItem(ACTIVE_KEY);\n const loaded = loadKnowledgeBases();\n if (saved && loaded.some(kb => kb.id === saved)) return saved;\n return loaded[0]?.id ?? null;\n });\n\n // Session state for the active KB\n const [session, setSession] = useState<AuthSession | null>(null);\n const [isLoading, setIsLoading] = useState<boolean>(() => {\n const id = activeKnowledgeBaseId;\n if (!id) return false;\n const stored = getStoredSession(id);\n if (!stored) return false;\n // We'll either validate (if access fresh) or refresh (if refresh available)\n return !isJwtExpired(stored.access) || stored.refresh != null;\n });\n\n // Modal flags\n const [sessionExpiredAt, setSessionExpiredAt] = useState<number | null>(null);\n const [sessionExpiredMessage, setSessionExpiredMessage] = useState<string | null>(null);\n const [permissionDeniedAt, setPermissionDeniedAt] = useState<number | null>(null);\n const [permissionDeniedMessage, setPermissionDeniedMessage] = useState<string | null>(null);\n\n // Persist KB list and active id\n useEffect(() => {\n saveKnowledgeBases(knowledgeBases);\n }, [knowledgeBases]);\n\n useEffect(() => {\n if (activeKnowledgeBaseId) {\n localStorage.setItem(ACTIVE_KEY, activeKnowledgeBaseId);\n } else {\n localStorage.removeItem(ACTIVE_KEY);\n }\n }, [activeKnowledgeBaseId]);\n\n const activeKnowledgeBase = useMemo(\n () => knowledgeBases.find(kb => kb.id === activeKnowledgeBaseId) ?? null,\n [knowledgeBases, activeKnowledgeBaseId]\n );\n\n // Refs for cross-effect coordination\n const activeKbRef = useRef<KnowledgeBase | null>(activeKnowledgeBase);\n useEffect(() => {\n activeKbRef.current = activeKnowledgeBase;\n }, [activeKnowledgeBase]);\n\n const proactiveRefreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Schedule a one-shot timer that fires `REFRESH_BEFORE_EXP_MS` before the\n * given access token expires. Cancels any prior pending timer.\n */\n const scheduleProactiveRefresh = useCallback((accessTokenStr: string) => {\n if (proactiveRefreshTimerRef.current) {\n clearTimeout(proactiveRefreshTimerRef.current);\n proactiveRefreshTimerRef.current = null;\n }\n const expiresAt = parseJwtExpiry(accessTokenStr);\n if (!expiresAt) return;\n const refreshAt = expiresAt.getTime() - REFRESH_BEFORE_EXP_MS;\n const delay = Math.max(0, refreshAt - Date.now());\n proactiveRefreshTimerRef.current = setTimeout(() => {\n proactiveRefreshTimerRef.current = null;\n // Fire-and-forget: refreshActive captures activeKbRef and updates state\n refreshActiveRef.current?.();\n }, delay);\n }, []);\n\n // refreshActive needs to be stable across renders for the api-client wiring\n // and also needs to read fresh activeKnowledgeBase via the ref. We define\n // the function via a ref so callers can capture a stable reference.\n const refreshActiveRef = useRef<(() => Promise<string | null>) | null>(null);\n const refreshActive = useCallback(async (): Promise<string | null> => {\n const kb = activeKbRef.current;\n if (!kb) return null;\n const newAccess = await performRefresh(kb);\n if (newAccess) {\n // Update the in-memory session token so consumers see the new value\n setSession(prev => (prev ? { ...prev, token: newAccess } : prev));\n scheduleProactiveRefresh(newAccess);\n } else {\n // Refresh failed — surface the modal\n setSession(null);\n clearStoredSession(kb.id);\n setSessionExpiredMessage('Your session has expired. Please sign in again.');\n setSessionExpiredAt(Date.now());\n if (proactiveRefreshTimerRef.current) {\n clearTimeout(proactiveRefreshTimerRef.current);\n proactiveRefreshTimerRef.current = null;\n }\n }\n return newAccess;\n }, [scheduleProactiveRefresh]);\n refreshActiveRef.current = refreshActive;\n\n // Mount-time validation. This is the only 401-handling path that does NOT\n // go through the api-client's `tokenRefresher` hook. Two structural reasons:\n //\n // 1. ApiClientProvider hasn't mounted yet — the protected layout mounts\n // ApiClientProvider as a CHILD of this provider, so at validation time\n // the configured api-client (the one with `tokenRefresher`) doesn't\n // exist yet.\n //\n // 2. Even if it did, having the api-client silently recover would mean\n // this effect would never see the 401. But this effect is what BUILDS\n // the session — it needs to know whether validation succeeded so it\n // can either set `session = { token, user }` or surface the modal.\n //\n // So this effect uses a fresh throwaway api-client (no refresher) and\n // handles 401 manually: try one refresh, retry getMe with the new token,\n // surface the modal only if both fail. The duplication with the api-client's\n // beforeRetry hook is structural — do not try to consolidate them.\n useEffect(() => {\n if (!activeKnowledgeBase) {\n setSession(null);\n setIsLoading(false);\n return;\n }\n\n const stored = getStoredSession(activeKnowledgeBase.id);\n if (!stored) {\n setSession(null);\n setIsLoading(false);\n return;\n }\n\n let cancelled = false;\n\n const validate = async (tokenToUse: string) => {\n const client = new SemiontApiClient({\n baseUrl: baseUrl(kbBackendUrl(activeKnowledgeBase)),\n eventBus: new EventBus(),\n });\n try {\n const data = await client.getMe({ auth: accessToken(tokenToUse) });\n if (cancelled) return;\n setSession({ token: tokenToUse, user: data as UserInfo });\n scheduleProactiveRefresh(tokenToUse);\n } catch (error) {\n if (cancelled) return;\n setSession(null);\n if (error instanceof APIError && error.status === 401) {\n // Try one refresh on 401 from getMe before surfacing the modal\n const refreshed = await performRefresh(activeKnowledgeBase);\n if (cancelled) return;\n if (refreshed) {\n return validate(refreshed);\n }\n clearStoredSession(activeKnowledgeBase.id);\n setSessionExpiredMessage('Your session has expired. Please sign in again.');\n setSessionExpiredAt(Date.now());\n }\n } finally {\n if (!cancelled) setIsLoading(false);\n }\n };\n\n setIsLoading(true);\n\n if (isJwtExpired(stored.access)) {\n (async () => {\n const refreshed = await performRefresh(activeKnowledgeBase);\n if (cancelled) return;\n if (refreshed) {\n await validate(refreshed);\n } else {\n setSession(null);\n clearStoredSession(activeKnowledgeBase.id);\n setIsLoading(false);\n }\n })();\n } else {\n validate(stored.access);\n }\n\n return () => {\n cancelled = true;\n };\n }, [activeKnowledgeBase, scheduleProactiveRefresh]);\n\n // Cancel proactive refresh timer on unmount\n useEffect(() => {\n return () => {\n if (proactiveRefreshTimerRef.current) {\n clearTimeout(proactiveRefreshTimerRef.current);\n proactiveRefreshTimerRef.current = null;\n }\n };\n }, []);\n\n // Cross-tab sync: listen for storage events on the active KB's session key\n useEffect(() => {\n if (!activeKnowledgeBaseId) return;\n const watchKey = sessionKey(activeKnowledgeBaseId);\n const handler = (e: StorageEvent) => {\n if (e.key !== watchKey) return;\n if (!e.newValue) {\n // Token was cleared in another tab\n setSession(null);\n if (proactiveRefreshTimerRef.current) {\n clearTimeout(proactiveRefreshTimerRef.current);\n proactiveRefreshTimerRef.current = null;\n }\n return;\n }\n try {\n const parsed = JSON.parse(e.newValue) as StoredSession;\n if (typeof parsed.access === 'string') {\n // Update our in-memory session token (user info is unchanged)\n setSession(prev => (prev ? { ...prev, token: parsed.access } : prev));\n scheduleProactiveRefresh(parsed.access);\n }\n } catch {\n // Ignore malformed payloads\n }\n };\n window.addEventListener('storage', handler);\n return () => window.removeEventListener('storage', handler);\n }, [activeKnowledgeBaseId, scheduleProactiveRefresh]);\n\n // Register module-scoped notify handlers so the QueryCache 401/403 handlers\n // can reach the active provider instance. Returns a cleanup callback that\n // unregisters the handlers when the active KB id changes or the provider\n // unmounts.\n useEffect(() => {\n return registerAuthNotifyHandlers({\n onSessionExpired: (message) => {\n setSessionExpiredMessage(message ?? 'Your session has expired. Please sign in again.');\n setSessionExpiredAt(Date.now());\n setSession(null);\n if (activeKnowledgeBaseId) {\n clearStoredSession(activeKnowledgeBaseId);\n }\n if (proactiveRefreshTimerRef.current) {\n clearTimeout(proactiveRefreshTimerRef.current);\n proactiveRefreshTimerRef.current = null;\n }\n },\n onPermissionDenied: (message) => {\n setPermissionDeniedMessage(message ?? 'You do not have permission to perform this action.');\n setPermissionDeniedAt(Date.now());\n },\n });\n }, [activeKnowledgeBaseId]);\n\n // Mutations\n const addKnowledgeBase = useCallback((input: NewKnowledgeBase, access: string, refresh: string): KnowledgeBase => {\n const kb: KnowledgeBase = { id: generateKbId(), ...input };\n setStoredSession(kb.id, { access, refresh });\n setKnowledgeBases(prev => [...prev, kb]);\n setActiveKnowledgeBaseId(kb.id);\n return kb;\n }, []);\n\n const removeKnowledgeBase = useCallback((id: string) => {\n clearStoredSession(id);\n setKnowledgeBases(prev => {\n const remaining = prev.filter(kb => kb.id !== id);\n setActiveKnowledgeBaseId(activeId => activeId === id ? (remaining[0]?.id ?? null) : activeId);\n return remaining;\n });\n }, []);\n\n const setActiveKnowledgeBase = useCallback((id: string) => {\n setActiveKnowledgeBaseId(id);\n }, []);\n\n const updateKnowledgeBase = useCallback((id: string, updates: Partial<KnowledgeBase>) => {\n setKnowledgeBases(prev => prev.map(kb => kb.id === id ? { ...kb, ...updates } : kb));\n }, []);\n\n const signIn = useCallback((id: string, access: string, refresh: string) => {\n setStoredSession(id, { access, refresh });\n // Replace the matching KB with a fresh object so the activeKnowledgeBase\n // memo's `find()` returns a new reference, the validation effect re-runs,\n // and the new tokens get used.\n setKnowledgeBases(prev => prev.map(kb => kb.id === id ? { ...kb } : kb));\n setActiveKnowledgeBaseId(id);\n }, []);\n\n const signOut = useCallback((id: string) => {\n clearStoredSession(id);\n setActiveKnowledgeBaseId(activeId => {\n if (activeId === id) {\n setSession(null);\n if (proactiveRefreshTimerRef.current) {\n clearTimeout(proactiveRefreshTimerRef.current);\n proactiveRefreshTimerRef.current = null;\n }\n }\n return activeId;\n });\n // Bump the KB list so consumers reading kbStatus(id) see the change\n setKnowledgeBases(prev => [...prev]);\n }, []);\n\n const acknowledgeSessionExpired = useCallback(() => {\n setSessionExpiredAt(null);\n setSessionExpiredMessage(null);\n }, []);\n\n const acknowledgePermissionDenied = useCallback(() => {\n setPermissionDeniedAt(null);\n setPermissionDeniedMessage(null);\n }, []);\n\n // Tick state forces re-derivation of expiresAt-based fields once a minute,\n // so the session-timer UI updates without each consumer running its own interval.\n const [, setTick] = useState(0);\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), 30_000);\n return () => clearInterval(interval);\n }, []);\n\n // Derived auth fields\n const value = useMemo<KnowledgeBaseSessionValue>(() => {\n const user = session?.user ?? null;\n const token = session?.token ?? null;\n const expiresAt = token ? parseJwtExpiry(token) : null;\n\n return {\n knowledgeBases,\n activeKnowledgeBase,\n session,\n isLoading,\n user,\n token,\n isAuthenticated: !!session,\n hasValidBackendToken: !!token,\n isFullyAuthenticated: !!session,\n displayName: user?.name ?? user?.email?.split('@')[0] ?? 'User',\n avatarUrl: user?.image ?? null,\n userDomain: user?.domain || user?.email?.split('@')[1],\n isAdmin: user?.isAdmin ?? false,\n isModerator: user?.isModerator ?? false,\n expiresAt,\n sessionExpiredAt,\n sessionExpiredMessage,\n permissionDeniedAt,\n permissionDeniedMessage,\n addKnowledgeBase,\n removeKnowledgeBase,\n setActiveKnowledgeBase,\n updateKnowledgeBase,\n signIn,\n signOut,\n refreshActive,\n acknowledgeSessionExpired,\n acknowledgePermissionDenied,\n };\n }, [\n knowledgeBases,\n activeKnowledgeBase,\n session,\n isLoading,\n sessionExpiredAt,\n sessionExpiredMessage,\n permissionDeniedAt,\n permissionDeniedMessage,\n addKnowledgeBase,\n removeKnowledgeBase,\n setActiveKnowledgeBase,\n updateKnowledgeBase,\n signIn,\n signOut,\n refreshActive,\n acknowledgeSessionExpired,\n acknowledgePermissionDenied,\n ]);\n\n return (\n <KnowledgeBaseSessionContext.Provider value={value}>\n {children}\n </KnowledgeBaseSessionContext.Provider>\n );\n}\n\n// ---------- Hook ----------\n\nexport function useKnowledgeBaseSession(): KnowledgeBaseSessionValue {\n const ctx = useContext(KnowledgeBaseSessionContext);\n if (!ctx) {\n throw new Error(\n 'useKnowledgeBaseSession requires KnowledgeBaseSessionProvider. ' +\n 'This component is rendered outside the auth boundary. ' +\n 'Move it into a protected layout.'\n );\n }\n return ctx;\n}\n","/**\n * Refresh-token coordination for the KnowledgeBaseSession provider.\n *\n * Module-scoped state: an in-flight Promise per KB so concurrent 401s for\n * the same KB deduplicate to a single network call. No React, no provider\n * dependency — the React provider calls `performRefresh(kb)` and the\n * api-client's `tokenRefresher` hook indirectly calls it via the provider's\n * `refreshActive` method.\n */\n\nimport { SemiontApiClient } from '@semiont/api-client';\nimport { baseUrl, EventBus, refreshToken as makeRefreshToken } from '@semiont/core';\nimport type { KnowledgeBase } from '../../types/knowledge-base';\nimport { getStoredSession, setStoredSession, kbBackendUrl } from './storage';\n\n/**\n * One in-flight refresh promise per KB. Ensures concurrent 401s for the same\n * KB deduplicate to a single network call.\n */\nconst inFlightRefreshes: Map<string, Promise<string | null>> = new Map();\n\n/**\n * Refresh the active KB's access token. Returns the new access token, or\n * null if no refresh token is available or the refresh failed.\n *\n * IMPORTANT: this constructs a fresh `SemiontApiClient` *without* a\n * `tokenRefresher`. Do not be tempted to reuse the configured client (e.g.\n * via `useApiClient()` from a layout): a refresh-call returning 401 would\n * recursively re-enter the refresher, calling `/api/tokens/refresh` again,\n * in an infinite loop. The throwaway client deliberately has no recovery\n * path — a 401 here propagates as `null` and surfaces the modal upstream.\n *\n * Concurrent calls for the same KB deduplicate via the in-flight Promise\n * Map keyed by `kb.id`, so simultaneous 401s on different requests trigger\n * only one network round-trip to `/api/tokens/refresh`.\n */\nexport async function performRefresh(kb: KnowledgeBase): Promise<string | null> {\n const existing = inFlightRefreshes.get(kb.id);\n if (existing) return existing;\n\n const promise = (async (): Promise<string | null> => {\n const stored = getStoredSession(kb.id);\n if (!stored) return null;\n\n const client = new SemiontApiClient({\n baseUrl: baseUrl(kbBackendUrl(kb)),\n eventBus: new EventBus(),\n });\n\n try {\n const response = await client.refreshToken(makeRefreshToken(stored.refresh));\n const newAccess = response.access_token;\n if (!newAccess) return null;\n setStoredSession(kb.id, { access: newAccess, refresh: stored.refresh });\n return newAccess;\n } catch {\n return null;\n }\n })();\n\n inFlightRefreshes.set(kb.id, promise);\n try {\n return await promise;\n } finally {\n inFlightRefreshes.delete(kb.id);\n }\n}\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './Toast.css';\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=\"semiont-toast-icon\" 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=\"semiont-toast-icon\" 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=\"semiont-toast-icon\" 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=\"semiont-toast-icon\" 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\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=\"semiont-toast\"\n data-variant={toast.type}\n role=\"alert\"\n >\n <div className=\"semiont-toast-icon-wrapper\">{icons[toast.type]}</div>\n <p className=\"semiont-toast-message\">{toast.message}</p>\n <button\n onClick={() => onClose(toast.id)}\n className=\"semiont-toast-close\"\n aria-label=\"Close\"\n >\n <svg className=\"semiont-toast-close-icon\" 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=\"semiont-toast-container\">\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 = React.useCallback((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 = React.useCallback((message: string, duration?: number) => showToast(message, 'success', duration), [showToast]);\n const showError = React.useCallback((message: string, duration?: number) => showToast(message, 'error', duration), [showToast]);\n const showWarning = React.useCallback((message: string, duration?: number) => showToast(message, 'warning', duration), [showToast]);\n const showInfo = React.useCallback((message: string, duration?: number) => showToast(message, 'info', duration), [showToast]);\n\n const handleClose = React.useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const contextValue = React.useMemo(\n () => ({ showToast, showSuccess, showError, showWarning, showInfo }),\n [showToast, showSuccess, showError, showWarning, showInfo]\n );\n\n return (\n <ToastContext.Provider value={contextValue}>\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}","'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 { 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/**\n * Process ICU MessageFormat plural syntax\n * Supports: {count, plural, =0 {text} =1 {text} other {text}}\n */\nfunction processPluralFormat(text: string, params: Record<string, any>): string {\n // Match {paramName, plural, ...} with proper brace counting\n const pluralMatch = text.match(/\\{(\\w+),\\s*plural,\\s*/);\n if (!pluralMatch) {\n return text;\n }\n\n const paramName = pluralMatch[1];\n const count = params[paramName];\n if (count === undefined) {\n return text;\n }\n\n // Find the matching closing brace by counting\n let startPos = pluralMatch[0].length;\n let braceCount = 1; // We're inside the first {\n let endPos = startPos;\n\n for (let i = startPos; i < text.length; i++) {\n if (text[i] === '{') braceCount++;\n else if (text[i] === '}') {\n braceCount--;\n if (braceCount === 0) {\n endPos = i;\n break;\n }\n }\n }\n\n const pluralCases = text.substring(startPos, endPos);\n\n // Parse plural cases: =0 {text} =1 {text} other {text}\n const cases: Record<string, string> = {};\n const caseRegex = /(?:=(\\d+)|(\\w+))\\s*\\{([^}]+)\\}/g;\n let caseMatch;\n\n while ((caseMatch = caseRegex.exec(pluralCases)) !== null) {\n const [, exactNumber, keyword, textContent] = caseMatch;\n const key = exactNumber !== undefined ? `=${exactNumber}` : keyword;\n cases[key] = textContent;\n }\n\n // Select appropriate case\n const exactMatch = cases[`=${count}`];\n if (exactMatch !== undefined) {\n const result = exactMatch.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + result + text.substring(endPos + 1);\n }\n\n const otherCase = cases['other'];\n if (otherCase !== undefined) {\n const result = otherCase.replace(/#/g, String(count));\n return text.substring(0, pluralMatch.index!) + result + text.substring(endPos + 1);\n }\n\n return text;\n}\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 and plural format\n if (params && typeof translation === 'string') {\n let result = translation;\n // First process plural format\n result = processPluralFormat(result, params);\n // Then handle simple parameter interpolation\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 and plural format\n if (params && typeof translation === 'string') {\n let result = translation;\n // First process plural format\n result = processPluralFormat(result, params);\n // Then handle simple parameter interpolation\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 and plural format\n if (params && typeof translation === 'string') {\n let result = translation;\n // First process plural format\n result = processPluralFormat(result, params);\n // Then handle simple parameter interpolation\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}"],"mappings":";;;;;;;;;AAqBA,IAAM,iBAAiB;AAChB,IAAM,cAAc;AACpB,IAAM,aAAa;AAGnB,IAAM,wBAAwB,IAAI,KAAK;AAQvC,SAAS,WAAW,MAAsB;AAC/C,SAAO,GAAG,cAAc,GAAG,IAAI;AACjC;AAIO,SAAS,iBAAiB,MAAoC;AACnE,QAAM,MAAM,aAAa,QAAQ,WAAW,IAAI,CAAC;AACjD,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,YAAY,UAAU;AACrF,aAAO,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ;AAAA,IAC1D;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,MAAc,SAA8B;AAC3E,eAAa,QAAQ,WAAW,IAAI,GAAG,KAAK,UAAU,OAAO,CAAC;AAChE;AAEO,SAAS,mBAAmB,MAAoB;AACrD,eAAa,WAAW,WAAW,IAAI,CAAC;AAC1C;AAIO,SAAS,eAAe,OAA4B;AACzD,MAAI;AACF,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,WAAW,KAAK,CAAC,MAAM,CAAC,EAAG,QAAO;AAC5C,UAAM,UAAU,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;AACzC,QAAI,CAAC,QAAQ,IAAK,QAAO;AACzB,WAAO,IAAI,KAAK,QAAQ,MAAM,GAAI;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,OAAwB;AACnD,QAAM,SAAS,eAAe,KAAK;AACnC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,QAAQ,IAAI,KAAK,IAAI;AACrC;AAIA,SAAS,mBAAmB,OAA2B;AACrD,MAAI,MAAM,SAAS,OAAW,QAAO;AAErC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM,UAAU;AACpC,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,OAAO,MAAM;AAAA,MACb,MAAM,IAAI;AAAA,MACV,MAAM,SAAS,IAAI,MAAM,EAAE,MAAM,IAAI,aAAa,WAAW,MAAM;AAAA,MACnE,UAAU,IAAI,aAAa,WAAW,UAAU;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,OAAO,MAAM,SAAS;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,qBAAsC;AACpD,MAAI;AACF,UAAM,MAAM,aAAa,QAAQ,WAAW;AAC5C,QAAI,CAAC,IAAK,QAAO,CAAC;AAClB,UAAM,UAAU,KAAK,MAAM,GAAG;AAC9B,WAAO,QAAQ,IAAI,kBAAkB;AAAA,EACvC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,mBAAmB,gBAAuC;AACxE,eAAa,QAAQ,aAAa,KAAK,UAAU,cAAc,CAAC;AAClE;AAIO,SAAS,gBAAgB,MAAgC;AAC9D,SAAO,SAAS,eAAe,SAAS,cAAc,SAAS;AACjE;AAEO,SAAS,aAAa,IAA2B;AACtD,SAAO,GAAG,GAAG,QAAQ,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI;AAC/C;AAOO,SAAS,mBAAmB,MAA+B;AAChE,QAAM,SAAS,iBAAiB,IAAI;AACpC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,aAAa,OAAO,MAAM,IAAI,YAAY;AACnD;AAEO,SAAS,eAAuB;AACrC,SAAO,OAAO,WAAW;AAC3B;;;AChIA,IAAI,yBAAwC;AAC5C,IAAI,2BAA0C;AAEvC,SAAS,qBAAqB,SAAwB;AAC3D,2BAAyB,OAAO;AAClC;AAEO,SAAS,uBAAuB,SAAwB;AAC7D,6BAA2B,OAAO;AACpC;AAaO,SAAS,2BAA2B,UAG5B;AACb,2BAAyB,SAAS;AAClC,6BAA2B,SAAS;AACpC,SAAO,MAAM;AACX,6BAAyB;AACzB,+BAA2B;AAAA,EAC7B;AACF;;;ACnBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAAA,mBAAkB,gBAAgB;AAC3C,SAAS,WAAAC,UAAS,YAAAC,WAAU,mBAAmB;;;AChC/C,SAAS,wBAAwB;AACjC,SAAS,SAAS,UAAU,gBAAgB,wBAAwB;AAQpE,IAAM,oBAAyD,oBAAI,IAAI;AAiBvE,eAAsB,eAAe,IAA2C;AAC9E,QAAM,WAAW,kBAAkB,IAAI,GAAG,EAAE;AAC5C,MAAI,SAAU,QAAO;AAErB,QAAM,WAAW,YAAoC;AACnD,UAAM,SAAS,iBAAiB,GAAG,EAAE;AACrC,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,SAAS,IAAI,iBAAiB;AAAA,MAClC,SAAS,QAAQ,aAAa,EAAE,CAAC;AAAA,MACjC,UAAU,IAAI,SAAS;AAAA,IACzB,CAAC;AAED,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,aAAa,iBAAiB,OAAO,OAAO,CAAC;AAC3E,YAAM,YAAY,SAAS;AAC3B,UAAI,CAAC,UAAW,QAAO;AACvB,uBAAiB,GAAG,IAAI,EAAE,QAAQ,WAAW,SAAS,OAAO,QAAQ,CAAC;AACtE,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AAEH,oBAAkB,IAAI,GAAG,IAAI,OAAO;AACpC,MAAI;AACF,WAAO,MAAM;AAAA,EACf,UAAE;AACA,sBAAkB,OAAO,GAAG,EAAE;AAAA,EAChC;AACF;;;AD6cI;AA9XG,IAAM,8BAA8B,cAAqD,MAAS;AAMlG,SAAS,6BAA6B,EAAE,SAAS,GAAkC;AAExF,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA0B,MAAM,mBAAmB,CAAC;AAChG,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAwB,MAAM;AACtF,UAAM,QAAQ,aAAa,QAAQ,UAAU;AAC7C,UAAM,SAAS,mBAAmB;AAClC,QAAI,SAAS,OAAO,KAAK,QAAM,GAAG,OAAO,KAAK,EAAG,QAAO;AACxD,WAAO,OAAO,CAAC,GAAG,MAAM;AAAA,EAC1B,CAAC;AAGD,QAAM,CAAC,SAAS,UAAU,IAAI,SAA6B,IAAI;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,MAAM;AACxD,UAAM,KAAK;AACX,QAAI,CAAC,GAAI,QAAO;AAChB,UAAM,SAAS,iBAAiB,EAAE;AAClC,QAAI,CAAC,OAAQ,QAAO;AAEpB,WAAO,CAAC,aAAa,OAAO,MAAM,KAAK,OAAO,WAAW;AAAA,EAC3D,CAAC;AAGD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAwB,IAAI;AAC5E,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAAwB,IAAI;AACtF,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAwB,IAAI;AAChF,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,SAAwB,IAAI;AAG1F,YAAU,MAAM;AACd,uBAAmB,cAAc;AAAA,EACnC,GAAG,CAAC,cAAc,CAAC;AAEnB,YAAU,MAAM;AACd,QAAI,uBAAuB;AACzB,mBAAa,QAAQ,YAAY,qBAAqB;AAAA,IACxD,OAAO;AACL,mBAAa,WAAW,UAAU;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,qBAAqB,CAAC;AAE1B,QAAM,sBAAsB;AAAA,IAC1B,MAAM,eAAe,KAAK,QAAM,GAAG,OAAO,qBAAqB,KAAK;AAAA,IACpE,CAAC,gBAAgB,qBAAqB;AAAA,EACxC;AAGA,QAAM,cAAc,OAA6B,mBAAmB;AACpE,YAAU,MAAM;AACd,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,mBAAmB,CAAC;AAExB,QAAM,2BAA2B,OAA6C,IAAI;AAMlF,QAAM,2BAA2B,YAAY,CAAC,mBAA2B;AACvE,QAAI,yBAAyB,SAAS;AACpC,mBAAa,yBAAyB,OAAO;AAC7C,+BAAyB,UAAU;AAAA,IACrC;AACA,UAAM,YAAY,eAAe,cAAc;AAC/C,QAAI,CAAC,UAAW;AAChB,UAAM,YAAY,UAAU,QAAQ,IAAI;AACxC,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC;AAChD,6BAAyB,UAAU,WAAW,MAAM;AAClD,+BAAyB,UAAU;AAEnC,uBAAiB,UAAU;AAAA,IAC7B,GAAG,KAAK;AAAA,EACV,GAAG,CAAC,CAAC;AAKL,QAAM,mBAAmB,OAA8C,IAAI;AAC3E,QAAM,gBAAgB,YAAY,YAAoC;AACpE,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,GAAI,QAAO;AAChB,UAAM,YAAY,MAAM,eAAe,EAAE;AACzC,QAAI,WAAW;AAEb,iBAAW,UAAS,OAAO,EAAE,GAAG,MAAM,OAAO,UAAU,IAAI,IAAK;AAChE,+BAAyB,SAAS;AAAA,IACpC,OAAO;AAEL,iBAAW,IAAI;AACf,yBAAmB,GAAG,EAAE;AACxB,+BAAyB,iDAAiD;AAC1E,0BAAoB,KAAK,IAAI,CAAC;AAC9B,UAAI,yBAAyB,SAAS;AACpC,qBAAa,yBAAyB,OAAO;AAC7C,iCAAyB,UAAU;AAAA,MACrC;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,wBAAwB,CAAC;AAC7B,mBAAiB,UAAU;AAmB3B,YAAU,MAAM;AACd,QAAI,CAAC,qBAAqB;AACxB,iBAAW,IAAI;AACf,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,UAAM,SAAS,iBAAiB,oBAAoB,EAAE;AACtD,QAAI,CAAC,QAAQ;AACX,iBAAW,IAAI;AACf,mBAAa,KAAK;AAClB;AAAA,IACF;AAEA,QAAI,YAAY;AAEhB,UAAM,WAAW,OAAO,eAAuB;AAC7C,YAAM,SAAS,IAAIC,kBAAiB;AAAA,QAClC,SAASC,SAAQ,aAAa,mBAAmB,CAAC;AAAA,QAClD,UAAU,IAAIC,UAAS;AAAA,MACzB,CAAC;AACD,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,MAAM,EAAE,MAAM,YAAY,UAAU,EAAE,CAAC;AACjE,YAAI,UAAW;AACf,mBAAW,EAAE,OAAO,YAAY,MAAM,KAAiB,CAAC;AACxD,iCAAyB,UAAU;AAAA,MACrC,SAAS,OAAO;AACd,YAAI,UAAW;AACf,mBAAW,IAAI;AACf,YAAI,iBAAiB,YAAY,MAAM,WAAW,KAAK;AAErD,gBAAM,YAAY,MAAM,eAAe,mBAAmB;AAC1D,cAAI,UAAW;AACf,cAAI,WAAW;AACb,mBAAO,SAAS,SAAS;AAAA,UAC3B;AACA,6BAAmB,oBAAoB,EAAE;AACzC,mCAAyB,iDAAiD;AAC1E,8BAAoB,KAAK,IAAI,CAAC;AAAA,QAChC;AAAA,MACF,UAAE;AACA,YAAI,CAAC,UAAW,cAAa,KAAK;AAAA,MACpC;AAAA,IACF;AAEA,iBAAa,IAAI;AAEjB,QAAI,aAAa,OAAO,MAAM,GAAG;AAC/B,OAAC,YAAY;AACX,cAAM,YAAY,MAAM,eAAe,mBAAmB;AAC1D,YAAI,UAAW;AACf,YAAI,WAAW;AACb,gBAAM,SAAS,SAAS;AAAA,QAC1B,OAAO;AACL,qBAAW,IAAI;AACf,6BAAmB,oBAAoB,EAAE;AACzC,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF,GAAG;AAAA,IACL,OAAO;AACL,eAAS,OAAO,MAAM;AAAA,IACxB;AAEA,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,qBAAqB,wBAAwB,CAAC;AAGlD,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,yBAAyB,SAAS;AACpC,qBAAa,yBAAyB,OAAO;AAC7C,iCAAyB,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,QAAI,CAAC,sBAAuB;AAC5B,UAAM,WAAW,WAAW,qBAAqB;AACjD,UAAM,UAAU,CAAC,MAAoB;AACnC,UAAI,EAAE,QAAQ,SAAU;AACxB,UAAI,CAAC,EAAE,UAAU;AAEf,mBAAW,IAAI;AACf,YAAI,yBAAyB,SAAS;AACpC,uBAAa,yBAAyB,OAAO;AAC7C,mCAAyB,UAAU;AAAA,QACrC;AACA;AAAA,MACF;AACA,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,EAAE,QAAQ;AACpC,YAAI,OAAO,OAAO,WAAW,UAAU;AAErC,qBAAW,UAAS,OAAO,EAAE,GAAG,MAAM,OAAO,OAAO,OAAO,IAAI,IAAK;AACpE,mCAAyB,OAAO,MAAM;AAAA,QACxC;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,uBAAuB,wBAAwB,CAAC;AAMpD,YAAU,MAAM;AACd,WAAO,2BAA2B;AAAA,MAChC,kBAAkB,CAAC,YAAY;AAC7B,iCAAyB,WAAW,iDAAiD;AACrF,4BAAoB,KAAK,IAAI,CAAC;AAC9B,mBAAW,IAAI;AACf,YAAI,uBAAuB;AACzB,6BAAmB,qBAAqB;AAAA,QAC1C;AACA,YAAI,yBAAyB,SAAS;AACpC,uBAAa,yBAAyB,OAAO;AAC7C,mCAAyB,UAAU;AAAA,QACrC;AAAA,MACF;AAAA,MACA,oBAAoB,CAAC,YAAY;AAC/B,mCAA2B,WAAW,oDAAoD;AAC1F,8BAAsB,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,qBAAqB,CAAC;AAG1B,QAAM,mBAAmB,YAAY,CAAC,OAAyB,QAAgB,YAAmC;AAChH,UAAM,KAAoB,EAAE,IAAI,aAAa,GAAG,GAAG,MAAM;AACzD,qBAAiB,GAAG,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAC3C,sBAAkB,UAAQ,CAAC,GAAG,MAAM,EAAE,CAAC;AACvC,6BAAyB,GAAG,EAAE;AAC9B,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,YAAY,CAAC,OAAe;AACtD,uBAAmB,EAAE;AACrB,sBAAkB,UAAQ;AACxB,YAAM,YAAY,KAAK,OAAO,QAAM,GAAG,OAAO,EAAE;AAChD,+BAAyB,cAAY,aAAa,KAAM,UAAU,CAAC,GAAG,MAAM,OAAQ,QAAQ;AAC5F,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyB,YAAY,CAAC,OAAe;AACzD,6BAAyB,EAAE;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,YAAY,CAAC,IAAY,YAAoC;AACvF,sBAAkB,UAAQ,KAAK,IAAI,QAAM,GAAG,OAAO,KAAK,EAAE,GAAG,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAC;AAAA,EACrF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,CAAC,IAAY,QAAgB,YAAoB;AAC1E,qBAAiB,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAIxC,sBAAkB,UAAQ,KAAK,IAAI,QAAM,GAAG,OAAO,KAAK,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC;AACvE,6BAAyB,EAAE;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,CAAC,OAAe;AAC1C,uBAAmB,EAAE;AACrB,6BAAyB,cAAY;AACnC,UAAI,aAAa,IAAI;AACnB,mBAAW,IAAI;AACf,YAAI,yBAAyB,SAAS;AACpC,uBAAa,yBAAyB,OAAO;AAC7C,mCAAyB,UAAU;AAAA,QACrC;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAED,sBAAkB,UAAQ,CAAC,GAAG,IAAI,CAAC;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,4BAA4B,YAAY,MAAM;AAClD,wBAAoB,IAAI;AACxB,6BAAyB,IAAI;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA8B,YAAY,MAAM;AACpD,0BAAsB,IAAI;AAC1B,+BAA2B,IAAI;AAAA,EACjC,GAAG,CAAC,CAAC;AAIL,QAAM,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC;AAC9B,YAAU,MAAM;AACd,UAAM,WAAW,YAAY,MAAM,QAAQ,OAAK,IAAI,CAAC,GAAG,GAAM;AAC9D,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,CAAC;AAGL,QAAM,QAAQ,QAAmC,MAAM;AACrD,UAAM,OAAO,SAAS,QAAQ;AAC9B,UAAM,QAAQ,SAAS,SAAS;AAChC,UAAM,YAAY,QAAQ,eAAe,KAAK,IAAI;AAElD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,CAAC,CAAC;AAAA,MACnB,sBAAsB,CAAC,CAAC;AAAA,MACxB,sBAAsB,CAAC,CAAC;AAAA,MACxB,aAAa,MAAM,QAAQ,MAAM,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,MACzD,WAAW,MAAM,SAAS;AAAA,MAC1B,YAAY,MAAM,UAAU,MAAM,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA,MACrD,SAAS,MAAM,WAAW;AAAA,MAC1B,aAAa,MAAM,eAAe;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE,oBAAC,4BAA4B,UAA5B,EAAqC,OACnC,UACH;AAEJ;AAIO,SAAS,0BAAqD;AACnE,QAAM,MAAM,WAAW,2BAA2B;AAClD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,SAAO;AACT;;;AE/hBA,OAAOC,UAAS,aAAAC,YAAW,YAAAC,iBAAgB;AAC3C,SAAS,oBAAoB;AAoBvB,gBAAAC,MA8BF,YA9BE;AAHN,IAAM,QAAQ;AAAA,EACZ,SACE,gBAAAA,KAAC,SAAI,WAAU,sBAAqB,MAAK,QAAO,QAAO,gBAAe,SAAQ,aAC5E,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,kBAAiB,GACxF;AAAA,EAEF,OACE,gBAAAA,KAAC,SAAI,WAAU,sBAAqB,MAAK,QAAO,QAAO,gBAAe,SAAQ,aAC5E,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wBAAuB,GAC9F;AAAA,EAEF,SACE,gBAAAA,KAAC,SAAI,WAAU,sBAAqB,MAAK,QAAO,QAAO,gBAAe,SAAQ,aAC5E,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,wIAAuI,GAC9M;AAAA,EAEF,MACE,gBAAAA,KAAC,SAAI,WAAU,sBAAqB,MAAK,QAAO,QAAO,gBAAe,SAAQ,aAC5E,0BAAAA,KAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,aAAa,GAAG,GAAE,6DAA4D,GACnI;AAEJ;AAEA,SAAS,MAAM,EAAE,OAAO,QAAQ,GAAe;AAC7C,EAAAC,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,WAAU;AAAA,MACV,gBAAc,MAAM;AAAA,MACpB,MAAK;AAAA,MAEL;AAAA,wBAAAD,KAAC,SAAI,WAAU,8BAA8B,gBAAM,MAAM,IAAI,GAAE;AAAA,QAC/D,gBAAAA,KAAC,OAAE,WAAU,yBAAyB,gBAAM,SAAQ;AAAA,QACpD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,QAAQ,MAAM,EAAE;AAAA,YAC/B,WAAU;AAAA,YACV,cAAW;AAAA,YAEX,0BAAAA,KAAC,SAAI,WAAU,4BAA2B,MAAK,QAAO,QAAO,gBAAe,SAAQ,aAClF,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,IAAIE,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,gBAAAD,KAAC,SAAI,WAAU,2BACZ,iBAAO,IAAI,CAAC,UACX,gBAAAA,KAAC,SAAqB,OAAc,WAAxB,MAAM,EAAoC,CACvD,GACH;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAWA,IAAM,eAAeG,OAAM,cAA4C,MAAS;AAEzE,SAAS,cAAc,EAAE,SAAS,GAAkC;AACzE,QAAM,CAAC,QAAQ,SAAS,IAAID,UAAyB,CAAC,CAAC;AAEvD,QAAM,YAAYC,OAAM,YAAY,CAAC,SAAiB,OAAkB,QAAQ,aAAsB;AACpG,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,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,OAAM,YAAY,CAAC,SAAiB,aAAsB,UAAU,SAAS,WAAW,QAAQ,GAAG,CAAC,SAAS,CAAC;AAClI,QAAM,YAAYA,OAAM,YAAY,CAAC,SAAiB,aAAsB,UAAU,SAAS,SAAS,QAAQ,GAAG,CAAC,SAAS,CAAC;AAC9H,QAAM,cAAcA,OAAM,YAAY,CAAC,SAAiB,aAAsB,UAAU,SAAS,WAAW,QAAQ,GAAG,CAAC,SAAS,CAAC;AAClI,QAAM,WAAWA,OAAM,YAAY,CAAC,SAAiB,aAAsB,UAAU,SAAS,QAAQ,QAAQ,GAAG,CAAC,SAAS,CAAC;AAE5H,QAAM,cAAcA,OAAM,YAAY,CAAC,OAAe;AACpD,cAAU,CAAC,SAAS,KAAK,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,EAC7D,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,OAAM;AAAA,IACzB,OAAO,EAAE,WAAW,aAAa,WAAW,aAAa,SAAS;AAAA,IAClE,CAAC,WAAW,aAAa,WAAW,aAAa,QAAQ;AAAA,EAC3D;AAEA,SACE,qBAAC,aAAa,UAAb,EAAsB,OAAO,cAC3B;AAAA;AAAA,IACD,gBAAAH,KAAC,kBAAe,QAAgB,SAAS,aAAa;AAAA,KACxD;AAEJ;AAEO,SAAS,WAAW;AACzB,QAAM,UAAUG,OAAM,WAAW,YAAY;AAC7C,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO;AACT;;;AClJA,SAAgB,iBAAAC,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,SAAS,iBAAAE,gBAAe,cAAAC,aAAuB,YAAAC,WAAU,aAAAC,YAAW,WAAAC,gBAAe;AAwP7E,SAQK,UARL,OAAAC,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAlPN,IAAM,qBAAqBC,eAAyC,IAAI;AAGxE,IAAM,mBAAmB,oBAAI,IAAiB;AAM9C,SAAS,oBAAoB,MAAc,QAAqC;AAE9E,QAAM,cAAc,KAAK,MAAM,uBAAuB;AACtD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,YAAY,CAAC;AAC/B,QAAM,QAAQ,OAAO,SAAS;AAC9B,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,YAAY,CAAC,EAAE;AAC9B,MAAI,aAAa;AACjB,MAAI,SAAS;AAEb,WAAS,IAAI,UAAU,IAAI,KAAK,QAAQ,KAAK;AAC3C,QAAI,KAAK,CAAC,MAAM,IAAK;AAAA,aACZ,KAAK,CAAC,MAAM,KAAK;AACxB;AACA,UAAI,eAAe,GAAG;AACpB,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,UAAU,UAAU,MAAM;AAGnD,QAAM,QAAgC,CAAC;AACvC,QAAM,YAAY;AAClB,MAAI;AAEJ,UAAQ,YAAY,UAAU,KAAK,WAAW,OAAO,MAAM;AACzD,UAAM,CAAC,EAAE,aAAa,SAAS,WAAW,IAAI;AAC9C,UAAM,MAAM,gBAAgB,SAAY,IAAI,WAAW,KAAK;AAC5D,UAAM,GAAG,IAAI;AAAA,EACf;AAGA,QAAM,aAAa,MAAM,IAAI,KAAK,EAAE;AACpC,MAAI,eAAe,QAAW;AAC5B,UAAM,SAAS,WAAW,QAAQ,MAAM,OAAO,KAAK,CAAC;AACrD,WAAO,KAAK,UAAU,GAAG,YAAY,KAAM,IAAI,SAAS,KAAK,UAAU,SAAS,CAAC;AAAA,EACnF;AAEA,QAAM,YAAY,MAAM,OAAO;AAC/B,MAAI,cAAc,QAAW;AAC3B,UAAM,SAAS,UAAU,QAAQ,MAAM,OAAO,KAAK,CAAC;AACpD,WAAO,KAAK,UAAU,GAAG,YAAY,KAAM,IAAI,SAAS,KAAK,UAAU,SAAS,CAAC;AAAA,EACnF;AAEA,SAAO;AACT;AAGO,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;AAEb,eAAS,oBAAoB,QAAQ,MAAM;AAE3C,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACzD,iBAAS,OAAO,QAAQ,IAAI,OAAO,SAAS,QAAQ,UAAU,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,MACxF,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,IAAIC,UAAc,IAAI;AACtE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAGhD,EAAAC,WAAU,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,gBAAgBC,SAAmC,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;AAEb,mBAAS,oBAAoB,QAAQ,MAAM;AAE3C,iBAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACzD,qBAAS,OAAO,QAAQ,IAAI,OAAO,SAAS,QAAQ,UAAU,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,UACxF,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;AAEb,iBAAS,oBAAoB,QAAQ,MAAM;AAE3C,eAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACzD,mBAAS,OAAO,QAAQ,IAAI,OAAO,SAAS,QAAQ,UAAU,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,QACxF,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;","names":["SemiontApiClient","baseUrl","EventBus","SemiontApiClient","baseUrl","EventBus","React","useEffect","useState","jsx","useEffect","useState","React","createContext","useContext","jsx","createContext","useContext","useState","useEffect","useMemo","jsx","createContext","useState","useEffect","useMemo","jsx","useContext"]}
|
|
@@ -18,6 +18,7 @@ var ResourceInfoPanel = {
|
|
|
18
18
|
representation: "Representation",
|
|
19
19
|
mediaType: "Media Type",
|
|
20
20
|
byteSize: "Size",
|
|
21
|
+
storageUri: "Storage",
|
|
21
22
|
clone: "Clone",
|
|
22
23
|
cloneDescription: "Generate a shareable clone link for this resource",
|
|
23
24
|
archive: "Archive",
|
|
@@ -75,6 +76,7 @@ var AnnotationHistory = {
|
|
|
75
76
|
annotationRemoved: "Annotation Removed",
|
|
76
77
|
annotationBodyUpdated: "Annotation Updated",
|
|
77
78
|
jobEvent: "Job Event",
|
|
79
|
+
embeddingComputed: "Embedding Computed",
|
|
78
80
|
justNow: "just now",
|
|
79
81
|
minutesAgo: "{{count}}m ago",
|
|
80
82
|
hoursAgo: "{{count}}h ago",
|
|
@@ -418,4 +420,4 @@ export {
|
|
|
418
420
|
ReferenceWizard,
|
|
419
421
|
en_default
|
|
420
422
|
};
|
|
421
|
-
//# sourceMappingURL=chunk-
|
|
423
|
+
//# sourceMappingURL=chunk-NOD3NCXE.mjs.map
|