@nulib/clover 0.0.0-stage → 4.0.0-beta.0

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 (410) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +120 -2
  3. package/dist/components/Annotations/Annotations.mjs +674 -0
  4. package/dist/components/Annotations/EntryBodies.mjs +52 -0
  5. package/dist/components/Annotations/languages.mjs +43 -0
  6. package/dist/components/Body/Body.mjs +51 -0
  7. package/dist/components/Body/BodyAlert.mjs +25 -0
  8. package/dist/components/Body/Caption.mjs +90 -0
  9. package/dist/components/Body/CaptionDetails.mjs +50 -0
  10. package/dist/components/Body/Pending.mjs +9 -0
  11. package/dist/components/Body/glyphs.mjs +66 -0
  12. package/dist/components/Body/renderers.mjs +30 -0
  13. package/dist/components/Body/useControlsVisibility.mjs +204 -0
  14. package/dist/components/Body/useNearViewport.mjs +27 -0
  15. package/dist/components/Canvas/AnnotationMenu.mjs +128 -0
  16. package/dist/components/Canvas/AnnotationState.mjs +338 -0
  17. package/dist/components/Canvas/Annotations.mjs +497 -0
  18. package/dist/components/Canvas/CanvasView.mjs +669 -0
  19. package/dist/components/Canvas/ChoiceMenu.mjs +77 -0
  20. package/dist/components/Canvas/Connected.mjs +228 -0
  21. package/dist/components/Canvas/ControlMenu.mjs +67 -0
  22. package/dist/components/Canvas/Controls.mjs +233 -0
  23. package/dist/components/Canvas/FrameAnimation.mjs +344 -0
  24. package/dist/components/Canvas/LoadedCanvas.mjs +177 -0
  25. package/dist/components/Canvas/Placeholder.mjs +105 -0
  26. package/dist/components/Canvas/fromManifest.mjs +44 -0
  27. package/dist/components/Canvas/index.mjs +19 -0
  28. package/dist/components/Canvas/layout.mjs +369 -0
  29. package/dist/components/Canvas/media/MediaBody.mjs +285 -0
  30. package/dist/components/Canvas/media/Player.mjs +193 -0
  31. package/dist/components/Canvas/media/Transport.mjs +511 -0
  32. package/dist/components/Canvas/media/TransportButton.mjs +39 -0
  33. package/dist/components/Canvas/media/useBarHeight.mjs +28 -0
  34. package/dist/components/Canvas/media/useCaptionTracks.mjs +131 -0
  35. package/dist/components/Canvas/media/useMediaController.mjs +77 -0
  36. package/dist/components/Canvas/media/useMediaElement.mjs +100 -0
  37. package/dist/components/Canvas/panClearOfControls.mjs +92 -0
  38. package/dist/components/Canvas/rendererSurface.mjs +6 -0
  39. package/dist/components/Canvas/surface.mjs +5 -0
  40. package/dist/components/Canvas/track.mjs +43 -0
  41. package/dist/components/Canvas/useSvgReader.mjs +23 -0
  42. package/dist/components/Collection/Collection.mjs +76 -0
  43. package/dist/components/CollectionSelect/CollectionSelect.mjs +114 -0
  44. package/dist/components/Contents/Contents.mjs +120 -0
  45. package/dist/components/Download/Download.mjs +105 -0
  46. package/dist/components/Items/Item.mjs +184 -0
  47. package/dist/components/Items/Items.mjs +455 -0
  48. package/dist/components/Items/Pager.mjs +190 -0
  49. package/dist/components/Items/StandaloneItems.mjs +80 -0
  50. package/dist/components/Items/clamped.mjs +90 -0
  51. package/dist/components/Label/Label.mjs +39 -0
  52. package/dist/components/Map/LoadedMap.mjs +26 -0
  53. package/dist/components/Map/Map.mjs +38 -0
  54. package/dist/components/Map/MapView.mjs +538 -0
  55. package/dist/components/Map/basemap.mjs +50 -0
  56. package/dist/components/Map/overlayImage.mjs +17 -0
  57. package/dist/components/Panel/About.mjs +143 -0
  58. package/dist/components/Panel/Panel.mjs +259 -0
  59. package/dist/components/Panel/PanelToggle.mjs +43 -0
  60. package/dist/components/Panel/PartOfManifest.mjs +52 -0
  61. package/dist/components/Primitives/Primitives.mjs +263 -0
  62. package/dist/components/Primitives/resource.mjs +11 -0
  63. package/dist/components/Provider/Provider.mjs +174 -0
  64. package/dist/components/Root/Announcer.mjs +58 -0
  65. package/dist/components/Root/Root.mjs +29 -0
  66. package/dist/components/Root/useRootState.mjs +188 -0
  67. package/dist/components/Scene/Connected.mjs +48 -0
  68. package/dist/components/Scene/Loaded.mjs +56 -0
  69. package/dist/components/Scene/RotatePad.mjs +204 -0
  70. package/dist/components/Scene/Scene.mjs +20 -0
  71. package/dist/components/Scene/SceneView.mjs +539 -0
  72. package/dist/components/Scene/cloverEngine.mjs +105 -0
  73. package/dist/components/Scene/engine.mjs +141 -0
  74. package/dist/components/Scene/engines.mjs +23 -0
  75. package/dist/components/Scene/gestures.mjs +74 -0
  76. package/dist/components/Scene/models.mjs +78 -0
  77. package/dist/components/Scene/orbit.mjs +60 -0
  78. package/dist/components/Search/Search.mjs +246 -0
  79. package/dist/components/Split/Split.mjs +203 -0
  80. package/dist/components/Split/splitting.mjs +203 -0
  81. package/dist/components/Status/Status.mjs +47 -0
  82. package/dist/components/Timeline/Connected.mjs +25 -0
  83. package/dist/components/Timeline/Timeline.mjs +40 -0
  84. package/dist/components/Timeline/playerSurface.mjs +84 -0
  85. package/dist/components/Transcript/Transcript.mjs +377 -0
  86. package/dist/components/Viewer/Viewer.mjs +19 -0
  87. package/dist/core/annotation-bodies.mjs +29 -0
  88. package/dist/core/annotation-collection.mjs +55 -0
  89. package/dist/core/annotation-name.mjs +31 -0
  90. package/dist/core/annotation-sets.mjs +155 -0
  91. package/dist/core/annotations-content.mjs +27 -0
  92. package/dist/core/annotations.mjs +73 -0
  93. package/dist/core/clover.mjs +393 -0
  94. package/dist/core/content-state-reader.mjs +82 -0
  95. package/dist/core/content-state.mjs +43 -0
  96. package/dist/core/direction.mjs +12 -0
  97. package/dist/core/geo-detect.mjs +30 -0
  98. package/dist/core/geo.mjs +283 -0
  99. package/dist/core/items.mjs +74 -0
  100. package/dist/core/keep-fragments.mjs +40 -0
  101. package/dist/core/link.mjs +28 -0
  102. package/dist/core/load.mjs +176 -0
  103. package/dist/core/map-config.mjs +12 -0
  104. package/dist/core/markdown.mjs +139 -0
  105. package/dist/core/pages.mjs +51 -0
  106. package/dist/core/painted-bodies.mjs +20 -0
  107. package/dist/core/painting.mjs +17 -0
  108. package/dist/core/presentation.mjs +27 -0
  109. package/dist/core/ranges.mjs +133 -0
  110. package/dist/core/region.mjs +32 -0
  111. package/dist/core/request.mjs +40 -0
  112. package/dist/core/sanitize.mjs +72 -0
  113. package/dist/core/search-service.mjs +22 -0
  114. package/dist/core/search.mjs +154 -0
  115. package/dist/core/selectors.mjs +94 -0
  116. package/dist/core/sequence.mjs +70 -0
  117. package/dist/core/show-link.mjs +16 -0
  118. package/dist/core/store.mjs +40 -0
  119. package/dist/core/svg-shape.mjs +183 -0
  120. package/dist/core/text.mjs +36 -0
  121. package/dist/core/thumbnail.mjs +55 -0
  122. package/dist/core/value.mjs +39 -0
  123. package/dist/core/vtt.mjs +111 -0
  124. package/dist/hooks/useFullscreen.mjs +21 -0
  125. package/dist/hooks/useFullscreenSupported.mjs +11 -0
  126. package/dist/hooks/useLoaded.mjs +27 -0
  127. package/dist/hooks/useWithinFullscreen.mjs +24 -0
  128. package/dist/i18n/config.mjs +170 -0
  129. package/dist/i18n/hostLanguage.mjs +6 -0
  130. package/dist/i18n/locales/en.json.mjs +5 -0
  131. package/dist/i18n/locales/es.json.mjs +5 -0
  132. package/dist/i18n/locales/fi.json.mjs +5 -0
  133. package/dist/i18n/locales/fr.json.mjs +5 -0
  134. package/dist/i18n/locales/index.mjs +13 -0
  135. package/dist/i18n/locales/nb.json.mjs +5 -0
  136. package/dist/i18n/locales/nn.json.mjs +5 -0
  137. package/dist/i18n/locales/no.json.mjs +5 -0
  138. package/dist/i18n/locales/pt.json.mjs +5 -0
  139. package/dist/i18n/reader.mjs +13 -0
  140. package/dist/i18n/useCloverTranslation.mjs +28 -0
  141. package/dist/index.d.mts +2204 -0
  142. package/dist/index.mjs +133 -0
  143. package/dist/lib/asArray.mjs +5 -0
  144. package/dist/lib/classnames.mjs +5 -0
  145. package/dist/lib/fullscreen.mjs +65 -0
  146. package/dist/lib/gltf/bounds.mjs +44 -0
  147. package/dist/lib/gltf/load.mjs +156 -0
  148. package/dist/lib/gltf/mat4.mjs +150 -0
  149. package/dist/lib/gltf/renderer.mjs +342 -0
  150. package/dist/lib/gltf/shaders.mjs +192 -0
  151. package/dist/lib/hls.mjs +6 -0
  152. package/dist/lib/pointer.mjs +38 -0
  153. package/dist/lib/renderer/CanvasRenderer.mjs +857 -0
  154. package/dist/lib/renderer/backends/backend.mjs +21 -0
  155. package/dist/lib/renderer/backends/canvas2d/Canvas2DBackend.mjs +91 -0
  156. package/dist/lib/renderer/backends/contexts.mjs +27 -0
  157. package/dist/lib/renderer/backends/dom/DomLayers.mjs +91 -0
  158. package/dist/lib/renderer/backends/webgl2/WebGL2Backend.mjs +248 -0
  159. package/dist/lib/renderer/backends/webgl2/shaders.mjs +28 -0
  160. package/dist/lib/renderer/camera/Camera.mjs +64 -0
  161. package/dist/lib/renderer/camera/CameraAnimator.mjs +90 -0
  162. package/dist/lib/renderer/input/GestureController.mjs +252 -0
  163. package/dist/lib/renderer/io/TileCache.mjs +207 -0
  164. package/dist/lib/renderer/io/decode.mjs +156 -0
  165. package/dist/lib/renderer/loop/FrameLoop.mjs +50 -0
  166. package/dist/lib/renderer/math/affine.mjs +68 -0
  167. package/dist/lib/renderer/math/rect.mjs +45 -0
  168. package/dist/lib/renderer/overlays/Navigator.mjs +141 -0
  169. package/dist/lib/renderer/overlays/OverlayLayer.mjs +94 -0
  170. package/dist/lib/renderer/scene/planFrame.mjs +168 -0
  171. package/dist/lib/renderer/scene/regions.mjs +30 -0
  172. package/dist/lib/renderer/scene/sceneItem.mjs +114 -0
  173. package/dist/lib/renderer/scene/uploadBudget.mjs +30 -0
  174. package/dist/lib/renderer/sources/imageService.mjs +160 -0
  175. package/dist/lib/renderer/sources/sizedImage.mjs +38 -0
  176. package/dist/lib/renderer/sources/tilePyramid.mjs +172 -0
  177. package/dist/lib/time.mjs +21 -0
  178. package/dist/map/index.d.mts +184 -0
  179. package/dist/map/index.mjs +16 -0
  180. package/dist/react/context.mjs +46 -0
  181. package/dist/react/hooks.mjs +69 -0
  182. package/dist/react/language.mjs +30 -0
  183. package/dist/styles.css +1 -0
  184. package/dist/templates/default/Default.mjs +229 -0
  185. package/dist/templates/document/Document.mjs +286 -0
  186. package/dist/templates/document/DocumentPanel.mjs +9 -0
  187. package/dist/templates/document/Sheets.mjs +360 -0
  188. package/dist/templates/gallery/Gallery.mjs +62 -0
  189. package/dist/templates/index.d.mts +273 -0
  190. package/dist/templates/index.mjs +11 -0
  191. package/dist/templates/shared/Lightbox.mjs +111 -0
  192. package/dist/templates/shared/LightboxBody.mjs +9 -0
  193. package/dist/templates/shared/dragToClose.mjs +129 -0
  194. package/dist/templates/shared/useDragToClose.mjs +35 -0
  195. package/dist/templates/shared/useDrawer.mjs +113 -0
  196. package/dist/templates/shared/useFollowFocus.mjs +24 -0
  197. package/dist/templates/shared/useSlide.mjs +52 -0
  198. package/dist/templates/shared/useSpine.mjs +26 -0
  199. package/dist/templates.css +1 -0
  200. package/dist/three/index.d.mts +6 -0
  201. package/dist/three/index.mjs +8 -0
  202. package/dist/ui/Button.mjs +53 -0
  203. package/dist/ui/ControlCluster.mjs +87 -0
  204. package/dist/ui/Cue.mjs +13 -0
  205. package/dist/ui/ErrorBoundary.mjs +26 -0
  206. package/dist/ui/ExitFullscreen.mjs +46 -0
  207. package/dist/ui/FieldPill.mjs +153 -0
  208. package/dist/ui/HideToggle.mjs +57 -0
  209. package/dist/ui/Loading.mjs +20 -0
  210. package/dist/ui/Markup.mjs +95 -0
  211. package/dist/ui/ReadMore.mjs +84 -0
  212. package/dist/ui/Sections.mjs +448 -0
  213. package/dist/ui/Steps.mjs +84 -0
  214. package/dist/ui/Tip.mjs +196 -0
  215. package/dist/ui/bringIntoView.mjs +27 -0
  216. package/dist/ui/controlGlyphs.mjs +120 -0
  217. package/dist/ui/heading.mjs +19 -0
  218. package/dist/ui/languageCode.mjs +8 -0
  219. package/dist/ui/mediaIcons.mjs +104 -0
  220. package/dist/ui/useClusterReach.mjs +50 -0
  221. package/dist/ui/useContainerName.mjs +19 -0
  222. package/dist/ui/useOneOpen.mjs +22 -0
  223. package/dist/ui/useRovingFocus.mjs +64 -0
  224. package/dist/ui/useScrollTrack.mjs +150 -0
  225. package/dist/ui/useUniqueId.mjs +10 -0
  226. package/dist/ui/visuallyHidden.mjs +15 -0
  227. package/dist/web-components/About-uKa1wfDr.mjs +1 -0
  228. package/dist/web-components/AnnotationMenu-BGIYRXW6.mjs +1 -0
  229. package/dist/web-components/AnnotationState-D2UIgIEC.mjs +1 -0
  230. package/dist/web-components/Annotations-BhwAv3ah.mjs +1 -0
  231. package/dist/web-components/Annotations-C_tBJHo3.mjs +2 -0
  232. package/dist/web-components/Body-DMEERFuB.mjs +1 -0
  233. package/dist/web-components/BodyAlert-BP8voSLv.mjs +1 -0
  234. package/dist/web-components/Button-Cl02BFDd.mjs +1 -0
  235. package/dist/web-components/Camera-Dw51CAfF.mjs +1 -0
  236. package/dist/web-components/Canvas2DBackend-RRN2bEkc.mjs +1 -0
  237. package/dist/web-components/CanvasView-B8lMMSou.mjs +1 -0
  238. package/dist/web-components/CaptionDetails-KLMDv-ec.mjs +1 -0
  239. package/dist/web-components/ChoiceMenu-CXrVOmJl.mjs +1 -0
  240. package/dist/web-components/Collection-DL4Ui4hF.mjs +1 -0
  241. package/dist/web-components/CollectionSelect-DL-bbpwJ.mjs +1 -0
  242. package/dist/web-components/Connected-B0S1HXQb.mjs +1 -0
  243. package/dist/web-components/Connected-BcjRA5si.mjs +1 -0
  244. package/dist/web-components/Connected-Q7iizBb8.mjs +1 -0
  245. package/dist/web-components/Contents-ZC8TiGaW.mjs +1 -0
  246. package/dist/web-components/ControlMenu-DIoU797-.mjs +1 -0
  247. package/dist/web-components/Cue-CJxnDMEy.mjs +1 -0
  248. package/dist/web-components/Document-DHBRAFEK.mjs +1 -0
  249. package/dist/web-components/DocumentPanel-CqvE2pu9.mjs +1 -0
  250. package/dist/web-components/DomLayers-BsR2AOy-.mjs +1 -0
  251. package/dist/web-components/Download-DBksL1C0.mjs +1 -0
  252. package/dist/web-components/EntryBodies-VwEkTVrw.mjs +1 -0
  253. package/dist/web-components/ErrorBoundary-Cy9PGoZv.mjs +1 -0
  254. package/dist/web-components/FieldPill-DCJBz6Vj.mjs +1 -0
  255. package/dist/web-components/FrameAnimation-DRbmgGpF.mjs +1 -0
  256. package/dist/web-components/Gallery-BM7-VJkB.mjs +1 -0
  257. package/dist/web-components/HideToggle-BdYgG7us.mjs +1 -0
  258. package/dist/web-components/Items-_1Jz3FMs.mjs +1 -0
  259. package/dist/web-components/Label-CAiJ49eA.mjs +1 -0
  260. package/dist/web-components/LightboxBody-DyhUZiDf.mjs +1 -0
  261. package/dist/web-components/Loaded-wQurAeJz.mjs +1 -0
  262. package/dist/web-components/LoadedCanvas-DWz5IK5m.mjs +1 -0
  263. package/dist/web-components/LoadedMap-DIeW313M.mjs +1 -0
  264. package/dist/web-components/Loading-BmA--pzr.mjs +1 -0
  265. package/dist/web-components/Map-DzVGblIS.mjs +1 -0
  266. package/dist/web-components/MapView-BJaN7VBI.mjs +1 -0
  267. package/dist/web-components/Markup-D91DbxLk.mjs +2 -0
  268. package/dist/web-components/MediaBody-BYcVPo2X.mjs +1 -0
  269. package/dist/web-components/MediaBody-FEzH8VVw.mjs +1 -0
  270. package/dist/web-components/Navigator-CIJFA3q1.mjs +1 -0
  271. package/dist/web-components/Pager-BGwCurxE.mjs +1 -0
  272. package/dist/web-components/Panel-B-GXOkzF.mjs +1 -0
  273. package/dist/web-components/PanelToggle-BYjV2t1j.mjs +1 -0
  274. package/dist/web-components/PartOfManifest-ClbGepVM.mjs +1 -0
  275. package/dist/web-components/Pending-BspZajh5.mjs +1 -0
  276. package/dist/web-components/Primitives-CTh59wvs.mjs +1 -0
  277. package/dist/web-components/Provider-C6rIiDXH.mjs +1 -0
  278. package/dist/web-components/ReadMore-BJ2i-0uN.mjs +1 -0
  279. package/dist/web-components/Root-DkkYDtur.mjs +1 -0
  280. package/dist/web-components/Scene-B_PU_TiX.mjs +1 -0
  281. package/dist/web-components/SceneView-qcW_sT3j.mjs +1 -0
  282. package/dist/web-components/Search-UOneIUcP.mjs +1 -0
  283. package/dist/web-components/Sections-we9U9fXq.mjs +2 -0
  284. package/dist/web-components/StandaloneItems-DU8oCFc_.mjs +1 -0
  285. package/dist/web-components/Status-Cs5ZvFvL.mjs +1 -0
  286. package/dist/web-components/Timeline-WtYZ1bIJ.mjs +1 -0
  287. package/dist/web-components/Tip-C8J3qsIK.mjs +1 -0
  288. package/dist/web-components/Transcript-CRL2zToL.mjs +1 -0
  289. package/dist/web-components/annotation-collection-ZPyvpLFc.mjs +1 -0
  290. package/dist/web-components/annotations-content-BZChKhJZ.mjs +1 -0
  291. package/dist/web-components/assets/maplibre-gl-worker-kTz9OPxr.js +13831 -0
  292. package/dist/web-components/body-UntgrmoV.mjs +1 -0
  293. package/dist/web-components/bringIntoView-CQH5ZgMM.mjs +1 -0
  294. package/dist/web-components/canvas-d_U4v_mh.mjs +1 -0
  295. package/dist/web-components/classnames-DukgfdpI.mjs +1 -0
  296. package/dist/web-components/cloverEngine-Dbv-26NP.mjs +164 -0
  297. package/dist/web-components/content-state-reader-DjdKWjit.mjs +1 -0
  298. package/dist/web-components/contexts-ByL3eA_T.mjs +1 -0
  299. package/dist/web-components/controls-qRYf2jO2.mjs +1 -0
  300. package/dist/web-components/custom-elements.json +2739 -0
  301. package/dist/web-components/dragToClose-C-Pf1IeO.mjs +1 -0
  302. package/dist/web-components/engine-D8JLgzqq.mjs +4228 -0
  303. package/dist/web-components/engines-BwVb9R_A.mjs +1 -0
  304. package/dist/web-components/es-BwMkoRod.mjs +1 -0
  305. package/dist/web-components/fi-gPFOn9RK.mjs +1 -0
  306. package/dist/web-components/fr-DUHmgdJo.mjs +1 -0
  307. package/dist/web-components/fromManifest-UrMJgktp.mjs +1 -0
  308. package/dist/web-components/glyphs-BoX0a88P.mjs +1 -0
  309. package/dist/web-components/heading-Cjt0f-Eu.mjs +1 -0
  310. package/dist/web-components/hls-CdKrthkC.mjs +40 -0
  311. package/dist/web-components/hooks-Dp8pjU8l.mjs +1 -0
  312. package/dist/web-components/imageService-C3yg9DxB.mjs +1 -0
  313. package/dist/web-components/index-DWxMuwDL.mjs +1 -0
  314. package/dist/web-components/index.d.mts +604 -0
  315. package/dist/web-components/index.mjs +1 -0
  316. package/dist/web-components/index.umd.js +18 -0
  317. package/dist/web-components/items--Tu7ZM3L.mjs +1 -0
  318. package/dist/web-components/items-W2vrwArM.mjs +1 -0
  319. package/dist/web-components/keep-fragments-B5nlv2ck.mjs +1 -0
  320. package/dist/web-components/label-CYQ7tVl6.mjs +1 -0
  321. package/dist/web-components/languageCode-cCpiU0b0.mjs +1 -0
  322. package/dist/web-components/layout-KL0V-iJu.mjs +1 -0
  323. package/dist/web-components/link-DRRTY4lY.mjs +1 -0
  324. package/dist/web-components/logo-CnQUCB3Y.mjs +1 -0
  325. package/dist/web-components/maplibre-gl-CQ4OueXY.mjs +823 -0
  326. package/dist/web-components/markdown-CCYJwzFn.mjs +5 -0
  327. package/dist/web-components/models-BP2qp9nT.mjs +1 -0
  328. package/dist/web-components/nb-BSvnQ6jd.mjs +1 -0
  329. package/dist/web-components/nn-Dg2_HdZu.mjs +1 -0
  330. package/dist/web-components/no-BSvnQ6jd.mjs +1 -0
  331. package/dist/web-components/nodes-Bf-Fb7e5.mjs +1 -0
  332. package/dist/web-components/overlayImage-DdPs2EGY.mjs +1 -0
  333. package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +1 -0
  334. package/dist/web-components/panel-CiqEFDzv.mjs +1 -0
  335. package/dist/web-components/part-CUBY90_b.mjs +1 -0
  336. package/dist/web-components/playerSurface-i2TJz-F4.mjs +1 -0
  337. package/dist/web-components/provider-LUmAQSoP.mjs +1 -0
  338. package/dist/web-components/pt-B3J80JgO.mjs +1 -0
  339. package/dist/web-components/read-more-BaaO77el.mjs +1 -0
  340. package/dist/web-components/rendererSurface-DAvatpMF.mjs +22 -0
  341. package/dist/web-components/renderers-Bg4QqawN.mjs +1 -0
  342. package/dist/web-components/resource-DzIvB_4m.mjs +1 -0
  343. package/dist/web-components/sanitize-Dc7nOsgO.mjs +3 -0
  344. package/dist/web-components/search-DgcgsI3I.mjs +1 -0
  345. package/dist/web-components/shared-J3w3gnXD.mjs +1 -0
  346. package/dist/web-components/show-link-DWRRXSBy.mjs +1 -0
  347. package/dist/web-components/sizedImage-DfjlV2-i.mjs +1 -0
  348. package/dist/web-components/split-m-_XivaW.mjs +1 -0
  349. package/dist/web-components/splitting-BnQUxxgH.mjs +1 -0
  350. package/dist/web-components/status-DDS7jLNd.mjs +1 -0
  351. package/dist/web-components/styles-Ypl9KrSK.mjs +1 -0
  352. package/dist/web-components/svg-shape-DLY3g7oq.mjs +1 -0
  353. package/dist/web-components/text-BTAkxEfQ.mjs +5 -0
  354. package/dist/web-components/three.mjs +1 -0
  355. package/dist/web-components/thumbnail-BZvLSwWW.mjs +1 -0
  356. package/dist/web-components/time-B9GZoYcm.mjs +1 -0
  357. package/dist/web-components/tip-BXByhOJ9.mjs +1 -0
  358. package/dist/web-components/toggle-AS72kq6v.mjs +1 -0
  359. package/dist/web-components/upgrader-XNxI-5jo.mjs +1 -0
  360. package/dist/web-components/useContainerName-DCbE5JXi.mjs +1 -0
  361. package/dist/web-components/useNearViewport-CyoK3l8W.mjs +1 -0
  362. package/dist/web-components/useScrollTrack-dLFWnT8N.mjs +1 -0
  363. package/dist/web-components/viewer/AnnotationMenu-Dd4tnzNV.mjs +1 -0
  364. package/dist/web-components/viewer/AnnotationState-DZaSy5lH.mjs +1 -0
  365. package/dist/web-components/viewer/Annotations-D1h-Yi5J.mjs +1 -0
  366. package/dist/web-components/viewer/Annotations-sj79EMen.mjs +2 -0
  367. package/dist/web-components/viewer/Canvas2DBackend-CkvI0wUT.mjs +1 -0
  368. package/dist/web-components/viewer/CaptionDetails-B_JdNjJ7.mjs +1 -0
  369. package/dist/web-components/viewer/ChoiceMenu-xa51a1DV.mjs +1 -0
  370. package/dist/web-components/viewer/Collection-CxuLCspj.mjs +1 -0
  371. package/dist/web-components/viewer/Connected-BSUBc3Ci.mjs +1 -0
  372. package/dist/web-components/viewer/Connected-CPIxNjF2.mjs +1 -0
  373. package/dist/web-components/viewer/Contents-DNh9mnsF.mjs +1 -0
  374. package/dist/web-components/viewer/ControlMenu-DdgIvBdf.mjs +1 -0
  375. package/dist/web-components/viewer/Cue-90H9_dXz.mjs +1 -0
  376. package/dist/web-components/viewer/Document-CNCpzkiN.mjs +1 -0
  377. package/dist/web-components/viewer/DocumentPanel-BdG4TVLE.mjs +1 -0
  378. package/dist/web-components/viewer/DomLayers-Dybz_aJv.mjs +1 -0
  379. package/dist/web-components/viewer/EntryBodies-DGXjFP3N.mjs +1 -0
  380. package/dist/web-components/viewer/FieldPill-Icmd98OY.mjs +1 -0
  381. package/dist/web-components/viewer/FrameAnimation-DJZN3Rd4.mjs +1 -0
  382. package/dist/web-components/viewer/Gallery-CEp3-bh2.mjs +1 -0
  383. package/dist/web-components/viewer/HideToggle-DB6HTmAO.mjs +1 -0
  384. package/dist/web-components/viewer/LightboxBody-ClQ4yrTh.mjs +1 -0
  385. package/dist/web-components/viewer/MapView-BVSdybIC.mjs +1 -0
  386. package/dist/web-components/viewer/MediaBody-BBbSMT1i.mjs +1 -0
  387. package/dist/web-components/viewer/MediaBody-BzMXMHIF.mjs +1 -0
  388. package/dist/web-components/viewer/Navigator-Duc69Yes.mjs +1 -0
  389. package/dist/web-components/viewer/PartOfManifest-X9_q-2t6.mjs +1 -0
  390. package/dist/web-components/viewer/Search-S4N5QU4R.mjs +1 -0
  391. package/dist/web-components/viewer/StandaloneItems-BO4VyWRW.mjs +1 -0
  392. package/dist/web-components/viewer/Transcript-BbDaS064.mjs +1 -0
  393. package/dist/web-components/viewer/annotation-collection-BjZ1DAHq.mjs +1 -0
  394. package/dist/web-components/viewer/annotations-content-jn3n5Y2-.mjs +1 -0
  395. package/dist/web-components/viewer/cloverEngine-CjuYjUhI.mjs +164 -0
  396. package/dist/web-components/viewer/content-state-reader-CPiShIjP.mjs +1 -0
  397. package/dist/web-components/viewer/host-yWi4R1bP.mjs +1 -0
  398. package/dist/web-components/viewer/index.d.mts +7 -0
  399. package/dist/web-components/viewer/index.mjs +1 -0
  400. package/dist/web-components/viewer/index.umd.js +18 -0
  401. package/dist/web-components/viewer/link-CwE-fg5G.mjs +1 -0
  402. package/dist/web-components/viewer/overlayImage-BpOgqsZ0.mjs +1 -0
  403. package/dist/web-components/viewer/renderers-L-IlGI1r.mjs +1 -0
  404. package/dist/web-components/viewer/search-DWkwRPo_.mjs +1 -0
  405. package/dist/web-components/viewer/styles-BRCkEU3w.mjs +1 -0
  406. package/dist/web-components/viewer/viewer--TreVlJ_.mjs +28 -0
  407. package/dist/web-components/viewer/vtt-1ZJwtElI.mjs +5 -0
  408. package/dist/web-components/viewer-DyV864Qe.mjs +1 -0
  409. package/dist/web-components/vtt-GFssZH8Y.mjs +5 -0
  410. package/package.json +110 -4
@@ -0,0 +1,160 @@
1
+ "use client";
2
+ import { cloverFetch } from "../../../core/request.mjs";
3
+ const DECODABLE = ["jpg", "png", "webp", "gif"];
4
+ class ImageServiceError extends Error {
5
+ constructor(message, url, status) {
6
+ super(message);
7
+ this.url = url;
8
+ this.status = status;
9
+ this.name = "ImageServiceError";
10
+ }
11
+ }
12
+ function serviceBase(uri) {
13
+ return uri.replace(/\/info\.json$/, "").replace(/\/+$/, "");
14
+ }
15
+ function findImageServiceId(service) {
16
+ const services = Array.isArray(service) ? service : service ? [service] : [];
17
+ for (const candidate of services) {
18
+ if (!candidate || typeof candidate !== "object") continue;
19
+ const s = candidate;
20
+ const type = String(s.type ?? s["@type"] ?? "");
21
+ const profile = JSON.stringify(s.profile ?? "");
22
+ const isImageService = /ImageService/i.test(type) || /iiif\.io\/api\/image/.test(profile) || /^"level[012]"$/.test(profile) || !type && !s.profile;
23
+ const id = s["@id"] ?? s.id;
24
+ if (isImageService && typeof id === "string") return serviceBase(id);
25
+ }
26
+ return void 0;
27
+ }
28
+ function parseInfo(json, requestedId) {
29
+ if (!json || typeof json !== "object") {
30
+ throw new ImageServiceError(
31
+ "info.json is not an object",
32
+ requestedId ?? ""
33
+ );
34
+ }
35
+ const doc = json;
36
+ const version = detectVersion(doc);
37
+ const rawId = version === 3 ? doc.id ?? doc["@id"] : doc["@id"] ?? doc.id;
38
+ const id = serviceBase(rawId ?? requestedId ?? "");
39
+ const width = Number(doc.width);
40
+ const height = Number(doc.height);
41
+ if (!id || !(width > 0) || !(height > 0)) {
42
+ throw new ImageServiceError(
43
+ "info.json is missing id, width or height",
44
+ requestedId ?? id
45
+ );
46
+ }
47
+ const profiles = Array.isArray(doc.profile) ? doc.profile : [doc.profile];
48
+ const complianceUri = profiles.find((p) => typeof p === "string");
49
+ const profileObjects = profiles.filter(
50
+ (p) => !!p && typeof p === "object"
51
+ );
52
+ const level = detectLevel(complianceUri);
53
+ const supports = /* @__PURE__ */ new Set([
54
+ ...Array.isArray(doc.extraFeatures) ? doc.extraFeatures : [],
55
+ ...profileObjects.flatMap(
56
+ (p) => Array.isArray(p.supports) ? p.supports : []
57
+ )
58
+ ]);
59
+ const formats = [
60
+ ...Array.isArray(doc.preferredFormats) ? doc.preferredFormats : []
61
+ ].map((f) => String(f).toLowerCase());
62
+ const format = formats.find((f) => DECODABLE.includes(f)) ?? "jpg";
63
+ const maxOf = (key) => {
64
+ var _a;
65
+ const value = doc[key] ?? ((_a = profileObjects.find((p) => p[key] !== void 0)) == null ? void 0 : _a[key]);
66
+ return Number(value) > 0 ? Number(value) : void 0;
67
+ };
68
+ let maxWidth = maxOf("maxWidth");
69
+ let maxHeight = maxOf("maxHeight");
70
+ if (maxWidth && !maxHeight) maxHeight = maxWidth;
71
+ if (maxHeight && !maxWidth) maxWidth = void 0;
72
+ return {
73
+ id,
74
+ version,
75
+ level,
76
+ width,
77
+ height,
78
+ tiles: parseTiles(doc.tiles),
79
+ sizes: parseSizes(doc.sizes),
80
+ maxWidth,
81
+ maxHeight,
82
+ maxArea: maxOf("maxArea"),
83
+ regionByPx: level >= 1 || supports.has("regionByPx"),
84
+ sizeByW: level >= 1 || supports.has("sizeByW") || supports.has("sizeByWh"),
85
+ format,
86
+ quality: "default"
87
+ };
88
+ }
89
+ function detectVersion(doc) {
90
+ const contexts = [].concat(doc["@context"] ?? []).map(String);
91
+ if (contexts.some((c) => c.includes("/image/3"))) return 3;
92
+ if (contexts.some((c) => c.includes("/image/2"))) return 2;
93
+ if (doc.type === "ImageService3") return 3;
94
+ return doc["@id"] ? 2 : 3;
95
+ }
96
+ function detectLevel(compliance) {
97
+ const match = compliance == null ? void 0 : compliance.match(/level([012])/);
98
+ return match ? Number(match[1]) : 0;
99
+ }
100
+ function parseTiles(tiles) {
101
+ if (!Array.isArray(tiles)) return [];
102
+ return tiles.map((t) => {
103
+ const width = Number(t == null ? void 0 : t.width);
104
+ const height = Number((t == null ? void 0 : t.height) ?? (t == null ? void 0 : t.width));
105
+ const scaleFactors = (Array.isArray(t == null ? void 0 : t.scaleFactors) ? t.scaleFactors : [1]).map(Number).filter((s) => s > 0).sort((a, b) => a - b);
106
+ return { width, height, scaleFactors };
107
+ }).filter((t) => t.width > 0 && t.height > 0 && t.scaleFactors.length);
108
+ }
109
+ function parseSizes(sizes) {
110
+ if (!Array.isArray(sizes)) return [];
111
+ return sizes.map((s) => ({ width: Number(s == null ? void 0 : s.width), height: Number(s == null ? void 0 : s.height) })).filter((s) => s.width > 0 && s.height > 0).sort((a, b) => a.width - b.width);
112
+ }
113
+ function imageRequestUrl(info, region, width, height, quality = info.quality) {
114
+ const isFull = region.x === 0 && region.y === 0 && region.width === info.width && region.height === info.height;
115
+ const regionPart = isFull ? "full" : `${region.x},${region.y},${region.width},${region.height}`;
116
+ const isFullSize = isFull && width === info.width && height === info.height;
117
+ let sizePart;
118
+ if (info.version === 3) {
119
+ sizePart = isFullSize ? "max" : `${width},${height}`;
120
+ } else {
121
+ sizePart = isFullSize ? "full" : `${width},`;
122
+ }
123
+ return `${info.id}/${regionPart}/${sizePart}/0/${quality}.${info.format}`;
124
+ }
125
+ function alternateQuality(info) {
126
+ return info.version === 2 && info.level === 0 ? "native" : void 0;
127
+ }
128
+ const infoCache = /* @__PURE__ */ new Map();
129
+ function fetchInfo(serviceUri, { request } = {}) {
130
+ const base = serviceBase(serviceUri);
131
+ const cached = infoCache.get(base);
132
+ if (cached) return cached;
133
+ const url = `${base}/info.json`;
134
+ const pending = cloverFetch(request, url, {
135
+ headers: { Accept: "application/ld+json, application/json" }
136
+ }).then(async (response) => {
137
+ if (!response.ok) {
138
+ throw new ImageServiceError(
139
+ `info.json request failed with ${response.status}`,
140
+ url,
141
+ response.status
142
+ );
143
+ }
144
+ return parseInfo(await response.json(), base);
145
+ }).catch((error) => {
146
+ infoCache.delete(base);
147
+ throw error;
148
+ });
149
+ infoCache.set(base, pending);
150
+ return pending;
151
+ }
152
+ export {
153
+ ImageServiceError,
154
+ alternateQuality,
155
+ fetchInfo,
156
+ findImageServiceId,
157
+ imageRequestUrl,
158
+ parseInfo,
159
+ serviceBase
160
+ };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { imageRequestUrl } from "./imageService.mjs";
3
+ function sizedImageUrl(info, size, share) {
4
+ const clip = (value, limit) => Math.min(Math.max(Math.round(value), 0), limit);
5
+ const x = share ? clip(share.x * info.width, info.width - 1) : 0;
6
+ const y = share ? clip(share.y * info.height, info.height - 1) : 0;
7
+ const region = {
8
+ x,
9
+ y,
10
+ width: share ? Math.max(1, clip(share.width * info.width, info.width - x)) : info.width,
11
+ height: share ? Math.max(1, clip(share.height * info.height, info.height - y)) : info.height
12
+ };
13
+ const whole = region.width === info.width && region.height === info.height;
14
+ if (!whole && !info.regionByPx) return null;
15
+ if (info.sizeByW) {
16
+ let scale = Math.min(1, size / Math.max(region.width, region.height));
17
+ if (info.maxWidth) scale = Math.min(scale, info.maxWidth / region.width);
18
+ if (info.maxHeight) scale = Math.min(scale, info.maxHeight / region.height);
19
+ if (info.maxArea)
20
+ scale = Math.min(
21
+ scale,
22
+ Math.sqrt(info.maxArea / (region.width * region.height))
23
+ );
24
+ return imageRequestUrl(
25
+ info,
26
+ region,
27
+ Math.max(1, Math.floor(region.width * scale)),
28
+ Math.max(1, Math.floor(region.height * scale))
29
+ );
30
+ }
31
+ if (!whole) return null;
32
+ const sizes = [...info.sizes].sort((a, b) => a.width - b.width);
33
+ const pick = sizes.find((s) => Math.max(s.width, s.height) >= size) ?? sizes.at(-1) ?? { width: info.width, height: info.height };
34
+ return imageRequestUrl(info, region, pick.width, pick.height);
35
+ }
36
+ export {
37
+ sizedImageUrl
38
+ };
@@ -0,0 +1,172 @@
1
+ "use client";
2
+ import { alternateQuality, imageRequestUrl } from "./imageService.mjs";
3
+ const DERIVED_TILE_SIZE = 512;
4
+ const MAX_SINGLE_IMAGE_PIXELS = 16e6;
5
+ function staticPyramid(url, width, height) {
6
+ const level = {
7
+ scaleFactor: 1,
8
+ width,
9
+ height,
10
+ tileWidth: width,
11
+ tileHeight: height,
12
+ cols: 1,
13
+ rows: 1
14
+ };
15
+ return {
16
+ width,
17
+ height,
18
+ levels: [level],
19
+ tile: (address) => ({
20
+ ...address,
21
+ url,
22
+ region: { x: 0, y: 0, width, height }
23
+ })
24
+ };
25
+ }
26
+ function servicePyramid(info) {
27
+ const { width: W, height: H } = info;
28
+ const levels = [];
29
+ const arbitrary = info.regionByPx && info.sizeByW;
30
+ const tileLevel = (s, tw, th) => {
31
+ const width = Math.ceil(W / s);
32
+ const height = Math.ceil(H / s);
33
+ return {
34
+ scaleFactor: s,
35
+ width,
36
+ height,
37
+ tileWidth: tw,
38
+ tileHeight: th,
39
+ cols: Math.ceil(width / tw),
40
+ rows: Math.ceil(height / th)
41
+ };
42
+ };
43
+ const wholeLevel = (width, height) => ({
44
+ scaleFactor: W / width,
45
+ width,
46
+ height,
47
+ tileWidth: width,
48
+ tileHeight: height,
49
+ cols: 1,
50
+ rows: 1,
51
+ whole: true
52
+ });
53
+ const spec = info.tiles[0];
54
+ if (spec) {
55
+ for (const s of spec.scaleFactors) {
56
+ levels.push(tileLevel(s, spec.width, spec.height));
57
+ }
58
+ } else if (arbitrary) {
59
+ for (let s = 1; ; s *= 2) {
60
+ const level = tileLevel(s, DERIVED_TILE_SIZE, DERIVED_TILE_SIZE);
61
+ levels.push(level);
62
+ if (level.cols === 1 && level.rows === 1) break;
63
+ }
64
+ }
65
+ const coarsestTile = Math.max(0, ...levels.map((l) => l.scaleFactor));
66
+ for (const size of info.sizes) {
67
+ const s = W / size.width;
68
+ if (!withinLimits(info, size.width, size.height)) continue;
69
+ if (s > coarsestTile + 1e-9)
70
+ levels.push(wholeLevel(size.width, size.height));
71
+ }
72
+ const coarsest = levels.reduce(
73
+ (best, l) => !best || l.scaleFactor > best.scaleFactor ? l : best,
74
+ null
75
+ );
76
+ if (coarsest && coarsest.cols * coarsest.rows > 1 && info.sizeByW) {
77
+ const s = Math.max(W, H) / DERIVED_TILE_SIZE;
78
+ levels.push(wholeLevel(Math.ceil(W / s), Math.ceil(H / s)));
79
+ }
80
+ if (!levels.length || !spec && !arbitrary && W * H <= MAX_SINGLE_IMAGE_PIXELS) {
81
+ if (!levels.some((l) => l.scaleFactor === 1)) levels.push(wholeLevel(W, H));
82
+ }
83
+ const ordered = dedupe(levels).sort((a, b) => b.scaleFactor - a.scaleFactor);
84
+ const fallbackQuality = alternateQuality(info);
85
+ return {
86
+ width: W,
87
+ height: H,
88
+ levels: ordered,
89
+ tile(address) {
90
+ const level = ordered[address.level];
91
+ const s = level.scaleFactor;
92
+ const isWhole = level.cols === 1 && level.rows === 1;
93
+ let region;
94
+ let w;
95
+ let h;
96
+ if (isWhole) {
97
+ region = { x: 0, y: 0, width: W, height: H };
98
+ w = level.width;
99
+ h = level.height;
100
+ } else {
101
+ const x = Math.round(address.col * level.tileWidth * s);
102
+ const y = Math.round(address.row * level.tileHeight * s);
103
+ region = {
104
+ x,
105
+ y,
106
+ width: Math.min(Math.round(level.tileWidth * s), W - x),
107
+ height: Math.min(Math.round(level.tileHeight * s), H - y)
108
+ };
109
+ w = Math.ceil(region.width / s);
110
+ h = Math.ceil(region.height / s);
111
+ }
112
+ return {
113
+ ...address,
114
+ region,
115
+ url: imageRequestUrl(info, region, w, h),
116
+ fallbackUrl: fallbackQuality ? imageRequestUrl(info, region, w, h, fallbackQuality) : void 0
117
+ };
118
+ }
119
+ };
120
+ }
121
+ function withinLimits(info, w, h) {
122
+ if (info.maxWidth && w > info.maxWidth) return false;
123
+ if (info.maxHeight && h > info.maxHeight) return false;
124
+ if (info.maxArea && w * h > info.maxArea) return false;
125
+ return true;
126
+ }
127
+ function dedupe(levels) {
128
+ const seen = /* @__PURE__ */ new Map();
129
+ for (const level of levels) {
130
+ const key = `${level.width}x${level.height}`;
131
+ const existing = seen.get(key);
132
+ if (!existing || existing.cols * existing.rows < level.cols * level.rows) {
133
+ seen.set(key, level);
134
+ }
135
+ }
136
+ return [...seen.values()];
137
+ }
138
+ function chooseLevel(pyramid, imagePixelsPerDevicePixel) {
139
+ const levels = pyramid.levels;
140
+ for (let i = 0; i < levels.length; i++) {
141
+ if (levels[i].scaleFactor <= imagePixelsPerDevicePixel * (1 + 1e-6)) {
142
+ return i;
143
+ }
144
+ }
145
+ return levels.length - 1;
146
+ }
147
+ function tilesInRegion(pyramid, level, area) {
148
+ const l = pyramid.levels[level];
149
+ const spanX = l.tileWidth * l.scaleFactor;
150
+ const spanY = l.tileHeight * l.scaleFactor;
151
+ const x0 = Math.max(0, area.x);
152
+ const y0 = Math.max(0, area.y);
153
+ const x1 = Math.min(pyramid.width, area.x + area.width);
154
+ const y1 = Math.min(pyramid.height, area.y + area.height);
155
+ if (x1 <= x0 || y1 <= y0) return [];
156
+ const c0 = Math.max(0, Math.floor(x0 / spanX));
157
+ const c1 = Math.min(l.cols - 1, Math.floor((x1 - 1e-9) / spanX));
158
+ const r0 = Math.max(0, Math.floor(y0 / spanY));
159
+ const r1 = Math.min(l.rows - 1, Math.floor((y1 - 1e-9) / spanY));
160
+ const tiles = [];
161
+ for (let row = r0; row <= r1; row++) {
162
+ for (let col = c0; col <= c1; col++) tiles.push({ level, col, row });
163
+ }
164
+ return tiles;
165
+ }
166
+ export {
167
+ DERIVED_TILE_SIZE,
168
+ chooseLevel,
169
+ servicePyramid,
170
+ staticPyramid,
171
+ tilesInRegion
172
+ };
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ function formatTime(seconds) {
3
+ const total = Math.max(0, Math.floor(seconds || 0));
4
+ const h = Math.floor(total / 3600);
5
+ const m = Math.floor(total % 3600 / 60);
6
+ const s = String(total % 60).padStart(2, "0");
7
+ return h ? `${h}:${String(m).padStart(2, "0")}:${s}` : `${m}:${s}`;
8
+ }
9
+ function playFrom(element, seconds) {
10
+ var _a;
11
+ element.currentTime = seconds;
12
+ if (!element.paused) return;
13
+ try {
14
+ void ((_a = element.play()) == null ? void 0 : _a.catch(() => void 0));
15
+ } catch {
16
+ }
17
+ }
18
+ export {
19
+ formatTime,
20
+ playFrom
21
+ };
@@ -0,0 +1,184 @@
1
+ // Generated by dts-bundle-generator v8.0.1
2
+
3
+ import React from 'react';
4
+
5
+ /**
6
+ * IIIF language maps as text: the closest language to the reader's, and that language's
7
+ * tag, so the text can carry a `lang` attribute.
8
+ */
9
+ export type LanguageMapLike = string | Record<string, string[] | string | undefined> | null | undefined;
10
+ /**
11
+ * Whether a Manifest has anything to put on a map: navPlace on the Collection, Manifest,
12
+ * a Canvas or an annotation, a GeoJSON annotation body, or a georeferencing annotation.
13
+ * Only a look, never a read: the panel asks it to offer a Map tab, and the reading
14
+ * (`core/geo.ts`) belongs to the map entry, so an app without a map carries none of it.
15
+ */
16
+ export declare function hasMapData(manifest: Manifest | null, collection?: Collection | null): boolean;
17
+ /**
18
+ * Where a IIIF resource is, read for a map: navPlace (on a Collection, Manifest, Canvas
19
+ * or Annotation, and annotation bodies that are GeoJSON), and Georeference Extension
20
+ * annotations, reduced to what a basic overlay needs. Framework-free and small: the map
21
+ * itself, and MapLibre, load only when a `Map` is shown.
22
+ *
23
+ * - navPlace: https://iiif.io/api/extension/navplace/
24
+ * - Georeference: https://iiif.io/api/extension/georef/
25
+ */
26
+ export type Position = [
27
+ number,
28
+ number
29
+ ];
30
+ export interface GeoGeometry {
31
+ type: string;
32
+ coordinates?: unknown;
33
+ geometries?: GeoGeometry[];
34
+ }
35
+ export interface MapFeature {
36
+ type: "Feature";
37
+ id?: string | number;
38
+ geometry: GeoGeometry;
39
+ /**
40
+ * Flat, for MapLibre (which turns nested objects into strings): the text to show and
41
+ * its language, the Canvas it belongs to, and any simplestyle keys it carried (`fill`,
42
+ * `stroke`, …).
43
+ */
44
+ properties: Record<string, string | number | boolean> & {
45
+ title?: string;
46
+ titleLang?: string;
47
+ canvasId?: string;
48
+ };
49
+ }
50
+ export interface MapFeatureCollection {
51
+ type: "FeatureCollection";
52
+ features: MapFeature[];
53
+ }
54
+ /** A georeferenced image, reduced to an affine overlay. */
55
+ export interface Georeference {
56
+ id: string;
57
+ /** The Canvas it georeferences, when it targets one. */
58
+ canvasId?: string;
59
+ /** Ground control points: image pixel [x, y] ↔ [longitude, latitude]. */
60
+ points: Array<{
61
+ resource: Position;
62
+ geo: Position;
63
+ }>;
64
+ /** The extent the points are measured in: the Canvas, or the image service. */
65
+ width: number;
66
+ height: number;
67
+ /** The part of the image that is map (an SvgSelector polygon), in the same units. */
68
+ mask?: Position[];
69
+ /** Its name: the annotation's label, or the Canvas's. */
70
+ label?: LanguageMapLike;
71
+ /** What to draw: an image body (or a bare image service), sized by `overlayImageUrl`. */
72
+ image: Record<string, unknown>;
73
+ }
74
+ export type Json = Record<string, any>;
75
+ /**
76
+ * Every navPlace feature of the Root's resource: the Collection's, the Manifest's, each
77
+ * Canvas's, and each loaded annotation's (its `navPlace`, or a GeoJSON body as Cookbook
78
+ * 0139 has). A feature from a Canvas or annotation names that Canvas. Memoized on the
79
+ * Manifest (and the Collection), so the same collection comes back while nothing changes.
80
+ */
81
+ export declare function navPlaceOf(manifest: Manifest | null, collection?: Collection | null, language?: string): MapFeatureCollection;
82
+ /**
83
+ * One Georeference Extension annotation as an overlay: its control points, the extent
84
+ * they are measured in, its mask, and the image to draw (the Canvas's painted image, or
85
+ * the image service it targets directly). Null when it cannot be drawn: fewer than three
86
+ * points, no extent, or nothing to draw.
87
+ */
88
+ export declare function readGeoreference(annotation: Json, canvas?: Json): Georeference | null;
89
+ /**
90
+ * The georeferenced images of the Manifest's Canvases, from their loaded annotation pages.
91
+ * Memoized on the Manifest: embedding a fetched page makes a new one.
92
+ */
93
+ export declare function georeferencesOf(manifest: Manifest | null): Georeference[];
94
+ /**
95
+ * The first-order polynomial (affine) transform that best fits the control points, image
96
+ * pixels to [longitude, latitude], by least squares in Web Mercator. Exact for three
97
+ * points. Null when the points are collinear.
98
+ */
99
+ export declare function affineTransform(points: Georeference["points"]): ((pixel: Position) => Position) | null;
100
+ /**
101
+ * Where the image's corners land, in the order MapLibre's image and canvas sources take
102
+ * them: top left, top right, bottom right, bottom left. Null when the points do not fix
103
+ * a transform.
104
+ */
105
+ export declare function cornersOf(georeference: Georeference): [
106
+ Position,
107
+ Position,
108
+ Position,
109
+ Position
110
+ ] | null;
111
+ /** The [[west, south], [east, north]] that holds the features and the overlays. */
112
+ export declare function boundsOf(features: MapFeature[], overlays?: Georeference[]): [
113
+ Position,
114
+ Position
115
+ ] | null;
116
+ /**
117
+ * How Clover asks for things: one setting for every request it makes — the IIIF resource,
118
+ * referenced annotation pages, `info.json`, tiles, captions and HLS segments.
119
+ *
120
+ * A `<video>` or `<img>` element cannot send headers, so where Clover must use one (media
121
+ * without HLS, an image served without CORS) only `credentials` applies.
122
+ */
123
+ export interface CloverRequest {
124
+ /** Cookies and HTTP authentication: `"include"` sends them cross-origin. */
125
+ credentials?: RequestCredentials;
126
+ /** Extra headers, such as `Authorization`. They force a CORS preflight. */
127
+ headers?: Record<string, string>;
128
+ /** Your own `fetch`, to sign, log or proxy requests. */
129
+ fetch?: typeof fetch;
130
+ }
131
+ /**
132
+ * Turning whatever a `Root` is handed into a Manifest to show.
133
+ *
134
+ * `iiifContent` may be a URL, a IIIF resource object (Presentation 2, 3 or 4), or a content
135
+ * state (JSON or base64url). The resource may be a Manifest, a Collection (its first
136
+ * Manifest is shown), a lone Canvas (its `partOf` Manifest, or a Manifest made around
137
+ * it), or annotations, an AnnotationPage or AnnotationCollection (the Manifest their first
138
+ * annotation's Canvas is `partOf`, at that Canvas). Everything is fetched once, with the
139
+ * request settings, and upgraded to Presentation 4.
140
+ */
141
+ export type IIIFContent = string | Record<string, unknown>;
142
+ export interface MapProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSelect"> {
143
+ /**
144
+ * Standalone: a IIIF resource (URL or object) to map: its navPlace, and its Canvases'
145
+ * georeferenced images. Inside a `Root`, leave it out to map the Root's.
146
+ */
147
+ iiifContent?: IIIFContent;
148
+ /** GeoJSON to draw (a FeatureCollection, Feature or geometry), as navPlace is. */
149
+ navPlace?: unknown;
150
+ /** Georeference Extension annotations to overlay, on a Canvas or an image service. */
151
+ georeferences?: unknown[];
152
+ /** Draw georeferenced images over the basemap. Default true. */
153
+ overlay?: boolean;
154
+ /** The overlays' opacity, 0 to 1. Default 0.75. */
155
+ overlayOpacity?: number;
156
+ /** A MapLibre style URL, used as it is. Default: Clover's relief basemap (OpenFreeMap). */
157
+ styleUrl?: string;
158
+ /**
159
+ * Where MapLibre's worker is served from, if your bundler moves MapLibre's files (see
160
+ * the Map docs). By default MapLibre finds its own.
161
+ */
162
+ workerUrl?: string;
163
+ /** Zoom with the wheel or trackpad. Default false, so an embedded map never traps page scroll. */
164
+ scrollZoom?: boolean;
165
+ /**
166
+ * A place was chosen, on the map or in its list. Inside a `Root`, choosing one on a
167
+ * Canvas also goes there.
168
+ */
169
+ onSelect?: (feature: MapFeature) => void;
170
+ /** Standalone: credentials, headers and `fetch`. */
171
+ request?: CloverRequest;
172
+ /** Standalone: the language to read IIIF text in. */
173
+ language?: string;
174
+ as?: React.ElementType;
175
+ }
176
+ declare const CloverMap: React.ForwardRefExoticComponent<MapProps & React.RefAttributes<HTMLElement>>;
177
+ /** Serve MapLibre's worker from `url` for every map Clover draws (a Viewer's Map tab included). */
178
+ export declare function setMapWorkerUrl(url: string | undefined): void;
179
+
180
+ export {
181
+ CloverMap as Map,
182
+ };
183
+
184
+ export {};
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { CloverMap } from "../components/Map/Map.mjs";
3
+ import { setMapWorkerUrl } from "../core/map-config.mjs";
4
+ import { affineTransform, boundsOf, cornersOf, georeferencesOf, navPlaceOf, readGeoreference } from "../core/geo.mjs";
5
+ import { hasMapData } from "../core/geo-detect.mjs";
6
+ export {
7
+ CloverMap as Map,
8
+ affineTransform,
9
+ boundsOf,
10
+ cornersOf,
11
+ georeferencesOf,
12
+ hasMapData,
13
+ navPlaceOf,
14
+ readGeoreference,
15
+ setMapWorkerUrl
16
+ };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { createContext, useContext, useRef, useSyncExternalStore } from "react";
3
+ const CloverContext = createContext(null);
4
+ function useOptionalClover() {
5
+ return useContext(CloverContext);
6
+ }
7
+ function useClover(part = "This part") {
8
+ const value = useContext(CloverContext);
9
+ if (!value) {
10
+ throw new Error(`${part} must be rendered inside <Clover.Root>.`);
11
+ }
12
+ return value;
13
+ }
14
+ function useCloverSelector(selector, isEqual = Object.is, part) {
15
+ const { clover } = useClover(part);
16
+ const cache = useRef(null);
17
+ const read = () => {
18
+ const value = selector(clover.store.get());
19
+ if (cache.current && isEqual(cache.current.value, value)) {
20
+ return cache.current.value;
21
+ }
22
+ cache.current = { value };
23
+ return value;
24
+ };
25
+ return useSyncExternalStore(clover.store.subscribe, read, read);
26
+ }
27
+ const NO_STORE = {
28
+ subscribe: () => () => void 0
29
+ };
30
+ function useOptionalCloverSelector(selector, fallback) {
31
+ const context = useContext(CloverContext);
32
+ const store = context == null ? void 0 : context.clover.store;
33
+ const read = () => store ? selector(store.get()) : fallback;
34
+ return useSyncExternalStore(
35
+ store ? store.subscribe : NO_STORE.subscribe,
36
+ read,
37
+ read
38
+ );
39
+ }
40
+ export {
41
+ CloverContext,
42
+ useClover,
43
+ useCloverSelector,
44
+ useOptionalClover,
45
+ useOptionalCloverSelector
46
+ };