@nulib/clover 4.2.0 → 4.3.1

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 (343) hide show
  1. package/README.md +1 -1
  2. package/dist/components/Canvas/CanvasView.mjs +37 -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 +41 -10
  11. package/dist/components/Canvas/media/Player.mjs +3 -0
  12. package/dist/components/Canvas/media/SeekMarks.mjs +236 -0
  13. package/dist/components/Canvas/media/Transport.mjs +29 -3
  14. package/dist/components/Canvas/media/useMediaElement.mjs +54 -19
  15. package/dist/components/Items/masonry.mjs +2 -0
  16. package/dist/components/Map/MapView.mjs +42 -2
  17. package/dist/components/Map/maplibre-sheet.mjs +5 -0
  18. package/dist/components/Map/sheet.mjs +19 -0
  19. package/dist/components/Map/worker.mjs +28 -1
  20. package/dist/components/Scene/SceneView.mjs +3 -0
  21. package/dist/core/content-state.mjs +1 -11
  22. package/dist/core/load.mjs +9 -1
  23. package/dist/core/presentation.mjs +4 -5
  24. package/dist/core/sanitize.mjs +15 -3
  25. package/dist/core/svg-shape.mjs +2 -1
  26. package/dist/core/thumbnail.mjs +15 -4
  27. package/dist/core/trusted.mjs +26 -0
  28. package/dist/core/vtt.mjs +20 -9
  29. package/dist/index.d.mts +200 -1
  30. package/dist/index.mjs +11 -0
  31. package/dist/lib/renderer/CanvasRenderer.mjs +48 -7
  32. package/dist/lib/renderer/camera/CameraAnimator.mjs +39 -20
  33. package/dist/lib/renderer/input/GestureController.mjs +15 -5
  34. package/dist/map/index.d.mts +6 -1
  35. package/dist/styles/collection-select.css +1 -0
  36. package/dist/styles/core.css +1 -0
  37. package/dist/styles/default.css +1 -0
  38. package/dist/styles/items.css +1 -0
  39. package/dist/styles/map.css +1 -0
  40. package/dist/styles/media.css +1 -0
  41. package/dist/styles/panel.css +1 -0
  42. package/dist/styles/scene.css +1 -0
  43. package/dist/styles/split.css +1 -0
  44. package/dist/styles.css +1 -1
  45. package/dist/templates/default/Default.mjs +2 -0
  46. package/dist/templates/document/Document.mjs +12 -2
  47. package/dist/templates/document/Sheets.mjs +2 -0
  48. package/dist/templates/gallery/Gallery.mjs +3 -1
  49. package/dist/templates/index.d.mts +102 -6
  50. package/dist/templates/shared/Lightbox.mjs +50 -3
  51. package/dist/templates/shared/LightboxView.mjs +3 -1
  52. package/dist/templates.css +1 -1
  53. package/dist/ui/Button.mjs +3 -1
  54. package/dist/ui/ControlCluster.mjs +6 -3
  55. package/dist/ui/Markup.mjs +8 -7
  56. package/dist/ui/Tip.mjs +6 -1
  57. package/dist/ui/adoptSheet.mjs +19 -0
  58. package/dist/ui/sheets/map.mjs +5 -0
  59. package/dist/ui/sheets/media.mjs +5 -0
  60. package/dist/ui/sheets/scene.mjs +5 -0
  61. package/dist/web-components/{About-D1TBGGPL.mjs → About-j3O9cA3r.mjs} +1 -1
  62. package/dist/web-components/{AnnotationItems-DTacmRA9.mjs → AnnotationItems-U0WmWGOh.mjs} +1 -1
  63. package/dist/web-components/{AnnotationMenu-DYc9ekWS.mjs → AnnotationMenu-C1fAWWYy.mjs} +1 -1
  64. package/dist/web-components/{AnnotationState--5ghW0C2.mjs → AnnotationState-C9UhGpsr.mjs} +1 -1
  65. package/dist/web-components/{Annotations-Bvc_FmJ5.mjs → Annotations-BtJ4IVmy.mjs} +2 -2
  66. package/dist/web-components/{Annotations-BG8lPjk1.mjs → Annotations-YcFbQRJx.mjs} +1 -1
  67. package/dist/web-components/{Body-QQ1DmnbP.mjs → Body-Ccxmucbr.mjs} +1 -1
  68. package/dist/web-components/{BodyAlert-A4xRjOKr.mjs → BodyAlert-BBSStCpI.mjs} +1 -1
  69. package/dist/web-components/Button-Bphsp8rv.mjs +1 -0
  70. package/dist/web-components/{Camera-DqT_1MgD.mjs → Camera-DSk-YFpW.mjs} +1 -1
  71. package/dist/web-components/{Canvas2DBackend-TZtR3zHf.mjs → Canvas2DBackend-CYAJ-W6-.mjs} +1 -1
  72. package/dist/web-components/CanvasView-BAJ6OYvn.mjs +2 -0
  73. package/dist/web-components/{CaptionDetails-DMRWmtaY.mjs → CaptionDetails-Dg9Y11o_.mjs} +1 -1
  74. package/dist/web-components/ChaptersMenu-i4bFwR8c.mjs +1 -0
  75. package/dist/web-components/{Chevron-DFGbSGPI.mjs → Chevron-BnlK9F4K.mjs} +1 -1
  76. package/dist/web-components/{ChoiceMenu-C80kdxvq.mjs → ChoiceMenu-YXA7Ku8M.mjs} +1 -1
  77. package/dist/web-components/{Collection-B4CxBsFL.mjs → Collection-DgSFQbN-.mjs} +1 -1
  78. package/dist/web-components/{CollectionSelect-DO8YO2p7.mjs → CollectionSelect-PUcTh3Uv.mjs} +1 -1
  79. package/dist/web-components/{Connected-sYBn_9MK.mjs → Connected-B_caNIrW.mjs} +1 -1
  80. package/dist/web-components/{Connected-CcbVqzmj.mjs → Connected-XhRc6yaA.mjs} +1 -1
  81. package/dist/web-components/{Connected-DthCPaHl.mjs → Connected-YgL5BWf5.mjs} +1 -1
  82. package/dist/web-components/{Contents-AVPYYXht.mjs → Contents-CoC4TK6G.mjs} +1 -1
  83. package/dist/web-components/ControlMenu-CYfLg3Ok.mjs +1 -0
  84. package/dist/web-components/ControlsFade-BcGL7yUH.mjs +1 -0
  85. package/dist/web-components/CountMenu-C7XawAoa.mjs +1 -0
  86. package/dist/web-components/Cue-DZJ5TBKU.mjs +1 -0
  87. package/dist/web-components/Document-DZDYR2Tk.mjs +1 -0
  88. package/dist/web-components/{DomLayers-DlRapZ1u.mjs → DomLayers-Bbrulm6v.mjs} +1 -1
  89. package/dist/web-components/{Download-Ci_JUTVd.mjs → Download-CfRPt74Y.mjs} +1 -1
  90. package/dist/web-components/{EntryBodies-C0ICfS2R.mjs → EntryBodies-Bz8hyAUW.mjs} +1 -1
  91. package/dist/web-components/{EntryThumbnail-DxHhfRo_.mjs → EntryThumbnail-R9h0AXcu.mjs} +1 -1
  92. package/dist/web-components/{FieldPill-CVfeeafm.mjs → FieldPill-DFIdy-hn.mjs} +1 -1
  93. package/dist/web-components/{FrameAnimation-AZpVvu0R.mjs → FrameAnimation-DFDuFwwt.mjs} +1 -1
  94. package/dist/web-components/Gallery-BrYWLufL.mjs +1 -0
  95. package/dist/web-components/{HideToggle-0nlIo-f8.mjs → HideToggle-geO9QfFR.mjs} +1 -1
  96. package/dist/web-components/ImageControls-B9PhCHqi.mjs +1 -0
  97. package/dist/web-components/{Items-Drd82_Jj.mjs → Items-C7wjylgH.mjs} +1 -1
  98. package/dist/web-components/{Label-BIjqJ-_T.mjs → Label-S7o8PlWU.mjs} +1 -1
  99. package/dist/web-components/{LanguageChoice-DkSc-n6g.mjs → LanguageChoice-URJJAdah.mjs} +1 -1
  100. package/dist/web-components/LightboxView-65ROPr0_.mjs +1 -0
  101. package/dist/web-components/{ListEnd-pq-BgaDI.mjs → ListEnd-B0wGr87o.mjs} +1 -1
  102. package/dist/web-components/{Loaded-CSO5NFhm.mjs → Loaded-Do53YvYw.mjs} +1 -1
  103. package/dist/web-components/{LoadedCanvas-DK6xMmM1.mjs → LoadedCanvas-BrtGPpSm.mjs} +1 -1
  104. package/dist/web-components/LoadedMap-C06TIgvf.mjs +1 -0
  105. package/dist/web-components/{Loading-CoJLSRkv.mjs → Loading-Du3wn1EM.mjs} +1 -1
  106. package/dist/web-components/{Map-BEVtD52O.mjs → Map-B6LVO0gx.mjs} +1 -1
  107. package/dist/web-components/MapView-CzV3y5iI.mjs +3 -0
  108. package/dist/web-components/Markup-DACv7sRg.mjs +2 -0
  109. package/dist/web-components/MediaBody-CcuO5IZT.mjs +1 -0
  110. package/dist/web-components/MediaBody-DGd2uFfK.mjs +1 -0
  111. package/dist/web-components/{NavDate-CYNK0Qmp.mjs → NavDate-DRKmjc54.mjs} +1 -1
  112. package/dist/web-components/{Navigator-DrYPepzN.mjs → Navigator-CA8zB6CU.mjs} +1 -1
  113. package/dist/web-components/{Pager-CN4lHURv.mjs → Pager-DWp6u3iv.mjs} +1 -1
  114. package/dist/web-components/{PagerLayout-DeqnSQcF.mjs → PagerLayout-DHRpcI8x.mjs} +1 -1
  115. package/dist/web-components/{Panel-CFYUlXup.mjs → Panel-CzUDNn8M.mjs} +1 -1
  116. package/dist/web-components/PanelPart-DKb9dXm6.mjs +1 -0
  117. package/dist/web-components/{PanelToggle-9ud55NNI.mjs → PanelToggle-D5sx5FP9.mjs} +1 -1
  118. package/dist/web-components/{PartOfManifest-KUHUq-6q.mjs → PartOfManifest-Ct-I8Ofm.mjs} +1 -1
  119. package/dist/web-components/{Pending-mcmdyZPA.mjs → Pending-f1heQNo7.mjs} +1 -1
  120. package/dist/web-components/{PlaceBox-DX4ZLDat.mjs → PlaceBox-_an9ya_W.mjs} +1 -1
  121. package/dist/web-components/Placeholder-D4-VCxeD.mjs +1 -0
  122. package/dist/web-components/{Position-DO5qg5Sp.mjs → Position-DA4rzRiy.mjs} +1 -1
  123. package/dist/web-components/{Primitives-c9sIz0oQ.mjs → Primitives-DU_VhdO2.mjs} +1 -1
  124. package/dist/web-components/{Provider-a3xY016W.mjs → Provider-Dl_t_qEC.mjs} +1 -1
  125. package/dist/web-components/{ReadMore-D_WmmKEP.mjs → ReadMore-BpA8Dex8.mjs} +1 -1
  126. package/dist/web-components/Root-DixSZV9Y.mjs +1 -0
  127. package/dist/web-components/Scene-CSaXgBNr.mjs +1 -0
  128. package/dist/web-components/SceneView-BJNlboix.mjs +1 -0
  129. package/dist/web-components/{Search-BgxEW1UT.mjs → Search-CvpKzlYP.mjs} +1 -1
  130. package/dist/web-components/{Sections-DZVrhoAC.mjs → Sections-BhfcUyaf.mjs} +1 -1
  131. package/dist/web-components/SeekMarks-BfOrFnvQ.mjs +1 -0
  132. package/dist/web-components/{StandaloneItems-6cSw7nbF.mjs → StandaloneItems-CoiceHd8.mjs} +1 -1
  133. package/dist/web-components/{Status-DHTzuTkh.mjs → Status-B4327UOL.mjs} +1 -1
  134. package/dist/web-components/{Steps-Dkpy9KiJ.mjs → Steps-ACdXJZrV.mjs} +1 -1
  135. package/dist/web-components/TargetItems-D1bLKA_B.mjs +1 -0
  136. package/dist/web-components/Timeline-DY8LpnOG.mjs +1 -0
  137. package/dist/web-components/Tip-BatwzZZo.mjs +1 -0
  138. package/dist/web-components/{Transcript-WvFFAJQM.mjs → Transcript-B1nh9UJK.mjs} +1 -1
  139. package/dist/web-components/Transport-BsjGGbFJ.mjs +1 -0
  140. package/dist/web-components/Transport-DKb3XTMA.mjs +1 -0
  141. package/dist/web-components/{annotation-collection-BkC3nBPA.mjs → annotation-collection-CtxYL-V3.mjs} +1 -1
  142. package/dist/web-components/{annotation-name-Du2KAWoD.mjs → annotation-name-KQ4wAi8-.mjs} +1 -1
  143. package/dist/web-components/{annotations-content-CEzAS-P2.mjs → annotations-content-XVgQ5me7.mjs} +1 -1
  144. package/dist/web-components/{body-DPlfbLt3.mjs → body-CbYkzpmQ.mjs} +1 -1
  145. package/dist/web-components/{canvas-BUwBftJW.mjs → canvas-Du31_Dru.mjs} +1 -1
  146. package/dist/web-components/{cloverEngine-UNw5K4Xg.mjs → cloverEngine-CuRCXZNZ.mjs} +1 -1
  147. package/dist/web-components/{content-state-reader-GgQF2MvJ.mjs → content-state-reader-DLlBY4Ox.mjs} +1 -1
  148. package/dist/web-components/controlGlyphs-ClH59vLg.mjs +1 -0
  149. package/dist/web-components/{controls-CC9G5LxK.mjs → controls-smixEi0i.mjs} +1 -1
  150. package/dist/web-components/custom-elements.json +10 -2
  151. package/dist/web-components/{downloads-CmAYeEIz.mjs → downloads-BqkNwsM0.mjs} +1 -1
  152. package/dist/web-components/{dragToClose-DK-eM097.mjs → dragToClose-2joCF413.mjs} +1 -1
  153. package/dist/web-components/{engine-Dok0z8WP.mjs → engine-DNTgJBST.mjs} +1 -1
  154. package/dist/web-components/{engines-BD2IfwQF.mjs → engines-BpFZX2dO.mjs} +1 -1
  155. package/dist/web-components/{fetchManifest-tQXcfFiz.mjs → fetchManifest-B-poGgag.mjs} +1 -1
  156. package/dist/web-components/{fromManifest-BwQdeAuL.mjs → fromManifest-Dw3BwjHM.mjs} +1 -1
  157. package/dist/web-components/{glyphs-dp_HK3Ja.mjs → glyphs-VoJVEqLE.mjs} +1 -1
  158. package/dist/web-components/hooks-Syt1XLVX.mjs +1 -0
  159. package/dist/web-components/{image-layers-xcBsiad9.mjs → image-layers-ryUJ_0bq.mjs} +1 -1
  160. package/dist/web-components/{imageService-4sFnmAFX.mjs → imageService-DBU_Xks1.mjs} +1 -1
  161. package/dist/web-components/index-DGXCFoHu.mjs +1 -0
  162. package/dist/web-components/index.d.mts +4 -2
  163. package/dist/web-components/index.mjs +1 -1
  164. package/dist/web-components/{items-BUmOy2QY.mjs → items-BQPvL5D6.mjs} +1 -1
  165. package/dist/web-components/items-TIbaHoB8.mjs +1 -0
  166. package/dist/web-components/label-Bd-QYEXn.mjs +1 -0
  167. package/dist/web-components/{layout-B29v2RKK.mjs → layout-MzMKFa5I.mjs} +1 -1
  168. package/dist/web-components/{link-Ct5PpHEY.mjs → link-BUQQE9P2.mjs} +1 -1
  169. package/dist/web-components/logo-Cn820OoX.mjs +1 -0
  170. package/dist/web-components/maplibre-sheet-CfiZ6JFk.mjs +1 -0
  171. package/dist/web-components/masonry-BZCdA3bV.mjs +1 -0
  172. package/dist/web-components/{models-BXcT4ijX.mjs → models-wl-5vW2i.mjs} +1 -1
  173. package/dist/web-components/{nodes-BleXuYE6.mjs → nodes-CmOpA3s7.mjs} +1 -1
  174. package/dist/web-components/{overlayImage-BJtfot4Y.mjs → overlayImage-tb9-Md51.mjs} +1 -1
  175. package/dist/web-components/{panel-BxxV_JkD.mjs → panel-BPVyAugu.mjs} +1 -1
  176. package/dist/web-components/part-DeZI8Hmp.mjs +1 -0
  177. package/dist/web-components/{playerSurface-BXNLaFk0.mjs → playerSurface-BxxMV-va.mjs} +1 -1
  178. package/dist/web-components/pointer-BqgxBJ82.mjs +1 -0
  179. package/dist/web-components/{provider-CPp0Sgr_.mjs → provider-B9oAQG-u.mjs} +1 -1
  180. package/dist/web-components/{range-regions-DAaOu0IS.mjs → range-regions-BFB1374L.mjs} +1 -1
  181. package/dist/web-components/{read-more-lcqGslUd.mjs → read-more-oWPk0OLi.mjs} +1 -1
  182. package/dist/web-components/{readingLanguages-FyVsSWJ8.mjs → readingLanguages-BigCi6rZ.mjs} +1 -1
  183. package/dist/web-components/rendererSurface-B_OOhxzA.mjs +22 -0
  184. package/dist/web-components/{renderers-BFS7hFVU.mjs → renderers-CBupZj8Z.mjs} +1 -1
  185. package/dist/web-components/{resource-Bufu7lAr.mjs → resource-B6uUsU6D.mjs} +1 -1
  186. package/dist/web-components/{sanitize-qIOeyIww.mjs → sanitize-BedC_UE5.mjs} +3 -3
  187. package/dist/web-components/{save-file-CoknKOPz.mjs → save-file-BaIrLp1V.mjs} +1 -1
  188. package/dist/web-components/{search-5ocrsYmT.mjs → search-DaGpvTki.mjs} +1 -1
  189. package/dist/web-components/shared-D2RadIoz.mjs +1 -0
  190. package/dist/web-components/{show-link-DBaJj4s_.mjs → show-link-Cxylys81.mjs} +1 -1
  191. package/dist/web-components/{sizedImage-jnOGcIIZ.mjs → sizedImage-DchqGFdt.mjs} +1 -1
  192. package/dist/web-components/{split-P6J0qqf5.mjs → split-oaEIep3T.mjs} +1 -1
  193. package/dist/web-components/{status-honoOMNx.mjs → status-CfCgO5OB.mjs} +1 -1
  194. package/dist/web-components/styles-DZIDbHxL.mjs +1 -0
  195. package/dist/web-components/svg-shape-D1K-WNrY.mjs +1 -0
  196. package/dist/web-components/three.mjs +1 -1
  197. package/dist/web-components/thumbnail-D83GaQ8C.mjs +1 -0
  198. package/dist/web-components/{tip-BhNI83aT.mjs → tip-CMEBtCil.mjs} +1 -1
  199. package/dist/web-components/{toggle-CJKdi5KH.mjs → toggle-3NncfBSZ.mjs} +1 -1
  200. package/dist/web-components/trusted-Bvpx307M.mjs +1 -0
  201. package/dist/web-components/{useContainerName-_48Cdi0m.mjs → useContainerName-fp0-n_9x.mjs} +1 -1
  202. package/dist/web-components/{useControlsVisibility-CieBxGnK.mjs → useControlsVisibility-BYZlgiAt.mjs} +1 -1
  203. package/dist/web-components/useLazyPanelPane-DXYGGS7f.mjs +1 -0
  204. package/dist/web-components/{useNearViewport-B34ebmIW.mjs → useNearViewport-DMqMdvue.mjs} +1 -1
  205. package/dist/web-components/{useScrollTrack-DgRGFeP5.mjs → useScrollTrack-BHuPAWxB.mjs} +1 -1
  206. package/dist/web-components/viewer/{AnnotationItems-BNA_92Dv.mjs → AnnotationItems-B5Vs0dYi.mjs} +1 -1
  207. package/dist/web-components/viewer/{AnnotationMenu-BIQYVR4N.mjs → AnnotationMenu-BO18q_Ze.mjs} +1 -1
  208. package/dist/web-components/viewer/{AnnotationState-BbwQqA1U.mjs → AnnotationState-ZPmnCpbZ.mjs} +1 -1
  209. package/dist/web-components/viewer/{Annotations-P4XzAlNc.mjs → Annotations-C46kSUA6.mjs} +1 -1
  210. package/dist/web-components/viewer/{Annotations-CZzOZAFP.mjs → Annotations-DEKa_9xz.mjs} +2 -2
  211. package/dist/web-components/viewer/{Canvas2DBackend-DFfCzyjL.mjs → Canvas2DBackend-DHSI3dKr.mjs} +1 -1
  212. package/dist/web-components/viewer/{CaptionDetails-DPtE-RQQ.mjs → CaptionDetails-BVCqV9NT.mjs} +1 -1
  213. package/dist/web-components/viewer/ChaptersMenu-CIwIM2Pb.mjs +1 -0
  214. package/dist/web-components/viewer/{ChoiceMenu-GkqyTQRQ.mjs → ChoiceMenu-Ww7lcPnq.mjs} +1 -1
  215. package/dist/web-components/viewer/{Collection-DjY_6qa6.mjs → Collection-DCYM9eE6.mjs} +1 -1
  216. package/dist/web-components/viewer/{Connected-D5T-mtiy.mjs → Connected-Bbk8M5rE.mjs} +1 -1
  217. package/dist/web-components/viewer/{Connected-DIOuI3Mv.mjs → Connected-DAOMKtJR.mjs} +1 -1
  218. package/dist/web-components/viewer/{Contents-DV-VxXuf.mjs → Contents-BnRBx3rc.mjs} +1 -1
  219. package/dist/web-components/viewer/ControlMenu-Co6yBttc.mjs +1 -0
  220. package/dist/web-components/viewer/ControlsFade-pOQ5VQ5i.mjs +1 -0
  221. package/dist/web-components/viewer/CountMenu-lu21fO_7.mjs +1 -0
  222. package/dist/web-components/viewer/Cue-oaiVO9ZO.mjs +1 -0
  223. package/dist/web-components/viewer/Document-ByBRhL68.mjs +1 -0
  224. package/dist/web-components/viewer/{DomLayers-BCwCxPDU.mjs → DomLayers-BjxGaZkt.mjs} +1 -1
  225. package/dist/web-components/viewer/{Download-CL4IClAD.mjs → Download-DhMD4AJt.mjs} +1 -1
  226. package/dist/web-components/viewer/{EntryBodies-e40y47bl.mjs → EntryBodies-DL5UolEz.mjs} +1 -1
  227. package/dist/web-components/viewer/{EntryThumbnail-B_dP3w4o.mjs → EntryThumbnail-CJisDcni.mjs} +1 -1
  228. package/dist/web-components/viewer/{FieldPill-Hse1cDBE.mjs → FieldPill-DAk6zxxD.mjs} +1 -1
  229. package/dist/web-components/viewer/{FrameAnimation-CE218DCr.mjs → FrameAnimation-DGMuFNdW.mjs} +1 -1
  230. package/dist/web-components/viewer/Gallery-CbHhyWlF.mjs +1 -0
  231. package/dist/web-components/viewer/{HideToggle-CYoqe_ez.mjs → HideToggle-C6B9B2Bo.mjs} +1 -1
  232. package/dist/web-components/viewer/ImageControls-BDx7C1q5.mjs +1 -0
  233. package/dist/web-components/viewer/{LanguageChoice-BmO-322r.mjs → LanguageChoice-BM9xZr_D.mjs} +1 -1
  234. package/dist/web-components/viewer/LightboxView-RrioB0CN.mjs +1 -0
  235. package/dist/web-components/viewer/{ListEnd-DX1jsvJk.mjs → ListEnd-8vdKw6Py.mjs} +1 -1
  236. package/dist/web-components/viewer/MapView-G3yj-Bjd.mjs +3 -0
  237. package/dist/web-components/viewer/MediaBody-BokgnTO-.mjs +1 -0
  238. package/dist/web-components/viewer/MediaBody-DPOcyiYH.mjs +1 -0
  239. package/dist/web-components/viewer/{NavDate-BZgeaMG9.mjs → NavDate-B6rCV-Cd.mjs} +1 -1
  240. package/dist/web-components/viewer/{Navigator-Co76p-1n.mjs → Navigator-CjgUcgKY.mjs} +1 -1
  241. package/dist/web-components/viewer/{PagerLayout-tUkN1-FV.mjs → PagerLayout-LZmC6VpV.mjs} +1 -1
  242. package/dist/web-components/viewer/PanelPart-Cw1G5W4b.mjs +1 -0
  243. package/dist/web-components/viewer/{PartOfManifest-DXnbEPzS.mjs → PartOfManifest-B0TYADTv.mjs} +1 -1
  244. package/dist/web-components/viewer/{PlaceBox-xrJ4CGdN.mjs → PlaceBox-Cjdjg-_9.mjs} +1 -1
  245. package/dist/web-components/viewer/Placeholder-MYLjXbiF.mjs +1 -0
  246. package/dist/web-components/viewer/{Search-DTg1cHZ3.mjs → Search-CyRrBHsr.mjs} +1 -1
  247. package/dist/web-components/viewer/SeekMarks-1WSjARP5.mjs +1 -0
  248. package/dist/web-components/viewer/{StandaloneItems-BpBEQG8i.mjs → StandaloneItems-CQrzTSPC.mjs} +1 -1
  249. package/dist/web-components/viewer/{Steps-SpwMQdCL.mjs → Steps-Bd42-eq7.mjs} +1 -1
  250. package/dist/web-components/viewer/TargetItems-BpmZEVMS.mjs +1 -0
  251. package/dist/web-components/viewer/{Transcript-rTAhuXCF.mjs → Transcript-CE4BsnWd.mjs} +1 -1
  252. package/dist/web-components/viewer/Transport-1ROUkfsf.mjs +1 -0
  253. package/dist/web-components/viewer/Transport-g0_Cjy0f.mjs +1 -0
  254. package/dist/web-components/viewer/{annotation-collection-B7pZiLVk.mjs → annotation-collection-vM0aeJgP.mjs} +1 -1
  255. package/dist/web-components/viewer/annotation-name-kjUrGbhg.mjs +1 -0
  256. package/dist/web-components/viewer/{annotations-content-9AtLlPNn.mjs → annotations-content-CysDLy4t.mjs} +1 -1
  257. package/dist/web-components/viewer/{cloverEngine-jRrYLrWa.mjs → cloverEngine-S8GEd-YZ.mjs} +1 -1
  258. package/dist/web-components/viewer/{content-state-reader-CPvkju6Q.mjs → content-state-reader-BTZKS9Hq.mjs} +1 -1
  259. package/dist/web-components/viewer/{dragToClose-Co9kGk9q.mjs → dragToClose-Bt4QtVSO.mjs} +1 -1
  260. package/dist/web-components/viewer/{fetchManifest-D7N9WhhF.mjs → fetchManifest-D4aIqcDV.mjs} +1 -1
  261. package/dist/web-components/viewer/{host-DMD9LE4H.mjs → host-ClJe-BX1.mjs} +1 -1
  262. package/dist/web-components/viewer/{image-layers-x_shzPvu.mjs → image-layers-DGa5HJt8.mjs} +1 -1
  263. package/dist/web-components/viewer/index.mjs +1 -1
  264. package/dist/web-components/viewer/{link-DikPGzNO.mjs → link-CU71f0wU.mjs} +1 -1
  265. package/dist/web-components/viewer/{overlayImage-33kKKB0T.mjs → overlayImage-D9GHzMmm.mjs} +1 -1
  266. package/dist/web-components/viewer/{range-regions-TH6WWGTT.mjs → range-regions-CiceyEuu.mjs} +1 -1
  267. package/dist/web-components/viewer/{renderers-BxePmixF.mjs → renderers-2BgvLkI0.mjs} +1 -1
  268. package/dist/web-components/viewer/{save-file-QXKiPlST.mjs → save-file-BW7D7oYG.mjs} +1 -1
  269. package/dist/web-components/viewer/{search-B_NePyas.mjs → search-DBMO82DV.mjs} +1 -1
  270. package/dist/web-components/viewer/styles-DogZyfVz.mjs +1 -0
  271. package/dist/web-components/viewer/{useControlsVisibility-Cu-jTDzs.mjs → useControlsVisibility-DSSIzst5.mjs} +1 -1
  272. package/dist/web-components/viewer/useLazyPanelPane-_6IY7cV5.mjs +1 -0
  273. package/dist/web-components/viewer/viewer-ClQD1LNQ.mjs +29 -0
  274. package/dist/web-components/viewer/vtt-Dk5bwDVQ.mjs +5 -0
  275. package/dist/web-components/viewer-DLfZQmZs.mjs +1 -0
  276. package/dist/web-components/vtt-9Ui3h60h.mjs +5 -0
  277. package/dist/web-components/worker-C9aVbya_.mjs +1 -0
  278. package/package.json +2 -1
  279. package/dist/web-components/Button-Cx6VE_UW.mjs +0 -1
  280. package/dist/web-components/CanvasView-DxZASM9E.mjs +0 -2
  281. package/dist/web-components/ChaptersMenu-BAZVVDrK.mjs +0 -1
  282. package/dist/web-components/ControlMenu-BjJsWnuZ.mjs +0 -1
  283. package/dist/web-components/ControlsFade-C-6WhSxB.mjs +0 -1
  284. package/dist/web-components/CountMenu-Dx8D_RJZ.mjs +0 -1
  285. package/dist/web-components/Cue-xuo5dgKE.mjs +0 -1
  286. package/dist/web-components/Document-BWdafeEi.mjs +0 -1
  287. package/dist/web-components/Gallery-C2PTJmvN.mjs +0 -1
  288. package/dist/web-components/ImageControls-tKVAMpaj.mjs +0 -1
  289. package/dist/web-components/LightboxView-Cuqx2H1m.mjs +0 -1
  290. package/dist/web-components/LoadedMap-DmPH-LKY.mjs +0 -1
  291. package/dist/web-components/MapView-DHJcn9gW.mjs +0 -3
  292. package/dist/web-components/Markup-Hm6bWOjm.mjs +0 -2
  293. package/dist/web-components/MediaBody-BpgNtpKZ.mjs +0 -1
  294. package/dist/web-components/MediaBody-Co23JjUJ.mjs +0 -1
  295. package/dist/web-components/PanelPart-CpUIRbxr.mjs +0 -1
  296. package/dist/web-components/Placeholder-0hE8q-SY.mjs +0 -1
  297. package/dist/web-components/Root-CU1o0wje.mjs +0 -1
  298. package/dist/web-components/Scene-CboEeptc.mjs +0 -1
  299. package/dist/web-components/SceneView-hcc78jQT.mjs +0 -1
  300. package/dist/web-components/TargetItems-CyOI9_Z4.mjs +0 -1
  301. package/dist/web-components/Timeline-B9tD3Rar.mjs +0 -1
  302. package/dist/web-components/Tip-nJSTYquc.mjs +0 -1
  303. package/dist/web-components/Transport-FxLp_bdW.mjs +0 -1
  304. package/dist/web-components/Transport-VUxSEIQO.mjs +0 -1
  305. package/dist/web-components/hooks-C4dJ5K_D.mjs +0 -1
  306. package/dist/web-components/index-DspT4wUm.mjs +0 -1
  307. package/dist/web-components/items-CWMI53aN.mjs +0 -1
  308. package/dist/web-components/label-BGjL7I4b.mjs +0 -1
  309. package/dist/web-components/logo-BFstM-0a.mjs +0 -1
  310. package/dist/web-components/masonry-0QfzOgbB.mjs +0 -1
  311. package/dist/web-components/part-D4gjnYmT.mjs +0 -1
  312. package/dist/web-components/pointer-CJELU3gI.mjs +0 -1
  313. package/dist/web-components/rendererSurface-nh6-EfuZ.mjs +0 -22
  314. package/dist/web-components/shared-DFAX0n3B.mjs +0 -1
  315. package/dist/web-components/styles-BwkYiCLC.mjs +0 -1
  316. package/dist/web-components/svg-shape-DLY3g7oq.mjs +0 -1
  317. package/dist/web-components/thumbnail-EbURh-UM.mjs +0 -1
  318. package/dist/web-components/useLazyPanelPane-Da3kJiOt.mjs +0 -1
  319. package/dist/web-components/viewer/ChaptersMenu-D6Jmujag.mjs +0 -1
  320. package/dist/web-components/viewer/ControlMenu-BsEpff6N.mjs +0 -1
  321. package/dist/web-components/viewer/ControlsFade-BowtN96W.mjs +0 -1
  322. package/dist/web-components/viewer/CountMenu-DCmA6HdK.mjs +0 -1
  323. package/dist/web-components/viewer/Cue-BjbVzrpl.mjs +0 -1
  324. package/dist/web-components/viewer/Document-4ZQd3W3o.mjs +0 -1
  325. package/dist/web-components/viewer/Gallery-F2sVj4ph.mjs +0 -1
  326. package/dist/web-components/viewer/ImageControls-C2G4x2Es.mjs +0 -1
  327. package/dist/web-components/viewer/LightboxView-DKR8dXcg.mjs +0 -1
  328. package/dist/web-components/viewer/MapView-Df0wZjCh.mjs +0 -3
  329. package/dist/web-components/viewer/MediaBody-CataNonO.mjs +0 -1
  330. package/dist/web-components/viewer/MediaBody-SkIgrEMj.mjs +0 -1
  331. package/dist/web-components/viewer/PanelPart-Cl4Sst60.mjs +0 -1
  332. package/dist/web-components/viewer/Placeholder-B1AcizHL.mjs +0 -1
  333. package/dist/web-components/viewer/TargetItems-B6Icep5k.mjs +0 -1
  334. package/dist/web-components/viewer/Transport-vKIDALE-.mjs +0 -1
  335. package/dist/web-components/viewer/Transport-z_kdVisw.mjs +0 -1
  336. package/dist/web-components/viewer/annotation-name-BKj1O9lA.mjs +0 -1
  337. package/dist/web-components/viewer/styles-Bedyz7_l.mjs +0 -1
  338. package/dist/web-components/viewer/useLazyPanelPane-BhLtRixT.mjs +0 -1
  339. package/dist/web-components/viewer/viewer-nfPJPwwt.mjs +0 -29
  340. package/dist/web-components/viewer/vtt-CUn4h5JB.mjs +0 -5
  341. package/dist/web-components/viewer-DN2Mo3vc.mjs +0 -1
  342. package/dist/web-components/vtt-C5M5WPSG.mjs +0 -5
  343. 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,
@@ -714,6 +743,10 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
714
743
  autoPlay: !player && stills.length > 0 && model.quietlyOpened !== canvasKey,
715
744
  language,
716
745
  notes: model.timed,
746
+ marked: model.placed,
747
+ selectedAnnotation: model.selected,
748
+ onAnnotationSelect: hasAnnotations ? model.select : void 0,
749
+ onAnnotationActivate: model.activate,
717
750
  player: player && canvases ? {
718
751
  canvas: canvases[0],
719
752
  title: ownName,
@@ -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 = ({
@@ -33,6 +35,10 @@ const MediaBody = ({
33
35
  onChapterHighlight,
34
36
  language: givenLanguage,
35
37
  notes,
38
+ marked,
39
+ selectedAnnotation,
40
+ onAnnotationSelect,
41
+ onAnnotationActivate,
36
42
  player
37
43
  }) => {
38
44
  var _a, _b;
@@ -189,6 +195,31 @@ const MediaBody = ({
189
195
  ),
190
196
  [notes, currentTime]
191
197
  );
198
+ const marking = useMemo(() => {
199
+ var _a2, _b2;
200
+ const byId = /* @__PURE__ */ new Map();
201
+ const marks = [];
202
+ for (const annotation of [
203
+ ...notes ?? [],
204
+ ...(marked ?? []).filter((each) => {
205
+ var _a3;
206
+ return (_a3 = each.track) == null ? void 0 : _a3.length;
207
+ })
208
+ ]) {
209
+ const start = "start" in annotation ? annotation.start : (_b2 = (_a2 = annotation.track) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.start;
210
+ if (start === void 0 || !annotation.label || byId.has(annotation.id))
211
+ continue;
212
+ byId.set(annotation.id, annotation);
213
+ marks.push({
214
+ id: annotation.id,
215
+ start,
216
+ label: annotation.label,
217
+ lang: annotation.lang
218
+ });
219
+ }
220
+ marks.sort((a, b) => a.start - b.start);
221
+ return { marks, byId };
222
+ }, [notes, marked]);
192
223
  const transport = /* @__PURE__ */ jsx(
193
224
  Transport,
194
225
  {
@@ -211,7 +242,14 @@ const MediaBody = ({
211
242
  highlightedChapter,
212
243
  onChapterHighlight,
213
244
  request,
214
- fill
245
+ fill,
246
+ marks: marking.marks,
247
+ selectedMark: selectedAnnotation,
248
+ onMarkSelect: onAnnotationSelect && ((id) => {
249
+ const annotation = marking.byId.get(id);
250
+ if (annotation) onAnnotationSelect(annotation);
251
+ }),
252
+ onMarkActivate: onAnnotationActivate
215
253
  }
216
254
  );
217
255
  const noteLines = playing.map((note) => /* @__PURE__ */ jsxs(
@@ -266,15 +304,7 @@ const MediaBody = ({
266
304
  language
267
305
  }
268
306
  ),
269
- playing.length > 0 && /* @__PURE__ */ jsx(
270
- "div",
271
- {
272
- className: "clover-canvas-captions clover-canvas-player-notes",
273
- "aria-live": "off",
274
- children: noteLines
275
- }
276
- ),
277
- cues.length > 0 && /* @__PURE__ */ jsx("div", { className: "clover-canvas-captions", "aria-live": "off", children: captionLines }),
307
+ /* @__PURE__ */ jsx("div", { className: "clover-canvas-player-cues", children: cues.length > 0 && /* @__PURE__ */ jsx("div", { className: "clover-canvas-captions", "aria-live": "off", children: captionLines }) }),
278
308
  transport,
279
309
  /* @__PURE__ */ jsx(BodyUnloadable, { kind: media.kind, shown: failed, room: true })
280
310
  ] })
@@ -363,6 +393,7 @@ function containAspect(box, size) {
363
393
  height
364
394
  };
365
395
  }
396
+ adoptSheet("media", __clover_sheet_media);
366
397
  export {
367
398
  containAspect,
368
399
  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
  };