@nulib/clover 4.2.0 → 4.3.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 (335) hide show
  1. package/README.md +1 -1
  2. package/dist/components/Canvas/CanvasView.mjs +33 -4
  3. package/dist/components/Canvas/ChaptersMenu.mjs +6 -1
  4. package/dist/components/Canvas/ControlMenu.mjs +9 -2
  5. package/dist/components/Canvas/Controls.mjs +17 -4
  6. package/dist/components/Canvas/FrameAnimation.mjs +3 -0
  7. package/dist/components/Canvas/ImageControls.mjs +8 -3
  8. package/dist/components/Canvas/Placeholder.mjs +5 -2
  9. package/dist/components/Canvas/RowFits.mjs +3 -1
  10. package/dist/components/Canvas/media/MediaBody.mjs +3 -0
  11. package/dist/components/Canvas/media/Player.mjs +3 -0
  12. package/dist/components/Canvas/media/Transport.mjs +3 -0
  13. package/dist/components/Canvas/media/useMediaElement.mjs +32 -9
  14. package/dist/components/Items/masonry.mjs +2 -0
  15. package/dist/components/Map/MapView.mjs +42 -2
  16. package/dist/components/Map/maplibre-sheet.mjs +5 -0
  17. package/dist/components/Map/sheet.mjs +19 -0
  18. package/dist/components/Map/worker.mjs +28 -1
  19. package/dist/components/Scene/SceneView.mjs +3 -0
  20. package/dist/core/content-state.mjs +1 -11
  21. package/dist/core/load.mjs +9 -1
  22. package/dist/core/presentation.mjs +4 -5
  23. package/dist/core/sanitize.mjs +15 -3
  24. package/dist/core/svg-shape.mjs +2 -1
  25. package/dist/core/thumbnail.mjs +15 -4
  26. package/dist/core/trusted.mjs +26 -0
  27. package/dist/core/vtt.mjs +20 -9
  28. package/dist/index.d.mts +200 -1
  29. package/dist/index.mjs +11 -0
  30. package/dist/lib/renderer/CanvasRenderer.mjs +48 -7
  31. package/dist/lib/renderer/camera/CameraAnimator.mjs +39 -20
  32. package/dist/lib/renderer/input/GestureController.mjs +15 -5
  33. package/dist/map/index.d.mts +6 -1
  34. package/dist/styles/collection-select.css +1 -0
  35. package/dist/styles/core.css +1 -0
  36. package/dist/styles/default.css +1 -0
  37. package/dist/styles/items.css +1 -0
  38. package/dist/styles/map.css +1 -0
  39. package/dist/{web-components/Transport-VUxSEIQO.mjs → styles/media.css} +1 -1
  40. package/dist/styles/panel.css +1 -0
  41. package/dist/styles/scene.css +1 -0
  42. package/dist/styles/split.css +1 -0
  43. package/dist/styles.css +1 -1
  44. package/dist/templates/default/Default.mjs +2 -0
  45. package/dist/templates/document/Document.mjs +12 -2
  46. package/dist/templates/document/Sheets.mjs +2 -0
  47. package/dist/templates/gallery/Gallery.mjs +3 -1
  48. package/dist/templates/index.d.mts +102 -6
  49. package/dist/templates/shared/Lightbox.mjs +50 -3
  50. package/dist/templates/shared/LightboxView.mjs +3 -1
  51. package/dist/templates.css +1 -1
  52. package/dist/ui/Button.mjs +3 -1
  53. package/dist/ui/ControlCluster.mjs +6 -3
  54. package/dist/ui/Markup.mjs +8 -7
  55. package/dist/ui/Tip.mjs +6 -1
  56. package/dist/ui/adoptSheet.mjs +19 -0
  57. package/dist/ui/sheets/map.mjs +5 -0
  58. package/dist/ui/sheets/media.mjs +5 -0
  59. package/dist/ui/sheets/scene.mjs +5 -0
  60. package/dist/web-components/{About-D1TBGGPL.mjs → About-uNCjvWgs.mjs} +1 -1
  61. package/dist/web-components/{AnnotationItems-DTacmRA9.mjs → AnnotationItems-JwlcCvPo.mjs} +1 -1
  62. package/dist/web-components/{AnnotationMenu-DYc9ekWS.mjs → AnnotationMenu-BWyKEyvW.mjs} +1 -1
  63. package/dist/web-components/{AnnotationState--5ghW0C2.mjs → AnnotationState-Bhqs75Br.mjs} +1 -1
  64. package/dist/web-components/{Annotations-BG8lPjk1.mjs → Annotations-C7y0N8Lj.mjs} +1 -1
  65. package/dist/web-components/{Annotations-Bvc_FmJ5.mjs → Annotations-ZwcRh2UE.mjs} +2 -2
  66. package/dist/web-components/{Body-QQ1DmnbP.mjs → Body-DyrvRDkt.mjs} +1 -1
  67. package/dist/web-components/{BodyAlert-A4xRjOKr.mjs → BodyAlert-XV88XjL8.mjs} +1 -1
  68. package/dist/web-components/Button-BIaw5k1q.mjs +1 -0
  69. package/dist/web-components/{Camera-DqT_1MgD.mjs → Camera-7SlnmGtb.mjs} +1 -1
  70. package/dist/web-components/{Canvas2DBackend-TZtR3zHf.mjs → Canvas2DBackend-DBGZRGid.mjs} +1 -1
  71. package/dist/web-components/CanvasView-CmDxczm9.mjs +2 -0
  72. package/dist/web-components/{CaptionDetails-DMRWmtaY.mjs → CaptionDetails-Bxz8AXMz.mjs} +1 -1
  73. package/dist/web-components/ChaptersMenu-CMQiBqvx.mjs +1 -0
  74. package/dist/web-components/{Chevron-DFGbSGPI.mjs → Chevron-B3XaClVT.mjs} +1 -1
  75. package/dist/web-components/{ChoiceMenu-C80kdxvq.mjs → ChoiceMenu-pugo5zxI.mjs} +1 -1
  76. package/dist/web-components/{Collection-B4CxBsFL.mjs → Collection-Ch_FeSKp.mjs} +1 -1
  77. package/dist/web-components/{CollectionSelect-DO8YO2p7.mjs → CollectionSelect-2jDEkOcK.mjs} +1 -1
  78. package/dist/web-components/{Connected-DthCPaHl.mjs → Connected-3hnIPSWM.mjs} +1 -1
  79. package/dist/web-components/{Connected-sYBn_9MK.mjs → Connected-Bne3I5E1.mjs} +1 -1
  80. package/dist/web-components/{Connected-CcbVqzmj.mjs → Connected-DuANHN93.mjs} +1 -1
  81. package/dist/web-components/{Contents-AVPYYXht.mjs → Contents-DIQrin_-.mjs} +1 -1
  82. package/dist/web-components/ControlMenu-BydnCTTQ.mjs +1 -0
  83. package/dist/web-components/ControlsFade-CleBsk-W.mjs +1 -0
  84. package/dist/web-components/CountMenu-CReBYVwu.mjs +1 -0
  85. package/dist/web-components/Cue-2zGQuUOC.mjs +1 -0
  86. package/dist/web-components/Document-pjc2qOX4.mjs +1 -0
  87. package/dist/web-components/{DomLayers-DlRapZ1u.mjs → DomLayers-D9X_FPto.mjs} +1 -1
  88. package/dist/web-components/{Download-Ci_JUTVd.mjs → Download-B8MpVqgk.mjs} +1 -1
  89. package/dist/web-components/{EntryBodies-C0ICfS2R.mjs → EntryBodies-DdpRfU5U.mjs} +1 -1
  90. package/dist/web-components/{EntryThumbnail-DxHhfRo_.mjs → EntryThumbnail-DM7Zjj1z.mjs} +1 -1
  91. package/dist/web-components/{FieldPill-CVfeeafm.mjs → FieldPill-BAql8_6s.mjs} +1 -1
  92. package/dist/web-components/{FrameAnimation-AZpVvu0R.mjs → FrameAnimation-Dj46RxuL.mjs} +1 -1
  93. package/dist/web-components/Gallery-B9FNA02Z.mjs +1 -0
  94. package/dist/web-components/{HideToggle-0nlIo-f8.mjs → HideToggle-duXvDvDw.mjs} +1 -1
  95. package/dist/web-components/ImageControls-DODKjC0d.mjs +1 -0
  96. package/dist/web-components/{Items-Drd82_Jj.mjs → Items-BHTQJU7T.mjs} +1 -1
  97. package/dist/web-components/{Label-BIjqJ-_T.mjs → Label-D4dlrtpH.mjs} +1 -1
  98. package/dist/web-components/{LanguageChoice-DkSc-n6g.mjs → LanguageChoice-DR3X-dtJ.mjs} +1 -1
  99. package/dist/web-components/LightboxView-D-aBaKfB.mjs +1 -0
  100. package/dist/web-components/{ListEnd-pq-BgaDI.mjs → ListEnd-CQ4vX-NW.mjs} +1 -1
  101. package/dist/web-components/{Loaded-CSO5NFhm.mjs → Loaded-DsNSPXWf.mjs} +1 -1
  102. package/dist/web-components/{LoadedCanvas-DK6xMmM1.mjs → LoadedCanvas-Cq7_O2bw.mjs} +1 -1
  103. package/dist/web-components/LoadedMap-0_prxuA4.mjs +1 -0
  104. package/dist/web-components/{Loading-CoJLSRkv.mjs → Loading-4PmhMeZ-.mjs} +1 -1
  105. package/dist/web-components/{Map-BEVtD52O.mjs → Map-B29Ba50b.mjs} +1 -1
  106. package/dist/web-components/MapView-nHeg39Kz.mjs +3 -0
  107. package/dist/web-components/Markup-BZ7l5GbG.mjs +2 -0
  108. package/dist/web-components/MediaBody-DH-rr_0N.mjs +1 -0
  109. package/dist/web-components/{MediaBody-Co23JjUJ.mjs → MediaBody-eSThjFzH.mjs} +1 -1
  110. package/dist/web-components/{NavDate-CYNK0Qmp.mjs → NavDate-0MsHRjBW.mjs} +1 -1
  111. package/dist/web-components/{Navigator-DrYPepzN.mjs → Navigator-qJ79A8Nk.mjs} +1 -1
  112. package/dist/web-components/{Pager-CN4lHURv.mjs → Pager-SPd_u0qz.mjs} +1 -1
  113. package/dist/web-components/{PagerLayout-DeqnSQcF.mjs → PagerLayout-CkSwDAnp.mjs} +1 -1
  114. package/dist/web-components/{Panel-CFYUlXup.mjs → Panel-C8r3EsWn.mjs} +1 -1
  115. package/dist/web-components/PanelPart-BA1NoeLA.mjs +1 -0
  116. package/dist/web-components/{PanelToggle-9ud55NNI.mjs → PanelToggle-CrKP8BqE.mjs} +1 -1
  117. package/dist/web-components/{PartOfManifest-KUHUq-6q.mjs → PartOfManifest-BdDSxK4k.mjs} +1 -1
  118. package/dist/web-components/{Pending-mcmdyZPA.mjs → Pending-CmgVU1kF.mjs} +1 -1
  119. package/dist/web-components/{PlaceBox-DX4ZLDat.mjs → PlaceBox-D7HLNGxE.mjs} +1 -1
  120. package/dist/web-components/Placeholder-DVAlXejQ.mjs +1 -0
  121. package/dist/web-components/{Position-DO5qg5Sp.mjs → Position-C6KUAceQ.mjs} +1 -1
  122. package/dist/web-components/{Primitives-c9sIz0oQ.mjs → Primitives-ClQVjY6x.mjs} +1 -1
  123. package/dist/web-components/{Provider-a3xY016W.mjs → Provider-C0IUdU6v.mjs} +1 -1
  124. package/dist/web-components/{ReadMore-D_WmmKEP.mjs → ReadMore-BiEJA4yO.mjs} +1 -1
  125. package/dist/web-components/Root-Drt5N4_s.mjs +1 -0
  126. package/dist/web-components/Scene-C7t16NjC.mjs +1 -0
  127. package/dist/web-components/SceneView-BHg37-rs.mjs +1 -0
  128. package/dist/web-components/{Search-BgxEW1UT.mjs → Search-Bpd_lGzH.mjs} +1 -1
  129. package/dist/web-components/{Sections-DZVrhoAC.mjs → Sections-D_bS5IQH.mjs} +1 -1
  130. package/dist/web-components/{StandaloneItems-6cSw7nbF.mjs → StandaloneItems-YV9O9M8F.mjs} +1 -1
  131. package/dist/web-components/{Status-DHTzuTkh.mjs → Status-BCG7AN9B.mjs} +1 -1
  132. package/dist/web-components/{Steps-Dkpy9KiJ.mjs → Steps-Dnn8Ajqf.mjs} +1 -1
  133. package/dist/web-components/TargetItems-xxbtePln.mjs +1 -0
  134. package/dist/web-components/Timeline-Danuk_Nn.mjs +1 -0
  135. package/dist/web-components/Tip-DPFWlNLu.mjs +1 -0
  136. package/dist/web-components/{Transcript-WvFFAJQM.mjs → Transcript-C-_DbUO5.mjs} +1 -1
  137. package/dist/web-components/{Transport-FxLp_bdW.mjs → Transport-BKona8RD.mjs} +1 -1
  138. package/dist/web-components/Transport-Bonmu77-.mjs +1 -0
  139. package/dist/web-components/{annotation-collection-BkC3nBPA.mjs → annotation-collection-nmxzo_hO.mjs} +1 -1
  140. package/dist/web-components/{annotation-name-Du2KAWoD.mjs → annotation-name-DoUUo-8D.mjs} +1 -1
  141. package/dist/web-components/{annotations-content-CEzAS-P2.mjs → annotations-content-Cl1upbdd.mjs} +1 -1
  142. package/dist/web-components/{body-DPlfbLt3.mjs → body-DC8Oq8rY.mjs} +1 -1
  143. package/dist/web-components/{canvas-BUwBftJW.mjs → canvas-gzoTnBxw.mjs} +1 -1
  144. package/dist/web-components/{cloverEngine-UNw5K4Xg.mjs → cloverEngine-CFL1Bd7n.mjs} +1 -1
  145. package/dist/web-components/{content-state-reader-GgQF2MvJ.mjs → content-state-reader-DYbmXxCp.mjs} +1 -1
  146. package/dist/web-components/controlGlyphs-d7KUIUwi.mjs +1 -0
  147. package/dist/web-components/{controls-CC9G5LxK.mjs → controls-VC9D1mwr.mjs} +1 -1
  148. package/dist/web-components/custom-elements.json +10 -2
  149. package/dist/web-components/{downloads-CmAYeEIz.mjs → downloads-D2cnWDbs.mjs} +1 -1
  150. package/dist/web-components/{dragToClose-DK-eM097.mjs → dragToClose-CzYeh_12.mjs} +1 -1
  151. package/dist/web-components/{engine-Dok0z8WP.mjs → engine-Dcfyp2DV.mjs} +1 -1
  152. package/dist/web-components/{engines-BD2IfwQF.mjs → engines-BMr7naGM.mjs} +1 -1
  153. package/dist/web-components/{fetchManifest-tQXcfFiz.mjs → fetchManifest-DxptUh4u.mjs} +1 -1
  154. package/dist/web-components/{fromManifest-BwQdeAuL.mjs → fromManifest-BpPFLVyZ.mjs} +1 -1
  155. package/dist/web-components/{glyphs-dp_HK3Ja.mjs → glyphs-BCnJl8py.mjs} +1 -1
  156. package/dist/web-components/hooks-Dz_5UXXp.mjs +1 -0
  157. package/dist/web-components/{image-layers-xcBsiad9.mjs → image-layers-BPnq7jk1.mjs} +1 -1
  158. package/dist/web-components/{imageService-4sFnmAFX.mjs → imageService-DFPkPNfe.mjs} +1 -1
  159. package/dist/web-components/index-ClM6Kq8w.mjs +1 -0
  160. package/dist/web-components/index.d.mts +4 -2
  161. package/dist/web-components/index.mjs +1 -1
  162. package/dist/web-components/items-BHporT5i.mjs +1 -0
  163. package/dist/web-components/{items-BUmOy2QY.mjs → items-D03KhDg6.mjs} +1 -1
  164. package/dist/web-components/label-r0ki6r1U.mjs +1 -0
  165. package/dist/web-components/{layout-B29v2RKK.mjs → layout-DVa_DnGH.mjs} +1 -1
  166. package/dist/web-components/{link-Ct5PpHEY.mjs → link-DxXxMXiw.mjs} +1 -1
  167. package/dist/web-components/logo-Br42Vlsk.mjs +1 -0
  168. package/dist/web-components/maplibre-sheet-CfiZ6JFk.mjs +1 -0
  169. package/dist/web-components/masonry-BZCdA3bV.mjs +1 -0
  170. package/dist/web-components/{models-BXcT4ijX.mjs → models-pO77sm3z.mjs} +1 -1
  171. package/dist/web-components/{nodes-BleXuYE6.mjs → nodes-CmL3eoRE.mjs} +1 -1
  172. package/dist/web-components/{overlayImage-BJtfot4Y.mjs → overlayImage-DFGetjMh.mjs} +1 -1
  173. package/dist/web-components/{panel-BxxV_JkD.mjs → panel-B1vzUm6_.mjs} +1 -1
  174. package/dist/web-components/part-DmRBh4pf.mjs +1 -0
  175. package/dist/web-components/{playerSurface-BXNLaFk0.mjs → playerSurface-CQ1wrIAQ.mjs} +1 -1
  176. package/dist/web-components/pointer-DWnCT3D3.mjs +1 -0
  177. package/dist/web-components/{provider-CPp0Sgr_.mjs → provider-U7xzX_0T.mjs} +1 -1
  178. package/dist/web-components/{range-regions-DAaOu0IS.mjs → range-regions-Di_lmVqZ.mjs} +1 -1
  179. package/dist/web-components/{read-more-lcqGslUd.mjs → read-more-BtA1sriO.mjs} +1 -1
  180. package/dist/web-components/{readingLanguages-FyVsSWJ8.mjs → readingLanguages-Ptho-Co9.mjs} +1 -1
  181. package/dist/web-components/rendererSurface-BgZPnAwj.mjs +22 -0
  182. package/dist/web-components/{renderers-BFS7hFVU.mjs → renderers-hoD3WKYA.mjs} +1 -1
  183. package/dist/web-components/{resource-Bufu7lAr.mjs → resource-DuTMsPEj.mjs} +1 -1
  184. package/dist/web-components/{sanitize-qIOeyIww.mjs → sanitize-BedC_UE5.mjs} +3 -3
  185. package/dist/web-components/{save-file-CoknKOPz.mjs → save-file-CLB5IM4a.mjs} +1 -1
  186. package/dist/web-components/{search-5ocrsYmT.mjs → search-Dd2Y1dsZ.mjs} +1 -1
  187. package/dist/web-components/shared-CCg1Iag8.mjs +1 -0
  188. package/dist/web-components/{show-link-DBaJj4s_.mjs → show-link-NjacLIdz.mjs} +1 -1
  189. package/dist/web-components/{sizedImage-jnOGcIIZ.mjs → sizedImage-CKOGmqhN.mjs} +1 -1
  190. package/dist/web-components/{split-P6J0qqf5.mjs → split-CcoXZcGX.mjs} +1 -1
  191. package/dist/web-components/{status-honoOMNx.mjs → status-B4a3Izph.mjs} +1 -1
  192. package/dist/web-components/styles-C7PVxtkQ.mjs +1 -0
  193. package/dist/web-components/svg-shape-D1K-WNrY.mjs +1 -0
  194. package/dist/web-components/three.mjs +1 -1
  195. package/dist/web-components/thumbnail-ez20ssEY.mjs +1 -0
  196. package/dist/web-components/{tip-BhNI83aT.mjs → tip-DeFPN33O.mjs} +1 -1
  197. package/dist/web-components/{toggle-CJKdi5KH.mjs → toggle-CGSnnjW-.mjs} +1 -1
  198. package/dist/web-components/trusted-Bvpx307M.mjs +1 -0
  199. package/dist/web-components/{useContainerName-_48Cdi0m.mjs → useContainerName-BfyeBf6_.mjs} +1 -1
  200. package/dist/web-components/{useControlsVisibility-CieBxGnK.mjs → useControlsVisibility-oRiMiQhD.mjs} +1 -1
  201. package/dist/web-components/useLazyPanelPane-CReKsr8z.mjs +1 -0
  202. package/dist/web-components/{useNearViewport-B34ebmIW.mjs → useNearViewport-BADiMpLi.mjs} +1 -1
  203. package/dist/web-components/{useScrollTrack-DgRGFeP5.mjs → useScrollTrack-9QsMaHSx.mjs} +1 -1
  204. package/dist/web-components/viewer/{AnnotationItems-BNA_92Dv.mjs → AnnotationItems-Cvh3jfmf.mjs} +1 -1
  205. package/dist/web-components/viewer/{AnnotationMenu-BIQYVR4N.mjs → AnnotationMenu-d5PT7q8D.mjs} +1 -1
  206. package/dist/web-components/viewer/{AnnotationState-BbwQqA1U.mjs → AnnotationState-DbtYTHMy.mjs} +1 -1
  207. package/dist/web-components/viewer/{Annotations-CZzOZAFP.mjs → Annotations-DKWYJOo2.mjs} +2 -2
  208. package/dist/web-components/viewer/{Annotations-P4XzAlNc.mjs → Annotations-D_wg4O99.mjs} +1 -1
  209. package/dist/web-components/viewer/{Canvas2DBackend-DFfCzyjL.mjs → Canvas2DBackend-B4IXvdsN.mjs} +1 -1
  210. package/dist/web-components/viewer/{CaptionDetails-DPtE-RQQ.mjs → CaptionDetails-Bxh9VD7n.mjs} +1 -1
  211. package/dist/web-components/viewer/ChaptersMenu-CaAIaRZN.mjs +1 -0
  212. package/dist/web-components/viewer/{ChoiceMenu-GkqyTQRQ.mjs → ChoiceMenu-Clp4Zeog.mjs} +1 -1
  213. package/dist/web-components/viewer/{Collection-DjY_6qa6.mjs → Collection-C5BfoUOH.mjs} +1 -1
  214. package/dist/web-components/viewer/{Connected-DIOuI3Mv.mjs → Connected-9VGl2Xnx.mjs} +1 -1
  215. package/dist/web-components/viewer/{Connected-D5T-mtiy.mjs → Connected-Cd2qwuuo.mjs} +1 -1
  216. package/dist/web-components/viewer/{Contents-DV-VxXuf.mjs → Contents-CsG9e7v2.mjs} +1 -1
  217. package/dist/web-components/viewer/ControlMenu-q_u_UC8q.mjs +1 -0
  218. package/dist/web-components/viewer/ControlsFade-Db3IWArv.mjs +1 -0
  219. package/dist/web-components/viewer/CountMenu-Dn0-z5A9.mjs +1 -0
  220. package/dist/web-components/viewer/Cue-slOJQhPI.mjs +1 -0
  221. package/dist/web-components/viewer/Document-r3Sz3RfH.mjs +1 -0
  222. package/dist/web-components/viewer/{DomLayers-BCwCxPDU.mjs → DomLayers-CwHg1jZg.mjs} +1 -1
  223. package/dist/web-components/viewer/{Download-CL4IClAD.mjs → Download-Clx_e2ga.mjs} +1 -1
  224. package/dist/web-components/viewer/{EntryBodies-e40y47bl.mjs → EntryBodies-B4SnV6NJ.mjs} +1 -1
  225. package/dist/web-components/viewer/{EntryThumbnail-B_dP3w4o.mjs → EntryThumbnail-CsAqKh38.mjs} +1 -1
  226. package/dist/web-components/viewer/{FieldPill-Hse1cDBE.mjs → FieldPill-NQfq8SXA.mjs} +1 -1
  227. package/dist/web-components/viewer/{FrameAnimation-CE218DCr.mjs → FrameAnimation-wN2VNW7D.mjs} +1 -1
  228. package/dist/web-components/viewer/Gallery-nX9kQlft.mjs +1 -0
  229. package/dist/web-components/viewer/{HideToggle-CYoqe_ez.mjs → HideToggle-B843JuKU.mjs} +1 -1
  230. package/dist/web-components/viewer/ImageControls--qeUY5kg.mjs +1 -0
  231. package/dist/web-components/viewer/{LanguageChoice-BmO-322r.mjs → LanguageChoice-CZ6K3Mhv.mjs} +1 -1
  232. package/dist/web-components/viewer/LightboxView-BcbP3cJD.mjs +1 -0
  233. package/dist/web-components/viewer/{ListEnd-DX1jsvJk.mjs → ListEnd-DbYDv46a.mjs} +1 -1
  234. package/dist/web-components/viewer/MapView-Dj7Iq7P2.mjs +3 -0
  235. package/dist/web-components/viewer/MediaBody-TN4XsCm7.mjs +1 -0
  236. package/dist/web-components/viewer/{MediaBody-SkIgrEMj.mjs → MediaBody-iAxGgXNy.mjs} +1 -1
  237. package/dist/web-components/viewer/{NavDate-BZgeaMG9.mjs → NavDate-Clj6OMa6.mjs} +1 -1
  238. package/dist/web-components/viewer/{Navigator-Co76p-1n.mjs → Navigator-DPdR3SYX.mjs} +1 -1
  239. package/dist/web-components/viewer/{PagerLayout-tUkN1-FV.mjs → PagerLayout-CtlmDRjI.mjs} +1 -1
  240. package/dist/web-components/viewer/PanelPart-DzZWRlK1.mjs +1 -0
  241. package/dist/web-components/viewer/{PartOfManifest-DXnbEPzS.mjs → PartOfManifest-NAXs2DYd.mjs} +1 -1
  242. package/dist/web-components/viewer/{PlaceBox-xrJ4CGdN.mjs → PlaceBox-C2k5Fsfo.mjs} +1 -1
  243. package/dist/web-components/viewer/Placeholder-DF6dRMjt.mjs +1 -0
  244. package/dist/web-components/viewer/{Search-DTg1cHZ3.mjs → Search-DoUc8tWu.mjs} +1 -1
  245. package/dist/web-components/viewer/{StandaloneItems-BpBEQG8i.mjs → StandaloneItems-DuXasJO0.mjs} +1 -1
  246. package/dist/web-components/viewer/{Steps-SpwMQdCL.mjs → Steps-B3MrG4Cv.mjs} +1 -1
  247. package/dist/web-components/viewer/TargetItems-DOFSQtYR.mjs +1 -0
  248. package/dist/web-components/viewer/{Transcript-rTAhuXCF.mjs → Transcript-Dy-FHWMo.mjs} +1 -1
  249. package/dist/web-components/viewer/Transport-C5wkxVOF.mjs +1 -0
  250. package/dist/web-components/viewer/{Transport-vKIDALE-.mjs → Transport-CUXmY_jW.mjs} +1 -1
  251. package/dist/web-components/viewer/{annotation-collection-B7pZiLVk.mjs → annotation-collection-A0PNdPhI.mjs} +1 -1
  252. package/dist/web-components/viewer/annotation-name-CfQs7Mb2.mjs +1 -0
  253. package/dist/web-components/viewer/{annotations-content-9AtLlPNn.mjs → annotations-content-B52-zM99.mjs} +1 -1
  254. package/dist/web-components/viewer/{cloverEngine-jRrYLrWa.mjs → cloverEngine-4sgpB7Rz.mjs} +1 -1
  255. package/dist/web-components/viewer/{content-state-reader-CPvkju6Q.mjs → content-state-reader-vtATl-W3.mjs} +1 -1
  256. package/dist/web-components/viewer/{dragToClose-Co9kGk9q.mjs → dragToClose-B4rj1D3r.mjs} +1 -1
  257. package/dist/web-components/viewer/{fetchManifest-D7N9WhhF.mjs → fetchManifest-gAj8phm4.mjs} +1 -1
  258. package/dist/web-components/viewer/{host-DMD9LE4H.mjs → host-Hv8WXfiF.mjs} +1 -1
  259. package/dist/web-components/viewer/{image-layers-x_shzPvu.mjs → image-layers-gFEDKVkV.mjs} +1 -1
  260. package/dist/web-components/viewer/index.mjs +1 -1
  261. package/dist/web-components/viewer/{link-DikPGzNO.mjs → link-DIh6ysyo.mjs} +1 -1
  262. package/dist/web-components/viewer/{overlayImage-33kKKB0T.mjs → overlayImage-BRjcH40Q.mjs} +1 -1
  263. package/dist/web-components/viewer/{range-regions-TH6WWGTT.mjs → range-regions-uPqjKIER.mjs} +1 -1
  264. package/dist/web-components/viewer/{renderers-BxePmixF.mjs → renderers-C5EfPrd7.mjs} +1 -1
  265. package/dist/web-components/viewer/{save-file-QXKiPlST.mjs → save-file-dIa0LCAn.mjs} +1 -1
  266. package/dist/web-components/viewer/{search-B_NePyas.mjs → search-Bbv9dCNq.mjs} +1 -1
  267. package/dist/web-components/viewer/styles-L1HpSoL2.mjs +1 -0
  268. package/dist/web-components/viewer/{useControlsVisibility-Cu-jTDzs.mjs → useControlsVisibility-jopIdHZi.mjs} +1 -1
  269. package/dist/web-components/viewer/useLazyPanelPane-CoPgtYkx.mjs +1 -0
  270. package/dist/web-components/viewer/viewer-DqpSyvH-.mjs +29 -0
  271. package/dist/web-components/viewer/vtt-DpgB_K8v.mjs +5 -0
  272. package/dist/web-components/viewer-D2lGdifc.mjs +1 -0
  273. package/dist/web-components/vtt-KUQbi4PK.mjs +5 -0
  274. package/dist/web-components/worker-C9aVbya_.mjs +1 -0
  275. package/package.json +2 -1
  276. package/dist/web-components/Button-Cx6VE_UW.mjs +0 -1
  277. package/dist/web-components/CanvasView-DxZASM9E.mjs +0 -2
  278. package/dist/web-components/ChaptersMenu-BAZVVDrK.mjs +0 -1
  279. package/dist/web-components/ControlMenu-BjJsWnuZ.mjs +0 -1
  280. package/dist/web-components/ControlsFade-C-6WhSxB.mjs +0 -1
  281. package/dist/web-components/CountMenu-Dx8D_RJZ.mjs +0 -1
  282. package/dist/web-components/Cue-xuo5dgKE.mjs +0 -1
  283. package/dist/web-components/Document-BWdafeEi.mjs +0 -1
  284. package/dist/web-components/Gallery-C2PTJmvN.mjs +0 -1
  285. package/dist/web-components/ImageControls-tKVAMpaj.mjs +0 -1
  286. package/dist/web-components/LightboxView-Cuqx2H1m.mjs +0 -1
  287. package/dist/web-components/LoadedMap-DmPH-LKY.mjs +0 -1
  288. package/dist/web-components/MapView-DHJcn9gW.mjs +0 -3
  289. package/dist/web-components/Markup-Hm6bWOjm.mjs +0 -2
  290. package/dist/web-components/MediaBody-BpgNtpKZ.mjs +0 -1
  291. package/dist/web-components/PanelPart-CpUIRbxr.mjs +0 -1
  292. package/dist/web-components/Placeholder-0hE8q-SY.mjs +0 -1
  293. package/dist/web-components/Root-CU1o0wje.mjs +0 -1
  294. package/dist/web-components/Scene-CboEeptc.mjs +0 -1
  295. package/dist/web-components/SceneView-hcc78jQT.mjs +0 -1
  296. package/dist/web-components/TargetItems-CyOI9_Z4.mjs +0 -1
  297. package/dist/web-components/Timeline-B9tD3Rar.mjs +0 -1
  298. package/dist/web-components/Tip-nJSTYquc.mjs +0 -1
  299. package/dist/web-components/hooks-C4dJ5K_D.mjs +0 -1
  300. package/dist/web-components/index-DspT4wUm.mjs +0 -1
  301. package/dist/web-components/items-CWMI53aN.mjs +0 -1
  302. package/dist/web-components/label-BGjL7I4b.mjs +0 -1
  303. package/dist/web-components/logo-BFstM-0a.mjs +0 -1
  304. package/dist/web-components/masonry-0QfzOgbB.mjs +0 -1
  305. package/dist/web-components/part-D4gjnYmT.mjs +0 -1
  306. package/dist/web-components/pointer-CJELU3gI.mjs +0 -1
  307. package/dist/web-components/rendererSurface-nh6-EfuZ.mjs +0 -22
  308. package/dist/web-components/shared-DFAX0n3B.mjs +0 -1
  309. package/dist/web-components/styles-BwkYiCLC.mjs +0 -1
  310. package/dist/web-components/svg-shape-DLY3g7oq.mjs +0 -1
  311. package/dist/web-components/thumbnail-EbURh-UM.mjs +0 -1
  312. package/dist/web-components/useLazyPanelPane-Da3kJiOt.mjs +0 -1
  313. package/dist/web-components/viewer/ChaptersMenu-D6Jmujag.mjs +0 -1
  314. package/dist/web-components/viewer/ControlMenu-BsEpff6N.mjs +0 -1
  315. package/dist/web-components/viewer/ControlsFade-BowtN96W.mjs +0 -1
  316. package/dist/web-components/viewer/CountMenu-DCmA6HdK.mjs +0 -1
  317. package/dist/web-components/viewer/Cue-BjbVzrpl.mjs +0 -1
  318. package/dist/web-components/viewer/Document-4ZQd3W3o.mjs +0 -1
  319. package/dist/web-components/viewer/Gallery-F2sVj4ph.mjs +0 -1
  320. package/dist/web-components/viewer/ImageControls-C2G4x2Es.mjs +0 -1
  321. package/dist/web-components/viewer/LightboxView-DKR8dXcg.mjs +0 -1
  322. package/dist/web-components/viewer/MapView-Df0wZjCh.mjs +0 -3
  323. package/dist/web-components/viewer/MediaBody-CataNonO.mjs +0 -1
  324. package/dist/web-components/viewer/PanelPart-Cl4Sst60.mjs +0 -1
  325. package/dist/web-components/viewer/Placeholder-B1AcizHL.mjs +0 -1
  326. package/dist/web-components/viewer/TargetItems-B6Icep5k.mjs +0 -1
  327. package/dist/web-components/viewer/Transport-z_kdVisw.mjs +0 -1
  328. package/dist/web-components/viewer/annotation-name-BKj1O9lA.mjs +0 -1
  329. package/dist/web-components/viewer/styles-Bedyz7_l.mjs +0 -1
  330. package/dist/web-components/viewer/useLazyPanelPane-BhLtRixT.mjs +0 -1
  331. package/dist/web-components/viewer/viewer-nfPJPwwt.mjs +0 -29
  332. package/dist/web-components/viewer/vtt-CUn4h5JB.mjs +0 -5
  333. package/dist/web-components/viewer-DN2Mo3vc.mjs +0 -1
  334. package/dist/web-components/vtt-C5M5WPSG.mjs +0 -5
  335. package/dist/web-components/worker-CjXN0dku.mjs +0 -1
package/README.md CHANGED
@@ -94,7 +94,7 @@ If you serve Clover's files yourself, copy the whole `dist/web-components` folde
94
94
  | ------------------------------------- | ------------------------------------------------------------------------------------- |
95
95
  | `@nulib/clover` | The Viewer (the default export), and every part, hook and helper (named). |
96
96
  | `@nulib/clover/templates` | The templates: `Default`, `Document` and `Gallery`. |
97
- | `@nulib/clover/map` | `Map`, for navPlace and georeferenced images. The Viewer adds its Map tab itself. |
97
+ | `@nulib/clover/map` | `Map` and its helpers, as `@nulib/clover` exports them (`Clover.Map`). |
98
98
  | `@nulib/clover/three` | `registerThreeEngine`, to draw a Scene with three.js, which you install. |
99
99
  | `@nulib/clover/web-components` | `<clover-viewer>`, and every part as an element. |
100
100
  | `@nulib/clover/web-components/viewer` | `<clover-viewer>` alone, for a page that shows a Viewer and nothing else of Clover's. |
@@ -2,7 +2,7 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import React, { useRef, useState, useMemo, useEffect, useCallback, useLayoutEffect, Suspense, lazy } from "react";
4
4
  import Caption, { hasInformation, captionLabelId } from "../Body/Caption.mjs";
5
- import Controls from "./Controls.mjs";
5
+ import Controls, { NO_LIMITS } from "./Controls.mjs";
6
6
  import { findChoices, startingChoices, animationFrames, canvasScene, paintedType, placeholderStill, frameKey, canvasSize, canvasRectToWorld } from "./layout.mjs";
7
7
  import ExitFullscreen from "../../ui/ExitFullscreen.mjs";
8
8
  import { useNearViewport } from "../Body/useNearViewport.mjs";
@@ -24,12 +24,15 @@ import { HostLanguageContext } from "../../i18n/hostLanguage.mjs";
24
24
  import { useRootLanguage } from "../../i18n/useRootLanguage.mjs";
25
25
  import { useContainerName } from "../../i18n/useContainerName.mjs";
26
26
  import { union } from "../../lib/renderer/math/rect.mjs";
27
- import { findImageServiceId } from "../../lib/renderer/sources/imageService.mjs";
27
+ import { findImageServiceId, fetchInfo } from "../../lib/renderer/sources/imageService.mjs";
28
28
  import { hasCamera } from "./surface.mjs";
29
29
  import { languageProps } from "../../i18n/direction.mjs";
30
- import { buildContentState } from "../../core/content-state.mjs";
31
30
  import { useContentStateOutput, watchMedia } from "../../react/useContentStateOutput.mjs";
32
31
  import { resolveDirection } from "../../core/sequence.mjs";
32
+ let writeContentState;
33
+ const loadContentState = () => import("../../core/content-state.mjs").then((module) => {
34
+ writeContentState = module.buildContentState;
35
+ });
33
36
  const MediaBody = lazy(() => import("./media/MediaBody.mjs"));
34
37
  const loadHotspots = () => import("./AnnotationState.mjs");
35
38
  const NO_COMMENTS = /* @__PURE__ */ new Map();
@@ -166,6 +169,7 @@ const CanvasBody = (props) => {
166
169
  const [status, setStatus] = useState("loading");
167
170
  const [unloadable, setUnloadable] = useState(false);
168
171
  const [sceneVersion, setSceneVersion] = useState(0);
172
+ const [viewLimits, setViewLimits] = useState(NO_LIMITS);
169
173
  const onReadyRef = useRef(onReady);
170
174
  const onViewportChangeRef = useRef(onViewportChange);
171
175
  const optionsRef = useRef(options);
@@ -309,6 +313,15 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
309
313
  const [imagesOpen, setImagesOpen] = useState(false);
310
314
  const [mediaOpenedFor, setMediaOpenedFor] = useState(null);
311
315
  const showPlaceholder = !player && stills.length > 0 && (media ? mediaOpenedFor !== canvasKey : !imagesOpen);
316
+ const stillsRequest = options == null ? void 0 : options.request;
317
+ useEffect(() => {
318
+ if (!showPlaceholder) return;
319
+ void import("../../core/thumbnail.mjs");
320
+ for (const { source } of stills)
321
+ if (source.service)
322
+ fetchInfo(source.service, { request: stillsRequest }).catch(() => {
323
+ });
324
+ }, [showPlaceholder, stills, stillsRequest]);
312
325
  const onlyInformation = (config, { annotations = false, fullPage = false } = {}) => ({
313
326
  ...config,
314
327
  zoom: false,
@@ -410,7 +423,11 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
410
423
  const region = !time && surface2 && hasCamera(surface2) ? canvasRegion(surface2.getBounds(), shown.canvases, shown.placements) : null;
411
424
  const canvas = shown.canvases.find((each) => each.id === (region == null ? void 0 : region.canvasId)) ?? shown.canvases[0];
412
425
  if (!canvas) return null;
413
- return buildContentState({
426
+ if (!writeContentState) {
427
+ void loadContentState().then(() => contentStateChanged());
428
+ return null;
429
+ }
430
+ return writeContentState({
414
431
  manifestId,
415
432
  canvasId: canvas.id,
416
433
  type: canvas.type,
@@ -435,8 +452,16 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
435
452
  surfaceRef.current = surface2;
436
453
  setSurface(surface2);
437
454
  surface2.setDismiss(releaseAnnotation);
455
+ const readLimits = () => {
456
+ if (!renderer2) return;
457
+ const next = renderer2.viewLimits();
458
+ setViewLimits(
459
+ (last) => last.atMax === next.atMax && last.atMin === next.atMin && last.atHome === next.atHome ? last : next
460
+ );
461
+ };
438
462
  const offOpen = surface2.on("open", () => {
439
463
  var _a2;
464
+ readLimits();
440
465
  setCleared(false);
441
466
  markDrawn();
442
467
  contentStateChanged();
@@ -464,6 +489,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
464
489
  );
465
490
  });
466
491
  const offChange = surface2.on("change", () => {
492
+ readLimits();
467
493
  setCleared(false);
468
494
  markDrawn();
469
495
  contentStateChanged();
@@ -479,6 +505,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
479
505
  );
480
506
  const offViewport = surface2.on("viewport", () => {
481
507
  var _a2;
508
+ readLimits();
482
509
  if (renderer2) (_a2 = onViewportChangeRef.current) == null ? void 0 : _a2.call(onViewportChangeRef, renderer2.getBounds());
483
510
  contentStateChanged();
484
511
  });
@@ -594,10 +621,12 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
594
621
  instance,
595
622
  config: shownControls ?? NO_CONTROLS,
596
623
  controlButtons,
624
+ limits: viewLimits,
597
625
  placeholderIsMore: cornerToggle && !media,
598
626
  chapters: media ? chapters : void 0,
599
627
  mediaElement,
600
628
  onChapter: goToChapter,
629
+ overStill: Boolean(media) && showPlaceholder,
601
630
  request: options == null ? void 0 : options.request,
602
631
  placeholder: cornerToggle && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
603
632
  PlaceholderToggle,
@@ -15,6 +15,7 @@ const ChaptersMenu = ({
15
15
  chapters,
16
16
  element,
17
17
  onChapter,
18
+ overStill = false,
18
19
  request,
19
20
  onClose
20
21
  }) => {
@@ -59,7 +60,11 @@ const ChaptersMenu = ({
59
60
  type: "radio",
60
61
  name: id,
61
62
  checked: index === current,
62
- onChange: () => go(index),
63
+ onChange: () => {
64
+ if (overStill && !pointer.current)
65
+ setTime(chapters[index].start);
66
+ else go(index);
67
+ },
63
68
  onClick: () => {
64
69
  if (pointer.current) onClose(true);
65
70
  },
@@ -48,8 +48,15 @@ const ControlMenu = ({
48
48
  const inside2 = Boolean(
49
49
  ((_a = ref.current) == null ? void 0 : _a.contains(active)) || ((_b = document.getElementById(triggerId)) == null ? void 0 : _b.contains(active))
50
50
  );
51
- if (inside2) event.preventDefault();
52
- onClose(inside2);
51
+ if (inside2) {
52
+ event.preventDefault();
53
+ onClose(true);
54
+ return;
55
+ }
56
+ const after = (late) => {
57
+ if (late === event && !event.defaultPrevented) onClose(false);
58
+ };
59
+ document.addEventListener("keydown", after, { once: true });
53
60
  };
54
61
  document.addEventListener("pointerdown", onPointerDown);
55
62
  document.addEventListener("keydown", onKeyDown, true);
@@ -26,11 +26,17 @@ const VIEW = /* @__PURE__ */ new Set([
26
26
  "reset",
27
27
  "fullPage"
28
28
  ]);
29
+ const NO_LIMITS = {
30
+ atMax: false,
31
+ atMin: false,
32
+ atHome: false
33
+ };
29
34
  const Controls = ({
30
35
  renderer,
31
36
  instance,
32
37
  config,
33
38
  controlButtons,
39
+ limits = NO_LIMITS,
34
40
  placeholder,
35
41
  placeholderIsMore = false,
36
42
  choices = [],
@@ -40,6 +46,7 @@ const Controls = ({
40
46
  chapters = [],
41
47
  mediaElement = null,
42
48
  onChapter,
49
+ overStill,
43
50
  request,
44
51
  hiddenPages,
45
52
  onPageVisibilityChange,
@@ -168,6 +175,7 @@ const Controls = ({
168
175
  label: t("imageZoomIn"),
169
176
  lang: langOf("imageZoomIn"),
170
177
  glyph: /* @__PURE__ */ jsx(ZoomIn, {}),
178
+ unavailable: limits.atMax,
171
179
  onClick: () => camera.zoomBy(ZOOM_PER_CLICK)
172
180
  },
173
181
  {
@@ -177,6 +185,7 @@ const Controls = ({
177
185
  label: t("imageZoomOut"),
178
186
  lang: langOf("imageZoomOut"),
179
187
  glyph: /* @__PURE__ */ jsx(ZoomOut, {}),
188
+ unavailable: limits.atMin,
180
189
  onClick: () => camera.zoomBy(1 / ZOOM_PER_CLICK)
181
190
  }
182
191
  );
@@ -222,6 +231,7 @@ const Controls = ({
222
231
  label: t("imageResetZoom"),
223
232
  lang: langOf("imageResetZoom"),
224
233
  glyph: /* @__PURE__ */ jsx(Reset, {}),
234
+ unavailable: limits.atHome,
225
235
  // Home also turns the image upright, as `Image`'s reset does.
226
236
  onClick: () => camera.home()
227
237
  });
@@ -325,10 +335,10 @@ const Controls = ({
325
335
  const always = moreWhen === "always" || placeholderIsMore;
326
336
  const ImageControls = (_d = useLoaded(
327
337
  loadImageControls,
328
- fit && (always || !fits) && items.some((item) => item.view)
338
+ fit && (placeholderIsMore || (always || !fits) && items.some((item) => item.view))
329
339
  )) == null ? void 0 : _d.ImageControls;
330
340
  const tucked = fits && !always || !ImageControls ? [] : items.filter((item) => item.view);
331
- const deck = placeholderIsMore && tucked.length > 0;
341
+ const deck = placeholderIsMore && Boolean(placeholder) && Boolean(ImageControls);
332
342
  useEffect(() => {
333
343
  if (!tucked.length) setMoreOpen(false);
334
344
  }, [tucked.length]);
@@ -338,11 +348,11 @@ const Controls = ({
338
348
  return /* @__PURE__ */ jsxs(Fragment, { children: [
339
349
  /* @__PURE__ */ jsxs(ControlCluster, { fit, clusterRef: setCluster, children: [
340
350
  shown(lead),
341
- ImageControls && tucked.length > 0 && /* @__PURE__ */ jsx(
351
+ ImageControls && (tucked.length > 0 || deck) && /* @__PURE__ */ jsx(
342
352
  ImageControls,
343
353
  {
344
354
  instance,
345
- open: deck || moreOpen,
355
+ open: deck ? tucked.length > 0 : moreOpen,
346
356
  onOpenChange: setMoreOpen,
347
357
  toggle: deck ? placeholder : void 0,
348
358
  children: tucked.map(({ node }) => node)
@@ -358,6 +368,7 @@ const Controls = ({
358
368
  ids: items.map(({ id }) => id),
359
369
  more: `more-${instance}`,
360
370
  fits,
371
+ settled: fits || tucked.length > 0 || !items.some((item) => item.view),
361
372
  onFits: setFits
362
373
  }
363
374
  ),
@@ -371,6 +382,7 @@ const Controls = ({
371
382
  chapters,
372
383
  element: mediaElement,
373
384
  onChapter,
385
+ overStill,
374
386
  request,
375
387
  onClose: closeChapters
376
388
  }
@@ -408,5 +420,6 @@ const Controls = ({
408
420
  ] });
409
421
  };
410
422
  export {
423
+ NO_LIMITS,
411
424
  Controls as default
412
425
  };
@@ -19,6 +19,8 @@ import { PauseIcon, PlayIcon, VolumeMutedIcon, VolumeHighIcon } from "../../ui/m
19
19
  import { formatTime } from "../../lib/time.mjs";
20
20
  import { gapsOf, gapMask, alongBar, seekShare } from "./media/seekGaps.mjs";
21
21
  import { placeMenu } from "./media/placeMenu.mjs";
22
+ import { adoptSheet } from "../../ui/adoptSheet.mjs";
23
+ import __clover_sheet_media from "../../ui/sheets/media.mjs";
22
24
  const clockTime = (seconds, total) => total < 10 ? `${formatTime(seconds)}.${Math.min(9, Math.floor((seconds || 0) % 1 * 10))}` : formatTime(seconds);
23
25
  const focusVisible = (element) => {
24
26
  try {
@@ -736,6 +738,7 @@ function FrameAnimation({
736
738
  )
737
739
  ] });
738
740
  }
741
+ adoptSheet("media", __clover_sheet_media);
739
742
  export {
740
743
  FrameControls,
741
744
  clockTime,
@@ -7,7 +7,7 @@ import { useContainerName } from "../../i18n/useContainerName.mjs";
7
7
  import { useOneOpen } from "../../ui/useOneOpen.mjs";
8
8
  import { CloseViewer, OpenViewer } from "../Body/glyphs.mjs";
9
9
  import { languageProps } from "../../i18n/direction.mjs";
10
- import { Tip } from "../../ui/Tip.mjs";
10
+ import { placeTipAgain, Tip } from "../../ui/Tip.mjs";
11
11
  function overhang(list) {
12
12
  var _a, _b;
13
13
  const box = list.getBoundingClientRect();
@@ -90,14 +90,19 @@ function ImageControls({
90
90
  else if (under > 0) list2.scrollLeft -= Math.min(under, Math.max(left, 0));
91
91
  mark();
92
92
  };
93
+ const scrolled = () => {
94
+ mark();
95
+ const active = list2.ownerDocument.activeElement;
96
+ if (active && list2.contains(active)) placeTipAgain(active);
97
+ };
93
98
  mark();
94
- list2.addEventListener("scroll", mark, { passive: true });
99
+ list2.addEventListener("scroll", scrolled, { passive: true });
95
100
  list2.addEventListener("focusin", reveal);
96
101
  list2.addEventListener("animationend", mark);
97
102
  const resize = new ResizeObserver(() => mark());
98
103
  resize.observe(list2);
99
104
  return () => {
100
- list2.removeEventListener("scroll", mark);
105
+ list2.removeEventListener("scroll", scrolled);
101
106
  list2.removeEventListener("focusin", reveal);
102
107
  list2.removeEventListener("animationend", mark);
103
108
  resize.disconnect();
@@ -57,6 +57,8 @@ function PlaceholderToggle({
57
57
  id,
58
58
  label: t(toggleKey),
59
59
  lang: langOf(toggleKey),
60
+ expanded: more && !media ? !active : void 0,
61
+ controls: more && !media ? `more-${instance}-list` : void 0,
60
62
  onClick: (event) => {
61
63
  const focused = document.activeElement === event.currentTarget;
62
64
  const figure = event.currentTarget.closest(".clover-canvas");
@@ -100,12 +102,13 @@ const Placeholder = ({
100
102
  onToggle
101
103
  }
102
104
  ),
103
- (active || lingering) && /* @__PURE__ */ jsx(
105
+ (active || lingering || !media) && /* @__PURE__ */ jsx(
104
106
  "div",
105
107
  {
106
108
  "aria-hidden": active ? void 0 : true,
107
109
  className: "clover-canvas-placeholder",
108
- "data-lingering": !active,
110
+ "data-hidden": !active && !lingering,
111
+ "data-lingering": !active && lingering,
109
112
  "data-media": media,
110
113
  "data-testid": "clover-canvas-placeholder",
111
114
  "data-vertical": vertical,
@@ -18,6 +18,7 @@ function Fits({
18
18
  ids,
19
19
  more,
20
20
  fits,
21
+ settled,
21
22
  onFits
22
23
  }) {
23
24
  const shown = useRef(fits);
@@ -70,13 +71,14 @@ function Fits({
70
71
  };
71
72
  }, [cluster, key, more]);
72
73
  useLayoutEffect(() => {
74
+ if (!settled) return;
73
75
  const id = moved.current;
74
76
  moved.current = null;
75
77
  if (id === null) return;
76
78
  const active = cluster.ownerDocument.activeElement;
77
79
  if (!active || !cluster.contains(active) || active.closest("[hidden]"))
78
80
  refocus(cluster, id, more);
79
- }, [fits, cluster, more]);
81
+ }, [fits, settled, cluster, more]);
80
82
  return null;
81
83
  }
82
84
  export {
@@ -11,6 +11,8 @@ import { hasCamera } from "../surface.mjs";
11
11
  import { useOptionalClover } from "../../../react/context.mjs";
12
12
  import { BodyUnloadable } from "../../../ui/BodyUnloadable.mjs";
13
13
  import { languageProps } from "../../../i18n/direction.mjs";
14
+ import { adoptSheet } from "../../../ui/adoptSheet.mjs";
15
+ import __clover_sheet_media from "../../../ui/sheets/media.mjs";
14
16
  const SKIP_SECONDS = 10;
15
17
  const MOMENT_SECONDS = 3;
16
18
  const MediaBody = ({
@@ -363,6 +365,7 @@ function containAspect(box, size) {
363
365
  height
364
366
  };
365
367
  }
368
+ adoptSheet("media", __clover_sheet_media);
366
369
  export {
367
370
  containAspect,
368
371
  MediaBody as default,
@@ -5,6 +5,8 @@ import { thumbnailSource, stillSource } from "../../../core/thumbnail.mjs";
5
5
  import { localize } from "../../../core/value.mjs";
6
6
  import { useThumbnail } from "../../../ui/EntryThumbnail.mjs";
7
7
  import { languageProps } from "../../../i18n/direction.mjs";
8
+ import { adoptSheet } from "../../../ui/adoptSheet.mjs";
9
+ import __clover_sheet_media from "../../../ui/sheets/media.mjs";
8
10
  const ART_SIZE = 1200;
9
11
  const GROUND_SIZE = 32;
10
12
  function artworkOf(canvas, language) {
@@ -119,6 +121,7 @@ function PlayerFace({
119
121
  ] })
120
122
  ] });
121
123
  }
124
+ adoptSheet("media", __clover_sheet_media);
122
125
  export {
123
126
  PlayerFace
124
127
  };
@@ -17,6 +17,8 @@ import { useCloverTranslation } from "../../../i18n/useCloverTranslation.mjs";
17
17
  import { toggleFullscreen } from "../../../lib/fullscreen.mjs";
18
18
  import useFullscreenSupported from "../../../hooks/useFullscreenSupported.mjs";
19
19
  import { languageProps } from "../../../i18n/direction.mjs";
20
+ import { adoptSheet } from "../../../ui/adoptSheet.mjs";
21
+ import __clover_sheet_media from "../../../ui/sheets/media.mjs";
20
22
  import { formatTime } from "../../../lib/time.mjs";
21
23
  const chapterPicture = (chapter) => typeof (chapter == null ? void 0 : chapter.thumbnail) === "string" ? { src: chapter.thumbnail } : imageSource(chapter == null ? void 0 : chapter.thumbnail);
22
24
  function chapterAt(chapters, time) {
@@ -528,6 +530,7 @@ const Transport = ({
528
530
  }
529
531
  );
530
532
  };
533
+ adoptSheet("media", __clover_sheet_media);
531
534
  export {
532
535
  chapterAt,
533
536
  chapterPicture,
@@ -4,7 +4,7 @@ import { STILL_SIZE } from "../layout.mjs";
4
4
  import { resolveThumbnail } from "../../../core/thumbnail.mjs";
5
5
  import { localize } from "../../../core/value.mjs";
6
6
  import { sendsCredentials, requestKey } from "../../../core/request.mjs";
7
- import { loadVtt } from "../../../core/vtt.mjs";
7
+ import { loadVtt, vttBlocks } from "../../../core/vtt.mjs";
8
8
  import { isHls } from "../../../lib/hls.mjs";
9
9
  function captionName(caption, index, language) {
10
10
  const name = localize(caption.label, language);
@@ -34,7 +34,6 @@ function useMediaElement(media, { request, language }) {
34
34
  if (!canceled && url) video.poster = url;
35
35
  }
36
36
  );
37
- const blobs = [];
38
37
  media.captions.forEach((caption, index) => {
39
38
  const track = document.createElement("track");
40
39
  track.kind = caption.kind;
@@ -42,12 +41,7 @@ function useMediaElement(media, { request, language }) {
42
41
  track.label = captionName(caption, index, languageRef.current).text;
43
42
  video.appendChild(track);
44
43
  loadVtt(caption.id, requestRef.current).then((text) => {
45
- if (canceled) return;
46
- const url = URL.createObjectURL(
47
- new Blob([text], { type: "text/vtt" })
48
- );
49
- blobs.push(url);
50
- track.src = url;
44
+ if (!canceled) addCues(track.track, text);
51
45
  }).catch(() => void 0);
52
46
  });
53
47
  let hls = null;
@@ -100,7 +94,6 @@ function useMediaElement(media, { request, language }) {
100
94
  video.removeAttribute("src");
101
95
  video.load();
102
96
  video.remove();
103
- blobs.forEach((url) => URL.revokeObjectURL(url));
104
97
  setElement(null);
105
98
  };
106
99
  }, [
@@ -113,7 +106,37 @@ function useMediaElement(media, { request, language }) {
113
106
  ]);
114
107
  return element;
115
108
  }
109
+ function addCues(track, text) {
110
+ if (!track || typeof VTTCue === "undefined") return;
111
+ for (const { id, start, end, settings, raw } of vttBlocks(text)) {
112
+ const cue = new VTTCue(start, end, raw);
113
+ cue.id = id;
114
+ settle(cue, settings);
115
+ track.addCue(cue);
116
+ }
117
+ }
118
+ function settle(cue, settings) {
119
+ for (const setting of settings.split(" ")) {
120
+ const [name, value = ""] = setting.split(":");
121
+ const [first, second] = value.split(",");
122
+ try {
123
+ if (name === "vertical") cue.vertical = first;
124
+ else if (name === "align") cue.align = first;
125
+ else if (name === "size") cue.size = parseFloat(first);
126
+ else if (name === "position") {
127
+ cue.position = parseFloat(first);
128
+ if (second) cue.positionAlign = second;
129
+ } else if (name === "line") {
130
+ cue.snapToLines = !first.endsWith("%");
131
+ cue.line = parseFloat(first);
132
+ if (second) cue.lineAlign = second;
133
+ }
134
+ } catch {
135
+ }
136
+ }
137
+ }
116
138
  export {
139
+ addCues,
117
140
  captionName,
118
141
  useMediaElement
119
142
  };
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  function attachMasonry(box) {
3
+ box.dataset.masonry = "";
3
4
  const items = () => Array.from(
4
5
  box.querySelectorAll(
5
6
  ".clover-items-track > .clover-items-item"
@@ -28,6 +29,7 @@ function attachMasonry(box) {
28
29
  added.disconnect();
29
30
  sizes == null ? void 0 : sizes.disconnect();
30
31
  items().forEach((item) => item.style.removeProperty("grid-row-end"));
32
+ delete box.dataset.masonry;
31
33
  };
32
34
  }
33
35
  export {
@@ -18,10 +18,14 @@ import { getMapWorkerUrl } from "../../core/map-config.mjs";
18
18
  import { useNearViewport } from "../Body/useNearViewport.mjs";
19
19
  import { languageProps, directionOf } from "../../i18n/direction.mjs";
20
20
  import { Tip } from "../../ui/Tip.mjs";
21
+ import { ZoomOut, ZoomIn } from "../../ui/controlGlyphs.mjs";
22
+ import { Information } from "../Body/glyphs.mjs";
21
23
  import { NavDate } from "../../ui/NavDate.mjs";
22
24
  import { readDate } from "../../core/dates.mjs";
23
25
  import { dateTimeOf, formatDate } from "../../core/dates-format.mjs";
24
26
  import { cloverI18n, langWithin } from "../../i18n/config.mjs";
27
+ import { adoptSheet } from "../../ui/adoptSheet.mjs";
28
+ import __clover_sheet_map from "../../ui/sheets/map.mjs";
25
29
  const RootMap = forwardRef(function RootMap2(props, ref) {
26
30
  return /* @__PURE__ */ jsx(ConnectedMap, { ...props, scope: "view", landmark: false, forwardedRef: ref });
27
31
  });
@@ -210,11 +214,22 @@ function MapView({
210
214
  let instance = null;
211
215
  let observer = null;
212
216
  let letGo = null;
213
- Promise.all([import("maplibre-gl"), import("./worker.mjs")]).then(([module, bundled]) => {
217
+ Promise.all([
218
+ import("maplibre-gl"),
219
+ import("./worker.mjs").then(
220
+ (bundled) => bundled.mapLibreSheet().then(() => bundled)
221
+ )
222
+ ]).then(async ([module, bundled]) => {
214
223
  var _a;
215
224
  const maplibre = "Map" in module ? module : module.default;
216
225
  if (!live || !container.current) return;
217
226
  const worker = workerUrl ?? getMapWorkerUrl() ?? bundled.bundledWorkerUrl((_a = maplibre.getVersion) == null ? void 0 : _a.call(maplibre));
227
+ const viaBlob = !!worker && (worker.startsWith("blob:") || new URL(worker, location.href).origin !== location.origin);
228
+ if (viaBlob && !await bundled.blobWorkersAllowed()) {
229
+ if (live) setFailed(true);
230
+ return;
231
+ }
232
+ if (!live || !container.current) return;
218
233
  if (worker) maplibre.setWorkerUrl(worker);
219
234
  const { t: t2 } = latest.current;
220
235
  instance = new maplibre.Map({
@@ -590,7 +605,10 @@ function MapView({
590
605
  ),
591
606
  map && tips.map(
592
607
  ({ element, key }) => createPortal(
593
- /* @__PURE__ */ jsx(Tip, { label: t(key), lang: langOf(key) }),
608
+ /* @__PURE__ */ jsxs(Fragment, { children: [
609
+ /* @__PURE__ */ jsx(MapGlyph, { name: key }),
610
+ /* @__PURE__ */ jsx(Tip, { label: t(key), lang: langOf(key) })
611
+ ] }),
594
612
  element,
595
613
  key
596
614
  )
@@ -842,6 +860,28 @@ function hash(text) {
842
860
  }
843
861
  return (value >>> 0).toString(36);
844
862
  }
863
+ const GLYPHS = {
864
+ imageZoomIn: ZoomIn,
865
+ imageZoomOut: ZoomOut,
866
+ mapAttribution: Information
867
+ };
868
+ function MapGlyph({ name }) {
869
+ const Glyph = GLYPHS[name];
870
+ if (!Glyph) return null;
871
+ return /* @__PURE__ */ jsx(
872
+ "svg",
873
+ {
874
+ className: "clover-geomap-glyph",
875
+ viewBox: "0 0 512 512",
876
+ fill: "currentColor",
877
+ stroke: "currentColor",
878
+ focusable: "false",
879
+ "aria-hidden": "true",
880
+ children: /* @__PURE__ */ jsx(Glyph, {})
881
+ }
882
+ );
883
+ }
884
+ adoptSheet("map", __clover_sheet_map);
845
885
  export {
846
886
  ConnectedMap,
847
887
  GivenMap,