@semiont/react-ui 0.2.33-build.79 → 0.2.33-build.80

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 (213) hide show
  1. package/dist/EventBusContext-7GvDyO0d.d.mts +414 -0
  2. package/dist/{PdfAnnotationCanvas.client-ADC4FFSE.mjs → PdfAnnotationCanvas.client-RAJRPQLU.mjs} +42 -27
  3. package/dist/PdfAnnotationCanvas.client-RAJRPQLU.mjs.map +1 -0
  4. package/dist/{ar-EMHEHPCJ.mjs → ar-4ZEORRW2.mjs} +7 -4
  5. package/dist/ar-4ZEORRW2.mjs.map +1 -0
  6. package/dist/{bn-OVCI4F6X.mjs → bn-SEDE5BQJ.mjs} +7 -4
  7. package/dist/bn-SEDE5BQJ.mjs.map +1 -0
  8. package/dist/{chunk-LIHZTECW.mjs → chunk-D7NBW4RV.mjs} +7 -4
  9. package/dist/chunk-D7NBW4RV.mjs.map +1 -0
  10. package/dist/{chunk-JZIO2A3B.mjs → chunk-ZR4ZV2LY.mjs} +206 -146
  11. package/dist/chunk-ZR4ZV2LY.mjs.map +1 -0
  12. package/dist/{cs-FAN66Q2F.mjs → cs-7W4WF5WD.mjs} +7 -4
  13. package/dist/cs-7W4WF5WD.mjs.map +1 -0
  14. package/dist/{da-YBBIHI2O.mjs → da-75XGBCBK.mjs} +7 -4
  15. package/dist/da-75XGBCBK.mjs.map +1 -0
  16. package/dist/{de-MAYU33LB.mjs → de-ODJVFLHM.mjs} +7 -4
  17. package/dist/de-ODJVFLHM.mjs.map +1 -0
  18. package/dist/{el-MKGSWN4O.mjs → el-C4PM4WB3.mjs} +7 -4
  19. package/dist/el-C4PM4WB3.mjs.map +1 -0
  20. package/dist/{en-DDLIXJCU.mjs → en-KJCJQ4OO.mjs} +2 -2
  21. package/dist/{es-52LHUWJD.mjs → es-WD33R7QL.mjs} +7 -4
  22. package/dist/es-WD33R7QL.mjs.map +1 -0
  23. package/dist/{fa-FJICRANB.mjs → fa-2BP6V56P.mjs} +7 -4
  24. package/dist/fa-2BP6V56P.mjs.map +1 -0
  25. package/dist/{fi-O455XFCR.mjs → fi-USRRW24J.mjs} +7 -4
  26. package/dist/fi-USRRW24J.mjs.map +1 -0
  27. package/dist/{fr-TXIXHOOE.mjs → fr-EC5S6WVF.mjs} +7 -4
  28. package/dist/fr-EC5S6WVF.mjs.map +1 -0
  29. package/dist/{he-JBSOX5IN.mjs → he-7TBVIKAA.mjs} +7 -4
  30. package/dist/he-7TBVIKAA.mjs.map +1 -0
  31. package/dist/{hi-KGHI3XVT.mjs → hi-FO4VIZLA.mjs} +7 -4
  32. package/dist/hi-FO4VIZLA.mjs.map +1 -0
  33. package/dist/{id-5OCPPZLO.mjs → id-7U7GGVWY.mjs} +7 -4
  34. package/dist/id-7U7GGVWY.mjs.map +1 -0
  35. package/dist/index.css +123 -85
  36. package/dist/index.css.map +1 -1
  37. package/dist/index.d.mts +645 -471
  38. package/dist/index.mjs +3461 -3025
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/{it-PNBBZSM2.mjs → it-Y4OPL6I2.mjs} +7 -4
  41. package/dist/it-Y4OPL6I2.mjs.map +1 -0
  42. package/dist/{ja-LDD7R3TJ.mjs → ja-PK7SQL55.mjs} +7 -4
  43. package/dist/ja-PK7SQL55.mjs.map +1 -0
  44. package/dist/{ko-F47ZDEY3.mjs → ko-L25PXMYD.mjs} +7 -4
  45. package/dist/ko-L25PXMYD.mjs.map +1 -0
  46. package/dist/{ms-Z7LMXJWL.mjs → ms-STH777QM.mjs} +7 -4
  47. package/dist/ms-STH777QM.mjs.map +1 -0
  48. package/dist/{nl-6SJFBPJ3.mjs → nl-Y7LECDDR.mjs} +7 -4
  49. package/dist/nl-Y7LECDDR.mjs.map +1 -0
  50. package/dist/{no-YXPBPSGF.mjs → no-KEKCEWU6.mjs} +7 -4
  51. package/dist/no-KEKCEWU6.mjs.map +1 -0
  52. package/dist/{pl-P4AZ2QME.mjs → pl-7A7OC75O.mjs} +7 -4
  53. package/dist/pl-7A7OC75O.mjs.map +1 -0
  54. package/dist/{pt-LHWUS6U6.mjs → pt-35HTM7RA.mjs} +7 -4
  55. package/dist/pt-35HTM7RA.mjs.map +1 -0
  56. package/dist/{ro-EA5J2ZON.mjs → ro-VAWL5KQA.mjs} +7 -4
  57. package/dist/ro-VAWL5KQA.mjs.map +1 -0
  58. package/dist/{sv-DATBS3UQ.mjs → sv-7ZK5EQEB.mjs} +7 -4
  59. package/dist/sv-7ZK5EQEB.mjs.map +1 -0
  60. package/dist/test-utils.d.mts +18 -8
  61. package/dist/test-utils.mjs +36 -14
  62. package/dist/test-utils.mjs.map +1 -1
  63. package/dist/{th-WTFJRWPT.mjs → th-UDWZ4X34.mjs} +7 -4
  64. package/dist/th-UDWZ4X34.mjs.map +1 -0
  65. package/dist/{tr-IKO3RXOX.mjs → tr-4WMPK3UX.mjs} +7 -4
  66. package/dist/tr-4WMPK3UX.mjs.map +1 -0
  67. package/dist/{uk-CF6CTTRK.mjs → uk-SSLASQYJ.mjs} +7 -4
  68. package/dist/uk-SSLASQYJ.mjs.map +1 -0
  69. package/dist/{vi-AJLTXPZQ.mjs → vi-IF42Z5PU.mjs} +7 -4
  70. package/dist/vi-IF42Z5PU.mjs.map +1 -0
  71. package/dist/{zh-U3ORHHYH.mjs → zh-HRQTNTAI.mjs} +7 -4
  72. package/dist/zh-HRQTNTAI.mjs.map +1 -0
  73. package/package.json +3 -1
  74. package/src/components/CodeMirrorRenderer.tsx +66 -93
  75. package/src/components/DetectionProgressWidget.tsx +16 -5
  76. package/src/components/LiveRegion.tsx +18 -18
  77. package/src/components/ResizeHandle.tsx +10 -4
  78. package/src/components/SessionTimer.tsx +2 -2
  79. package/src/components/Toolbar.tsx +18 -9
  80. package/src/components/__tests__/SessionTimer.test.tsx +9 -9
  81. package/src/components/annotation/AnnotateToolbar.tsx +17 -15
  82. package/src/components/annotation/__tests__/AnnotateToolbar.test.tsx +165 -63
  83. package/src/components/annotation/annotation-entries.css +10 -0
  84. package/src/components/annotation-popups/JsonLdView.tsx +8 -2
  85. package/src/components/image-annotation/AnnotationOverlay.tsx +42 -22
  86. package/src/components/image-annotation/SvgDrawingCanvas.tsx +27 -30
  87. package/src/components/layout/__tests__/LeftSidebar.test.tsx +12 -33
  88. package/src/components/layout/__tests__/PageLayout.test.tsx +37 -32
  89. package/src/components/layout/__tests__/UnifiedHeader.test.tsx +21 -40
  90. package/src/components/modals/ResourceSearchModal.tsx +2 -2
  91. package/src/components/modals/SearchModal.tsx +1 -1
  92. package/src/components/navigation/CollapsibleResourceNavigation.tsx +14 -9
  93. package/src/components/navigation/NavigationTabs.css +36 -24
  94. package/src/components/navigation/ObservableLink.tsx +91 -0
  95. package/src/components/navigation/SimpleNavigation.tsx +20 -16
  96. package/src/components/navigation/SortableResourceTab.tsx +11 -5
  97. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +51 -26
  98. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +28 -22
  99. package/src/components/resource/AnnotateView.tsx +64 -134
  100. package/src/components/resource/BrowseView.tsx +86 -166
  101. package/src/components/resource/HistoryEvent.tsx +13 -7
  102. package/src/components/resource/ResourceViewer.tsx +122 -264
  103. package/src/components/resource/__tests__/BrowseView.test.tsx +631 -0
  104. package/src/components/resource/__tests__/ResourceViewer.mode-switch.test.tsx +231 -0
  105. package/src/components/resource/panels/AssessmentEntry.tsx +25 -33
  106. package/src/components/resource/panels/AssessmentPanel.tsx +106 -28
  107. package/src/components/resource/panels/CommentEntry.tsx +38 -32
  108. package/src/components/resource/panels/CommentsPanel.tsx +121 -28
  109. package/src/components/resource/panels/DetectSection.css +36 -1
  110. package/src/components/resource/panels/DetectSection.tsx +38 -10
  111. package/src/components/resource/panels/HighlightEntry.tsx +25 -33
  112. package/src/components/resource/panels/HighlightPanel.tsx +100 -25
  113. package/src/components/resource/panels/ReferenceEntry.tsx +61 -75
  114. package/src/components/resource/panels/ReferencesPanel.tsx +134 -42
  115. package/src/components/resource/panels/ResourceInfoPanel.tsx +47 -48
  116. package/src/components/resource/panels/TagEntry.tsx +25 -33
  117. package/src/components/resource/panels/TaggingPanel.tsx +119 -30
  118. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +30 -92
  119. package/src/components/resource/panels/__tests__/AssessmentPanel.test.tsx +129 -110
  120. package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +86 -78
  121. package/src/components/resource/panels/__tests__/CommentsPanel.test.tsx +144 -149
  122. package/src/components/resource/panels/__tests__/DetectSection.test.tsx +480 -0
  123. package/src/components/resource/panels/__tests__/HighlightPanel.detectionProgress.test.tsx +362 -0
  124. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +226 -111
  125. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +117 -61
  126. package/src/components/resource/panels/__tests__/TaggingPanel.test.tsx +128 -106
  127. package/src/components/settings/SettingsPanel.tsx +15 -12
  128. package/src/features/admin-devops/__tests__/AdminDevOpsPage.test.tsx +1 -46
  129. package/src/features/admin-devops/components/AdminDevOpsPage.tsx +0 -9
  130. package/src/features/admin-security/__tests__/AdminSecurityPage.test.tsx +0 -3
  131. package/src/features/admin-security/components/AdminSecurityPage.tsx +0 -9
  132. package/src/features/admin-users/__tests__/AdminUsersPage.test.tsx +0 -3
  133. package/src/features/admin-users/components/AdminUsersPage.tsx +0 -9
  134. package/src/features/moderate-entity-tags/__tests__/EntityTagsPage.test.tsx +0 -3
  135. package/src/features/moderate-entity-tags/components/EntityTagsPage.tsx +1 -9
  136. package/src/features/moderate-recent/__tests__/RecentDocumentsPage.test.tsx +0 -32
  137. package/src/features/moderate-recent/components/RecentDocumentsPage.tsx +1 -9
  138. package/src/features/moderate-tag-schemas/__tests__/TagSchemasPage.test.tsx +0 -32
  139. package/src/features/moderate-tag-schemas/components/TagSchemasPage.tsx +1 -9
  140. package/src/features/resource-compose/__tests__/ResourceComposePage.test.tsx +51 -54
  141. package/src/features/resource-compose/components/ResourceComposePage.tsx +3 -13
  142. package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +39 -45
  143. package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +9 -13
  144. package/src/features/resource-viewer/__tests__/AnnotationDeletionIntegration.test.tsx +231 -0
  145. package/src/features/resource-viewer/__tests__/DetectionFlowBug.test.tsx +234 -0
  146. package/src/features/resource-viewer/__tests__/DetectionFlowIntegration.test.tsx +388 -0
  147. package/src/features/resource-viewer/__tests__/DetectionProgressDismissal.test.tsx +318 -0
  148. package/src/features/resource-viewer/__tests__/GenerationFlowIntegration.test.tsx +504 -0
  149. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +135 -88
  150. package/src/features/resource-viewer/__tests__/detection-progress-flow.test.tsx +322 -0
  151. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +308 -528
  152. package/translations/ar.json +6 -3
  153. package/translations/bn.json +6 -3
  154. package/translations/cs.json +6 -3
  155. package/translations/da.json +6 -3
  156. package/translations/de.json +6 -3
  157. package/translations/el.json +6 -3
  158. package/translations/en.json +6 -3
  159. package/translations/es.json +6 -3
  160. package/translations/fa.json +6 -3
  161. package/translations/fi.json +6 -3
  162. package/translations/fr.json +6 -3
  163. package/translations/he.json +6 -3
  164. package/translations/hi.json +6 -3
  165. package/translations/id.json +6 -3
  166. package/translations/it.json +6 -3
  167. package/translations/ja.json +6 -3
  168. package/translations/ko.json +6 -3
  169. package/translations/ms.json +6 -3
  170. package/translations/nl.json +6 -3
  171. package/translations/no.json +6 -3
  172. package/translations/pl.json +6 -3
  173. package/translations/pt.json +6 -3
  174. package/translations/ro.json +6 -3
  175. package/translations/sv.json +6 -3
  176. package/translations/th.json +6 -3
  177. package/translations/tr.json +6 -3
  178. package/translations/uk.json +6 -3
  179. package/translations/vi.json +6 -3
  180. package/translations/zh.json +6 -3
  181. package/dist/PdfAnnotationCanvas.client-ADC4FFSE.mjs.map +0 -1
  182. package/dist/TranslationManager-Co_5fSxl.d.mts +0 -118
  183. package/dist/ar-EMHEHPCJ.mjs.map +0 -1
  184. package/dist/bn-OVCI4F6X.mjs.map +0 -1
  185. package/dist/chunk-JZIO2A3B.mjs.map +0 -1
  186. package/dist/chunk-LIHZTECW.mjs.map +0 -1
  187. package/dist/cs-FAN66Q2F.mjs.map +0 -1
  188. package/dist/da-YBBIHI2O.mjs.map +0 -1
  189. package/dist/de-MAYU33LB.mjs.map +0 -1
  190. package/dist/el-MKGSWN4O.mjs.map +0 -1
  191. package/dist/es-52LHUWJD.mjs.map +0 -1
  192. package/dist/fa-FJICRANB.mjs.map +0 -1
  193. package/dist/fi-O455XFCR.mjs.map +0 -1
  194. package/dist/fr-TXIXHOOE.mjs.map +0 -1
  195. package/dist/he-JBSOX5IN.mjs.map +0 -1
  196. package/dist/hi-KGHI3XVT.mjs.map +0 -1
  197. package/dist/id-5OCPPZLO.mjs.map +0 -1
  198. package/dist/it-PNBBZSM2.mjs.map +0 -1
  199. package/dist/ja-LDD7R3TJ.mjs.map +0 -1
  200. package/dist/ko-F47ZDEY3.mjs.map +0 -1
  201. package/dist/ms-Z7LMXJWL.mjs.map +0 -1
  202. package/dist/nl-6SJFBPJ3.mjs.map +0 -1
  203. package/dist/no-YXPBPSGF.mjs.map +0 -1
  204. package/dist/pl-P4AZ2QME.mjs.map +0 -1
  205. package/dist/pt-LHWUS6U6.mjs.map +0 -1
  206. package/dist/ro-EA5J2ZON.mjs.map +0 -1
  207. package/dist/sv-DATBS3UQ.mjs.map +0 -1
  208. package/dist/th-WTFJRWPT.mjs.map +0 -1
  209. package/dist/tr-IKO3RXOX.mjs.map +0 -1
  210. package/dist/uk-CF6CTTRK.mjs.map +0 -1
  211. package/dist/vi-AJLTXPZQ.mjs.map +0 -1
  212. package/dist/zh-U3ORHHYH.mjs.map +0 -1
  213. /package/dist/{en-DDLIXJCU.mjs.map → en-KJCJQ4OO.mjs.map} +0 -0
@@ -21,11 +21,8 @@ const createMockProps = (overrides?: Partial<AdminSecurityPageProps>): AdminSecu
21
21
  allowedDomains: ['example.com'],
22
22
  isLoading: false,
23
23
  theme: 'light',
24
- onThemeChange: vi.fn(),
25
24
  showLineNumbers: false,
26
- onLineNumbersToggle: vi.fn(),
27
25
  activePanel: null,
28
- onPanelToggle: vi.fn(),
29
26
  translations: {
30
27
  title: 'Security Settings',
31
28
  subtitle: 'Configure authentication and authorization',
@@ -26,11 +26,8 @@ export interface AdminSecurityPageProps {
26
26
 
27
27
  // UI state
28
28
  theme: 'light' | 'dark' | 'system';
29
- onThemeChange: (theme: 'light' | 'dark' | 'system') => void;
30
29
  showLineNumbers: boolean;
31
- onLineNumbersToggle: () => void;
32
30
  activePanel: string | null;
33
- onPanelToggle: (panel: string | null) => void;
34
31
 
35
32
  // Translations
36
33
  translations: {
@@ -63,11 +60,8 @@ export function AdminSecurityPage({
63
60
  allowedDomains,
64
61
  isLoading,
65
62
  theme,
66
- onThemeChange,
67
63
  showLineNumbers,
68
- onLineNumbersToggle,
69
64
  activePanel,
70
- onPanelToggle,
71
65
  translations: t,
72
66
  ToolbarPanels,
73
67
  Toolbar,
@@ -182,15 +176,12 @@ export function AdminSecurityPage({
182
176
  <ToolbarPanels
183
177
  activePanel={activePanel}
184
178
  theme={theme}
185
- onThemeChange={onThemeChange}
186
179
  showLineNumbers={showLineNumbers}
187
- onLineNumbersToggle={onLineNumbersToggle}
188
180
  />
189
181
 
190
182
  <Toolbar
191
183
  context="simple"
192
184
  activePanel={activePanel}
193
- onPanelToggle={onPanelToggle}
194
185
  />
195
186
  </div>
196
187
  </div>
@@ -78,11 +78,8 @@ const createMockProps = (overrides?: Partial<AdminUsersPageProps>): AdminUsersPa
78
78
  onAddUser: vi.fn(),
79
79
  onExportUsers: vi.fn(),
80
80
  theme: 'light',
81
- onThemeChange: vi.fn(),
82
81
  showLineNumbers: false,
83
- onLineNumbersToggle: vi.fn(),
84
82
  activePanel: null,
85
- onPanelToggle: vi.fn(),
86
83
  translations: createMockTranslations(),
87
84
  ToolbarPanels: ({ children }: any) => <div data-testid="toolbar-panels">{children}</div>,
88
85
  Toolbar: () => <div data-testid="toolbar">Toolbar</div>,
@@ -151,11 +151,8 @@ export interface AdminUsersPageProps {
151
151
 
152
152
  // UI state
153
153
  theme: 'light' | 'dark' | 'system';
154
- onThemeChange: (theme: 'light' | 'dark' | 'system') => void;
155
154
  showLineNumbers: boolean;
156
- onLineNumbersToggle: () => void;
157
155
  activePanel: string | null;
158
- onPanelToggle: (panel: string | null) => void;
159
156
 
160
157
  // Translations
161
158
  translations: {
@@ -215,11 +212,8 @@ export function AdminUsersPage({
215
212
  onAddUser,
216
213
  onExportUsers,
217
214
  theme,
218
- onThemeChange,
219
215
  showLineNumbers,
220
- onLineNumbersToggle,
221
216
  activePanel,
222
- onPanelToggle,
223
217
  translations: t,
224
218
  ToolbarPanels,
225
219
  Toolbar,
@@ -458,15 +452,12 @@ export function AdminUsersPage({
458
452
  <ToolbarPanels
459
453
  activePanel={activePanel}
460
454
  theme={theme}
461
- onThemeChange={onThemeChange}
462
455
  showLineNumbers={showLineNumbers}
463
- onLineNumbersToggle={onLineNumbersToggle}
464
456
  />
465
457
 
466
458
  <Toolbar
467
459
  context="simple"
468
460
  activePanel={activePanel}
469
- onPanelToggle={onPanelToggle}
470
461
  />
471
462
  </div>
472
463
  </div>
@@ -19,11 +19,8 @@ const createMockProps = (overrides?: Partial<EntityTagsPageProps>): EntityTagsPa
19
19
  onAddTag: vi.fn(),
20
20
  isAddingTag: false,
21
21
  theme: 'light',
22
- onThemeChange: vi.fn(),
23
22
  showLineNumbers: false,
24
- onLineNumbersToggle: vi.fn(),
25
23
  activePanel: null,
26
- onPanelToggle: vi.fn(),
27
24
  translations: {
28
25
  pageTitle: 'Entity Tags',
29
26
  pageDescription: 'Manage entity type tags',
@@ -28,11 +28,8 @@ export interface EntityTagsPageProps {
28
28
 
29
29
  // UI state
30
30
  theme: 'light' | 'dark' | 'system';
31
- onThemeChange: (theme: 'light' | 'dark' | 'system') => void;
32
31
  showLineNumbers: boolean;
33
- onLineNumbersToggle: () => void;
34
32
  activePanel: string | null;
35
- onPanelToggle: (panel: string | null) => void;
36
33
 
37
34
  // Translations
38
35
  translations: {
@@ -58,15 +55,13 @@ export function EntityTagsPage({
58
55
  onAddTag,
59
56
  isAddingTag,
60
57
  theme,
61
- onThemeChange,
62
58
  showLineNumbers,
63
- onLineNumbersToggle,
64
59
  activePanel,
65
- onPanelToggle,
66
60
  translations: t,
67
61
  ToolbarPanels,
68
62
  Toolbar,
69
63
  }: EntityTagsPageProps) {
64
+
70
65
  const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
71
66
  if (e.key === 'Enter') {
72
67
  onAddTag();
@@ -155,15 +150,12 @@ export function EntityTagsPage({
155
150
  <ToolbarPanels
156
151
  activePanel={activePanel}
157
152
  theme={theme}
158
- onThemeChange={onThemeChange}
159
153
  showLineNumbers={showLineNumbers}
160
- onLineNumbersToggle={onLineNumbersToggle}
161
154
  />
162
155
 
163
156
  <Toolbar
164
157
  context="simple"
165
158
  activePanel={activePanel}
166
- onPanelToggle={onPanelToggle}
167
159
  />
168
160
  </div>
169
161
  </div>
@@ -14,11 +14,8 @@ const createMockProps = (overrides?: Partial<RecentDocumentsPageProps>): RecentD
14
14
  hasDocuments: false,
15
15
  isLoading: false,
16
16
  theme: 'light',
17
- onThemeChange: vi.fn(),
18
17
  showLineNumbers: false,
19
- onLineNumbersToggle: vi.fn(),
20
18
  activePanel: null,
21
- onPanelToggle: vi.fn(),
22
19
  translations: {
23
20
  pageTitle: 'Recent Documents',
24
21
  pageDescription: 'View recently moderated documents',
@@ -219,35 +216,6 @@ describe('RecentDocumentsPage', () => {
219
216
  );
220
217
  });
221
218
 
222
- it('passes callbacks to toolbar components', () => {
223
- const onThemeChange = vi.fn();
224
- const onLineNumbersToggle = vi.fn();
225
- const onPanelToggle = vi.fn();
226
- const ToolbarPanels = vi.fn(() => <div data-testid="toolbar-panels" />);
227
- const Toolbar = vi.fn(() => <div data-testid="toolbar" />);
228
-
229
- const props = createMockProps({
230
- onThemeChange,
231
- onLineNumbersToggle,
232
- onPanelToggle,
233
- ToolbarPanels,
234
- Toolbar,
235
- });
236
- render(<RecentDocumentsPage {...props} />);
237
-
238
- expect(ToolbarPanels).toHaveBeenCalledWith(
239
- expect.objectContaining({
240
- onThemeChange,
241
- onLineNumbersToggle,
242
- }),
243
- expect.anything()
244
- );
245
-
246
- expect(Toolbar).toHaveBeenCalledWith(
247
- expect.objectContaining({ onPanelToggle }),
248
- expect.anything()
249
- );
250
- });
251
219
 
252
220
  it('passes context to toolbar', () => {
253
221
  const Toolbar = vi.fn(() => <div data-testid="toolbar" />);
@@ -15,11 +15,8 @@ export interface RecentDocumentsPageProps {
15
15
 
16
16
  // UI state
17
17
  theme: 'light' | 'dark' | 'system';
18
- onThemeChange: (theme: 'light' | 'dark' | 'system') => void;
19
18
  showLineNumbers: boolean;
20
- onLineNumbersToggle: () => void;
21
19
  activePanel: string | null;
22
- onPanelToggle: (panel: string | null) => void;
23
20
 
24
21
  // Translations
25
22
  translations: {
@@ -40,15 +37,13 @@ export interface RecentDocumentsPageProps {
40
37
  export function RecentDocumentsPage({
41
38
  isLoading,
42
39
  theme,
43
- onThemeChange,
44
40
  showLineNumbers,
45
- onLineNumbersToggle,
46
41
  activePanel,
47
- onPanelToggle,
48
42
  translations: t,
49
43
  ToolbarPanels,
50
44
  Toolbar,
51
45
  }: RecentDocumentsPageProps) {
46
+
52
47
  if (isLoading) {
53
48
  return (
54
49
  <div className="semiont-page__loading">
@@ -100,15 +95,12 @@ export function RecentDocumentsPage({
100
95
  <ToolbarPanels
101
96
  activePanel={activePanel}
102
97
  theme={theme}
103
- onThemeChange={onThemeChange}
104
98
  showLineNumbers={showLineNumbers}
105
- onLineNumbersToggle={onLineNumbersToggle}
106
99
  />
107
100
 
108
101
  <Toolbar
109
102
  context="simple"
110
103
  activePanel={activePanel}
111
- onPanelToggle={onPanelToggle}
112
104
  />
113
105
  </div>
114
106
  </div>
@@ -61,11 +61,8 @@ const createMockProps = (overrides?: Partial<TagSchemasPageProps>): TagSchemasPa
61
61
  schemas: mockSchemas,
62
62
  isLoading: false,
63
63
  theme: 'light',
64
- onThemeChange: vi.fn(),
65
64
  showLineNumbers: false,
66
- onLineNumbersToggle: vi.fn(),
67
65
  activePanel: null,
68
- onPanelToggle: vi.fn(),
69
66
  translations: {
70
67
  pageTitle: 'Tag Schemas',
71
68
  pageDescription: 'View available tag schemas for content analysis',
@@ -290,35 +287,6 @@ describe('TagSchemasPage', () => {
290
287
  );
291
288
  });
292
289
 
293
- it('passes callbacks to toolbar components', () => {
294
- const onThemeChange = vi.fn();
295
- const onLineNumbersToggle = vi.fn();
296
- const onPanelToggle = vi.fn();
297
- const ToolbarPanels = vi.fn(() => <div data-testid="toolbar-panels" />);
298
- const Toolbar = vi.fn(() => <div data-testid="toolbar" />);
299
-
300
- const props = createMockProps({
301
- onThemeChange,
302
- onLineNumbersToggle,
303
- onPanelToggle,
304
- ToolbarPanels,
305
- Toolbar,
306
- });
307
- render(<TagSchemasPage {...props} />);
308
-
309
- expect(ToolbarPanels).toHaveBeenCalledWith(
310
- expect.objectContaining({
311
- onThemeChange,
312
- onLineNumbersToggle,
313
- }),
314
- expect.anything()
315
- );
316
-
317
- expect(Toolbar).toHaveBeenCalledWith(
318
- expect.objectContaining({ onPanelToggle }),
319
- expect.anything()
320
- );
321
- });
322
290
  });
323
291
 
324
292
  describe('Layout and Structure', () => {
@@ -20,11 +20,8 @@ export interface TagSchemasPageProps {
20
20
 
21
21
  // UI state
22
22
  theme: 'light' | 'dark' | 'system';
23
- onThemeChange: (theme: 'light' | 'dark' | 'system') => void;
24
23
  showLineNumbers: boolean;
25
- onLineNumbersToggle: () => void;
26
24
  activePanel: string | null;
27
- onPanelToggle: (panel: string | null) => void;
28
25
 
29
26
  // Translations
30
27
  translations: {
@@ -55,15 +52,13 @@ export function TagSchemasPage({
55
52
  schemas,
56
53
  isLoading,
57
54
  theme,
58
- onThemeChange,
59
55
  showLineNumbers,
60
- onLineNumbersToggle,
61
56
  activePanel,
62
- onPanelToggle,
63
57
  translations: t,
64
58
  ToolbarPanels,
65
59
  Toolbar,
66
60
  }: TagSchemasPageProps) {
61
+
67
62
  if (isLoading) {
68
63
  return (
69
64
  <div className="semiont-page__loading">
@@ -156,15 +151,12 @@ export function TagSchemasPage({
156
151
  <ToolbarPanels
157
152
  activePanel={activePanel}
158
153
  theme={theme}
159
- onThemeChange={onThemeChange}
160
154
  showLineNumbers={showLineNumbers}
161
- onLineNumbersToggle={onLineNumbersToggle}
162
155
  />
163
156
 
164
157
  <Toolbar
165
158
  context="simple"
166
159
  activePanel={activePanel}
167
- onPanelToggle={onPanelToggle}
168
160
  />
169
161
  </div>
170
162
  </div>
@@ -9,26 +9,19 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
9
9
  import { render, screen, fireEvent, waitFor } from '@testing-library/react';
10
10
  import { ResourceComposePage } from '../components/ResourceComposePage';
11
11
  import type { ResourceComposePageProps, SaveResourceParams } from '../components/ResourceComposePage';
12
-
13
- // Mock dependencies
14
- vi.mock('@semiont/react-ui', async () => {
15
- const actual = await vi.importActual('@semiont/react-ui');
16
- return {
17
- ...actual,
18
- buttonStyles: {
19
- primary: { base: 'btn-primary' },
20
- tertiary: { base: 'btn-tertiary' },
21
- },
22
- CodeMirrorRenderer: ({ content, onChange, editable }: any) => (
23
- <textarea
24
- data-testid="code-editor"
25
- value={content}
26
- onChange={(e) => editable && onChange?.(e.target.value)}
27
- disabled={!editable}
28
- />
29
- ),
30
- };
31
- });
12
+ import { EventBusProvider, resetEventBusForTesting } from '../../../contexts/EventBusContext';
13
+
14
+ // Mock CodeMirrorRenderer to avoid CodeMirror dependencies
15
+ vi.mock('../../../components/CodeMirrorRenderer', () => ({
16
+ CodeMirrorRenderer: ({ content, onChange, editable }: any) => (
17
+ <textarea
18
+ data-testid="code-editor"
19
+ value={content}
20
+ onChange={(e) => editable && onChange?.(e.target.value)}
21
+ disabled={!editable}
22
+ />
23
+ ),
24
+ }));
32
25
 
33
26
  const createMockTranslations = () => ({
34
27
  title: 'Compose Resource',
@@ -69,11 +62,8 @@ const createMockProps = (overrides?: Partial<ResourceComposePageProps>): Resourc
69
62
  availableEntityTypes: ['Document', 'Article', 'Report'],
70
63
  initialLocale: 'en',
71
64
  theme: 'light',
72
- onThemeChange: vi.fn(),
73
65
  showLineNumbers: false,
74
- onLineNumbersToggle: vi.fn(),
75
66
  activePanel: null,
76
- onPanelToggle: vi.fn(),
77
67
  onSaveResource: vi.fn().mockResolvedValue(undefined),
78
68
  onCancel: vi.fn(),
79
69
  translations: createMockTranslations(),
@@ -82,18 +72,27 @@ const createMockProps = (overrides?: Partial<ResourceComposePageProps>): Resourc
82
72
  ...overrides,
83
73
  });
84
74
 
75
+ // Helper to render with EventBusProvider
76
+ const renderWithProviders = (ui: React.ReactElement) => {
77
+ return render(<EventBusProvider>{ui}</EventBusProvider>);
78
+ };
79
+
85
80
  describe('ResourceComposePage', () => {
81
+ beforeEach(() => {
82
+ resetEventBusForTesting();
83
+ });
84
+
86
85
  describe('Basic Rendering - New Resource Mode', () => {
87
86
  it('renders without crashing', () => {
88
87
  const props = createMockProps();
89
- render(<ResourceComposePage {...props} />);
88
+ renderWithProviders(<ResourceComposePage {...props} />);
90
89
 
91
90
  expect(screen.getByText('Compose Resource')).toBeInTheDocument();
92
91
  });
93
92
 
94
93
  it('renders resource name input', () => {
95
94
  const props = createMockProps();
96
- render(<ResourceComposePage {...props} />);
95
+ renderWithProviders(<ResourceComposePage {...props} />);
97
96
 
98
97
  expect(screen.getByLabelText('Resource Name')).toBeInTheDocument();
99
98
  expect(screen.getByPlaceholderText('Enter resource name')).toBeInTheDocument();
@@ -101,7 +100,7 @@ describe('ResourceComposePage', () => {
101
100
 
102
101
  it('renders entity type selection', () => {
103
102
  const props = createMockProps();
104
- render(<ResourceComposePage {...props} />);
103
+ renderWithProviders(<ResourceComposePage {...props} />);
105
104
 
106
105
  expect(screen.getByText('Entity Types')).toBeInTheDocument();
107
106
  expect(screen.getByRole('button', { name: /Document entity type/ })).toBeInTheDocument();
@@ -111,14 +110,14 @@ describe('ResourceComposePage', () => {
111
110
 
112
111
  it('renders language selector', () => {
113
112
  const props = createMockProps();
114
- render(<ResourceComposePage {...props} />);
113
+ renderWithProviders(<ResourceComposePage {...props} />);
115
114
 
116
115
  expect(screen.getByLabelText('Language')).toBeInTheDocument();
117
116
  });
118
117
 
119
118
  it('renders content source toggle', () => {
120
119
  const props = createMockProps();
121
- render(<ResourceComposePage {...props} />);
120
+ renderWithProviders(<ResourceComposePage {...props} />);
122
121
 
123
122
  expect(screen.getByText('Upload File')).toBeInTheDocument();
124
123
  expect(screen.getByText('Write Content')).toBeInTheDocument();
@@ -126,7 +125,7 @@ describe('ResourceComposePage', () => {
126
125
 
127
126
  it('renders toolbar component', () => {
128
127
  const props = createMockProps();
129
- render(<ResourceComposePage {...props} />);
128
+ renderWithProviders(<ResourceComposePage {...props} />);
130
129
 
131
130
  expect(screen.getByTestId('toolbar')).toBeInTheDocument();
132
131
  });
@@ -144,7 +143,7 @@ describe('ResourceComposePage', () => {
144
143
  sourceContent: 'Original content',
145
144
  },
146
145
  });
147
- render(<ResourceComposePage {...props} />);
146
+ renderWithProviders(<ResourceComposePage {...props} />);
148
147
 
149
148
  expect(screen.getByText('Edit Cloned Resource')).toBeInTheDocument();
150
149
  expect(screen.getByText('Editing a cloned resource')).toBeInTheDocument();
@@ -161,7 +160,7 @@ describe('ResourceComposePage', () => {
161
160
  sourceContent: 'Original content',
162
161
  },
163
162
  });
164
- render(<ResourceComposePage {...props} />);
163
+ renderWithProviders(<ResourceComposePage {...props} />);
165
164
 
166
165
  const nameInput = screen.getByLabelText('Resource Name') as HTMLInputElement;
167
166
  expect(nameInput.value).toBe('Original Resource');
@@ -181,7 +180,7 @@ describe('ResourceComposePage', () => {
181
180
  sourceContent: 'Original content',
182
181
  },
183
182
  });
184
- render(<ResourceComposePage {...props} />);
183
+ renderWithProviders(<ResourceComposePage {...props} />);
185
184
 
186
185
  expect(screen.getByLabelText('Archive original resource')).toBeInTheDocument();
187
186
  });
@@ -197,7 +196,7 @@ describe('ResourceComposePage', () => {
197
196
  sourceContent: 'Original content',
198
197
  },
199
198
  });
200
- render(<ResourceComposePage {...props} />);
199
+ renderWithProviders(<ResourceComposePage {...props} />);
201
200
 
202
201
  expect(screen.queryByText('Upload File')).not.toBeInTheDocument();
203
202
  expect(screen.queryByText('Write Content')).not.toBeInTheDocument();
@@ -215,7 +214,7 @@ describe('ResourceComposePage', () => {
215
214
  entityTypes: ['Document'],
216
215
  },
217
216
  });
218
- render(<ResourceComposePage {...props} />);
217
+ renderWithProviders(<ResourceComposePage {...props} />);
219
218
 
220
219
  expect(screen.getByText('Complete Reference')).toBeInTheDocument();
221
220
  expect(screen.getByText('Creating a new resource for reference')).toBeInTheDocument();
@@ -232,7 +231,7 @@ describe('ResourceComposePage', () => {
232
231
  entityTypes: ['Document', 'Article'],
233
232
  },
234
233
  });
235
- render(<ResourceComposePage {...props} />);
234
+ renderWithProviders(<ResourceComposePage {...props} />);
236
235
 
237
236
  const nameInput = screen.getByLabelText('Resource Name') as HTMLInputElement;
238
237
  expect(nameInput.value).toBe('Referenced Resource');
@@ -251,7 +250,7 @@ describe('ResourceComposePage', () => {
251
250
  entityTypes: ['Document'],
252
251
  },
253
252
  });
254
- render(<ResourceComposePage {...props} />);
253
+ renderWithProviders(<ResourceComposePage {...props} />);
255
254
 
256
255
  // Should show read-only entity types
257
256
  expect(screen.getByText('Document')).toBeInTheDocument();
@@ -267,7 +266,7 @@ describe('ResourceComposePage', () => {
267
266
  describe('Content Input Method', () => {
268
267
  it('defaults to write mode', () => {
269
268
  const props = createMockProps();
270
- render(<ResourceComposePage {...props} />);
269
+ renderWithProviders(<ResourceComposePage {...props} />);
271
270
 
272
271
  const writeButton = screen.getByText('Write Content').closest('button');
273
272
  expect(writeButton).toHaveAttribute('data-active', 'true');
@@ -275,7 +274,7 @@ describe('ResourceComposePage', () => {
275
274
 
276
275
  it('allows switching to upload mode', () => {
277
276
  const props = createMockProps();
278
- render(<ResourceComposePage {...props} />);
277
+ renderWithProviders(<ResourceComposePage {...props} />);
279
278
 
280
279
  const uploadButton = screen.getByText('Upload File').closest('button');
281
280
  fireEvent.click(uploadButton!);
@@ -285,28 +284,28 @@ describe('ResourceComposePage', () => {
285
284
 
286
285
  it('shows format selector in write mode', () => {
287
286
  const props = createMockProps();
288
- render(<ResourceComposePage {...props} />);
287
+ renderWithProviders(<ResourceComposePage {...props} />);
289
288
 
290
289
  expect(screen.getByLabelText('Format')).toBeInTheDocument();
291
290
  });
292
291
 
293
292
  it('shows encoding selector in write mode', () => {
294
293
  const props = createMockProps();
295
- render(<ResourceComposePage {...props} />);
294
+ renderWithProviders(<ResourceComposePage {...props} />);
296
295
 
297
296
  expect(screen.getByLabelText('Encoding')).toBeInTheDocument();
298
297
  });
299
298
 
300
299
  it('shows code editor in write mode', () => {
301
300
  const props = createMockProps();
302
- render(<ResourceComposePage {...props} />);
301
+ renderWithProviders(<ResourceComposePage {...props} />);
303
302
 
304
303
  expect(screen.getByTestId('code-editor')).toBeInTheDocument();
305
304
  });
306
305
 
307
306
  it('shows file upload in upload mode', () => {
308
307
  const props = createMockProps();
309
- render(<ResourceComposePage {...props} />);
308
+ renderWithProviders(<ResourceComposePage {...props} />);
310
309
 
311
310
  const uploadButton = screen.getByText('Upload File').closest('button');
312
311
  fireEvent.click(uploadButton!);
@@ -319,7 +318,7 @@ describe('ResourceComposePage', () => {
319
318
  it('calls onSaveResource with correct params for new resource', async () => {
320
319
  const onSaveResource = vi.fn().mockResolvedValue(undefined);
321
320
  const props = createMockProps({ onSaveResource });
322
- render(<ResourceComposePage {...props} />);
321
+ renderWithProviders(<ResourceComposePage {...props} />);
323
322
 
324
323
  // Fill in name
325
324
  const nameInput = screen.getByLabelText('Resource Name');
@@ -353,7 +352,7 @@ describe('ResourceComposePage', () => {
353
352
  it('includes selected entity types', async () => {
354
353
  const onSaveResource = vi.fn().mockResolvedValue(undefined);
355
354
  const props = createMockProps({ onSaveResource });
356
- render(<ResourceComposePage {...props} />);
355
+ renderWithProviders(<ResourceComposePage {...props} />);
357
356
 
358
357
  // Fill in name
359
358
  const nameInput = screen.getByLabelText('Resource Name');
@@ -378,7 +377,7 @@ describe('ResourceComposePage', () => {
378
377
 
379
378
  it('requires resource name', () => {
380
379
  const props = createMockProps();
381
- render(<ResourceComposePage {...props} />);
380
+ renderWithProviders(<ResourceComposePage {...props} />);
382
381
 
383
382
  const submitButton = screen.getByRole('button', { name: 'Create Resource' });
384
383
  expect(submitButton).toBeDisabled();
@@ -386,7 +385,7 @@ describe('ResourceComposePage', () => {
386
385
 
387
386
  it('enables submit button when name is provided', () => {
388
387
  const props = createMockProps();
389
- render(<ResourceComposePage {...props} />);
388
+ renderWithProviders(<ResourceComposePage {...props} />);
390
389
 
391
390
  const nameInput = screen.getByLabelText('Resource Name');
392
391
  fireEvent.change(nameInput, { target: { value: 'Test Resource' } });
@@ -398,7 +397,7 @@ describe('ResourceComposePage', () => {
398
397
  it('disables form during submission', async () => {
399
398
  const onSaveResource = vi.fn(() => new Promise<void>(resolve => setTimeout(resolve, 100)));
400
399
  const props = createMockProps({ onSaveResource });
401
- render(<ResourceComposePage {...props} />);
400
+ renderWithProviders(<ResourceComposePage {...props} />);
402
401
 
403
402
  const nameInput = screen.getByLabelText('Resource Name');
404
403
  fireEvent.change(nameInput, { target: { value: 'Test Resource' } });
@@ -419,7 +418,7 @@ describe('ResourceComposePage', () => {
419
418
  it('calls onCancel when cancel button clicked', () => {
420
419
  const onCancel = vi.fn();
421
420
  const props = createMockProps({ onCancel });
422
- render(<ResourceComposePage {...props} />);
421
+ renderWithProviders(<ResourceComposePage {...props} />);
423
422
 
424
423
  const cancelButton = screen.getByRole('button', { name: 'Cancel' });
425
424
  fireEvent.click(cancelButton);
@@ -431,7 +430,7 @@ describe('ResourceComposePage', () => {
431
430
  describe('Toolbar Integration', () => {
432
431
  it('renders ToolbarPanels component', () => {
433
432
  const props = createMockProps();
434
- render(<ResourceComposePage {...props} />);
433
+ renderWithProviders(<ResourceComposePage {...props} />);
435
434
 
436
435
  expect(screen.getByTestId('toolbar-panels')).toBeInTheDocument();
437
436
  });
@@ -440,16 +439,14 @@ describe('ResourceComposePage', () => {
440
439
  const ToolbarPanels = vi.fn(() => <div data-testid="toolbar-panels" />);
441
440
  const props = createMockProps({
442
441
  theme: 'dark',
443
- onThemeChange: vi.fn(),
444
442
  ToolbarPanels,
445
443
  });
446
444
 
447
- render(<ResourceComposePage {...props} />);
445
+ renderWithProviders(<ResourceComposePage {...props} />);
448
446
 
449
447
  expect(ToolbarPanels).toHaveBeenCalledWith(
450
448
  expect.objectContaining({
451
449
  theme: 'dark',
452
- onThemeChange: expect.any(Function),
453
450
  }),
454
451
  expect.anything()
455
452
  );
@@ -459,7 +456,7 @@ describe('ResourceComposePage', () => {
459
456
  describe('Code Editor Integration', () => {
460
457
  it('allows editing content', () => {
461
458
  const props = createMockProps();
462
- render(<ResourceComposePage {...props} />);
459
+ renderWithProviders(<ResourceComposePage {...props} />);
463
460
 
464
461
  const editor = screen.getByTestId('code-editor') as HTMLTextAreaElement;
465
462
  fireEvent.change(editor, { target: { value: 'New content' } });
@@ -469,7 +466,7 @@ describe('ResourceComposePage', () => {
469
466
 
470
467
  it('respects showLineNumbers prop', () => {
471
468
  const props = createMockProps({ showLineNumbers: true });
472
- render(<ResourceComposePage {...props} />);
469
+ renderWithProviders(<ResourceComposePage {...props} />);
473
470
 
474
471
  expect(screen.getByTestId('code-editor')).toBeInTheDocument();
475
472
  });