@nulib/clover 4.0.0-beta.1 → 4.0.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 (473) 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/BodyAlert.mjs +2 -1
  6. package/dist/components/Body/Caption.mjs +2 -1
  7. package/dist/components/Body/CaptionDetails.mjs +2 -1
  8. package/dist/components/Body/glyphs.mjs +9 -0
  9. package/dist/components/Canvas/AnnotationMenu.mjs +76 -60
  10. package/dist/components/Canvas/AnnotationState.mjs +9 -2
  11. package/dist/components/Canvas/Annotations.mjs +16 -7
  12. package/dist/components/Canvas/CanvasView.mjs +173 -32
  13. package/dist/components/Canvas/ChoiceMenu.mjs +51 -31
  14. package/dist/components/Canvas/Connected.mjs +38 -4
  15. package/dist/components/Canvas/ControlMenu.mjs +6 -4
  16. package/dist/components/Canvas/Controls.mjs +17 -1
  17. package/dist/components/Canvas/FrameAnimation.mjs +568 -167
  18. package/dist/components/Canvas/LoadedCanvas.mjs +5 -3
  19. package/dist/components/Canvas/PlaceBox.mjs +74 -0
  20. package/dist/components/Canvas/Placeholder.mjs +2 -1
  21. package/dist/components/Canvas/fromManifest.mjs +2 -1
  22. package/dist/components/Canvas/layout.mjs +121 -32
  23. package/dist/components/Canvas/media/MediaBody.mjs +32 -6
  24. package/dist/components/Canvas/media/Player.mjs +11 -25
  25. package/dist/components/Canvas/media/Transport.mjs +94 -61
  26. package/dist/components/Canvas/media/TransportButton.mjs +2 -1
  27. package/dist/components/Canvas/media/placeMenu.mjs +19 -0
  28. package/dist/components/Canvas/media/seekGaps.mjs +43 -0
  29. package/dist/components/Canvas/media/sequence.mjs +96 -0
  30. package/dist/components/Canvas/media/useMediaElement.mjs +22 -3
  31. package/dist/components/Collection/Collection.mjs +2 -1
  32. package/dist/components/CollectionSelect/CollectionSelect.mjs +5 -2
  33. package/dist/components/Contents/Contents.mjs +163 -34
  34. package/dist/components/Download/Download.mjs +34 -38
  35. package/dist/components/Download/downloads.mjs +40 -0
  36. package/dist/components/Items/AnnotationItems.mjs +165 -0
  37. package/dist/components/Items/CountMenu.mjs +89 -0
  38. package/dist/components/Items/Item.mjs +24 -17
  39. package/dist/components/Items/Items.mjs +65 -37
  40. package/dist/components/Items/Pager.mjs +39 -79
  41. package/dist/components/Items/PagerLayout.mjs +41 -0
  42. package/dist/components/Items/Position.mjs +103 -0
  43. package/dist/components/Items/StandaloneItems.mjs +12 -4
  44. package/dist/components/Items/TargetItems.mjs +202 -0
  45. package/dist/components/Label/Label.mjs +2 -1
  46. package/dist/components/Map/MapView.mjs +367 -57
  47. package/dist/components/Panel/About.mjs +36 -7
  48. package/dist/components/Panel/AboutActions.mjs +117 -0
  49. package/dist/components/Panel/Panel.mjs +58 -18
  50. package/dist/components/Panel/PartOfManifest.mjs +4 -3
  51. package/dist/components/Panel/ReadingLanguages.mjs +20 -0
  52. package/dist/components/Primitives/Primitives.mjs +18 -3
  53. package/dist/components/Provider/Provider.mjs +19 -5
  54. package/dist/components/Root/Announcer.mjs +3 -2
  55. package/dist/components/Root/Root.mjs +5 -2
  56. package/dist/components/Root/useRootState.mjs +14 -2
  57. package/dist/components/Scene/SceneView.mjs +23 -6
  58. package/dist/components/Search/Search.mjs +3 -2
  59. package/dist/components/Split/Split.mjs +4 -1
  60. package/dist/components/Status/Status.mjs +10 -2
  61. package/dist/components/Timeline/playerSurface.mjs +2 -1
  62. package/dist/components/Transcript/Transcript.mjs +42 -23
  63. package/dist/core/annotation-bodies.mjs +25 -5
  64. package/dist/core/annotation-collection.mjs +3 -2
  65. package/dist/core/annotation-name.mjs +12 -9
  66. package/dist/core/annotation-sets.mjs +139 -10
  67. package/dist/core/annotations-content.mjs +8 -1
  68. package/dist/core/annotations.mjs +8 -1
  69. package/dist/core/choice-key.mjs +5 -0
  70. package/dist/core/clover.mjs +105 -20
  71. package/dist/core/content-state-reader.mjs +33 -2
  72. package/dist/core/dates-format.mjs +30 -0
  73. package/dist/core/dates.mjs +19 -0
  74. package/dist/core/geo.mjs +46 -5
  75. package/dist/core/image-layers.mjs +96 -0
  76. package/dist/core/items.mjs +4 -2
  77. package/dist/core/language-choice.mjs +30 -0
  78. package/dist/core/link.mjs +15 -1
  79. package/dist/core/load.mjs +4 -2
  80. package/dist/core/pages.mjs +20 -1
  81. package/dist/core/presentation.mjs +6 -4
  82. package/dist/core/range-regions.mjs +70 -0
  83. package/dist/core/ranges.mjs +52 -18
  84. package/dist/core/region.mjs +7 -2
  85. package/dist/core/sanitize.mjs +86 -1
  86. package/dist/core/save-file.mjs +33 -0
  87. package/dist/core/selectors.mjs +12 -0
  88. package/dist/core/upgrade.mjs +23 -0
  89. package/dist/core/value.mjs +11 -23
  90. package/dist/hooks/useFullscreenExit.mjs +26 -0
  91. package/dist/hooks/useHighContrast.mjs +27 -0
  92. package/dist/i18n/autonym.mjs +11 -0
  93. package/dist/i18n/config.mjs +3 -8
  94. package/dist/{core → i18n}/direction.mjs +5 -1
  95. package/dist/i18n/languages.mjs +44 -0
  96. package/dist/i18n/locales/en.json.mjs +1 -1
  97. package/dist/i18n/locales/es.json.mjs +1 -1
  98. package/dist/i18n/locales/fi.json.mjs +1 -1
  99. package/dist/i18n/locales/fr.json.mjs +1 -1
  100. package/dist/i18n/locales/nb.json.mjs +1 -1
  101. package/dist/i18n/locales/nn.json.mjs +1 -1
  102. package/dist/i18n/locales/no.json.mjs +1 -1
  103. package/dist/i18n/locales/pt.json.mjs +1 -1
  104. package/dist/{ui → i18n}/useContainerName.mjs +5 -4
  105. package/dist/{react/language.mjs → i18n/useRootLanguage.mjs} +2 -2
  106. package/dist/index.d.mts +393 -53
  107. package/dist/index.mjs +6 -2
  108. package/dist/lib/fullscreen.mjs +6 -1
  109. package/dist/lib/renderer/CanvasRenderer.mjs +28 -5
  110. package/dist/lib/renderer/math/affine.mjs +14 -0
  111. package/dist/lib/renderer/scene/planFrame.mjs +12 -12
  112. package/dist/lib/renderer/scene/regions.mjs +11 -1
  113. package/dist/lib/renderer/scene/sceneItem.mjs +72 -9
  114. package/dist/lib/time.mjs +10 -0
  115. package/dist/map/index.d.mts +26 -4
  116. package/dist/react/fetchManifest.mjs +19 -0
  117. package/dist/react/hooks.mjs +7 -1
  118. package/dist/react/readingLanguages.mjs +16 -0
  119. package/dist/react/usePagesReached.mjs +42 -0
  120. package/dist/styles.css +1 -1
  121. package/dist/templates/default/Default.mjs +87 -9
  122. package/dist/templates/document/Document.mjs +5 -1
  123. package/dist/templates/index.d.mts +21 -3
  124. package/dist/templates.css +1 -1
  125. package/dist/ui/BodyUnloadable.mjs +34 -0
  126. package/dist/ui/Button.mjs +2 -1
  127. package/dist/ui/Chevron.mjs +34 -0
  128. package/dist/ui/ControlCluster.mjs +6 -3
  129. package/dist/ui/EntryThumbnail.mjs +60 -0
  130. package/dist/ui/ExitFullscreen.mjs +2 -1
  131. package/dist/ui/FieldPill.mjs +5 -4
  132. package/dist/ui/HideToggle.mjs +2 -1
  133. package/dist/ui/LanguageChoice.mjs +45 -0
  134. package/dist/ui/ListEnd.mjs +29 -0
  135. package/dist/ui/Markup.mjs +27 -8
  136. package/dist/ui/NavDate.mjs +29 -0
  137. package/dist/ui/ReadMore.mjs +3 -2
  138. package/dist/ui/Sections.mjs +19 -28
  139. package/dist/ui/Steps.mjs +4 -3
  140. package/dist/ui/Tip.mjs +9 -4
  141. package/dist/web-components/About-DhOGPFaI.mjs +1 -0
  142. package/dist/web-components/AnnotationItems-CNP4CJiT.mjs +1 -0
  143. package/dist/web-components/AnnotationMenu-BCwwwfbb.mjs +1 -0
  144. package/dist/web-components/AnnotationState-CavxnAAq.mjs +1 -0
  145. package/dist/web-components/Annotations-DDjSrBL5.mjs +2 -0
  146. package/dist/web-components/Annotations-rBmeI5sR.mjs +1 -0
  147. package/dist/web-components/Body-DaY1UJIy.mjs +1 -0
  148. package/dist/web-components/BodyAlert-COKp19lq.mjs +1 -0
  149. package/dist/web-components/BodyUnloadable-DcTM7hHF.mjs +1 -0
  150. package/dist/web-components/Button-DLFYqtz9.mjs +1 -0
  151. package/dist/web-components/{Camera-cdCqKMup.mjs → Camera-Cp5ma-6C.mjs} +1 -1
  152. package/dist/web-components/{Canvas2DBackend-CnLEHRs4.mjs → Canvas2DBackend-3PToh87Z.mjs} +1 -1
  153. package/dist/web-components/CanvasView-BWQ4SK2b.mjs +2 -0
  154. package/dist/web-components/CaptionDetails-DSziiuQV.mjs +1 -0
  155. package/dist/web-components/Chevron-r-_hUPn8.mjs +1 -0
  156. package/dist/web-components/ChoiceMenu-DTuEEUeM.mjs +1 -0
  157. package/dist/web-components/Collection-B9swJtPW.mjs +1 -0
  158. package/dist/web-components/CollectionSelect-CBWUbqQi.mjs +1 -0
  159. package/dist/web-components/Connected-B2d6EoFl.mjs +1 -0
  160. package/dist/web-components/Connected-BSRM9FJY.mjs +1 -0
  161. package/dist/web-components/Connected-BnpxYeJN.mjs +1 -0
  162. package/dist/web-components/Contents-D7FPxSH-.mjs +1 -0
  163. package/dist/web-components/ControlMenu-Crtho2cs.mjs +1 -0
  164. package/dist/web-components/CountMenu-DyTp_J4k.mjs +1 -0
  165. package/dist/web-components/Cue-CbZaGwZh.mjs +1 -0
  166. package/dist/web-components/Document-BfltLWZZ.mjs +1 -0
  167. package/dist/web-components/DocumentPanel-ZSe40cV4.mjs +1 -0
  168. package/dist/web-components/{DomLayers-BD4QPbl6.mjs → DomLayers-CTGub6wo.mjs} +1 -1
  169. package/dist/web-components/Download-BOYNIb7C.mjs +1 -0
  170. package/dist/web-components/EntryBodies-Bfd2Z42z.mjs +1 -0
  171. package/dist/web-components/EntryThumbnail-DQE8ajI9.mjs +1 -0
  172. package/dist/web-components/FieldPill-D5DNJWLy.mjs +1 -0
  173. package/dist/web-components/FrameAnimation-IfR1czfc.mjs +1 -0
  174. package/dist/web-components/Gallery-DD06BDQo.mjs +1 -0
  175. package/dist/web-components/HideToggle-DL911R1Z.mjs +1 -0
  176. package/dist/web-components/Items-BHzT9A73.mjs +1 -0
  177. package/dist/web-components/Label-KabnxuMN.mjs +1 -0
  178. package/dist/web-components/LanguageChoice-DT1UPiDn.mjs +1 -0
  179. package/dist/web-components/LightboxBody-BhRhdXo6.mjs +1 -0
  180. package/dist/web-components/ListEnd-CbwNlty-.mjs +1 -0
  181. package/dist/web-components/{Loaded-D5xmFRSo.mjs → Loaded-BWfEBJyg.mjs} +1 -1
  182. package/dist/web-components/LoadedCanvas-CdZ5WOWz.mjs +1 -0
  183. package/dist/web-components/LoadedMap-DQyQVRVQ.mjs +1 -0
  184. package/dist/web-components/{Loading-CBKfwsML.mjs → Loading-zw74TdAz.mjs} +1 -1
  185. package/dist/web-components/{Map-Bcgp_R8H.mjs → Map--dJhk0_0.mjs} +1 -1
  186. package/dist/web-components/MapView-duA5WGsu.mjs +3 -0
  187. package/dist/web-components/Markup-D-kioDf9.mjs +2 -0
  188. package/dist/web-components/MediaBody-CoOiVXcv.mjs +1 -0
  189. package/dist/web-components/MediaBody-d8ErTuwT.mjs +1 -0
  190. package/dist/web-components/NavDate-BQHuyLOC.mjs +1 -0
  191. package/dist/web-components/{Navigator-BSJbEbuJ.mjs → Navigator-B3U21_ti.mjs} +1 -1
  192. package/dist/web-components/Pager-DnJknq92.mjs +1 -0
  193. package/dist/web-components/PagerLayout-CvOmKtSW.mjs +1 -0
  194. package/dist/web-components/Panel-CIdjOznL.mjs +1 -0
  195. package/dist/web-components/{PanelToggle-mUDw73zI.mjs → PanelToggle-CFtWIeWv.mjs} +1 -1
  196. package/dist/web-components/PartOfManifest-F87jIrf9.mjs +1 -0
  197. package/dist/web-components/{Pending-BPOQ2z1L.mjs → Pending-CYAQajKu.mjs} +1 -1
  198. package/dist/web-components/PlaceBox-BtIbIotm.mjs +1 -0
  199. package/dist/web-components/Placeholder-TIyj4ZjR.mjs +1 -0
  200. package/dist/web-components/Position-BkWBRBfW.mjs +1 -0
  201. package/dist/web-components/Primitives-BmODPlnK.mjs +1 -0
  202. package/dist/web-components/Provider-C8se8i4I.mjs +1 -0
  203. package/dist/web-components/ReadMore-BwGFsLS2.mjs +1 -0
  204. package/dist/web-components/Root-CAJB0-Mh.mjs +1 -0
  205. package/dist/web-components/Scene-Ctcdt7CD.mjs +1 -0
  206. package/dist/web-components/SceneView-B6bEx_7x.mjs +1 -0
  207. package/dist/web-components/Search-CbmK9vLp.mjs +1 -0
  208. package/dist/web-components/Sections-Dy5_pkyQ.mjs +2 -0
  209. package/dist/web-components/StandaloneItems-BmUnBp0H.mjs +1 -0
  210. package/dist/web-components/Status-Dww3Pyf4.mjs +1 -0
  211. package/dist/web-components/Steps-o_UprQfZ.mjs +1 -0
  212. package/dist/web-components/TargetItems-BBOGDubv.mjs +1 -0
  213. package/dist/web-components/Timeline-CfIF4APc.mjs +1 -0
  214. package/dist/web-components/Tip-BbexILXs.mjs +1 -0
  215. package/dist/web-components/Transcript-ZVXM3ZDA.mjs +1 -0
  216. package/dist/web-components/annotation-collection-7SS1ELcO.mjs +1 -0
  217. package/dist/web-components/annotation-name-CYkZopdd.mjs +1 -0
  218. package/dist/web-components/annotations-content-Bdtn50sf.mjs +1 -0
  219. package/dist/web-components/body-CkOBHlJ0.mjs +1 -0
  220. package/dist/web-components/canvas-CWf_Fag8.mjs +1 -0
  221. package/dist/web-components/choice-key-BUNebLKe.mjs +1 -0
  222. package/dist/web-components/{cloverEngine-B4LinbSt.mjs → cloverEngine-6djEHNCD.mjs} +2 -2
  223. package/dist/web-components/content-state-reader-Ahh6artg.mjs +1 -0
  224. package/dist/web-components/{controls-Dj2BybWb.mjs → controls-BJrZVQkS.mjs} +1 -1
  225. package/dist/web-components/custom-elements.json +109 -13
  226. package/dist/web-components/dates-DR3gfcON.mjs +1 -0
  227. package/dist/web-components/downloads-CqVWo-yn.mjs +1 -0
  228. package/dist/web-components/{engine-BSt8LTso.mjs → engine-B-sscpLa.mjs} +1 -1
  229. package/dist/web-components/{engines-CC0OEsVE.mjs → engines-DfCHjbt3.mjs} +1 -1
  230. package/dist/web-components/es-BYfHUZ7P.mjs +1 -0
  231. package/dist/web-components/fetchManifest-BIzne1Pj.mjs +1 -0
  232. package/dist/web-components/fi-B5y2qr8T.mjs +1 -0
  233. package/dist/web-components/fr-ChezCx6V.mjs +1 -0
  234. package/dist/web-components/fromManifest-gg5Wx14y.mjs +1 -0
  235. package/dist/web-components/glyphs-JYl2STEr.mjs +1 -0
  236. package/dist/web-components/hooks-x7rO95CS.mjs +1 -0
  237. package/dist/web-components/image-layers-BjbeyHBS.mjs +1 -0
  238. package/dist/web-components/{imageService-dsdmcegU.mjs → imageService-0eTvQ-3h.mjs} +1 -1
  239. package/dist/web-components/index-BZ7b9k0N.mjs +1 -0
  240. package/dist/web-components/index.d.mts +95 -10
  241. package/dist/web-components/index.mjs +1 -1
  242. package/dist/web-components/items-CnAIl9fS.mjs +1 -0
  243. package/dist/web-components/items-F6hJgdAS.mjs +1 -0
  244. package/dist/web-components/label-CI88KH2_.mjs +1 -0
  245. package/dist/web-components/layout-De1MOSYe.mjs +1 -0
  246. package/dist/web-components/link-GEdiEwlR.mjs +1 -0
  247. package/dist/web-components/logo-Ckwj7FlP.mjs +1 -0
  248. package/dist/web-components/models-59cEeiAA.mjs +1 -0
  249. package/dist/web-components/nb-8J22f9Td.mjs +1 -0
  250. package/dist/web-components/nn-Dv1EvzI1.mjs +1 -0
  251. package/dist/web-components/no-8J22f9Td.mjs +1 -0
  252. package/dist/web-components/{nodes-B7JRwBgl.mjs → nodes-CTw9OqlA.mjs} +1 -1
  253. package/dist/web-components/{overlayImage-0OgQl1TL.mjs → overlayImage-BMt4UTlR.mjs} +1 -1
  254. package/dist/web-components/{panel-CjXfre-g.mjs → panel-C17Rl9Ya.mjs} +1 -1
  255. package/dist/web-components/part-CXts97_M.mjs +1 -0
  256. package/dist/web-components/playerSurface-HYwEwPK6.mjs +1 -0
  257. package/dist/web-components/presentation-2-C-U79S_T.mjs +1 -0
  258. package/dist/web-components/{provider-C1wKfdjb.mjs → provider-BpxorEiq.mjs} +1 -1
  259. package/dist/web-components/pt-DWYQkATt.mjs +1 -0
  260. package/dist/web-components/range-regions-BGQy4E9U.mjs +1 -0
  261. package/dist/web-components/read-more-BDM_6CVc.mjs +1 -0
  262. package/dist/web-components/readingLanguages-fs_HqvqQ.mjs +1 -0
  263. package/dist/web-components/rendererSurface-C0aKlE0v.mjs +22 -0
  264. package/dist/web-components/{renderers-BMSWEFUR.mjs → renderers-CiB74bQh.mjs} +1 -1
  265. package/dist/web-components/{resource-DLHocQ1C.mjs → resource-CRbpf9pX.mjs} +1 -1
  266. package/dist/web-components/sanitize-qIOeyIww.mjs +3 -0
  267. package/dist/web-components/save-file-CCuZEuQr.mjs +1 -0
  268. package/dist/web-components/search-CkM0O0Z1.mjs +1 -0
  269. package/dist/web-components/sequence-C28xoNmD.mjs +1 -0
  270. package/dist/web-components/shared-MTsMddHx.mjs +1 -0
  271. package/dist/web-components/{show-link-CyzYE1eS.mjs → show-link-BXm7SNIC.mjs} +1 -1
  272. package/dist/web-components/{sizedImage-uv_NlE0l.mjs → sizedImage-k4Q-eyOB.mjs} +1 -1
  273. package/dist/web-components/{split-CYuMjp89.mjs → split-Hp6z-v4h.mjs} +1 -1
  274. package/dist/web-components/{status-Ms5L0ghK.mjs → status-BmtuKfAG.mjs} +1 -1
  275. package/dist/web-components/styles-CZV1nbBQ.mjs +1 -0
  276. package/dist/web-components/three.mjs +1 -1
  277. package/dist/web-components/thumbnail-Dp7a8oom.mjs +1 -0
  278. package/dist/web-components/{tip-dWhupWSr.mjs → tip-C-oovDZK.mjs} +1 -1
  279. package/dist/web-components/{toggle-BQTjR1I3.mjs → toggle-C7ODWDEZ.mjs} +1 -1
  280. package/dist/web-components/upgrade-eNW0DPXq.mjs +1 -0
  281. package/dist/web-components/upgrader-BlbMUEH6.mjs +1 -0
  282. package/dist/web-components/useContainerName-CrOmY-km.mjs +1 -0
  283. package/dist/web-components/useNearViewport-BqXi9Gn4.mjs +1 -0
  284. package/dist/web-components/{useScrollTrack-WbG28FPD.mjs → useScrollTrack-CEsOU2yT.mjs} +1 -1
  285. package/dist/web-components/viewer/AnnotationItems-CyhVcRFc.mjs +1 -0
  286. package/dist/web-components/viewer/AnnotationMenu-DPOSehBo.mjs +1 -0
  287. package/dist/web-components/viewer/AnnotationState-Bjztkobn.mjs +1 -0
  288. package/dist/web-components/viewer/Annotations-Dh_8Tzi0.mjs +2 -0
  289. package/dist/web-components/viewer/Annotations-wwuOCxzI.mjs +1 -0
  290. package/dist/web-components/viewer/{Canvas2DBackend-CAmzJD5P.mjs → Canvas2DBackend-BTK6ZJh0.mjs} +1 -1
  291. package/dist/web-components/viewer/CaptionDetails-BwCTovy_.mjs +1 -0
  292. package/dist/web-components/viewer/ChoiceMenu-DQ1x572Y.mjs +1 -0
  293. package/dist/web-components/viewer/Collection-DSBxCmXw.mjs +1 -0
  294. package/dist/web-components/viewer/Connected-CL3N8F2J.mjs +1 -0
  295. package/dist/web-components/viewer/Connected-DTk1jlyI.mjs +1 -0
  296. package/dist/web-components/viewer/Contents-DrXckx7d.mjs +1 -0
  297. package/dist/web-components/viewer/ControlMenu-Bp91s-g_.mjs +1 -0
  298. package/dist/web-components/viewer/CountMenu-4u6U6yqb.mjs +1 -0
  299. package/dist/web-components/viewer/Cue-C-aF8peC.mjs +1 -0
  300. package/dist/web-components/viewer/Document-BN1rICu3.mjs +1 -0
  301. package/dist/web-components/viewer/DocumentPanel-CEesxdeY.mjs +1 -0
  302. package/dist/web-components/viewer/{DomLayers-DRdQSEtN.mjs → DomLayers-CGkDtemL.mjs} +1 -1
  303. package/dist/web-components/viewer/Download-CawEl9MN.mjs +1 -0
  304. package/dist/web-components/viewer/EntryBodies-nYHMwSSM.mjs +1 -0
  305. package/dist/web-components/viewer/EntryThumbnail-DrO_0SzR.mjs +1 -0
  306. package/dist/web-components/viewer/FieldPill-DFXGWrvB.mjs +1 -0
  307. package/dist/web-components/viewer/FrameAnimation-CZfzpxaD.mjs +1 -0
  308. package/dist/web-components/viewer/Gallery-MWHtvjti.mjs +1 -0
  309. package/dist/web-components/viewer/HideToggle-DP5kHzWM.mjs +1 -0
  310. package/dist/web-components/viewer/LanguageChoice-C50T7dPI.mjs +1 -0
  311. package/dist/web-components/viewer/{LightboxBody-CXMc1xOH.mjs → LightboxBody-C2T7IC29.mjs} +1 -1
  312. package/dist/web-components/viewer/ListEnd-BDuOx__m.mjs +1 -0
  313. package/dist/web-components/viewer/MapView-BN9wXQKV.mjs +3 -0
  314. package/dist/web-components/viewer/MediaBody-CEyswliX.mjs +1 -0
  315. package/dist/web-components/viewer/MediaBody-Dw3DWDjc.mjs +1 -0
  316. package/dist/web-components/viewer/NavDate-C2-wwLuB.mjs +1 -0
  317. package/dist/web-components/viewer/{Navigator-CKwDgG2x.mjs → Navigator-C3jghOd3.mjs} +1 -1
  318. package/dist/web-components/viewer/PagerLayout-Cg2NpqoD.mjs +1 -0
  319. package/dist/web-components/viewer/PartOfManifest-D22yMgCf.mjs +1 -0
  320. package/dist/web-components/viewer/PlaceBox-Dckw4Sfk.mjs +1 -0
  321. package/dist/web-components/viewer/Placeholder-NYVWYg5Q.mjs +1 -0
  322. package/dist/web-components/viewer/Search-DC259m4f.mjs +1 -0
  323. package/dist/web-components/viewer/StandaloneItems-E4kpMne9.mjs +1 -0
  324. package/dist/web-components/viewer/Steps-Bw32X5xO.mjs +1 -0
  325. package/dist/web-components/viewer/TargetItems-DLhUH1Gq.mjs +1 -0
  326. package/dist/web-components/viewer/Transcript-D_VGJQxn.mjs +1 -0
  327. package/dist/web-components/viewer/annotation-collection-DZHa18ir.mjs +1 -0
  328. package/dist/web-components/viewer/annotation-name-BaNdW2Xk.mjs +1 -0
  329. package/dist/web-components/viewer/annotations-content-CbA3eOIC.mjs +1 -0
  330. package/dist/web-components/viewer/{cloverEngine-CynoKdta.mjs → cloverEngine-C04bCSFR.mjs} +2 -2
  331. package/dist/web-components/viewer/content-state-reader-C7UBMOq3.mjs +1 -0
  332. package/dist/web-components/viewer/fetchManifest-C2Yxg3x9.mjs +1 -0
  333. package/dist/web-components/viewer/{host-DlCltI_c.mjs → host-CZeyjCKR.mjs} +1 -1
  334. package/dist/web-components/viewer/image-layers-B09fporZ.mjs +1 -0
  335. package/dist/web-components/viewer/index.mjs +1 -1
  336. package/dist/web-components/viewer/link-DssZ0Z2N.mjs +1 -0
  337. package/dist/web-components/viewer/overlayImage-BR3eJCKq.mjs +1 -0
  338. package/dist/web-components/viewer/range-regions-By6L5JOK.mjs +1 -0
  339. package/dist/web-components/viewer/{renderers-C_wdmw9v.mjs → renderers-DLoqv3QO.mjs} +1 -1
  340. package/dist/web-components/viewer/save-file-CJT5p5Hg.mjs +1 -0
  341. package/dist/web-components/viewer/{search-BHLyNxZ6.mjs → search-PhOwMKHi.mjs} +1 -1
  342. package/dist/web-components/viewer/styles-NZLnZPAC.mjs +1 -0
  343. package/dist/web-components/viewer/viewer-D30YHqyF.mjs +29 -0
  344. package/dist/web-components/viewer/{vtt-XiS_-5Ao.mjs → vtt-1Pk7Dhsj.mjs} +1 -1
  345. package/dist/web-components/viewer-CH7re5OO.mjs +1 -0
  346. package/dist/web-components/{vtt-DYAOuQoK.mjs → vtt-CacHieeN.mjs} +1 -1
  347. package/package.json +8 -4
  348. package/dist/i18n/reader.mjs +0 -13
  349. package/dist/web-components/About-DbrFSVBm.mjs +0 -1
  350. package/dist/web-components/AnnotationMenu-EBjIQpQl.mjs +0 -1
  351. package/dist/web-components/AnnotationState-DQTaO6Gz.mjs +0 -1
  352. package/dist/web-components/Annotations-Cb9U7HJ_.mjs +0 -2
  353. package/dist/web-components/Annotations-Dl0SgHBS.mjs +0 -1
  354. package/dist/web-components/Body-DxSz3iST.mjs +0 -1
  355. package/dist/web-components/BodyAlert-C8EOXz24.mjs +0 -1
  356. package/dist/web-components/Button-uWgfvqsL.mjs +0 -1
  357. package/dist/web-components/CanvasView-BI3YzNdK.mjs +0 -1
  358. package/dist/web-components/CaptionDetails-B80ZhZ7v.mjs +0 -1
  359. package/dist/web-components/ChoiceMenu-DCp7-co7.mjs +0 -1
  360. package/dist/web-components/Collection-B1Le2_TU.mjs +0 -1
  361. package/dist/web-components/CollectionSelect-BL_jQog-.mjs +0 -1
  362. package/dist/web-components/Connected-BxqaRL9o.mjs +0 -1
  363. package/dist/web-components/Connected-DCBI-j9H.mjs +0 -1
  364. package/dist/web-components/Connected-DkhfVWxd.mjs +0 -1
  365. package/dist/web-components/Contents-zYEGHLfe.mjs +0 -1
  366. package/dist/web-components/ControlMenu-CAHiLAtl.mjs +0 -1
  367. package/dist/web-components/Cue-BT2V9VAq.mjs +0 -1
  368. package/dist/web-components/Document-BdCjGnJN.mjs +0 -1
  369. package/dist/web-components/DocumentPanel-X_Rta0Wu.mjs +0 -1
  370. package/dist/web-components/Download-DqU-goFi.mjs +0 -1
  371. package/dist/web-components/EntryBodies-DXAQH0vR.mjs +0 -1
  372. package/dist/web-components/ErrorBoundary-chQaO-Up.mjs +0 -1
  373. package/dist/web-components/FieldPill-CyEssPVm.mjs +0 -1
  374. package/dist/web-components/FrameAnimation-Bb0pOoRl.mjs +0 -1
  375. package/dist/web-components/Gallery-BXU3TcT3.mjs +0 -1
  376. package/dist/web-components/HideToggle-BwMrOBMu.mjs +0 -1
  377. package/dist/web-components/Items-DRj1UEpC.mjs +0 -1
  378. package/dist/web-components/Label-D6aVJB9s.mjs +0 -1
  379. package/dist/web-components/LightboxBody-BzXQGMDn.mjs +0 -1
  380. package/dist/web-components/LoadedCanvas-DOjtxLSe.mjs +0 -1
  381. package/dist/web-components/LoadedMap-DouDS2lO.mjs +0 -1
  382. package/dist/web-components/MapView-CD5zkTs8.mjs +0 -1
  383. package/dist/web-components/Markup-C1hMA8wk.mjs +0 -2
  384. package/dist/web-components/MediaBody-B_Gii4we.mjs +0 -1
  385. package/dist/web-components/MediaBody-BfrKIPte.mjs +0 -1
  386. package/dist/web-components/Pager-Di_2hHM3.mjs +0 -1
  387. package/dist/web-components/Panel-DbsC8A9V.mjs +0 -1
  388. package/dist/web-components/PartOfManifest-7eOwURrF.mjs +0 -1
  389. package/dist/web-components/Primitives-XQO3m1wG.mjs +0 -1
  390. package/dist/web-components/Provider-B61118lU.mjs +0 -1
  391. package/dist/web-components/ReadMore-BJH-qqte.mjs +0 -1
  392. package/dist/web-components/Root-Dj277K6p.mjs +0 -1
  393. package/dist/web-components/Scene-BTWpLeec.mjs +0 -1
  394. package/dist/web-components/SceneView-BYo7WmPt.mjs +0 -1
  395. package/dist/web-components/Search-ZV8FFN4p.mjs +0 -1
  396. package/dist/web-components/Sections-ejwu1_Sm.mjs +0 -2
  397. package/dist/web-components/StandaloneItems-BYaiyCca.mjs +0 -1
  398. package/dist/web-components/Status-YbQK2KzY.mjs +0 -1
  399. package/dist/web-components/Timeline-ByyVSd7B.mjs +0 -1
  400. package/dist/web-components/Tip-IO11xX4x.mjs +0 -1
  401. package/dist/web-components/Transcript-D0gUxUoA.mjs +0 -1
  402. package/dist/web-components/annotation-collection-Csv7WIlm.mjs +0 -1
  403. package/dist/web-components/annotations-content-BS_OFz5Z.mjs +0 -1
  404. package/dist/web-components/body-CKjwwFep.mjs +0 -1
  405. package/dist/web-components/canvas-CIzpp-Uz.mjs +0 -1
  406. package/dist/web-components/content-state-reader-D1BkpICh.mjs +0 -1
  407. package/dist/web-components/es-BwMkoRod.mjs +0 -1
  408. package/dist/web-components/fi-gPFOn9RK.mjs +0 -1
  409. package/dist/web-components/fr-DUHmgdJo.mjs +0 -1
  410. package/dist/web-components/fromManifest-BhemHaoA.mjs +0 -1
  411. package/dist/web-components/glyphs-drROkef9.mjs +0 -1
  412. package/dist/web-components/hooks-BXzQSllm.mjs +0 -1
  413. package/dist/web-components/index-B7nZdqLg.mjs +0 -1
  414. package/dist/web-components/items-CB2Uk7ts.mjs +0 -1
  415. package/dist/web-components/items-jfQ5XzEj.mjs +0 -1
  416. package/dist/web-components/keep-fragments-B5nlv2ck.mjs +0 -1
  417. package/dist/web-components/label-Vbg_cMOJ.mjs +0 -1
  418. package/dist/web-components/layout-mMHI0lsj.mjs +0 -1
  419. package/dist/web-components/link-ZRnv5NFR.mjs +0 -1
  420. package/dist/web-components/logo-Boy6u4m2.mjs +0 -1
  421. package/dist/web-components/models-D1EE_CmH.mjs +0 -1
  422. package/dist/web-components/nb-BSvnQ6jd.mjs +0 -1
  423. package/dist/web-components/nn-Dg2_HdZu.mjs +0 -1
  424. package/dist/web-components/no-BSvnQ6jd.mjs +0 -1
  425. package/dist/web-components/part-cUiPs2-y.mjs +0 -1
  426. package/dist/web-components/playerSurface-CU5XxI1j.mjs +0 -1
  427. package/dist/web-components/pt-B3J80JgO.mjs +0 -1
  428. package/dist/web-components/read-more-DNHNtG-a.mjs +0 -1
  429. package/dist/web-components/rendererSurface-DhIlOjGT.mjs +0 -22
  430. package/dist/web-components/sanitize-Dc7nOsgO.mjs +0 -3
  431. package/dist/web-components/search-CLy2Wj01.mjs +0 -1
  432. package/dist/web-components/shared-YUjOSBKO.mjs +0 -1
  433. package/dist/web-components/styles-CyuM_fB1.mjs +0 -1
  434. package/dist/web-components/thumbnail-c2K_iQsD.mjs +0 -1
  435. package/dist/web-components/time-B9GZoYcm.mjs +0 -1
  436. package/dist/web-components/upgrader-XNxI-5jo.mjs +0 -1
  437. package/dist/web-components/useContainerName-BpJ3IWY0.mjs +0 -1
  438. package/dist/web-components/useNearViewport-CtLyYg9n.mjs +0 -1
  439. package/dist/web-components/viewer/AnnotationMenu-ZKyBeyUU.mjs +0 -1
  440. package/dist/web-components/viewer/AnnotationState-DO33zokc.mjs +0 -1
  441. package/dist/web-components/viewer/Annotations-BOjhr5ks.mjs +0 -1
  442. package/dist/web-components/viewer/Annotations-DkLueFLK.mjs +0 -2
  443. package/dist/web-components/viewer/CaptionDetails-DOJlUtOn.mjs +0 -1
  444. package/dist/web-components/viewer/ChoiceMenu-BDq6H34G.mjs +0 -1
  445. package/dist/web-components/viewer/Collection-By3puO0V.mjs +0 -1
  446. package/dist/web-components/viewer/Connected-DZNO2CPf.mjs +0 -1
  447. package/dist/web-components/viewer/Connected-ESg5y49m.mjs +0 -1
  448. package/dist/web-components/viewer/Contents-B_FqDwTW.mjs +0 -1
  449. package/dist/web-components/viewer/ControlMenu-DdQl-dTf.mjs +0 -1
  450. package/dist/web-components/viewer/Cue-BTRHfiWQ.mjs +0 -1
  451. package/dist/web-components/viewer/Document-B9_PyD2w.mjs +0 -1
  452. package/dist/web-components/viewer/DocumentPanel-CtEJVPoE.mjs +0 -1
  453. package/dist/web-components/viewer/EntryBodies-CJuTRcTq.mjs +0 -1
  454. package/dist/web-components/viewer/FieldPill-06uwrNwE.mjs +0 -1
  455. package/dist/web-components/viewer/FrameAnimation-3dcDHf5q.mjs +0 -1
  456. package/dist/web-components/viewer/Gallery-BYasTqZc.mjs +0 -1
  457. package/dist/web-components/viewer/HideToggle-BxkNMX-T.mjs +0 -1
  458. package/dist/web-components/viewer/MapView-DCerrRRV.mjs +0 -1
  459. package/dist/web-components/viewer/MediaBody-BdkJcyGy.mjs +0 -1
  460. package/dist/web-components/viewer/MediaBody-waF4KvHp.mjs +0 -1
  461. package/dist/web-components/viewer/PartOfManifest-DalHJFwC.mjs +0 -1
  462. package/dist/web-components/viewer/Search-Di_QQfDb.mjs +0 -1
  463. package/dist/web-components/viewer/StandaloneItems-B9J6nnWn.mjs +0 -1
  464. package/dist/web-components/viewer/Transcript-aHOixfna.mjs +0 -1
  465. package/dist/web-components/viewer/annotation-collection-I2UkdobR.mjs +0 -1
  466. package/dist/web-components/viewer/annotations-content-D-i4j9pD.mjs +0 -1
  467. package/dist/web-components/viewer/content-state-reader-D7GIMcKK.mjs +0 -1
  468. package/dist/web-components/viewer/link-BX-wzj1u.mjs +0 -1
  469. package/dist/web-components/viewer/overlayImage-CHqn1fG8.mjs +0 -1
  470. package/dist/web-components/viewer/styles-BRCkEU3w.mjs +0 -1
  471. package/dist/web-components/viewer/viewer-ipqAA-xQ.mjs +0 -28
  472. package/dist/web-components/viewer-DEHIsIHd.mjs +0 -1
  473. /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");
@@ -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, 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,
@@ -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([]);
@@ -493,7 +500,18 @@ class CanvasRenderer {
493
500
  itemRectToWorld(index, rect) {
494
501
  const item = this.items[index];
495
502
  if (!item) return null;
496
- const { contentClip } = item;
503
+ const { contentClip, clip } = item;
504
+ if (item.turn)
505
+ return transformRect(
506
+ compose(
507
+ itemToWorld(item),
508
+ scale(
509
+ clip.width / contentClip.width,
510
+ clip.height / contentClip.height
511
+ )
512
+ ),
513
+ rect
514
+ );
497
515
  const kx = item.rect.width / contentClip.width;
498
516
  const ky = item.rect.height / contentClip.height;
499
517
  return {
@@ -831,6 +849,11 @@ class CanvasRenderer {
831
849
  );
832
850
  (_d = (_c = this.dprQuery).addEventListener) == null ? void 0 : _d.call(_c, "change", this.onPixelRatioChange);
833
851
  }
852
+ setUnloadable(unloadable) {
853
+ if (unloadable === this.unloadable) return;
854
+ this.unloadable = unloadable;
855
+ this.emit("unloadable", unloadable);
856
+ }
834
857
  emit(event, detail) {
835
858
  var _a;
836
859
  (_a = this.listeners.get(event)) == null ? void 0 : _a.forEach((listener) => listener(detail));
@@ -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
+ };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useMemo } from "react";
3
- import { selectAnnotationSets } from "../core/annotation-sets.mjs";
3
+ import { selectAnnotationCollection, selectAnnotationSets } from "../core/annotation-sets.mjs";
4
4
  import { navigationOf } from "../core/clover.mjs";
5
5
  import { selectPosition, selectSequence, selectVisibleCanvases, selectCanvas } from "../core/selectors.mjs";
6
6
  import { localize } from "../core/value.mjs";
@@ -40,6 +40,11 @@ function useNavigation() {
40
40
  [clover, position, total]
41
41
  );
42
42
  }
43
+ function useAnnotationCollection() {
44
+ return useCloverSelector(
45
+ (state) => selectAnnotationCollection(state.manifest, state.addedSets)
46
+ );
47
+ }
43
48
  function useAnnotationSets() {
44
49
  return useCloverSelector(
45
50
  (state) => selectAnnotationSets(state.manifest, state.addedSets)
@@ -57,6 +62,7 @@ function useLangOf() {
57
62
  }
58
63
  export {
59
64
  useActiveCanvas,
65
+ useAnnotationCollection,
60
66
  useAnnotationSets,
61
67
  useLangOf,
62
68
  useLocalized,
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { descriptionLanguages, startingLanguage } from "../core/language-choice.mjs";
4
+ import { useClover, useCloverSelector } from "./context.mjs";
5
+ function useReadingLanguages() {
6
+ const { language, chooseLanguage } = useClover("About");
7
+ const manifest = useCloverSelector(
8
+ (state) => state.manifest
9
+ );
10
+ const languages = useMemo(() => descriptionLanguages(manifest), [manifest]);
11
+ const chosen = startingLanguage(languages, language);
12
+ return chosen && chooseLanguage ? { languages, chosen, onChange: chooseLanguage } : null;
13
+ }
14
+ export {
15
+ useReadingLanguages
16
+ };
@@ -0,0 +1,42 @@
1
+ "use client";
2
+ import { useState, useEffect, useCallback } from "react";
3
+ import { findEntry, selectManifestSets } from "../core/annotation-sets.mjs";
4
+ import { selectVisibleCanvases } from "../core/selectors.mjs";
5
+ import { useClover, useCloverSelector } from "./context.mjs";
6
+ function usePagesReached(pages) {
7
+ const { clover } = useClover("Annotations");
8
+ const pickedPage = useCloverSelector(
9
+ (state) => {
10
+ var _a;
11
+ return state.annotationId ? (_a = findEntry(selectManifestSets(state.manifest), state.annotationId)) == null ? void 0 : _a.setId : void 0;
12
+ }
13
+ );
14
+ const visible = useCloverSelector(
15
+ (state) => selectVisibleCanvases(state.manifest, state.canvasId)
16
+ );
17
+ const [reached, setReached] = useState(0);
18
+ const run = pages.findIndex((page) => !page.fetched);
19
+ const loaded = run === -1 ? pages.length : run;
20
+ const viewPage = pages.reduce(
21
+ (last, page, index) => visible.some((canvas) => canvas.id === page.canvasId) ? index : last,
22
+ -1
23
+ );
24
+ const upTo = Math.max(
25
+ reached,
26
+ pages.findIndex((page) => page.id === pickedPage),
27
+ viewPage,
28
+ 0
29
+ );
30
+ useEffect(() => {
31
+ const missing = pages.slice(0, upTo + 1).filter((page) => !page.fetched).map((page) => page.id);
32
+ if (missing.length) clover.fetchAnnotationPages(missing);
33
+ }, [clover, pages, upTo]);
34
+ const reachNext = useCallback(
35
+ () => setReached((was) => Math.max(was, loaded)),
36
+ [loaded]
37
+ );
38
+ return { loaded, more: loaded < pages.length, reachNext };
39
+ }
40
+ export {
41
+ usePagesReached
42
+ };