@nulib/clover 4.0.0-beta.1 → 4.1.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 (523) hide show
  1. package/README.md +7 -7
  2. package/dist/components/Annotations/Annotations.mjs +165 -204
  3. package/dist/components/Annotations/EntryBodies.mjs +28 -3
  4. package/dist/components/Annotations/languages.mjs +1 -17
  5. package/dist/components/Body/Body.mjs +16 -1
  6. package/dist/components/Body/BodyAlert.mjs +2 -1
  7. package/dist/components/Body/Caption.mjs +2 -1
  8. package/dist/components/Body/CaptionDetails.mjs +2 -1
  9. package/dist/components/Body/glyphs.mjs +24 -0
  10. package/dist/components/Canvas/AnnotationMenu.mjs +76 -60
  11. package/dist/components/Canvas/AnnotationState.mjs +9 -2
  12. package/dist/components/Canvas/Annotations.mjs +16 -7
  13. package/dist/components/Canvas/CanvasView.mjs +287 -42
  14. package/dist/components/Canvas/ChaptersMenu.mjs +105 -0
  15. package/dist/components/Canvas/ChoiceMenu.mjs +51 -31
  16. package/dist/components/Canvas/Connected.mjs +38 -4
  17. package/dist/components/Canvas/ControlMenu.mjs +29 -8
  18. package/dist/components/Canvas/Controls.mjs +227 -48
  19. package/dist/components/Canvas/ControlsFade.mjs +16 -0
  20. package/dist/components/Canvas/FrameAnimation.mjs +568 -167
  21. package/dist/components/Canvas/ImageControls.mjs +209 -0
  22. package/dist/components/Canvas/LoadedCanvas.mjs +5 -3
  23. package/dist/components/Canvas/PlaceBox.mjs +74 -0
  24. package/dist/components/Canvas/Placeholder.mjs +46 -13
  25. package/dist/components/Canvas/RowFits.mjs +85 -0
  26. package/dist/components/Canvas/fromManifest.mjs +2 -1
  27. package/dist/components/Canvas/layout.mjs +132 -32
  28. package/dist/components/Canvas/media/MediaBody.mjs +130 -45
  29. package/dist/components/Canvas/media/Player.mjs +9 -78
  30. package/dist/components/Canvas/media/Transport.mjs +102 -78
  31. package/dist/components/Canvas/media/TransportButton.mjs +2 -1
  32. package/dist/components/Canvas/media/placeMenu.mjs +19 -0
  33. package/dist/components/Canvas/media/seekGaps.mjs +43 -0
  34. package/dist/components/Canvas/media/sequence.mjs +96 -0
  35. package/dist/components/Canvas/media/useMediaElement.mjs +22 -3
  36. package/dist/components/Canvas/panClearOfControls.mjs +1 -1
  37. package/dist/components/Collection/Collection.mjs +3 -2
  38. package/dist/components/CollectionSelect/CollectionSelect.mjs +5 -2
  39. package/dist/components/Contents/Contents.mjs +163 -34
  40. package/dist/components/Download/Download.mjs +34 -38
  41. package/dist/components/Download/downloads.mjs +40 -0
  42. package/dist/components/Items/AnnotationItems.mjs +165 -0
  43. package/dist/components/Items/CountMenu.mjs +90 -0
  44. package/dist/components/Items/Item.mjs +27 -19
  45. package/dist/components/Items/Items.mjs +93 -45
  46. package/dist/components/Items/Pager.mjs +39 -79
  47. package/dist/components/Items/PagerLayout.mjs +43 -0
  48. package/dist/components/Items/Position.mjs +103 -0
  49. package/dist/components/Items/StandaloneItems.mjs +12 -4
  50. package/dist/components/Items/TargetItems.mjs +202 -0
  51. package/dist/components/Items/masonry.mjs +35 -0
  52. package/dist/components/Label/Label.mjs +2 -1
  53. package/dist/components/Map/MapView.mjs +367 -57
  54. package/dist/components/Panel/About.mjs +61 -15
  55. package/dist/components/Panel/AboutActions.mjs +117 -0
  56. package/dist/components/Panel/Panel.mjs +58 -18
  57. package/dist/components/Panel/PartOfManifest.mjs +4 -3
  58. package/dist/components/Panel/ReadingLanguages.mjs +20 -0
  59. package/dist/components/Primitives/Primitives.mjs +18 -3
  60. package/dist/components/Provider/Provider.mjs +19 -5
  61. package/dist/components/Root/Announcer.mjs +3 -2
  62. package/dist/components/Root/Root.mjs +5 -2
  63. package/dist/components/Root/useRootState.mjs +16 -51
  64. package/dist/components/Scene/SceneView.mjs +36 -8
  65. package/dist/components/Scene/cloverEngine.mjs +2 -1
  66. package/dist/components/Search/Search.mjs +3 -2
  67. package/dist/components/Split/Split.mjs +4 -1
  68. package/dist/components/Status/Status.mjs +10 -2
  69. package/dist/components/Timeline/playerSurface.mjs +4 -1
  70. package/dist/components/Transcript/Transcript.mjs +42 -23
  71. package/dist/core/annotation-bodies.mjs +25 -5
  72. package/dist/core/annotation-collection.mjs +3 -2
  73. package/dist/core/annotation-name.mjs +12 -9
  74. package/dist/core/annotation-sets.mjs +139 -10
  75. package/dist/core/annotations-content.mjs +8 -1
  76. package/dist/core/annotations.mjs +8 -1
  77. package/dist/core/choice-key.mjs +5 -0
  78. package/dist/core/clover.mjs +112 -24
  79. package/dist/core/content-state-reader.mjs +33 -2
  80. package/dist/core/content-state.mjs +5 -3
  81. package/dist/core/dates-format.mjs +30 -0
  82. package/dist/core/dates.mjs +19 -0
  83. package/dist/core/geo.mjs +46 -5
  84. package/dist/core/image-layers.mjs +96 -0
  85. package/dist/core/items.mjs +4 -2
  86. package/dist/core/language-choice.mjs +30 -0
  87. package/dist/core/link.mjs +15 -1
  88. package/dist/core/load.mjs +4 -2
  89. package/dist/core/pages.mjs +20 -1
  90. package/dist/core/presentation.mjs +6 -4
  91. package/dist/core/range-regions.mjs +70 -0
  92. package/dist/core/ranges.mjs +52 -18
  93. package/dist/core/region.mjs +7 -2
  94. package/dist/core/sanitize.mjs +86 -1
  95. package/dist/core/save-file.mjs +33 -0
  96. package/dist/core/selectors.mjs +12 -0
  97. package/dist/core/upgrade.mjs +23 -0
  98. package/dist/core/value.mjs +11 -23
  99. package/dist/hooks/useFullscreenExit.mjs +26 -0
  100. package/dist/hooks/useHighContrast.mjs +27 -0
  101. package/dist/i18n/autonym.mjs +11 -0
  102. package/dist/i18n/config.mjs +3 -8
  103. package/dist/{core → i18n}/direction.mjs +5 -1
  104. package/dist/i18n/languages.mjs +44 -0
  105. package/dist/i18n/locales/en.json.mjs +1 -1
  106. package/dist/i18n/locales/es.json.mjs +1 -1
  107. package/dist/i18n/locales/fi.json.mjs +1 -1
  108. package/dist/i18n/locales/fr.json.mjs +1 -1
  109. package/dist/i18n/locales/nb.json.mjs +1 -1
  110. package/dist/i18n/locales/nn.json.mjs +1 -1
  111. package/dist/i18n/locales/no.json.mjs +1 -1
  112. package/dist/i18n/locales/pt.json.mjs +1 -1
  113. package/dist/{ui → i18n}/useContainerName.mjs +5 -4
  114. package/dist/{react/language.mjs → i18n/useRootLanguage.mjs} +2 -2
  115. package/dist/index.d.mts +476 -78
  116. package/dist/index.mjs +6 -2
  117. package/dist/lib/fullscreen.mjs +6 -1
  118. package/dist/lib/gltf/load.mjs +26 -6
  119. package/dist/lib/renderer/CanvasRenderer.mjs +71 -36
  120. package/dist/lib/renderer/camera/Camera.mjs +1 -1
  121. package/dist/lib/renderer/math/affine.mjs +14 -0
  122. package/dist/lib/renderer/scene/planFrame.mjs +12 -12
  123. package/dist/lib/renderer/scene/regions.mjs +11 -1
  124. package/dist/lib/renderer/scene/sceneItem.mjs +72 -9
  125. package/dist/lib/time.mjs +10 -0
  126. package/dist/map/index.d.mts +26 -4
  127. package/dist/react/fetchManifest.mjs +19 -0
  128. package/dist/react/hooks.mjs +7 -1
  129. package/dist/react/readingLanguages.mjs +16 -0
  130. package/dist/react/useContentStateOutput.mjs +71 -0
  131. package/dist/react/usePagesReached.mjs +42 -0
  132. package/dist/styles.css +1 -1
  133. package/dist/templates/default/Default.mjs +122 -135
  134. package/dist/templates/document/Document.mjs +45 -64
  135. package/dist/templates/document/Sheets.mjs +13 -5
  136. package/dist/templates/gallery/Gallery.mjs +90 -18
  137. package/dist/templates/index.d.mts +318 -18
  138. package/dist/templates/shared/Lightbox.mjs +161 -69
  139. package/dist/templates/shared/LightboxView.mjs +118 -0
  140. package/dist/templates/shared/PanelPane.mjs +104 -0
  141. package/dist/templates/{document/DocumentPanel.mjs → shared/PanelPart.mjs} +2 -2
  142. package/dist/templates/shared/dragToClose.mjs +51 -8
  143. package/dist/templates/shared/givenAnnotations.mjs +13 -0
  144. package/dist/templates/shared/useDragToClose.mjs +6 -3
  145. package/dist/templates/shared/useLazyPanelPane.mjs +16 -0
  146. package/dist/templates/shared/useSlide.mjs +6 -0
  147. package/dist/templates.css +1 -1
  148. package/dist/ui/BodyUnloadable.mjs +34 -0
  149. package/dist/ui/Button.mjs +2 -1
  150. package/dist/ui/Chevron.mjs +34 -0
  151. package/dist/ui/ControlCluster.mjs +15 -14
  152. package/dist/ui/EntryThumbnail.mjs +60 -0
  153. package/dist/ui/ExitFullscreen.mjs +2 -1
  154. package/dist/ui/FieldPill.mjs +5 -4
  155. package/dist/ui/HideToggle.mjs +2 -1
  156. package/dist/ui/LanguageChoice.mjs +45 -0
  157. package/dist/ui/ListEnd.mjs +29 -0
  158. package/dist/ui/Markup.mjs +27 -8
  159. package/dist/ui/NavDate.mjs +29 -0
  160. package/dist/ui/ReadMore.mjs +3 -2
  161. package/dist/ui/Sections.mjs +22 -31
  162. package/dist/ui/Steps.mjs +4 -3
  163. package/dist/ui/Tip.mjs +9 -4
  164. package/dist/ui/mediaIcons.mjs +35 -8
  165. package/dist/ui/useScrollTrack.mjs +2 -1
  166. package/dist/web-components/About-DvyvVUK5.mjs +1 -0
  167. package/dist/web-components/AnnotationItems-BpRcSrOM.mjs +1 -0
  168. package/dist/web-components/AnnotationMenu-BDPec3iI.mjs +1 -0
  169. package/dist/web-components/AnnotationState-Chs_37Kk.mjs +1 -0
  170. package/dist/web-components/Annotations-6E-oD_wg.mjs +2 -0
  171. package/dist/web-components/Annotations-CLPEq7Ro.mjs +1 -0
  172. package/dist/web-components/Body-Ct61yxI7.mjs +1 -0
  173. package/dist/web-components/BodyAlert-C_Qh3Up_.mjs +1 -0
  174. package/dist/web-components/Button-L8ZMy5lY.mjs +1 -0
  175. package/dist/web-components/{Camera-cdCqKMup.mjs → Camera-BPyLzZjP.mjs} +1 -1
  176. package/dist/web-components/{Canvas2DBackend-CnLEHRs4.mjs → Canvas2DBackend-8wFavYdl.mjs} +1 -1
  177. package/dist/web-components/CanvasView-2Fj9nT06.mjs +2 -0
  178. package/dist/web-components/CaptionDetails-DuwS-grE.mjs +1 -0
  179. package/dist/web-components/ChaptersMenu-Bj2EqtVJ.mjs +1 -0
  180. package/dist/web-components/Chevron-Cyr_cc9X.mjs +1 -0
  181. package/dist/web-components/ChoiceMenu-ConzybVH.mjs +1 -0
  182. package/dist/web-components/Collection-CLayN8sv.mjs +1 -0
  183. package/dist/web-components/CollectionSelect-D2d8dGJ4.mjs +1 -0
  184. package/dist/web-components/Connected-CBQ6xyhr.mjs +1 -0
  185. package/dist/web-components/Connected-DMXG3imZ.mjs +1 -0
  186. package/dist/web-components/Connected-pyd0EBD3.mjs +1 -0
  187. package/dist/web-components/Contents-tCMXBYDK.mjs +1 -0
  188. package/dist/web-components/ControlMenu-D1zkB0qX.mjs +1 -0
  189. package/dist/web-components/ControlsFade-BNXVTL_Q.mjs +1 -0
  190. package/dist/web-components/CountMenu-Dnzb7lKo.mjs +1 -0
  191. package/dist/web-components/Cue-CUGmPS3k.mjs +1 -0
  192. package/dist/web-components/Document-D-8nalCX.mjs +1 -0
  193. package/dist/web-components/{DomLayers-BD4QPbl6.mjs → DomLayers-BxPU05-D.mjs} +1 -1
  194. package/dist/web-components/Download-Bku9Vptk.mjs +1 -0
  195. package/dist/web-components/EntryBodies-77vDudCb.mjs +1 -0
  196. package/dist/web-components/EntryThumbnail-BxQWKW6e.mjs +1 -0
  197. package/dist/web-components/FieldPill-nFGsaru9.mjs +1 -0
  198. package/dist/web-components/FrameAnimation-BvKiSXcm.mjs +1 -0
  199. package/dist/web-components/Gallery-4Hd58afA.mjs +1 -0
  200. package/dist/web-components/HideToggle-TEhY4TS4.mjs +1 -0
  201. package/dist/web-components/ImageControls-CZO7WoPb.mjs +1 -0
  202. package/dist/web-components/Items-CudZ4Lnb.mjs +1 -0
  203. package/dist/web-components/Label-f07N5Fld.mjs +1 -0
  204. package/dist/web-components/LanguageChoice-B5VM21DV.mjs +1 -0
  205. package/dist/web-components/LightboxView-C4OASmkg.mjs +1 -0
  206. package/dist/web-components/ListEnd-M39M62Cl.mjs +1 -0
  207. package/dist/web-components/{Loaded-D5xmFRSo.mjs → Loaded-oGFyBuos.mjs} +1 -1
  208. package/dist/web-components/LoadedCanvas-IvpSzPO6.mjs +1 -0
  209. package/dist/web-components/LoadedMap-WATGNLxl.mjs +1 -0
  210. package/dist/web-components/{Loading-CBKfwsML.mjs → Loading-YxuKrDAM.mjs} +1 -1
  211. package/dist/web-components/{Map-Bcgp_R8H.mjs → Map-Cw9j3gi3.mjs} +1 -1
  212. package/dist/web-components/MapView-3OxoCr5l.mjs +3 -0
  213. package/dist/web-components/Markup-DW75Jx3j.mjs +2 -0
  214. package/dist/web-components/MediaBody-CLtd0bf0.mjs +1 -0
  215. package/dist/web-components/MediaBody-JnKnoIqY.mjs +1 -0
  216. package/dist/web-components/NavDate-BCCOyycx.mjs +1 -0
  217. package/dist/web-components/{Navigator-BSJbEbuJ.mjs → Navigator-Bx4zS0Yr.mjs} +1 -1
  218. package/dist/web-components/Pager-B9GvQ64b.mjs +1 -0
  219. package/dist/web-components/PagerLayout-BF33VZL_.mjs +1 -0
  220. package/dist/web-components/Panel-BvDpCn6K.mjs +1 -0
  221. package/dist/web-components/PanelPart-Bd4lSUrP.mjs +1 -0
  222. package/dist/web-components/{PanelToggle-mUDw73zI.mjs → PanelToggle-bPcIULGZ.mjs} +1 -1
  223. package/dist/web-components/PartOfManifest-HLg-r00O.mjs +1 -0
  224. package/dist/web-components/{Pending-BPOQ2z1L.mjs → Pending-BxGjjnqq.mjs} +1 -1
  225. package/dist/web-components/PlaceBox-D-Zhe9-U.mjs +1 -0
  226. package/dist/web-components/Placeholder-DzY5hcbk.mjs +1 -0
  227. package/dist/web-components/Position-TYnzcm8e.mjs +1 -0
  228. package/dist/web-components/Primitives-C6VJXxZD.mjs +1 -0
  229. package/dist/web-components/Provider-DyB0wpeO.mjs +1 -0
  230. package/dist/web-components/ReadMore-De_0T7lc.mjs +1 -0
  231. package/dist/web-components/Root-Bt3NNBFb.mjs +1 -0
  232. package/dist/web-components/Scene-DrOM9YlD.mjs +1 -0
  233. package/dist/web-components/SceneView-DA7Yg20p.mjs +1 -0
  234. package/dist/web-components/Search-DgT8OPsK.mjs +1 -0
  235. package/dist/web-components/Sections-d1acn7qm.mjs +2 -0
  236. package/dist/web-components/StandaloneItems-DUb4YKCB.mjs +1 -0
  237. package/dist/web-components/Status-CcU3u6P4.mjs +1 -0
  238. package/dist/web-components/Steps-nlSCzbDQ.mjs +1 -0
  239. package/dist/web-components/TargetItems-BDJM3Ar-.mjs +1 -0
  240. package/dist/web-components/Timeline-BfdN3lIv.mjs +1 -0
  241. package/dist/web-components/Tip-OCB88zwY.mjs +1 -0
  242. package/dist/web-components/Transcript-bSA3cx_K.mjs +1 -0
  243. package/dist/web-components/Transport-DaIhfZqC.mjs +1 -0
  244. package/dist/web-components/Transport-DjOYI-fR.mjs +1 -0
  245. package/dist/web-components/annotation-collection-D8emkElk.mjs +1 -0
  246. package/dist/web-components/annotation-name-DbWjhgra.mjs +1 -0
  247. package/dist/web-components/annotations-content-Bg6aVAGC.mjs +1 -0
  248. package/dist/web-components/body-Ct8dmQdW.mjs +1 -0
  249. package/dist/web-components/canvas-goEZLqEd.mjs +1 -0
  250. package/dist/web-components/choice-key-BUNebLKe.mjs +1 -0
  251. package/dist/web-components/cloverEngine-Df7cMwOP.mjs +164 -0
  252. package/dist/web-components/content-state-reader-CNmBpG1L.mjs +1 -0
  253. package/dist/web-components/{controls-Dj2BybWb.mjs → controls-BZr16sYQ.mjs} +1 -1
  254. package/dist/web-components/custom-elements.json +260 -48
  255. package/dist/web-components/dates-DR3gfcON.mjs +1 -0
  256. package/dist/web-components/downloads-EjJ6Hpip.mjs +1 -0
  257. package/dist/web-components/dragToClose-X9NbZOhA.mjs +1 -0
  258. package/dist/web-components/{engine-BSt8LTso.mjs → engine-DMoc0tff.mjs} +1 -1
  259. package/dist/web-components/{engines-CC0OEsVE.mjs → engines-BmB81VXR.mjs} +1 -1
  260. package/dist/web-components/es-B1NvdYp-.mjs +1 -0
  261. package/dist/web-components/fetchManifest-CwQC6cCh.mjs +1 -0
  262. package/dist/web-components/fi-BjtYZNLo.mjs +1 -0
  263. package/dist/web-components/fr-Cd22Lziw.mjs +1 -0
  264. package/dist/web-components/fromManifest-DrAmY1lB.mjs +1 -0
  265. package/dist/web-components/glyphs-BFK_hvJJ.mjs +1 -0
  266. package/dist/web-components/hooks-BhtNDs_1.mjs +1 -0
  267. package/dist/web-components/image-layers-D2nQC4R-.mjs +1 -0
  268. package/dist/web-components/{imageService-dsdmcegU.mjs → imageService-iFElsopt.mjs} +1 -1
  269. package/dist/web-components/index-FJEpXukG.mjs +1 -0
  270. package/dist/web-components/index.d.mts +99 -14
  271. package/dist/web-components/index.mjs +1 -1
  272. package/dist/web-components/items-BPPrqbeh.mjs +1 -0
  273. package/dist/web-components/items-BnEnc5ot.mjs +1 -0
  274. package/dist/web-components/label-DauFa5sg.mjs +1 -0
  275. package/dist/web-components/layout-Djwu8f4R.mjs +1 -0
  276. package/dist/web-components/link-0lUlTZlw.mjs +1 -0
  277. package/dist/web-components/logo-DWPxaZaG.mjs +1 -0
  278. package/dist/web-components/masonry-0QfzOgbB.mjs +1 -0
  279. package/dist/web-components/models-BF2pqufA.mjs +1 -0
  280. package/dist/web-components/nb-CEwZDBiR.mjs +1 -0
  281. package/dist/web-components/nn-jYQhr9RI.mjs +1 -0
  282. package/dist/web-components/no-CEwZDBiR.mjs +1 -0
  283. package/dist/web-components/{nodes-B7JRwBgl.mjs → nodes-ChQRLDGU.mjs} +1 -1
  284. package/dist/web-components/{overlayImage-0OgQl1TL.mjs → overlayImage-MKrcgDep.mjs} +1 -1
  285. package/dist/web-components/panClearOfControls-Cn2ZXsZi.mjs +1 -0
  286. package/dist/web-components/{panel-CjXfre-g.mjs → panel-C13V6w6E.mjs} +1 -1
  287. package/dist/web-components/part-CekFWrtz.mjs +1 -0
  288. package/dist/web-components/playerSurface-DG1XipTq.mjs +1 -0
  289. package/dist/web-components/pointer-YQppt0at.mjs +1 -0
  290. package/dist/web-components/presentation-2-C-U79S_T.mjs +1 -0
  291. package/dist/web-components/{provider-C1wKfdjb.mjs → provider-DiUkZYiW.mjs} +1 -1
  292. package/dist/web-components/pt-CWR30SzS.mjs +1 -0
  293. package/dist/web-components/range-regions-CqGjyM76.mjs +1 -0
  294. package/dist/web-components/read-more-D8RJYdtQ.mjs +1 -0
  295. package/dist/web-components/readingLanguages-BWOLZK2k.mjs +1 -0
  296. package/dist/web-components/rendererSurface-BkbGDL_Z.mjs +22 -0
  297. package/dist/web-components/{renderers-BMSWEFUR.mjs → renderers-LtRX5pT0.mjs} +1 -1
  298. package/dist/web-components/{resource-DLHocQ1C.mjs → resource-Cfydiy4m.mjs} +1 -1
  299. package/dist/web-components/sanitize-qIOeyIww.mjs +3 -0
  300. package/dist/web-components/save-file-dZyOpXgY.mjs +1 -0
  301. package/dist/web-components/search-BfUZJM3a.mjs +1 -0
  302. package/dist/web-components/sequence-C28xoNmD.mjs +1 -0
  303. package/dist/web-components/shared-DkY2a89G.mjs +1 -0
  304. package/dist/web-components/{show-link-CyzYE1eS.mjs → show-link-DgLJzG7k.mjs} +1 -1
  305. package/dist/web-components/{sizedImage-uv_NlE0l.mjs → sizedImage-NHzhcBYk.mjs} +1 -1
  306. package/dist/web-components/{split-CYuMjp89.mjs → split-CuFiKjin.mjs} +1 -1
  307. package/dist/web-components/{status-Ms5L0ghK.mjs → status-C3etlkhY.mjs} +1 -1
  308. package/dist/web-components/styles-DkkVOSUQ.mjs +1 -0
  309. package/dist/web-components/three.mjs +1 -1
  310. package/dist/web-components/thumbnail-DecrVnpj.mjs +1 -0
  311. package/dist/web-components/{tip-dWhupWSr.mjs → tip-D5YgaIWW.mjs} +1 -1
  312. package/dist/web-components/{toggle-BQTjR1I3.mjs → toggle-CZGB65VZ.mjs} +1 -1
  313. package/dist/web-components/upgrade-eNW0DPXq.mjs +1 -0
  314. package/dist/web-components/upgrader-BlbMUEH6.mjs +1 -0
  315. package/dist/web-components/useContainerName-hKQjEt7a.mjs +1 -0
  316. package/dist/web-components/useControlsVisibility-DPg8uAkW.mjs +1 -0
  317. package/dist/web-components/useLazyPanelPane-eby-OI1V.mjs +1 -0
  318. package/dist/web-components/useNearViewport-CDbHQUBk.mjs +1 -0
  319. package/dist/web-components/useScrollTrack-D9l_P3_B.mjs +1 -0
  320. package/dist/web-components/viewer/AnnotationItems-DtsnDXPM.mjs +1 -0
  321. package/dist/web-components/viewer/AnnotationMenu-C-Mz6CCn.mjs +1 -0
  322. package/dist/web-components/viewer/AnnotationState-5pim5K72.mjs +1 -0
  323. package/dist/web-components/viewer/Annotations-Cqn1TkzD.mjs +2 -0
  324. package/dist/web-components/viewer/Annotations-CxwN9FkB.mjs +1 -0
  325. package/dist/web-components/viewer/{Canvas2DBackend-CAmzJD5P.mjs → Canvas2DBackend-C-ZMSCak.mjs} +1 -1
  326. package/dist/web-components/viewer/CaptionDetails-CRD-gSZP.mjs +1 -0
  327. package/dist/web-components/viewer/ChaptersMenu-Brcq3yJv.mjs +1 -0
  328. package/dist/web-components/viewer/ChoiceMenu-ByGzQQx1.mjs +1 -0
  329. package/dist/web-components/viewer/Collection-m0GCcsfQ.mjs +1 -0
  330. package/dist/web-components/viewer/Connected-Bmc_CdUD.mjs +1 -0
  331. package/dist/web-components/viewer/Connected-Dvx7wtot.mjs +1 -0
  332. package/dist/web-components/viewer/Contents-CwDpfiJY.mjs +1 -0
  333. package/dist/web-components/viewer/ControlMenu-TcO85hDf.mjs +1 -0
  334. package/dist/web-components/viewer/ControlsFade-BoZ4ABAE.mjs +1 -0
  335. package/dist/web-components/viewer/CountMenu-0-ie8kIZ.mjs +1 -0
  336. package/dist/web-components/viewer/Cue-DxmAS9Gx.mjs +1 -0
  337. package/dist/web-components/viewer/Document-BsryuYJ1.mjs +1 -0
  338. package/dist/web-components/viewer/{DomLayers-DRdQSEtN.mjs → DomLayers-hc0qARQc.mjs} +1 -1
  339. package/dist/web-components/viewer/Download-MO-1Rik4.mjs +1 -0
  340. package/dist/web-components/viewer/EntryBodies-g-OEwEsk.mjs +1 -0
  341. package/dist/web-components/viewer/EntryThumbnail-DcIDYATi.mjs +1 -0
  342. package/dist/web-components/viewer/FieldPill-B9S21lxw.mjs +1 -0
  343. package/dist/web-components/viewer/FrameAnimation-qI9cZPEs.mjs +1 -0
  344. package/dist/web-components/viewer/Gallery-BOgUqfqw.mjs +1 -0
  345. package/dist/web-components/viewer/HideToggle-D8wH49mq.mjs +1 -0
  346. package/dist/web-components/viewer/ImageControls-ZoEC9jWd.mjs +1 -0
  347. package/dist/web-components/viewer/LanguageChoice-CRqsCBAp.mjs +1 -0
  348. package/dist/web-components/viewer/LightboxView-BB-GcbYr.mjs +1 -0
  349. package/dist/web-components/viewer/ListEnd-D9Obxie4.mjs +1 -0
  350. package/dist/web-components/viewer/MapView-DQSwUzd7.mjs +3 -0
  351. package/dist/web-components/viewer/MediaBody-CIw2nTlj.mjs +1 -0
  352. package/dist/web-components/viewer/MediaBody-D5ff6xy-.mjs +1 -0
  353. package/dist/web-components/viewer/NavDate-BnfDG57h.mjs +1 -0
  354. package/dist/web-components/viewer/{Navigator-CKwDgG2x.mjs → Navigator-BNwjmkXY.mjs} +1 -1
  355. package/dist/web-components/viewer/PagerLayout-C8jraHqs.mjs +1 -0
  356. package/dist/web-components/viewer/PanelPart-YNbBI9SQ.mjs +1 -0
  357. package/dist/web-components/viewer/PartOfManifest-DX7H0V4g.mjs +1 -0
  358. package/dist/web-components/viewer/PlaceBox-CCWfzsNU.mjs +1 -0
  359. package/dist/web-components/viewer/Placeholder-CsEkLhz7.mjs +1 -0
  360. package/dist/web-components/viewer/Search-CsdYzdq1.mjs +1 -0
  361. package/dist/web-components/viewer/StandaloneItems-BfvBxbUm.mjs +1 -0
  362. package/dist/web-components/viewer/Steps-BH8ZApS4.mjs +1 -0
  363. package/dist/web-components/viewer/TargetItems-BebPFr-c.mjs +1 -0
  364. package/dist/web-components/viewer/Transcript-DXLv5WR9.mjs +1 -0
  365. package/dist/web-components/viewer/Transport-C-fh7Kx2.mjs +1 -0
  366. package/dist/web-components/viewer/Transport-CY6BWfMi.mjs +1 -0
  367. package/dist/web-components/viewer/annotation-collection-Cjd8Dgyl.mjs +1 -0
  368. package/dist/web-components/viewer/annotation-name-CwmgQFia.mjs +1 -0
  369. package/dist/web-components/viewer/annotations-content-BARXoAz-.mjs +1 -0
  370. package/dist/web-components/viewer/cloverEngine-CumnJPKO.mjs +164 -0
  371. package/dist/web-components/viewer/content-state-reader-DuvyLThu.mjs +1 -0
  372. package/dist/web-components/viewer/dragToClose-CFCxhUxn.mjs +1 -0
  373. package/dist/web-components/viewer/fetchManifest-qNB_KgxL.mjs +1 -0
  374. package/dist/web-components/viewer/{host-DlCltI_c.mjs → host-GTHX2fPK.mjs} +1 -1
  375. package/dist/web-components/viewer/image-layers-DKOuaRTj.mjs +1 -0
  376. package/dist/web-components/viewer/index.mjs +1 -1
  377. package/dist/web-components/viewer/link-BlaM0tCa.mjs +1 -0
  378. package/dist/web-components/viewer/overlayImage-RVpv69R5.mjs +1 -0
  379. package/dist/web-components/viewer/range-regions-CIZiAHOp.mjs +1 -0
  380. package/dist/web-components/viewer/{renderers-C_wdmw9v.mjs → renderers-Dw1klwlx.mjs} +1 -1
  381. package/dist/web-components/viewer/save-file-EvzaBEJN.mjs +1 -0
  382. package/dist/web-components/viewer/{search-BHLyNxZ6.mjs → search-x1QL_bth.mjs} +1 -1
  383. package/dist/web-components/viewer/styles-I7_LWFGj.mjs +1 -0
  384. package/dist/web-components/viewer/useControlsVisibility-C_SQHIVR.mjs +1 -0
  385. package/dist/web-components/viewer/useLazyPanelPane-UuGDJrf_.mjs +1 -0
  386. package/dist/web-components/viewer/viewer-DJrQuNs1.mjs +29 -0
  387. package/dist/web-components/viewer/{vtt-XiS_-5Ao.mjs → vtt-C2G89SWH.mjs} +1 -1
  388. package/dist/web-components/viewer-Br44EEba.mjs +1 -0
  389. package/dist/web-components/{vtt-DYAOuQoK.mjs → vtt-Dd0c7psH.mjs} +1 -1
  390. package/package.json +8 -4
  391. package/dist/i18n/reader.mjs +0 -13
  392. package/dist/templates/shared/LightboxBody.mjs +0 -9
  393. package/dist/web-components/About-DbrFSVBm.mjs +0 -1
  394. package/dist/web-components/AnnotationMenu-EBjIQpQl.mjs +0 -1
  395. package/dist/web-components/AnnotationState-DQTaO6Gz.mjs +0 -1
  396. package/dist/web-components/Annotations-Cb9U7HJ_.mjs +0 -2
  397. package/dist/web-components/Annotations-Dl0SgHBS.mjs +0 -1
  398. package/dist/web-components/Body-DxSz3iST.mjs +0 -1
  399. package/dist/web-components/BodyAlert-C8EOXz24.mjs +0 -1
  400. package/dist/web-components/Button-uWgfvqsL.mjs +0 -1
  401. package/dist/web-components/CanvasView-BI3YzNdK.mjs +0 -1
  402. package/dist/web-components/CaptionDetails-B80ZhZ7v.mjs +0 -1
  403. package/dist/web-components/ChoiceMenu-DCp7-co7.mjs +0 -1
  404. package/dist/web-components/Collection-B1Le2_TU.mjs +0 -1
  405. package/dist/web-components/CollectionSelect-BL_jQog-.mjs +0 -1
  406. package/dist/web-components/Connected-BxqaRL9o.mjs +0 -1
  407. package/dist/web-components/Connected-DCBI-j9H.mjs +0 -1
  408. package/dist/web-components/Connected-DkhfVWxd.mjs +0 -1
  409. package/dist/web-components/Contents-zYEGHLfe.mjs +0 -1
  410. package/dist/web-components/ControlMenu-CAHiLAtl.mjs +0 -1
  411. package/dist/web-components/Cue-BT2V9VAq.mjs +0 -1
  412. package/dist/web-components/Document-BdCjGnJN.mjs +0 -1
  413. package/dist/web-components/DocumentPanel-X_Rta0Wu.mjs +0 -1
  414. package/dist/web-components/Download-DqU-goFi.mjs +0 -1
  415. package/dist/web-components/EntryBodies-DXAQH0vR.mjs +0 -1
  416. package/dist/web-components/ErrorBoundary-chQaO-Up.mjs +0 -1
  417. package/dist/web-components/FieldPill-CyEssPVm.mjs +0 -1
  418. package/dist/web-components/FrameAnimation-Bb0pOoRl.mjs +0 -1
  419. package/dist/web-components/Gallery-BXU3TcT3.mjs +0 -1
  420. package/dist/web-components/HideToggle-BwMrOBMu.mjs +0 -1
  421. package/dist/web-components/Items-DRj1UEpC.mjs +0 -1
  422. package/dist/web-components/Label-D6aVJB9s.mjs +0 -1
  423. package/dist/web-components/LightboxBody-BzXQGMDn.mjs +0 -1
  424. package/dist/web-components/LoadedCanvas-DOjtxLSe.mjs +0 -1
  425. package/dist/web-components/LoadedMap-DouDS2lO.mjs +0 -1
  426. package/dist/web-components/MapView-CD5zkTs8.mjs +0 -1
  427. package/dist/web-components/Markup-C1hMA8wk.mjs +0 -2
  428. package/dist/web-components/MediaBody-B_Gii4we.mjs +0 -1
  429. package/dist/web-components/MediaBody-BfrKIPte.mjs +0 -1
  430. package/dist/web-components/Pager-Di_2hHM3.mjs +0 -1
  431. package/dist/web-components/Panel-DbsC8A9V.mjs +0 -1
  432. package/dist/web-components/PartOfManifest-7eOwURrF.mjs +0 -1
  433. package/dist/web-components/Primitives-XQO3m1wG.mjs +0 -1
  434. package/dist/web-components/Provider-B61118lU.mjs +0 -1
  435. package/dist/web-components/ReadMore-BJH-qqte.mjs +0 -1
  436. package/dist/web-components/Root-Dj277K6p.mjs +0 -1
  437. package/dist/web-components/Scene-BTWpLeec.mjs +0 -1
  438. package/dist/web-components/SceneView-BYo7WmPt.mjs +0 -1
  439. package/dist/web-components/Search-ZV8FFN4p.mjs +0 -1
  440. package/dist/web-components/Sections-ejwu1_Sm.mjs +0 -2
  441. package/dist/web-components/StandaloneItems-BYaiyCca.mjs +0 -1
  442. package/dist/web-components/Status-YbQK2KzY.mjs +0 -1
  443. package/dist/web-components/Timeline-ByyVSd7B.mjs +0 -1
  444. package/dist/web-components/Tip-IO11xX4x.mjs +0 -1
  445. package/dist/web-components/Transcript-D0gUxUoA.mjs +0 -1
  446. package/dist/web-components/annotation-collection-Csv7WIlm.mjs +0 -1
  447. package/dist/web-components/annotations-content-BS_OFz5Z.mjs +0 -1
  448. package/dist/web-components/body-CKjwwFep.mjs +0 -1
  449. package/dist/web-components/canvas-CIzpp-Uz.mjs +0 -1
  450. package/dist/web-components/cloverEngine-B4LinbSt.mjs +0 -164
  451. package/dist/web-components/content-state-reader-D1BkpICh.mjs +0 -1
  452. package/dist/web-components/dragToClose-C-Pf1IeO.mjs +0 -1
  453. package/dist/web-components/es-BwMkoRod.mjs +0 -1
  454. package/dist/web-components/fi-gPFOn9RK.mjs +0 -1
  455. package/dist/web-components/fr-DUHmgdJo.mjs +0 -1
  456. package/dist/web-components/fromManifest-BhemHaoA.mjs +0 -1
  457. package/dist/web-components/glyphs-drROkef9.mjs +0 -1
  458. package/dist/web-components/hooks-BXzQSllm.mjs +0 -1
  459. package/dist/web-components/index-B7nZdqLg.mjs +0 -1
  460. package/dist/web-components/items-CB2Uk7ts.mjs +0 -1
  461. package/dist/web-components/items-jfQ5XzEj.mjs +0 -1
  462. package/dist/web-components/keep-fragments-B5nlv2ck.mjs +0 -1
  463. package/dist/web-components/label-Vbg_cMOJ.mjs +0 -1
  464. package/dist/web-components/layout-mMHI0lsj.mjs +0 -1
  465. package/dist/web-components/link-ZRnv5NFR.mjs +0 -1
  466. package/dist/web-components/logo-Boy6u4m2.mjs +0 -1
  467. package/dist/web-components/models-D1EE_CmH.mjs +0 -1
  468. package/dist/web-components/nb-BSvnQ6jd.mjs +0 -1
  469. package/dist/web-components/nn-Dg2_HdZu.mjs +0 -1
  470. package/dist/web-components/no-BSvnQ6jd.mjs +0 -1
  471. package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +0 -1
  472. package/dist/web-components/part-cUiPs2-y.mjs +0 -1
  473. package/dist/web-components/playerSurface-CU5XxI1j.mjs +0 -1
  474. package/dist/web-components/pt-B3J80JgO.mjs +0 -1
  475. package/dist/web-components/read-more-DNHNtG-a.mjs +0 -1
  476. package/dist/web-components/rendererSurface-DhIlOjGT.mjs +0 -22
  477. package/dist/web-components/sanitize-Dc7nOsgO.mjs +0 -3
  478. package/dist/web-components/search-CLy2Wj01.mjs +0 -1
  479. package/dist/web-components/shared-YUjOSBKO.mjs +0 -1
  480. package/dist/web-components/styles-CyuM_fB1.mjs +0 -1
  481. package/dist/web-components/thumbnail-c2K_iQsD.mjs +0 -1
  482. package/dist/web-components/time-B9GZoYcm.mjs +0 -1
  483. package/dist/web-components/upgrader-XNxI-5jo.mjs +0 -1
  484. package/dist/web-components/useContainerName-BpJ3IWY0.mjs +0 -1
  485. package/dist/web-components/useNearViewport-CtLyYg9n.mjs +0 -1
  486. package/dist/web-components/useScrollTrack-WbG28FPD.mjs +0 -1
  487. package/dist/web-components/viewer/AnnotationMenu-ZKyBeyUU.mjs +0 -1
  488. package/dist/web-components/viewer/AnnotationState-DO33zokc.mjs +0 -1
  489. package/dist/web-components/viewer/Annotations-BOjhr5ks.mjs +0 -1
  490. package/dist/web-components/viewer/Annotations-DkLueFLK.mjs +0 -2
  491. package/dist/web-components/viewer/CaptionDetails-DOJlUtOn.mjs +0 -1
  492. package/dist/web-components/viewer/ChoiceMenu-BDq6H34G.mjs +0 -1
  493. package/dist/web-components/viewer/Collection-By3puO0V.mjs +0 -1
  494. package/dist/web-components/viewer/Connected-DZNO2CPf.mjs +0 -1
  495. package/dist/web-components/viewer/Connected-ESg5y49m.mjs +0 -1
  496. package/dist/web-components/viewer/Contents-B_FqDwTW.mjs +0 -1
  497. package/dist/web-components/viewer/ControlMenu-DdQl-dTf.mjs +0 -1
  498. package/dist/web-components/viewer/Cue-BTRHfiWQ.mjs +0 -1
  499. package/dist/web-components/viewer/Document-B9_PyD2w.mjs +0 -1
  500. package/dist/web-components/viewer/DocumentPanel-CtEJVPoE.mjs +0 -1
  501. package/dist/web-components/viewer/EntryBodies-CJuTRcTq.mjs +0 -1
  502. package/dist/web-components/viewer/FieldPill-06uwrNwE.mjs +0 -1
  503. package/dist/web-components/viewer/FrameAnimation-3dcDHf5q.mjs +0 -1
  504. package/dist/web-components/viewer/Gallery-BYasTqZc.mjs +0 -1
  505. package/dist/web-components/viewer/HideToggle-BxkNMX-T.mjs +0 -1
  506. package/dist/web-components/viewer/LightboxBody-CXMc1xOH.mjs +0 -1
  507. package/dist/web-components/viewer/MapView-DCerrRRV.mjs +0 -1
  508. package/dist/web-components/viewer/MediaBody-BdkJcyGy.mjs +0 -1
  509. package/dist/web-components/viewer/MediaBody-waF4KvHp.mjs +0 -1
  510. package/dist/web-components/viewer/PartOfManifest-DalHJFwC.mjs +0 -1
  511. package/dist/web-components/viewer/Search-Di_QQfDb.mjs +0 -1
  512. package/dist/web-components/viewer/StandaloneItems-B9J6nnWn.mjs +0 -1
  513. package/dist/web-components/viewer/Transcript-aHOixfna.mjs +0 -1
  514. package/dist/web-components/viewer/annotation-collection-I2UkdobR.mjs +0 -1
  515. package/dist/web-components/viewer/annotations-content-D-i4j9pD.mjs +0 -1
  516. package/dist/web-components/viewer/cloverEngine-CynoKdta.mjs +0 -164
  517. package/dist/web-components/viewer/content-state-reader-D7GIMcKK.mjs +0 -1
  518. package/dist/web-components/viewer/link-BX-wzj1u.mjs +0 -1
  519. package/dist/web-components/viewer/overlayImage-CHqn1fG8.mjs +0 -1
  520. package/dist/web-components/viewer/styles-BRCkEU3w.mjs +0 -1
  521. package/dist/web-components/viewer/viewer-ipqAA-xQ.mjs +0 -28
  522. package/dist/web-components/viewer-DEHIsIHd.mjs +0 -1
  523. /package/dist/{ui → i18n}/languageCode.mjs +0 -0
package/dist/index.mjs CHANGED
@@ -5,7 +5,8 @@ import { Root } from "./components/Root/Root.mjs";
5
5
  import { Body } from "./components/Body/Body.mjs";
6
6
  import { Label } from "./components/Label/Label.mjs";
7
7
  import { Items } from "./components/Items/Items.mjs";
8
- import { Next, Position, Previous } from "./components/Items/Pager.mjs";
8
+ import { Next, Previous } from "./components/Items/Pager.mjs";
9
+ import { Position } from "./components/Items/Position.mjs";
9
10
  import { Status } from "./components/Status/Status.mjs";
10
11
  import { Homepage, Id, Metadata, PartOf, Rendering, RequiredStatement, Rights, SeeAlso, Summary, Thumbnail, Value } from "./components/Primitives/Primitives.mjs";
11
12
  import { Logo, Provider } from "./components/Provider/Provider.mjs";
@@ -25,7 +26,7 @@ import { CollectionSelect } from "./components/CollectionSelect/CollectionSelect
25
26
  import { PanelToggle } from "./components/Panel/PanelToggle.mjs";
26
27
  import { Timeline } from "./components/Timeline/Timeline.mjs";
27
28
  import { Scene } from "./components/Scene/Scene.mjs";
28
- import { useActiveCanvas, useAnnotationSets, useLangOf, useLocalized, useManifest, useNavigation, useSequence, useStatus, useT, useVisibleCanvases } from "./react/hooks.mjs";
29
+ import { useActiveCanvas, useAnnotationCollection, useAnnotationSets, useLangOf, useLocalized, useManifest, useNavigation, useSequence, useStatus, useT, useVisibleCanvases } from "./react/hooks.mjs";
29
30
  import { useProvider } from "./components/Primitives/resource.mjs";
30
31
  import { visuallyHidden } from "./ui/visuallyHidden.mjs";
31
32
  import { Tip } from "./ui/Tip.mjs";
@@ -39,6 +40,7 @@ import { buildContentState, encodeContentState } from "./core/content-state.mjs"
39
40
  import { decodeContentState } from "./core/content-state-reader.mjs";
40
41
  import { cueAt, parseVtt } from "./core/vtt.mjs";
41
42
  import { chaptersOf, currentContents, tableOfContents } from "./core/ranges.mjs";
43
+ import { CONTENTS_SET_ID } from "./core/annotation-sets.mjs";
42
44
  import { localize } from "./core/value.mjs";
43
45
  import { readAs, toPlainText } from "./core/text.mjs";
44
46
  import { resolveThumbnail, stillSource, thumbnailSource } from "./core/thumbnail.mjs";
@@ -50,6 +52,7 @@ export {
50
52
  Annotations,
51
53
  Body,
52
54
  CLOVER_I18N_NAMESPACE,
55
+ CONTENTS_SET_ID,
53
56
  default2 as Canvas,
54
57
  Collection,
55
58
  CollectionSelect,
@@ -115,6 +118,7 @@ export {
115
118
  toPlainText,
116
119
  toPresentation4,
117
120
  useActiveCanvas,
121
+ useAnnotationCollection,
118
122
  useAnnotationSets,
119
123
  useClover,
120
124
  useCloverSelector,
@@ -9,7 +9,12 @@ const isFullscreenSupported = () => {
9
9
  const doc = document;
10
10
  return Boolean(doc.fullscreenEnabled ?? doc.webkitFullscreenEnabled);
11
11
  };
12
- const getCloverRoot = (from) => from == null ? void 0 : from.closest(".clover-canvas");
12
+ const getCloverRoot = (from) => {
13
+ const root = from == null ? void 0 : from.closest(".clover-root");
14
+ const dialog = from == null ? void 0 : from.closest("dialog");
15
+ if (root && !(dialog && root.contains(dialog))) return root;
16
+ return (from == null ? void 0 : from.closest(".clover-canvas")) ?? null;
17
+ };
13
18
  const enterNativeFullscreen = (video, from) => {
14
19
  if (typeof video.webkitEnterFullscreen !== "function") return;
15
20
  const canvas = from.closest(".clover-canvas");
@@ -37,19 +37,21 @@ async function fetchBytes(uri, base, request) {
37
37
  return response.arrayBuffer();
38
38
  }
39
39
  const loading = /* @__PURE__ */ new WeakMap();
40
- function loadGltf(url, request) {
40
+ function loadGltf(url, request, maxTextureSize) {
41
41
  const run = (request == null ? void 0 : request.fetch) ?? globalThis.fetch;
42
42
  const loads = loading.get(run) ?? /* @__PURE__ */ new Map();
43
43
  loading.set(run, loads);
44
- const key = `${requestKey(request)} ${url}`;
44
+ const key = `${requestKey(request)} ${maxTextureSize ?? ""} ${url}`;
45
45
  let load = loads.get(key);
46
46
  if (!load) {
47
- load = readGltf(url, request).finally(() => loads.delete(key));
47
+ load = readGltf(url, request, maxTextureSize).finally(
48
+ () => loads.delete(key)
49
+ );
48
50
  loads.set(key, load);
49
51
  }
50
52
  return load;
51
53
  }
52
- async function readGltf(url, request) {
54
+ async function readGltf(url, request, maxTextureSize) {
53
55
  const data = await fetchBytes(url, location.href, request);
54
56
  const glb = new DataView(data).getUint32(0, true) === GLB;
55
57
  const { json, bin } = glb ? parseGlb(data) : { json: JSON.parse(new TextDecoder().decode(data)) };
@@ -88,10 +90,15 @@ async function readGltf(url, request) {
88
90
  type: image.mimeType
89
91
  });
90
92
  } else return null;
91
- return await createImageBitmap(blob, {
93
+ const options = {
92
94
  premultiplyAlpha: "none",
93
95
  colorSpaceConversion: "none"
94
- });
96
+ };
97
+ return await fitted(
98
+ await createImageBitmap(blob, options),
99
+ maxTextureSize,
100
+ options
101
+ );
95
102
  } catch {
96
103
  return null;
97
104
  }
@@ -99,6 +106,19 @@ async function readGltf(url, request) {
99
106
  );
100
107
  return { json, buffers, images };
101
108
  }
109
+ async function fitted(bitmap, most, options) {
110
+ const longest = Math.max(bitmap.width, bitmap.height);
111
+ if (!most || longest <= most) return bitmap;
112
+ const ratio = most / longest;
113
+ const resized = await createImageBitmap(bitmap, {
114
+ ...options,
115
+ resizeWidth: Math.max(1, Math.floor(bitmap.width * ratio)),
116
+ resizeHeight: Math.max(1, Math.floor(bitmap.height * ratio)),
117
+ resizeQuality: "high"
118
+ });
119
+ bitmap.close();
120
+ return resized;
121
+ }
102
122
  const COMPONENTS = {
103
123
  SCALAR: 1,
104
124
  VEC2: 2,
@@ -4,7 +4,7 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  import { claimContext, returnContext } from "./backends/contexts.mjs";
6
6
  import { WebGL2Backend } from "./backends/webgl2/WebGL2Backend.mjs";
7
- import { fitCamera, visibleWorldRect, screenPointToWorld, anchoredCenter, worldPointToScreen, sameCamera } from "./camera/Camera.mjs";
7
+ import { fitCamera, anchoredCenter, visibleWorldRect, screenPointToWorld, worldPointToScreen, sameCamera } from "./camera/Camera.mjs";
8
8
  import { CameraAnimator } from "./camera/CameraAnimator.mjs";
9
9
  import { GestureController, DEFAULT_GESTURES } from "./input/GestureController.mjs";
10
10
  import { TileCache } from "./io/TileCache.mjs";
@@ -12,9 +12,9 @@ import { loadImage } from "./io/decode.mjs";
12
12
  import { FrameLoop } from "./loop/FrameLoop.mjs";
13
13
  import { uploadBudget } from "./scene/uploadBudget.mjs";
14
14
  import { apply, compose, rotate, scale } from "./math/affine.mjs";
15
- import { union, clamp } from "./math/rect.mjs";
15
+ import { union, rectCenter, clamp, transformRect } from "./math/rect.mjs";
16
16
  import { planFrame } from "./scene/planFrame.mjs";
17
- import { sameSpec, prepareItem, layoutItems, pixelsToWorld, MEDIA_KEY_PREFIX } from "./scene/sceneItem.mjs";
17
+ import { sameSpec, prepareItem, layoutItems, pixelsToWorld, itemToWorld, MEDIA_KEY_PREFIX } from "./scene/sceneItem.mjs";
18
18
  const DEFAULTS = {
19
19
  maxZoomPixelRatio: 1.1,
20
20
  minZoomImageRatio: 0.9,
@@ -29,15 +29,15 @@ const MAX_CONTEXT_LOSSES = 3;
29
29
  const ANNOTATION_PADDING = 0.1;
30
30
  const ZOOM_EPSILON = 1e-6;
31
31
  const NO_INSET = { top: 0, right: 0, bottom: 0, left: 0 };
32
- function readInset(host) {
33
- if (typeof getComputedStyle !== "function") return NO_INSET;
34
- const style = getComputedStyle(host);
35
- const px = (value) => parseFloat(value) || 0;
32
+ function readInset(element, box = "padding") {
33
+ if (!element || typeof getComputedStyle !== "function") return NO_INSET;
34
+ const style = getComputedStyle(element);
35
+ const px = (side) => parseFloat(style.getPropertyValue(`${box}-${side}`)) || 0;
36
36
  return {
37
- top: px(style.paddingTop),
38
- right: px(style.paddingRight),
39
- bottom: px(style.paddingBottom),
40
- left: px(style.paddingLeft)
37
+ top: px("top"),
38
+ right: px("right"),
39
+ bottom: px("bottom"),
40
+ left: px("left")
41
41
  };
42
42
  }
43
43
  const sameInset = (a, b) => a.top === b.top && a.right === b.right && a.bottom === b.bottom && a.left === b.left;
@@ -98,6 +98,7 @@ class CanvasRenderer {
98
98
  __publicField(this, "lastEmitted", null);
99
99
  __publicField(this, "generation", 0);
100
100
  __publicField(this, "listeners", /* @__PURE__ */ new Map());
101
+ __publicField(this, "unloadable", false);
101
102
  __publicField(this, "resizeObserver", null);
102
103
  __publicField(this, "intersectionObserver", null);
103
104
  __publicField(this, "releaseTimer", null);
@@ -125,9 +126,13 @@ class CanvasRenderer {
125
126
  // Fetch for where the camera lands, not for each view on the way.
126
127
  destination: animating ? this.camera.destination : void 0
127
128
  });
128
- this.cache.update(
129
- plan.wants.filter((want) => !want.url.startsWith(MEDIA_KEY_PREFIX))
129
+ const wants = plan.wants.filter(
130
+ (want) => !want.url.startsWith(MEDIA_KEY_PREFIX)
130
131
  );
132
+ this.cache.update(wants);
133
+ if (plan.draws.length) this.setUnloadable(false);
134
+ else if (wants.length && wants.every((want) => this.cache.failed(want.url)))
135
+ this.setUnloadable(true);
131
136
  this.paint(plan.draws);
132
137
  (_a = this.overlays) == null ? void 0 : _a.position(camera, this.viewport);
133
138
  (_b = this.navigator) == null ? void 0 : _b.render(
@@ -257,6 +262,7 @@ class CanvasRenderer {
257
262
  this.worldBounds = world ? laidOut ? union([world, laidOut]) : world : laidOut;
258
263
  this.contentVersion++;
259
264
  if (errors.length) this.emit("error", errors);
265
+ this.setUnloadable(images.length > 0 && !items.length && errors.length > 0);
260
266
  if (!this.worldBounds) {
261
267
  this.invalidate();
262
268
  return;
@@ -281,6 +287,7 @@ class CanvasRenderer {
281
287
  * scene, framed afresh. A swap within one resource keeps the old scene up instead.
282
288
  */
283
289
  clear() {
290
+ this.setUnloadable(false);
284
291
  this.generation++;
285
292
  this.items = [];
286
293
  this.watchMedia([]);
@@ -322,20 +329,38 @@ class CanvasRenderer {
322
329
  }
323
330
  return true;
324
331
  }
325
- /** Frame `bounds` (world units) in the viewport. */
326
- fitBounds(bounds, immediate = false) {
327
- const target = fitCamera(
328
- bounds,
329
- this.viewport,
330
- this.camera.destination.rotation,
331
- 0
332
- );
332
+ /** Frame `bounds` (world units) in the viewport, or in the part of it `inset` leaves. */
333
+ fitBounds(bounds, immediate = false, inset = NO_INSET) {
334
+ const target = this.fit(bounds, this.camera.destination.rotation, inset);
333
335
  this.atHome = false;
334
336
  this.animateTo(
335
337
  this.constrain(target, { allowBeyondLimits: true }),
336
338
  immediate
337
339
  );
338
340
  }
341
+ /**
342
+ * The camera that frames `bounds`, turned by `rotation`, in the part of the viewport
343
+ * `inset` leaves: centered there, off the viewport's center where its sides differ.
344
+ */
345
+ fit(bounds, rotation, { top, right, bottom, left }) {
346
+ const { width, height } = this.viewport;
347
+ const { zoom } = fitCamera(
348
+ bounds,
349
+ {
350
+ width: Math.max(1, width - left - right),
351
+ height: Math.max(1, height - top - bottom)
352
+ },
353
+ rotation
354
+ );
355
+ const center = anchoredCenter(
356
+ rectCenter(bounds),
357
+ { x: (width + left - right) / 2, y: (height + top - bottom) / 2 },
358
+ zoom,
359
+ rotation,
360
+ this.viewport
361
+ );
362
+ return { ...center, zoom, rotation };
363
+ }
339
364
  /**
340
365
  * Zoom to a rectangle in item `index`'s own coordinates — an annotation's `xywh` — with
341
366
  * OpenSeadragon's padding.
@@ -344,8 +369,12 @@ class CanvasRenderer {
344
369
  const world = this.itemRectToWorld(index, rect);
345
370
  if (world) this.fitAnnotation(world, immediate);
346
371
  }
347
- /** Zoom to a world rectangle with OpenSeadragon's annotation padding. */
372
+ /**
373
+ * Zoom to a world rectangle with OpenSeadragon's annotation padding, clear of the
374
+ * controls over the view (the hotspots' layer's scroll padding, `Annotations.css`).
375
+ */
348
376
  fitAnnotation(world, immediate = false) {
377
+ var _a;
349
378
  const first = this.items[0];
350
379
  if (!first) return;
351
380
  const pad = first.rect.width * ANNOTATION_PADDING;
@@ -356,7 +385,8 @@ class CanvasRenderer {
356
385
  width: world.width + pad * 2,
357
386
  height: world.height + pad * 2
358
387
  },
359
- immediate
388
+ immediate,
389
+ readInset((_a = this.overlays) == null ? void 0 : _a.container, "scroll-padding")
360
390
  );
361
391
  }
362
392
  /** The world rectangle currently visible (its bounding box when rotated). */
@@ -493,7 +523,18 @@ class CanvasRenderer {
493
523
  itemRectToWorld(index, rect) {
494
524
  const item = this.items[index];
495
525
  if (!item) return null;
496
- const { contentClip } = item;
526
+ const { contentClip, clip } = item;
527
+ if (item.turn)
528
+ return transformRect(
529
+ compose(
530
+ itemToWorld(item),
531
+ scale(
532
+ clip.width / contentClip.width,
533
+ clip.height / contentClip.height
534
+ )
535
+ ),
536
+ rect
537
+ );
497
538
  const kx = item.rect.width / contentClip.width;
498
539
  const ky = item.rect.height / contentClip.height;
499
540
  return {
@@ -645,18 +686,7 @@ class CanvasRenderer {
645
686
  if (!this.worldBounds) return null;
646
687
  const turn = 2 * Math.PI;
647
688
  const upright = Math.round(this.camera.destination.rotation / turn) * turn || 0;
648
- const { top, right, bottom, left } = this.inset;
649
- const camera = fitCamera(
650
- this.worldBounds,
651
- {
652
- width: Math.max(1, this.viewport.width - left - right),
653
- height: Math.max(1, this.viewport.height - top - bottom)
654
- },
655
- upright
656
- );
657
- camera.x -= (left - right) / 2 / camera.zoom;
658
- camera.y -= (top - bottom) / 2 / camera.zoom;
659
- return camera;
689
+ return this.fit(this.worldBounds, upright, this.inset);
660
690
  }
661
691
  /**
662
692
  * Keep the camera usable: zoom within limits, and the center over the world so the
@@ -831,6 +861,11 @@ class CanvasRenderer {
831
861
  );
832
862
  (_d = (_c = this.dprQuery).addEventListener) == null ? void 0 : _d.call(_c, "change", this.onPixelRatioChange);
833
863
  }
864
+ setUnloadable(unloadable) {
865
+ if (unloadable === this.unloadable) return;
866
+ this.unloadable = unloadable;
867
+ this.emit("unloadable", unloadable);
868
+ }
834
869
  emit(event, detail) {
835
870
  var _a;
836
871
  (_a = this.listeners.get(event)) == null ? void 0 : _a.forEach((listener) => listener(detail));
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { apply, compose, rotate, translate, scale } from "../math/affine.mjs";
2
+ import { apply, compose, rotate, scale, translate } from "../math/affine.mjs";
3
3
  import { transformRect, rectCenter } from "../math/rect.mjs";
4
4
  function worldToScreen(camera, viewport) {
5
5
  return compose(
@@ -31,6 +31,19 @@ function multiply(m, n) {
31
31
  function compose(...transforms) {
32
32
  return transforms.reduce((acc, t) => multiply(acc, t), IDENTITY);
33
33
  }
34
+ function invert(m) {
35
+ const det = m.a * m.d - m.b * m.c;
36
+ if (!det || !Number.isFinite(det)) return null;
37
+ const inv = 1 / det;
38
+ return {
39
+ a: m.d * inv,
40
+ b: -m.b * inv,
41
+ c: -m.c * inv,
42
+ d: m.a * inv,
43
+ e: (m.c * m.f - m.d * m.e) * inv,
44
+ f: (m.b * m.e - m.a * m.f) * inv
45
+ };
46
+ }
34
47
  function apply(m, p) {
35
48
  return { x: m.a * p.x + m.c * p.y + m.e, y: m.b * p.x + m.d * p.y + m.f };
36
49
  }
@@ -59,6 +72,7 @@ export {
59
72
  IDENTITY,
60
73
  apply,
61
74
  compose,
75
+ invert,
62
76
  multiply,
63
77
  rotate,
64
78
  scale,
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { worldToScreen, visibleWorldRect } from "../camera/Camera.mjs";
3
- import { compose, translate, scale } from "../math/affine.mjs";
3
+ import { compose, scale, translate } from "../math/affine.mjs";
4
4
  import { intersects } from "../math/rect.mjs";
5
- import { pixelsToWorld } from "./sceneItem.mjs";
5
+ import { pixelsToWorld, orientOf, shownPointToPixels, shownToPixels } from "./sceneItem.mjs";
6
6
  import { tilesInRegion, chooseLevel } from "../sources/tilePyramid.mjs";
7
7
  const TARGET_BAND = 1e7;
8
8
  const IN_FLIGHT_BAND = 15e6;
@@ -78,7 +78,7 @@ function planFrame(input) {
78
78
  view,
79
79
  translate(rect.x, rect.y),
80
80
  scale(k.x, k.y),
81
- translate(-clip.x, -clip.y)
81
+ orientOf(item)
82
82
  );
83
83
  for (const level of paintLevels) {
84
84
  const addresses = level === 0 ? coarse : level === target ? fine : tilesInRegion(pyramid, level, area);
@@ -102,7 +102,7 @@ function planFrame(input) {
102
102
  return { draws, wants: dedupeWants(wants), levels };
103
103
  }
104
104
  function itemView(item, camera, viewport, pixelRatio) {
105
- const { pyramid, clip, rect } = item;
105
+ const { pyramid, rect } = item;
106
106
  const visible = visibleWorldRect(camera, viewport);
107
107
  if (!intersects(visible, rect)) return null;
108
108
  const k = pixelsToWorld(item);
@@ -112,16 +112,16 @@ function itemView(item, camera, viewport, pixelRatio) {
112
112
  const y1 = Math.min(visible.y + visible.height, rect.y + rect.height);
113
113
  const imagePerDevice = 1 / (k.x * camera.zoom * pixelRatio);
114
114
  return {
115
- area: {
116
- x: clip.x + (x0 - rect.x) / k.x,
117
- y: clip.y + (y0 - rect.y) / k.y,
115
+ area: shownToPixels(item, {
116
+ x: (x0 - rect.x) / k.x,
117
+ y: (y0 - rect.y) / k.y,
118
118
  width: (x1 - x0) / k.x,
119
119
  height: (y1 - y0) / k.y
120
- },
121
- center: {
122
- x: clip.x + (camera.x - rect.x) / k.x,
123
- y: clip.y + (camera.y - rect.y) / k.y
124
- },
120
+ }),
121
+ center: shownPointToPixels(item, {
122
+ x: (camera.x - rect.x) / k.x,
123
+ y: (camera.y - rect.y) / k.y
124
+ }),
125
125
  target: chooseLevel(pyramid, imagePerDevice)
126
126
  };
127
127
  }
@@ -1,4 +1,13 @@
1
1
  "use client";
2
+ function parseRotation(rotation) {
3
+ const match = /^(!)?(\d+(?:\.\d+)?)$/.exec((rotation == null ? void 0 : rotation.trim()) ?? "");
4
+ if (!match) return null;
5
+ const turned = Number(match[2]);
6
+ if (turned > 360) return null;
7
+ const degrees = turned % 360;
8
+ const mirror = Boolean(match[1]);
9
+ return degrees || mirror ? { degrees, mirror } : null;
10
+ }
2
11
  function parseRegion(region, width, height) {
3
12
  if (!region) return null;
4
13
  let value = region.trim().replace(/^xywh=/, "");
@@ -26,5 +35,6 @@ function parseRegion(region, width, height) {
26
35
  return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
27
36
  }
28
37
  export {
29
- parseRegion
38
+ parseRegion,
39
+ parseRotation
30
40
  };
@@ -1,6 +1,7 @@
1
1
  "use client";
2
- import { union } from "../math/rect.mjs";
3
- import { parseRegion } from "./regions.mjs";
2
+ import { compose, scale, translate, invert, apply } from "../math/affine.mjs";
3
+ import { union, transformRect } from "../math/rect.mjs";
4
+ import { parseRegion, parseRotation } from "./regions.mjs";
4
5
  import { fetchInfo } from "../sources/imageService.mjs";
5
6
  import { servicePyramid, staticPyramid, tilesInRegion } from "../sources/tilePyramid.mjs";
6
7
  async function prepareItem(spec, context) {
@@ -37,6 +38,8 @@ async function prepareItem(spec, context) {
37
38
  width: contentClip.width * toPixelsX,
38
39
  height: contentClip.height * toPixelsY
39
40
  };
41
+ const rotation = parseRotation(spec.rotation);
42
+ const turn = rotation ? turnOf(clip, rotation) : void 0;
40
43
  const item = {
41
44
  id: spec.id,
42
45
  spec,
@@ -44,7 +47,8 @@ async function prepareItem(spec, context) {
44
47
  size,
45
48
  clip,
46
49
  contentClip,
47
- rect: { x: 0, y: 0, width: contentClip.width, height: contentClip.height }
50
+ rect: { x: 0, y: 0, width: contentClip.width, height: contentClip.height },
51
+ ...turn ? { turn } : {}
48
52
  };
49
53
  await context.cache.prefetch(
50
54
  tilesInRegion(pyramid, 0, clip).map((address) => {
@@ -80,35 +84,94 @@ function prepareMedia(spec, media) {
80
84
  rect: { ...clip }
81
85
  };
82
86
  }
87
+ function turnOf(clip, { degrees, mirror }) {
88
+ const radians = degrees * Math.PI / 180;
89
+ const exact = (value) => Math.abs(value) < 1e-12 ? 0 : value;
90
+ const cos = exact(Math.cos(radians));
91
+ const sin = exact(Math.sin(radians));
92
+ const width = Math.abs(clip.width * cos) + Math.abs(clip.height * sin);
93
+ const height = Math.abs(clip.width * sin) + Math.abs(clip.height * cos);
94
+ const orient = compose(
95
+ translate(width / 2, height / 2),
96
+ { a: cos, b: sin, c: -sin, d: cos, e: 0, f: 0 },
97
+ scale(mirror ? -1 : 1, 1),
98
+ translate(-(clip.x + clip.width / 2), -(clip.y + clip.height / 2))
99
+ );
100
+ return { orient, unorient: invert(orient), width, height };
101
+ }
102
+ function orientOf(item) {
103
+ var _a;
104
+ return ((_a = item.turn) == null ? void 0 : _a.orient) ?? translate(-item.clip.x, -item.clip.y);
105
+ }
106
+ function shownToPixels(item, rect) {
107
+ const { turn, clip } = item;
108
+ if (!turn) return { ...rect, x: clip.x + rect.x, y: clip.y + rect.y };
109
+ const box = transformRect(turn.unorient, rect);
110
+ const x = Math.max(box.x, clip.x);
111
+ const y = Math.max(box.y, clip.y);
112
+ return {
113
+ x,
114
+ y,
115
+ width: Math.max(0, Math.min(box.x + box.width, clip.x + clip.width) - x),
116
+ height: Math.max(0, Math.min(box.y + box.height, clip.y + clip.height) - y)
117
+ };
118
+ }
119
+ function shownPointToPixels(item, point) {
120
+ const { turn, clip } = item;
121
+ return turn ? apply(turn.unorient, point) : { x: clip.x + point.x, y: clip.y + point.y };
122
+ }
123
+ function shownContent(item) {
124
+ const { turn, clip, contentClip } = item;
125
+ if (!turn) return contentClip;
126
+ return {
127
+ width: turn.width * contentClip.width / clip.width,
128
+ height: turn.height * contentClip.height / clip.height
129
+ };
130
+ }
83
131
  function layoutItems(items) {
84
132
  if (!items.length) return null;
85
133
  if (items.every((item) => item.spec.placement)) {
86
134
  for (const item of items) item.rect = { ...item.spec.placement };
87
135
  return union(items.map((item) => item.rect));
88
136
  }
89
- const height = items[0].contentClip.height;
137
+ const height = shownContent(items[0]).height;
90
138
  let x = 0;
91
139
  for (const item of items) {
92
- const width = item.contentClip.width * height / item.contentClip.height;
140
+ const shown = shownContent(item);
141
+ const width = shown.width * height / shown.height;
93
142
  item.rect = { x, y: 0, width, height };
94
143
  x += width;
95
144
  }
96
145
  return { x: 0, y: 0, width: x, height };
97
146
  }
98
147
  function pixelsToWorld(item) {
148
+ const shown = item.turn ?? item.clip;
99
149
  return {
100
- x: item.rect.width / item.clip.width,
101
- y: item.rect.height / item.clip.height
150
+ x: item.rect.width / shown.width,
151
+ y: item.rect.height / shown.height
102
152
  };
103
153
  }
154
+ function itemToWorld(item) {
155
+ const k = pixelsToWorld(item);
156
+ return compose(
157
+ translate(item.rect.x, item.rect.y),
158
+ scale(k.x, k.y),
159
+ orientOf(item)
160
+ );
161
+ }
104
162
  function sameSpec(a, b) {
105
163
  var _a, _b;
106
- return a.service === b.service && a.url === b.url && a.width === b.width && a.height === b.height && a.region === b.region && ((_a = a.media) == null ? void 0 : _a.element) === ((_b = b.media) == null ? void 0 : _b.element) && JSON.stringify(a.placement) === JSON.stringify(b.placement);
164
+ return a.service === b.service && a.url === b.url && a.width === b.width && a.height === b.height && a.region === b.region && a.rotation === b.rotation && ((_a = a.media) == null ? void 0 : _a.element) === ((_b = b.media) == null ? void 0 : _b.element) && JSON.stringify(a.placement) === JSON.stringify(b.placement);
107
165
  }
108
166
  export {
109
167
  MEDIA_KEY_PREFIX,
168
+ itemToWorld,
110
169
  layoutItems,
170
+ orientOf,
111
171
  pixelsToWorld,
112
172
  prepareItem,
113
- sameSpec
173
+ sameSpec,
174
+ shownPointToPixels,
175
+ shownToPixels,
176
+ turnOf
114
177
  };
package/dist/lib/time.mjs CHANGED
@@ -15,7 +15,17 @@ function playFrom(element, seconds) {
15
15
  } catch {
16
16
  }
17
17
  }
18
+ function parseTime(t) {
19
+ if (!t) return void 0;
20
+ const [rawStart, rawEnd] = t.split(",");
21
+ const start = Number(rawStart);
22
+ if (rawStart === "" || Number.isNaN(start)) return void 0;
23
+ if (rawEnd === void 0 || rawEnd === "") return { start };
24
+ const end = Number(rawEnd);
25
+ return Number.isNaN(end) ? { start } : { start, end };
26
+ }
18
27
  export {
19
28
  formatTime,
29
+ parseTime,
20
30
  playFrom
21
31
  };
@@ -9,7 +9,8 @@ import React from 'react';
9
9
  * Every resource is upgraded to Presentation 4 on the way in, so no part is written for
10
10
  * several shapes. Presentation 2.1 and 3.0 are upgraded by `@iiif/parser`; Presentation 4
11
11
  * passes through untouched. The upgrader is imported on demand, so it costs nothing until
12
- * the first resource that needs it arrives.
12
+ * the first resource that needs it arrives, and its reader of Presentation 2 only with
13
+ * the first resource in 2.
13
14
  */
14
15
  export type Manifest = P4.Manifest;
15
16
  export type Presentation4Collection = P4.Collection;
@@ -56,6 +57,12 @@ export interface MapFeature {
56
57
  title?: string;
57
58
  titleLang?: string;
58
59
  canvasId?: string;
60
+ /** The annotation it is a body of (Cookbook 0139), which a press on it selects. */
61
+ annotationId?: string;
62
+ /** The Collection's member it locates (Cookbook 0318), which a press on it opens. */
63
+ manifestId?: string;
64
+ /** Its owner's `navDate`, as written, shown with its name (Cookbook 0318). */
65
+ navDate?: string;
59
66
  };
60
67
  }
61
68
  export interface MapFeatureCollection {
@@ -84,10 +91,13 @@ export interface Georeference {
84
91
  }
85
92
  export type Json = Record<string, any>;
86
93
  /**
87
- * Every navPlace feature of the Root's resource: the Collection's, the Manifest's, each
94
+ * Every navPlace feature of the Root's resource: the Collection's, each of its members'
95
+ * (Cookbook 0318: a Collection of Manifests, each where it is), the Manifest's, each
88
96
  * Canvas's, and each loaded annotation's (its `navPlace`, or a GeoJSON body as Cookbook
89
- * 0139 has). A feature from a Canvas or annotation names that Canvas. Memoized on the
90
- * Manifest (and the Collection), so the same collection comes back while nothing changes.
97
+ * 0139 has). A feature from a member names that member, the open one's place its own
98
+ * Manifest's where it gives one, in the member's place in the Collection's order; one
99
+ * from a Canvas or annotation names that Canvas. Memoized on the Manifest (and the
100
+ * Collection), so the same collection comes back while nothing changes.
91
101
  */
92
102
  export declare function navPlaceOf(manifest: Manifest | null, collection?: Presentation4Collection | null, language?: string): MapFeatureCollection;
93
103
  /**
@@ -182,6 +192,18 @@ export interface MapProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSel
182
192
  request?: CloverRequest;
183
193
  /** Standalone: the language to read IIIF text in. */
184
194
  language?: string;
195
+ /**
196
+ * Clover's higher-contrast mode: the accent kept to rings, outlines and marks, and never
197
+ * under words or a glyph, where the controls' dark fill takes its place, edged in the
198
+ * accent. Inside a `Root`, the Root's too; on wherever the reader's system asks for more
199
+ * contrast. Default `false`.
200
+ */
201
+ highContrast?: boolean;
202
+ /**
203
+ * The basemap's credits, behind an ⓘ in the map's lower corner. Default true. A basemap's license
204
+ * may ask for its credits: give them on the page yourself before setting this false.
205
+ */
206
+ credits?: boolean;
185
207
  as?: React.ElementType;
186
208
  }
187
209
  declare const CloverMap: React.ForwardRefExoticComponent<MapProps & React.RefAttributes<HTMLElement>>;
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { loadManifest } from "../core/load.mjs";
3
+ const fetched = /* @__PURE__ */ new WeakMap();
4
+ function fetchManifest(clover, id) {
5
+ let byId = fetched.get(clover);
6
+ if (!byId) fetched.set(clover, byId = /* @__PURE__ */ new Map());
7
+ let manifest = byId.get(id);
8
+ if (!manifest) {
9
+ manifest = loadManifest(
10
+ { id, type: "Manifest" },
11
+ { request: clover.request }
12
+ ).catch(() => null);
13
+ byId.set(id, manifest);
14
+ }
15
+ return manifest;
16
+ }
17
+ export {
18
+ fetchManifest
19
+ };