@nulib/clover 4.0.0-beta.0 → 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 (476) 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 +375 -64
  47. package/dist/components/Map/maplibre-worker.mjs +7 -0
  48. package/dist/components/Map/worker.mjs +22 -0
  49. package/dist/components/Panel/About.mjs +50 -16
  50. package/dist/components/Panel/AboutActions.mjs +117 -0
  51. package/dist/components/Panel/Panel.mjs +58 -18
  52. package/dist/components/Panel/PartOfManifest.mjs +4 -3
  53. package/dist/components/Panel/ReadingLanguages.mjs +20 -0
  54. package/dist/components/Primitives/Primitives.mjs +18 -3
  55. package/dist/components/Provider/Provider.mjs +19 -5
  56. package/dist/components/Root/Announcer.mjs +3 -2
  57. package/dist/components/Root/Root.mjs +5 -2
  58. package/dist/components/Root/useRootState.mjs +14 -2
  59. package/dist/components/Scene/SceneView.mjs +23 -6
  60. package/dist/components/Search/Search.mjs +3 -2
  61. package/dist/components/Split/Split.mjs +13 -3
  62. package/dist/components/Status/Status.mjs +10 -2
  63. package/dist/components/Timeline/playerSurface.mjs +2 -1
  64. package/dist/components/Transcript/Transcript.mjs +42 -23
  65. package/dist/core/annotation-bodies.mjs +25 -5
  66. package/dist/core/annotation-collection.mjs +3 -2
  67. package/dist/core/annotation-name.mjs +12 -9
  68. package/dist/core/annotation-sets.mjs +139 -10
  69. package/dist/core/annotations-content.mjs +8 -1
  70. package/dist/core/annotations.mjs +8 -1
  71. package/dist/core/choice-key.mjs +5 -0
  72. package/dist/core/clover.mjs +105 -20
  73. package/dist/core/content-state-reader.mjs +33 -2
  74. package/dist/core/dates-format.mjs +30 -0
  75. package/dist/core/dates.mjs +19 -0
  76. package/dist/core/geo.mjs +46 -5
  77. package/dist/core/image-layers.mjs +96 -0
  78. package/dist/core/items.mjs +7 -3
  79. package/dist/core/language-choice.mjs +30 -0
  80. package/dist/core/link.mjs +15 -1
  81. package/dist/core/load.mjs +14 -5
  82. package/dist/core/pages.mjs +20 -1
  83. package/dist/core/presentation.mjs +6 -4
  84. package/dist/core/range-regions.mjs +70 -0
  85. package/dist/core/ranges.mjs +52 -18
  86. package/dist/core/region.mjs +7 -2
  87. package/dist/core/sanitize.mjs +86 -1
  88. package/dist/core/save-file.mjs +33 -0
  89. package/dist/core/selectors.mjs +12 -0
  90. package/dist/core/upgrade.mjs +23 -0
  91. package/dist/core/value.mjs +11 -23
  92. package/dist/hooks/useFullscreenExit.mjs +26 -0
  93. package/dist/hooks/useHighContrast.mjs +27 -0
  94. package/dist/i18n/autonym.mjs +11 -0
  95. package/dist/i18n/config.mjs +3 -8
  96. package/dist/{core → i18n}/direction.mjs +5 -1
  97. package/dist/i18n/languages.mjs +44 -0
  98. package/dist/i18n/locales/en.json.mjs +1 -1
  99. package/dist/i18n/locales/es.json.mjs +1 -1
  100. package/dist/i18n/locales/fi.json.mjs +1 -1
  101. package/dist/i18n/locales/fr.json.mjs +1 -1
  102. package/dist/i18n/locales/nb.json.mjs +1 -1
  103. package/dist/i18n/locales/nn.json.mjs +1 -1
  104. package/dist/i18n/locales/no.json.mjs +1 -1
  105. package/dist/i18n/locales/pt.json.mjs +1 -1
  106. package/dist/{ui → i18n}/useContainerName.mjs +5 -4
  107. package/dist/{react/language.mjs → i18n/useRootLanguage.mjs} +2 -2
  108. package/dist/index.d.mts +415 -64
  109. package/dist/index.mjs +6 -2
  110. package/dist/lib/fullscreen.mjs +6 -1
  111. package/dist/lib/renderer/CanvasRenderer.mjs +28 -5
  112. package/dist/lib/renderer/math/affine.mjs +14 -0
  113. package/dist/lib/renderer/scene/planFrame.mjs +12 -12
  114. package/dist/lib/renderer/scene/regions.mjs +11 -1
  115. package/dist/lib/renderer/scene/sceneItem.mjs +72 -9
  116. package/dist/lib/time.mjs +10 -0
  117. package/dist/map/index.d.mts +40 -7
  118. package/dist/react/fetchManifest.mjs +19 -0
  119. package/dist/react/hooks.mjs +7 -1
  120. package/dist/react/readingLanguages.mjs +16 -0
  121. package/dist/react/usePagesReached.mjs +42 -0
  122. package/dist/styles.css +1 -1
  123. package/dist/templates/default/Default.mjs +87 -9
  124. package/dist/templates/document/Document.mjs +5 -1
  125. package/dist/templates/index.d.mts +26 -5
  126. package/dist/templates.css +1 -1
  127. package/dist/ui/BodyUnloadable.mjs +34 -0
  128. package/dist/ui/Button.mjs +2 -1
  129. package/dist/ui/Chevron.mjs +34 -0
  130. package/dist/ui/ControlCluster.mjs +6 -3
  131. package/dist/ui/EntryThumbnail.mjs +60 -0
  132. package/dist/ui/ExitFullscreen.mjs +2 -1
  133. package/dist/ui/FieldPill.mjs +5 -4
  134. package/dist/ui/HideToggle.mjs +2 -1
  135. package/dist/ui/LanguageChoice.mjs +45 -0
  136. package/dist/ui/ListEnd.mjs +29 -0
  137. package/dist/ui/Markup.mjs +27 -8
  138. package/dist/ui/NavDate.mjs +29 -0
  139. package/dist/ui/ReadMore.mjs +4 -3
  140. package/dist/ui/Sections.mjs +19 -28
  141. package/dist/ui/Steps.mjs +4 -3
  142. package/dist/ui/Tip.mjs +9 -4
  143. package/dist/web-components/About-DhOGPFaI.mjs +1 -0
  144. package/dist/web-components/AnnotationItems-CNP4CJiT.mjs +1 -0
  145. package/dist/web-components/AnnotationMenu-BCwwwfbb.mjs +1 -0
  146. package/dist/web-components/AnnotationState-CavxnAAq.mjs +1 -0
  147. package/dist/web-components/Annotations-DDjSrBL5.mjs +2 -0
  148. package/dist/web-components/Annotations-rBmeI5sR.mjs +1 -0
  149. package/dist/web-components/Body-DaY1UJIy.mjs +1 -0
  150. package/dist/web-components/BodyAlert-COKp19lq.mjs +1 -0
  151. package/dist/web-components/BodyUnloadable-DcTM7hHF.mjs +1 -0
  152. package/dist/web-components/Button-DLFYqtz9.mjs +1 -0
  153. package/dist/web-components/{Camera-Dw51CAfF.mjs → Camera-Cp5ma-6C.mjs} +1 -1
  154. package/dist/web-components/{Canvas2DBackend-RRN2bEkc.mjs → Canvas2DBackend-3PToh87Z.mjs} +1 -1
  155. package/dist/web-components/CanvasView-BWQ4SK2b.mjs +2 -0
  156. package/dist/web-components/CaptionDetails-DSziiuQV.mjs +1 -0
  157. package/dist/web-components/Chevron-r-_hUPn8.mjs +1 -0
  158. package/dist/web-components/ChoiceMenu-DTuEEUeM.mjs +1 -0
  159. package/dist/web-components/Collection-B9swJtPW.mjs +1 -0
  160. package/dist/web-components/CollectionSelect-CBWUbqQi.mjs +1 -0
  161. package/dist/web-components/Connected-B2d6EoFl.mjs +1 -0
  162. package/dist/web-components/Connected-BSRM9FJY.mjs +1 -0
  163. package/dist/web-components/Connected-BnpxYeJN.mjs +1 -0
  164. package/dist/web-components/Contents-D7FPxSH-.mjs +1 -0
  165. package/dist/web-components/ControlMenu-Crtho2cs.mjs +1 -0
  166. package/dist/web-components/CountMenu-DyTp_J4k.mjs +1 -0
  167. package/dist/web-components/Cue-CbZaGwZh.mjs +1 -0
  168. package/dist/web-components/Document-BfltLWZZ.mjs +1 -0
  169. package/dist/web-components/DocumentPanel-ZSe40cV4.mjs +1 -0
  170. package/dist/web-components/{DomLayers-BsR2AOy-.mjs → DomLayers-CTGub6wo.mjs} +1 -1
  171. package/dist/web-components/Download-BOYNIb7C.mjs +1 -0
  172. package/dist/web-components/EntryBodies-Bfd2Z42z.mjs +1 -0
  173. package/dist/web-components/EntryThumbnail-DQE8ajI9.mjs +1 -0
  174. package/dist/web-components/FieldPill-D5DNJWLy.mjs +1 -0
  175. package/dist/web-components/FrameAnimation-IfR1czfc.mjs +1 -0
  176. package/dist/web-components/Gallery-DD06BDQo.mjs +1 -0
  177. package/dist/web-components/HideToggle-DL911R1Z.mjs +1 -0
  178. package/dist/web-components/Items-BHzT9A73.mjs +1 -0
  179. package/dist/web-components/Label-KabnxuMN.mjs +1 -0
  180. package/dist/web-components/LanguageChoice-DT1UPiDn.mjs +1 -0
  181. package/dist/web-components/LightboxBody-BhRhdXo6.mjs +1 -0
  182. package/dist/web-components/ListEnd-CbwNlty-.mjs +1 -0
  183. package/dist/web-components/{Loaded-wQurAeJz.mjs → Loaded-BWfEBJyg.mjs} +1 -1
  184. package/dist/web-components/LoadedCanvas-CdZ5WOWz.mjs +1 -0
  185. package/dist/web-components/LoadedMap-DQyQVRVQ.mjs +1 -0
  186. package/dist/web-components/{Loading-BmA--pzr.mjs → Loading-zw74TdAz.mjs} +1 -1
  187. package/dist/web-components/{Map-DzVGblIS.mjs → Map--dJhk0_0.mjs} +1 -1
  188. package/dist/web-components/MapView-duA5WGsu.mjs +3 -0
  189. package/dist/web-components/Markup-D-kioDf9.mjs +2 -0
  190. package/dist/web-components/MediaBody-CoOiVXcv.mjs +1 -0
  191. package/dist/web-components/MediaBody-d8ErTuwT.mjs +1 -0
  192. package/dist/web-components/NavDate-BQHuyLOC.mjs +1 -0
  193. package/dist/web-components/{Navigator-CIJFA3q1.mjs → Navigator-B3U21_ti.mjs} +1 -1
  194. package/dist/web-components/Pager-DnJknq92.mjs +1 -0
  195. package/dist/web-components/PagerLayout-CvOmKtSW.mjs +1 -0
  196. package/dist/web-components/Panel-CIdjOznL.mjs +1 -0
  197. package/dist/web-components/{PanelToggle-BYjV2t1j.mjs → PanelToggle-CFtWIeWv.mjs} +1 -1
  198. package/dist/web-components/PartOfManifest-F87jIrf9.mjs +1 -0
  199. package/dist/web-components/{Pending-BspZajh5.mjs → Pending-CYAQajKu.mjs} +1 -1
  200. package/dist/web-components/PlaceBox-BtIbIotm.mjs +1 -0
  201. package/dist/web-components/Placeholder-TIyj4ZjR.mjs +1 -0
  202. package/dist/web-components/Position-BkWBRBfW.mjs +1 -0
  203. package/dist/web-components/Primitives-BmODPlnK.mjs +1 -0
  204. package/dist/web-components/Provider-C8se8i4I.mjs +1 -0
  205. package/dist/web-components/ReadMore-BwGFsLS2.mjs +1 -0
  206. package/dist/web-components/Root-CAJB0-Mh.mjs +1 -0
  207. package/dist/web-components/Scene-Ctcdt7CD.mjs +1 -0
  208. package/dist/web-components/SceneView-B6bEx_7x.mjs +1 -0
  209. package/dist/web-components/Search-CbmK9vLp.mjs +1 -0
  210. package/dist/web-components/Sections-Dy5_pkyQ.mjs +2 -0
  211. package/dist/web-components/StandaloneItems-BmUnBp0H.mjs +1 -0
  212. package/dist/web-components/Status-Dww3Pyf4.mjs +1 -0
  213. package/dist/web-components/Steps-o_UprQfZ.mjs +1 -0
  214. package/dist/web-components/TargetItems-BBOGDubv.mjs +1 -0
  215. package/dist/web-components/Timeline-CfIF4APc.mjs +1 -0
  216. package/dist/web-components/Tip-BbexILXs.mjs +1 -0
  217. package/dist/web-components/Transcript-ZVXM3ZDA.mjs +1 -0
  218. package/dist/web-components/annotation-collection-7SS1ELcO.mjs +1 -0
  219. package/dist/web-components/annotation-name-CYkZopdd.mjs +1 -0
  220. package/dist/web-components/annotations-content-Bdtn50sf.mjs +1 -0
  221. package/dist/web-components/body-CkOBHlJ0.mjs +1 -0
  222. package/dist/web-components/canvas-CWf_Fag8.mjs +1 -0
  223. package/dist/web-components/choice-key-BUNebLKe.mjs +1 -0
  224. package/dist/web-components/{cloverEngine-Dbv-26NP.mjs → cloverEngine-6djEHNCD.mjs} +2 -2
  225. package/dist/web-components/content-state-reader-Ahh6artg.mjs +1 -0
  226. package/dist/web-components/{controls-qRYf2jO2.mjs → controls-BJrZVQkS.mjs} +1 -1
  227. package/dist/web-components/custom-elements.json +109 -13
  228. package/dist/web-components/dates-DR3gfcON.mjs +1 -0
  229. package/dist/web-components/downloads-CqVWo-yn.mjs +1 -0
  230. package/dist/web-components/{engine-D8JLgzqq.mjs → engine-B-sscpLa.mjs} +1 -1
  231. package/dist/web-components/{engines-BwVb9R_A.mjs → engines-DfCHjbt3.mjs} +1 -1
  232. package/dist/web-components/es-BYfHUZ7P.mjs +1 -0
  233. package/dist/web-components/fetchManifest-BIzne1Pj.mjs +1 -0
  234. package/dist/web-components/fi-B5y2qr8T.mjs +1 -0
  235. package/dist/web-components/fr-ChezCx6V.mjs +1 -0
  236. package/dist/web-components/fromManifest-gg5Wx14y.mjs +1 -0
  237. package/dist/web-components/glyphs-JYl2STEr.mjs +1 -0
  238. package/dist/web-components/hooks-x7rO95CS.mjs +1 -0
  239. package/dist/web-components/image-layers-BjbeyHBS.mjs +1 -0
  240. package/dist/web-components/{imageService-C3yg9DxB.mjs → imageService-0eTvQ-3h.mjs} +1 -1
  241. package/dist/web-components/index-BZ7b9k0N.mjs +1 -0
  242. package/dist/web-components/index.d.mts +95 -10
  243. package/dist/web-components/index.mjs +1 -1
  244. package/dist/web-components/items-CnAIl9fS.mjs +1 -0
  245. package/dist/web-components/items-F6hJgdAS.mjs +1 -0
  246. package/dist/web-components/label-CI88KH2_.mjs +1 -0
  247. package/dist/web-components/layout-De1MOSYe.mjs +1 -0
  248. package/dist/web-components/link-GEdiEwlR.mjs +1 -0
  249. package/dist/web-components/logo-Ckwj7FlP.mjs +1 -0
  250. package/dist/web-components/models-59cEeiAA.mjs +1 -0
  251. package/dist/web-components/nb-8J22f9Td.mjs +1 -0
  252. package/dist/web-components/nn-Dv1EvzI1.mjs +1 -0
  253. package/dist/web-components/no-8J22f9Td.mjs +1 -0
  254. package/dist/web-components/{nodes-Bf-Fb7e5.mjs → nodes-CTw9OqlA.mjs} +1 -1
  255. package/dist/web-components/{overlayImage-DdPs2EGY.mjs → overlayImage-BMt4UTlR.mjs} +1 -1
  256. package/dist/web-components/{panel-CiqEFDzv.mjs → panel-C17Rl9Ya.mjs} +1 -1
  257. package/dist/web-components/part-CXts97_M.mjs +1 -0
  258. package/dist/web-components/playerSurface-HYwEwPK6.mjs +1 -0
  259. package/dist/web-components/presentation-2-C-U79S_T.mjs +1 -0
  260. package/dist/web-components/{provider-LUmAQSoP.mjs → provider-BpxorEiq.mjs} +1 -1
  261. package/dist/web-components/pt-DWYQkATt.mjs +1 -0
  262. package/dist/web-components/range-regions-BGQy4E9U.mjs +1 -0
  263. package/dist/web-components/read-more-BDM_6CVc.mjs +1 -0
  264. package/dist/web-components/readingLanguages-fs_HqvqQ.mjs +1 -0
  265. package/dist/web-components/rendererSurface-C0aKlE0v.mjs +22 -0
  266. package/dist/web-components/{renderers-Bg4QqawN.mjs → renderers-CiB74bQh.mjs} +1 -1
  267. package/dist/web-components/{resource-DzIvB_4m.mjs → resource-CRbpf9pX.mjs} +1 -1
  268. package/dist/web-components/sanitize-qIOeyIww.mjs +3 -0
  269. package/dist/web-components/save-file-CCuZEuQr.mjs +1 -0
  270. package/dist/web-components/search-CkM0O0Z1.mjs +1 -0
  271. package/dist/web-components/sequence-C28xoNmD.mjs +1 -0
  272. package/dist/web-components/shared-MTsMddHx.mjs +1 -0
  273. package/dist/web-components/{show-link-DWRRXSBy.mjs → show-link-BXm7SNIC.mjs} +1 -1
  274. package/dist/web-components/{sizedImage-DfjlV2-i.mjs → sizedImage-k4Q-eyOB.mjs} +1 -1
  275. package/dist/web-components/{split-m-_XivaW.mjs → split-Hp6z-v4h.mjs} +1 -1
  276. package/dist/web-components/{status-DDS7jLNd.mjs → status-BmtuKfAG.mjs} +1 -1
  277. package/dist/web-components/styles-CZV1nbBQ.mjs +1 -0
  278. package/dist/web-components/three.mjs +1 -1
  279. package/dist/web-components/thumbnail-Dp7a8oom.mjs +1 -0
  280. package/dist/web-components/{tip-BXByhOJ9.mjs → tip-C-oovDZK.mjs} +1 -1
  281. package/dist/web-components/{toggle-AS72kq6v.mjs → toggle-C7ODWDEZ.mjs} +1 -1
  282. package/dist/web-components/upgrade-eNW0DPXq.mjs +1 -0
  283. package/dist/web-components/upgrader-BlbMUEH6.mjs +1 -0
  284. package/dist/web-components/useContainerName-CrOmY-km.mjs +1 -0
  285. package/dist/web-components/useNearViewport-BqXi9Gn4.mjs +1 -0
  286. package/dist/web-components/{useScrollTrack-dLFWnT8N.mjs → useScrollTrack-CEsOU2yT.mjs} +1 -1
  287. package/dist/web-components/viewer/AnnotationItems-CyhVcRFc.mjs +1 -0
  288. package/dist/web-components/viewer/AnnotationMenu-DPOSehBo.mjs +1 -0
  289. package/dist/web-components/viewer/AnnotationState-Bjztkobn.mjs +1 -0
  290. package/dist/web-components/viewer/Annotations-Dh_8Tzi0.mjs +2 -0
  291. package/dist/web-components/viewer/Annotations-wwuOCxzI.mjs +1 -0
  292. package/dist/web-components/viewer/{Canvas2DBackend-CkvI0wUT.mjs → Canvas2DBackend-BTK6ZJh0.mjs} +1 -1
  293. package/dist/web-components/viewer/CaptionDetails-BwCTovy_.mjs +1 -0
  294. package/dist/web-components/viewer/ChoiceMenu-DQ1x572Y.mjs +1 -0
  295. package/dist/web-components/viewer/Collection-DSBxCmXw.mjs +1 -0
  296. package/dist/web-components/viewer/Connected-CL3N8F2J.mjs +1 -0
  297. package/dist/web-components/viewer/Connected-DTk1jlyI.mjs +1 -0
  298. package/dist/web-components/viewer/Contents-DrXckx7d.mjs +1 -0
  299. package/dist/web-components/viewer/ControlMenu-Bp91s-g_.mjs +1 -0
  300. package/dist/web-components/viewer/CountMenu-4u6U6yqb.mjs +1 -0
  301. package/dist/web-components/viewer/Cue-C-aF8peC.mjs +1 -0
  302. package/dist/web-components/viewer/Document-BN1rICu3.mjs +1 -0
  303. package/dist/web-components/viewer/DocumentPanel-CEesxdeY.mjs +1 -0
  304. package/dist/web-components/viewer/{DomLayers-Dybz_aJv.mjs → DomLayers-CGkDtemL.mjs} +1 -1
  305. package/dist/web-components/viewer/Download-CawEl9MN.mjs +1 -0
  306. package/dist/web-components/viewer/EntryBodies-nYHMwSSM.mjs +1 -0
  307. package/dist/web-components/viewer/EntryThumbnail-DrO_0SzR.mjs +1 -0
  308. package/dist/web-components/viewer/FieldPill-DFXGWrvB.mjs +1 -0
  309. package/dist/web-components/viewer/FrameAnimation-CZfzpxaD.mjs +1 -0
  310. package/dist/web-components/viewer/Gallery-MWHtvjti.mjs +1 -0
  311. package/dist/web-components/viewer/HideToggle-DP5kHzWM.mjs +1 -0
  312. package/dist/web-components/viewer/LanguageChoice-C50T7dPI.mjs +1 -0
  313. package/dist/web-components/viewer/{LightboxBody-ClQ4yrTh.mjs → LightboxBody-C2T7IC29.mjs} +1 -1
  314. package/dist/web-components/viewer/ListEnd-BDuOx__m.mjs +1 -0
  315. package/dist/web-components/viewer/MapView-BN9wXQKV.mjs +3 -0
  316. package/dist/web-components/viewer/MediaBody-CEyswliX.mjs +1 -0
  317. package/dist/web-components/viewer/MediaBody-Dw3DWDjc.mjs +1 -0
  318. package/dist/web-components/viewer/NavDate-C2-wwLuB.mjs +1 -0
  319. package/dist/web-components/viewer/{Navigator-Duc69Yes.mjs → Navigator-C3jghOd3.mjs} +1 -1
  320. package/dist/web-components/viewer/PagerLayout-Cg2NpqoD.mjs +1 -0
  321. package/dist/web-components/viewer/PartOfManifest-D22yMgCf.mjs +1 -0
  322. package/dist/web-components/viewer/PlaceBox-Dckw4Sfk.mjs +1 -0
  323. package/dist/web-components/viewer/Placeholder-NYVWYg5Q.mjs +1 -0
  324. package/dist/web-components/viewer/Search-DC259m4f.mjs +1 -0
  325. package/dist/web-components/viewer/StandaloneItems-E4kpMne9.mjs +1 -0
  326. package/dist/web-components/viewer/Steps-Bw32X5xO.mjs +1 -0
  327. package/dist/web-components/viewer/TargetItems-DLhUH1Gq.mjs +1 -0
  328. package/dist/web-components/viewer/Transcript-D_VGJQxn.mjs +1 -0
  329. package/dist/web-components/viewer/annotation-collection-DZHa18ir.mjs +1 -0
  330. package/dist/web-components/viewer/annotation-name-BaNdW2Xk.mjs +1 -0
  331. package/dist/web-components/viewer/annotations-content-CbA3eOIC.mjs +1 -0
  332. package/dist/web-components/viewer/{cloverEngine-CjuYjUhI.mjs → cloverEngine-C04bCSFR.mjs} +2 -2
  333. package/dist/web-components/viewer/content-state-reader-C7UBMOq3.mjs +1 -0
  334. package/dist/web-components/viewer/fetchManifest-C2Yxg3x9.mjs +1 -0
  335. package/dist/web-components/viewer/{host-yWi4R1bP.mjs → host-CZeyjCKR.mjs} +1 -1
  336. package/dist/web-components/viewer/image-layers-B09fporZ.mjs +1 -0
  337. package/dist/web-components/viewer/index.mjs +1 -1
  338. package/dist/web-components/viewer/link-DssZ0Z2N.mjs +1 -0
  339. package/dist/web-components/viewer/overlayImage-BR3eJCKq.mjs +1 -0
  340. package/dist/web-components/viewer/range-regions-By6L5JOK.mjs +1 -0
  341. package/dist/web-components/viewer/{renderers-L-IlGI1r.mjs → renderers-DLoqv3QO.mjs} +1 -1
  342. package/dist/web-components/viewer/save-file-CJT5p5Hg.mjs +1 -0
  343. package/dist/web-components/viewer/{search-DWkwRPo_.mjs → search-PhOwMKHi.mjs} +1 -1
  344. package/dist/web-components/viewer/styles-NZLnZPAC.mjs +1 -0
  345. package/dist/web-components/viewer/viewer-D30YHqyF.mjs +29 -0
  346. package/dist/web-components/viewer/{vtt-1ZJwtElI.mjs → vtt-1Pk7Dhsj.mjs} +1 -1
  347. package/dist/web-components/viewer-CH7re5OO.mjs +1 -0
  348. package/dist/web-components/{vtt-GFssZH8Y.mjs → vtt-CacHieeN.mjs} +1 -1
  349. package/dist/web-components/worker-CjXN0dku.mjs +1 -0
  350. package/package.json +10 -5
  351. package/dist/i18n/reader.mjs +0 -13
  352. package/dist/web-components/About-uKa1wfDr.mjs +0 -1
  353. package/dist/web-components/AnnotationMenu-BGIYRXW6.mjs +0 -1
  354. package/dist/web-components/AnnotationState-D2UIgIEC.mjs +0 -1
  355. package/dist/web-components/Annotations-BhwAv3ah.mjs +0 -1
  356. package/dist/web-components/Annotations-C_tBJHo3.mjs +0 -2
  357. package/dist/web-components/Body-DMEERFuB.mjs +0 -1
  358. package/dist/web-components/BodyAlert-BP8voSLv.mjs +0 -1
  359. package/dist/web-components/Button-Cl02BFDd.mjs +0 -1
  360. package/dist/web-components/CanvasView-B8lMMSou.mjs +0 -1
  361. package/dist/web-components/CaptionDetails-KLMDv-ec.mjs +0 -1
  362. package/dist/web-components/ChoiceMenu-CXrVOmJl.mjs +0 -1
  363. package/dist/web-components/Collection-DL4Ui4hF.mjs +0 -1
  364. package/dist/web-components/CollectionSelect-DL-bbpwJ.mjs +0 -1
  365. package/dist/web-components/Connected-B0S1HXQb.mjs +0 -1
  366. package/dist/web-components/Connected-BcjRA5si.mjs +0 -1
  367. package/dist/web-components/Connected-Q7iizBb8.mjs +0 -1
  368. package/dist/web-components/Contents-ZC8TiGaW.mjs +0 -1
  369. package/dist/web-components/ControlMenu-DIoU797-.mjs +0 -1
  370. package/dist/web-components/Cue-CJxnDMEy.mjs +0 -1
  371. package/dist/web-components/Document-DHBRAFEK.mjs +0 -1
  372. package/dist/web-components/DocumentPanel-CqvE2pu9.mjs +0 -1
  373. package/dist/web-components/Download-DBksL1C0.mjs +0 -1
  374. package/dist/web-components/EntryBodies-VwEkTVrw.mjs +0 -1
  375. package/dist/web-components/ErrorBoundary-Cy9PGoZv.mjs +0 -1
  376. package/dist/web-components/FieldPill-DCJBz6Vj.mjs +0 -1
  377. package/dist/web-components/FrameAnimation-DRbmgGpF.mjs +0 -1
  378. package/dist/web-components/Gallery-BM7-VJkB.mjs +0 -1
  379. package/dist/web-components/HideToggle-BdYgG7us.mjs +0 -1
  380. package/dist/web-components/Items-_1Jz3FMs.mjs +0 -1
  381. package/dist/web-components/Label-CAiJ49eA.mjs +0 -1
  382. package/dist/web-components/LightboxBody-DyhUZiDf.mjs +0 -1
  383. package/dist/web-components/LoadedCanvas-DWz5IK5m.mjs +0 -1
  384. package/dist/web-components/LoadedMap-DIeW313M.mjs +0 -1
  385. package/dist/web-components/MapView-BJaN7VBI.mjs +0 -1
  386. package/dist/web-components/Markup-D91DbxLk.mjs +0 -2
  387. package/dist/web-components/MediaBody-BYcVPo2X.mjs +0 -1
  388. package/dist/web-components/MediaBody-FEzH8VVw.mjs +0 -1
  389. package/dist/web-components/Pager-BGwCurxE.mjs +0 -1
  390. package/dist/web-components/Panel-B-GXOkzF.mjs +0 -1
  391. package/dist/web-components/PartOfManifest-ClbGepVM.mjs +0 -1
  392. package/dist/web-components/Primitives-CTh59wvs.mjs +0 -1
  393. package/dist/web-components/Provider-C6rIiDXH.mjs +0 -1
  394. package/dist/web-components/ReadMore-BJ2i-0uN.mjs +0 -1
  395. package/dist/web-components/Root-DkkYDtur.mjs +0 -1
  396. package/dist/web-components/Scene-B_PU_TiX.mjs +0 -1
  397. package/dist/web-components/SceneView-qcW_sT3j.mjs +0 -1
  398. package/dist/web-components/Search-UOneIUcP.mjs +0 -1
  399. package/dist/web-components/Sections-we9U9fXq.mjs +0 -2
  400. package/dist/web-components/StandaloneItems-DU8oCFc_.mjs +0 -1
  401. package/dist/web-components/Status-Cs5ZvFvL.mjs +0 -1
  402. package/dist/web-components/Timeline-WtYZ1bIJ.mjs +0 -1
  403. package/dist/web-components/Tip-C8J3qsIK.mjs +0 -1
  404. package/dist/web-components/Transcript-CRL2zToL.mjs +0 -1
  405. package/dist/web-components/annotation-collection-ZPyvpLFc.mjs +0 -1
  406. package/dist/web-components/annotations-content-BZChKhJZ.mjs +0 -1
  407. package/dist/web-components/body-UntgrmoV.mjs +0 -1
  408. package/dist/web-components/canvas-d_U4v_mh.mjs +0 -1
  409. package/dist/web-components/content-state-reader-DjdKWjit.mjs +0 -1
  410. package/dist/web-components/es-BwMkoRod.mjs +0 -1
  411. package/dist/web-components/fi-gPFOn9RK.mjs +0 -1
  412. package/dist/web-components/fr-DUHmgdJo.mjs +0 -1
  413. package/dist/web-components/fromManifest-UrMJgktp.mjs +0 -1
  414. package/dist/web-components/glyphs-BoX0a88P.mjs +0 -1
  415. package/dist/web-components/hooks-Dp8pjU8l.mjs +0 -1
  416. package/dist/web-components/index-DWxMuwDL.mjs +0 -1
  417. package/dist/web-components/items--Tu7ZM3L.mjs +0 -1
  418. package/dist/web-components/items-W2vrwArM.mjs +0 -1
  419. package/dist/web-components/keep-fragments-B5nlv2ck.mjs +0 -1
  420. package/dist/web-components/label-CYQ7tVl6.mjs +0 -1
  421. package/dist/web-components/layout-KL0V-iJu.mjs +0 -1
  422. package/dist/web-components/link-DRRTY4lY.mjs +0 -1
  423. package/dist/web-components/logo-CnQUCB3Y.mjs +0 -1
  424. package/dist/web-components/models-BP2qp9nT.mjs +0 -1
  425. package/dist/web-components/nb-BSvnQ6jd.mjs +0 -1
  426. package/dist/web-components/nn-Dg2_HdZu.mjs +0 -1
  427. package/dist/web-components/no-BSvnQ6jd.mjs +0 -1
  428. package/dist/web-components/part-CUBY90_b.mjs +0 -1
  429. package/dist/web-components/playerSurface-i2TJz-F4.mjs +0 -1
  430. package/dist/web-components/pt-B3J80JgO.mjs +0 -1
  431. package/dist/web-components/read-more-BaaO77el.mjs +0 -1
  432. package/dist/web-components/rendererSurface-DAvatpMF.mjs +0 -22
  433. package/dist/web-components/sanitize-Dc7nOsgO.mjs +0 -3
  434. package/dist/web-components/search-DgcgsI3I.mjs +0 -1
  435. package/dist/web-components/shared-J3w3gnXD.mjs +0 -1
  436. package/dist/web-components/styles-Ypl9KrSK.mjs +0 -1
  437. package/dist/web-components/thumbnail-BZvLSwWW.mjs +0 -1
  438. package/dist/web-components/time-B9GZoYcm.mjs +0 -1
  439. package/dist/web-components/upgrader-XNxI-5jo.mjs +0 -1
  440. package/dist/web-components/useContainerName-DCbE5JXi.mjs +0 -1
  441. package/dist/web-components/useNearViewport-CyoK3l8W.mjs +0 -1
  442. package/dist/web-components/viewer/AnnotationMenu-Dd4tnzNV.mjs +0 -1
  443. package/dist/web-components/viewer/AnnotationState-DZaSy5lH.mjs +0 -1
  444. package/dist/web-components/viewer/Annotations-D1h-Yi5J.mjs +0 -1
  445. package/dist/web-components/viewer/Annotations-sj79EMen.mjs +0 -2
  446. package/dist/web-components/viewer/CaptionDetails-B_JdNjJ7.mjs +0 -1
  447. package/dist/web-components/viewer/ChoiceMenu-xa51a1DV.mjs +0 -1
  448. package/dist/web-components/viewer/Collection-CxuLCspj.mjs +0 -1
  449. package/dist/web-components/viewer/Connected-BSUBc3Ci.mjs +0 -1
  450. package/dist/web-components/viewer/Connected-CPIxNjF2.mjs +0 -1
  451. package/dist/web-components/viewer/Contents-DNh9mnsF.mjs +0 -1
  452. package/dist/web-components/viewer/ControlMenu-DdgIvBdf.mjs +0 -1
  453. package/dist/web-components/viewer/Cue-90H9_dXz.mjs +0 -1
  454. package/dist/web-components/viewer/Document-CNCpzkiN.mjs +0 -1
  455. package/dist/web-components/viewer/DocumentPanel-BdG4TVLE.mjs +0 -1
  456. package/dist/web-components/viewer/EntryBodies-DGXjFP3N.mjs +0 -1
  457. package/dist/web-components/viewer/FieldPill-Icmd98OY.mjs +0 -1
  458. package/dist/web-components/viewer/FrameAnimation-DJZN3Rd4.mjs +0 -1
  459. package/dist/web-components/viewer/Gallery-CEp3-bh2.mjs +0 -1
  460. package/dist/web-components/viewer/HideToggle-DB6HTmAO.mjs +0 -1
  461. package/dist/web-components/viewer/MapView-BVSdybIC.mjs +0 -1
  462. package/dist/web-components/viewer/MediaBody-BBbSMT1i.mjs +0 -1
  463. package/dist/web-components/viewer/MediaBody-BzMXMHIF.mjs +0 -1
  464. package/dist/web-components/viewer/PartOfManifest-X9_q-2t6.mjs +0 -1
  465. package/dist/web-components/viewer/Search-S4N5QU4R.mjs +0 -1
  466. package/dist/web-components/viewer/StandaloneItems-BO4VyWRW.mjs +0 -1
  467. package/dist/web-components/viewer/Transcript-BbDaS064.mjs +0 -1
  468. package/dist/web-components/viewer/annotation-collection-BjZ1DAHq.mjs +0 -1
  469. package/dist/web-components/viewer/annotations-content-jn3n5Y2-.mjs +0 -1
  470. package/dist/web-components/viewer/content-state-reader-CPiShIjP.mjs +0 -1
  471. package/dist/web-components/viewer/link-CwE-fg5G.mjs +0 -1
  472. package/dist/web-components/viewer/overlayImage-BpOgqsZ0.mjs +0 -1
  473. package/dist/web-components/viewer/styles-BRCkEU3w.mjs +0 -1
  474. package/dist/web-components/viewer/viewer--TreVlJ_.mjs +0 -28
  475. package/dist/web-components/viewer-DyV864Qe.mjs +0 -1
  476. /package/dist/{ui → i18n}/languageCode.mjs +0 -0
@@ -1,15 +1,17 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import React, { useRef, useState, useMemo, useCallback, useEffect, useLayoutEffect, Suspense, lazy } from "react";
3
+ import React, { useRef, useState, useMemo, useEffect, useCallback, useLayoutEffect, Suspense, lazy } from "react";
4
4
  import Caption, { hasInformation, captionLabelId } from "../Body/Caption.mjs";
5
5
  import Controls from "./Controls.mjs";
6
- import Placeholder from "./Placeholder.mjs";
7
- import { findChoices, animationFrames, canvasScene, placeholderStill, frameKey, canvasRectToWorld, canvasSize } from "./layout.mjs";
6
+ import { findChoices, startingChoices, animationFrames, canvasScene, placeholderStill, frameKey, canvasRectToWorld, canvasSize } from "./layout.mjs";
8
7
  import ExitFullscreen from "../../ui/ExitFullscreen.mjs";
9
8
  import { useControlsVisibility } from "../Body/useControlsVisibility.mjs";
10
9
  import { useNearViewport } from "../Body/useNearViewport.mjs";
11
10
  import useFullscreen from "../../hooks/useFullscreen.mjs";
11
+ import useWithinFullscreen from "../../hooks/useWithinFullscreen.mjs";
12
+ import useFullscreenExit from "../../hooks/useFullscreenExit.mjs";
12
13
  import { useLoaded } from "../../hooks/useLoaded.mjs";
14
+ import { useHighContrast, highContrastProps } from "../../hooks/useHighContrast.mjs";
13
15
  import { ErrorBoundary } from "../../ui/ErrorBoundary.mjs";
14
16
  import { Loading } from "../../ui/Loading.mjs";
15
17
  import { SHORTCUTS, forwardShortcut } from "../../ui/Tip.mjs";
@@ -18,12 +20,14 @@ import { visuallyHidden } from "../../ui/visuallyHidden.mjs";
18
20
  import { join } from "../../lib/classnames.mjs";
19
21
  import { localize } from "../../core/value.mjs";
20
22
  import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
23
+ import { BodyUnloadable, BodyNote } from "../../ui/BodyUnloadable.mjs";
21
24
  import { HostLanguageContext } from "../../i18n/hostLanguage.mjs";
22
- import { useRootLanguage } from "../../react/language.mjs";
23
- import { useContainerName } from "../../ui/useContainerName.mjs";
25
+ import { useRootLanguage } from "../../i18n/useRootLanguage.mjs";
26
+ import { useContainerName } from "../../i18n/useContainerName.mjs";
24
27
  import { union } from "../../lib/renderer/math/rect.mjs";
25
28
  import { findImageServiceId } from "../../lib/renderer/sources/imageService.mjs";
26
29
  import { hasCamera } from "./surface.mjs";
30
+ import { languageProps } from "../../i18n/direction.mjs";
27
31
  import { resolveDirection } from "../../core/sequence.mjs";
28
32
  const MediaBody = lazy(() => import("./media/MediaBody.mjs"));
29
33
  const loadHotspots = () => import("./AnnotationState.mjs");
@@ -43,13 +47,16 @@ const NO_MODEL = {
43
47
  quietlyOpened: null
44
48
  };
45
49
  const FrameAnimation = lazy(() => import("./FrameAnimation.mjs"));
50
+ const PlaceBox = lazy(() => import("./PlaceBox.mjs"));
51
+ const Placeholder = lazy(() => import("./Placeholder.mjs"));
46
52
  const ALL_CONTROLS = {
47
53
  zoom: true,
48
54
  fullPage: true,
49
55
  rotation: true,
50
56
  reset: true,
51
57
  annotations: true,
52
- information: true
58
+ information: true,
59
+ map: true
53
60
  };
54
61
  const CAMERA_KEYS = {
55
62
  description: "canvasKeysImage",
@@ -77,7 +84,7 @@ const CanvasView = (props) => {
77
84
  return /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsx(CanvasBody, { ...props }) });
78
85
  };
79
86
  const CanvasBody = (props) => {
80
- var _a, _b, _c, _d, _e;
87
+ var _a, _b, _c, _d, _e, _f;
81
88
  const {
82
89
  surface: makeSurface,
83
90
  manifestId,
@@ -89,6 +96,7 @@ const CanvasBody = (props) => {
89
96
  label,
90
97
  partOf,
91
98
  language,
99
+ highContrast,
92
100
  instanceId,
93
101
  className,
94
102
  options,
@@ -114,9 +122,12 @@ const CanvasBody = (props) => {
114
122
  null
115
123
  );
116
124
  const isFullscreen = useFullscreen(wrapperElement);
125
+ const withinFullscreen = useWithinFullscreen(wrapperElement);
126
+ const exitShown = useFullscreenExit(wrapperElement);
117
127
  const root = useRootLanguage(
118
128
  setWrapperElement
119
129
  );
130
+ const contrast = useHighContrast(highContrast);
120
131
  const controlsVisible = useControlsVisibility(
121
132
  wrapperElement,
122
133
  options == null ? void 0 : options.hideDelay,
@@ -131,6 +142,7 @@ const CanvasBody = (props) => {
131
142
  const [navigatorElement, setNavigatorElement] = useState(null);
132
143
  const controlsConfig = controls === false ? null : controls === true ? ALL_CONTROLS : { ...ALL_CONTROLS, ...controls };
133
144
  const [status, setStatus] = useState("loading");
145
+ const [unloadable, setUnloadable] = useState(false);
134
146
  const [sceneVersion, setSceneVersion] = useState(0);
135
147
  const onReadyRef = useRef(onReady);
136
148
  const onViewportChangeRef = useRef(onViewportChange);
@@ -140,13 +152,64 @@ const CanvasBody = (props) => {
140
152
  optionsRef.current = options;
141
153
  const direction = resolveDirection(viewingDirection);
142
154
  const choices = useMemo(() => findChoices(canvases ?? []), [canvases]);
143
- const [selections, setSelections] = useState({});
155
+ const starting = useMemo(() => startingChoices(choices), [choices]);
156
+ const [picked, setSelections] = useState({});
157
+ const selections = useMemo(
158
+ () => ({ ...starting, ...picked }),
159
+ [starting, picked]
160
+ );
144
161
  const selectChoice = (key, index) => setSelections((current) => ({ ...current, [key]: index }));
162
+ const layered = useMemo(
163
+ () => allAnnotations == null ? void 0 : allAnnotations.filter(
164
+ (each) => !each.layer || (selections[each.layer.key] ?? 0) === each.layer.item
165
+ ),
166
+ [allAnnotations, selections]
167
+ );
168
+ const pickedLayer = (_a = allAnnotations == null ? void 0 : allAnnotations.find(
169
+ (each) => each.layer && each.annotation.id === props.selectedAnnotation
170
+ )) == null ? void 0 : _a.layer;
171
+ useEffect(() => {
172
+ if (pickedLayer && (selections[pickedLayer.key] ?? 0) !== pickedLayer.item)
173
+ selectChoice(pickedLayer.key, pickedLayer.item);
174
+ }, [pickedLayer == null ? void 0 : pickedLayer.key, pickedLayer == null ? void 0 : pickedLayer.item, props.selectedAnnotation]);
145
175
  const showInformation = Boolean(controlsConfig == null ? void 0 : controlsConfig.information);
146
176
  const hasAnnotations = Boolean(allAnnotations == null ? void 0 : allAnnotations.length);
147
177
  const hotspots = useLoaded(loadHotspots, hasAnnotations);
148
178
  const [annotationModel, setAnnotationModel] = useState(null);
149
179
  const model = hasAnnotations && annotationModel || NO_MODEL;
180
+ const pickedPlace = useMemo(() => {
181
+ var _a2, _b2;
182
+ const picked2 = (_a2 = allAnnotations == null ? void 0 : allAnnotations.find(
183
+ (each) => each.annotation.id === model.selected
184
+ )) == null ? void 0 : _a2.annotation;
185
+ const body2 = (Array.isArray(picked2 == null ? void 0 : picked2.body) ? picked2 == null ? void 0 : picked2.body : [picked2 == null ? void 0 : picked2.body]).find((each) => (each == null ? void 0 : each.type) === "Feature");
186
+ return picked2 && body2 ? {
187
+ id: String(picked2.id),
188
+ feature: body2,
189
+ name: ((_b2 = body2.properties) == null ? void 0 : _b2.label) ?? picked2.label
190
+ } : null;
191
+ }, [allAnnotations, model.selected]);
192
+ const pickKey = pickedPlace ? `${pickedPlace.id}:${props.refind ?? 0}` : null;
193
+ const [closedPick, setClosedPick] = useState(null);
194
+ const pickOpen = pickKey !== null && closedPick !== pickKey;
195
+ const places = useMemo(() => {
196
+ var _a2, _b2;
197
+ const own = (canvases ?? []).map((canvas) => canvas.navPlace).filter(Boolean);
198
+ const source = own.length ? own : props.navPlace ? [props.navPlace] : [];
199
+ if (!source.length) return null;
200
+ const features = source.flatMap(
201
+ (place) => (place == null ? void 0 : place.type) === "FeatureCollection" ? place.features ?? [] : (place == null ? void 0 : place.type) === "Feature" ? [place] : []
202
+ );
203
+ if (!features.length) return null;
204
+ const named = features.length === 1 ? (_b2 = (_a2 = features[0]) == null ? void 0 : _a2.properties) == null ? void 0 : _b2.label : void 0;
205
+ return {
206
+ feature: { type: "FeatureCollection", features },
207
+ name: named ?? props.label
208
+ };
209
+ }, [canvases, props.navPlace, props.label]);
210
+ const placeId = `place-box-${instance}`;
211
+ const [placeOpen, setPlaceOpen] = useState(false);
212
+ const [placeShown, setPlaceShown] = useState(false);
150
213
  const modelRef = useRef(model);
151
214
  modelRef.current = model;
152
215
  const releaseAnnotation = useCallback(() => modelRef.current.release(), []);
@@ -198,8 +261,10 @@ const CanvasBody = (props) => {
198
261
  const baseImages = scene ? scene.images : bodyImages;
199
262
  const mediaOnly = Boolean(media) && (canvases == null ? void 0 : canvases.length) === 1;
200
263
  const player = mediaOnly && (media == null ? void 0 : media.kind) === "audio";
201
- const navigable = !mediaOnly && ((_a = options == null ? void 0 : options.gestures) == null ? void 0 : _a.navigable) !== false;
202
- const canvasKey = (canvases == null ? void 0 : canvases.map((canvas) => canvas.id).join("|")) ?? null;
264
+ const empty = (canvases == null ? void 0 : canvases.length) === 1 && !media && !animated && baseImages.length === 0;
265
+ const navigable = !mediaOnly && !empty && ((_b = options == null ? void 0 : options.gestures) == null ? void 0 : _b.navigable) !== false;
266
+ const canvasKey = canvases ? `${manifestId ?? ""}
267
+ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
203
268
  const stills = useMemo(() => {
204
269
  if (!canvases || !placeholder) return [];
205
270
  const found = canvases.flatMap((canvas) => {
@@ -212,21 +277,26 @@ const CanvasBody = (props) => {
212
277
  const [imagesOpen, setImagesOpen] = useState(false);
213
278
  const [mediaOpenedFor, setMediaOpenedFor] = useState(null);
214
279
  const showPlaceholder = !player && stills.length > 0 && (media ? mediaOpenedFor !== canvasKey : !imagesOpen);
215
- const onlyInformation = (config, { annotations = false } = {}) => ({
280
+ const onlyInformation = (config, { annotations = false, fullPage = false } = {}) => ({
216
281
  ...config,
217
282
  zoom: false,
218
283
  rotation: false,
219
284
  reset: false,
220
- fullPage: false,
285
+ fullPage: fullPage && config.fullPage,
221
286
  annotations: annotations && config.annotations
222
287
  });
288
+ const fullscreenExit = empty && withinFullscreen;
223
289
  const hostControls = React.Children.count(children) > 0;
224
- const shownControls = !controlsConfig ? null : showPlaceholder ? captioned.length || hostControls || listedCount ? onlyInformation(controlsConfig, { annotations: true }) : null : mediaOnly ? choices.length || captioned.length || hostControls || listedCount ? onlyInformation(controlsConfig, { annotations: true }) : null : controlsConfig;
290
+ const shownControls = !controlsConfig ? null : showPlaceholder ? captioned.length || hostControls || listedCount ? onlyInformation(controlsConfig, { annotations: true }) : null : mediaOnly || empty ? choices.length || captioned.length || hostControls || listedCount || fullscreenExit && controlsConfig.fullPage ? onlyInformation(controlsConfig, {
291
+ annotations: true,
292
+ fullPage: fullscreenExit
293
+ }) : null : controlsConfig;
225
294
  const showNavigator = navigator && !showPlaceholder && (media ? media.kind === "audio" && !mediaOnly && baseImages.length > 0 : true);
226
295
  const [fitted, setFitted] = useState(null);
227
296
  const videoPlacement = media ? fitted ?? media.placement : null;
228
- const images = useMemo(
229
- () => (media == null ? void 0 : media.kind) === "video" && mediaElement && videoPlacement ? [
297
+ const [frameItems, setFrameItems] = useState(NO_ITEMS);
298
+ const images = useMemo(() => {
299
+ const withVideo = (media == null ? void 0 : media.kind) === "video" && mediaElement && videoPlacement ? [
230
300
  ...baseImages,
231
301
  {
232
302
  id: media.id,
@@ -235,14 +305,15 @@ const CanvasBody = (props) => {
235
305
  height: videoPlacement.height,
236
306
  media: { element: mediaElement }
237
307
  }
238
- ] : baseImages,
239
- [baseImages, media, mediaElement, videoPlacement]
240
- );
308
+ ] : baseImages;
309
+ return frameItems.length ? [...withVideo, ...frameItems] : withVideo;
310
+ }, [baseImages, media, mediaElement, videoPlacement, frameItems]);
241
311
  const world = mediaOnly && (media == null ? void 0 : media.kind) === "video" && fitted ? fitted : scene ? union(scene.placements) : null;
242
312
  const imagesKey = JSON.stringify([
243
313
  baseImages,
244
314
  world,
245
- images.length !== baseImages.length && [media == null ? void 0 : media.id, videoPlacement]
315
+ images.length !== baseImages.length && [media == null ? void 0 : media.id, videoPlacement],
316
+ frameItems.map((item) => item.id)
246
317
  ]);
247
318
  const shownCanvases = useRef(null);
248
319
  const placeholderShown = useRef(false);
@@ -252,7 +323,7 @@ const CanvasBody = (props) => {
252
323
  if (!showPlaceholder) releaseAnnotation();
253
324
  };
254
325
  const firstBody = Array.isArray(body) ? body[0] : body;
255
- const ownName = [label, (_b = canvases == null ? void 0 : canvases[0]) == null ? void 0 : _b.label, firstBody == null ? void 0 : firstBody.label].map((value) => localize(value, language)).find((value) => value.text);
326
+ const ownName = [label, (_c = canvases == null ? void 0 : canvases[0]) == null ? void 0 : _c.label, firstBody == null ? void 0 : firstBody.label].map((value) => localize(value, language)).find((value) => value.text);
256
327
  const partOfName = useMemo(() => {
257
328
  const name = localize(partOf, language);
258
329
  return name.text && name.text !== (ownName == null ? void 0 : ownName.text) ? name : void 0;
@@ -281,7 +352,7 @@ const CanvasBody = (props) => {
281
352
  const { canvases: canvases2, scene: scene2, canvasKey: canvasKey2 } = latestScene.current;
282
353
  drawnScene.current = canvases2 && scene2 && shownCanvases.current === canvasKey2 ? { key: canvasKey2, canvases: canvases2, placements: scene2.placements } : null;
283
354
  }, []);
284
- const drawn = !canvases || ((_c = drawnScene.current) == null ? void 0 : _c.key) === canvasKey;
355
+ const drawn = !canvases || ((_d = drawnScene.current) == null ? void 0 : _d.key) === canvasKey;
285
356
  useEffect(() => {
286
357
  const host = hostRef.current;
287
358
  if (!host) return;
@@ -326,6 +397,10 @@ const CanvasBody = (props) => {
326
397
  const offError = surface2.on("error", () => {
327
398
  if (!surface2.isOpen) setStatus("error");
328
399
  });
400
+ const offUnloadable = surface2.on(
401
+ "unloadable",
402
+ (failed) => setUnloadable(Boolean(failed))
403
+ );
329
404
  const offViewport = surface2.on("viewport", () => {
330
405
  var _a2;
331
406
  if (renderer2) (_a2 = onViewportChangeRef.current) == null ? void 0 : _a2.call(onViewportChangeRef, renderer2.getBounds());
@@ -334,6 +409,7 @@ const CanvasBody = (props) => {
334
409
  offOpen();
335
410
  offChange();
336
411
  offError();
412
+ offUnloadable();
337
413
  offViewport();
338
414
  surface2.dispose();
339
415
  surfaceRef.current = null;
@@ -344,6 +420,19 @@ const CanvasBody = (props) => {
344
420
  if (!renderer || !navigatorElement) return;
345
421
  return renderer.attachNavigator(navigatorElement);
346
422
  }, [renderer, navigatorElement]);
423
+ useEffect(() => {
424
+ if (!surface || !empty) return;
425
+ surface.setGestures({ navigable: false });
426
+ return () => surface.setGestures({});
427
+ }, [surface, empty]);
428
+ const exitFocused = useRef(false);
429
+ useEffect(() => {
430
+ var _a2;
431
+ if (fullscreenExit) return;
432
+ const lost = !document.activeElement || document.activeElement === document.body;
433
+ if (exitFocused.current && lost) (_a2 = hostRef.current) == null ? void 0 : _a2.focus();
434
+ exitFocused.current = false;
435
+ }, [fullscreenExit]);
347
436
  useEffect(() => {
348
437
  const surface2 = surfaceRef.current;
349
438
  if (showPlaceholder) placeholderShown.current = true;
@@ -373,8 +462,11 @@ const CanvasBody = (props) => {
373
462
  className: join("clover-canvas", className),
374
463
  "data-testid": "clover-canvas",
375
464
  "data-status": status,
465
+ ...highContrastProps(contrast),
466
+ "data-unloadable": unloadable || void 0,
376
467
  "data-has-navigator": showNavigator,
377
468
  "data-fullscreen": isFullscreen,
469
+ "data-exit": exitShown || void 0,
378
470
  "data-controls": controlsVisible ? "visible" : "hidden",
379
471
  "data-media": media == null ? void 0 : media.kind,
380
472
  "data-player": player ? "" : void 0,
@@ -382,6 +474,9 @@ const CanvasBody = (props) => {
382
474
  "data-navigable": navigable,
383
475
  "data-placeholder": stills.length && !player ? showPlaceholder : void 0,
384
476
  ref: root.ref,
477
+ onFocus: (event) => {
478
+ exitFocused.current = fullscreenExit && event.target.id === `fullPage-${instance}`;
479
+ },
385
480
  onKeyDown: (event) => {
386
481
  if (event.key === "Escape" && isCaptionOpen && !event.defaultPrevented) {
387
482
  event.preventDefault();
@@ -404,7 +499,7 @@ const CanvasBody = (props) => {
404
499
  },
405
500
  children: [
406
501
  (shownControls || showNavigator) && /* @__PURE__ */ jsx("div", { className: "clover-canvas-scrim", "aria-hidden": "true" }),
407
- /* @__PURE__ */ jsx(ExitFullscreen, { hidden: !isFullscreen }),
502
+ /* @__PURE__ */ jsx(ExitFullscreen, { hidden: !exitShown }),
408
503
  surface && shownControls && /* @__PURE__ */ jsx(
409
504
  Controls,
410
505
  {
@@ -425,6 +520,12 @@ const CanvasBody = (props) => {
425
520
  captionId: hasCaption ? captionId : void 0,
426
521
  captionOpen: isCaptionOpen,
427
522
  onCaptionToggle: () => setCaptionOpen((open) => !open),
523
+ placeId: places ? placeId : void 0,
524
+ placeOpen,
525
+ onPlaceToggle: () => {
526
+ setPlaceShown(true);
527
+ setPlaceOpen((open) => !open);
528
+ },
428
529
  language,
429
530
  children
430
531
  }
@@ -462,18 +563,20 @@ const CanvasBody = (props) => {
462
563
  viewportName.node,
463
564
  viewportKeys.length > 0 && /* @__PURE__ */ jsx("span", { id: keysId, style: visuallyHidden, children: viewportKeys.map(({ description }, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
464
565
  index > 0 && " ",
465
- /* @__PURE__ */ jsx("span", { lang: root.langOf(description), children: t(description) })
566
+ /* @__PURE__ */ jsx("span", { ...languageProps(root.langOf(description)), children: t(description) })
466
567
  ] }, description)) }),
568
+ /* @__PURE__ */ jsx(BodyUnloadable, { kind: "image", shown: unloadable && !showPlaceholder }),
569
+ empty && !showPlaceholder && (ownName == null ? void 0 : ownName.text) && /* @__PURE__ */ jsx(BodyNote, { text: ownName.text, lang: ownName.lang || void 0 }),
467
570
  (media == null ? void 0 : media.kind) === "audio" && !player && baseImages.length === 0 && !showPlaceholder && (ownName == null ? void 0 : ownName.text) && /* @__PURE__ */ jsx(
468
571
  "p",
469
572
  {
470
573
  className: "clover-canvas-sound-label",
471
574
  "aria-hidden": "true",
472
- lang: ownName.lang || void 0,
575
+ ...languageProps(ownName.lang || void 0),
473
576
  children: ownName.text
474
577
  }
475
578
  ),
476
- stills.length > 0 && !player && /* @__PURE__ */ jsx(
579
+ stills.length > 0 && !player && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
477
580
  Placeholder,
478
581
  {
479
582
  instance,
@@ -485,7 +588,7 @@ const CanvasBody = (props) => {
485
588
  onToggle: togglePlaceholder,
486
589
  request: options == null ? void 0 : options.request
487
590
  }
488
- ),
591
+ ) }),
489
592
  surface && media && nearViewport && !showPlaceholder && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
490
593
  MediaBody,
491
594
  {
@@ -499,7 +602,7 @@ const CanvasBody = (props) => {
499
602
  caption,
500
603
  navigable,
501
604
  fullscreen: mediaOnly && Boolean(controlsConfig == null ? void 0 : controlsConfig.fullPage),
502
- isFullscreen,
605
+ isFullscreen: withinFullscreen,
503
606
  onEnded,
504
607
  chapters,
505
608
  highlightedChapter,
@@ -522,10 +625,14 @@ const CanvasBody = (props) => {
522
625
  byFrame: scene.frames[frameKey(animated)],
523
626
  animationKey: animated.id,
524
627
  sceneVersion,
525
- autoplay: (_d = options == null ? void 0 : options.animation) == null ? void 0 : _d.autoplay,
526
- loop: (_e = options == null ? void 0 : options.animation) == null ? void 0 : _e.loop,
628
+ autoplay: (_e = options == null ? void 0 : options.animation) == null ? void 0 : _e.autoplay,
629
+ loop: (_f = options == null ? void 0 : options.animation) == null ? void 0 : _f.loop,
527
630
  onEnded,
528
- language
631
+ language,
632
+ duration: Number(animated.duration),
633
+ canvas: animated,
634
+ place: scene.placements[canvases.indexOf(animated)],
635
+ onItems: setFrameItems
529
636
  },
530
637
  animated.id
531
638
  ) }),
@@ -533,7 +640,7 @@ const CanvasBody = (props) => {
533
640
  hotspots.AnnotationState,
534
641
  {
535
642
  given: props,
536
- annotations: allAnnotations,
643
+ annotations: layered ?? allAnnotations,
537
644
  scene,
538
645
  renderer,
539
646
  sceneVersion,
@@ -545,10 +652,43 @@ const CanvasBody = (props) => {
545
652
  openImages: setImagesOpen,
546
653
  openMedia: setMediaOpenedFor,
547
654
  host: hostRef,
548
- onModel: setAnnotationModel
655
+ onModel: setAnnotationModel,
656
+ refind: props.refind ?? 0
549
657
  }
550
658
  ),
551
659
  loading && /* @__PURE__ */ jsx(Loading, { overlay: true }),
660
+ pickedPlace && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
661
+ PlaceBox,
662
+ {
663
+ id: `place-of-${instance}`,
664
+ open: pickOpen,
665
+ onClose: (restoreFocus) => {
666
+ var _a2;
667
+ setClosedPick(pickKey);
668
+ if (restoreFocus)
669
+ (_a2 = document.getElementById(pickedPlace.id)) == null ? void 0 : _a2.focus();
670
+ },
671
+ feature: pickedPlace.feature,
672
+ name: pickedPlace.name,
673
+ language
674
+ }
675
+ ) }),
676
+ places && placeShown && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
677
+ PlaceBox,
678
+ {
679
+ id: placeId,
680
+ open: placeOpen,
681
+ onClose: (restoreFocus) => {
682
+ var _a2;
683
+ setPlaceOpen(false);
684
+ if (restoreFocus)
685
+ (_a2 = document.getElementById(`place-${instance}`)) == null ? void 0 : _a2.focus();
686
+ },
687
+ feature: places.feature,
688
+ name: places.name,
689
+ language
690
+ }
691
+ ) }),
552
692
  hasCaption && /* @__PURE__ */ jsx(
553
693
  Caption,
554
694
  {
@@ -610,6 +750,7 @@ function canvasHandle(renderer, drawn, zoomToAnnotation) {
610
750
  };
611
751
  }
612
752
  const NO_FRAMES = [];
753
+ const NO_ITEMS = [];
613
754
  function toSceneImages(body, src, isTiledImage = false) {
614
755
  const bodies = Array.isArray(body) ? body : body ? [body] : [];
615
756
  if (bodies.length) {
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from "react/jsx-runtime";
3
- import { createElement } from "react";
4
3
  import ControlMenu from "./ControlMenu.mjs";
4
+ import { playsHere } from "./layout.mjs";
5
5
  import { localize } from "../../core/value.mjs";
6
- import { useContainerName } from "../../ui/useContainerName.mjs";
6
+ import { useContainerName } from "../../i18n/useContainerName.mjs";
7
+ import { languageProps } from "../../i18n/direction.mjs";
7
8
  const ChoiceMenu = ({
8
9
  id,
9
10
  triggerId,
@@ -30,42 +31,61 @@ const ChoiceMenu = ({
30
31
  unlabeled && fallbackName.node,
31
32
  choices.map((group, g) => {
32
33
  const heading = localize(group.label, language);
33
- return /* @__PURE__ */ createElement(
34
+ return /* @__PURE__ */ jsxs(
34
35
  "fieldset",
35
36
  {
36
37
  ...heading.text ? {} : fallbackName.props,
37
38
  className: "clover-canvas-menu-group",
38
- key: group.key
39
- },
40
- heading.text && /* @__PURE__ */ jsx("legend", { className: "clover-canvas-menu-legend", lang: heading.lang, children: heading.text }),
41
- group.items.map((item, index) => {
42
- const text = localize(item.label, language);
43
- const shown = text.text || (item.image ? "" : String(index + 1));
44
- return /* @__PURE__ */ jsxs("label", { className: "clover-canvas-menu-item", children: [
45
- /* @__PURE__ */ jsx(
46
- "input",
39
+ children: [
40
+ heading.text && /* @__PURE__ */ jsx(
41
+ "legend",
47
42
  {
48
- type: "radio",
49
- name: `${id}-${g}`,
50
- "aria-label": shown ? void 0 : String(index + 1),
51
- checked: (selections[group.key] ?? 0) === index,
52
- onChange: () => onSelect(group.key, index)
43
+ className: "clover-canvas-menu-legend",
44
+ ...languageProps(heading.lang),
45
+ children: heading.text
53
46
  }
54
47
  ),
55
- item.image && // eslint-disable-next-line @next/next/no-img-element -- This library also renders outside Next.js.
56
- /* @__PURE__ */ jsx(
57
- "img",
58
- {
59
- alt: "",
60
- className: "clover-canvas-menu-image",
61
- decoding: "async",
62
- loading: "lazy",
63
- src: item.image
64
- }
65
- ),
66
- shown && /* @__PURE__ */ jsx("span", { lang: text.text ? text.lang : void 0, children: shown })
67
- ] }, index);
68
- })
48
+ group.items.map((item, index) => {
49
+ const text = localize(item.label, language);
50
+ const shown = text.text || (item.image ? "" : String(index + 1));
51
+ const unplayable = !playsHere(item);
52
+ return /* @__PURE__ */ jsxs(
53
+ "label",
54
+ {
55
+ className: "clover-canvas-menu-item",
56
+ "data-disabled": unplayable || void 0,
57
+ children: [
58
+ /* @__PURE__ */ jsx(
59
+ "input",
60
+ {
61
+ type: "radio",
62
+ name: `${id}-${g}`,
63
+ "aria-label": shown ? void 0 : String(index + 1),
64
+ checked: (selections[group.key] ?? 0) === index,
65
+ disabled: unplayable,
66
+ onChange: () => onSelect(group.key, index)
67
+ }
68
+ ),
69
+ item.image && // eslint-disable-next-line @next/next/no-img-element -- This library also renders outside Next.js.
70
+ /* @__PURE__ */ jsx(
71
+ "img",
72
+ {
73
+ alt: "",
74
+ className: "clover-canvas-menu-image",
75
+ decoding: "async",
76
+ loading: "lazy",
77
+ src: item.image
78
+ }
79
+ ),
80
+ shown && /* @__PURE__ */ jsx("span", { ...languageProps(text.text ? text.lang : void 0), children: shown })
81
+ ]
82
+ },
83
+ index
84
+ );
85
+ })
86
+ ]
87
+ },
88
+ group.key
69
89
  );
70
90
  })
71
91
  ]
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { useSyncExternalStore, useMemo, useRef, useCallback, useEffect } from "react";
3
+ import { useSyncExternalStore, useRef, useState, useEffect, useMemo, useCallback } from "react";
4
4
  import CanvasView from "./CanvasView.mjs";
5
5
  import { useRangeChapters, applyTarget } from "./fromManifest.mjs";
6
- import { paintedMedia } from "./layout.mjs";
6
+ import { paintedMedia, canvasCaptions } from "./layout.mjs";
7
7
  import { selectDrawnSets, selectUnlistedSets, selectHiddenSets } from "../../core/annotation-sets.mjs";
8
8
  import { showLink } from "../../core/show-link.mjs";
9
9
  import { chaptersOf } from "../../core/ranges.mjs";
10
10
  import { hasBehavior } from "../../core/selectors.mjs";
11
+ import { sameLanguage } from "../../i18n/languages.mjs";
11
12
  import { useClover, useCloverSelector } from "../../react/context.mjs";
12
13
  import { useVisibleCanvases, useSequence, useManifest, useActiveCanvas } from "../../react/hooks.mjs";
13
14
  const ConnectedCanvas = ({
@@ -47,7 +48,12 @@ const ConnectedCanvas = ({
47
48
  );
48
49
  const target = useCloverSelector((state) => state.target);
49
50
  const sets = useCloverSelector(
50
- (state) => selectDrawnSets(state.manifest, state.addedSets, state.search.set)
51
+ (state) => selectDrawnSets(
52
+ state.manifest,
53
+ state.addedSets,
54
+ state.search.set,
55
+ state.regions
56
+ )
51
57
  );
52
58
  const unlistedSets = useCloverSelector(
53
59
  (state) => selectUnlistedSets(
@@ -66,6 +72,15 @@ const ConnectedCanvas = ({
66
72
  )
67
73
  );
68
74
  const selectedAnnotation = useCloverSelector((state) => state.annotationId);
75
+ const selectedRef = useRef(selectedAnnotation);
76
+ selectedRef.current = selectedAnnotation;
77
+ const [refind, setRefind] = useState(0);
78
+ useEffect(
79
+ () => clover.found.subscribe((id) => {
80
+ if (id && id === selectedRef.current) setRefind((count) => count + 1);
81
+ }),
82
+ [clover]
83
+ );
69
84
  const highlighted = useSyncExternalStore(
70
85
  clover.highlight.subscribe,
71
86
  clover.highlight.get,
@@ -85,7 +100,9 @@ const ConnectedCanvas = ({
85
100
  annotation: entry.annotation,
86
101
  targetIndex: shown.indexOf(entry.canvasId),
87
102
  pageId: set.id,
88
- ...set.label ? { pageLabel: set.label } : {}
103
+ ...set.label ? { pageLabel: set.label } : {},
104
+ ...entry.place ? { place: entry.place } : {},
105
+ ...entry.layer ? { layer: { key: entry.layer.key, item: entry.layer.item } } : {}
89
106
  }))
90
107
  );
91
108
  }, [givenAnnotations, sets, canvases]);
@@ -109,6 +126,16 @@ const ConnectedCanvas = ({
109
126
  );
110
127
  const hasMediaRef = useRef(hasMedia);
111
128
  hasMediaRef.current = hasMedia;
129
+ const rootLanguage = givenCaption === void 0 ? context.language : void 0;
130
+ const mediaCanvasId = mediaCanvas == null ? void 0 : mediaCanvas.id;
131
+ useEffect(() => {
132
+ if (!rootLanguage || !mediaCanvas) return;
133
+ const file = canvasCaptions(mediaCanvas).find(
134
+ (track) => track.language && sameLanguage(track.language, rootLanguage)
135
+ );
136
+ if (file && clover.captions.get() !== file.id)
137
+ clover.captions.emit(file.id);
138
+ }, [rootLanguage, mediaCanvasId, clover]);
112
139
  const applyTarget$1 = useCallback(() => {
113
140
  const pending = clover.store.get().target;
114
141
  if (!pending) return;
@@ -118,7 +145,12 @@ const ConnectedCanvas = ({
118
145
  return;
119
146
  clover.consumeTarget();
120
147
  }, [clover]);
148
+ const lastCanvas = useRef(canvasKey);
121
149
  useEffect(() => {
150
+ if (lastCanvas.current !== canvasKey) {
151
+ lastCanvas.current = canvasKey;
152
+ media.current = null;
153
+ }
122
154
  if (target) applyTarget$1();
123
155
  }, [target, canvasKey, applyTarget$1]);
124
156
  const onReadyRef = useRef(onReady);
@@ -188,6 +220,7 @@ const ConnectedCanvas = ({
188
220
  {
189
221
  ...rest,
190
222
  manifestId,
223
+ navPlace: manifest == null ? void 0 : manifest.navPlace,
191
224
  canvases,
192
225
  viewingDirection: direction,
193
226
  language,
@@ -212,6 +245,7 @@ const ConnectedCanvas = ({
212
245
  highlightedChapter,
213
246
  onChapterHighlight: (id) => clover.chapter.emit(id),
214
247
  selectedAnnotation,
248
+ refind,
215
249
  highlightedAnnotation: highlighted,
216
250
  onAnnotationSelect: (id) => clover.selectAnnotation(id),
217
251
  onAnnotationLink: rest.onAnnotationLink ?? followLink,