@semiont/react-ui 0.4.2 → 0.4.4

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.
Files changed (163) hide show
  1. package/dist/{PdfAnnotationCanvas.client-PVTVPDBQ.mjs → PdfAnnotationCanvas.client-LF6DDTCV.mjs} +3 -3
  2. package/dist/{ar-5REA6P4J.mjs → ar-RJLR7NDD.mjs} +13 -11
  3. package/dist/ar-RJLR7NDD.mjs.map +1 -0
  4. package/dist/{bn-YHRYHHPD.mjs → bn-4NU2UAZ7.mjs} +13 -11
  5. package/dist/bn-4NU2UAZ7.mjs.map +1 -0
  6. package/dist/{chunk-VVCCMJS7.mjs → chunk-2VWLGQIO.mjs} +13 -11
  7. package/dist/chunk-2VWLGQIO.mjs.map +1 -0
  8. package/dist/chunk-5JZFKRLW.mjs +62 -0
  9. package/dist/chunk-5JZFKRLW.mjs.map +1 -0
  10. package/dist/{chunk-PFQYNPQJ.mjs → chunk-EKQMINCV.mjs} +61 -92
  11. package/dist/chunk-EKQMINCV.mjs.map +1 -0
  12. package/dist/{chunk-ZPV43WN2.mjs → chunk-XMCUHQ2Y.mjs} +72 -3
  13. package/dist/chunk-XMCUHQ2Y.mjs.map +1 -0
  14. package/dist/{cs-JTJXTX2T.mjs → cs-6UJZFF55.mjs} +13 -11
  15. package/dist/cs-6UJZFF55.mjs.map +1 -0
  16. package/dist/{da-MK37SJB6.mjs → da-CFFBBOH3.mjs} +13 -11
  17. package/dist/da-CFFBBOH3.mjs.map +1 -0
  18. package/dist/{de-LGBCWERA.mjs → de-2KAG6KMX.mjs} +13 -11
  19. package/dist/de-2KAG6KMX.mjs.map +1 -0
  20. package/dist/{el-FKJMFCWY.mjs → el-KVPQ7VNF.mjs} +13 -11
  21. package/dist/el-KVPQ7VNF.mjs.map +1 -0
  22. package/dist/{en-AOSMPC2M.mjs → en-ZW4UKTVX.mjs} +2 -2
  23. package/dist/{es-LVDPIXWU.mjs → es-ZU2ECPVG.mjs} +13 -11
  24. package/dist/es-ZU2ECPVG.mjs.map +1 -0
  25. package/dist/{fa-3VA2PIUD.mjs → fa-CBIVKDIQ.mjs} +13 -11
  26. package/dist/fa-CBIVKDIQ.mjs.map +1 -0
  27. package/dist/{fi-3WM75ZLR.mjs → fi-5HUVT7IK.mjs} +13 -11
  28. package/dist/fi-5HUVT7IK.mjs.map +1 -0
  29. package/dist/{fr-NK4A72WA.mjs → fr-O5WU2US2.mjs} +13 -11
  30. package/dist/fr-O5WU2US2.mjs.map +1 -0
  31. package/dist/{he-IACZDZMB.mjs → he-WP4C2SNJ.mjs} +13 -11
  32. package/dist/he-WP4C2SNJ.mjs.map +1 -0
  33. package/dist/{hi-JZ7MGMMS.mjs → hi-HLQXNRWI.mjs} +13 -11
  34. package/dist/hi-HLQXNRWI.mjs.map +1 -0
  35. package/dist/{id-P3KDQGNK.mjs → id-DTJT2ZA6.mjs} +13 -11
  36. package/dist/id-DTJT2ZA6.mjs.map +1 -0
  37. package/dist/index.css +213 -0
  38. package/dist/index.css.map +1 -1
  39. package/dist/index.d.mts +48 -50
  40. package/dist/index.mjs +1492 -1474
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/{it-LQS33SUY.mjs → it-2DK57IMT.mjs} +13 -11
  43. package/dist/it-2DK57IMT.mjs.map +1 -0
  44. package/dist/{ja-G4FKZPWD.mjs → ja-52ZNY72Y.mjs} +13 -11
  45. package/dist/ja-52ZNY72Y.mjs.map +1 -0
  46. package/dist/{ko-2XWKQ7BA.mjs → ko-4Z2IMYZO.mjs} +13 -11
  47. package/dist/ko-4Z2IMYZO.mjs.map +1 -0
  48. package/dist/{ms-2SNONIUD.mjs → ms-HKU73KEX.mjs} +13 -11
  49. package/dist/ms-HKU73KEX.mjs.map +1 -0
  50. package/dist/{nl-BMZUAJ7J.mjs → nl-HPHQMXPT.mjs} +13 -11
  51. package/dist/nl-HPHQMXPT.mjs.map +1 -0
  52. package/dist/{no-6J3WIZ6L.mjs → no-Q7G4PVFT.mjs} +13 -11
  53. package/dist/no-Q7G4PVFT.mjs.map +1 -0
  54. package/dist/{pl-QQ7DAUVK.mjs → pl-D43C2CE3.mjs} +13 -11
  55. package/dist/pl-D43C2CE3.mjs.map +1 -0
  56. package/dist/{pt-MU3GN7MW.mjs → pt-V3GFSY7B.mjs} +13 -11
  57. package/dist/pt-V3GFSY7B.mjs.map +1 -0
  58. package/dist/{ro-6GBE72QK.mjs → ro-3UIRV3OA.mjs} +13 -11
  59. package/dist/ro-3UIRV3OA.mjs.map +1 -0
  60. package/dist/{sv-NQIL7PEM.mjs → sv-BMW26A7M.mjs} +13 -11
  61. package/dist/sv-BMW26A7M.mjs.map +1 -0
  62. package/dist/test-utils.mjs +4 -4
  63. package/dist/{th-6OCNZQBE.mjs → th-CMND2QET.mjs} +13 -11
  64. package/dist/th-CMND2QET.mjs.map +1 -0
  65. package/dist/{tr-XWJ5P3SC.mjs → tr-P3AD7MYA.mjs} +13 -11
  66. package/dist/tr-P3AD7MYA.mjs.map +1 -0
  67. package/dist/{uk-AKSN6DGW.mjs → uk-QPONRQ5O.mjs} +13 -11
  68. package/dist/uk-QPONRQ5O.mjs.map +1 -0
  69. package/dist/{vi-23GHQ45M.mjs → vi-G2OMVMCI.mjs} +13 -11
  70. package/dist/vi-G2OMVMCI.mjs.map +1 -0
  71. package/dist/{zh-ITT4QBSN.mjs → zh-HTDN4LKE.mjs} +13 -11
  72. package/dist/zh-HTDN4LKE.mjs.map +1 -0
  73. package/package.json +3 -5
  74. package/src/components/CodeMirrorRenderer.tsx +9 -9
  75. package/src/components/ResourceTagsInline.tsx +1 -1
  76. package/src/components/__tests__/ResourceTagsInline.test.tsx +3 -3
  77. package/src/components/modals/ContextSummary.tsx +56 -165
  78. package/src/components/modals/GatherContextStep.tsx +124 -42
  79. package/src/components/modals/ReferenceWizardModal.tsx +8 -25
  80. package/src/components/modals/SearchModal.css +241 -0
  81. package/src/components/resource/AnnotateView.tsx +3 -3
  82. package/src/components/resource/BrowseView.tsx +2 -2
  83. package/src/components/resource/ResourceViewer.tsx +4 -4
  84. package/src/components/resource/__tests__/annotation-interactions.test.tsx +1 -1
  85. package/src/components/resource/panels/AssessmentPanel.tsx +3 -0
  86. package/src/components/resource/panels/AssistSection.tsx +4 -1
  87. package/src/components/resource/panels/CommentsPanel.tsx +3 -0
  88. package/src/components/resource/panels/ResourceInfoPanel.tsx +82 -0
  89. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +4 -0
  90. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +94 -0
  91. package/src/features/resource-viewer/__tests__/AnnotationCreationPending.test.tsx +6 -6
  92. package/src/features/resource-viewer/__tests__/AnnotationProgressDismissal.test.tsx +4 -4
  93. package/src/features/resource-viewer/__tests__/BindFlowIntegration.test.tsx +23 -17
  94. package/src/features/resource-viewer/__tests__/DetectionFlowBug.test.tsx +4 -4
  95. package/src/features/resource-viewer/__tests__/DetectionFlowIntegration.test.tsx +14 -14
  96. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +2 -2
  97. package/src/features/resource-viewer/__tests__/YieldFlowIntegration.test.tsx +2 -2
  98. package/src/features/resource-viewer/__tests__/annotation-progress-flow.test.tsx +4 -4
  99. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +12 -10
  100. package/translations/ar.json +12 -10
  101. package/translations/bn.json +12 -10
  102. package/translations/cs.json +12 -10
  103. package/translations/da.json +12 -10
  104. package/translations/de.json +12 -10
  105. package/translations/el.json +12 -10
  106. package/translations/en.json +13 -11
  107. package/translations/es.json +12 -10
  108. package/translations/fa.json +12 -10
  109. package/translations/fi.json +12 -10
  110. package/translations/fr.json +12 -10
  111. package/translations/he.json +12 -10
  112. package/translations/hi.json +12 -10
  113. package/translations/id.json +12 -10
  114. package/translations/it.json +12 -10
  115. package/translations/ja.json +12 -10
  116. package/translations/ko.json +12 -10
  117. package/translations/ms.json +12 -10
  118. package/translations/nl.json +12 -10
  119. package/translations/no.json +12 -10
  120. package/translations/pl.json +12 -10
  121. package/translations/pt.json +12 -10
  122. package/translations/ro.json +12 -10
  123. package/translations/sv.json +12 -10
  124. package/translations/th.json +12 -10
  125. package/translations/tr.json +12 -10
  126. package/translations/uk.json +12 -10
  127. package/translations/vi.json +12 -10
  128. package/translations/zh.json +12 -10
  129. package/dist/ar-5REA6P4J.mjs.map +0 -1
  130. package/dist/bn-YHRYHHPD.mjs.map +0 -1
  131. package/dist/chunk-2HGWOLVN.mjs +0 -31
  132. package/dist/chunk-2HGWOLVN.mjs.map +0 -1
  133. package/dist/chunk-PFQYNPQJ.mjs.map +0 -1
  134. package/dist/chunk-VVCCMJS7.mjs.map +0 -1
  135. package/dist/chunk-ZPV43WN2.mjs.map +0 -1
  136. package/dist/cs-JTJXTX2T.mjs.map +0 -1
  137. package/dist/da-MK37SJB6.mjs.map +0 -1
  138. package/dist/de-LGBCWERA.mjs.map +0 -1
  139. package/dist/el-FKJMFCWY.mjs.map +0 -1
  140. package/dist/es-LVDPIXWU.mjs.map +0 -1
  141. package/dist/fa-3VA2PIUD.mjs.map +0 -1
  142. package/dist/fi-3WM75ZLR.mjs.map +0 -1
  143. package/dist/fr-NK4A72WA.mjs.map +0 -1
  144. package/dist/he-IACZDZMB.mjs.map +0 -1
  145. package/dist/hi-JZ7MGMMS.mjs.map +0 -1
  146. package/dist/id-P3KDQGNK.mjs.map +0 -1
  147. package/dist/it-LQS33SUY.mjs.map +0 -1
  148. package/dist/ja-G4FKZPWD.mjs.map +0 -1
  149. package/dist/ko-2XWKQ7BA.mjs.map +0 -1
  150. package/dist/ms-2SNONIUD.mjs.map +0 -1
  151. package/dist/nl-BMZUAJ7J.mjs.map +0 -1
  152. package/dist/no-6J3WIZ6L.mjs.map +0 -1
  153. package/dist/pl-QQ7DAUVK.mjs.map +0 -1
  154. package/dist/pt-MU3GN7MW.mjs.map +0 -1
  155. package/dist/ro-6GBE72QK.mjs.map +0 -1
  156. package/dist/sv-NQIL7PEM.mjs.map +0 -1
  157. package/dist/th-6OCNZQBE.mjs.map +0 -1
  158. package/dist/tr-XWJ5P3SC.mjs.map +0 -1
  159. package/dist/uk-AKSN6DGW.mjs.map +0 -1
  160. package/dist/vi-23GHQ45M.mjs.map +0 -1
  161. package/dist/zh-ITT4QBSN.mjs.map +0 -1
  162. /package/dist/{PdfAnnotationCanvas.client-PVTVPDBQ.mjs.map → PdfAnnotationCanvas.client-LF6DDTCV.mjs.map} +0 -0
  163. /package/dist/{en-AOSMPC2M.mjs.map → en-ZW4UKTVX.mjs.map} +0 -0
@@ -1,52 +1,23 @@
1
1
  'use client';
2
2
  import {
3
3
  en_default
4
- } from "./chunk-VVCCMJS7.mjs";
4
+ } from "./chunk-2VWLGQIO.mjs";
5
5
  import {
6
6
  __glob
7
7
  } from "./chunk-D4GAAQMM.mjs";
8
8
 
9
- // src/contexts/ApiClientContext.tsx
10
- import { createContext, useContext, useMemo } from "react";
11
- import { baseUrl } from "@semiont/core";
12
- import { SemiontApiClient } from "@semiont/api-client";
13
- import { jsx } from "react/jsx-runtime";
14
- var ApiClientContext = createContext(void 0);
15
- function ApiClientProvider({
16
- baseUrl: url,
17
- children
18
- }) {
19
- const client = useMemo(
20
- () => new SemiontApiClient({
21
- baseUrl: baseUrl(url),
22
- // Use no timeout in test environment to avoid AbortController issues with ky + vitest
23
- ...process.env.NODE_ENV !== "test" && { timeout: 3e4 }
24
- }),
25
- [url]
26
- // Only baseUrl in deps, token removed
27
- );
28
- return /* @__PURE__ */ jsx(ApiClientContext.Provider, { value: client, children });
29
- }
30
- function useApiClient() {
31
- const context = useContext(ApiClientContext);
32
- if (context === void 0) {
33
- throw new Error("useApiClient must be used within an ApiClientProvider");
34
- }
35
- return context;
36
- }
37
-
38
9
  // src/contexts/SessionContext.tsx
39
- import { createContext as createContext2, useContext as useContext2 } from "react";
40
- import { jsx as jsx2 } from "react/jsx-runtime";
41
- var SessionContext = createContext2(null);
10
+ import { createContext, useContext } from "react";
11
+ import { jsx } from "react/jsx-runtime";
12
+ var SessionContext = createContext(null);
42
13
  function SessionProvider({
43
14
  sessionManager,
44
15
  children
45
16
  }) {
46
- return /* @__PURE__ */ jsx2(SessionContext.Provider, { value: sessionManager, children });
17
+ return /* @__PURE__ */ jsx(SessionContext.Provider, { value: sessionManager, children });
47
18
  }
48
19
  function useSessionContext() {
49
- const context = useContext2(SessionContext);
20
+ const context = useContext(SessionContext);
50
21
  if (!context) {
51
22
  throw new Error("useSessionContext must be used within SessionProvider");
52
23
  }
@@ -56,12 +27,12 @@ function useSessionContext() {
56
27
  // src/components/Toast.tsx
57
28
  import React, { useEffect, useState } from "react";
58
29
  import { createPortal } from "react-dom";
59
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
30
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
60
31
  var icons = {
61
- success: /* @__PURE__ */ jsx3("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx3("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
62
- error: /* @__PURE__ */ jsx3("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx3("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
63
- warning: /* @__PURE__ */ jsx3("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx3("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" }) }),
64
- info: /* @__PURE__ */ jsx3("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx3("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" }) })
32
+ success: /* @__PURE__ */ jsx2("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx2("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
33
+ error: /* @__PURE__ */ jsx2("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx2("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
34
+ warning: /* @__PURE__ */ jsx2("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx2("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" }) }),
35
+ info: /* @__PURE__ */ jsx2("svg", { className: "semiont-toast-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx2("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" }) })
65
36
  };
66
37
  function Toast({ toast, onClose }) {
67
38
  useEffect(() => {
@@ -77,15 +48,15 @@ function Toast({ toast, onClose }) {
77
48
  "data-variant": toast.type,
78
49
  role: "alert",
79
50
  children: [
80
- /* @__PURE__ */ jsx3("div", { className: "semiont-toast-icon-wrapper", children: icons[toast.type] }),
81
- /* @__PURE__ */ jsx3("p", { className: "semiont-toast-message", children: toast.message }),
82
- /* @__PURE__ */ jsx3(
51
+ /* @__PURE__ */ jsx2("div", { className: "semiont-toast-icon-wrapper", children: icons[toast.type] }),
52
+ /* @__PURE__ */ jsx2("p", { className: "semiont-toast-message", children: toast.message }),
53
+ /* @__PURE__ */ jsx2(
83
54
  "button",
84
55
  {
85
56
  onClick: () => onClose(toast.id),
86
57
  className: "semiont-toast-close",
87
58
  "aria-label": "Close",
88
- children: /* @__PURE__ */ jsx3("svg", { className: "semiont-toast-close-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx3("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
59
+ children: /* @__PURE__ */ jsx2("svg", { className: "semiont-toast-close-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx2("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
89
60
  }
90
61
  )
91
62
  ]
@@ -100,7 +71,7 @@ function ToastContainer({ toasts, onClose }) {
100
71
  }, []);
101
72
  if (!mounted) return null;
102
73
  return createPortal(
103
- /* @__PURE__ */ jsx3("div", { className: "semiont-toast-container", children: toasts.map((toast) => /* @__PURE__ */ jsx3(Toast, { toast, onClose }, toast.id)) }),
74
+ /* @__PURE__ */ jsx2("div", { className: "semiont-toast-container", children: toasts.map((toast) => /* @__PURE__ */ jsx2(Toast, { toast, onClose }, toast.id)) }),
104
75
  document.body
105
76
  );
106
77
  }
@@ -125,7 +96,7 @@ function ToastProvider({ children }) {
125
96
  );
126
97
  return /* @__PURE__ */ jsxs(ToastContext.Provider, { value: contextValue, children: [
127
98
  children,
128
- /* @__PURE__ */ jsx3(ToastContainer, { toasts, onClose: handleClose })
99
+ /* @__PURE__ */ jsx2(ToastContainer, { toasts, onClose: handleClose })
129
100
  ] });
130
101
  }
131
102
  function useToast() {
@@ -137,17 +108,17 @@ function useToast() {
137
108
  }
138
109
 
139
110
  // src/contexts/OpenResourcesContext.tsx
140
- import { createContext as createContext3, useContext as useContext3 } from "react";
141
- import { jsx as jsx4 } from "react/jsx-runtime";
142
- var OpenResourcesContext = createContext3(void 0);
111
+ import { createContext as createContext2, useContext as useContext2 } from "react";
112
+ import { jsx as jsx3 } from "react/jsx-runtime";
113
+ var OpenResourcesContext = createContext2(void 0);
143
114
  function OpenResourcesProvider({
144
115
  openResourcesManager,
145
116
  children
146
117
  }) {
147
- return /* @__PURE__ */ jsx4(OpenResourcesContext.Provider, { value: openResourcesManager, children });
118
+ return /* @__PURE__ */ jsx3(OpenResourcesContext.Provider, { value: openResourcesManager, children });
148
119
  }
149
120
  function useOpenResources() {
150
- const context = useContext3(OpenResourcesContext);
121
+ const context = useContext2(OpenResourcesContext);
151
122
  if (context === void 0) {
152
123
  throw new Error("useOpenResources must be used within an OpenResourcesProvider");
153
124
  }
@@ -155,44 +126,44 @@ function useOpenResources() {
155
126
  }
156
127
 
157
128
  // src/contexts/TranslationContext.tsx
158
- import { createContext as createContext4, useContext as useContext4, useState as useState2, useEffect as useEffect2, useMemo as useMemo2 } from "react";
159
- import { Fragment, jsx as jsx5 } from "react/jsx-runtime";
129
+ import { createContext as createContext3, useContext as useContext3, useState as useState2, useEffect as useEffect2, useMemo } from "react";
130
+ import { Fragment, jsx as jsx4 } from "react/jsx-runtime";
160
131
 
161
132
  // import("../../translations/**/*.json") in src/contexts/TranslationContext.tsx
162
133
  var globImport_translations_json = __glob({
163
- "../../translations/ar.json": () => import("./ar-5REA6P4J.mjs"),
164
- "../../translations/bn.json": () => import("./bn-YHRYHHPD.mjs"),
165
- "../../translations/cs.json": () => import("./cs-JTJXTX2T.mjs"),
166
- "../../translations/da.json": () => import("./da-MK37SJB6.mjs"),
167
- "../../translations/de.json": () => import("./de-LGBCWERA.mjs"),
168
- "../../translations/el.json": () => import("./el-FKJMFCWY.mjs"),
169
- "../../translations/en.json": () => import("./en-AOSMPC2M.mjs"),
170
- "../../translations/es.json": () => import("./es-LVDPIXWU.mjs"),
171
- "../../translations/fa.json": () => import("./fa-3VA2PIUD.mjs"),
172
- "../../translations/fi.json": () => import("./fi-3WM75ZLR.mjs"),
173
- "../../translations/fr.json": () => import("./fr-NK4A72WA.mjs"),
174
- "../../translations/he.json": () => import("./he-IACZDZMB.mjs"),
175
- "../../translations/hi.json": () => import("./hi-JZ7MGMMS.mjs"),
176
- "../../translations/id.json": () => import("./id-P3KDQGNK.mjs"),
177
- "../../translations/it.json": () => import("./it-LQS33SUY.mjs"),
178
- "../../translations/ja.json": () => import("./ja-G4FKZPWD.mjs"),
179
- "../../translations/ko.json": () => import("./ko-2XWKQ7BA.mjs"),
180
- "../../translations/ms.json": () => import("./ms-2SNONIUD.mjs"),
181
- "../../translations/nl.json": () => import("./nl-BMZUAJ7J.mjs"),
182
- "../../translations/no.json": () => import("./no-6J3WIZ6L.mjs"),
183
- "../../translations/pl.json": () => import("./pl-QQ7DAUVK.mjs"),
184
- "../../translations/pt.json": () => import("./pt-MU3GN7MW.mjs"),
185
- "../../translations/ro.json": () => import("./ro-6GBE72QK.mjs"),
186
- "../../translations/sv.json": () => import("./sv-NQIL7PEM.mjs"),
187
- "../../translations/th.json": () => import("./th-6OCNZQBE.mjs"),
188
- "../../translations/tr.json": () => import("./tr-XWJ5P3SC.mjs"),
189
- "../../translations/uk.json": () => import("./uk-AKSN6DGW.mjs"),
190
- "../../translations/vi.json": () => import("./vi-23GHQ45M.mjs"),
191
- "../../translations/zh.json": () => import("./zh-ITT4QBSN.mjs")
134
+ "../../translations/ar.json": () => import("./ar-RJLR7NDD.mjs"),
135
+ "../../translations/bn.json": () => import("./bn-4NU2UAZ7.mjs"),
136
+ "../../translations/cs.json": () => import("./cs-6UJZFF55.mjs"),
137
+ "../../translations/da.json": () => import("./da-CFFBBOH3.mjs"),
138
+ "../../translations/de.json": () => import("./de-2KAG6KMX.mjs"),
139
+ "../../translations/el.json": () => import("./el-KVPQ7VNF.mjs"),
140
+ "../../translations/en.json": () => import("./en-ZW4UKTVX.mjs"),
141
+ "../../translations/es.json": () => import("./es-ZU2ECPVG.mjs"),
142
+ "../../translations/fa.json": () => import("./fa-CBIVKDIQ.mjs"),
143
+ "../../translations/fi.json": () => import("./fi-5HUVT7IK.mjs"),
144
+ "../../translations/fr.json": () => import("./fr-O5WU2US2.mjs"),
145
+ "../../translations/he.json": () => import("./he-WP4C2SNJ.mjs"),
146
+ "../../translations/hi.json": () => import("./hi-HLQXNRWI.mjs"),
147
+ "../../translations/id.json": () => import("./id-DTJT2ZA6.mjs"),
148
+ "../../translations/it.json": () => import("./it-2DK57IMT.mjs"),
149
+ "../../translations/ja.json": () => import("./ja-52ZNY72Y.mjs"),
150
+ "../../translations/ko.json": () => import("./ko-4Z2IMYZO.mjs"),
151
+ "../../translations/ms.json": () => import("./ms-HKU73KEX.mjs"),
152
+ "../../translations/nl.json": () => import("./nl-HPHQMXPT.mjs"),
153
+ "../../translations/no.json": () => import("./no-Q7G4PVFT.mjs"),
154
+ "../../translations/pl.json": () => import("./pl-D43C2CE3.mjs"),
155
+ "../../translations/pt.json": () => import("./pt-V3GFSY7B.mjs"),
156
+ "../../translations/ro.json": () => import("./ro-3UIRV3OA.mjs"),
157
+ "../../translations/sv.json": () => import("./sv-BMW26A7M.mjs"),
158
+ "../../translations/th.json": () => import("./th-CMND2QET.mjs"),
159
+ "../../translations/tr.json": () => import("./tr-P3AD7MYA.mjs"),
160
+ "../../translations/uk.json": () => import("./uk-QPONRQ5O.mjs"),
161
+ "../../translations/vi.json": () => import("./vi-G2OMVMCI.mjs"),
162
+ "../../translations/zh.json": () => import("./zh-HTDN4LKE.mjs")
192
163
  });
193
164
 
194
165
  // src/contexts/TranslationContext.tsx
195
- var TranslationContext = createContext4(null);
166
+ var TranslationContext = createContext3(null);
196
167
  var translationCache = /* @__PURE__ */ new Map();
197
168
  function processPluralFormat(text, params) {
198
169
  const pluralMatch = text.match(/\{(\w+),\s*plural,\s*/);
@@ -356,7 +327,7 @@ function TranslationProvider({
356
327
  });
357
328
  }
358
329
  }, [locale, translationManager]);
359
- const localeManager = useMemo2(() => {
330
+ const localeManager = useMemo(() => {
360
331
  if (!loadedTranslations) return null;
361
332
  return {
362
333
  t: (namespace, key, params) => {
@@ -378,18 +349,18 @@ function TranslationProvider({
378
349
  };
379
350
  }, [loadedTranslations, locale]);
380
351
  if (translationManager) {
381
- return /* @__PURE__ */ jsx5(TranslationContext.Provider, { value: translationManager, children });
352
+ return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: translationManager, children });
382
353
  }
383
354
  if (locale && isLoading) {
384
- return /* @__PURE__ */ jsx5(Fragment, { children: loadingComponent });
355
+ return /* @__PURE__ */ jsx4(Fragment, { children: loadingComponent });
385
356
  }
386
357
  if (locale && localeManager) {
387
- return /* @__PURE__ */ jsx5(TranslationContext.Provider, { value: localeManager, children });
358
+ return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: localeManager, children });
388
359
  }
389
- return /* @__PURE__ */ jsx5(TranslationContext.Provider, { value: defaultTranslationManager, children });
360
+ return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: defaultTranslationManager, children });
390
361
  }
391
362
  function useTranslations(namespace) {
392
- const context = useContext4(TranslationContext);
363
+ const context = useContext3(TranslationContext);
393
364
  if (!context) {
394
365
  return (key, params) => {
395
366
  const translations = en_default;
@@ -427,8 +398,6 @@ function usePreloadTranslations() {
427
398
  }
428
399
 
429
400
  export {
430
- ApiClientProvider,
431
- useApiClient,
432
401
  SessionProvider,
433
402
  useSessionContext,
434
403
  ToastContainer,
@@ -441,4 +410,4 @@ export {
441
410
  useTranslations,
442
411
  usePreloadTranslations
443
412
  };
444
- //# sourceMappingURL=chunk-PFQYNPQJ.mjs.map
413
+ //# sourceMappingURL=chunk-EKQMINCV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contexts/SessionContext.tsx","../src/components/Toast.tsx","../src/contexts/OpenResourcesContext.tsx","../src/contexts/TranslationContext.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, useContext, ReactNode } from 'react';\nimport type { SessionManager } from '../types/SessionManager';\n\nconst SessionContext = createContext<SessionManager | null>(null);\n\n/**\n * Provider Pattern: Accepts SessionManager implementation as prop\n * and makes it available to child components via Context.\n *\n * Apps provide their own implementation (next-auth, custom auth, etc.)\n * and pass it to this provider at the root level.\n *\n * @example\n * ```tsx\n * // In app root\n * const sessionManager = useSessionManager(); // App's implementation\n *\n * <SessionProvider sessionManager={sessionManager}>\n * <App />\n * </SessionProvider>\n * ```\n */\nexport function SessionProvider({\n sessionManager,\n children\n}: {\n sessionManager: SessionManager;\n children: ReactNode;\n}) {\n return (\n <SessionContext.Provider value={sessionManager}>\n {children}\n </SessionContext.Provider>\n );\n}\n\n/**\n * Hook to access SessionManager from Context\n * Components use this hook to access session state and expiry information\n */\nexport function useSessionContext() {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSessionContext must be used within SessionProvider');\n }\n return context;\n}","'use client';\n\nimport React, { 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":"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","names":["jsx","createContext","useContext","jsx","createContext","useContext","useState","useEffect","jsx","createContext","useState","useEffect","jsx","useContext"]}
@@ -1,7 +1,26 @@
1
1
  'use client';
2
2
  import {
3
+ useApiClient,
3
4
  useEventBus
4
- } from "./chunk-2HGWOLVN.mjs";
5
+ } from "./chunk-5JZFKRLW.mjs";
6
+
7
+ // src/contexts/AuthTokenContext.tsx
8
+ import { createContext, useContext } from "react";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var AuthTokenContext = createContext(void 0);
11
+ function AuthTokenProvider({
12
+ token,
13
+ children
14
+ }) {
15
+ return /* @__PURE__ */ jsx(AuthTokenContext.Provider, { value: token, children });
16
+ }
17
+ function useAuthToken() {
18
+ const context = useContext(AuthTokenContext);
19
+ if (context === void 0) {
20
+ throw new Error("useAuthToken must be used within an AuthTokenProvider");
21
+ }
22
+ return context;
23
+ }
5
24
 
6
25
  // src/contexts/useEventSubscription.ts
7
26
  import { useEffect, useRef, useMemo } from "react";
@@ -56,6 +75,7 @@ function useEventSubscriptions(subscriptions) {
56
75
 
57
76
  // src/hooks/useBeckonFlow.ts
58
77
  import { useState, useRef as useRef2, useCallback, useEffect as useEffect2 } from "react";
78
+ import { accessToken } from "@semiont/core";
59
79
  function useBeckonFlow() {
60
80
  const eventBus = useEventBus();
61
81
  const [hoveredAnnotationId, setHoveredAnnotationId] = useState(null);
@@ -137,13 +157,62 @@ function useHoverEmitter(annotationId, hoverDelayMs = HOVER_DELAY_MS) {
137
157
  }, []);
138
158
  return { onMouseEnter, onMouseLeave };
139
159
  }
160
+ function useAttentionStream() {
161
+ const client = useApiClient();
162
+ const token = useAuthToken();
163
+ const eventBus = useEventBus();
164
+ const [status, setStatus] = useState("disconnected");
165
+ const streamRef = useRef2(null);
166
+ const connectingRef = useRef2(false);
167
+ const connect = useCallback(async () => {
168
+ if (connectingRef.current || streamRef.current) return;
169
+ connectingRef.current = true;
170
+ if (!client) {
171
+ setStatus("error");
172
+ connectingRef.current = false;
173
+ return;
174
+ }
175
+ setStatus("connecting");
176
+ try {
177
+ const stream = client.sse.attentionStream({
178
+ ...token ? { auth: accessToken(token) } : {},
179
+ eventBus
180
+ });
181
+ streamRef.current = stream;
182
+ setStatus("connected");
183
+ connectingRef.current = false;
184
+ } catch (error) {
185
+ console.error("[AttentionStream] Failed to connect:", error);
186
+ setStatus("error");
187
+ connectingRef.current = false;
188
+ }
189
+ }, [client, token, eventBus]);
190
+ const disconnect = useCallback(() => {
191
+ if (streamRef.current) {
192
+ streamRef.current.close();
193
+ streamRef.current = null;
194
+ }
195
+ setStatus("disconnected");
196
+ connectingRef.current = false;
197
+ }, []);
198
+ useEffect2(() => {
199
+ if (client) {
200
+ connect();
201
+ }
202
+ return () => disconnect();
203
+ }, [client]);
204
+ return { status };
205
+ }
140
206
 
141
207
  export {
208
+ AuthTokenProvider,
209
+ useAuthToken,
142
210
  useEventSubscription,
143
211
  useEventSubscriptions,
144
212
  useBeckonFlow,
145
213
  HOVER_DELAY_MS,
146
214
  createHoverHandlers,
147
- useHoverEmitter
215
+ useHoverEmitter,
216
+ useAttentionStream
148
217
  };
149
- //# sourceMappingURL=chunk-ZPV43WN2.mjs.map
218
+ //# sourceMappingURL=chunk-XMCUHQ2Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contexts/AuthTokenContext.tsx","../src/contexts/useEventSubscription.ts","../src/hooks/useBeckonFlow.ts"],"sourcesContent":["'use client';\n\n/**\n * Auth Token Context - Manages authentication token lifecycle\n *\n * Simple approach: Just pass the token value through context.\n * When the token changes, context updates, components re-render.\n * No complex machinery needed.\n */\n\nimport { createContext, useContext, ReactNode } from 'react';\n\nconst AuthTokenContext = createContext<string | null | undefined>(undefined);\n\nexport interface AuthTokenProviderProps {\n token: string | null;\n children: ReactNode;\n}\n\n/**\n * Provider for auth token\n * Pass the current token value - React handles the rest\n */\nexport function AuthTokenProvider({\n token,\n children,\n}: AuthTokenProviderProps) {\n return (\n <AuthTokenContext.Provider value={token}>\n {children}\n </AuthTokenContext.Provider>\n );\n}\n\n/**\n * Hook to get current auth token\n *\n * Returns the current token value from context.\n * Re-renders automatically when token changes (normal React behavior).\n *\n * @returns Current access token (null if not authenticated)\n * @throws Error if used outside AuthTokenProvider\n */\nexport function useAuthToken(): string | null {\n const context = useContext(AuthTokenContext);\n\n if (context === undefined) {\n throw new Error('useAuthToken must be used within an AuthTokenProvider');\n }\n\n return context;\n}\n","import { useEffect, useRef, useMemo } from 'react';\nimport type { EventMap } from '@semiont/core';\nimport { useEventBus } from './EventBusContext';\n\n/**\n * Subscribe to an event bus event with automatic cleanup.\n *\n * This hook solves the \"stale closure\" problem by always using the latest\n * version of the handler without re-subscribing.\n *\n * @example\n * ```tsx\n * useEventSubscription('mark:created', ({ annotation }) => {\n * // This always uses the latest props/state\n * triggerSparkleAnimation(annotation.id);\n * });\n * ```\n */\nexport function useEventSubscription<K extends keyof EventMap>(\n eventName: K,\n handler: (payload: EventMap[K]) => void\n): void {\n const eventBus = useEventBus();\n\n // Store the latest handler in a ref to avoid stale closures\n const handlerRef = useRef(handler);\n\n // Update ref on every render (no re-subscription needed)\n useEffect(() => {\n handlerRef.current = handler;\n });\n\n // Subscribe once, using a stable wrapper that calls the current handler\n useEffect(() => {\n const stableHandler = (payload: EventMap[K]) => {\n handlerRef.current(payload);\n };\n\n // RxJS EventBus.get() returns Subject, subscribe returns Subscription\n const subscription = eventBus.get(eventName).subscribe(stableHandler);\n\n return () => {\n subscription.unsubscribe();\n };\n }, [eventName, eventBus]); // eventBus is stable, only re-subscribe if event name changes\n}\n\n/**\n * Subscribe to multiple events at once.\n *\n * @example\n * ```tsx\n * useEventSubscriptions({\n * 'mark:created': ({ annotation }) => setNewAnnotation(annotation),\n * 'mark:deleted': ({ annotationId }) => removeAnnotation(annotationId),\n * });\n * ```\n */\nexport function useEventSubscriptions(\n subscriptions: {\n [K in keyof EventMap]?: (payload: EventMap[K]) => void;\n }\n): void {\n const eventBus = useEventBus();\n\n // Store the latest handlers in refs\n const handlersRef = useRef(subscriptions);\n\n // Update refs on every render\n useEffect(() => {\n handlersRef.current = subscriptions;\n });\n\n // Get stable list of event names to subscribe to\n const eventNames = useMemo(\n () => Object.keys(subscriptions).sort(),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [Object.keys(subscriptions).sort().join(',')]\n );\n\n // Subscribe once per event - only re-subscribe if event names actually change\n useEffect(() => {\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n\n // Create stable wrappers for each subscription\n for (const eventName of eventNames) {\n const stableHandler = (payload: any) => {\n const currentHandler = handlersRef.current[eventName as keyof EventMap];\n if (currentHandler) {\n currentHandler(payload);\n } else {\n console.warn('[useEventSubscriptions] No current handler found for:', eventName);\n }\n };\n\n // RxJS EventBus.get() returns Subject, subscribe returns Subscription\n const subscription = eventBus.get(eventName as keyof EventMap).subscribe(stableHandler);\n subscriptions.push(subscription);\n }\n\n // Cleanup: unsubscribe from all subscriptions\n return () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n }, [eventNames, eventBus]); // eventBus is stable singleton - never in deps; only re-subscribe if event names change\n}\n","/**\n * useBeckonFlow — Annotation attention / pointer coordination hook\n *\n * Manages which annotation currently has the user's attention:\n * - Hover state (hoveredAnnotationId)\n * - Hover → sparkle relay\n * - Click → focus relay\n *\n * Follows react-rxjs-guide.md Layer 2 pattern: Hook bridge that\n * subscribes to events and pushes values into React state.\n *\n * Note: beckon:sparkle visual effect (triggerSparkleAnimation) is owned by\n * ResourceViewerPage, which subscribes to beckon:sparkle and delegates to\n * ResourceAnnotationsContext. This hook emits the signal; it does not render the effect.\n *\n * @subscribes beckon:hover - Sets hoveredAnnotationId; emits beckon:sparkle\n * @subscribes browse:click - Emits beckon:focus (attention relay only)\n * @emits beckon:sparkle\n * @emits beckon:focus\n */\n\n/**\n * useHoverEmitter / createHoverHandlers — annotation hover emission utilities\n *\n * Centralises two hover quality-of-life behaviours:\n *\n * 1. currentHover guard — suppresses redundant emissions when the mouse\n * moves within the same annotation element (prevents event bus noise).\n *\n * 2. Debounce delay (HOVER_DELAY_MS) — a short timer before emitting\n * beckon:hover, so that transient pass-through movements (user dragging\n * the mouse across the panel to reach a button elsewhere) do not trigger\n * sparkle animations or cross-highlight effects.\n * The delay is cancelled immediately on mouseLeave, so leaving is always instant.\n *\n * Two forms are provided:\n *\n * useHoverEmitter(annotationId)\n * React hook. Returns { onMouseEnter, onMouseLeave } props for JSX elements.\n * Use in panel entries (HighlightEntry, CommentEntry, …).\n *\n * createHoverHandlers(emit)\n * Plain factory. Returns { handleMouseEnter(id), handleMouseLeave(), cleanup }.\n * Use inside useEffect / imperative setup code where hooks cannot be called\n * (BrowseView, CodeMirrorRenderer, AnnotationOverlay, PdfAnnotationCanvas).\n */\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\nimport type { SSEStream } from '@semiont/api-client';\nimport { accessToken } from '@semiont/core';\nimport { useEventBus } from '../contexts/EventBusContext';\nimport { useEventSubscriptions } from '../contexts/useEventSubscription';\nimport { useApiClient } from '../contexts/ApiClientContext';\nimport { useAuthToken } from '../contexts/AuthTokenContext';\nimport type { StreamStatus } from './useResourceEvents';\n\n// ─── useBeckonFlow ─────────────────────────────────────────────────────────\n\nexport interface BeckonFlowState {\n hoveredAnnotationId: string | null;\n}\n\nexport function useBeckonFlow(): BeckonFlowState {\n const eventBus = useEventBus();\n const [hoveredAnnotationId, setHoveredAnnotationId] = useState<string | null>(null);\n\n const handleAnnotationHover = useCallback(({ annotationId }: { annotationId: string | null }) => {\n setHoveredAnnotationId(annotationId);\n if (annotationId) {\n eventBus.get('beckon:sparkle').next({ annotationId });\n }\n }, []); // eventBus is stable singleton - never in deps\n\n const handleAnnotationClick = useCallback(({ annotationId }: { annotationId: string }) => {\n eventBus.get('beckon:focus').next({ annotationId });\n // Scroll to annotation handled by BrowseView via beckon:focus subscription\n }, []); // eventBus is stable singleton - never in deps\n\n useEventSubscriptions({\n 'beckon:hover': handleAnnotationHover,\n 'browse:click': handleAnnotationClick,\n });\n\n return { hoveredAnnotationId };\n}\n\n// ─── createHoverHandlers (use inside useEffect / imperative setup) ────────────\n\n/** Default milliseconds the mouse must dwell before beckon:hover is emitted. */\nexport const HOVER_DELAY_MS = 150;\n\ntype EmitHover = (annotationId: string | null) => void;\n\nexport interface HoverHandlers {\n /** Call with the annotation ID when the mouse enters an annotation element. */\n handleMouseEnter: (annotationId: string) => void;\n /** Call when the mouse leaves the annotation element. */\n handleMouseLeave: () => void;\n /** Cancel any pending timer — call in the useEffect cleanup. */\n cleanup: () => void;\n}\n\n/**\n * Creates hover handlers for imperative code (non-hook contexts).\n * @param emit - Callback to emit hover events\n * @param delayMs - Hover delay in milliseconds\n */\nexport function createHoverHandlers(emit: EmitHover, delayMs: number): HoverHandlers {\n let currentHover: string | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const cancelTimer = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const handleMouseEnter = (annotationId: string) => {\n if (currentHover === annotationId) return; // already hovering this one\n cancelTimer();\n timer = setTimeout(() => {\n timer = null;\n currentHover = annotationId;\n emit(annotationId);\n }, delayMs);\n };\n\n const handleMouseLeave = () => {\n cancelTimer();\n if (currentHover !== null) {\n currentHover = null;\n emit(null);\n }\n };\n\n return { handleMouseEnter, handleMouseLeave, cleanup: cancelTimer };\n}\n\n// ─── useHoverEmitter (use in JSX onMouseEnter / onMouseLeave props) ───────────\n\nexport interface HoverEmitterProps {\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n}\n\n/**\n * React hook that returns onMouseEnter / onMouseLeave props for a single\n * annotation entry element.\n *\n * @param annotationId - The ID of the annotation this element represents.\n * @param hoverDelayMs - Hover delay in milliseconds (defaults to HOVER_DELAY_MS for panel entries)\n */\nexport function useHoverEmitter(annotationId: string, hoverDelayMs: number = HOVER_DELAY_MS): HoverEmitterProps {\n const eventBus = useEventBus();\n const currentHoverRef = useRef<string | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const onMouseEnter = useCallback(() => {\n if (currentHoverRef.current === annotationId) return;\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n currentHoverRef.current = annotationId;\n eventBus.get('beckon:hover').next({ annotationId });\n }, hoverDelayMs);\n }, [annotationId, hoverDelayMs]); // eventBus is stable singleton - never in deps\n\n const onMouseLeave = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (currentHoverRef.current !== null) {\n currentHoverRef.current = null;\n eventBus.get('beckon:hover').next({ annotationId: null });\n }\n }, []); // eventBus is stable singleton - never in deps\n\n // Cleanup timer on unmount\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n }, []);\n\n return { onMouseEnter, onMouseLeave };\n}\n\n// ─── useAttentionStream ───────────────────────────────────────────────────────\n\n/**\n * Opens a participant-scoped SSE connection to receive cross-participant\n * beckon signals. Each incoming signal is emitted as beckon:focus on the\n * EventBus — the existing scroll/highlight machinery handles it automatically.\n *\n * Signals are ephemeral: delivered if connected, silently dropped if not.\n *\n * @example\n * ```tsx\n * // In your layout (render-nothing connector):\n * useAttentionStream();\n * ```\n */\nexport function useAttentionStream(): { status: StreamStatus } {\n const client = useApiClient();\n const token = useAuthToken();\n const eventBus = useEventBus();\n const [status, setStatus] = useState<StreamStatus>('disconnected');\n const streamRef = useRef<SSEStream | null>(null);\n const connectingRef = useRef(false);\n\n const connect = useCallback(async () => {\n if (connectingRef.current || streamRef.current) return;\n connectingRef.current = true;\n\n if (!client) {\n setStatus('error');\n connectingRef.current = false;\n return;\n }\n\n setStatus('connecting');\n\n try {\n const stream = client.sse.attentionStream({\n ...(token ? { auth: accessToken(token) } : {}),\n eventBus,\n });\n streamRef.current = stream;\n setStatus('connected');\n connectingRef.current = false;\n } catch (error) {\n console.error('[AttentionStream] Failed to connect:', error);\n setStatus('error');\n connectingRef.current = false;\n }\n }, [client, token, eventBus]);\n\n const disconnect = useCallback(() => {\n if (streamRef.current) {\n streamRef.current.close();\n streamRef.current = null;\n }\n setStatus('disconnected');\n connectingRef.current = false;\n }, []);\n\n useEffect(() => {\n if (client) {\n connect();\n }\n return () => disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client]);\n\n return { status };\n}\n"],"mappings":"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","names":["subscriptions","useRef","useEffect","useRef","useEffect"]}
@@ -23,7 +23,14 @@ var ResourceInfoPanel = {
23
23
  archive: "Archivovat",
24
24
  archiveDescription: "P\u0159esunout tento zdroj do archivovan\xE9ho stavu",
25
25
  unarchive: "Obnovit z archivu",
26
- unarchiveDescription: "Obnovit tento zdroj do aktivn\xEDho stavu"
26
+ unarchiveDescription: "Obnovit tento zdroj do aktivn\xEDho stavu",
27
+ provenance: "P\u016Fvod",
28
+ createdAt: "Vytvo\u0159eno",
29
+ modifiedAt: "Upraveno",
30
+ creationMethod: "Zp\u016Fsob vytvo\u0159en\xED",
31
+ attributedTo: "P\u0159ips\xE1no",
32
+ derivedFrom: "Odvozeno z",
33
+ generatedBy: "Vygenerov\xE1no pomoc\xED"
27
34
  };
28
35
  var CollaborationPanel = {
29
36
  title: "Spolupr\xE1ce",
@@ -337,15 +344,9 @@ var ReferenceWizard = {
337
344
  configureGenerationTitle: "Konfigurovat generov\xE1n\xED",
338
345
  configureSearchTitle: "Konfigurovat hled\xE1n\xED",
339
346
  searchResultsTitle: "V\xFDsledky hled\xE1n\xED",
340
- annotationLabel: "Anotace",
341
- sourceResourceLabel: "Zdrojov\xFD prost\u0159edek",
342
- motivationLabel: "Motivace",
343
- sourceContextLabel: "Kontext zdroje",
344
- entityTypesLabel: "Typy entit",
345
- graphContextLabel: "Kontext grafu",
346
- connectionsLabel: "P\u0159ipojen\xED",
347
- citedByLabel: "Citov\xE1no",
348
- siblingTypesLabel: "P\u0159\xEDbuzn\xE9 typy",
347
+ sourceContextLabel: "Kontext anotace v prost\u0159edku",
348
+ connectionsLabel: "Partnersk\xE9 anotace",
349
+ citedByLabel: "Prost\u0159edek citov\xE1n",
349
350
  userHintLabel: "N\xE1pov\u011Bda",
350
351
  userHintPlaceholder: "Popi\u0161te, na co se tato anotace vztahuje...",
351
352
  loadingContext: "Shroma\u017E\u010Fov\xE1n\xED kontextu...",
@@ -353,6 +354,7 @@ var ReferenceWizard = {
353
354
  cancel: "Zru\u0161it",
354
355
  generate: "Generovat",
355
356
  compose: "Sestavit",
357
+ resolutionStrategyLabel: "Strategie \u0159e\u0161en\xED",
356
358
  back: "Zp\u011Bt",
357
359
  link: "Odkaz",
358
360
  score: "Sk\xF3re",
@@ -415,4 +417,4 @@ export {
415
417
  UnifiedAnnotationsPanel,
416
418
  cs_default as default
417
419
  };
418
- //# sourceMappingURL=cs-JTJXTX2T.mjs.map
420
+ //# sourceMappingURL=cs-6UJZFF55.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../translations/cs.json"],"sourcesContent":["{\n \"Toolbar\": {\n \"annotations\": \"Anotace\",\n \"history\": \"Historie\",\n \"resourceInfo\": \"Informace o zdroji\",\n \"collaboration\": \"Spolupráce\",\n \"userAccount\": \"Uživatelský účet\",\n \"settings\": \"Nastavení\"\n },\n \"ResourceInfoPanel\": {\n \"title\": \"Informace o zdroji\",\n \"locale\": \"Národní prostředí\",\n \"notSpecified\": \"Neuvedeno\",\n \"entityTypeTags\": \"Štítky typů entit\",\n \"representation\": \"Reprezentace\",\n \"mediaType\": \"Typ média\",\n \"byteSize\": \"Velikost\",\n \"clone\": \"Klonovat\",\n \"cloneDescription\": \"Vytvořit sdílitelný odkaz na klon tohoto zdroje\",\n \"archive\": \"Archivovat\",\n \"archiveDescription\": \"Přesunout tento zdroj do archivovaného stavu\",\n \"unarchive\": \"Obnovit z archivu\",\n \"unarchiveDescription\": \"Obnovit tento zdroj do aktivního stavu\",\n \"provenance\": \"Původ\",\n \"createdAt\": \"Vytvořeno\",\n \"modifiedAt\": \"Upraveno\",\n \"creationMethod\": \"Způsob vytvoření\",\n \"attributedTo\": \"Připsáno\",\n \"derivedFrom\": \"Odvozeno z\",\n \"generatedBy\": \"Vygenerováno pomocí\"\n },\n \"CollaborationPanel\": {\n \"title\": \"Spolupráce\",\n \"connectionStatus\": \"Stav připojení\",\n \"live\": \"Živě\",\n \"disconnected\": \"Odpojeno\",\n \"events\": \"{count} událostí\",\n \"lastSync\": \"Poslední synchronizace:\",\n \"noActivity\": \"Zatím žádná aktivita\",\n \"justNow\": \"Právě teď\",\n \"secondsAgo\": \"Před {count} sekundami\",\n \"minuteAgo\": \"Před 1 minutou\",\n \"minutesAgo\": \"Před {count} minutami\",\n \"hourAgo\": \"Před 1 hodinou\",\n \"hoursAgo\": \"Před {count} hodinami\",\n \"realtimeActive\": \"Aktualizace v reálném čase jsou aktivní\",\n \"reconnecting\": \"Opětovné připojování k serveru...\",\n \"sharing\": \"Sdílení\",\n \"collaborationComingSoon\": \"Funkce spolupráce budou brzy k dispozici\"\n },\n \"AnnotationHistory\": {\n \"history\": \"Historie\",\n \"loading\": \"Načítání...\",\n \"user\": \"Uživatel\",\n \"method\": \"Metoda\",\n \"viewOriginal\": \"Zobrazit originál\",\n \"viewAnnotation\": \"Zobrazit anotaci: {content}\",\n \"resourceCreated\": \"Zdroj vytvořen\",\n \"resourceCloned\": \"Klonováno\",\n \"resourceArchived\": \"Archivováno\",\n \"resourceUnarchived\": \"Obnoveno z archivu\",\n \"highlightAdded\": \"Zvýraznění přidáno\",\n \"highlightRemoved\": \"Zvýraznění odebráno\",\n \"referenceCreated\": \"Reference vytvořena\",\n \"referenceResolved\": \"Reference vyřešena\",\n \"referenceDeleted\": \"Reference smazána\",\n \"entitytagAdded\": \"Štítek přidán\",\n \"entitytagRemoved\": \"Štítek odebrán\",\n \"assessmentAdded\": \"Hodnocení přidáno\",\n \"assessmentRemoved\": \"Hodnocení odebráno\",\n \"annotationAdded\": \"Anotace přidána\",\n \"annotationRemoved\": \"Anotace odebrána\",\n \"annotationBodyUpdated\": \"Anotace aktualizována\",\n \"jobEvent\": \"Událost úlohy\",\n \"justNow\": \"právě teď\",\n \"minutesAgo\": \"před {count} min\",\n \"hoursAgo\": \"před {count} hod\",\n \"daysAgo\": \"před {count} dny\"\n },\n \"CommentsPanel\": {\n \"title\": \"Komentáře\",\n \"noComments\": \"Zatím žádné komentáře. Vyberte text a kliknutím na Komentář přidejte nový.\",\n \"commentPlaceholder\": \"Sem napište svůj komentář...\",\n \"save\": \"Uložit\",\n \"cancel\": \"Zrušit\",\n \"edit\": \"Upravit\",\n \"annotateComments\": \"Anotovat komentáře\",\n \"instructions\": \"Pokyny\",\n \"optional\": \"(volitelné)\",\n \"instructionsPlaceholder\": \"např. Zaměřte se na odbornou terminologii...\",\n \"annotate\": \"Anotovat\",\n \"annotating\": \"Anotování...\",\n \"toneLabel\": \"Tón\",\n \"toneOptional\": \"(volitelné)\",\n \"toneScholarly\": \"Akademický\",\n \"toneExplanatory\": \"Vysvětlující\",\n \"toneConversational\": \"Konverzační\",\n \"toneTechnical\": \"Technický\",\n \"densityLabel\": \"Hustota\",\n \"densitySparse\": \"Řídká\",\n \"densityDense\": \"Hustá\",\n \"fragmentSelected\": \"Fragment vybrán\",\n \"imageRegionSelected\": \"Oblast obrázku vybrána\",\n \"closeProgress\": \"Zavřít\"\n },\n \"HighlightPanel\": {\n \"title\": \"Zvýraznění\",\n \"noHighlights\": \"Zatím žádná zvýraznění. Použijte AI anotaci pro nalezení důležitých pasáží.\",\n \"annotateHighlights\": \"Anotovat zvýraznění\",\n \"instructions\": \"Pokyny\",\n \"optional\": \"(volitelné)\",\n \"instructionsPlaceholder\": \"např. Zaměřte se na klíčové technické koncepty...\",\n \"annotate\": \"Anotovat\",\n \"annotating\": \"Anotování...\",\n \"cancel\": \"Zrušit\",\n \"densityLabel\": \"Hustota\",\n \"densitySparse\": \"Řídká\",\n \"densityDense\": \"Hustá\",\n \"closeProgress\": \"Zavřít\"\n },\n \"AssessmentPanel\": {\n \"title\": \"Hodnocení\",\n \"noAssessments\": \"Zatím žádná hodnocení. Použijte AI anotaci pro vyhodnocení pasáží.\",\n \"assessmentPlaceholder\": \"Sem napište své hodnocení...\",\n \"save\": \"Uložit\",\n \"cancel\": \"Zrušit\",\n \"annotateAssessments\": \"Anotovat hodnocení\",\n \"instructions\": \"Pokyny\",\n \"optional\": \"(volitelné)\",\n \"instructionsPlaceholder\": \"např. Vyhodnoťte tvrzení z hlediska přesnosti a důkazů...\",\n \"annotate\": \"Anotovat\",\n \"annotating\": \"Anotování...\",\n \"toneLabel\": \"Tón\",\n \"toneOptional\": \"(volitelné)\",\n \"toneAnalytical\": \"Analytický\",\n \"toneCritical\": \"Kritický\",\n \"toneBalanced\": \"Vyvážený\",\n \"toneConstructive\": \"Konstruktivní\",\n \"densityLabel\": \"Hustota\",\n \"densitySparse\": \"Řídká\",\n \"densityDense\": \"Hustá\",\n \"fragmentSelected\": \"Fragment vybrán\",\n \"imageRegionSelected\": \"Oblast obrázku vybrána\",\n \"closeProgress\": \"Zavřít\"\n },\n \"TaggingPanel\": {\n \"title\": \"Štítky\",\n \"noTags\": \"Zatím žádné štítky. Použijte AI anotaci pro identifikaci strukturálních rolí.\",\n \"annotateTags\": \"Anotovat štítky\",\n \"selectSchema\": \"Vybrat rámec\",\n \"schemaLegal\": \"Právní analýza (IRAC)\",\n \"schemaScientific\": \"Vědecký článek (IMRAD)\",\n \"schemaArgument\": \"Struktura argumentace (Toulmin)\",\n \"selectCategories\": \"Vybrat kategorie\",\n \"categoryIssue\": \"Otázka\",\n \"categoryRule\": \"Pravidlo\",\n \"categoryApplication\": \"Aplikace\",\n \"categoryConclusion\": \"Závěr\",\n \"categoryIntroduction\": \"Úvod\",\n \"categoryMethods\": \"Metody\",\n \"categoryResults\": \"Výsledky\",\n \"categoryDiscussion\": \"Diskuze\",\n \"categoryClaim\": \"Tvrzení\",\n \"categoryEvidence\": \"Důkaz\",\n \"categoryWarrant\": \"Odůvodnění\",\n \"categoryCounterargument\": \"Protiargument\",\n \"categoryRebuttal\": \"Vyvrácení\",\n \"annotate\": \"Anotovat\",\n \"annotating\": \"Anotování...\",\n \"cancel\": \"Zrušit\",\n \"selectAll\": \"Vybrat vše\",\n \"deselectAll\": \"Zrušit výběr\",\n \"categoriesSelected\": \"{count, plural, =0 {Žádné kategorie nevybrány} =1 {1 kategorie vybrána} other {# kategorií vybráno}}\",\n \"createTagForSelection\": \"Vytvořit štítek pro výběr\",\n \"selectCategory\": \"Vybrat kategorii\",\n \"chooseCategory\": \"Zvolte kategorii...\",\n \"fragmentSelected\": \"Fragment vybrán\",\n \"imageRegionSelected\": \"Oblast obrázku vybrána\"\n },\n \"UnifiedAnnotationsPanel\": {\n \"title\": \"Anotace\",\n \"statistics\": \"Statistiky\",\n \"highlight\": \"Zvýraznění\",\n \"reference\": \"Reference\",\n \"assessment\": \"Hodnocení\",\n \"comment\": \"Komentáře\",\n \"tag\": \"Štítky\"\n },\n \"StatisticsPanel\": {\n \"title\": \"Statistiky\",\n \"highlights\": \"Zvýraznění\",\n \"comments\": \"Komentáře\",\n \"assessments\": \"Hodnocení\",\n \"tags\": \"Štítky\",\n \"references\": \"Reference\",\n \"stub\": \"Neúplné\",\n \"resolved\": \"Vyřešené\",\n \"entityTypes\": \"Typy entit\"\n },\n \"ReferencesPanel\": {\n \"title\": \"Reference\",\n \"noReferences\": \"Zatím žádné reference. Vyberte text pro vytvoření referencí na jiné zdroje.\",\n \"outgoingReferences\": \"Odchozí reference\",\n \"incomingReferences\": \"Příchozí reference\",\n \"noIncomingReferences\": \"Žádné příchozí reference\",\n \"stub\": \"Neúplná reference (nepropojená)\",\n \"resolved\": \"Vyřešená reference (propojená)\",\n \"open\": \"Otevřít\",\n \"unlink\": \"Odpojit\",\n \"resolve\": \"Vyřešit referenci\",\n \"cancel\": \"Zrušit\",\n \"createReference\": \"Vytvořit referenci\",\n \"entityTypesOptional\": \"Typy entit (volitelné)\",\n \"fragmentSelected\": \"Fragment vybrán\",\n \"imageRegionSelected\": \"Oblast obrázku vybrána\",\n \"annotateReferences\": \"Anotovat reference\",\n \"selectEntityTypes\": \"Typy entit:\",\n \"select\": \"Vybrat\",\n \"deselect\": \"Zrušit výběr\",\n \"noEntityTypes\": \"Žádné typy entit nejsou k dispozici\",\n \"typesSelected\": \"{count, plural, =1 {1 typ vybrán} other {# typů vybráno}}\",\n \"annotate\": \"Anotovat\",\n \"annotating\": \"Anotování...\",\n \"includeDescriptiveReferences\": \"Zahrnout popisné reference\",\n \"descriptiveReferencesTooltip\": \"Najít také fráze jako 'generální ředitel', 'technologický gigant', 'fyzik' (kromě jmen)\",\n \"annotationProgressTitle\": \"Anotování referencí entit\",\n \"cancelAnnotation\": \"Zrušit anotaci\",\n \"found\": \"{count} nalezeno\",\n \"complete\": \"Anotace dokončena!\",\n \"failed\": \"Anotace selhala\",\n \"current\": \"Aktuální: {entityType}\",\n \"closeProgress\": \"Zavřít\",\n \"loading\": \"načítání...\",\n \"loadingEllipsis\": \"Načítání...\",\n \"untitledResource\": \"Zdroj bez názvu\",\n \"noText\": \"Žádný text\"\n },\n \"KeyboardShortcuts\": {\n \"title\": \"Klávesové zkratky\",\n \"closeDialog\": \"Zavřít dialog\",\n \"or\": \"nebo\",\n \"navigationTitle\": \"Navigace\",\n \"navOpenSearch\": \"Otevřít globální vyhledávání\",\n \"navOpenSearchAlt\": \"Otevřít globální vyhledávání (alternativní)\",\n \"navCreateResource\": \"Vytvořit nový zdroj\",\n \"navCloseOverlays\": \"Zavřít všechny překryvné panely (dvojité stisknutí)\",\n \"navShowHelp\": \"Zobrazit nápovědu klávesových zkratek\",\n \"sidebarTitle\": \"Postranní panel znalostí\",\n \"sidebarCollapse\": \"Sbalit postranní panel\",\n \"sidebarExpand\": \"Rozbalit postranní panel\",\n \"sidebarPickup\": \"Uchopit kartu zdroje (při zaměření)\",\n \"sidebarMove\": \"Přesunout kartu zdroje (při přetahování)\",\n \"sidebarDrop\": \"Upustit kartu zdroje (při přetahování)\",\n \"sidebarCancel\": \"Zrušit operaci přetahování\",\n \"annotationsTitle\": \"Anotace zdroje\",\n \"annotHighlight\": \"Vytvořit zvýraznění z anotace (přímo)\",\n \"annotReference\": \"Otevřít vyskakovací okno reference pro anotaci\",\n \"annotDelete\": \"Smazat zaměřenou anotaci\",\n \"annotNavigate\": \"Procházet anotace\",\n \"annotNavigateBack\": \"Procházet anotace zpětně\",\n \"listsTitle\": \"Seznamy a mřížky\",\n \"listsFilterNav\": \"Navigace ve filtrech typů entit\",\n \"listsGridNav\": \"Navigace v mřížce zdrojů\",\n \"listsJumpFirst\": \"Přeskočit na první položku\",\n \"listsJumpLast\": \"Přeskočit na poslední položku\",\n \"searchModalTitle\": \"V okně vyhledávání\",\n \"searchNav\": \"Procházet výsledky vyhledávání\",\n \"searchSelect\": \"Vybrat výsledek\",\n \"searchClose\": \"Zavřít vyhledávání\",\n \"modalTitle\": \"Ovládání modálních oken\",\n \"modalClose\": \"Zavřít aktivní modální okno\",\n \"modalNavForward\": \"Navigace vpřed přes tlačítka\",\n \"modalNavBackward\": \"Navigace zpět přes tlačítka\",\n \"modalActivate\": \"Aktivovat zaměřené tlačítko\",\n \"accessibilityTitle\": \"Přístupnost\",\n \"a11ySkipLinks\": \"Přejít na přeskočovací odkazy (na začátku stránky)\",\n \"a11yFollowLink\": \"Následovat přeskočovací odkaz\",\n \"macNote\": \"Používáte klávesové zkratky pro Mac. ⌘ je klávesa Command.\",\n \"windowsNote\": \"Používáte klávesové zkratky pro Windows/Linux. Ctrl je klávesa Control.\",\n \"footerHint\": \"Stiskněte {key} kdykoli pro zobrazení této nápovědy\",\n \"close\": \"Zavřít\"\n },\n \"AnnotateToolbar\": {\n \"modeGroup\": \"Režim\",\n \"browse\": \"Procházet\",\n \"annotate\": \"Anotovat\",\n \"selectionGroup\": \"Motivace\",\n \"clickGroup\": \"Kliknutí\",\n \"shapeGroup\": \"Tvar\",\n \"none\": \"Žádný\",\n \"linking\": \"Reference\",\n \"highlighting\": \"Zvýraznění\",\n \"assessing\": \"Hodnocení\",\n \"commenting\": \"Komentář\",\n \"tagging\": \"Štítek\",\n \"detail\": \"Detail\",\n \"follow\": \"Sledovat\",\n \"deleting\": \"Smazat\",\n \"jsonld\": \"JSON-LD\",\n \"rectangle\": \"Obdélník\",\n \"circle\": \"Kruh\",\n \"polygon\": \"Polygon\"\n },\n \"CollapsibleResourceNavigation\": {\n \"title\": \"Navigace\",\n \"collapseSidebar\": \"Sbalit postranní panel\",\n \"expandSidebar\": \"Rozbalit postranní panel\",\n \"dragToReorder\": \"Přetažením změnit pořadí\",\n \"dragToReorderDoc\": \"Přetažením změnit pořadí {name}\",\n \"closeResource\": \"Zavřít zdroj\",\n \"dragInstructions\": \"Pro změnu pořadí zdrojů: Použijte Tab pro přechod na zdroj. Stiskněte Alt+šipka nahoru pro posun nahoru nebo Alt+šipka dolů pro posun dolů. Pro přetažení: Stiskněte mezerník pro uchopení položky. Použijte šipky k jejímu přesunutí. Stiskněte mezerník znovu pro upuštění.\"\n },\n \"ResourceViewer\": {\n \"deleteConfirmationTitle\": \"Smazat anotaci\",\n \"deleteConfirmationMessage\": \"Opravdu chcete smazat tuto anotaci? Tuto akci nelze vrátit zpět.\",\n \"deleteConfirmationCancel\": \"Zrušit\",\n \"deleteConfirmationDelete\": \"Smazat\"\n },\n \"Settings\": {\n \"title\": \"Nastavení\",\n \"lineNumbers\": \"Čísla řádků\",\n \"lineNumbersVisible\": \"Viditelná\",\n \"lineNumbersHidden\": \"Skrytá\",\n \"theme\": \"Motiv\",\n \"themeLight\": \"Světlý\",\n \"themeDark\": \"Tmavý\",\n \"themeSystem\": \"Systémový\",\n \"themeSystemActive\": \"Systémový ({mode})\",\n \"themeModeActive\": \"Používá se režim {mode}\",\n \"language\": \"Jazyk\",\n \"languageHint\": \"Změňte jazyk v hlavní navigaci\",\n \"languageChanging\": \"Změna jazyka...\",\n \"hoverDelay\": \"Zpoždění při najetí\",\n \"hoverDelayFast\": \"Rychlé\",\n \"hoverDelaySlow\": \"Pomalé\",\n \"hoverDelayDescription\": \"{delay}ms zpoždění před zobrazením efektů při najetí\"\n },\n \"AnnotateView\": {},\n \"ReferenceWizard\": {\n \"gatherTitle\": \"Shromážděný kontext\",\n \"configureGenerationTitle\": \"Konfigurovat generování\",\n \"configureSearchTitle\": \"Konfigurovat hledání\",\n \"searchResultsTitle\": \"Výsledky hledání\",\n \"sourceContextLabel\": \"Kontext anotace v prostředku\",\n \"connectionsLabel\": \"Partnerské anotace\",\n \"citedByLabel\": \"Prostředek citován\",\n \"userHintLabel\": \"Nápověda\",\n \"userHintPlaceholder\": \"Popište, na co se tato anotace vztahuje...\",\n \"loadingContext\": \"Shromažďování kontextu...\",\n \"failedContext\": \"Nepodařilo se shromáždit kontext\",\n \"cancel\": \"Zrušit\",\n \"generate\": \"Generovat\",\n \"compose\": \"Sestavit\",\n \"resolutionStrategyLabel\": \"Strategie řešení\",\n \"back\": \"Zpět\",\n \"link\": \"Odkaz\",\n \"score\": \"Skóre\",\n \"noResults\": \"Žádné výsledky nenalezeny\",\n \"resourceTitle\": \"Název zdroje\",\n \"resourceTitlePlaceholder\": \"Zadejte název zdroje...\",\n \"additionalInstructions\": \"Další pokyny\",\n \"additionalInstructionsPlaceholder\": \"Zadejte další pokyny...\",\n \"language\": \"Jazyk\",\n \"languageHelp\": \"Jazyk generovaného obsahu\",\n \"creativity\": \"Kreativita\",\n \"creativityFocused\": \"Zaměřená\",\n \"creativityCreative\": \"Kreativní\",\n \"maxLength\": \"Maximální délka\",\n \"maxLengthHelp\": \"Maximální počet tokenů\",\n \"maxResults\": \"Maximální počet výsledků\",\n \"semanticScoring\": \"Sémantické hodnocení\",\n \"semanticScoringHelp\": \"Použít AI k hodnocení výsledků podle sémantické relevance\",\n \"searching\": \"Vyhledávání...\",\n \"search\": \"Hledat\"\n }\n}\n"],"mappings":"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","names":[]}