@semiont/react-ui 0.2.28 → 0.2.29-build.42

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 (106) hide show
  1. package/README.md +27 -2
  2. package/dist/{TranslationManager-8nrCwJEY.d.mts → TranslationManager-Co_5fSxl.d.mts} +2 -1
  3. package/dist/ar-TQSFB35U.mjs +325 -0
  4. package/dist/ar-TQSFB35U.mjs.map +1 -0
  5. package/dist/bn-525U24T3.mjs +325 -0
  6. package/dist/bn-525U24T3.mjs.map +1 -0
  7. package/dist/{chunk-ATHYNK3C.mjs → chunk-3JTO27MH.mjs} +7 -1
  8. package/dist/chunk-BHAP6MVA.mjs +325 -0
  9. package/dist/chunk-BHAP6MVA.mjs.map +1 -0
  10. package/dist/chunk-W6E2UESX.mjs +387 -0
  11. package/dist/chunk-W6E2UESX.mjs.map +1 -0
  12. package/dist/cs-OYWTGLFM.mjs +325 -0
  13. package/dist/cs-OYWTGLFM.mjs.map +1 -0
  14. package/dist/da-BDXG2ITK.mjs +325 -0
  15. package/dist/da-BDXG2ITK.mjs.map +1 -0
  16. package/dist/de-NB5JLMES.mjs +325 -0
  17. package/dist/de-NB5JLMES.mjs.map +1 -0
  18. package/dist/el-3SVXEAJI.mjs +325 -0
  19. package/dist/el-3SVXEAJI.mjs.map +1 -0
  20. package/dist/en-DVB4OE2R.mjs +39 -0
  21. package/dist/en-DVB4OE2R.mjs.map +1 -0
  22. package/dist/es-YBOFA3W5.mjs +325 -0
  23. package/dist/es-YBOFA3W5.mjs.map +1 -0
  24. package/dist/fa-7MU36AMY.mjs +325 -0
  25. package/dist/fa-7MU36AMY.mjs.map +1 -0
  26. package/dist/fi-PQKJB32G.mjs +325 -0
  27. package/dist/fi-PQKJB32G.mjs.map +1 -0
  28. package/dist/fr-U4HK5GM6.mjs +325 -0
  29. package/dist/fr-U4HK5GM6.mjs.map +1 -0
  30. package/dist/he-F5MNZHAL.mjs +325 -0
  31. package/dist/he-F5MNZHAL.mjs.map +1 -0
  32. package/dist/hi-2PHI37ZX.mjs +325 -0
  33. package/dist/hi-2PHI37ZX.mjs.map +1 -0
  34. package/dist/id-JPRBNCGS.mjs +325 -0
  35. package/dist/id-JPRBNCGS.mjs.map +1 -0
  36. package/dist/index.d.mts +64 -73
  37. package/dist/index.mjs +4158 -9936
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/it-MRLWI5OS.mjs +325 -0
  40. package/dist/it-MRLWI5OS.mjs.map +1 -0
  41. package/dist/ja-YQ6RPI2T.mjs +325 -0
  42. package/dist/ja-YQ6RPI2T.mjs.map +1 -0
  43. package/dist/ko-DUAVCEXX.mjs +325 -0
  44. package/dist/ko-DUAVCEXX.mjs.map +1 -0
  45. package/dist/{magic-string.es-DJUUJRO3.mjs → magic-string.es-7FJ3LUGB.mjs} +2 -2
  46. package/dist/ms-FBHSR4PG.mjs +325 -0
  47. package/dist/ms-FBHSR4PG.mjs.map +1 -0
  48. package/dist/nl-IC2MPZXN.mjs +325 -0
  49. package/dist/nl-IC2MPZXN.mjs.map +1 -0
  50. package/dist/no-LLD43NRM.mjs +325 -0
  51. package/dist/no-LLD43NRM.mjs.map +1 -0
  52. package/dist/pl-DDOJBR4D.mjs +325 -0
  53. package/dist/pl-DDOJBR4D.mjs.map +1 -0
  54. package/dist/pt-7TFHQRRN.mjs +325 -0
  55. package/dist/pt-7TFHQRRN.mjs.map +1 -0
  56. package/dist/ro-P4PJEGDU.mjs +325 -0
  57. package/dist/ro-P4PJEGDU.mjs.map +1 -0
  58. package/dist/sv-LF3VEQD2.mjs +325 -0
  59. package/dist/sv-LF3VEQD2.mjs.map +1 -0
  60. package/dist/test-utils.d.mts +1 -1
  61. package/dist/test-utils.mjs +313 -304
  62. package/dist/test-utils.mjs.map +1 -1
  63. package/dist/th-YUQAOFXF.mjs +325 -0
  64. package/dist/th-YUQAOFXF.mjs.map +1 -0
  65. package/dist/tr-CSIGLMJC.mjs +325 -0
  66. package/dist/tr-CSIGLMJC.mjs.map +1 -0
  67. package/dist/uk-LW3QBKSR.mjs +325 -0
  68. package/dist/uk-LW3QBKSR.mjs.map +1 -0
  69. package/dist/vi-W464Y6ZC.mjs +325 -0
  70. package/dist/vi-W464Y6ZC.mjs.map +1 -0
  71. package/dist/zh-R5XLM3EI.mjs +325 -0
  72. package/dist/zh-R5XLM3EI.mjs.map +1 -0
  73. package/package.json +4 -2
  74. package/translations/ar.json +287 -0
  75. package/translations/bn.json +287 -0
  76. package/translations/cs.json +287 -0
  77. package/translations/da.json +287 -0
  78. package/translations/de.json +287 -0
  79. package/translations/el.json +287 -0
  80. package/translations/en.json +287 -0
  81. package/translations/es.json +287 -0
  82. package/translations/fa.json +287 -0
  83. package/translations/fi.json +287 -0
  84. package/translations/fr.json +287 -0
  85. package/translations/he.json +287 -0
  86. package/translations/hi.json +287 -0
  87. package/translations/id.json +287 -0
  88. package/translations/it.json +287 -0
  89. package/translations/ja.json +287 -0
  90. package/translations/ko.json +287 -0
  91. package/translations/ms.json +287 -0
  92. package/translations/nl.json +287 -0
  93. package/translations/no.json +287 -0
  94. package/translations/pl.json +287 -0
  95. package/translations/pt.json +287 -0
  96. package/translations/ro.json +287 -0
  97. package/translations/sv.json +287 -0
  98. package/translations/th.json +287 -0
  99. package/translations/tr.json +287 -0
  100. package/translations/uk.json +287 -0
  101. package/translations/vi.json +287 -0
  102. package/translations/zh.json +287 -0
  103. package/dist/chunk-5ONCAANE.mjs +0 -172
  104. package/dist/chunk-5ONCAANE.mjs.map +0 -1
  105. /package/dist/{chunk-ATHYNK3C.mjs.map → chunk-3JTO27MH.mjs.map} +0 -0
  106. /package/dist/{magic-string.es-DJUUJRO3.mjs.map → magic-string.es-7FJ3LUGB.mjs.map} +0 -0
@@ -0,0 +1,287 @@
1
+ {
2
+ "Toolbar": {
3
+ "annotations": "Annotations",
4
+ "history": "History",
5
+ "resourceInfo": "Resource Info",
6
+ "collaboration": "Collaboration",
7
+ "userAccount": "User Account",
8
+ "settings": "Settings"
9
+ },
10
+ "ResourceInfoPanel": {
11
+ "locale": "Locale",
12
+ "notSpecified": "Not specified",
13
+ "entityTypeTags": "Entity Type Tags",
14
+ "representation": "Representation",
15
+ "mediaType": "Media Type",
16
+ "byteSize": "Size",
17
+ "clone": "Clone",
18
+ "cloneDescription": "Generate a shareable clone link for this resource",
19
+ "archive": "Archive",
20
+ "archiveDescription": "Move this resource to archived status",
21
+ "unarchive": "Unarchive",
22
+ "unarchiveDescription": "Restore this resource to active status"
23
+ },
24
+ "CollaborationPanel": {
25
+ "connectionStatus": "Connection Status",
26
+ "live": "Live",
27
+ "disconnected": "Disconnected",
28
+ "events": "{count} events",
29
+ "lastSync": "Last sync:",
30
+ "noActivity": "No activity yet",
31
+ "justNow": "Just now",
32
+ "secondsAgo": "{count} seconds ago",
33
+ "minuteAgo": "1 minute ago",
34
+ "minutesAgo": "{count} minutes ago",
35
+ "hourAgo": "1 hour ago",
36
+ "hoursAgo": "{count} hours ago",
37
+ "realtimeActive": "Real-time updates are active",
38
+ "reconnecting": "Reconnecting to server...",
39
+ "sharing": "Sharing",
40
+ "collaborationComingSoon": "Collaboration features coming soon"
41
+ },
42
+ "AnnotationHistory": {
43
+ "history": "History",
44
+ "loading": "Loading...",
45
+ "user": "User",
46
+ "method": "Method",
47
+ "viewOriginal": "View original",
48
+ "viewAnnotation": "View annotation: {content}",
49
+ "resourceCreated": "Created Resource",
50
+ "resourceCloned": "Cloned",
51
+ "resourceArchived": "Archived",
52
+ "resourceUnarchived": "Unarchived",
53
+ "highlightAdded": "Highlight Added",
54
+ "highlightRemoved": "Highlight Removed",
55
+ "referenceCreated": "Reference Created",
56
+ "referenceResolved": "Reference Resolved",
57
+ "referenceDeleted": "Reference Deleted",
58
+ "entitytagAdded": "Tag Added",
59
+ "entitytagRemoved": "Tag Removed",
60
+ "assessmentAdded": "Assessment Added",
61
+ "assessmentRemoved": "Assessment Removed",
62
+ "annotationAdded": "Annotation Added",
63
+ "annotationRemoved": "Annotation Removed",
64
+ "annotationBodyUpdated": "Annotation Updated",
65
+ "jobEvent": "Job Event",
66
+ "justNow": "just now",
67
+ "minutesAgo": "{count}m ago",
68
+ "hoursAgo": "{count}h ago",
69
+ "daysAgo": "{count}d ago"
70
+ },
71
+ "CommentsPanel": {
72
+ "title": "Comments",
73
+ "noComments": "No comments yet. Select text and click Comment to add one.",
74
+ "commentPlaceholder": "Type your comment here...",
75
+ "save": "Save",
76
+ "cancel": "Cancel",
77
+ "edit": "Edit",
78
+ "detectComments": "Detect Comments",
79
+ "instructions": "Instructions",
80
+ "optional": "(optional)",
81
+ "instructionsPlaceholder": "e.g., Focus on technical terminology...",
82
+ "detect": "Detect",
83
+ "detecting": "Detecting...",
84
+ "toneLabel": "Tone",
85
+ "toneOptional": "(optional)",
86
+ "toneScholarly": "Scholarly",
87
+ "toneExplanatory": "Explanatory",
88
+ "toneConversational": "Conversational",
89
+ "toneTechnical": "Technical",
90
+ "densityLabel": "Density",
91
+ "densitySparse": "Sparse",
92
+ "densityDense": "Dense"
93
+ },
94
+ "HighlightPanel": {
95
+ "title": "Highlights",
96
+ "noHighlights": "No highlights yet. Use AI detection to find important passages.",
97
+ "detectHighlights": "Detect Highlights",
98
+ "instructions": "Instructions",
99
+ "optional": "(optional)",
100
+ "instructionsPlaceholder": "e.g., Focus on key technical concepts...",
101
+ "detect": "Detect",
102
+ "detecting": "Detecting...",
103
+ "cancel": "Cancel",
104
+ "densityLabel": "Density",
105
+ "densitySparse": "Sparse",
106
+ "densityDense": "Dense"
107
+ },
108
+ "AssessmentPanel": {
109
+ "title": "Assessments",
110
+ "noAssessments": "No assessments yet. Use AI detection to evaluate passages.",
111
+ "detectAssessments": "Detect Assessments",
112
+ "instructions": "Instructions",
113
+ "optional": "(optional)",
114
+ "instructionsPlaceholder": "e.g., Evaluate claims for accuracy and evidence...",
115
+ "detect": "Detect",
116
+ "detecting": "Detecting...",
117
+ "cancel": "Cancel",
118
+ "toneLabel": "Tone",
119
+ "toneOptional": "(optional)",
120
+ "toneAnalytical": "Analytical",
121
+ "toneCritical": "Critical",
122
+ "toneBalanced": "Balanced",
123
+ "toneConstructive": "Constructive",
124
+ "densityLabel": "Density",
125
+ "densitySparse": "Sparse",
126
+ "densityDense": "Dense"
127
+ },
128
+ "TaggingPanel": {
129
+ "title": "Tags",
130
+ "noTags": "No tags yet. Use AI detection to identify structural roles.",
131
+ "detectTags": "Detect Tags",
132
+ "selectSchema": "Select Framework",
133
+ "schemaLegal": "Legal Analysis (IRAC)",
134
+ "schemaScientific": "Scientific Paper (IMRAD)",
135
+ "schemaArgument": "Argument Structure (Toulmin)",
136
+ "selectCategories": "Select Categories",
137
+ "categoryIssue": "Issue",
138
+ "categoryRule": "Rule",
139
+ "categoryApplication": "Application",
140
+ "categoryConclusion": "Conclusion",
141
+ "categoryIntroduction": "Introduction",
142
+ "categoryMethods": "Methods",
143
+ "categoryResults": "Results",
144
+ "categoryDiscussion": "Discussion",
145
+ "categoryClaim": "Claim",
146
+ "categoryEvidence": "Evidence",
147
+ "categoryWarrant": "Warrant",
148
+ "categoryCounterargument": "Counterargument",
149
+ "categoryRebuttal": "Rebuttal",
150
+ "detect": "Detect",
151
+ "detecting": "Detecting...",
152
+ "cancel": "Cancel",
153
+ "selectAll": "Select All",
154
+ "deselectAll": "Deselect All",
155
+ "categoriesSelected": "{count, plural, =0 {No categories selected} =1 {1 category selected} other {# categories selected}}",
156
+ "createTagForSelection": "Create Tag for Selection",
157
+ "selectCategory": "Select Category",
158
+ "chooseCategory": "Choose a category..."
159
+ },
160
+ "UnifiedAnnotationsPanel": {
161
+ "statistics": "Statistics",
162
+ "highlight": "Highlights",
163
+ "reference": "References",
164
+ "assessment": "Assessments",
165
+ "comment": "Comments",
166
+ "tag": "Tags"
167
+ },
168
+ "StatisticsPanel": {
169
+ "title": "Statistics",
170
+ "highlights": "Highlights",
171
+ "comments": "Comments",
172
+ "assessments": "Assessments",
173
+ "tags": "Tags",
174
+ "references": "References",
175
+ "stub": "Stub",
176
+ "resolved": "Resolved",
177
+ "entityTypes": "Entity Types"
178
+ },
179
+ "DetectPanel": {
180
+ "title": "Detect References",
181
+ "selectEntityTypes": "Entity types:",
182
+ "select": "Select",
183
+ "deselect": "Deselect",
184
+ "noEntityTypes": "No entity types available",
185
+ "typesSelected": "{count, plural, =1 {1 type selected} other {# types selected}}",
186
+ "startDetection": "Detect",
187
+ "found": "{count} found",
188
+ "more": "More"
189
+ },
190
+ "DetectionProgressWidget": {
191
+ "title": "Detecting Entity References",
192
+ "cancelDetection": "Cancel detection",
193
+ "found": "{count} found",
194
+ "complete": "Detection complete!",
195
+ "failed": "Detection failed",
196
+ "current": "Current: {entityType}"
197
+ },
198
+ "ReferencesPanel": {
199
+ "referencesTitle": "References",
200
+ "outgoingReferences": "Outgoing References",
201
+ "noReferences": "No references yet",
202
+ "stub": "Stub reference (not linked)",
203
+ "resolved": "Resolved reference (linked)",
204
+ "open": "Open",
205
+ "unlink": "Unlink",
206
+ "generate": "Generate",
207
+ "find": "Find",
208
+ "create": "Create",
209
+ "incomingReferences": "Incoming References",
210
+ "loading": "loading...",
211
+ "loadingEllipsis": "Loading...",
212
+ "noIncomingReferences": "No incoming references",
213
+ "untitledResource": "Untitled Resource",
214
+ "noText": "No text",
215
+ "createReference": "Create Reference",
216
+ "entityTypesOptional": "Entity Types (Optional)",
217
+ "imageRegionSelected": "Image region selected",
218
+ "includeDescriptiveReferences": "Include descriptive references",
219
+ "descriptiveReferencesTooltip": "Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)"
220
+ },
221
+ "KeyboardShortcuts": {
222
+ "title": "Keyboard Shortcuts",
223
+ "closeDialog": "Close dialog",
224
+ "or": "or",
225
+ "navigationTitle": "Navigation",
226
+ "navOpenSearch": "Open global search",
227
+ "navOpenSearchAlt": "Open global search (alternative)",
228
+ "navCreateResource": "Create new resource",
229
+ "navCloseOverlays": "Close all overlays (double press)",
230
+ "navShowHelp": "Show keyboard shortcuts help",
231
+ "sidebarTitle": "Knowledge Sidebar",
232
+ "sidebarCollapse": "Collapse sidebar",
233
+ "sidebarExpand": "Expand sidebar",
234
+ "sidebarPickup": "Pick up resource tab (when focused)",
235
+ "sidebarMove": "Move resource tab (when dragging)",
236
+ "sidebarDrop": "Drop resource tab (when dragging)",
237
+ "sidebarCancel": "Cancel drag operation",
238
+ "annotationsTitle": "Resource Annotations",
239
+ "annotHighlight": "Create highlight from annotation (direct)",
240
+ "annotReference": "Open reference popup for annotation",
241
+ "annotDelete": "Delete focused annotation",
242
+ "annotNavigate": "Navigate through annotations",
243
+ "annotNavigateBack": "Navigate annotations backward",
244
+ "listsTitle": "Lists & Grids",
245
+ "listsFilterNav": "Navigate entity type filters",
246
+ "listsGridNav": "Navigate resource grid",
247
+ "listsJumpFirst": "Jump to first item",
248
+ "listsJumpLast": "Jump to last item",
249
+ "searchModalTitle": "In Search Modal",
250
+ "searchNav": "Navigate search results",
251
+ "searchSelect": "Select result",
252
+ "searchClose": "Close search",
253
+ "modalTitle": "Modal Controls",
254
+ "modalClose": "Close active modal",
255
+ "modalNavForward": "Navigate forward through buttons",
256
+ "modalNavBackward": "Navigate backward through buttons",
257
+ "modalActivate": "Activate focused button",
258
+ "accessibilityTitle": "Accessibility",
259
+ "a11ySkipLinks": "Navigate to skip links (when at page start)",
260
+ "a11yFollowLink": "Follow skip link",
261
+ "macNote": "Using Mac keyboard shortcuts. ⌘ is the Command key.",
262
+ "windowsNote": "Using Windows/Linux keyboard shortcuts. Ctrl is the Control key.",
263
+ "footerHint": "Press {key} anytime to show this help",
264
+ "close": "Close"
265
+ },
266
+ "AnnotateToolbar": {
267
+ "modeGroup": "Mode",
268
+ "browse": "Browse",
269
+ "annotate": "Annotate",
270
+ "selectionGroup": "Motivation",
271
+ "clickGroup": "Click",
272
+ "shapeGroup": "Shape",
273
+ "none": "None",
274
+ "linking": "Reference",
275
+ "highlighting": "Highlight",
276
+ "assessing": "Assess",
277
+ "commenting": "Comment",
278
+ "tagging": "Tag",
279
+ "detail": "Detail",
280
+ "follow": "Follow",
281
+ "deleting": "Delete",
282
+ "jsonld": "JSON-LD",
283
+ "rectangle": "Rectangle",
284
+ "circle": "Circle",
285
+ "polygon": "Polygon"
286
+ }
287
+ }
@@ -1,172 +0,0 @@
1
- 'use client';
2
-
3
- // src/contexts/ApiClientContext.tsx
4
- import { createContext, useContext } from "react";
5
- import { jsx } from "react/jsx-runtime";
6
- var ApiClientContext = createContext(null);
7
- function ApiClientProvider({
8
- apiClientManager,
9
- children
10
- }) {
11
- return /* @__PURE__ */ jsx(ApiClientContext.Provider, { value: apiClientManager, children });
12
- }
13
- function useApiClient() {
14
- const context = useContext(ApiClientContext);
15
- if (!context) {
16
- throw new Error("useApiClient must be used within an ApiClientProvider");
17
- }
18
- return context.client;
19
- }
20
-
21
- // src/contexts/SessionContext.tsx
22
- import { createContext as createContext2, useContext as useContext2 } from "react";
23
- import { jsx as jsx2 } from "react/jsx-runtime";
24
- var SessionContext = createContext2(null);
25
- function SessionProvider({
26
- sessionManager,
27
- children
28
- }) {
29
- return /* @__PURE__ */ jsx2(SessionContext.Provider, { value: sessionManager, children });
30
- }
31
- function useSessionContext() {
32
- const context = useContext2(SessionContext);
33
- if (!context) {
34
- throw new Error("useSessionContext must be used within SessionProvider");
35
- }
36
- return context;
37
- }
38
-
39
- // src/contexts/OpenResourcesContext.tsx
40
- import { createContext as createContext3, useContext as useContext3 } from "react";
41
- import { jsx as jsx3 } from "react/jsx-runtime";
42
- var OpenResourcesContext = createContext3(void 0);
43
- function OpenResourcesProvider({
44
- openResourcesManager,
45
- children
46
- }) {
47
- return /* @__PURE__ */ jsx3(OpenResourcesContext.Provider, { value: openResourcesManager, children });
48
- }
49
- function useOpenResources() {
50
- const context = useContext3(OpenResourcesContext);
51
- if (context === void 0) {
52
- throw new Error("useOpenResources must be used within an OpenResourcesProvider");
53
- }
54
- return context;
55
- }
56
-
57
- // src/contexts/TranslationContext.tsx
58
- import { createContext as createContext4, useContext as useContext4 } from "react";
59
- import { jsx as jsx4 } from "react/jsx-runtime";
60
- var TranslationContext = createContext4(null);
61
- function TranslationProvider({
62
- translationManager,
63
- children
64
- }) {
65
- return /* @__PURE__ */ jsx4(TranslationContext.Provider, { value: translationManager, children });
66
- }
67
- function useTranslations(namespace) {
68
- const context = useContext4(TranslationContext);
69
- if (!context) {
70
- throw new Error("useTranslations must be used within a TranslationProvider");
71
- }
72
- return (key) => context.t(namespace, key);
73
- }
74
-
75
- // src/components/Toast.tsx
76
- import React4, { useEffect, useState } from "react";
77
- import { createPortal } from "react-dom";
78
- import { jsx as jsx5, jsxs } from "react/jsx-runtime";
79
- var icons = {
80
- success: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
81
- error: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
82
- warning: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }),
83
- info: /* @__PURE__ */ jsx5("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) })
84
- };
85
- var styles = {
86
- success: "bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 border-green-200 dark:border-green-800",
87
- error: "bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 border-red-200 dark:border-red-800",
88
- warning: "bg-yellow-50 dark:bg-yellow-900/20 text-yellow-800 dark:text-yellow-200 border-yellow-200 dark:border-yellow-800",
89
- info: "bg-blue-50 dark:bg-blue-900/20 text-blue-800 dark:text-blue-200 border-blue-200 dark:border-blue-800"
90
- };
91
- function Toast({ toast, onClose }) {
92
- useEffect(() => {
93
- const timer = setTimeout(() => {
94
- onClose(toast.id);
95
- }, toast.duration || 3e3);
96
- return () => clearTimeout(timer);
97
- }, [toast, onClose]);
98
- return /* @__PURE__ */ jsxs(
99
- "div",
100
- {
101
- className: `flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg transition-all duration-300 transform ${styles[toast.type]}`,
102
- role: "alert",
103
- children: [
104
- /* @__PURE__ */ jsx5("div", { className: "flex-shrink-0", children: icons[toast.type] }),
105
- /* @__PURE__ */ jsx5("p", { className: "text-sm font-medium", children: toast.message }),
106
- /* @__PURE__ */ jsx5(
107
- "button",
108
- {
109
- onClick: () => onClose(toast.id),
110
- className: "ml-auto flex-shrink-0 hover:opacity-70 transition-opacity",
111
- "aria-label": "Close",
112
- children: /* @__PURE__ */ jsx5("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
113
- }
114
- )
115
- ]
116
- }
117
- );
118
- }
119
- function ToastContainer({ toasts, onClose }) {
120
- const [mounted, setMounted] = useState(false);
121
- useEffect(() => {
122
- setMounted(true);
123
- return () => setMounted(false);
124
- }, []);
125
- if (!mounted) return null;
126
- return createPortal(
127
- /* @__PURE__ */ jsx5("div", { className: "fixed top-4 right-4 z-50 space-y-2 max-w-sm", children: toasts.map((toast) => /* @__PURE__ */ jsx5(Toast, { toast, onClose }, toast.id)) }),
128
- document.body
129
- );
130
- }
131
- var ToastContext = React4.createContext(void 0);
132
- function ToastProvider({ children }) {
133
- const [toasts, setToasts] = useState([]);
134
- const showToast = (message, type = "info", duration) => {
135
- const id = Date.now().toString();
136
- const newToast = duration !== void 0 ? { id, message, type, duration } : { id, message, type };
137
- setToasts((prev) => [...prev, newToast]);
138
- };
139
- const showSuccess = (message, duration) => showToast(message, "success", duration);
140
- const showError = (message, duration) => showToast(message, "error", duration);
141
- const showWarning = (message, duration) => showToast(message, "warning", duration);
142
- const showInfo = (message, duration) => showToast(message, "info", duration);
143
- const handleClose = (id) => {
144
- setToasts((prev) => prev.filter((toast) => toast.id !== id));
145
- };
146
- return /* @__PURE__ */ jsxs(ToastContext.Provider, { value: { showToast, showSuccess, showError, showWarning, showInfo }, children: [
147
- children,
148
- /* @__PURE__ */ jsx5(ToastContainer, { toasts, onClose: handleClose })
149
- ] });
150
- }
151
- function useToast() {
152
- const context = React4.useContext(ToastContext);
153
- if (context === void 0) {
154
- throw new Error("useToast must be used within a ToastProvider");
155
- }
156
- return context;
157
- }
158
-
159
- export {
160
- ApiClientProvider,
161
- useApiClient,
162
- SessionProvider,
163
- useSessionContext,
164
- OpenResourcesProvider,
165
- useOpenResources,
166
- TranslationProvider,
167
- useTranslations,
168
- ToastContainer,
169
- ToastProvider,
170
- useToast
171
- };
172
- //# sourceMappingURL=chunk-5ONCAANE.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/contexts/ApiClientContext.tsx","../src/contexts/SessionContext.tsx","../src/contexts/OpenResourcesContext.tsx","../src/contexts/TranslationContext.tsx","../src/components/Toast.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport type { ApiClientManager } from '../types/ApiClientManager';\n\nconst ApiClientContext = createContext<ApiClientManager | null>(null);\n\nexport interface ApiClientProviderProps {\n apiClientManager: ApiClientManager;\n children: ReactNode;\n}\n\n/**\n * Provider for API client management\n * Apps must provide an ApiClientManager implementation\n */\nexport function ApiClientProvider({\n apiClientManager,\n children,\n}: ApiClientProviderProps) {\n return (\n <ApiClientContext.Provider value={apiClientManager}>\n {children}\n </ApiClientContext.Provider>\n );\n}\n\n/**\n * Hook to access the API client\n * Must be used within an ApiClientProvider\n * @returns API client instance (null if not authenticated)\n */\nexport function useApiClient() {\n const context = useContext(ApiClientContext);\n\n if (!context) {\n throw new Error('useApiClient must be used within an ApiClientProvider');\n }\n\n return context.client;\n}\n","'use client';\n\nimport { createContext, useContext, ReactNode } from 'react';\nimport type { SessionManager } from '../types/SessionManager';\n\nconst SessionContext = createContext<SessionManager | null>(null);\n\n/**\n * Provider Pattern: Accepts SessionManager implementation as prop\n * and makes it available to child components via Context.\n *\n * Apps provide their own implementation (next-auth, custom auth, etc.)\n * and pass it to this provider at the root level.\n *\n * @example\n * ```tsx\n * // In app root\n * const sessionManager = useSessionManager(); // App's implementation\n *\n * <SessionProvider sessionManager={sessionManager}>\n * <App />\n * </SessionProvider>\n * ```\n */\nexport function SessionProvider({\n sessionManager,\n children\n}: {\n sessionManager: SessionManager;\n children: ReactNode;\n}) {\n return (\n <SessionContext.Provider value={sessionManager}>\n {children}\n </SessionContext.Provider>\n );\n}\n\n/**\n * Hook to access SessionManager from Context\n * Components use this hook to access session state and expiry information\n */\nexport function useSessionContext() {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSessionContext must be used within SessionProvider');\n }\n return context;\n}","'use client';\n\nimport React, { createContext, useContext } from 'react';\nimport type { OpenResourcesManager } from '../types/OpenResourcesManager';\n\nconst OpenResourcesContext = createContext<OpenResourcesManager | undefined>(undefined);\n\n/**\n * Provider Pattern: Accepts OpenResourcesManager implementation as prop\n * and makes it available to child components via Context.\n *\n * Apps provide their own implementation (localStorage, sessionStorage, database, etc.)\n * and pass it to this provider at the root level.\n *\n * @example\n * ```tsx\n * // In app root\n * const openResourcesManager = useOpenResourcesManager(); // App's implementation\n *\n * <OpenResourcesProvider openResourcesManager={openResourcesManager}>\n * <App />\n * </OpenResourcesProvider>\n * ```\n */\nexport function OpenResourcesProvider({\n openResourcesManager,\n children\n}: {\n openResourcesManager: OpenResourcesManager;\n children: React.ReactNode;\n}) {\n return (\n <OpenResourcesContext.Provider value={openResourcesManager}>\n {children}\n </OpenResourcesContext.Provider>\n );\n}\n\n/**\n * Hook to access OpenResourcesManager from Context\n * Components use this hook to access open resources functionality\n */\nexport function useOpenResources(): OpenResourcesManager {\n const context = useContext(OpenResourcesContext);\n if (context === undefined) {\n throw new Error('useOpenResources must be used within an OpenResourcesProvider');\n }\n return context;\n}","'use client';\n\nimport React, { createContext, useContext, ReactNode } from 'react';\nimport type { TranslationManager } from '../types/TranslationManager';\n\nconst TranslationContext = createContext<TranslationManager | null>(null);\n\nexport interface TranslationProviderProps {\n translationManager: TranslationManager;\n children: ReactNode;\n}\n\n/**\n * Provider for translation management\n * Apps must provide a TranslationManager implementation\n */\nexport function TranslationProvider({\n translationManager,\n children,\n}: TranslationProviderProps) {\n return (\n <TranslationContext.Provider value={translationManager}>\n {children}\n </TranslationContext.Provider>\n );\n}\n\n/**\n * Hook to access translations within a namespace\n * Must be used within a TranslationProvider\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 (!context) {\n throw new Error('useTranslations must be used within a TranslationProvider');\n }\n\n // Return a function that translates keys within this namespace\n return (key: string) => context.t(namespace, key);\n}\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\nexport interface ToastMessage {\n id: string;\n message: string;\n type: ToastType;\n duration?: number;\n}\n\ninterface ToastProps {\n toast: ToastMessage;\n onClose: (id: string) => void;\n}\n\nconst icons = {\n success: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n ),\n error: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ),\n warning: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n ),\n info: (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n ),\n};\n\nconst styles = {\n success: 'bg-green-50 dark:bg-green-900/20 text-green-800 dark:text-green-200 border-green-200 dark:border-green-800',\n error: 'bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 border-red-200 dark:border-red-800',\n warning: 'bg-yellow-50 dark:bg-yellow-900/20 text-yellow-800 dark:text-yellow-200 border-yellow-200 dark:border-yellow-800',\n info: 'bg-blue-50 dark:bg-blue-900/20 text-blue-800 dark:text-blue-200 border-blue-200 dark:border-blue-800',\n};\n\nfunction Toast({ toast, onClose }: ToastProps) {\n useEffect(() => {\n const timer = setTimeout(() => {\n onClose(toast.id);\n }, toast.duration || 3000);\n\n return () => clearTimeout(timer);\n }, [toast, onClose]);\n\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3 rounded-lg border shadow-lg transition-all duration-300 transform ${styles[toast.type]}`}\n role=\"alert\"\n >\n <div className=\"flex-shrink-0\">{icons[toast.type]}</div>\n <p className=\"text-sm font-medium\">{toast.message}</p>\n <button\n onClick={() => onClose(toast.id)}\n className=\"ml-auto flex-shrink-0 hover:opacity-70 transition-opacity\"\n aria-label=\"Close\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n );\n}\n\ninterface ToastContainerProps {\n toasts: ToastMessage[];\n onClose: (id: string) => void;\n}\n\nexport function ToastContainer({ toasts, onClose }: ToastContainerProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n if (!mounted) return null;\n\n return createPortal(\n <div className=\"fixed top-4 right-4 z-50 space-y-2 max-w-sm\">\n {toasts.map((toast) => (\n <Toast key={toast.id} toast={toast} onClose={onClose} />\n ))}\n </div>,\n document.body\n );\n}\n\n// Toast context and hook for global toast management\ninterface ToastContextType {\n showToast: (message: string, type?: ToastType, duration?: number) => void;\n showSuccess: (message: string, duration?: number) => void;\n showError: (message: string, duration?: number) => void;\n showWarning: (message: string, duration?: number) => void;\n showInfo: (message: string, duration?: number) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextType | undefined>(undefined);\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<ToastMessage[]>([]);\n\n const showToast = (message: string, type: ToastType = 'info', duration?: number) => {\n const id = Date.now().toString();\n const newToast: ToastMessage = duration !== undefined \n ? { id, message, type, duration }\n : { id, message, type };\n setToasts((prev) => [...prev, newToast]);\n };\n\n const showSuccess = (message: string, duration?: number) => showToast(message, 'success', duration);\n const showError = (message: string, duration?: number) => showToast(message, 'error', duration);\n const showWarning = (message: string, duration?: number) => showToast(message, 'warning', duration);\n const showInfo = (message: string, duration?: number) => showToast(message, 'info', duration);\n\n const handleClose = (id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n };\n\n return (\n <ToastContext.Provider value={{ showToast, showSuccess, showError, showWarning, showInfo }}>\n {children}\n <ToastContainer toasts={toasts} onClose={handleClose} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const context = React.useContext(ToastContext);\n if (context === undefined) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n}"],"mappings":"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","names":["createContext","useContext","jsx","createContext","useContext","jsx","createContext","useContext","jsx","React","jsx"]}