dbf-mirador 4.2.3

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 (384) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +133 -0
  3. package/dist/CommentSharp-B0J_-jEq.js +325 -0
  4. package/dist/CommentSharp-B0J_-jEq.js.map +1 -0
  5. package/dist/FailedImageContext-aQXnWSHN.js +318 -0
  6. package/dist/FailedImageContext-aQXnWSHN.js.map +1 -0
  7. package/dist/PluginHook-CFw_6P5c.js +54 -0
  8. package/dist/PluginHook-CFw_6P5c.js.map +1 -0
  9. package/dist/WindowCanvasNavigationControls-CUX723BQ.js +242 -0
  10. package/dist/WindowCanvasNavigationControls-CUX723BQ.js.map +1 -0
  11. package/dist/action-types-DjIbTE-A.js +74 -0
  12. package/dist/action-types-DjIbTE-A.js.map +1 -0
  13. package/dist/canvas-C8oHvXFN.js +41 -0
  14. package/dist/canvas-C8oHvXFN.js.map +1 -0
  15. package/dist/canvases-gRqhr-IH.js +3154 -0
  16. package/dist/canvases-gRqhr-IH.js.map +1 -0
  17. package/dist/createSvgIcon-Cwt8YPfm.js +2 -0
  18. package/dist/getters-COus7Mvg.js +2066 -0
  19. package/dist/getters-COus7Mvg.js.map +1 -0
  20. package/dist/index.module-CbBRf_R8.js +403 -0
  21. package/dist/index.module-CbBRf_R8.js.map +1 -0
  22. package/dist/mirador.es.js +39600 -0
  23. package/dist/mirador.es.js.map +1 -0
  24. package/dist/mirador.min.js +334 -0
  25. package/dist/mirador.min.js.map +1 -0
  26. package/dist/react-error-boundary.esm-B_pT-oCS.js +67 -0
  27. package/dist/react-error-boundary.esm-B_pT-oCS.js.map +1 -0
  28. package/dist/visuallyHidden-DmYvwNdU.js +98 -0
  29. package/dist/visuallyHidden-DmYvwNdU.js.map +1 -0
  30. package/dist/window-zelwU7wz.js +138 -0
  31. package/dist/window-zelwU7wz.js.map +1 -0
  32. package/package.json +138 -0
  33. package/src/components/AccessTokenSender.jsx +34 -0
  34. package/src/components/AnnotationSettings.jsx +31 -0
  35. package/src/components/AnnotationsOverlay.jsx +328 -0
  36. package/src/components/App.jsx +34 -0
  37. package/src/components/AppProviders.jsx +129 -0
  38. package/src/components/AttributionPanel.jsx +78 -0
  39. package/src/components/AudioViewer.jsx +39 -0
  40. package/src/components/BackgroundPluginArea.jsx +9 -0
  41. package/src/components/Branding.jsx +33 -0
  42. package/src/components/CanvasAnnotations.jsx +125 -0
  43. package/src/components/CanvasInfo.jsx +46 -0
  44. package/src/components/CanvasLayers.jsx +367 -0
  45. package/src/components/ChangeThemeDialog.jsx +65 -0
  46. package/src/components/CollapsibleSection.jsx +53 -0
  47. package/src/components/CollectionDialog.jsx +236 -0
  48. package/src/components/CollectionInfo.jsx +48 -0
  49. package/src/components/CompanionArea.jsx +140 -0
  50. package/src/components/CompanionWindow.jsx +228 -0
  51. package/src/components/CompanionWindowFactory.jsx +38 -0
  52. package/src/components/CompanionWindowSection.jsx +11 -0
  53. package/src/components/CustomPanel.jsx +22 -0
  54. package/src/components/ErrorContent.jsx +65 -0
  55. package/src/components/ErrorDialog.jsx +47 -0
  56. package/src/components/FullScreenButton.jsx +47 -0
  57. package/src/components/GalleryView.jsx +36 -0
  58. package/src/components/GalleryViewThumbnail.jsx +160 -0
  59. package/src/components/IIIFAuthentication.jsx +144 -0
  60. package/src/components/IIIFDropTarget.jsx +168 -0
  61. package/src/components/IIIFIFrameCommunication.jsx +45 -0
  62. package/src/components/IIIFResourceLabel.jsx +26 -0
  63. package/src/components/IIIFThumbnail.jsx +214 -0
  64. package/src/components/ImageFailureMessage.jsx +42 -0
  65. package/src/components/LabelValueMetadata.jsx +46 -0
  66. package/src/components/LanguageSettings.jsx +46 -0
  67. package/src/components/LayersPanel.jsx +24 -0
  68. package/src/components/LocalePicker.jsx +56 -0
  69. package/src/components/ManifestForm.jsx +79 -0
  70. package/src/components/ManifestInfo.jsx +67 -0
  71. package/src/components/ManifestListItem.jsx +209 -0
  72. package/src/components/ManifestListItemError.jsx +53 -0
  73. package/src/components/ManifestRelatedLinks.jsx +154 -0
  74. package/src/components/MinimalWindow.jsx +104 -0
  75. package/src/components/MiradorMenuButton.jsx +71 -0
  76. package/src/components/MosaicRenderPreview.jsx +16 -0
  77. package/src/components/NestedMenu.jsx +42 -0
  78. package/src/components/NewBrowserWindow.jsx +34 -0
  79. package/src/components/OpenSeadragonComponent.jsx +258 -0
  80. package/src/components/OpenSeadragonTileSource.jsx +105 -0
  81. package/src/components/OpenSeadragonViewer.jsx +161 -0
  82. package/src/components/PluginHook.jsx +27 -0
  83. package/src/components/PrimaryWindow.jsx +115 -0
  84. package/src/components/SanitizedHtml.jsx +37 -0
  85. package/src/components/ScrollIndicatedDialogContent.jsx +60 -0
  86. package/src/components/ScrollTo.jsx +61 -0
  87. package/src/components/SearchHit.jsx +220 -0
  88. package/src/components/SearchPanel.jsx +80 -0
  89. package/src/components/SearchPanelControls.jsx +174 -0
  90. package/src/components/SearchPanelNavigation.jsx +84 -0
  91. package/src/components/SearchResults.jsx +138 -0
  92. package/src/components/SelectCollection.jsx +44 -0
  93. package/src/components/SidebarIndexItem.jsx +11 -0
  94. package/src/components/SidebarIndexList.jsx +73 -0
  95. package/src/components/SidebarIndexTableOfContents.jsx +170 -0
  96. package/src/components/SidebarIndexThumbnail.jsx +22 -0
  97. package/src/components/TextViewer.jsx +37 -0
  98. package/src/components/ThumbnailCanvasGrouping.jsx +122 -0
  99. package/src/components/ThumbnailNavigation.jsx +231 -0
  100. package/src/components/VideoViewer.jsx +35 -0
  101. package/src/components/ViewerInfo.jsx +55 -0
  102. package/src/components/ViewerNavigation.jsx +72 -0
  103. package/src/components/Window.jsx +150 -0
  104. package/src/components/WindowAuthenticationBar.jsx +176 -0
  105. package/src/components/WindowCanvasNavigationControls.jsx +91 -0
  106. package/src/components/WindowList.jsx +71 -0
  107. package/src/components/WindowListButton.jsx +57 -0
  108. package/src/components/WindowSideBar.jsx +48 -0
  109. package/src/components/WindowSideBarAnnotationsPanel.jsx +51 -0
  110. package/src/components/WindowSideBarButtons.jsx +151 -0
  111. package/src/components/WindowSideBarCanvasPanel.jsx +165 -0
  112. package/src/components/WindowSideBarCollectionPanel.jsx +179 -0
  113. package/src/components/WindowSideBarInfoPanel.jsx +67 -0
  114. package/src/components/WindowThumbnailSettings.jsx +130 -0
  115. package/src/components/WindowTopBar.jsx +125 -0
  116. package/src/components/WindowTopBarPluginArea.jsx +8 -0
  117. package/src/components/WindowTopBarPluginMenu.jsx +78 -0
  118. package/src/components/WindowTopBarTitle.jsx +73 -0
  119. package/src/components/WindowTopMenu.jsx +81 -0
  120. package/src/components/WindowTopMenuButton.jsx +49 -0
  121. package/src/components/WindowViewSettings.jsx +95 -0
  122. package/src/components/WindowViewer.jsx +26 -0
  123. package/src/components/Workspace.jsx +124 -0
  124. package/src/components/WorkspaceAdd.jsx +221 -0
  125. package/src/components/WorkspaceAddButton.jsx +73 -0
  126. package/src/components/WorkspaceArea.jsx +66 -0
  127. package/src/components/WorkspaceControlPanel.jsx +85 -0
  128. package/src/components/WorkspaceControlPanelButtons.jsx +20 -0
  129. package/src/components/WorkspaceDialog.jsx +11 -0
  130. package/src/components/WorkspaceElastic.jsx +88 -0
  131. package/src/components/WorkspaceElasticWindow.jsx +79 -0
  132. package/src/components/WorkspaceExport.jsx +99 -0
  133. package/src/components/WorkspaceImport.jsx +89 -0
  134. package/src/components/WorkspaceMenu.jsx +126 -0
  135. package/src/components/WorkspaceMenuButton.jsx +42 -0
  136. package/src/components/WorkspaceMosaic.jsx +149 -0
  137. package/src/components/WorkspaceOptionsButton.jsx +35 -0
  138. package/src/components/WorkspaceOptionsMenu.jsx +112 -0
  139. package/src/components/WorkspaceSelectionDialog.jsx +165 -0
  140. package/src/components/ZoomControls.jsx +57 -0
  141. package/src/components/icons/BookViewIcon.jsx +14 -0
  142. package/src/components/icons/CanvasIndexIcon.jsx +14 -0
  143. package/src/components/icons/GalleryViewIcon.jsx +17 -0
  144. package/src/components/icons/MiradorIcon.jsx +14 -0
  145. package/src/components/icons/RestoreZoomIcon.jsx +15 -0
  146. package/src/components/icons/ThumbnailNavigationBottomIcon.jsx +15 -0
  147. package/src/components/icons/ThumbnailNavigationRightIcon.jsx +16 -0
  148. package/src/components/icons/WindowMaxIcon.jsx +15 -0
  149. package/src/components/icons/WindowMinIcon.jsx +15 -0
  150. package/src/components/icons/WindowOptionsIcon.jsx +16 -0
  151. package/src/components/icons/WorkspaceTypeElasticIcon.jsx +157 -0
  152. package/src/components/icons/WorkspaceTypeMosaicIcon.jsx +162 -0
  153. package/src/components/icons/index.js +27 -0
  154. package/src/components/index.js +108 -0
  155. package/src/config/css-ns.js +10 -0
  156. package/src/config/index.js +2 -0
  157. package/src/config/settings.js +607 -0
  158. package/src/containers/AnnotationSettings.js +27 -0
  159. package/src/containers/AnnotationsOverlay.js +51 -0
  160. package/src/containers/AppProviders.js +20 -0
  161. package/src/containers/AttributionPanel.js +20 -0
  162. package/src/containers/AudioViewer.js +16 -0
  163. package/src/containers/BackgroundPluginArea.js +4 -0
  164. package/src/containers/Branding.js +4 -0
  165. package/src/containers/CanvasAnnotations.js +32 -0
  166. package/src/containers/CanvasInfo.js +20 -0
  167. package/src/containers/CanvasLayers.js +25 -0
  168. package/src/containers/ChangeThemeDialog.js +29 -0
  169. package/src/containers/CollapsibleSection.js +3 -0
  170. package/src/containers/CollectionDialog.js +48 -0
  171. package/src/containers/CollectionInfo.js +29 -0
  172. package/src/containers/CompanionArea.js +22 -0
  173. package/src/containers/CompanionWindow.js +40 -0
  174. package/src/containers/CompanionWindowFactory.js +23 -0
  175. package/src/containers/CustomPanel.js +13 -0
  176. package/src/containers/ErrorContent.js +20 -0
  177. package/src/containers/ErrorDialog.js +28 -0
  178. package/src/containers/FullScreenButton.js +22 -0
  179. package/src/containers/GalleryView.js +23 -0
  180. package/src/containers/GalleryViewThumbnail.js +51 -0
  181. package/src/containers/IIIFAuthentication.js +86 -0
  182. package/src/containers/IIIFThumbnail.js +17 -0
  183. package/src/containers/LabelValueMetadata.js +14 -0
  184. package/src/containers/LanguageSettings.js +26 -0
  185. package/src/containers/LayersPanel.js +16 -0
  186. package/src/containers/LocalePicker.js +3 -0
  187. package/src/containers/ManifestForm.js +16 -0
  188. package/src/containers/ManifestInfo.js +29 -0
  189. package/src/containers/ManifestListItem.js +52 -0
  190. package/src/containers/ManifestListItemError.js +15 -0
  191. package/src/containers/ManifestRelatedLinks.js +28 -0
  192. package/src/containers/MinimalWindow.js +25 -0
  193. package/src/containers/MiradorMenuButton.js +7 -0
  194. package/src/containers/MosaicRenderPreview.js +14 -0
  195. package/src/containers/OpenSeadragonViewer.js +59 -0
  196. package/src/containers/PrimaryWindow.js +27 -0
  197. package/src/containers/SanitizedHtml.js +3 -0
  198. package/src/containers/ScrollIndicatedDialogContent.js +3 -0
  199. package/src/containers/SearchHit.js +71 -0
  200. package/src/containers/SearchPanel.js +23 -0
  201. package/src/containers/SearchPanelControls.js +36 -0
  202. package/src/containers/SearchPanelNavigation.js +39 -0
  203. package/src/containers/SearchResults.js +38 -0
  204. package/src/containers/SelectCollection.js +24 -0
  205. package/src/containers/SidebarIndexItem.js +8 -0
  206. package/src/containers/SidebarIndexList.js +28 -0
  207. package/src/containers/SidebarIndexTableOfContents.js +31 -0
  208. package/src/containers/SidebarIndexThumbnail.js +18 -0
  209. package/src/containers/TextViewer.js +19 -0
  210. package/src/containers/ThumbnailCanvasGrouping.js +29 -0
  211. package/src/containers/ThumbnailNavigation.js +48 -0
  212. package/src/containers/VideoViewer.js +16 -0
  213. package/src/containers/ViewerInfo.js +30 -0
  214. package/src/containers/ViewerNavigation.js +31 -0
  215. package/src/containers/Window.js +45 -0
  216. package/src/containers/WindowAuthenticationBar.js +7 -0
  217. package/src/containers/WindowCanvasNavigationControls.js +15 -0
  218. package/src/containers/WindowList.js +30 -0
  219. package/src/containers/WindowListButton.js +15 -0
  220. package/src/containers/WindowSideBar.js +20 -0
  221. package/src/containers/WindowSideBarAnnotationsPanel.js +23 -0
  222. package/src/containers/WindowSideBarButtons.js +75 -0
  223. package/src/containers/WindowSideBarCanvasPanel.js +50 -0
  224. package/src/containers/WindowSideBarCollectionPanel.js +48 -0
  225. package/src/containers/WindowSideBarInfoPanel.js +35 -0
  226. package/src/containers/WindowThumbnailSettings.js +31 -0
  227. package/src/containers/WindowTopBar.js +39 -0
  228. package/src/containers/WindowTopBarPluginArea.js +8 -0
  229. package/src/containers/WindowTopBarPluginMenu.js +7 -0
  230. package/src/containers/WindowTopBarTitle.js +17 -0
  231. package/src/containers/WindowTopMenu.js +28 -0
  232. package/src/containers/WindowTopMenuButton.js +7 -0
  233. package/src/containers/WindowViewSettings.js +30 -0
  234. package/src/containers/WindowViewer.js +10 -0
  235. package/src/containers/Workspace.js +36 -0
  236. package/src/containers/WorkspaceAdd.js +27 -0
  237. package/src/containers/WorkspaceAddButton.js +30 -0
  238. package/src/containers/WorkspaceArea.js +21 -0
  239. package/src/containers/WorkspaceControlPanel.js +10 -0
  240. package/src/containers/WorkspaceControlPanelButtons.js +7 -0
  241. package/src/containers/WorkspaceElastic.js +41 -0
  242. package/src/containers/WorkspaceElasticWindow.js +36 -0
  243. package/src/containers/WorkspaceExport.js +18 -0
  244. package/src/containers/WorkspaceImport.js +19 -0
  245. package/src/containers/WorkspaceMenu.js +30 -0
  246. package/src/containers/WorkspaceMenuButton.js +10 -0
  247. package/src/containers/WorkspaceMosaic.js +32 -0
  248. package/src/containers/WorkspaceOptionsButton.js +7 -0
  249. package/src/containers/WorkspaceOptionsMenu.js +3 -0
  250. package/src/containers/WorkspaceSelectionDialog.js +26 -0
  251. package/src/containers/ZoomControls.js +26 -0
  252. package/src/containers/index.js +94 -0
  253. package/src/contexts/FailedImageContext.js +8 -0
  254. package/src/contexts/FailedImageProvider.jsx +34 -0
  255. package/src/contexts/FullScreenContext.js +5 -0
  256. package/src/contexts/LocaleContext.js +5 -0
  257. package/src/contexts/OpenSeadragonViewerContext.js +5 -0
  258. package/src/contexts/WorkspaceContext.js +5 -0
  259. package/src/contexts/index.js +4 -0
  260. package/src/extend/PluginContext.js +5 -0
  261. package/src/extend/PluginProvider.jsx +22 -0
  262. package/src/extend/index.js +9 -0
  263. package/src/extend/pluginMapping.js +44 -0
  264. package/src/extend/pluginPreprocessing.js +45 -0
  265. package/src/extend/pluginValidation.js +58 -0
  266. package/src/extend/usePlugins.js +13 -0
  267. package/src/extend/withPlugins.jsx +46 -0
  268. package/src/hooks/index.js +4 -0
  269. package/src/hooks/useCanvasWorldService.js +10 -0
  270. package/src/hooks/useThumbnailService.js +8 -0
  271. package/src/i18n.js +71 -0
  272. package/src/index.js +18 -0
  273. package/src/init.js +20 -0
  274. package/src/lib/AnnotationFactory.js +23 -0
  275. package/src/lib/AnnotationItem.js +123 -0
  276. package/src/lib/AnnotationList.js +31 -0
  277. package/src/lib/AnnotationPage.js +41 -0
  278. package/src/lib/AnnotationResource.js +122 -0
  279. package/src/lib/CanvasAnnotationDisplay.js +148 -0
  280. package/src/lib/CanvasGroupings.js +55 -0
  281. package/src/lib/CanvasWorld.js +214 -0
  282. package/src/lib/CompanionWindowRegistry.js +23 -0
  283. package/src/lib/FullScreenHandle.jsx +76 -0
  284. package/src/lib/MiradorCanvas.js +211 -0
  285. package/src/lib/MiradorManifest.js +44 -0
  286. package/src/lib/MiradorViewer.jsx +53 -0
  287. package/src/lib/MosaicLayout.js +77 -0
  288. package/src/lib/OpenSeadragonCanvasOverlay.js +114 -0
  289. package/src/lib/ThumbnailFactory.js +310 -0
  290. package/src/lib/TruncatedHit.js +34 -0
  291. package/src/lib/asArray.js +11 -0
  292. package/src/lib/htmlRules.js +28 -0
  293. package/src/lib/iiif.js +12 -0
  294. package/src/lib/index.js +23 -0
  295. package/src/lib/readImageMetadata.js +21 -0
  296. package/src/lib/svgShapesToPath.js +49 -0
  297. package/src/locales/README.md +60 -0
  298. package/src/locales/ar/translation.json +141 -0
  299. package/src/locales/bg/translation.json +164 -0
  300. package/src/locales/de/translation.json +169 -0
  301. package/src/locales/en/translation.json +170 -0
  302. package/src/locales/et/translation.json +164 -0
  303. package/src/locales/fa/translation.json +164 -0
  304. package/src/locales/fr/translation.json +158 -0
  305. package/src/locales/hr/translation.json +164 -0
  306. package/src/locales/hu/translation.json +166 -0
  307. package/src/locales/it/translation.json +162 -0
  308. package/src/locales/ja/translation.json +156 -0
  309. package/src/locales/kr/translation.json +162 -0
  310. package/src/locales/lt/translation.json +153 -0
  311. package/src/locales/nbNo/translation.json +162 -0
  312. package/src/locales/nl/translation.json +139 -0
  313. package/src/locales/pl/translation.json +162 -0
  314. package/src/locales/ptBr/translation.json +133 -0
  315. package/src/locales/sr/translation.json +155 -0
  316. package/src/locales/sv/translation.json +157 -0
  317. package/src/locales/ta/translation.json +167 -0
  318. package/src/locales/vi/translation.json +156 -0
  319. package/src/locales/zhCn/translation.json +163 -0
  320. package/src/locales/zhTw/translation.json +163 -0
  321. package/src/plugins/OSDReferences.js +15 -0
  322. package/src/plugins/index.js +1 -0
  323. package/src/state/actions/action-types.js +76 -0
  324. package/src/state/actions/annotation.js +123 -0
  325. package/src/state/actions/auth.js +109 -0
  326. package/src/state/actions/canvas.js +65 -0
  327. package/src/state/actions/catalog.js +22 -0
  328. package/src/state/actions/companionWindow.js +107 -0
  329. package/src/state/actions/config.js +49 -0
  330. package/src/state/actions/elasticLayout.js +10 -0
  331. package/src/state/actions/errors.js +22 -0
  332. package/src/state/actions/index.js +19 -0
  333. package/src/state/actions/infoResponse.js +90 -0
  334. package/src/state/actions/layers.js +14 -0
  335. package/src/state/actions/manifest.js +65 -0
  336. package/src/state/actions/search.js +97 -0
  337. package/src/state/actions/window.js +209 -0
  338. package/src/state/actions/workspace.js +84 -0
  339. package/src/state/createPluggableStore.js +24 -0
  340. package/src/state/createStore.js +33 -0
  341. package/src/state/index.js +21 -0
  342. package/src/state/reducers/accessTokens.js +59 -0
  343. package/src/state/reducers/annotations.js +48 -0
  344. package/src/state/reducers/auth.js +43 -0
  345. package/src/state/reducers/catalog.js +30 -0
  346. package/src/state/reducers/companionWindows.js +49 -0
  347. package/src/state/reducers/config.js +39 -0
  348. package/src/state/reducers/elasticLayout.js +29 -0
  349. package/src/state/reducers/errors.js +51 -0
  350. package/src/state/reducers/index.js +15 -0
  351. package/src/state/reducers/infoResponses.js +61 -0
  352. package/src/state/reducers/layers.js +23 -0
  353. package/src/state/reducers/manifests.js +52 -0
  354. package/src/state/reducers/rootReducer.js +44 -0
  355. package/src/state/reducers/search.js +145 -0
  356. package/src/state/reducers/utils.js +45 -0
  357. package/src/state/reducers/viewers.js +42 -0
  358. package/src/state/reducers/windows.js +185 -0
  359. package/src/state/reducers/workspace.js +111 -0
  360. package/src/state/sagas/annotations.js +48 -0
  361. package/src/state/sagas/app.js +56 -0
  362. package/src/state/sagas/auth.js +151 -0
  363. package/src/state/sagas/iiif.js +233 -0
  364. package/src/state/sagas/index.js +30 -0
  365. package/src/state/sagas/windows.js +293 -0
  366. package/src/state/selectors/annotations.js +138 -0
  367. package/src/state/selectors/auth.js +100 -0
  368. package/src/state/selectors/canvases.js +260 -0
  369. package/src/state/selectors/companionWindows.js +182 -0
  370. package/src/state/selectors/config.js +100 -0
  371. package/src/state/selectors/getters.js +90 -0
  372. package/src/state/selectors/index.js +17 -0
  373. package/src/state/selectors/layers.js +79 -0
  374. package/src/state/selectors/manifests.js +433 -0
  375. package/src/state/selectors/ranges.js +147 -0
  376. package/src/state/selectors/searches.js +249 -0
  377. package/src/state/selectors/sequences.js +134 -0
  378. package/src/state/selectors/thumbnails.js +28 -0
  379. package/src/state/selectors/utils.js +18 -0
  380. package/src/state/selectors/viewer.js +19 -0
  381. package/src/state/selectors/windows.js +98 -0
  382. package/src/state/selectors/workspace.js +52 -0
  383. package/src/state/selectors/wrappers.js +15 -0
  384. package/src/styles/react-mosaic-component.js +288 -0
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react';
2
+
3
+ const PluginContext = createContext();
4
+
5
+ export default PluginContext;
@@ -0,0 +1,22 @@
1
+ import { useEffect, useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import PluginContext from './PluginContext';
4
+ import { connectPluginsToStore, createTargetToPluginMapping, addPluginsToCompanionWindowsRegistry } from './pluginMapping';
5
+
6
+ /** */
7
+ export default function PluginProvider({ plugins = [], children = null }) {
8
+ const [pluginMap, setPluginMap] = useState({});
9
+
10
+ useEffect(() => {
11
+ const connectedPlugins = connectPluginsToStore(plugins);
12
+ addPluginsToCompanionWindowsRegistry(connectedPlugins);
13
+ setPluginMap(createTargetToPluginMapping(connectedPlugins));
14
+ }, [plugins]);
15
+
16
+ return <PluginContext.Provider value={pluginMap}>{children}</PluginContext.Provider>;
17
+ }
18
+
19
+ PluginProvider.propTypes = {
20
+ children: PropTypes.node,
21
+ plugins: PropTypes.array,
22
+ };
@@ -0,0 +1,9 @@
1
+ import PluginContext from './PluginContext';
2
+ import PluginProvider from './PluginProvider';
3
+
4
+ export * from './pluginMapping';
5
+ export * from './pluginPreprocessing';
6
+ export * from './pluginValidation';
7
+
8
+ export { PluginContext, PluginProvider };
9
+ export * from './withPlugins';
@@ -0,0 +1,44 @@
1
+ import update from 'lodash/update';
2
+ import { connect } from 'react-redux';
3
+ import CompanionWindowRegistry from '../lib/CompanionWindowRegistry';
4
+
5
+ /**
6
+ * Returns a mapping from targets to plugins and modes
7
+ *
8
+ * @param {Array} plugins
9
+ * @return {Object} - looks like:
10
+ *
11
+ * {
12
+ * 'WorkspacePanel': {
13
+ * wrap: [plugin3, ...],
14
+ * add: [plugin4, ...],
15
+ * },
16
+ * ...
17
+ * }
18
+ */
19
+ export function createTargetToPluginMapping(plugins) {
20
+ return plugins.reduce((map, plugin) => update(map, [plugin.target, plugin.mode], (x) => [...(x || []), plugin]), {});
21
+ }
22
+
23
+ /** */
24
+ export function connectPluginsToStore(plugins) {
25
+ return plugins.map((plugin) => ({ ...plugin, component: connectPluginComponent(plugin) }));
26
+ }
27
+
28
+ /** */
29
+ export function addPluginsToCompanionWindowsRegistry(plugins) {
30
+ plugins
31
+ .filter((p) => p.companionWindowKey)
32
+ .forEach((plugin) => {
33
+ CompanionWindowRegistry[plugin.companionWindowKey] = plugin.component;
34
+ });
35
+
36
+ return CompanionWindowRegistry;
37
+ }
38
+
39
+ /** Connect plugin component to state */
40
+ function connectPluginComponent(plugin) {
41
+ if (!plugin.mapStateToProps && !plugin.mapDispatchToProps) return plugin.component;
42
+
43
+ return connect(plugin.mapStateToProps, plugin.mapDispatchToProps, ...(plugin.connectOptions || []))(plugin.component);
44
+ }
@@ -0,0 +1,45 @@
1
+ import deepmerge from 'deepmerge';
2
+ import { validatePlugin } from './pluginValidation';
3
+
4
+ /** */
5
+ export function filterValidPlugins(plugins) {
6
+ const { validPlugins, invalidPlugins } = splitPluginsByValidation(plugins);
7
+ logInvalidPlugins(invalidPlugins);
8
+ return validPlugins;
9
+ }
10
+
11
+ /** */
12
+ function splitPluginsByValidation(plugins) {
13
+ const invalidPlugins = [];
14
+ const validPlugins = [];
15
+ plugins.forEach((plugin) => {
16
+ if (Array.isArray(plugin)) {
17
+ const allValid = plugin.every((p) => validatePlugin(p));
18
+
19
+ allValid ? validPlugins.push(...plugin) : invalidPlugins.push(...plugin);
20
+ } else {
21
+ validatePlugin(plugin) ? validPlugins.push(plugin) : invalidPlugins.push(plugin);
22
+ }
23
+ });
24
+ return { invalidPlugins, validPlugins };
25
+ }
26
+
27
+ /** */
28
+ function logInvalidPlugins(plugins) {
29
+ plugins.forEach((plugin) => console.log(`Mirador: Plugin ${plugin.name} is not valid and was rejected.`));
30
+ }
31
+
32
+ /** */
33
+ export function getReducersFromPlugins(plugins) {
34
+ return plugins && plugins.reduce((acc, plugin) => ({ ...acc, ...plugin.reducers }), {});
35
+ }
36
+
37
+ /** */
38
+ export function getConfigFromPlugins(plugins) {
39
+ return plugins && plugins.reduce((acc, plugin) => deepmerge(acc, plugin.config || {}), {});
40
+ }
41
+
42
+ /** */
43
+ export function getSagasFromPlugins(plugins) {
44
+ return plugins && plugins.filter((plugin) => plugin.saga).map((plugin) => plugin.saga);
45
+ }
@@ -0,0 +1,58 @@
1
+ import isString from 'lodash/isString';
2
+ import isUndefined from 'lodash/isUndefined';
3
+ import isFunction from 'lodash/isFunction';
4
+ import isObject from 'lodash/isObject';
5
+ import isNull from 'lodash/isNull';
6
+ import values from 'lodash/values';
7
+
8
+ /** */
9
+ export const validatePlugin = (plugin) =>
10
+ [checkPlugin, checkName, checkTarget, checkMode, checkMapStateToProps, checkMapDispatchToProps, checkReducers].every((check) =>
11
+ check(plugin),
12
+ );
13
+
14
+ /** */
15
+ const checkPlugin = (plugin) => isObject(plugin);
16
+
17
+ /** */
18
+ const checkName = (plugin) => {
19
+ const { name } = plugin;
20
+ return isUndefined(name) || isString(name);
21
+ };
22
+
23
+ /** */
24
+ const checkTarget = (plugin) => {
25
+ const { mode, target } = plugin;
26
+ if (isUndefined(mode)) return isUndefined(target);
27
+
28
+ return isString(target);
29
+ };
30
+
31
+ /** */
32
+ const checkMode = (plugin) => {
33
+ const { mode } = plugin;
34
+ return isUndefined(mode) || ['add', 'wrap'].some((s) => s === mode);
35
+ };
36
+
37
+ /** */
38
+ const checkMapStateToProps = (plugin) => {
39
+ const { mapStateToProps } = plugin;
40
+ return isUndefined(mapStateToProps) || isNull(mapStateToProps) || isFunction(mapStateToProps);
41
+ };
42
+
43
+ /** */
44
+ const checkMapDispatchToProps = (plugin) => {
45
+ const { mapDispatchToProps } = plugin;
46
+ return (
47
+ isUndefined(mapDispatchToProps) ||
48
+ isNull(mapDispatchToProps) ||
49
+ isFunction(mapDispatchToProps) ||
50
+ isObject(mapDispatchToProps)
51
+ );
52
+ };
53
+
54
+ /** */
55
+ const checkReducers = (plugin) => {
56
+ const { reducers } = plugin;
57
+ return isUndefined(reducers) || (isObject(reducers) && values(reducers).every(isFunction));
58
+ };
@@ -0,0 +1,13 @@
1
+ import { useContext } from 'react';
2
+ import PluginContext from './PluginContext';
3
+
4
+ /** withPlugins should be the innermost HOC */
5
+ export function usePlugins(targetName) {
6
+ const pluginMap = useContext(PluginContext);
7
+
8
+ const plugins = (pluginMap || {})[targetName];
9
+
10
+ const PluginComponents = (plugins?.add || []).map((plugin) => plugin.component);
11
+
12
+ return { PluginComponents };
13
+ }
@@ -0,0 +1,46 @@
1
+ import { forwardRef, useContext } from 'react';
2
+ import curry from 'lodash/curry';
3
+ import isEmpty from 'lodash/isEmpty';
4
+ import PluginContext from './PluginContext';
5
+
6
+ /** withPlugins should be the innermost HOC */
7
+ function _withPlugins(targetName, TargetComponent) {
8
+ /** */
9
+ function PluginHoc(props, ref) {
10
+ const pluginMap = useContext(PluginContext);
11
+
12
+ const passDownProps = {
13
+ ...props,
14
+ ...(ref ? { ref } : {}),
15
+ };
16
+
17
+ const plugins = (pluginMap || {})[targetName];
18
+
19
+ if (isEmpty(plugins) || isEmpty(plugins.wrap)) {
20
+ return <TargetComponent {...passDownProps} />;
21
+ }
22
+
23
+ /** */
24
+ const pluginWrapper = (children, plugin) => {
25
+ const WrapPluginComponent = plugin.component;
26
+
27
+ return (
28
+ <WrapPluginComponent targetProps={passDownProps} {...passDownProps} TargetComponent={TargetComponent}>
29
+ {children}
30
+ </WrapPluginComponent>
31
+ );
32
+ };
33
+
34
+ return plugins.wrap
35
+ .slice()
36
+ .reverse()
37
+ .reduce(pluginWrapper, <TargetComponent {...passDownProps} />);
38
+ }
39
+ const whatever = forwardRef(PluginHoc);
40
+
41
+ whatever.displayName = `WithPlugins(${targetName})`;
42
+ return whatever;
43
+ }
44
+
45
+ /** withPlugins('MyComponent')(MyComponent) */
46
+ export const withPlugins = curry(_withPlugins);
@@ -0,0 +1,4 @@
1
+ import useCanvasWorldService from './useCanvasWorldService';
2
+ import useThumbnailService from './useThumbnailService';
3
+
4
+ export { useCanvasWorldService, useThumbnailService };
@@ -0,0 +1,10 @@
1
+ import { useSelector } from 'react-redux';
2
+
3
+ import CanvasWorld from '../lib/CanvasWorld';
4
+ import { getMiradorCanvasWrapper } from '../state/selectors/wrappers';
5
+
6
+ /** */
7
+ export default function useCanvasWorldService() {
8
+ const getMiradorCanvas = useSelector(getMiradorCanvasWrapper);
9
+ return { get: (canvases) => canvases && new CanvasWorld(canvases.map(getMiradorCanvas)) };
10
+ }
@@ -0,0 +1,8 @@
1
+ import { useSelector } from 'react-redux';
2
+
3
+ import { getThumbnailFactory } from '../state/selectors/thumbnails';
4
+
5
+ /** */
6
+ export default function useThumbnailService(maxHeight, maxWidth) {
7
+ return useSelector((state) => getThumbnailFactory(state, maxHeight, maxWidth), [maxHeight, maxWidth]);
8
+ }
package/src/i18n.js ADDED
@@ -0,0 +1,71 @@
1
+ import { createInstance } from 'i18next';
2
+ import { initReactI18next } from 'react-i18next';
3
+ import ar from './locales/ar/translation.json';
4
+ import de from './locales/de/translation.json';
5
+ import en from './locales/en/translation.json';
6
+ import et from './locales/et/translation.json';
7
+ import fa from './locales/fa/translation.json';
8
+ import zhCn from './locales/zhCn/translation.json';
9
+ import zhTw from './locales/zhTw/translation.json';
10
+ import fr from './locales/fr/translation.json';
11
+ import hr from './locales/hr/translation.json';
12
+ import ja from './locales/ja/translation.json';
13
+ import kr from './locales/kr/translation.json';
14
+ import nl from './locales/nl/translation.json';
15
+ import pl from './locales/pl/translation.json';
16
+ import ptBr from './locales/ptBr/translation.json';
17
+ import it from './locales/it/translation.json';
18
+ import sr from './locales/sr/translation.json';
19
+ import sv from './locales/sv/translation.json';
20
+ import lt from './locales/lt/translation.json';
21
+ import vi from './locales/vi/translation.json';
22
+ import bg from './locales/bg/translation.json';
23
+ import nbNo from './locales/nbNo/translation.json';
24
+ import hu from './locales/hu/translation.json';
25
+ import ta from './locales/ta/translation.json';
26
+
27
+ /**
28
+ * Load translations for each language
29
+ */
30
+ function createI18nInstance(i18nConfig = {}) {
31
+ const resources = {
32
+ ar,
33
+ bg,
34
+ de,
35
+ en,
36
+ et,
37
+ fa,
38
+ fr,
39
+ hr,
40
+ hu,
41
+ it,
42
+ ja,
43
+ kr,
44
+ lt,
45
+ 'nb-NO': nbNo,
46
+ nl,
47
+ pl,
48
+ 'pt-BR': ptBr,
49
+ sr,
50
+ sv,
51
+ vi,
52
+ 'zh-CN': zhCn,
53
+ 'zh-TW': zhTw,
54
+ ta,
55
+ };
56
+
57
+ const instance = createInstance();
58
+ instance.use(initReactI18next).init({
59
+ fallbackLng: 'en',
60
+ interpolation: {
61
+ escapeValue: false, // react is already safe from xss
62
+ },
63
+ lng: 'en',
64
+ resources,
65
+ ...i18nConfig,
66
+ });
67
+
68
+ return instance;
69
+ }
70
+
71
+ export default createI18nInstance;
package/src/index.js ADDED
@@ -0,0 +1,18 @@
1
+ import init from './init';
2
+ import state from './state';
3
+
4
+ export * from './state';
5
+ export * from './components';
6
+ export * from './containers';
7
+ export * from './contexts';
8
+ export * from './extend';
9
+ export * from './lib';
10
+ export * from './plugins';
11
+ export * from './config';
12
+ export { useTranslation, withTranslation } from 'react-i18next';
13
+ export { viewer } from './init';
14
+
15
+ export default {
16
+ ...init,
17
+ ...state,
18
+ };
package/src/init.js ADDED
@@ -0,0 +1,20 @@
1
+ import MiradorViewer from './lib/MiradorViewer';
2
+
3
+ /**
4
+ * Default Mirador instantiation
5
+ */
6
+ export function viewer(config, pluginsOrStruct) {
7
+ let struct;
8
+
9
+ if (Array.isArray(pluginsOrStruct)) {
10
+ struct = { plugins: pluginsOrStruct };
11
+ } else {
12
+ struct = pluginsOrStruct;
13
+ }
14
+
15
+ return new MiradorViewer(config, struct);
16
+ }
17
+
18
+ export default {
19
+ viewer,
20
+ };
@@ -0,0 +1,23 @@
1
+ import AnnotationList from './AnnotationList';
2
+ import AnnotationPage from './AnnotationPage';
3
+
4
+ /**
5
+ * Used to determine the type of Annotation supported by a version of the IIIF
6
+ * Presentation API.
7
+ */
8
+ export default class AnnotationFactory {
9
+ /** */
10
+ static determineAnnotation(json, target) {
11
+ if (!json) {
12
+ return null;
13
+ }
14
+
15
+ // IIIF Presentation API v3. AnnotationPage
16
+ if (json.type === 'AnnotationPage') {
17
+ return new AnnotationPage(json, target);
18
+ }
19
+
20
+ // IIIF Presentation API v2. OpenAnnotation and SharedCanvas models
21
+ return new AnnotationList(json, target);
22
+ }
23
+ }
@@ -0,0 +1,123 @@
1
+ import compact from 'lodash/compact';
2
+ import { v4 as uuid } from 'uuid';
3
+
4
+ /**
5
+ * A modeled WebAnnotation item
6
+ */
7
+ export default class AnnotationItem {
8
+ /** */
9
+ constructor(resource = {}) {
10
+ this.resource = resource;
11
+ }
12
+
13
+ /** */
14
+ isOnlyTag() {
15
+ return this.motivations.length === 1 && this.motivations[0] === 'tagging';
16
+ }
17
+
18
+ /** */
19
+ get id() {
20
+ this._id = this._id || this.resource.id || uuid();
21
+ return this._id;
22
+ }
23
+
24
+ /** */
25
+ get targetId() {
26
+ const target = this.target[0];
27
+ switch (typeof target) {
28
+ case 'string':
29
+ return target.replace(/#?xywh=(.*)$/, '');
30
+ case 'object':
31
+ return (target.source && target.source.id) || target.source || target.id;
32
+ default:
33
+ return null;
34
+ }
35
+ }
36
+
37
+ /**
38
+ * @return {[Array]}
39
+ */
40
+ get motivations() {
41
+ return compact(new Array(this.resource.motivation)).flat();
42
+ }
43
+
44
+ /** */
45
+ get body() {
46
+ return compact(new Array(this.resource.body)).flat();
47
+ }
48
+
49
+ /** */
50
+ get resources() {
51
+ return this.body;
52
+ }
53
+
54
+ /** */
55
+ get tags() {
56
+ if (this.isOnlyTag()) {
57
+ return this.body.map((r) => r.value);
58
+ }
59
+ return this.body.filter((r) => r.purpose === 'tagging').map((r) => r.value);
60
+ }
61
+
62
+ /** */
63
+ get target() {
64
+ return compact(new Array(this.resource.target)).flat();
65
+ }
66
+
67
+ /** */
68
+ get chars() {
69
+ if (this.isOnlyTag()) return null;
70
+ return this.body
71
+ .filter((r) => r.purpose !== 'tagging')
72
+ .map((r) => r.value)
73
+ .join(' ');
74
+ }
75
+
76
+ /** */
77
+ get selector() {
78
+ const target = this.target[0];
79
+ switch (typeof target) {
80
+ case 'string':
81
+ return target;
82
+ case 'object':
83
+ return compact(new Array(target.selector)).flat();
84
+ default:
85
+ return null;
86
+ }
87
+ }
88
+
89
+ /** */
90
+ get svgSelector() {
91
+ const { selector } = this;
92
+ switch (typeof selector) {
93
+ case 'string':
94
+ return null;
95
+ case 'object':
96
+ return selector.find((s) => s.type && s.type === 'SvgSelector');
97
+ default:
98
+ return null;
99
+ }
100
+ }
101
+
102
+ /** */
103
+ get fragmentSelector() {
104
+ const { selector } = this;
105
+
106
+ let match;
107
+ let fragmentSelector;
108
+
109
+ switch (typeof selector) {
110
+ case 'string':
111
+ match = selector.match(/xywh=(.*)$/);
112
+ break;
113
+ case 'object':
114
+ fragmentSelector = selector.find((s) => s.type && s.type === 'FragmentSelector');
115
+ match = fragmentSelector && fragmentSelector.value.match(/xywh=(.*)$/);
116
+ break;
117
+ default:
118
+ return null;
119
+ }
120
+
121
+ return match && match[1].split(',').map((str) => parseInt(str, 10));
122
+ }
123
+ }
@@ -0,0 +1,31 @@
1
+ import AnnotationResource from './AnnotationResource';
2
+ /** */
3
+ export default class AnnotationList {
4
+ /** */
5
+ constructor(json, target) {
6
+ this.json = json;
7
+ this.target = target;
8
+ }
9
+
10
+ /** */
11
+ get id() {
12
+ return this.json['@id'];
13
+ }
14
+
15
+ /** */
16
+ present() {
17
+ return this.resources && this.resources.length > 0;
18
+ }
19
+
20
+ /** */
21
+ get resources() {
22
+ this._resources =
23
+ this._resources ||
24
+ (() => {
25
+ if (!this.json || !this.json.resources) return [];
26
+
27
+ return [this.json.resources].flat().map((resource) => new AnnotationResource(resource));
28
+ })();
29
+ return this._resources;
30
+ }
31
+ }
@@ -0,0 +1,41 @@
1
+ import AnnotationItem from './AnnotationItem';
2
+ /**
3
+ * Annotation representation for IIIF Presentation v3
4
+ * https://iiif.io/api/presentation/3.0/#55-annotation-page
5
+ */
6
+ export default class AnnotationPage {
7
+ /** */
8
+ constructor(json, target) {
9
+ this.json = json;
10
+ this.target = target;
11
+ }
12
+
13
+ /** */
14
+ get id() {
15
+ return this.json.id;
16
+ }
17
+
18
+ /** */
19
+ present() {
20
+ return this.items && this.items.length > 0;
21
+ }
22
+
23
+ /** */
24
+ get items() {
25
+ this._items =
26
+ this._items ||
27
+ (() => {
28
+ if (!this.json || !this.json.items) return [];
29
+
30
+ return [this.json.items].flat().map((resource) => new AnnotationItem(resource));
31
+ })();
32
+ return this._items;
33
+ }
34
+
35
+ /**
36
+ * Alias to items for compatibility for right now.
37
+ */
38
+ get resources() {
39
+ return this.items;
40
+ }
41
+ }