@semiont/react-ui 0.2.33-build.74 → 0.2.33-build.76

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 (303) hide show
  1. package/README.md +19 -0
  2. package/dist/{PdfAnnotationCanvas.client-UW5TZJL2.mjs → PdfAnnotationCanvas.client-ADC4FFSE.mjs} +93 -80
  3. package/dist/PdfAnnotationCanvas.client-ADC4FFSE.mjs.map +1 -0
  4. package/dist/{PdfAnnotationCanvas.client-7FE67FUX.css → PdfAnnotationCanvas.client-V3E6AHEL.css} +10 -18
  5. package/dist/PdfAnnotationCanvas.client-V3E6AHEL.css.map +1 -0
  6. package/dist/{ar-6QTTYSKD.mjs → ar-RNNSPLQB.mjs} +14 -5
  7. package/dist/ar-RNNSPLQB.mjs.map +1 -0
  8. package/dist/{bn-AHD2VP4T.mjs → bn-S2CDL7EC.mjs} +14 -5
  9. package/dist/bn-S2CDL7EC.mjs.map +1 -0
  10. package/dist/{chunk-WHI4ECK4.mjs → chunk-35LLVRFK.mjs} +47 -43
  11. package/dist/chunk-35LLVRFK.mjs.map +1 -0
  12. package/dist/{chunk-GDEHLKCO.mjs → chunk-UDX2Q35T.mjs} +14 -5
  13. package/dist/chunk-UDX2Q35T.mjs.map +1 -0
  14. package/dist/{cs-WKZ5PTM3.mjs → cs-RSV675WU.mjs} +14 -5
  15. package/dist/cs-RSV675WU.mjs.map +1 -0
  16. package/dist/{da-JLWQLEH2.mjs → da-CHXNPWJC.mjs} +14 -5
  17. package/dist/da-CHXNPWJC.mjs.map +1 -0
  18. package/dist/{de-TOCT63PC.mjs → de-KPEZ53D4.mjs} +14 -5
  19. package/dist/de-KPEZ53D4.mjs.map +1 -0
  20. package/dist/{el-2XXDPBHO.mjs → el-MW2BME5T.mjs} +14 -5
  21. package/dist/el-MW2BME5T.mjs.map +1 -0
  22. package/dist/{en-OAKDUA6C.mjs → en-EVMIX24Y.mjs} +2 -2
  23. package/dist/{es-VQZSZSKB.mjs → es-HQ24NYS3.mjs} +14 -5
  24. package/dist/es-HQ24NYS3.mjs.map +1 -0
  25. package/dist/{fa-HFYV6XFA.mjs → fa-W34LRLHG.mjs} +14 -5
  26. package/dist/fa-W34LRLHG.mjs.map +1 -0
  27. package/dist/{fi-GYTT42QN.mjs → fi-3U44IGOA.mjs} +14 -5
  28. package/dist/fi-3U44IGOA.mjs.map +1 -0
  29. package/dist/{fr-RBOM5A35.mjs → fr-N7DKX6NN.mjs} +14 -5
  30. package/dist/fr-N7DKX6NN.mjs.map +1 -0
  31. package/dist/{he-KNB7K2AV.mjs → he-CS4WRXN3.mjs} +14 -5
  32. package/dist/he-CS4WRXN3.mjs.map +1 -0
  33. package/dist/{hi-QJ6E72XH.mjs → hi-GJDY46KA.mjs} +14 -5
  34. package/dist/hi-GJDY46KA.mjs.map +1 -0
  35. package/dist/{id-EKQVDHC7.mjs → id-WAEZJK2Y.mjs} +14 -5
  36. package/dist/id-WAEZJK2Y.mjs.map +1 -0
  37. package/dist/index.css +4472 -66
  38. package/dist/index.css.map +1 -1
  39. package/dist/index.d.mts +237 -155
  40. package/dist/index.mjs +1162 -992
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/{it-43QKJZRF.mjs → it-VDNDMZPU.mjs} +14 -5
  43. package/dist/it-VDNDMZPU.mjs.map +1 -0
  44. package/dist/{ja-SZUXDDO5.mjs → ja-5PEH56J5.mjs} +14 -5
  45. package/dist/ja-5PEH56J5.mjs.map +1 -0
  46. package/dist/{ko-HIR2TG2Q.mjs → ko-JYPL3WVA.mjs} +14 -5
  47. package/dist/ko-JYPL3WVA.mjs.map +1 -0
  48. package/dist/{ms-6EJXSDHO.mjs → ms-5PZVW76T.mjs} +14 -5
  49. package/dist/ms-5PZVW76T.mjs.map +1 -0
  50. package/dist/{nl-AAAXD3KD.mjs → nl-YXES36KM.mjs} +14 -5
  51. package/dist/nl-YXES36KM.mjs.map +1 -0
  52. package/dist/{no-CEBS75VU.mjs → no-XRA2UCQD.mjs} +14 -5
  53. package/dist/no-XRA2UCQD.mjs.map +1 -0
  54. package/dist/{pl-SIB6PH3I.mjs → pl-WH6LJA5G.mjs} +14 -5
  55. package/dist/pl-WH6LJA5G.mjs.map +1 -0
  56. package/dist/{pt-6BMNSQTQ.mjs → pt-7GAG57BM.mjs} +14 -5
  57. package/dist/pt-7GAG57BM.mjs.map +1 -0
  58. package/dist/{ro-63CZRSZ7.mjs → ro-BTDDRB7N.mjs} +14 -5
  59. package/dist/ro-BTDDRB7N.mjs.map +1 -0
  60. package/dist/{sv-BRAAQGIC.mjs → sv-7V5C2IT4.mjs} +14 -5
  61. package/dist/sv-7V5C2IT4.mjs.map +1 -0
  62. package/dist/test-utils.css +112 -0
  63. package/dist/test-utils.css.map +1 -0
  64. package/dist/test-utils.mjs +2 -2
  65. package/dist/{th-DQEDBNDR.mjs → th-LPKYLBX5.mjs} +14 -5
  66. package/dist/th-LPKYLBX5.mjs.map +1 -0
  67. package/dist/{tr-IR5MEUEU.mjs → tr-DU4RQL4M.mjs} +14 -5
  68. package/dist/tr-DU4RQL4M.mjs.map +1 -0
  69. package/dist/{uk-BVRTOFAO.mjs → uk-36UHTDDI.mjs} +14 -5
  70. package/dist/uk-36UHTDDI.mjs.map +1 -0
  71. package/dist/{vi-QRBKNVJA.mjs → vi-GDHOUZDH.mjs} +14 -5
  72. package/dist/vi-GDHOUZDH.mjs.map +1 -0
  73. package/dist/{zh-VQVBROMT.mjs → zh-TYUID4XZ.mjs} +14 -5
  74. package/dist/zh-TYUID4XZ.mjs.map +1 -0
  75. package/package.json +3 -3
  76. package/src/components/Button/Button.tsx +192 -0
  77. package/src/components/Button/__tests__/Button.test.tsx +416 -0
  78. package/src/components/CodeMirrorRenderer.tsx +657 -0
  79. package/src/components/DetectionProgressWidget.tsx +102 -0
  80. package/src/components/ErrorBoundary.tsx +171 -0
  81. package/src/components/LiveRegion.tsx +213 -0
  82. package/src/components/ResizeHandle.tsx +151 -0
  83. package/src/components/ResourceTagsInline.tsx +34 -0
  84. package/src/components/SessionExpiryBanner.tsx +50 -0
  85. package/src/components/SessionTimer.tsx +17 -0
  86. package/src/{styles/components/status-display.css → components/StatusDisplay.css} +72 -82
  87. package/src/components/StatusDisplay.tsx +96 -0
  88. package/src/{styles/components/toast.css → components/Toast.css} +23 -19
  89. package/src/components/Toast.tsx +149 -0
  90. package/src/components/Toolbar.tsx +126 -0
  91. package/src/components/UserMenuSkeleton.tsx +13 -0
  92. package/src/components/__tests__/ErrorBoundary.test.tsx +514 -0
  93. package/src/components/__tests__/LiveRegion.a11y.test.tsx +258 -0
  94. package/src/components/__tests__/ResourceTagsInline.test.tsx +180 -0
  95. package/src/components/__tests__/SessionTimer.test.tsx +194 -0
  96. package/src/components/__tests__/Toast.test.tsx +93 -0
  97. package/src/components/__tests__/UserMenuSkeleton.test.tsx +172 -0
  98. package/src/components/annotation/AnnotateToolbar.tsx +426 -0
  99. package/src/components/annotation/__tests__/AnnotateToolbar.test.tsx +413 -0
  100. package/src/components/annotation-popups/JsonLdView.tsx +121 -0
  101. package/src/components/annotation-popups/SharedPopupElements.tsx +127 -0
  102. package/src/components/branding/SemiontBranding.tsx +46 -0
  103. package/src/components/branding/__tests__/SemiontBranding.test.tsx +358 -0
  104. package/src/components/error-states/ResourceErrorState.tsx +27 -0
  105. package/src/components/error-states/__tests__/ResourceErrorState.test.tsx +99 -0
  106. package/src/components/image-annotation/AnnotationOverlay.tsx +261 -0
  107. package/src/components/image-annotation/SvgDrawingCanvas.tsx +421 -0
  108. package/src/components/layout/LeftSidebar.tsx +149 -0
  109. package/src/components/layout/PageLayout.tsx +71 -0
  110. package/src/components/layout/SkipLinks.tsx +35 -0
  111. package/src/components/layout/UnifiedHeader.tsx +165 -0
  112. package/src/components/layout/__tests__/LeftSidebar.test.tsx +429 -0
  113. package/src/components/layout/__tests__/PageLayout.test.tsx +417 -0
  114. package/src/components/layout/__tests__/SkipLinks.a11y.test.tsx +281 -0
  115. package/src/components/layout/__tests__/UnifiedHeader.test.tsx +574 -0
  116. package/src/components/loading-states/ComposeLoadingState.tsx +19 -0
  117. package/src/components/loading-states/ResourceLoadingState.tsx +13 -0
  118. package/src/components/loading-states/__tests__/ComposeLoadingState.test.tsx +37 -0
  119. package/src/components/loading-states/__tests__/ResourceLoadingState.test.tsx +31 -0
  120. package/src/components/modals/KeyboardShortcutsHelpModal.tsx +218 -0
  121. package/src/components/modals/ProposeEntitiesModal.tsx +181 -0
  122. package/src/components/modals/ResourceSearchModal.tsx +208 -0
  123. package/src/components/modals/SearchModal.tsx +282 -0
  124. package/src/components/modals/__tests__/SearchModal.accessibility.test.tsx +90 -0
  125. package/src/components/modals/__tests__/SearchModal.basic.test.tsx +126 -0
  126. package/src/components/modals/__tests__/SearchModal.keyboard.test.tsx +124 -0
  127. package/src/components/modals/__tests__/SearchModal.visual.test.tsx +168 -0
  128. package/src/{styles/components/collapsible-resource-navigation.css → components/navigation/CollapsibleResourceNavigation.css} +11 -27
  129. package/src/components/navigation/CollapsibleResourceNavigation.tsx +314 -0
  130. package/src/components/navigation/Footer.tsx +106 -0
  131. package/src/components/navigation/NavigationMenu.tsx +80 -0
  132. package/src/components/navigation/SimpleNavigation.tsx +145 -0
  133. package/src/components/navigation/SortableResourceTab.tsx +99 -0
  134. package/src/components/navigation/__tests__/Footer.a11y.test.tsx +451 -0
  135. package/src/components/navigation/__tests__/Footer.test.tsx +442 -0
  136. package/src/components/navigation/__tests__/NavigationMenu.a11y.test.tsx +322 -0
  137. package/src/components/navigation/__tests__/NavigationMenu.test.tsx +664 -0
  138. package/src/components/pdf-annotation/PdfAnnotationCanvas.client.tsx +10 -0
  139. package/src/components/pdf-annotation/PdfAnnotationCanvas.css +121 -0
  140. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +511 -0
  141. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +191 -0
  142. package/src/components/resource/AnnotateView.tsx +527 -0
  143. package/src/components/resource/AnnotationHistory.tsx +140 -0
  144. package/src/components/resource/BrowseView.tsx +401 -0
  145. package/src/components/resource/HistoryEvent.tsx +171 -0
  146. package/src/components/resource/ResourceViewer.tsx +659 -0
  147. package/src/components/resource/__tests__/annotation-interactions.test.tsx +116 -0
  148. package/src/components/resource/panels/AssessmentEntry.tsx +127 -0
  149. package/src/components/resource/panels/AssessmentPanel.tsx +158 -0
  150. package/src/components/resource/panels/CollaborationPanel.tsx +99 -0
  151. package/src/components/resource/panels/CommentEntry.tsx +156 -0
  152. package/src/components/resource/panels/CommentsPanel.tsx +159 -0
  153. package/src/components/resource/panels/DetectSection.tsx +224 -0
  154. package/src/components/resource/panels/HighlightEntry.tsx +83 -0
  155. package/src/components/resource/panels/HighlightPanel.tsx +104 -0
  156. package/src/components/resource/panels/JsonLdPanel.tsx +103 -0
  157. package/src/components/resource/panels/PanelHeader.tsx +23 -0
  158. package/src/components/resource/panels/ReferenceEntry.tsx +238 -0
  159. package/src/components/resource/panels/ReferencesPanel.tsx +429 -0
  160. package/src/components/resource/panels/ResourceInfoPanel.tsx +141 -0
  161. package/src/components/resource/panels/StatisticsPanel.tsx +140 -0
  162. package/src/components/resource/panels/TagEntry.tsx +76 -0
  163. package/src/components/resource/panels/TaggingPanel.tsx +376 -0
  164. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +370 -0
  165. package/src/components/resource/panels/__tests__/CollaborationPanel.test.tsx +481 -0
  166. package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +575 -0
  167. package/src/components/resource/panels/__tests__/CommentsPanel.test.tsx +702 -0
  168. package/src/components/resource/panels/__tests__/JsonLdPanel.test.tsx +504 -0
  169. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +712 -0
  170. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +274 -0
  171. package/src/components/settings/SettingsPanel.tsx +157 -0
  172. package/src/components/viewers/ImageViewer.tsx +27 -0
  173. package/src/components/viewers/index.ts +1 -0
  174. package/src/examples/button-styled-components.tsx +2 -2
  175. package/src/features/admin-devops/__tests__/AdminDevOpsPage.test.tsx +484 -0
  176. package/src/features/admin-devops/components/AdminDevOpsPage.tsx +154 -0
  177. package/src/features/admin-security/__tests__/AdminSecurityPage.test.tsx +361 -0
  178. package/src/features/admin-security/components/AdminSecurityPage.tsx +198 -0
  179. package/src/features/admin-users/__tests__/AdminUsersPage.test.tsx +385 -0
  180. package/src/features/admin-users/components/AdminUsersPage.tsx +474 -0
  181. package/src/features/auth/__tests__/AuthErrorDisplay.test.tsx +99 -0
  182. package/src/features/auth/__tests__/SignInForm.a11y.test.tsx +443 -0
  183. package/src/features/auth/__tests__/SignUpForm.a11y.test.tsx +421 -0
  184. package/src/features/auth/__tests__/SignUpForm.test.tsx +159 -0
  185. package/src/features/auth/components/AuthErrorDisplay.tsx +82 -0
  186. package/src/features/auth/components/SignInForm.tsx +283 -0
  187. package/src/features/auth/components/SignUpForm.tsx +137 -0
  188. package/src/features/auth-welcome/__tests__/WelcomePage.test.tsx +317 -0
  189. package/src/features/auth-welcome/components/WelcomePage.tsx +238 -0
  190. package/src/features/moderate-entity-tags/__tests__/EntityTagsPage.test.tsx +378 -0
  191. package/src/features/moderate-entity-tags/components/EntityTagsPage.tsx +171 -0
  192. package/src/features/moderate-recent/__tests__/RecentDocumentsPage.test.tsx +454 -0
  193. package/src/features/moderate-recent/components/RecentDocumentsPage.tsx +116 -0
  194. package/src/features/moderate-tag-schemas/__tests__/TagSchemasPage.test.tsx +463 -0
  195. package/src/features/moderate-tag-schemas/components/TagSchemasPage.tsx +172 -0
  196. package/src/features/resource-compose/__tests__/ResourceComposePage.test.tsx +477 -0
  197. package/src/features/resource-compose/components/ResourceComposePage.tsx +627 -0
  198. package/src/features/resource-discovery/__tests__/ResourceCard.test.tsx +318 -0
  199. package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +365 -0
  200. package/src/features/resource-discovery/components/ResourceCard.tsx +76 -0
  201. package/src/features/resource-discovery/components/ResourceDiscoveryPage.tsx +291 -0
  202. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +268 -0
  203. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +757 -0
  204. package/src/integrations/css-modules-helper.tsx +4 -4
  205. package/src/styles/index.css +42 -40
  206. package/src/styles/utilities/focus-extended.css +1 -14
  207. package/src/styles/utilities/motion-overrides.css +1 -1
  208. package/translations/ar.json +13 -4
  209. package/translations/bn.json +13 -4
  210. package/translations/cs.json +13 -4
  211. package/translations/da.json +13 -4
  212. package/translations/de.json +13 -4
  213. package/translations/el.json +13 -4
  214. package/translations/en.json +13 -4
  215. package/translations/es.json +13 -4
  216. package/translations/fa.json +13 -4
  217. package/translations/fi.json +13 -4
  218. package/translations/fr.json +13 -4
  219. package/translations/he.json +13 -4
  220. package/translations/hi.json +13 -4
  221. package/translations/id.json +13 -4
  222. package/translations/it.json +13 -4
  223. package/translations/ja.json +13 -4
  224. package/translations/ko.json +13 -4
  225. package/translations/ms.json +13 -4
  226. package/translations/nl.json +13 -4
  227. package/translations/no.json +13 -4
  228. package/translations/pl.json +13 -4
  229. package/translations/pt.json +13 -4
  230. package/translations/ro.json +13 -4
  231. package/translations/sv.json +13 -4
  232. package/translations/th.json +13 -4
  233. package/translations/tr.json +13 -4
  234. package/translations/uk.json +13 -4
  235. package/translations/vi.json +13 -4
  236. package/translations/zh.json +13 -4
  237. package/dist/PdfAnnotationCanvas.client-7FE67FUX.css.map +0 -1
  238. package/dist/PdfAnnotationCanvas.client-UW5TZJL2.mjs.map +0 -1
  239. package/dist/ar-6QTTYSKD.mjs.map +0 -1
  240. package/dist/bn-AHD2VP4T.mjs.map +0 -1
  241. package/dist/chunk-GDEHLKCO.mjs.map +0 -1
  242. package/dist/chunk-WHI4ECK4.mjs.map +0 -1
  243. package/dist/cs-WKZ5PTM3.mjs.map +0 -1
  244. package/dist/da-JLWQLEH2.mjs.map +0 -1
  245. package/dist/de-TOCT63PC.mjs.map +0 -1
  246. package/dist/el-2XXDPBHO.mjs.map +0 -1
  247. package/dist/es-VQZSZSKB.mjs.map +0 -1
  248. package/dist/fa-HFYV6XFA.mjs.map +0 -1
  249. package/dist/fi-GYTT42QN.mjs.map +0 -1
  250. package/dist/fr-RBOM5A35.mjs.map +0 -1
  251. package/dist/he-KNB7K2AV.mjs.map +0 -1
  252. package/dist/hi-QJ6E72XH.mjs.map +0 -1
  253. package/dist/id-EKQVDHC7.mjs.map +0 -1
  254. package/dist/it-43QKJZRF.mjs.map +0 -1
  255. package/dist/ja-SZUXDDO5.mjs.map +0 -1
  256. package/dist/ko-HIR2TG2Q.mjs.map +0 -1
  257. package/dist/ms-6EJXSDHO.mjs.map +0 -1
  258. package/dist/nl-AAAXD3KD.mjs.map +0 -1
  259. package/dist/no-CEBS75VU.mjs.map +0 -1
  260. package/dist/pl-SIB6PH3I.mjs.map +0 -1
  261. package/dist/pt-6BMNSQTQ.mjs.map +0 -1
  262. package/dist/ro-63CZRSZ7.mjs.map +0 -1
  263. package/dist/sv-BRAAQGIC.mjs.map +0 -1
  264. package/dist/th-DQEDBNDR.mjs.map +0 -1
  265. package/dist/tr-IR5MEUEU.mjs.map +0 -1
  266. package/dist/uk-BVRTOFAO.mjs.map +0 -1
  267. package/dist/vi-QRBKNVJA.mjs.map +0 -1
  268. package/dist/zh-VQVBROMT.mjs.map +0 -1
  269. /package/dist/{en-OAKDUA6C.mjs.map → en-EVMIX24Y.mjs.map} +0 -0
  270. /package/src/{styles/components → components/annotation}/annotation-entries.css +0 -0
  271. /package/src/{styles/components → components/annotation}/annotations.css +0 -0
  272. /package/src/{styles/components → components/annotation}/references.css +0 -0
  273. /package/src/{styles/components/branding.css → components/branding/Branding.css} +0 -0
  274. /package/src/{styles/patterns → components/error-states}/errors.css +0 -0
  275. /package/src/{styles/components/footer.css → components/layout/Footer.css} +0 -0
  276. /package/src/{styles/components/header.css → components/layout/Header.css} +0 -0
  277. /package/src/{styles/components/left-sidebar.css → components/layout/LeftSidebar.css} +0 -0
  278. /package/src/{styles/components/resize-handle.css → components/layout/ResizeHandle.css} +0 -0
  279. /package/src/{styles/components/skip-links.css → components/layout/SkipLinks.css} +0 -0
  280. /package/src/{styles/patterns → components/loading-states}/loading.css +0 -0
  281. /package/src/{styles/components/search-modal.css → components/modals/SearchModal.css} +0 -0
  282. /package/src/{styles/components → components/modals}/modals.css +0 -0
  283. /package/src/{styles/components/navigation-menu.css → components/navigation/NavigationMenu.css} +0 -0
  284. /package/src/{styles/components/navigation-tabs.css → components/navigation/NavigationTabs.css} +0 -0
  285. /package/src/{styles/panels/assessment-panel.css → components/resource/panels/AssessmentPanel.css} +0 -0
  286. /package/src/{styles/panels/collaboration-panel.css → components/resource/panels/CollaborationPanel.css} +0 -0
  287. /package/src/{styles/panels/comments-panel.css → components/resource/panels/CommentsPanel.css} +0 -0
  288. /package/src/{styles/components/detection-widget.css → components/resource/panels/DetectSection.css} +0 -0
  289. /package/src/{styles/panels/highlight-panel.css → components/resource/panels/HighlightPanel.css} +0 -0
  290. /package/src/{styles/panels/jsonld-panel.css → components/resource/panels/JsonLdPanel.css} +0 -0
  291. /package/src/{styles/panels/references-panel.css → components/resource/panels/ReferencesPanel.css} +0 -0
  292. /package/src/{styles/panels/resource-info-panel.css → components/resource/panels/ResourceInfoPanel.css} +0 -0
  293. /package/src/{styles/panels/statistics-panel.css → components/resource/panels/StatisticsPanel.css} +0 -0
  294. /package/src/{styles/panels/tagging-panel.css → components/resource/panels/TaggingPanel.css} +0 -0
  295. /package/src/{styles/panels/unified-annotations-panel.css → components/resource/panels/UnifiedAnnotationsPanel.css} +0 -0
  296. /package/src/{styles/panels/settings-panel.css → components/settings/SettingsPanel.css} +0 -0
  297. /package/src/{styles/components/toolbar.css → components/toolbar/Toolbar.css} +0 -0
  298. /package/src/{styles/components → features/auth}/auth.css +0 -0
  299. /package/src/styles/{components → patterns}/cards.css +0 -0
  300. /package/src/styles/{components/panels.css → patterns/panel-helpers.css} +0 -0
  301. /package/src/styles/{components → patterns}/panel-sections.css +0 -0
  302. /package/src/styles/{components → patterns}/panels-base.css +0 -0
  303. /package/src/styles/{components → patterns}/tables.css +0 -0
package/README.md CHANGED
@@ -47,6 +47,25 @@ npm install @semiont/react-ui @semiont/api-client @tanstack/react-query
47
47
  }
48
48
  ```
49
49
 
50
+ ### CSS Setup
51
+
52
+ Import the styles in your app's main CSS file:
53
+
54
+ ```css
55
+ /* Your app's main CSS file (e.g., globals.css, app.css) */
56
+ @import '@semiont/react-ui/styles';
57
+ ```
58
+
59
+ **Requirements:**
60
+ - Your build system must support PostCSS with `postcss-import` plugin
61
+ - This is standard in Next.js, Vite, and most modern build tools
62
+ - The package exports source CSS files, which your build system will process
63
+
64
+ **What this does:**
65
+ - Imports all component styles, design tokens, and CSS variables
66
+ - Your build tool processes the `@import` statements and bundles the CSS
67
+ - No additional configuration needed in most frameworks
68
+
50
69
  ## Quick Start
51
70
 
52
71
  ### 1. Set Up Providers
@@ -7,14 +7,13 @@ import { useRef, useState, useCallback, useEffect } from "react";
7
7
  import { getTargetSelector } from "@semiont/api-client";
8
8
 
9
9
  // src/lib/pdf-coordinates.ts
10
- function canvasToPdfCoordinates(canvasRect, page, pageWidth, pageHeight, scale = 1) {
10
+ function canvasToPdfCoordinates(canvasRect, page, _pageWidth, pageHeight, scale = 1) {
11
11
  const x1 = Math.min(canvasRect.startX, canvasRect.endX);
12
12
  const y1 = Math.min(canvasRect.startY, canvasRect.endY);
13
13
  const x2 = Math.max(canvasRect.startX, canvasRect.endX);
14
14
  const y2 = Math.max(canvasRect.startY, canvasRect.endY);
15
15
  const pdfX = x1 / scale;
16
16
  const pdfWidth = (x2 - x1) / scale;
17
- const canvasHeight = pageHeight * scale;
18
17
  const pdfY = pageHeight - y2 / scale;
19
18
  const pdfHeight = (y2 - y1) / scale;
20
19
  return {
@@ -163,7 +162,6 @@ function PdfAnnotationCanvas({
163
162
  const [pdfDoc, setPdfDoc] = useState(null);
164
163
  const [numPages, setNumPages] = useState(0);
165
164
  const [pageNumber, setPageNumber] = useState(1);
166
- const [currentPage, setCurrentPage] = useState(null);
167
165
  const [pageImageUrl, setPageImageUrl] = useState(null);
168
166
  const [isLoading, setIsLoading] = useState(true);
169
167
  const [error, setError] = useState(null);
@@ -205,7 +203,6 @@ function PdfAnnotationCanvas({
205
203
  try {
206
204
  const page = await doc.getPage(pageNumber);
207
205
  if (cancelled) return;
208
- setCurrentPage(page);
209
206
  const viewport = page.getViewport({ scale: 1 });
210
207
  setPageDimensions({
211
208
  width: viewport.width,
@@ -254,7 +251,7 @@ function PdfAnnotationCanvas({
254
251
  };
255
252
  }, [pageImageUrl]);
256
253
  const handleMouseDown = useCallback((e) => {
257
- if (!drawingMode || drawingMode !== "rectangle") return;
254
+ if (!drawingMode) return;
258
255
  if (!imageRef.current) return;
259
256
  const rect = imageRef.current.getBoundingClientRect();
260
257
  const x = e.clientX - rect.left;
@@ -293,13 +290,13 @@ function PdfAnnotationCanvas({
293
290
  if (!fragmentSel) return false;
294
291
  const pdfCoord2 = parseFragmentSelector(fragmentSel.value);
295
292
  if (!pdfCoord2) return false;
296
- const rect = pdfToCanvasCoordinates(pdfCoord2, pageDimensions.height, 1);
293
+ const rect2 = pdfToCanvasCoordinates(pdfCoord2, pageDimensions.height, 1);
297
294
  const scaleX2 = displayDimensions.width / pageDimensions.width;
298
295
  const scaleY2 = displayDimensions.height / pageDimensions.height;
299
- const displayX = rect.x * scaleX2;
300
- const displayY = rect.y * scaleY2;
301
- const displayWidth = rect.width * scaleX2;
302
- const displayHeight = rect.height * scaleY2;
296
+ const displayX = rect2.x * scaleX2;
297
+ const displayY = rect2.y * scaleY2;
298
+ const displayWidth = rect2.width * scaleX2;
299
+ const displayHeight = rect2.height * scaleY2;
303
300
  return selection.endX >= displayX && selection.endX <= displayX + displayWidth && selection.endY >= displayY && selection.endY <= displayY + displayHeight;
304
301
  });
305
302
  if (clickedAnnotation) {
@@ -330,9 +327,15 @@ function PdfAnnotationCanvas({
330
327
  // Use scale 1.0 since we already scaled to native coords
331
328
  );
332
329
  const fragmentSelector = createFragmentSelector(pdfCoord);
333
- onAnnotationCreate(fragmentSelector);
330
+ const centerX = (selection.startX + selection.endX) / 2;
331
+ const centerY = (selection.startY + selection.endY) / 2;
332
+ const rect = imageRef.current?.getBoundingClientRect();
333
+ const screenPosition = rect ? {
334
+ x: rect.left + centerX,
335
+ y: rect.top + centerY
336
+ } : void 0;
337
+ onAnnotationCreate(fragmentSelector, screenPosition);
334
338
  setIsDrawing(false);
335
- setSelection(null);
336
339
  }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, onAnnotationCreate, onAnnotationClick, existingAnnotations]);
337
340
  const getFragmentSelector = (target) => {
338
341
  const selector = getTargetSelector(target);
@@ -359,6 +362,7 @@ function PdfAnnotationCanvas({
359
362
  {
360
363
  ref: containerRef,
361
364
  className: "semiont-pdf-annotation-canvas__container",
365
+ style: { display: isLoading ? "none" : void 0 },
362
366
  onMouseDown: handleMouseDown,
363
367
  onMouseMove: handleMouseMove,
364
368
  onMouseUp: handleMouseUp,
@@ -377,77 +381,86 @@ function PdfAnnotationCanvas({
377
381
  src: pageImageUrl,
378
382
  alt: `PDF page ${pageNumber}`,
379
383
  className: "semiont-pdf-annotation-canvas__image",
380
- draggable: false
384
+ draggable: false,
385
+ style: { pointerEvents: "none" },
386
+ onLoad: () => {
387
+ requestAnimationFrame(() => {
388
+ requestAnimationFrame(() => {
389
+ if (imageRef.current) {
390
+ setDisplayDimensions({
391
+ width: imageRef.current.clientWidth,
392
+ height: imageRef.current.clientHeight
393
+ });
394
+ }
395
+ });
396
+ });
397
+ }
381
398
  }
382
399
  ),
383
- displayDimensions && pageDimensions && /* @__PURE__ */ jsx("div", { className: "semiont-pdf-annotation-canvas__overlay-container", children: /* @__PURE__ */ jsx(
384
- "div",
400
+ displayDimensions && pageDimensions && /* @__PURE__ */ jsx("div", { className: "semiont-pdf-annotation-canvas__overlay-container", children: /* @__PURE__ */ jsx("div", { className: "semiont-pdf-annotation-canvas__overlay", children: /* @__PURE__ */ jsxs(
401
+ "svg",
385
402
  {
386
- className: "semiont-pdf-annotation-canvas__overlay",
387
- style: {
388
- width: displayDimensions.width,
389
- height: displayDimensions.height
390
- },
391
- children: /* @__PURE__ */ jsxs(
392
- "svg",
393
- {
394
- className: "semiont-pdf-annotation-canvas__svg",
395
- style: {
396
- width: displayDimensions.width,
397
- height: displayDimensions.height
398
- },
399
- children: [
400
- pageAnnotations.map((ann) => {
401
- const fragmentSel = getFragmentSelector(ann.target);
402
- if (!fragmentSel) return null;
403
- const pdfCoord = parseFragmentSelector(fragmentSel.value);
404
- if (!pdfCoord) return null;
405
- const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1);
406
- const scaleX = displayDimensions.width / pageDimensions.width;
407
- const scaleY = displayDimensions.height / pageDimensions.height;
408
- const isHovered = ann.id === hoveredAnnotationId;
409
- const isSelected = ann.id === selectedAnnotationId;
410
- return /* @__PURE__ */ jsx(
411
- "rect",
412
- {
413
- x: rect.x * scaleX,
414
- y: rect.y * scaleY,
415
- width: rect.width * scaleX,
416
- height: rect.height * scaleY,
417
- stroke,
418
- strokeWidth: isSelected ? 4 : isHovered ? 3 : 2,
419
- fill,
420
- style: {
421
- pointerEvents: "auto",
422
- cursor: "pointer",
423
- opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7
424
- },
425
- onClick: () => onAnnotationClick?.(ann),
426
- onMouseEnter: () => onAnnotationHover?.(ann.id),
427
- onMouseLeave: () => onAnnotationHover?.(null)
428
- },
429
- ann.id
430
- );
431
- }),
432
- selection && isDrawing && /* @__PURE__ */ jsx(
433
- "rect",
434
- {
435
- x: Math.min(selection.startX, selection.endX),
436
- y: Math.min(selection.startY, selection.endY),
437
- width: Math.abs(selection.endX - selection.startX),
438
- height: Math.abs(selection.endY - selection.startY),
439
- stroke,
440
- strokeWidth: 2,
441
- strokeDasharray: "5,5",
442
- fill,
443
- pointerEvents: "none"
444
- }
445
- )
446
- ]
447
- }
448
- )
403
+ className: "semiont-pdf-annotation-canvas__svg",
404
+ width: displayDimensions.width,
405
+ height: displayDimensions.height,
406
+ children: [
407
+ pageAnnotations.map((ann) => {
408
+ const fragmentSel = getFragmentSelector(ann.target);
409
+ if (!fragmentSel) return null;
410
+ const pdfCoord = parseFragmentSelector(fragmentSel.value);
411
+ if (!pdfCoord) return null;
412
+ const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1);
413
+ const scaleX = displayDimensions.width / pageDimensions.width;
414
+ const scaleY = displayDimensions.height / pageDimensions.height;
415
+ const isHovered = ann.id === hoveredAnnotationId;
416
+ const isSelected = ann.id === selectedAnnotationId;
417
+ const annMotivation = ann.motivation;
418
+ const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);
419
+ return /* @__PURE__ */ jsx(
420
+ "rect",
421
+ {
422
+ x: rect.x * scaleX,
423
+ y: rect.y * scaleY,
424
+ width: rect.width * scaleX,
425
+ height: rect.height * scaleY,
426
+ stroke: annStroke,
427
+ strokeWidth: isSelected ? 4 : isHovered ? 3 : 2,
428
+ fill: annFill,
429
+ style: {
430
+ pointerEvents: "auto",
431
+ cursor: "pointer",
432
+ opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7
433
+ },
434
+ onClick: () => onAnnotationClick?.(ann),
435
+ onMouseEnter: () => onAnnotationHover?.(ann.id),
436
+ onMouseLeave: () => onAnnotationHover?.(null)
437
+ },
438
+ ann.id
439
+ );
440
+ }),
441
+ selection && (() => {
442
+ const rectX = Math.min(selection.startX, selection.endX);
443
+ const rectY = Math.min(selection.startY, selection.endY);
444
+ const rectWidth = Math.abs(selection.endX - selection.startX);
445
+ const rectHeight = Math.abs(selection.endY - selection.startY);
446
+ return /* @__PURE__ */ jsx(
447
+ "rect",
448
+ {
449
+ x: rectX,
450
+ y: rectY,
451
+ width: rectWidth,
452
+ height: rectHeight,
453
+ stroke,
454
+ strokeWidth: 2,
455
+ strokeDasharray: "5,5",
456
+ fill,
457
+ pointerEvents: "none"
458
+ }
459
+ );
460
+ })()
461
+ ]
449
462
  }
450
- ) })
463
+ ) }) })
451
464
  ]
452
465
  }
453
466
  ),
@@ -482,4 +495,4 @@ function PdfAnnotationCanvas({
482
495
  export {
483
496
  PdfAnnotationCanvas
484
497
  };
485
- //# sourceMappingURL=PdfAnnotationCanvas.client-UW5TZJL2.mjs.map
498
+ //# sourceMappingURL=PdfAnnotationCanvas.client-ADC4FFSE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/pdf-annotation/PdfAnnotationCanvas.tsx","../src/lib/pdf-coordinates.ts","../src/lib/browser-pdfjs.ts"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState, useCallback, useEffect } from 'react';\nimport type { components, ResourceUri } from '@semiont/api-client';\nimport { getTargetSelector } from '@semiont/api-client';\nimport type { SelectionMotivation } from '../annotation/AnnotateToolbar';\nimport {\n canvasToPdfCoordinates,\n pdfToCanvasCoordinates,\n createFragmentSelector,\n parseFragmentSelector,\n getPageFromFragment,\n type CanvasRectangle\n} from '../../lib/pdf-coordinates';\nimport {\n loadPdfDocument,\n renderPdfPageToDataUrl,\n type PDFDocumentProxy\n} from '../../lib/browser-pdfjs';\nimport './PdfAnnotationCanvas.css';\n\ntype Annotation = components['schemas']['Annotation'];\n\nexport type DrawingMode = 'rectangle' | 'circle' | 'polygon' | null;\n\n/**\n * Get color for annotation based on motivation\n */\nfunction getMotivationColor(motivation: SelectionMotivation | null): { stroke: string; fill: string } {\n if (!motivation) {\n return { stroke: 'rgb(156, 163, 175)', fill: 'rgba(156, 163, 175, 0.2)' };\n }\n\n switch (motivation) {\n case 'highlighting':\n return { stroke: 'rgb(250, 204, 21)', fill: 'rgba(250, 204, 21, 0.3)' };\n case 'linking':\n return { stroke: 'rgb(59, 130, 246)', fill: 'rgba(59, 130, 246, 0.2)' };\n case 'assessing':\n return { stroke: 'rgb(239, 68, 68)', fill: 'rgba(239, 68, 68, 0.2)' };\n case 'commenting':\n return { stroke: 'rgb(255, 255, 255)', fill: 'rgba(255, 255, 255, 0.2)' };\n default:\n return { stroke: 'rgb(156, 163, 175)', fill: 'rgba(156, 163, 175, 0.2)' };\n }\n}\n\ninterface PdfAnnotationCanvasProps {\n resourceUri: ResourceUri;\n existingAnnotations?: Annotation[];\n drawingMode: DrawingMode;\n selectedMotivation?: SelectionMotivation | null;\n onAnnotationCreate?: (fragmentSelector: string, position?: { x: number; y: number }) => void;\n onAnnotationClick?: (annotation: Annotation) => void;\n onAnnotationHover?: (annotationId: string | null) => void;\n hoveredAnnotationId?: string | null;\n selectedAnnotationId?: string | null;\n}\n\nexport function PdfAnnotationCanvas({\n resourceUri,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n onAnnotationCreate,\n onAnnotationClick,\n onAnnotationHover,\n hoveredAnnotationId,\n selectedAnnotationId\n}: PdfAnnotationCanvasProps) {\n const resourceId = resourceUri.split('/').pop();\n const pdfUrl = `/api/resources/${resourceId}`;\n\n // Removed excessive logging\n\n // PDF state\n const [pdfDoc, setPdfDoc] = useState<PDFDocumentProxy | null>(null);\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [pageImageUrl, setPageImageUrl] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [pageDimensions, setPageDimensions] = useState<{ width: number; height: number } | null>(null);\n const [displayDimensions, setDisplayDimensions] = useState<{ width: number; height: number } | null>(null);\n const [scale] = useState(1.5); // Fixed scale for better quality\n\n // Drawing state\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState<CanvasRectangle | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n\n // Load PDF document on mount\n useEffect(() => {\n let cancelled = false;\n\n async function loadPdf() {\n try {\n setIsLoading(true);\n setError(null);\n\n const doc = await loadPdfDocument(pdfUrl);\n\n if (cancelled) return;\n\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n } catch (err) {\n if (cancelled) return;\n\n console.error('Error loading PDF:', err);\n setError('Failed to load PDF');\n setIsLoading(false);\n }\n }\n\n loadPdf();\n\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n\n // Load current page when page number changes\n useEffect(() => {\n if (!pdfDoc) return;\n\n let cancelled = false;\n const doc = pdfDoc;\n\n async function loadPage() {\n try {\n const page = await doc.getPage(pageNumber);\n\n if (cancelled) return;\n\n // Get page dimensions (at scale 1.0)\n const viewport = page.getViewport({ scale: 1.0 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height\n });\n\n // Render page to image\n const { dataUrl } = await renderPdfPageToDataUrl(page, scale);\n\n if (cancelled) return;\n\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n\n console.error('Error loading page:', err);\n setError('Failed to load page');\n }\n }\n\n loadPage();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, pageNumber, scale]);\n\n // Update display dimensions on resize\n useEffect(() => {\n const updateDisplayDimensions = () => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n };\n\n updateDisplayDimensions();\n\n // Use ResizeObserver to detect image element size changes\n // This catches: sidebar open/close, window resize, font size changes, etc.\n let resizeObserver: ResizeObserver | null = null;\n\n try {\n resizeObserver = new ResizeObserver(updateDisplayDimensions);\n if (imageRef.current) {\n resizeObserver.observe(imageRef.current);\n }\n } catch (error) {\n // Fallback for browsers without ResizeObserver support\n console.warn('ResizeObserver not supported, falling back to window resize listener');\n window.addEventListener('resize', updateDisplayDimensions);\n }\n\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else {\n window.removeEventListener('resize', updateDisplayDimensions);\n }\n };\n }, [pageImageUrl]);\n\n // Mouse event handlers for drawing\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (!drawingMode) return;\n if (!imageRef.current) return;\n\n const rect = imageRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n // Clear any previous selection when starting new drawing\n setIsDrawing(true);\n setSelection({\n startX: x,\n startY: y,\n endX: x,\n endY: y\n });\n }, [drawingMode]);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDrawing || !selection || !imageRef.current) return;\n\n const rect = imageRef.current.getBoundingClientRect();\n\n setSelection({\n ...selection,\n endX: e.clientX - rect.left,\n endY: e.clientY - rect.top\n });\n }, [isDrawing, selection]);\n\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !selection || !pageDimensions || !displayDimensions || !onAnnotationCreate) {\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n\n // Calculate drag distance\n const dragDistance = Math.sqrt(\n Math.pow(selection.endX - selection.startX, 2) +\n Math.pow(selection.endY - selection.startY, 2)\n );\n\n // Minimum drag threshold in pixels (10px)\n const MIN_DRAG_DISTANCE = 10;\n\n if (dragDistance < MIN_DRAG_DISTANCE) {\n // This was a click, not a drag - check if we clicked an existing annotation\n if (onAnnotationClick && existingAnnotations.length > 0) {\n const clickedAnnotation = pageAnnotations.find(ann => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return false;\n\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1.0);\n\n // Scale to display coordinates\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n\n const displayX = rect.x * scaleX;\n const displayY = rect.y * scaleY;\n const displayWidth = rect.width * scaleX;\n const displayHeight = rect.height * scaleY;\n\n return (\n selection.endX >= displayX &&\n selection.endX <= displayX + displayWidth &&\n selection.endY >= displayY &&\n selection.endY <= displayY + displayHeight\n );\n });\n\n if (clickedAnnotation) {\n onAnnotationClick(clickedAnnotation);\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n }\n\n // Click on empty space - do nothing\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n\n // This was a drag - create new annotation\n // Scale selection from display coordinates to native page coordinates\n const scaleX = pageDimensions.width / displayDimensions.width;\n const scaleY = pageDimensions.height / displayDimensions.height;\n\n const nativeSelection: CanvasRectangle = {\n startX: selection.startX * scaleX,\n startY: selection.startY * scaleY,\n endX: selection.endX * scaleX,\n endY: selection.endY * scaleY\n };\n\n // Convert canvas coordinates to PDF coordinates\n const pdfCoord = canvasToPdfCoordinates(\n nativeSelection,\n pageNumber,\n pageDimensions.width,\n pageDimensions.height,\n 1.0 // Use scale 1.0 since we already scaled to native coords\n );\n\n // Create FragmentSelector\n const fragmentSelector = createFragmentSelector(pdfCoord);\n\n // Calculate center position for popup placement (in screen coordinates)\n const centerX = (selection.startX + selection.endX) / 2;\n const centerY = (selection.startY + selection.endY) / 2;\n const rect = imageRef.current?.getBoundingClientRect();\n const screenPosition = rect ? {\n x: rect.left + centerX,\n y: rect.top + centerY\n } : undefined;\n\n onAnnotationCreate(fragmentSelector, screenPosition);\n\n // Keep drawing state active to show preview until annotation is persisted\n // The parent component should clear this by changing drawingMode after save\n setIsDrawing(false);\n // Note: We keep selection so the preview remains visible\n // It will be cleared when drawingMode changes or user starts new selection\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, onAnnotationCreate, onAnnotationClick, existingAnnotations]);\n\n // Helper to get FragmentSelector from annotation target\n const getFragmentSelector = (target: Annotation['target']) => {\n const selector = getTargetSelector(target);\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n\n const found = selectors.find(s => s.type === 'FragmentSelector');\n if (!found || found.type !== 'FragmentSelector') return null;\n return found as { type: 'FragmentSelector'; value: string; conformsTo?: string };\n };\n\n // Filter annotations for current page\n const pageAnnotations = existingAnnotations.filter(ann => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const page = getPageFromFragment(fragmentSel.value);\n return page === pageNumber;\n });\n\n // Calculate motivation color\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n\n if (error) {\n return <div className=\"semiont-pdf-annotation-canvas__error\">{error}</div>;\n }\n\n return (\n <div className=\"semiont-pdf-annotation-canvas\">\n {isLoading && <div className=\"semiont-pdf-annotation-canvas__loading\">Loading PDF...</div>}\n\n <div\n ref={containerRef}\n className=\"semiont-pdf-annotation-canvas__container\"\n style={{ display: isLoading ? 'none' : undefined }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={() => {\n if (isDrawing) {\n setIsDrawing(false);\n setSelection(null);\n }\n }}\n data-drawing-mode={drawingMode || 'none'}\n >\n {/* PDF page rendered as image */}\n {pageImageUrl && (\n <img\n ref={imageRef}\n src={pageImageUrl}\n alt={`PDF page ${pageNumber}`}\n className=\"semiont-pdf-annotation-canvas__image\"\n draggable={false}\n style={{ pointerEvents: 'none' }}\n onLoad={() => {\n // Use double RAF to ensure layout is complete even in onLoad\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n });\n });\n }}\n />\n )}\n\n {/* SVG overlay for annotations */}\n {displayDimensions && pageDimensions && (\n <div className=\"semiont-pdf-annotation-canvas__overlay-container\">\n <div className=\"semiont-pdf-annotation-canvas__overlay\">\n <svg\n className=\"semiont-pdf-annotation-canvas__svg\"\n width={displayDimensions.width}\n height={displayDimensions.height}\n >\n {/* Render existing annotations for this page */}\n {pageAnnotations.map(ann => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return null;\n\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return null;\n\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1.0);\n\n // Scale to display coordinates\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n\n const isHovered = ann.id === hoveredAnnotationId;\n const isSelected = ann.id === selectedAnnotationId;\n\n // Get color for this annotation's motivation (not the selected motivation)\n const annMotivation = ann.motivation as SelectionMotivation | null;\n const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);\n\n return (\n <rect\n key={ann.id}\n x={rect.x * scaleX}\n y={rect.y * scaleY}\n width={rect.width * scaleX}\n height={rect.height * scaleY}\n stroke={annStroke}\n strokeWidth={isSelected ? 4 : isHovered ? 3 : 2}\n fill={annFill}\n style={{\n pointerEvents: 'auto',\n cursor: 'pointer',\n opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7\n }}\n onClick={() => onAnnotationClick?.(ann)}\n onMouseEnter={() => onAnnotationHover?.(ann.id)}\n onMouseLeave={() => onAnnotationHover?.(null)}\n />\n );\n })}\n\n {/* Render current selection while drawing or awaiting save */}\n {selection && (() => {\n const rectX = Math.min(selection.startX, selection.endX);\n const rectY = Math.min(selection.startY, selection.endY);\n const rectWidth = Math.abs(selection.endX - selection.startX);\n const rectHeight = Math.abs(selection.endY - selection.startY);\n\n // PDF only supports rectangle shapes (FragmentSelector with viewrect)\n // Circle/polygon are disabled in the UI for PDF media types\n return (\n <rect\n x={rectX}\n y={rectY}\n width={rectWidth}\n height={rectHeight}\n stroke={stroke}\n strokeWidth={2}\n strokeDasharray=\"5,5\"\n fill={fill}\n pointerEvents=\"none\"\n />\n );\n })()}\n </svg>\n </div>\n </div>\n )}\n </div>\n\n {/* Page navigation controls */}\n {numPages > 0 && (\n <div className=\"semiont-pdf-annotation-canvas__controls\">\n <button\n disabled={pageNumber <= 1}\n onClick={() => setPageNumber(pageNumber - 1)}\n className=\"semiont-pdf-annotation-canvas__button\"\n >\n Previous\n </button>\n <span className=\"semiont-pdf-annotation-canvas__page-info\">\n Page {pageNumber} of {numPages}\n </span>\n <button\n disabled={pageNumber >= numPages}\n onClick={() => setPageNumber(pageNumber + 1)}\n className=\"semiont-pdf-annotation-canvas__button\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * PDF Coordinate Utilities\n *\n * Handles coordinate transformations between:\n * - Canvas space (pixels, top-left origin, Y increases downward)\n * - PDF space (points, bottom-left origin, Y increases upward)\n *\n * Based on RFC 3778 PDF Fragment Identifiers:\n * https://tools.ietf.org/html/rfc3778\n */\n\nexport interface Rectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PdfCoordinate {\n page: number;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface CanvasRectangle {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\n/**\n * Convert canvas coordinates to PDF coordinates\n *\n * Canvas: Origin at top-left, Y increases downward\n * PDF: Origin at bottom-left, Y increases upward\n *\n * @param canvasRect - Rectangle in canvas pixel coordinates\n * @param page - PDF page number (1-indexed)\n * @param pageWidth - PDF page width in points\n * @param pageHeight - PDF page height in points\n * @param scale - Current canvas scale factor\n */\nexport function canvasToPdfCoordinates(\n canvasRect: CanvasRectangle,\n page: number,\n _pageWidth: number,\n pageHeight: number,\n scale: number = 1\n): PdfCoordinate {\n // Normalize rectangle (handle drag in any direction)\n const x1 = Math.min(canvasRect.startX, canvasRect.endX);\n const y1 = Math.min(canvasRect.startY, canvasRect.endY);\n const x2 = Math.max(canvasRect.startX, canvasRect.endX);\n const y2 = Math.max(canvasRect.startY, canvasRect.endY);\n\n // Convert from canvas pixels to PDF points\n const pdfX = x1 / scale;\n const pdfWidth = (x2 - x1) / scale;\n\n // Flip Y coordinate (canvas top-left to PDF bottom-left)\n const pdfY = pageHeight - (y2 / scale);\n const pdfHeight = (y2 - y1) / scale;\n\n return {\n page,\n x: Math.round(pdfX),\n y: Math.round(pdfY),\n width: Math.round(pdfWidth),\n height: Math.round(pdfHeight)\n };\n}\n\n/**\n * Convert PDF coordinates to canvas coordinates\n *\n * @param pdfCoord - Coordinates in PDF space\n * @param pageHeight - PDF page height in points\n * @param scale - Current canvas scale factor\n */\nexport function pdfToCanvasCoordinates(\n pdfCoord: PdfCoordinate,\n pageHeight: number,\n scale: number = 1\n): Rectangle {\n // Convert from PDF points to canvas pixels\n const canvasX = pdfCoord.x * scale;\n const canvasWidth = pdfCoord.width * scale;\n\n // Flip Y coordinate (PDF bottom-left to canvas top-left)\n const canvasY = (pageHeight - pdfCoord.y - pdfCoord.height) * scale;\n const canvasHeight = pdfCoord.height * scale;\n\n return {\n x: canvasX,\n y: canvasY,\n width: canvasWidth,\n height: canvasHeight\n };\n}\n\n/**\n * Generate RFC 3778 FragmentSelector value\n *\n * Format: page=N&viewrect=left,top,width,height\n * All coordinates in PDF points\n */\nexport function createFragmentSelector(coord: PdfCoordinate): string {\n return `page=${coord.page}&viewrect=${coord.x},${coord.y},${coord.width},${coord.height}`;\n}\n\n/**\n * Parse RFC 3778 FragmentSelector value\n *\n * @param fragment - Fragment string like \"page=5&viewrect=100,200,300,400\"\n * @returns Parsed PDF coordinates or null if invalid\n */\nexport function parseFragmentSelector(fragment: string): PdfCoordinate | null {\n try {\n // Parse page number\n const pageMatch = fragment.match(/page=(\\d+)/);\n if (!pageMatch) return null;\n const page = parseInt(pageMatch[1], 10);\n\n // Parse viewrect coordinates\n const viewrectMatch = fragment.match(/viewrect=([\\d.]+),([\\d.]+),([\\d.]+),([\\d.]+)/);\n if (!viewrectMatch) return null;\n\n return {\n page,\n x: parseFloat(viewrectMatch[1]),\n y: parseFloat(viewrectMatch[2]),\n width: parseFloat(viewrectMatch[3]),\n height: parseFloat(viewrectMatch[4])\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Extract page number from FragmentSelector\n */\nexport function getPageFromFragment(fragment: string): number | null {\n const match = fragment.match(/page=(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n","/**\n * Browser PDF.js utilities\n *\n * Uses native browser PDF.js when available, falls back to CDN.\n * Zero npm dependencies - no webpack bundling issues.\n */\n\n// Type definitions for PDF.js API\nexport interface PDFDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<PDFPageProxy>;\n}\n\nexport interface PDFPageProxy {\n getViewport(params: { scale: number; rotation?: number }): PDFViewport;\n render(params: PDFRenderParams): PDFRenderTask;\n getTextContent(): Promise<TextContent>;\n}\n\nexport interface PDFViewport {\n width: number;\n height: number;\n scale: number;\n rotation: number;\n}\n\nexport interface PDFRenderParams {\n canvasContext: CanvasRenderingContext2D;\n viewport: PDFViewport;\n}\n\nexport interface PDFRenderTask {\n promise: Promise<void>;\n cancel(): void;\n}\n\nexport interface PDFLib {\n getDocument(params: { data: ArrayBuffer } | { url: string }): PDFLoadingTask;\n GlobalWorkerOptions: {\n workerSrc: string;\n };\n version: string;\n}\n\nexport interface PDFLoadingTask {\n promise: Promise<PDFDocumentProxy>;\n destroy(): void;\n}\n\n/**\n * Text content types (for Phase 2)\n */\nexport interface TextItem {\n str: string;\n dir: string;\n transform: number[]; // [scaleX, skewX, skewY, scaleY, x, y]\n width: number;\n height: number;\n fontName: string;\n hasEOL: boolean;\n}\n\nexport interface TextContent {\n items: TextItem[];\n styles: Record<string, any>;\n}\n\n/**\n * Ensure PDF.js is available, loading from local public folder if needed\n */\nexport async function ensurePdfJs(): Promise<PDFLib> {\n // Check if already available (browser native or already loaded)\n if (typeof window !== 'undefined' && (window as any).pdfjsLib) {\n return (window as any).pdfjsLib as PDFLib;\n }\n\n // Load from local public folder (staged during build)\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/pdfjs/pdf.min.mjs';\n script.type = 'module';\n\n script.onload = () => {\n const pdfjsLib = (window as any).pdfjsLib as PDFLib;\n\n if (!pdfjsLib) {\n reject(new Error('PDF.js loaded but pdfjsLib not available'));\n return;\n }\n\n // Configure worker (also served from local public folder)\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/pdf.worker.min.mjs';\n\n resolve(pdfjsLib);\n };\n\n script.onerror = () => {\n reject(new Error('Failed to load PDF.js from /pdfjs/pdf.min.mjs'));\n };\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * Load PDF document from URL or ArrayBuffer\n *\n * When given a URL string, fetches the PDF as ArrayBuffer with credentials\n * to ensure authentication cookies are included in the request.\n */\nexport async function loadPdfDocument(\n source: string | ArrayBuffer\n): Promise<PDFDocumentProxy> {\n const pdfjsLib = await ensurePdfJs();\n\n if (typeof source === 'string') {\n // Fetch as ArrayBuffer first to include authentication cookies\n const response = await fetch(source, {\n credentials: 'include',\n headers: {\n 'Accept': 'application/pdf',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch PDF: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer });\n return loadingTask.promise;\n } else {\n const loadingTask = pdfjsLib.getDocument({ data: source });\n return loadingTask.promise;\n }\n}\n\n/**\n * Render PDF page to canvas and return as data URL\n */\nexport async function renderPdfPageToDataUrl(\n page: PDFPageProxy,\n scale = 1.0\n): Promise<{ dataUrl: string; width: number; height: number }> {\n const viewport = page.getViewport({ scale });\n\n // Create canvas\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Failed to get 2D context');\n }\n\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n // Render PDF page to canvas\n const renderTask = page.render({\n canvasContext: context,\n viewport: viewport\n });\n\n await renderTask.promise;\n\n // Convert to data URL\n return {\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height\n };\n}\n\n/**\n * Render PDF page with text content extraction (Phase 2)\n *\n * This function extracts text in parallel with rendering for future\n * text layer support. Currently the text content is available but not used.\n */\nexport async function renderPdfPageWithText(\n page: PDFPageProxy,\n scale = 1.0\n): Promise<{\n dataUrl: string;\n width: number;\n height: number;\n textContent: TextContent;\n}> {\n const viewport = page.getViewport({ scale });\n\n // Create canvas for rendering\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Failed to get 2D context');\n }\n\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n // Render PDF page to canvas\n const renderTask = page.render({\n canvasContext: context,\n viewport: viewport\n });\n\n // Extract text content in parallel (for future text layer support)\n const [, textContent] = await Promise.all([\n renderTask.promise,\n page.getTextContent()\n ]);\n\n // Convert to data URL\n return {\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n textContent\n };\n}\n"],"mappings":"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","names":["error","pdfCoord","rect","scaleX","scaleY"]}
@@ -1,9 +1,7 @@
1
1
  /* src/components/pdf-annotation/PdfAnnotationCanvas.css */
2
2
  .semiont-pdf-annotation-canvas {
3
- display: flex;
4
- flex-direction: column;
5
- height: 100%;
6
- width: 100%;
3
+ position: relative;
4
+ display: inline-block;
7
5
  }
8
6
  .semiont-pdf-annotation-canvas__loading,
9
7
  .semiont-pdf-annotation-canvas__error {
@@ -20,14 +18,7 @@
20
18
  }
21
19
  .semiont-pdf-annotation-canvas__container {
22
20
  position: relative;
23
- flex: 1;
24
- overflow: auto;
25
- display: flex;
26
- justify-content: center;
27
- align-items: flex-start;
28
- padding: 1rem;
29
- }
30
- .semiont-pdf-annotation-canvas__container[data-drawing-mode=rectangle] {
21
+ display: inline-block;
31
22
  cursor: crosshair;
32
23
  }
33
24
  .semiont-pdf-annotation-canvas__container[data-drawing-mode=none] {
@@ -41,6 +32,7 @@
41
32
  -webkit-user-select: none;
42
33
  -moz-user-select: none;
43
34
  user-select: none;
35
+ pointer-events: none;
44
36
  }
45
37
  [data-theme=dark] .semiont-pdf-annotation-canvas__image {
46
38
  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.3), 0 1px 2px -1px rgb(0 0 0 / 0.3);
@@ -51,14 +43,14 @@
51
43
  left: 0;
52
44
  width: 100%;
53
45
  height: 100%;
54
- display: flex;
55
- justify-content: center;
56
- align-items: flex-start;
57
- padding: 1rem;
58
46
  pointer-events: none;
59
47
  }
60
48
  .semiont-pdf-annotation-canvas__overlay {
61
- position: relative;
49
+ position: absolute;
50
+ top: 0;
51
+ left: 0;
52
+ width: 100%;
53
+ height: 100%;
62
54
  pointer-events: none;
63
55
  }
64
56
  .semiont-pdf-annotation-canvas__svg {
@@ -103,4 +95,4 @@
103
95
  min-width: 7rem;
104
96
  text-align: center;
105
97
  }
106
- /*# sourceMappingURL=PdfAnnotationCanvas.client-7FE67FUX.css.map */
98
+ /*# sourceMappingURL=PdfAnnotationCanvas.client-V3E6AHEL.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/pdf-annotation/PdfAnnotationCanvas.css"],"sourcesContent":["/**\n * PDF Annotation Canvas Styles\n *\n * Provides consistent styling for PDF annotation interface,\n * following the same pattern as image annotation (SvgDrawingCanvas).\n */\n\n.semiont-pdf-annotation-canvas {\n position: relative;\n display: inline-block;\n}\n\n.semiont-pdf-annotation-canvas__loading,\n.semiont-pdf-annotation-canvas__error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n/* stylelint-disable semiont/accessibility -- Error indicator added by semantic-indicators.css */\n\n.semiont-pdf-annotation-canvas__error {\n color: var(--error-color);\n}\n\n[data-theme=\"dark\"] .semiont-pdf-annotation-canvas__error {\n color: var(--error-color);\n}\n\n/* stylelint-enable semiont/accessibility */\n\n.semiont-pdf-annotation-canvas__container {\n position: relative;\n display: inline-block;\n cursor: crosshair;\n}\n\n.semiont-pdf-annotation-canvas__container[data-drawing-mode=\"none\"] {\n cursor: default;\n}\n\n.semiont-pdf-annotation-canvas__image {\n display: block;\n max-width: 100%;\n height: auto;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: none;\n}\n\n[data-theme=\"dark\"] .semiont-pdf-annotation-canvas__image {\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.3), 0 1px 2px -1px rgb(0 0 0 / 0.3);\n}\n\n.semiont-pdf-annotation-canvas__overlay-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n\n.semiont-pdf-annotation-canvas__overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n\n.semiont-pdf-annotation-canvas__svg {\n pointer-events: none;\n}\n\n.semiont-pdf-annotation-canvas__svg rect {\n pointer-events: auto;\n}\n\n.semiont-pdf-annotation-canvas__controls {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 1rem;\n padding: 1rem;\n border-top: 1px solid var(--border-color);\n}\n\n.semiont-pdf-annotation-canvas__button {\n padding: 0.5rem 1rem;\n border: 1px solid var(--border-color);\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .semiont-pdf-annotation-canvas__button {\n transition: background-color 0.2s;\n }\n}\n\n.semiont-pdf-annotation-canvas__button:hover:not(:disabled) {\n background-color: var(--hover-color, rgba(0, 0, 0, 0.05));\n}\n\n.semiont-pdf-annotation-canvas__button:focus-visible {\n outline: 2px solid var(--focus-color, #0066cc);\n outline-offset: 2px;\n}\n\n.semiont-pdf-annotation-canvas__button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.semiont-pdf-annotation-canvas__page-info {\n font-size: 0.875rem;\n min-width: 7rem;\n text-align: center;\n}\n\n/*# sourceMappingURL=src/components/pdf-annotation/PdfAnnotationCanvas.css.map */"],"mappings":";AAOA,CAAC;AACC,YAAU;AACV,WAAS;AACX;AAEA,CAAC;AACD,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,WAAS;AACX;AAIA,CATC;AAUC,SAAO,IAAI;AACb;AAEA,CAAC,iBAAmB,CAbnB;AAcC,SAAO,IAAI;AACb;AAIA,CAAC;AACC,YAAU;AACV,WAAS;AACT,UAAQ;AACV;AAEA,CANC,wCAMwC,CAAC;AACxC,UAAQ;AACV;AAEA,CAAC;AACC,WAAS;AACT,aAAW;AACX,UAAQ;AACR,cAAY,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE;AACrE,uBAAqB;AAClB,oBAAkB;AACb,eAAa;AACrB,kBAAgB;AAClB;AAEA,CAAC,iBAAmB,CAXnB;AAYC,cAAY,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE;AACvE;AAEA,CAAC;AACC,YAAU;AACV,OAAK;AACL,QAAM;AACN,SAAO;AACP,UAAQ;AACR,kBAAgB;AAClB;AAEA,CAAC;AACC,YAAU;AACV,OAAK;AACL,QAAM;AACN,SAAO;AACP,UAAQ;AACR,kBAAgB;AAClB;AAEA,CAAC;AACC,kBAAgB;AAClB;AAEA,CAJC,mCAImC;AAClC,kBAAgB;AAClB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,OAAK;AACL,WAAS;AACT,cAAY,IAAI,MAAM,IAAI;AAC5B;AAEA,CAAC;AACC,WAAS,OAAO;AAChB,UAAQ,IAAI,MAAM,IAAI;AACtB,iBAAe;AACf,cAAY;AACZ,UAAQ;AACV;AAEA,QAAO,wBAAyB;AAC9B,GATD;AAUG,gBAAY,iBAAiB;AAC/B;AACF;AAEA,CAdC,qCAcqC,MAAM,KAAK;AAC/C,oBAAkB,IAAI,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACrD;AAEA,CAlBC,qCAkBqC;AACpC,WAAS,IAAI,MAAM,IAAI,aAAa,EAAE;AACtC,kBAAgB;AAClB;AAEA,CAvBC,qCAuBqC;AACpC,WAAS;AACT,UAAQ;AACV;AAEA,CAAC;AACC,aAAW;AACX,aAAW;AACX,cAAY;AACd;","names":[]}
@@ -94,7 +94,9 @@ var CommentsPanel = {
94
94
  toneTechnical: "Technical",
95
95
  densityLabel: "Density",
96
96
  densitySparse: "Sparse",
97
- densityDense: "Dense"
97
+ densityDense: "Dense",
98
+ fragmentSelected: "Fragment selected",
99
+ imageRegionSelected: "Image region selected"
98
100
  };
99
101
  var HighlightPanel = {
100
102
  title: "Highlights",
@@ -113,13 +115,15 @@ var HighlightPanel = {
113
115
  var AssessmentPanel = {
114
116
  title: "Assessments",
115
117
  noAssessments: "No assessments yet. Use AI detection to evaluate passages.",
118
+ assessmentPlaceholder: "Type your assessment here...",
119
+ save: "Save",
120
+ cancel: "Cancel",
116
121
  detectAssessments: "Detect Assessments",
117
122
  instructions: "Instructions",
118
123
  optional: "(optional)",
119
124
  instructionsPlaceholder: "e.g., Evaluate claims for accuracy and evidence...",
120
125
  detect: "Detect",
121
126
  detecting: "Detecting...",
122
- cancel: "Cancel",
123
127
  toneLabel: "Tone",
124
128
  toneOptional: "(optional)",
125
129
  toneAnalytical: "Analytical",
@@ -128,7 +132,9 @@ var AssessmentPanel = {
128
132
  toneConstructive: "Constructive",
129
133
  densityLabel: "Density",
130
134
  densitySparse: "Sparse",
131
- densityDense: "Dense"
135
+ densityDense: "Dense",
136
+ fragmentSelected: "Fragment selected",
137
+ imageRegionSelected: "Image region selected"
132
138
  };
133
139
  var TaggingPanel = {
134
140
  title: "Tags",
@@ -160,7 +166,9 @@ var TaggingPanel = {
160
166
  categoriesSelected: "{count, plural, =0 {No categories selected} =1 {1 category selected} other {# categories selected}}",
161
167
  createTagForSelection: "Create Tag for Selection",
162
168
  selectCategory: "Select Category",
163
- chooseCategory: "Choose a category..."
169
+ chooseCategory: "Choose a category...",
170
+ fragmentSelected: "Fragment selected",
171
+ imageRegionSelected: "Image region selected"
164
172
  };
165
173
  var UnifiedAnnotationsPanel = {
166
174
  title: "Annotations",
@@ -220,6 +228,7 @@ var ReferencesPanel = {
220
228
  noText: "No text",
221
229
  createReference: "Create Reference",
222
230
  entityTypesOptional: "Entity Types (Optional)",
231
+ fragmentSelected: "Fragment selected",
223
232
  imageRegionSelected: "Image region selected",
224
233
  includeDescriptiveReferences: "Include descriptive references",
225
234
  descriptiveReferencesTooltip: "Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)"
@@ -364,4 +373,4 @@ export {
364
373
  UnifiedAnnotationsPanel,
365
374
  ar_default as default
366
375
  };
367
- //# sourceMappingURL=ar-6QTTYSKD.mjs.map
376
+ //# sourceMappingURL=ar-RNNSPLQB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../translations/ar.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 \"detectComments\": \"Detect Comments\",\n \"instructions\": \"Instructions\",\n \"optional\": \"(optional)\",\n \"instructionsPlaceholder\": \"e.g., Focus on technical terminology...\",\n \"detect\": \"Detect\",\n \"detecting\": \"Detecting...\",\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 },\n \"HighlightPanel\": {\n \"title\": \"Highlights\",\n \"noHighlights\": \"No highlights yet. Use AI detection to find important passages.\",\n \"detectHighlights\": \"Detect Highlights\",\n \"instructions\": \"Instructions\",\n \"optional\": \"(optional)\",\n \"instructionsPlaceholder\": \"e.g., Focus on key technical concepts...\",\n \"detect\": \"Detect\",\n \"detecting\": \"Detecting...\",\n \"cancel\": \"Cancel\",\n \"densityLabel\": \"Density\",\n \"densitySparse\": \"Sparse\",\n \"densityDense\": \"Dense\"\n },\n \"AssessmentPanel\": {\n \"title\": \"Assessments\",\n \"noAssessments\": \"No assessments yet. Use AI detection to evaluate passages.\",\n \"assessmentPlaceholder\": \"Type your assessment here...\",\n \"save\": \"Save\",\n \"cancel\": \"Cancel\",\n \"detectAssessments\": \"Detect Assessments\",\n \"instructions\": \"Instructions\",\n \"optional\": \"(optional)\",\n \"instructionsPlaceholder\": \"e.g., Evaluate claims for accuracy and evidence...\",\n \"detect\": \"Detect\",\n \"detecting\": \"Detecting...\",\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 },\n \"TaggingPanel\": {\n \"title\": \"Tags\",\n \"noTags\": \"No tags yet. Use AI detection to identify structural roles.\",\n \"detectTags\": \"Detect 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 \"detect\": \"Detect\",\n \"detecting\": \"Detecting...\",\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 \"DetectPanel\": {\n \"title\": \"Detect 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 \"startDetection\": \"Detect\",\n \"found\": \"{count} found\",\n \"more\": \"More\"\n },\n \"DetectionProgressWidget\": {\n \"title\": \"Detecting Entity References\",\n \"cancelDetection\": \"Cancel detection\",\n \"found\": \"{count} found\",\n \"complete\": \"Detection complete!\",\n \"failed\": \"Detection failed\",\n \"current\": \"Current: {entityType}\"\n },\n \"ReferencesPanel\": {\n \"referencesTitle\": \"References\",\n \"outgoingReferences\": \"Outgoing References\",\n \"noReferences\": \"No references yet\",\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 \"incomingReferences\": \"Incoming References\",\n \"loading\": \"loading...\",\n \"loadingEllipsis\": \"Loading...\",\n \"noIncomingReferences\": \"No incoming references\",\n \"untitledResource\": \"Untitled Resource\",\n \"noText\": \"No text\",\n \"createReference\": \"Create Reference\",\n \"entityTypesOptional\": \"Entity Types (Optional)\",\n \"fragmentSelected\": \"Fragment selected\",\n \"imageRegionSelected\": \"Image region selected\",\n \"includeDescriptiveReferences\": \"Include descriptive references\",\n \"descriptiveReferencesTooltip\": \"Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)\"\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 },\n \"AnnotateView\": {}\n}\n"],"mappings":"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","names":[]}
@@ -94,7 +94,9 @@ var CommentsPanel = {
94
94
  toneTechnical: "Technical",
95
95
  densityLabel: "Density",
96
96
  densitySparse: "Sparse",
97
- densityDense: "Dense"
97
+ densityDense: "Dense",
98
+ fragmentSelected: "Fragment selected",
99
+ imageRegionSelected: "Image region selected"
98
100
  };
99
101
  var HighlightPanel = {
100
102
  title: "Highlights",
@@ -113,13 +115,15 @@ var HighlightPanel = {
113
115
  var AssessmentPanel = {
114
116
  title: "Assessments",
115
117
  noAssessments: "No assessments yet. Use AI detection to evaluate passages.",
118
+ assessmentPlaceholder: "Type your assessment here...",
119
+ save: "Save",
120
+ cancel: "Cancel",
116
121
  detectAssessments: "Detect Assessments",
117
122
  instructions: "Instructions",
118
123
  optional: "(optional)",
119
124
  instructionsPlaceholder: "e.g., Evaluate claims for accuracy and evidence...",
120
125
  detect: "Detect",
121
126
  detecting: "Detecting...",
122
- cancel: "Cancel",
123
127
  toneLabel: "Tone",
124
128
  toneOptional: "(optional)",
125
129
  toneAnalytical: "Analytical",
@@ -128,7 +132,9 @@ var AssessmentPanel = {
128
132
  toneConstructive: "Constructive",
129
133
  densityLabel: "Density",
130
134
  densitySparse: "Sparse",
131
- densityDense: "Dense"
135
+ densityDense: "Dense",
136
+ fragmentSelected: "Fragment selected",
137
+ imageRegionSelected: "Image region selected"
132
138
  };
133
139
  var TaggingPanel = {
134
140
  title: "Tags",
@@ -160,7 +166,9 @@ var TaggingPanel = {
160
166
  categoriesSelected: "{count, plural, =0 {No categories selected} =1 {1 category selected} other {# categories selected}}",
161
167
  createTagForSelection: "Create Tag for Selection",
162
168
  selectCategory: "Select Category",
163
- chooseCategory: "Choose a category..."
169
+ chooseCategory: "Choose a category...",
170
+ fragmentSelected: "Fragment selected",
171
+ imageRegionSelected: "Image region selected"
164
172
  };
165
173
  var UnifiedAnnotationsPanel = {
166
174
  title: "Annotations",
@@ -220,6 +228,7 @@ var ReferencesPanel = {
220
228
  noText: "No text",
221
229
  createReference: "Create Reference",
222
230
  entityTypesOptional: "Entity Types (Optional)",
231
+ fragmentSelected: "Fragment selected",
223
232
  imageRegionSelected: "Image region selected",
224
233
  includeDescriptiveReferences: "Include descriptive references",
225
234
  descriptiveReferencesTooltip: "Also find phrases like 'the CEO', 'the tech giant', 'the physicist' (in addition to names)"
@@ -364,4 +373,4 @@ export {
364
373
  UnifiedAnnotationsPanel,
365
374
  bn_default as default
366
375
  };
367
- //# sourceMappingURL=bn-AHD2VP4T.mjs.map
376
+ //# sourceMappingURL=bn-S2CDL7EC.mjs.map