@semiont/react-ui 0.2.34-build.91 → 0.2.34-build.92

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 (195) hide show
  1. package/dist/{EventBusContext-BmzEcGHZ.d.mts → EventBusContext-DMI4uwYk.d.mts} +2 -2
  2. package/dist/{PdfAnnotationCanvas.client-VLNA5O5M.mjs → PdfAnnotationCanvas.client-HNYRKFDS.mjs} +10 -9
  3. package/dist/PdfAnnotationCanvas.client-HNYRKFDS.mjs.map +1 -0
  4. package/dist/{ar-4ZEORRW2.mjs → ar-MDB7HC5S.mjs} +45 -49
  5. package/dist/ar-MDB7HC5S.mjs.map +1 -0
  6. package/dist/{bn-SEDE5BQJ.mjs → bn-3SAV2ZEM.mjs} +45 -49
  7. package/dist/bn-3SAV2ZEM.mjs.map +1 -0
  8. package/dist/{chunk-C63BARI7.mjs → chunk-3FIQXKQF.mjs} +31 -31
  9. package/dist/{chunk-D7NBW4RV.mjs → chunk-JH7BXE2P.mjs} +45 -49
  10. package/dist/chunk-JH7BXE2P.mjs.map +1 -0
  11. package/dist/{chunk-M7SZRRIE.mjs → chunk-MWQ5CNKW.mjs} +13 -13
  12. package/dist/chunk-MWQ5CNKW.mjs.map +1 -0
  13. package/dist/{chunk-ULIET3MW.mjs → chunk-YI5IX5ZA.mjs} +1 -1
  14. package/dist/{chunk-ULIET3MW.mjs.map → chunk-YI5IX5ZA.mjs.map} +1 -1
  15. package/dist/{cs-7W4WF5WD.mjs → cs-AWCETEUV.mjs} +45 -49
  16. package/dist/cs-AWCETEUV.mjs.map +1 -0
  17. package/dist/{da-75XGBCBK.mjs → da-UZZHXYLC.mjs} +45 -49
  18. package/dist/da-UZZHXYLC.mjs.map +1 -0
  19. package/dist/{de-ODJVFLHM.mjs → de-LQFWN6S5.mjs} +45 -49
  20. package/dist/de-LQFWN6S5.mjs.map +1 -0
  21. package/dist/{el-C4PM4WB3.mjs → el-IWOETBJ7.mjs} +45 -49
  22. package/dist/el-IWOETBJ7.mjs.map +1 -0
  23. package/dist/{en-KJCJQ4OO.mjs → en-XWEPVTB4.mjs} +2 -6
  24. package/dist/{es-WD33R7QL.mjs → es-726NTS53.mjs} +45 -49
  25. package/dist/es-726NTS53.mjs.map +1 -0
  26. package/dist/{fa-2BP6V56P.mjs → fa-BVEJZT5S.mjs} +45 -49
  27. package/dist/fa-BVEJZT5S.mjs.map +1 -0
  28. package/dist/{fi-USRRW24J.mjs → fi-JBNCGGA6.mjs} +45 -49
  29. package/dist/fi-JBNCGGA6.mjs.map +1 -0
  30. package/dist/{fr-EC5S6WVF.mjs → fr-OLH7PNGI.mjs} +45 -49
  31. package/dist/fr-OLH7PNGI.mjs.map +1 -0
  32. package/dist/{he-7TBVIKAA.mjs → he-KOJQ4HMA.mjs} +45 -49
  33. package/dist/he-KOJQ4HMA.mjs.map +1 -0
  34. package/dist/{hi-FO4VIZLA.mjs → hi-BKJFZXAY.mjs} +45 -49
  35. package/dist/hi-BKJFZXAY.mjs.map +1 -0
  36. package/dist/{id-7U7GGVWY.mjs → id-DPLHJVNP.mjs} +45 -49
  37. package/dist/id-DPLHJVNP.mjs.map +1 -0
  38. package/dist/index.css +80 -80
  39. package/dist/index.css.map +1 -1
  40. package/dist/index.d.mts +215 -201
  41. package/dist/index.mjs +810 -748
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/{it-Y4OPL6I2.mjs → it-JXHAM7NL.mjs} +45 -49
  44. package/dist/it-JXHAM7NL.mjs.map +1 -0
  45. package/dist/{ja-PK7SQL55.mjs → ja-DQRAO3PU.mjs} +45 -49
  46. package/dist/ja-DQRAO3PU.mjs.map +1 -0
  47. package/dist/{ko-L25PXMYD.mjs → ko-6IFCOP6F.mjs} +45 -49
  48. package/dist/ko-6IFCOP6F.mjs.map +1 -0
  49. package/dist/{ms-STH777QM.mjs → ms-KF5S2TLL.mjs} +45 -49
  50. package/dist/ms-KF5S2TLL.mjs.map +1 -0
  51. package/dist/{nl-Y7LECDDR.mjs → nl-2GUUZLQM.mjs} +45 -49
  52. package/dist/nl-2GUUZLQM.mjs.map +1 -0
  53. package/dist/{no-KEKCEWU6.mjs → no-2IBCZGEF.mjs} +45 -49
  54. package/dist/no-2IBCZGEF.mjs.map +1 -0
  55. package/dist/{pl-7A7OC75O.mjs → pl-ZEUBJ7YU.mjs} +45 -49
  56. package/dist/pl-ZEUBJ7YU.mjs.map +1 -0
  57. package/dist/{pt-35HTM7RA.mjs → pt-WLAFIZWQ.mjs} +45 -49
  58. package/dist/pt-WLAFIZWQ.mjs.map +1 -0
  59. package/dist/{ro-VAWL5KQA.mjs → ro-K56IXFGU.mjs} +45 -49
  60. package/dist/ro-K56IXFGU.mjs.map +1 -0
  61. package/dist/{sv-7ZK5EQEB.mjs → sv-VFJLMJRY.mjs} +45 -49
  62. package/dist/sv-VFJLMJRY.mjs.map +1 -0
  63. package/dist/test-utils.d.mts +2 -2
  64. package/dist/test-utils.mjs +3 -3
  65. package/dist/{th-UDWZ4X34.mjs → th-RICLQ2GW.mjs} +45 -49
  66. package/dist/th-RICLQ2GW.mjs.map +1 -0
  67. package/dist/{tr-4WMPK3UX.mjs → tr-SALXWE2M.mjs} +45 -49
  68. package/dist/tr-SALXWE2M.mjs.map +1 -0
  69. package/dist/{uk-SSLASQYJ.mjs → uk-3U3T3O2E.mjs} +45 -49
  70. package/dist/uk-3U3T3O2E.mjs.map +1 -0
  71. package/dist/{vi-IF42Z5PU.mjs → vi-LIVNZXOB.mjs} +45 -49
  72. package/dist/vi-LIVNZXOB.mjs.map +1 -0
  73. package/dist/{zh-HRQTNTAI.mjs → zh-KDUAZPX3.mjs} +45 -49
  74. package/dist/zh-KDUAZPX3.mjs.map +1 -0
  75. package/package.json +1 -1
  76. package/src/components/AnnotateReferencesProgressWidget.tsx +113 -0
  77. package/src/components/CodeMirrorRenderer.tsx +9 -27
  78. package/src/components/Toolbar.tsx +2 -2
  79. package/src/components/annotation/AnnotateToolbar.tsx +9 -9
  80. package/src/components/annotation/__tests__/AnnotateToolbar.test.tsx +17 -17
  81. package/src/components/image-annotation/AnnotationOverlay.tsx +13 -11
  82. package/src/components/image-annotation/SvgDrawingCanvas.tsx +8 -4
  83. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +11 -9
  84. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +1 -1
  85. package/src/components/resource/AnnotateView.tsx +17 -12
  86. package/src/components/resource/BrowseView.tsx +19 -50
  87. package/src/components/resource/ResourceViewer.tsx +28 -24
  88. package/src/components/resource/__tests__/BrowseView.test.tsx +27 -27
  89. package/src/components/resource/panels/AssessmentEntry.tsx +1 -1
  90. package/src/components/resource/panels/AssessmentPanel.tsx +16 -16
  91. package/src/components/resource/panels/{DetectSection.css → AssistSection.css} +79 -79
  92. package/src/components/resource/panels/{DetectSection.tsx → AssistSection.tsx} +46 -46
  93. package/src/components/resource/panels/CommentEntry.tsx +1 -1
  94. package/src/components/resource/panels/CommentsPanel.tsx +16 -16
  95. package/src/components/resource/panels/HighlightEntry.tsx +1 -1
  96. package/src/components/resource/panels/HighlightPanel.tsx +14 -14
  97. package/src/components/resource/panels/ReferenceEntry.tsx +5 -5
  98. package/src/components/resource/panels/ReferencesPanel.tsx +90 -103
  99. package/src/components/resource/panels/ResourceInfoPanel.tsx +2 -2
  100. package/src/components/resource/panels/TagEntry.tsx +1 -1
  101. package/src/components/resource/panels/TaggingPanel.tsx +53 -53
  102. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +12 -20
  103. package/src/components/resource/panels/__tests__/AssessmentPanel.test.tsx +12 -12
  104. package/src/components/resource/panels/__tests__/{DetectSection.test.tsx → AssistSection.test.tsx} +109 -108
  105. package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +8 -8
  106. package/src/components/resource/panels/__tests__/CommentsPanel.test.tsx +3 -3
  107. package/src/components/resource/panels/__tests__/{HighlightPanel.detectionProgress.test.tsx → HighlightPanel.annotationProgress.test.tsx} +56 -56
  108. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +98 -95
  109. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +3 -3
  110. package/src/components/resource/panels/__tests__/TaggingPanel.test.tsx +16 -16
  111. package/src/components/settings/SettingsPanel.tsx +29 -1
  112. package/src/features/resource-compose/components/ResourceComposePage.tsx +3 -0
  113. package/src/features/resource-viewer/__tests__/AnnotationCreationPending.test.tsx +36 -26
  114. package/src/features/resource-viewer/__tests__/AnnotationDeletionIntegration.test.tsx +26 -16
  115. package/src/features/resource-viewer/__tests__/{DetectionProgressDismissal.test.tsx → AnnotationProgressDismissal.test.tsx} +48 -38
  116. package/src/features/resource-viewer/__tests__/DetectionFlowBug.test.tsx +59 -49
  117. package/src/features/resource-viewer/__tests__/DetectionFlowIntegration.test.tsx +55 -33
  118. package/src/features/resource-viewer/__tests__/GenerationFlowIntegration.test.tsx +24 -16
  119. package/src/features/resource-viewer/__tests__/ResolutionFlowIntegration.test.tsx +41 -31
  120. package/src/features/resource-viewer/__tests__/ResourceMutations.test.tsx +10 -10
  121. package/src/features/resource-viewer/__tests__/ToastNotifications.test.tsx +196 -0
  122. package/src/features/resource-viewer/__tests__/{detection-progress-flow.test.tsx → annotation-progress-flow.test.tsx} +51 -28
  123. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +56 -45
  124. package/src/styles/core/buttons.css +3 -3
  125. package/src/styles/core/forms.css +2 -2
  126. package/src/styles/index.css +1 -1
  127. package/src/styles/motivations/motivation-assessment.css +9 -9
  128. package/src/styles/motivations/motivation-comment.css +9 -9
  129. package/src/styles/motivations/motivation-highlight.css +9 -9
  130. package/src/styles/motivations/motivation-reference.css +9 -9
  131. package/src/styles/motivations/motivation-tag.css +9 -9
  132. package/src/styles/utilities/focus-extended.css +6 -6
  133. package/translations/ar.json +44 -44
  134. package/translations/bn.json +44 -44
  135. package/translations/cs.json +44 -44
  136. package/translations/da.json +44 -44
  137. package/translations/de.json +44 -44
  138. package/translations/el.json +44 -44
  139. package/translations/en.json +44 -44
  140. package/translations/es.json +44 -44
  141. package/translations/fa.json +44 -44
  142. package/translations/fi.json +44 -44
  143. package/translations/fr.json +44 -44
  144. package/translations/he.json +44 -44
  145. package/translations/hi.json +44 -44
  146. package/translations/id.json +44 -44
  147. package/translations/it.json +44 -44
  148. package/translations/ja.json +44 -44
  149. package/translations/ko.json +44 -44
  150. package/translations/ms.json +44 -44
  151. package/translations/nl.json +44 -44
  152. package/translations/no.json +44 -44
  153. package/translations/pl.json +44 -44
  154. package/translations/pt.json +44 -44
  155. package/translations/ro.json +44 -44
  156. package/translations/sv.json +44 -44
  157. package/translations/th.json +44 -44
  158. package/translations/tr.json +44 -44
  159. package/translations/uk.json +44 -44
  160. package/translations/vi.json +44 -44
  161. package/translations/zh.json +44 -44
  162. package/dist/PdfAnnotationCanvas.client-VLNA5O5M.mjs.map +0 -1
  163. package/dist/ar-4ZEORRW2.mjs.map +0 -1
  164. package/dist/bn-SEDE5BQJ.mjs.map +0 -1
  165. package/dist/chunk-D7NBW4RV.mjs.map +0 -1
  166. package/dist/chunk-M7SZRRIE.mjs.map +0 -1
  167. package/dist/cs-7W4WF5WD.mjs.map +0 -1
  168. package/dist/da-75XGBCBK.mjs.map +0 -1
  169. package/dist/de-ODJVFLHM.mjs.map +0 -1
  170. package/dist/el-C4PM4WB3.mjs.map +0 -1
  171. package/dist/es-WD33R7QL.mjs.map +0 -1
  172. package/dist/fa-2BP6V56P.mjs.map +0 -1
  173. package/dist/fi-USRRW24J.mjs.map +0 -1
  174. package/dist/fr-EC5S6WVF.mjs.map +0 -1
  175. package/dist/he-7TBVIKAA.mjs.map +0 -1
  176. package/dist/hi-FO4VIZLA.mjs.map +0 -1
  177. package/dist/id-7U7GGVWY.mjs.map +0 -1
  178. package/dist/it-Y4OPL6I2.mjs.map +0 -1
  179. package/dist/ja-PK7SQL55.mjs.map +0 -1
  180. package/dist/ko-L25PXMYD.mjs.map +0 -1
  181. package/dist/ms-STH777QM.mjs.map +0 -1
  182. package/dist/nl-Y7LECDDR.mjs.map +0 -1
  183. package/dist/no-KEKCEWU6.mjs.map +0 -1
  184. package/dist/pl-7A7OC75O.mjs.map +0 -1
  185. package/dist/pt-35HTM7RA.mjs.map +0 -1
  186. package/dist/ro-VAWL5KQA.mjs.map +0 -1
  187. package/dist/sv-7ZK5EQEB.mjs.map +0 -1
  188. package/dist/th-UDWZ4X34.mjs.map +0 -1
  189. package/dist/tr-4WMPK3UX.mjs.map +0 -1
  190. package/dist/uk-SSLASQYJ.mjs.map +0 -1
  191. package/dist/vi-IF42Z5PU.mjs.map +0 -1
  192. package/dist/zh-HRQTNTAI.mjs.map +0 -1
  193. package/src/components/DetectionProgressWidget.tsx +0 -113
  194. /package/dist/{chunk-C63BARI7.mjs.map → chunk-3FIQXKQF.mjs.map} +0 -0
  195. /package/dist/{en-KJCJQ4OO.mjs.map → en-XWEPVTB4.mjs.map} +0 -0
@@ -80,12 +80,12 @@ var CommentsPanel = {
80
80
  save: "Save",
81
81
  cancel: "Cancel",
82
82
  edit: "Edit",
83
- detectComments: "Detect Comments",
83
+ annotateComments: "Annotate Comments",
84
84
  instructions: "Instructions",
85
85
  optional: "(optional)",
86
86
  instructionsPlaceholder: "e.g., Focus on technical terminology...",
87
- detect: "Detect",
88
- detecting: "Detecting...",
87
+ annotate: "Annotate",
88
+ annotating: "Annotating...",
89
89
  toneLabel: "Tone",
90
90
  toneOptional: "(optional)",
91
91
  toneScholarly: "Scholarly",
@@ -101,13 +101,13 @@ var CommentsPanel = {
101
101
  };
102
102
  var HighlightPanel = {
103
103
  title: "Highlights",
104
- noHighlights: "No highlights yet. Use AI detection to find important passages.",
105
- detectHighlights: "Detect Highlights",
104
+ noHighlights: "No highlights yet. Use AI annotation to find important passages.",
105
+ annotateHighlights: "Annotate Highlights",
106
106
  instructions: "Instructions",
107
107
  optional: "(optional)",
108
108
  instructionsPlaceholder: "e.g., Focus on key technical concepts...",
109
- detect: "Detect",
110
- detecting: "Detecting...",
109
+ annotate: "Annotate",
110
+ annotating: "Annotating...",
111
111
  cancel: "Cancel",
112
112
  densityLabel: "Density",
113
113
  densitySparse: "Sparse",
@@ -116,16 +116,16 @@ var HighlightPanel = {
116
116
  };
117
117
  var AssessmentPanel = {
118
118
  title: "Assessments",
119
- noAssessments: "No assessments yet. Use AI detection to evaluate passages.",
119
+ noAssessments: "No assessments yet. Use AI annotation to evaluate passages.",
120
120
  assessmentPlaceholder: "Type your assessment here...",
121
121
  save: "Save",
122
122
  cancel: "Cancel",
123
- detectAssessments: "Detect Assessments",
123
+ annotateAssessments: "Annotate Assessments",
124
124
  instructions: "Instructions",
125
125
  optional: "(optional)",
126
126
  instructionsPlaceholder: "e.g., Evaluate claims for accuracy and evidence...",
127
- detect: "Detect",
128
- detecting: "Detecting...",
127
+ annotate: "Annotate",
128
+ annotating: "Annotating...",
129
129
  toneLabel: "Tone",
130
130
  toneOptional: "(optional)",
131
131
  toneAnalytical: "Analytical",
@@ -141,8 +141,8 @@ var AssessmentPanel = {
141
141
  };
142
142
  var TaggingPanel = {
143
143
  title: "Tags",
144
- noTags: "No tags yet. Use AI detection to identify structural roles.",
145
- detectTags: "Detect Tags",
144
+ noTags: "No tags yet. Use AI annotation to identify structural roles.",
145
+ annotateTags: "Annotate Tags",
146
146
  selectSchema: "Select Framework",
147
147
  schemaLegal: "Legal Analysis (IRAC)",
148
148
  schemaScientific: "Scientific Paper (IMRAD)",
@@ -161,8 +161,8 @@ var TaggingPanel = {
161
161
  categoryWarrant: "Warrant",
162
162
  categoryCounterargument: "Counterargument",
163
163
  categoryRebuttal: "Rebuttal",
164
- detect: "Detect",
165
- detecting: "Detecting...",
164
+ annotate: "Annotate",
165
+ annotating: "Annotating...",
166
166
  cancel: "Cancel",
167
167
  selectAll: "Select All",
168
168
  deselectAll: "Deselect All",
@@ -193,29 +193,12 @@ var StatisticsPanel = {
193
193
  resolved: "Resolved",
194
194
  entityTypes: "Entity Types"
195
195
  };
196
- var DetectPanel = {
197
- title: "Detect References",
198
- selectEntityTypes: "Entity types:",
199
- select: "Select",
200
- deselect: "Deselect",
201
- noEntityTypes: "No entity types available",
202
- typesSelected: "{count, plural, =1 {1 type selected} other {# types selected}}",
203
- startDetection: "Detect",
204
- found: "{count} found",
205
- more: "More"
206
- };
207
- var DetectionProgressWidget = {
208
- title: "Detecting Entity References",
209
- cancelDetection: "Cancel detection",
210
- found: "{count} found",
211
- complete: "Detection complete!",
212
- failed: "Detection failed",
213
- current: "Current: {entityType}"
214
- };
215
196
  var ReferencesPanel = {
216
- referencesTitle: "References",
197
+ title: "References",
198
+ noReferences: "No references yet. Select text to create references to other resources.",
217
199
  outgoingReferences: "Outgoing References",
218
- noReferences: "No references yet",
200
+ incomingReferences: "Incoming References",
201
+ noIncomingReferences: "No incoming references",
219
202
  stub: "Stub reference (not linked)",
220
203
  resolved: "Resolved reference (linked)",
221
204
  open: "Open",
@@ -224,18 +207,31 @@ var ReferencesPanel = {
224
207
  find: "Find",
225
208
  create: "Create",
226
209
  cancel: "Cancel",
227
- incomingReferences: "Incoming References",
228
- loading: "loading...",
229
- loadingEllipsis: "Loading...",
230
- noIncomingReferences: "No incoming references",
231
- untitledResource: "Untitled Resource",
232
- noText: "No text",
233
210
  createReference: "Create Reference",
234
211
  entityTypesOptional: "Entity Types (Optional)",
235
212
  fragmentSelected: "Fragment selected",
236
213
  imageRegionSelected: "Image region selected",
214
+ annotateReferences: "Annotate References",
215
+ selectEntityTypes: "Entity types:",
216
+ select: "Select",
217
+ deselect: "Deselect",
218
+ noEntityTypes: "No entity types available",
219
+ typesSelected: "{count, plural, =1 {1 type selected} other {# types selected}}",
220
+ annotate: "Annotate",
221
+ annotating: "Annotating...",
237
222
  includeDescriptiveReferences: "Include descriptive references",
238
- descriptiveReferencesTooltip: "Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)"
223
+ descriptiveReferencesTooltip: "Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)",
224
+ annotationProgressTitle: "Annotating Entity References",
225
+ cancelAnnotation: "Cancel annotation",
226
+ found: "{count} found",
227
+ complete: "Annotation complete!",
228
+ failed: "Annotation failed",
229
+ current: "Current: {entityType}",
230
+ closeProgress: "Close",
231
+ loading: "loading...",
232
+ loadingEllipsis: "Loading...",
233
+ untitledResource: "Untitled Resource",
234
+ noText: "No text"
239
235
  };
240
236
  var KeyboardShortcuts = {
241
237
  title: "Keyboard Shortcuts",
@@ -331,7 +327,11 @@ var Settings = {
331
327
  themeModeActive: "Using {mode} mode",
332
328
  language: "Language",
333
329
  languageHint: "Change language in the main navigation",
334
- languageChanging: "Changing language..."
330
+ languageChanging: "Changing language...",
331
+ hoverDelay: "Hover Delay",
332
+ hoverDelayFast: "Fast",
333
+ hoverDelaySlow: "Slow",
334
+ hoverDelayDescription: "{delay}ms delay before hover effects appear"
335
335
  };
336
336
  var AnnotateView = {};
337
337
  var zh_default = {
@@ -345,8 +345,6 @@ var zh_default = {
345
345
  TaggingPanel,
346
346
  UnifiedAnnotationsPanel,
347
347
  StatisticsPanel,
348
- DetectPanel,
349
- DetectionProgressWidget,
350
348
  ReferencesPanel,
351
349
  KeyboardShortcuts,
352
350
  AnnotateToolbar,
@@ -363,8 +361,6 @@ export {
363
361
  CollaborationPanel,
364
362
  CollapsibleResourceNavigation,
365
363
  CommentsPanel,
366
- DetectPanel,
367
- DetectionProgressWidget,
368
364
  HighlightPanel,
369
365
  KeyboardShortcuts,
370
366
  ReferencesPanel,
@@ -377,4 +373,4 @@ export {
377
373
  UnifiedAnnotationsPanel,
378
374
  zh_default as default
379
375
  };
380
- //# sourceMappingURL=zh-HRQTNTAI.mjs.map
376
+ //# sourceMappingURL=zh-KDUAZPX3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../translations/zh.json"],"sourcesContent":["{\n \"Toolbar\": {\n \"annotations\": \"Annotations\",\n \"history\": \"History\",\n \"resourceInfo\": \"Resource Info\",\n \"collaboration\": \"Collaboration\",\n \"userAccount\": \"User Account\",\n \"settings\": \"Settings\"\n },\n \"ResourceInfoPanel\": {\n \"title\": \"Resource Info\",\n \"locale\": \"Locale\",\n \"notSpecified\": \"Not specified\",\n \"entityTypeTags\": \"Entity Type Tags\",\n \"representation\": \"Representation\",\n \"mediaType\": \"Media Type\",\n \"byteSize\": \"Size\",\n \"clone\": \"Clone\",\n \"cloneDescription\": \"Generate a shareable clone link for this resource\",\n \"archive\": \"Archive\",\n \"archiveDescription\": \"Move this resource to archived status\",\n \"unarchive\": \"Unarchive\",\n \"unarchiveDescription\": \"Restore this resource to active status\"\n },\n \"CollaborationPanel\": {\n \"title\": \"Collaboration\",\n \"connectionStatus\": \"Connection Status\",\n \"live\": \"Live\",\n \"disconnected\": \"Disconnected\",\n \"events\": \"{count} events\",\n \"lastSync\": \"Last sync:\",\n \"noActivity\": \"No activity yet\",\n \"justNow\": \"Just now\",\n \"secondsAgo\": \"{count} seconds ago\",\n \"minuteAgo\": \"1 minute ago\",\n \"minutesAgo\": \"{count} minutes ago\",\n \"hourAgo\": \"1 hour ago\",\n \"hoursAgo\": \"{count} hours ago\",\n \"realtimeActive\": \"Real-time updates are active\",\n \"reconnecting\": \"Reconnecting to server...\",\n \"sharing\": \"Sharing\",\n \"collaborationComingSoon\": \"Collaboration features coming soon\"\n },\n \"AnnotationHistory\": {\n \"history\": \"History\",\n \"loading\": \"Loading...\",\n \"user\": \"User\",\n \"method\": \"Method\",\n \"viewOriginal\": \"View original\",\n \"viewAnnotation\": \"View annotation: {content}\",\n \"resourceCreated\": \"Created Resource\",\n \"resourceCloned\": \"Cloned\",\n \"resourceArchived\": \"Archived\",\n \"resourceUnarchived\": \"Unarchived\",\n \"highlightAdded\": \"Highlight Added\",\n \"highlightRemoved\": \"Highlight Removed\",\n \"referenceCreated\": \"Reference Created\",\n \"referenceResolved\": \"Reference Resolved\",\n \"referenceDeleted\": \"Reference Deleted\",\n \"entitytagAdded\": \"Tag Added\",\n \"entitytagRemoved\": \"Tag Removed\",\n \"assessmentAdded\": \"Assessment Added\",\n \"assessmentRemoved\": \"Assessment Removed\",\n \"annotationAdded\": \"Annotation Added\",\n \"annotationRemoved\": \"Annotation Removed\",\n \"annotationBodyUpdated\": \"Annotation Updated\",\n \"jobEvent\": \"Job Event\",\n \"justNow\": \"just now\",\n \"minutesAgo\": \"{count}m ago\",\n \"hoursAgo\": \"{count}h ago\",\n \"daysAgo\": \"{count}d ago\"\n },\n \"CommentsPanel\": {\n \"title\": \"Comments\",\n \"noComments\": \"No comments yet. Select text and click Comment to add one.\",\n \"commentPlaceholder\": \"Type your comment here...\",\n \"save\": \"Save\",\n \"cancel\": \"Cancel\",\n \"edit\": \"Edit\",\n \"annotateComments\": \"Annotate Comments\",\n \"instructions\": \"Instructions\",\n \"optional\": \"(optional)\",\n \"instructionsPlaceholder\": \"e.g., Focus on technical terminology...\",\n \"annotate\": \"Annotate\",\n \"annotating\": \"Annotating...\",\n \"toneLabel\": \"Tone\",\n \"toneOptional\": \"(optional)\",\n \"toneScholarly\": \"Scholarly\",\n \"toneExplanatory\": \"Explanatory\",\n \"toneConversational\": \"Conversational\",\n \"toneTechnical\": \"Technical\",\n \"densityLabel\": \"Density\",\n \"densitySparse\": \"Sparse\",\n \"densityDense\": \"Dense\",\n \"fragmentSelected\": \"Fragment selected\",\n \"imageRegionSelected\": \"Image region selected\",\n \"closeProgress\": \"Close\"\n },\n \"HighlightPanel\": {\n \"title\": \"Highlights\",\n \"noHighlights\": \"No highlights yet. Use AI annotation to find important passages.\",\n \"annotateHighlights\": \"Annotate Highlights\",\n \"instructions\": \"Instructions\",\n \"optional\": \"(optional)\",\n \"instructionsPlaceholder\": \"e.g., Focus on key technical concepts...\",\n \"annotate\": \"Annotate\",\n \"annotating\": \"Annotating...\",\n \"cancel\": \"Cancel\",\n \"densityLabel\": \"Density\",\n \"densitySparse\": \"Sparse\",\n \"densityDense\": \"Dense\",\n \"closeProgress\": \"Close\"\n },\n \"AssessmentPanel\": {\n \"title\": \"Assessments\",\n \"noAssessments\": \"No assessments yet. Use AI annotation to evaluate passages.\",\n \"assessmentPlaceholder\": \"Type your assessment here...\",\n \"save\": \"Save\",\n \"cancel\": \"Cancel\",\n \"annotateAssessments\": \"Annotate Assessments\",\n \"instructions\": \"Instructions\",\n \"optional\": \"(optional)\",\n \"instructionsPlaceholder\": \"e.g., Evaluate claims for accuracy and evidence...\",\n \"annotate\": \"Annotate\",\n \"annotating\": \"Annotating...\",\n \"toneLabel\": \"Tone\",\n \"toneOptional\": \"(optional)\",\n \"toneAnalytical\": \"Analytical\",\n \"toneCritical\": \"Critical\",\n \"toneBalanced\": \"Balanced\",\n \"toneConstructive\": \"Constructive\",\n \"densityLabel\": \"Density\",\n \"densitySparse\": \"Sparse\",\n \"densityDense\": \"Dense\",\n \"fragmentSelected\": \"Fragment selected\",\n \"imageRegionSelected\": \"Image region selected\",\n \"closeProgress\": \"Close\"\n },\n \"TaggingPanel\": {\n \"title\": \"Tags\",\n \"noTags\": \"No tags yet. Use AI annotation to identify structural roles.\",\n \"annotateTags\": \"Annotate Tags\",\n \"selectSchema\": \"Select Framework\",\n \"schemaLegal\": \"Legal Analysis (IRAC)\",\n \"schemaScientific\": \"Scientific Paper (IMRAD)\",\n \"schemaArgument\": \"Argument Structure (Toulmin)\",\n \"selectCategories\": \"Select Categories\",\n \"categoryIssue\": \"Issue\",\n \"categoryRule\": \"Rule\",\n \"categoryApplication\": \"Application\",\n \"categoryConclusion\": \"Conclusion\",\n \"categoryIntroduction\": \"Introduction\",\n \"categoryMethods\": \"Methods\",\n \"categoryResults\": \"Results\",\n \"categoryDiscussion\": \"Discussion\",\n \"categoryClaim\": \"Claim\",\n \"categoryEvidence\": \"Evidence\",\n \"categoryWarrant\": \"Warrant\",\n \"categoryCounterargument\": \"Counterargument\",\n \"categoryRebuttal\": \"Rebuttal\",\n \"annotate\": \"Annotate\",\n \"annotating\": \"Annotating...\",\n \"cancel\": \"Cancel\",\n \"selectAll\": \"Select All\",\n \"deselectAll\": \"Deselect All\",\n \"categoriesSelected\": \"{count, plural, =0 {No categories selected} =1 {1 category selected} other {# categories selected}}\",\n \"createTagForSelection\": \"Create Tag for Selection\",\n \"selectCategory\": \"Select Category\",\n \"chooseCategory\": \"Choose a category...\",\n \"fragmentSelected\": \"Fragment selected\",\n \"imageRegionSelected\": \"Image region selected\"\n },\n \"UnifiedAnnotationsPanel\": {\n \"title\": \"Annotations\",\n \"statistics\": \"Statistics\",\n \"highlight\": \"Highlights\",\n \"reference\": \"References\",\n \"assessment\": \"Assessments\",\n \"comment\": \"Comments\",\n \"tag\": \"Tags\"\n },\n \"StatisticsPanel\": {\n \"title\": \"Statistics\",\n \"highlights\": \"Highlights\",\n \"comments\": \"Comments\",\n \"assessments\": \"Assessments\",\n \"tags\": \"Tags\",\n \"references\": \"References\",\n \"stub\": \"Stub\",\n \"resolved\": \"Resolved\",\n \"entityTypes\": \"Entity Types\"\n },\n \"ReferencesPanel\": {\n \"title\": \"References\",\n \"noReferences\": \"No references yet. Select text to create references to other resources.\",\n \"outgoingReferences\": \"Outgoing References\",\n \"incomingReferences\": \"Incoming References\",\n \"noIncomingReferences\": \"No incoming references\",\n \"stub\": \"Stub reference (not linked)\",\n \"resolved\": \"Resolved reference (linked)\",\n \"open\": \"Open\",\n \"unlink\": \"Unlink\",\n \"generate\": \"Generate\",\n \"find\": \"Find\",\n \"create\": \"Create\",\n \"cancel\": \"Cancel\",\n \"createReference\": \"Create Reference\",\n \"entityTypesOptional\": \"Entity Types (Optional)\",\n \"fragmentSelected\": \"Fragment selected\",\n \"imageRegionSelected\": \"Image region selected\",\n \"annotateReferences\": \"Annotate References\",\n \"selectEntityTypes\": \"Entity types:\",\n \"select\": \"Select\",\n \"deselect\": \"Deselect\",\n \"noEntityTypes\": \"No entity types available\",\n \"typesSelected\": \"{count, plural, =1 {1 type selected} other {# types selected}}\",\n \"annotate\": \"Annotate\",\n \"annotating\": \"Annotating...\",\n \"includeDescriptiveReferences\": \"Include descriptive references\",\n \"descriptiveReferencesTooltip\": \"Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)\",\n \"annotationProgressTitle\": \"Annotating Entity References\",\n \"cancelAnnotation\": \"Cancel annotation\",\n \"found\": \"{count} found\",\n \"complete\": \"Annotation complete!\",\n \"failed\": \"Annotation failed\",\n \"current\": \"Current: {entityType}\",\n \"closeProgress\": \"Close\",\n \"loading\": \"loading...\",\n \"loadingEllipsis\": \"Loading...\",\n \"untitledResource\": \"Untitled Resource\",\n \"noText\": \"No text\"\n },\n \"KeyboardShortcuts\": {\n \"title\": \"Keyboard Shortcuts\",\n \"closeDialog\": \"Close dialog\",\n \"or\": \"or\",\n \"navigationTitle\": \"Navigation\",\n \"navOpenSearch\": \"Open global search\",\n \"navOpenSearchAlt\": \"Open global search (alternative)\",\n \"navCreateResource\": \"Create new resource\",\n \"navCloseOverlays\": \"Close all overlays (double press)\",\n \"navShowHelp\": \"Show keyboard shortcuts help\",\n \"sidebarTitle\": \"Knowledge Sidebar\",\n \"sidebarCollapse\": \"Collapse sidebar\",\n \"sidebarExpand\": \"Expand sidebar\",\n \"sidebarPickup\": \"Pick up resource tab (when focused)\",\n \"sidebarMove\": \"Move resource tab (when dragging)\",\n \"sidebarDrop\": \"Drop resource tab (when dragging)\",\n \"sidebarCancel\": \"Cancel drag operation\",\n \"annotationsTitle\": \"Resource Annotations\",\n \"annotHighlight\": \"Create highlight from annotation (direct)\",\n \"annotReference\": \"Open reference popup for annotation\",\n \"annotDelete\": \"Delete focused annotation\",\n \"annotNavigate\": \"Navigate through annotations\",\n \"annotNavigateBack\": \"Navigate annotations backward\",\n \"listsTitle\": \"Lists & Grids\",\n \"listsFilterNav\": \"Navigate entity type filters\",\n \"listsGridNav\": \"Navigate resource grid\",\n \"listsJumpFirst\": \"Jump to first item\",\n \"listsJumpLast\": \"Jump to last item\",\n \"searchModalTitle\": \"In Search Modal\",\n \"searchNav\": \"Navigate search results\",\n \"searchSelect\": \"Select result\",\n \"searchClose\": \"Close search\",\n \"modalTitle\": \"Modal Controls\",\n \"modalClose\": \"Close active modal\",\n \"modalNavForward\": \"Navigate forward through buttons\",\n \"modalNavBackward\": \"Navigate backward through buttons\",\n \"modalActivate\": \"Activate focused button\",\n \"accessibilityTitle\": \"Accessibility\",\n \"a11ySkipLinks\": \"Navigate to skip links (when at page start)\",\n \"a11yFollowLink\": \"Follow skip link\",\n \"macNote\": \"Using Mac keyboard shortcuts. ⌘ is the Command key.\",\n \"windowsNote\": \"Using Windows/Linux keyboard shortcuts. Ctrl is the Control key.\",\n \"footerHint\": \"Press {key} anytime to show this help\",\n \"close\": \"Close\"\n },\n \"AnnotateToolbar\": {\n \"modeGroup\": \"Mode\",\n \"browse\": \"Browse\",\n \"annotate\": \"Annotate\",\n \"selectionGroup\": \"Motivation\",\n \"clickGroup\": \"Click\",\n \"shapeGroup\": \"Shape\",\n \"none\": \"None\",\n \"linking\": \"Reference\",\n \"highlighting\": \"Highlight\",\n \"assessing\": \"Assess\",\n \"commenting\": \"Comment\",\n \"tagging\": \"Tag\",\n \"detail\": \"Detail\",\n \"follow\": \"Follow\",\n \"deleting\": \"Delete\",\n \"jsonld\": \"JSON-LD\",\n \"rectangle\": \"Rectangle\",\n \"circle\": \"Circle\",\n \"polygon\": \"Polygon\"\n },\n \"CollapsibleResourceNavigation\": {\n \"title\": \"Navigation\",\n \"collapseSidebar\": \"Collapse sidebar\",\n \"expandSidebar\": \"Expand sidebar\",\n \"dragToReorder\": \"Drag to reorder\",\n \"dragToReorderDoc\": \"Drag to reorder {name}\",\n \"closeResource\": \"Close resource\",\n \"dragInstructions\": \"To reorder resources: Use Tab to navigate to a resource. Press Alt+Up arrow to move up or Alt+Down arrow to move down. For drag and drop: Press space bar to pick up the item. Use arrow keys to move it. Press space bar again to drop.\"\n },\n \"ResourceViewer\": {\n \"deleteConfirmationTitle\": \"Delete Annotation\",\n \"deleteConfirmationMessage\": \"Are you sure you want to delete this annotation? This action cannot be undone.\",\n \"deleteConfirmationCancel\": \"Cancel\",\n \"deleteConfirmationDelete\": \"Delete\"\n },\n \"Settings\": {\n \"title\": \"Settings\",\n \"lineNumbers\": \"Line Numbers\",\n \"lineNumbersVisible\": \"Visible\",\n \"lineNumbersHidden\": \"Hidden\",\n \"theme\": \"Theme\",\n \"themeLight\": \"Light\",\n \"themeDark\": \"Dark\",\n \"themeSystem\": \"System\",\n \"themeSystemActive\": \"System ({mode})\",\n \"themeModeActive\": \"Using {mode} mode\",\n \"language\": \"Language\",\n \"languageHint\": \"Change language in the main navigation\",\n \"languageChanging\": \"Changing language...\",\n \"hoverDelay\": \"Hover Delay\",\n \"hoverDelayFast\": \"Fast\",\n \"hoverDelaySlow\": \"Slow\",\n \"hoverDelayDescription\": \"{delay}ms delay before hover effects appear\"\n },\n \"AnnotateView\": {}\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semiont/react-ui",
3
- "version": "0.2.34-build.91",
3
+ "version": "0.2.34-build.92",
4
4
  "description": "React components and hooks for Semiont",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.mts",
@@ -0,0 +1,113 @@
1
+ 'use client';
2
+
3
+ import { useTranslations } from '../contexts/TranslationContext';
4
+ import { useEventBus } from '../contexts/EventBusContext';
5
+ import type { AnnotationProgress } from '@semiont/core';
6
+ import type { components } from '@semiont/core';
7
+
8
+ type Motivation = components['schemas']['Motivation'];
9
+
10
+ // Extended AnnotationProgress with optional request parameters
11
+ interface EnrichedAnnotationProgress extends AnnotationProgress {
12
+ requestParams?: Array<{ label: string; value: string }>;
13
+ }
14
+
15
+ interface AnnotateReferencesProgressWidgetProps {
16
+ progress: AnnotationProgress | null;
17
+ annotationType?: Motivation | 'reference';
18
+ }
19
+
20
+ /**
21
+ * Widget for displaying reference annotation progress with cancel functionality
22
+ *
23
+ * @emits job:cancel-requested - User requested to cancel annotation job. Payload: { jobType: string }
24
+ */
25
+ export function AnnotateReferencesProgressWidget({ progress, annotationType = 'reference' }: AnnotateReferencesProgressWidgetProps) {
26
+ const t = useTranslations('ReferencesPanel');
27
+ const eventBus = useEventBus();
28
+
29
+ const handleCancel = () => {
30
+ // Emit event for job cancellation
31
+ eventBus.get('job:cancel-requested').next({ jobType: 'annotation' });
32
+ };
33
+
34
+ if (!progress) return null;
35
+
36
+ return (
37
+ <div
38
+ className="semiont-annotation-progress"
39
+ data-status={progress.status}
40
+ data-type={annotationType}
41
+ >
42
+ {/* Header with pulsing sparkle */}
43
+ <div className="semiont-annotation-header">
44
+ <h3 className="semiont-annotation-title">
45
+ <span className="semiont-annotation-sparkle">✨</span>
46
+ {t('annotationProgressTitle')}
47
+ </h3>
48
+ {progress.status !== 'complete' && (
49
+ <button
50
+ onClick={handleCancel}
51
+ className="semiont-annotation-cancel"
52
+ title={t('cancelAnnotation')}
53
+ >
54
+
55
+ </button>
56
+ )}
57
+ </div>
58
+
59
+ {/* Request Parameters */}
60
+ {(() => {
61
+ const enrichedProgress = progress as EnrichedAnnotationProgress;
62
+ return enrichedProgress.requestParams && enrichedProgress.requestParams.length > 0 && (
63
+ <div className="semiont-annotation-progress__params">
64
+ <div className="semiont-annotation-progress__params-title">Request Parameters:</div>
65
+ {enrichedProgress.requestParams.map((param, idx) => (
66
+ <div key={idx} className="semiont-annotation-progress__param">
67
+ <span className="semiont-annotation-progress__param-label">{param.label}:</span> {param.value}
68
+ </div>
69
+ ))}
70
+ </div>
71
+ );
72
+ })()}
73
+
74
+ {/* Completed entity types log */}
75
+ {progress.completedEntityTypes && progress.completedEntityTypes.length > 0 && (
76
+ <div className="semiont-annotation-log">
77
+ {progress.completedEntityTypes.map((item, index) => (
78
+ <div key={index} className="semiont-annotation-log-item">
79
+ <span className="semiont-annotation-check">✓</span>
80
+ <span className="semiont-annotation-entity-type">{item.entityType}:</span>
81
+ <span>{t('found', { count: item.foundCount })}</span>
82
+ </div>
83
+ ))}
84
+ </div>
85
+ )}
86
+
87
+ {/* Status display with pulsing animation */}
88
+ <div className="semiont-annotation-progress__status">
89
+ {progress.status === 'complete' ? (
90
+ <div className="semiont-annotation-progress__message">
91
+ <span className="semiont-annotation-progress__icon">✅</span>
92
+ <span>{t('complete')}</span>
93
+ </div>
94
+ ) : progress.status === 'error' ? (
95
+ <div className="semiont-annotation-progress__message">
96
+ <span className="semiont-annotation-progress__icon">❌</span>
97
+ <span>{progress.message || t('failed')}</span>
98
+ </div>
99
+ ) : (
100
+ <div className="semiont-annotation-progress__message">
101
+ <span className="semiont-annotation-progress__icon">✨</span>
102
+ <span>{progress.message || (progress.currentEntityType ? t('current', { entityType: progress.currentEntityType }) : t('annotating'))}</span>
103
+ </div>
104
+ )}
105
+ {progress.currentEntityType && progress.status !== 'complete' && progress.status !== 'error' && (
106
+ <div className="semiont-annotation-progress__details">
107
+ Processing: {progress.currentEntityType}
108
+ </div>
109
+ )}
110
+ </div>
111
+ </div>
112
+ );
113
+ }
@@ -6,6 +6,7 @@ import { EditorState, RangeSetBuilder, StateField, StateEffect, Compartment } fr
6
6
  import { markdown } from '@codemirror/lang-markdown';
7
7
  import { ANNOTATORS } from '../lib/annotation-registry';
8
8
  import { ReferenceResolutionWidget } from '../lib/codemirror-widgets';
9
+ import { scrollAnnotationIntoView } from '../lib/scroll-utils';
9
10
  import { isHighlight, isReference, isResolvedReference, isComment, isAssessment, isTag, getBodySource } from '@semiont/api-client';
10
11
  import type { components } from '@semiont/core';
11
12
  import type { EventBus } from "@semiont/core";
@@ -42,6 +43,7 @@ interface Props {
42
43
  eventBus?: EventBus;
43
44
  getTargetDocumentName?: (documentId: string) => string | undefined;
44
45
  generatingReferenceId?: string | null; // ID of reference currently generating a document
46
+ hoverDelayMs: number; // Hover delay in milliseconds for accessibility
45
47
  }
46
48
 
47
49
  // Effect to update annotation decorations with segments and new IDs
@@ -287,7 +289,8 @@ export function CodeMirrorRenderer({
287
289
  enableWidgets = false,
288
290
  eventBus,
289
291
  getTargetDocumentName,
290
- generatingReferenceId
292
+ generatingReferenceId,
293
+ hoverDelayMs
291
294
  }: Props) {
292
295
  const containerRef = useRef<HTMLDivElement>(null);
293
296
  const viewRef = useRef<EditorView | null>(null);
@@ -343,7 +346,7 @@ export function CodeMirrorRenderer({
343
346
  const segment = segmentsRef.current.find(s => s.annotation?.id === annotationId);
344
347
  if (segment?.annotation) {
345
348
  event.preventDefault();
346
- eventBusRef.current.get('annotation:click').next({
349
+ eventBusRef.current.get('attend:click').next({
347
350
  annotationId,
348
351
  motivation: segment.annotation.motivation
349
352
  });
@@ -411,7 +414,8 @@ export function CodeMirrorRenderer({
411
414
  const container = view.dom;
412
415
 
413
416
  const { handleMouseEnter, handleMouseLeave, cleanup: cleanupHover } = createHoverHandlers(
414
- (annotationId) => eventBusRef.current?.get('annotation:hover').next({ annotationId })
417
+ (annotationId) => eventBusRef.current?.get('attend:hover').next({ annotationId }),
418
+ hoverDelayMs
415
419
  );
416
420
 
417
421
  const handleMouseOver = (e: MouseEvent) => {
@@ -437,7 +441,7 @@ export function CodeMirrorRenderer({
437
441
  view.destroy();
438
442
  viewRef.current = null;
439
443
  };
440
- }, []); // Only initialize once
444
+ }, [hoverDelayMs]); // Re-initialize when hover delay changes
441
445
 
442
446
  // Update content when it changes externally (not from user typing)
443
447
  useEffect(() => {
@@ -597,29 +601,7 @@ export function CodeMirrorRenderer({
597
601
  // Handle scroll to annotation
598
602
  useEffect(() => {
599
603
  if (!viewRef.current || !scrollToAnnotationId) return;
600
-
601
- const view = viewRef.current;
602
-
603
- // Find the annotation element in the DOM
604
- const element = view.contentDOM.querySelector(
605
- `[data-annotation-id="${CSS.escape(scrollToAnnotationId)}"]`
606
- ) as HTMLElement;
607
-
608
- if (!element) return;
609
-
610
- // Find the actual scroll container - could be annotate view or document viewer
611
- const scrollContainer = (element.closest('.semiont-annotate-view__content') ||
612
- element.closest('.semiont-document-viewer__scrollable-body')) as HTMLElement;
613
-
614
- if (scrollContainer) {
615
- // Scroll using container.scrollTo to avoid scrolling ancestors
616
- const elementTop = element.offsetTop;
617
- const containerHeight = scrollContainer.clientHeight;
618
- const elementHeight = element.offsetHeight;
619
- const scrollTo = elementTop - (containerHeight / 2) + (elementHeight / 2);
620
-
621
- scrollContainer.scrollTo({ top: scrollTo, behavior: 'smooth' });
622
- }
604
+ scrollAnnotationIntoView(scrollToAnnotationId, viewRef.current.contentDOM);
623
605
  }, [scrollToAnnotationId]);
624
606
 
625
607
  const containerClasses = sourceView
@@ -17,7 +17,7 @@ interface Props<T extends string = string> {
17
17
  /**
18
18
  * Toolbar component for panel navigation
19
19
  *
20
- * @emits panel:toggle - Toggle panel visibility. Payload: { panel: string }
20
+ * @emits attend:panel-toggle - Toggle panel visibility. Payload: { panel: string }
21
21
  */
22
22
  export function Toolbar<T extends string = string>({
23
23
  context,
@@ -28,7 +28,7 @@ export function Toolbar<T extends string = string>({
28
28
  const eventBus = useEventBus();
29
29
 
30
30
  const handlePanelToggle = (panel: string) => {
31
- eventBus.get('panel:toggle').next({ panel });
31
+ eventBus.get('attend:panel-toggle').next({ panel });
32
32
  };
33
33
 
34
34
  return (
@@ -102,10 +102,10 @@ function DropdownGroup({
102
102
  /**
103
103
  * Toolbar for annotation controls with mode, selection, click, and shape options
104
104
  *
105
- * @emits toolbar:selection-changed - Selection motivation changed. Payload: { motivation: SelectionMotivation | null }
106
- * @emits toolbar:click-changed - Click action mode changed. Payload: { action: ClickAction }
107
- * @emits toolbar:shape-changed - Drawing shape changed. Payload: { shape: ShapeType }
108
- * @emits view:mode-toggled - View mode toggled between browse and annotate. Payload: undefined
105
+ * @emits annotate:selection-changed - Selection motivation changed. Payload: { motivation: SelectionMotivation | null }
106
+ * @emits annotate:click-changed - Click action mode changed. Payload: { action: ClickAction }
107
+ * @emits annotate:shape-changed - Drawing shape changed. Payload: { shape: ShapeType }
108
+ * @emits annotate:mode-toggled - View mode toggled between browse and annotate. Payload: undefined
109
109
  */
110
110
  export function AnnotateToolbar({
111
111
  selectedMotivation,
@@ -188,9 +188,9 @@ export function AnnotateToolbar({
188
188
  const handleSelectionClick = (motivation: SelectionMotivation | null) => {
189
189
  // If null is clicked, always deselect. Otherwise toggle.
190
190
  if (motivation === null) {
191
- eventBus.get('toolbar:selection-changed').next({ motivation: null });
191
+ eventBus.get('annotate:selection-changed').next({ motivation: null });
192
192
  } else {
193
- eventBus.get('toolbar:selection-changed').next({
193
+ eventBus.get('annotate:selection-changed').next({
194
194
  motivation: selectedMotivation === motivation ? null : motivation
195
195
  });
196
196
  }
@@ -200,21 +200,21 @@ export function AnnotateToolbar({
200
200
  };
201
201
 
202
202
  const handleClickClick = (action: ClickAction) => {
203
- eventBus.get('toolbar:click-changed').next({ action });
203
+ eventBus.get('annotate:click-changed').next({ action });
204
204
  // Close dropdown after selection
205
205
  setClickPinned(false);
206
206
  setClickHovered(false);
207
207
  };
208
208
 
209
209
  const handleShapeClick = (shape: ShapeType) => {
210
- eventBus.get('toolbar:shape-changed').next({ shape });
210
+ eventBus.get('annotate:shape-changed').next({ shape });
211
211
  // Close dropdown after selection
212
212
  setShapePinned(false);
213
213
  setShapeHovered(false);
214
214
  };
215
215
 
216
216
  const handleModeToggle = () => {
217
- eventBus.get('view:mode-toggled').next(undefined);
217
+ eventBus.get('annotate:mode-toggled').next(undefined);
218
218
  setModePinned(false);
219
219
  setModeHovered(false);
220
220
  };
@@ -51,10 +51,10 @@ function createEventTracker() {
51
51
  };
52
52
 
53
53
  const toolbarEvents = [
54
- 'view:mode-toggled',
55
- 'toolbar:click-changed',
56
- 'toolbar:selection-changed',
57
- 'toolbar:shape-changed',
54
+ 'annotate:mode-toggled',
55
+ 'annotate:click-changed',
56
+ 'annotate:selection-changed',
57
+ 'annotate:shape-changed',
58
58
  ] as const;
59
59
 
60
60
  toolbarEvents.forEach(eventName => {
@@ -215,7 +215,7 @@ describe('AnnotateToolbar', () => {
215
215
  });
216
216
  });
217
217
 
218
- it('emits view:mode-toggled event when Browse is clicked in Annotate mode', async () => {
218
+ it('emits annotate:mode-toggled event when Browse is clicked in Annotate mode', async () => {
219
219
  const tracker = createEventTracker();
220
220
  renderWithIntl(
221
221
  <AnnotateToolbar
@@ -234,11 +234,11 @@ describe('AnnotateToolbar', () => {
234
234
  });
235
235
 
236
236
  await waitFor(() => {
237
- expect(tracker.events.some(e => e.event === 'view:mode-toggled')).toBe(true);
237
+ expect(tracker.events.some(e => e.event === 'annotate:mode-toggled')).toBe(true);
238
238
  });
239
239
  });
240
240
 
241
- it('emits view:mode-toggled event when Annotate is clicked in Browse mode', async () => {
241
+ it('emits annotate:mode-toggled event when Annotate is clicked in Browse mode', async () => {
242
242
  const tracker = createEventTracker();
243
243
  renderWithIntl(
244
244
  <AnnotateToolbar
@@ -257,7 +257,7 @@ describe('AnnotateToolbar', () => {
257
257
  });
258
258
 
259
259
  await waitFor(() => {
260
- expect(tracker.events.some(e => e.event === 'view:mode-toggled')).toBe(true);
260
+ expect(tracker.events.some(e => e.event === 'annotate:mode-toggled')).toBe(true);
261
261
  });
262
262
  });
263
263
 
@@ -283,7 +283,7 @@ describe('AnnotateToolbar', () => {
283
283
 
284
284
  // Verify the event was emitted
285
285
  await waitFor(() => {
286
- expect(tracker.events.some(e => e.event === 'view:mode-toggled')).toBe(true);
286
+ expect(tracker.events.some(e => e.event === 'annotate:mode-toggled')).toBe(true);
287
287
  });
288
288
 
289
289
  // Simulate mode change by rerendering with new mode
@@ -311,7 +311,7 @@ describe('AnnotateToolbar', () => {
311
311
  });
312
312
 
313
313
  describe('CLICK Group Interactions', () => {
314
- it('emits toolbar:click-changed event when clicking an action', async () => {
314
+ it('emits annotate:click-changed event when clicking an action', async () => {
315
315
  const tracker = createEventTracker();
316
316
  renderWithIntl(
317
317
  <AnnotateToolbar {...defaultProps} />,
@@ -329,7 +329,7 @@ describe('AnnotateToolbar', () => {
329
329
  fireEvent.click(screen.getByText('Follow'));
330
330
  await waitFor(() => {
331
331
  expect(tracker.events.some(e =>
332
- e.event === 'toolbar:click-changed' && e.payload?.action === 'follow'
332
+ e.event === 'annotate:click-changed' && e.payload?.action === 'follow'
333
333
  )).toBe(true);
334
334
  });
335
335
  });
@@ -343,7 +343,7 @@ describe('AnnotateToolbar', () => {
343
343
  });
344
344
 
345
345
  describe('MOTIVATION Group Interactions', () => {
346
- it('emits toolbar:selection-changed event when clicking a motivation', async () => {
346
+ it('emits annotate:selection-changed event when clicking a motivation', async () => {
347
347
  const tracker = createEventTracker();
348
348
  renderWithIntl(
349
349
  <AnnotateToolbar {...defaultProps} />,
@@ -361,7 +361,7 @@ describe('AnnotateToolbar', () => {
361
361
  fireEvent.click(screen.getByText('Reference'));
362
362
  await waitFor(() => {
363
363
  expect(tracker.events.some(e =>
364
- e.event === 'toolbar:selection-changed' && e.payload?.motivation === 'linking'
364
+ e.event === 'annotate:selection-changed' && e.payload?.motivation === 'linking'
365
365
  )).toBe(true);
366
366
  });
367
367
  });
@@ -389,7 +389,7 @@ describe('AnnotateToolbar', () => {
389
389
  fireEvent.click(within(dropdown).getByText('Highlight'));
390
390
  await waitFor(() => {
391
391
  expect(tracker.events.some(e =>
392
- e.event === 'toolbar:selection-changed' && e.payload?.motivation === 'highlighting'
392
+ e.event === 'annotate:selection-changed' && e.payload?.motivation === 'highlighting'
393
393
  )).toBe(true);
394
394
  });
395
395
 
@@ -418,14 +418,14 @@ describe('AnnotateToolbar', () => {
418
418
  fireEvent.click(within(dropdown2).getByText('Highlight'));
419
419
  await waitFor(() => {
420
420
  expect(tracker.events.some(e =>
421
- e.event === 'toolbar:selection-changed' && e.payload?.motivation === null
421
+ e.event === 'annotate:selection-changed' && e.payload?.motivation === null
422
422
  )).toBe(true);
423
423
  });
424
424
  });
425
425
  });
426
426
 
427
427
  describe('SHAPE Group Interactions', () => {
428
- it('emits toolbar:shape-changed event when clicking a shape', async () => {
428
+ it('emits annotate:shape-changed event when clicking a shape', async () => {
429
429
  const tracker = createEventTracker();
430
430
  renderWithIntl(
431
431
  <AnnotateToolbar
@@ -447,7 +447,7 @@ describe('AnnotateToolbar', () => {
447
447
  fireEvent.click(screen.getByText('Circle'));
448
448
  await waitFor(() => {
449
449
  expect(tracker.events.some(e =>
450
- e.event === 'toolbar:shape-changed' && e.payload?.shape === 'circle'
450
+ e.event === 'annotate:shape-changed' && e.payload?.shape === 'circle'
451
451
  )).toBe(true);
452
452
  });
453
453
  });