@nulib/clover 4.3.0 → 4.4.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 (289) hide show
  1. package/dist/components/Canvas/CanvasView.mjs +4 -0
  2. package/dist/components/Canvas/media/MediaBody.mjs +38 -10
  3. package/dist/components/Canvas/media/SeekMarks.mjs +236 -0
  4. package/dist/components/Canvas/media/Transport.mjs +26 -3
  5. package/dist/components/Canvas/media/useMediaElement.mjs +23 -11
  6. package/dist/components/Items/Item.mjs +30 -21
  7. package/dist/components/Items/Items.mjs +3 -1
  8. package/dist/components/Items/PagerLayout.mjs +1 -0
  9. package/dist/components/Map/MapView.mjs +7 -6
  10. package/dist/components/Panel/PanelToggle.mjs +3 -1
  11. package/dist/index.d.mts +26 -3
  12. package/dist/index.mjs +2 -1
  13. package/dist/map/index.d.mts +6 -0
  14. package/dist/react/hooks.mjs +3 -1
  15. package/dist/styles/core.css +1 -1
  16. package/dist/styles/default.css +1 -1
  17. package/dist/styles/media.css +1 -1
  18. package/dist/styles.css +1 -1
  19. package/dist/templates/document/Document.mjs +2 -3
  20. package/dist/templates/index.d.mts +433 -0
  21. package/dist/templates/index.mjs +19 -2
  22. package/dist/templates/shared/LightboxView.mjs +7 -5
  23. package/dist/templates/shared/PanelPane.mjs +27 -13
  24. package/dist/ui/Button.mjs +3 -1
  25. package/dist/ui/sheets/media.mjs +1 -1
  26. package/dist/web-components/{About-uNCjvWgs.mjs → About-BtaFd4AF.mjs} +1 -1
  27. package/dist/web-components/{AnnotationItems-JwlcCvPo.mjs → AnnotationItems-CowjcNUd.mjs} +1 -1
  28. package/dist/web-components/{AnnotationMenu-BWyKEyvW.mjs → AnnotationMenu-CuR-ZArp.mjs} +1 -1
  29. package/dist/web-components/{AnnotationState-Bhqs75Br.mjs → AnnotationState-DYkjbBGk.mjs} +1 -1
  30. package/dist/web-components/{Annotations-ZwcRh2UE.mjs → Annotations-BbSg10Oz.mjs} +1 -1
  31. package/dist/web-components/{Annotations-C7y0N8Lj.mjs → Annotations-CzeyfbPR.mjs} +1 -1
  32. package/dist/web-components/{Body-DyrvRDkt.mjs → Body-Bh8Nu8Fo.mjs} +1 -1
  33. package/dist/web-components/{BodyAlert-XV88XjL8.mjs → BodyAlert-Cra_XvnG.mjs} +1 -1
  34. package/dist/web-components/Button-CE-5ew-f.mjs +1 -0
  35. package/dist/web-components/{Camera-7SlnmGtb.mjs → Camera-Cr2RIqCs.mjs} +1 -1
  36. package/dist/web-components/{Canvas2DBackend-DBGZRGid.mjs → Canvas2DBackend-CH8h2VnH.mjs} +1 -1
  37. package/dist/web-components/CanvasView-DcrhjwpU.mjs +2 -0
  38. package/dist/web-components/{CaptionDetails-Bxz8AXMz.mjs → CaptionDetails-BgsrrXAm.mjs} +1 -1
  39. package/dist/web-components/{ChaptersMenu-CMQiBqvx.mjs → ChaptersMenu-Bl6PPqt2.mjs} +1 -1
  40. package/dist/web-components/{Chevron-B3XaClVT.mjs → Chevron-CePM9HdR.mjs} +1 -1
  41. package/dist/web-components/{ChoiceMenu-pugo5zxI.mjs → ChoiceMenu-ClsLiaxQ.mjs} +1 -1
  42. package/dist/web-components/{Collection-Ch_FeSKp.mjs → Collection-a_DaYUM4.mjs} +1 -1
  43. package/dist/web-components/{CollectionSelect-2jDEkOcK.mjs → CollectionSelect-XLruVPnQ.mjs} +1 -1
  44. package/dist/web-components/{Connected-3hnIPSWM.mjs → Connected-BqaysSD7.mjs} +1 -1
  45. package/dist/web-components/{Connected-Bne3I5E1.mjs → Connected-D30kPwoX.mjs} +1 -1
  46. package/dist/web-components/{Connected-DuANHN93.mjs → Connected-D_Y8fBZk.mjs} +1 -1
  47. package/dist/web-components/{Contents-DIQrin_-.mjs → Contents-CA6CnTu3.mjs} +1 -1
  48. package/dist/web-components/{ControlMenu-BydnCTTQ.mjs → ControlMenu-BTGCnS_-.mjs} +1 -1
  49. package/dist/web-components/ControlsFade-D-SexeLX.mjs +1 -0
  50. package/dist/web-components/{CountMenu-CReBYVwu.mjs → CountMenu-CpM-FXwx.mjs} +1 -1
  51. package/dist/web-components/Cue-DghSvEx4.mjs +1 -0
  52. package/dist/web-components/Document-FFVXMPwT.mjs +1 -0
  53. package/dist/web-components/{DomLayers-D9X_FPto.mjs → DomLayers-mS4hhHRF.mjs} +1 -1
  54. package/dist/web-components/{Download-B8MpVqgk.mjs → Download-CqYuifok.mjs} +1 -1
  55. package/dist/web-components/{EntryBodies-DdpRfU5U.mjs → EntryBodies-3IO45Orn.mjs} +1 -1
  56. package/dist/web-components/{EntryThumbnail-DM7Zjj1z.mjs → EntryThumbnail-Anfv7mFZ.mjs} +1 -1
  57. package/dist/web-components/{FieldPill-BAql8_6s.mjs → FieldPill-pocIy1LB.mjs} +1 -1
  58. package/dist/web-components/{FrameAnimation-Dj46RxuL.mjs → FrameAnimation-R4MeMOFu.mjs} +1 -1
  59. package/dist/web-components/{Gallery-B9FNA02Z.mjs → Gallery-DvS3b7CP.mjs} +1 -1
  60. package/dist/web-components/{HideToggle-duXvDvDw.mjs → HideToggle-29T-__gd.mjs} +1 -1
  61. package/dist/web-components/{ImageControls-DODKjC0d.mjs → ImageControls-1LGEiMZc.mjs} +1 -1
  62. package/dist/web-components/Items-GF8INTZw.mjs +1 -0
  63. package/dist/web-components/{Label-D4dlrtpH.mjs → Label-CMEDN1xd.mjs} +1 -1
  64. package/dist/web-components/{LanguageChoice-DR3X-dtJ.mjs → LanguageChoice-E8VCduh-.mjs} +1 -1
  65. package/dist/web-components/LightboxView-CKK5mjZc.mjs +1 -0
  66. package/dist/web-components/{ListEnd-CQ4vX-NW.mjs → ListEnd-YjSPUw9O.mjs} +1 -1
  67. package/dist/web-components/{Loaded-DsNSPXWf.mjs → Loaded-CTi6A9VS.mjs} +1 -1
  68. package/dist/web-components/{LoadedCanvas-Cq7_O2bw.mjs → LoadedCanvas-Bdqqh01C.mjs} +1 -1
  69. package/dist/web-components/LoadedMap-DN3MdhcJ.mjs +1 -0
  70. package/dist/web-components/{Loading-4PmhMeZ-.mjs → Loading-tVzMiUqD.mjs} +1 -1
  71. package/dist/web-components/{Map-B29Ba50b.mjs → Map-X1sSxMhL.mjs} +1 -1
  72. package/dist/web-components/MapView-nkpoN7X_.mjs +3 -0
  73. package/dist/web-components/{Markup-BZ7l5GbG.mjs → Markup-Bowjvwik.mjs} +1 -1
  74. package/dist/web-components/MediaBody-B-sQOihV.mjs +1 -0
  75. package/dist/web-components/MediaBody-DZZrA-DM.mjs +1 -0
  76. package/dist/web-components/{NavDate-0MsHRjBW.mjs → NavDate-Cc5i7OTE.mjs} +1 -1
  77. package/dist/web-components/{Navigator-qJ79A8Nk.mjs → Navigator-BAlMH9x3.mjs} +1 -1
  78. package/dist/web-components/{Pager-SPd_u0qz.mjs → Pager-DmIPop9E.mjs} +1 -1
  79. package/dist/web-components/PagerLayout-DPIiFt_i.mjs +1 -0
  80. package/dist/web-components/{Panel-C8r3EsWn.mjs → Panel-COAOFI-u.mjs} +1 -1
  81. package/dist/web-components/PanelPart-DGYFBVl7.mjs +1 -0
  82. package/dist/web-components/PanelToggle-C4B6UY5p.mjs +1 -0
  83. package/dist/web-components/{PartOfManifest-BdDSxK4k.mjs → PartOfManifest-DpZTyo9I.mjs} +1 -1
  84. package/dist/web-components/{Pending-CmgVU1kF.mjs → Pending-Ci8Pe6Ip.mjs} +1 -1
  85. package/dist/web-components/{PlaceBox-D7HLNGxE.mjs → PlaceBox-vlZhTMoG.mjs} +1 -1
  86. package/dist/web-components/{Placeholder-DVAlXejQ.mjs → Placeholder-DrJKiL3N.mjs} +1 -1
  87. package/dist/web-components/{Position-C6KUAceQ.mjs → Position-D46qbQob.mjs} +1 -1
  88. package/dist/web-components/{Primitives-ClQVjY6x.mjs → Primitives-CijKEUFK.mjs} +1 -1
  89. package/dist/web-components/{Provider-C0IUdU6v.mjs → Provider-hKagyo0v.mjs} +1 -1
  90. package/dist/web-components/{ReadMore-BiEJA4yO.mjs → ReadMore-B-l-lJxV.mjs} +1 -1
  91. package/dist/web-components/{Root-Drt5N4_s.mjs → Root-3orKkAAl.mjs} +1 -1
  92. package/dist/web-components/Scene-CQmIsctH.mjs +1 -0
  93. package/dist/web-components/{SceneView-BHg37-rs.mjs → SceneView-B8_AOroA.mjs} +1 -1
  94. package/dist/web-components/{Search-Bpd_lGzH.mjs → Search-BQhTX9cc.mjs} +1 -1
  95. package/dist/web-components/{Sections-D_bS5IQH.mjs → Sections-DK04V31W.mjs} +1 -1
  96. package/dist/web-components/SeekMarks-tjdJi7bR.mjs +1 -0
  97. package/dist/web-components/{StandaloneItems-YV9O9M8F.mjs → StandaloneItems-3l4YBXUu.mjs} +1 -1
  98. package/dist/web-components/{Status-BCG7AN9B.mjs → Status-ZeDFIe5P.mjs} +1 -1
  99. package/dist/web-components/{Steps-Dnn8Ajqf.mjs → Steps-Dw4i3bYY.mjs} +1 -1
  100. package/dist/web-components/{TargetItems-xxbtePln.mjs → TargetItems-DkNwteSd.mjs} +1 -1
  101. package/dist/web-components/Timeline-wqnaRrC1.mjs +1 -0
  102. package/dist/web-components/{Tip-DPFWlNLu.mjs → Tip-Dd_jhbIx.mjs} +1 -1
  103. package/dist/web-components/{Transcript-C-_DbUO5.mjs → Transcript-CVfpxNjD.mjs} +1 -1
  104. package/dist/web-components/Transport-DGXTdsId.mjs +1 -0
  105. package/dist/web-components/Transport-DJB0UXR1.mjs +1 -0
  106. package/dist/web-components/{annotation-collection-nmxzo_hO.mjs → annotation-collection-BTpPigqD.mjs} +1 -1
  107. package/dist/web-components/{annotation-name-DoUUo-8D.mjs → annotation-name-CFvHyKti.mjs} +1 -1
  108. package/dist/web-components/{annotations-content-Cl1upbdd.mjs → annotations-content-GrkrBVh0.mjs} +1 -1
  109. package/dist/web-components/{body-DC8Oq8rY.mjs → body-fIGeqGQD.mjs} +1 -1
  110. package/dist/web-components/{canvas-gzoTnBxw.mjs → canvas-BS2SLLKS.mjs} +1 -1
  111. package/dist/web-components/{cloverEngine-CFL1Bd7n.mjs → cloverEngine-CQIuzG6M.mjs} +1 -1
  112. package/dist/web-components/{content-state-reader-DYbmXxCp.mjs → content-state-reader-CYaSfkCN.mjs} +1 -1
  113. package/dist/web-components/{controlGlyphs-d7KUIUwi.mjs → controlGlyphs-DbocsVHI.mjs} +1 -1
  114. package/dist/web-components/{controls-VC9D1mwr.mjs → controls-wzIEvR64.mjs} +1 -1
  115. package/dist/web-components/custom-elements.json +22 -0
  116. package/dist/web-components/{downloads-D2cnWDbs.mjs → downloads-7EkgG29z.mjs} +1 -1
  117. package/dist/web-components/{dragToClose-CzYeh_12.mjs → dragToClose-Bop25BOK.mjs} +1 -1
  118. package/dist/web-components/{engine-Dcfyp2DV.mjs → engine-cAKeOT-F.mjs} +1 -1
  119. package/dist/web-components/{engines-BMr7naGM.mjs → engines-DJ3NJG7R.mjs} +1 -1
  120. package/dist/web-components/{fetchManifest-DxptUh4u.mjs → fetchManifest-BchmTYKJ.mjs} +1 -1
  121. package/dist/web-components/{fromManifest-BpPFLVyZ.mjs → fromManifest-IctmL1Dl.mjs} +1 -1
  122. package/dist/web-components/{glyphs-BCnJl8py.mjs → glyphs-BO-1m6-c.mjs} +1 -1
  123. package/dist/web-components/{hooks-Dz_5UXXp.mjs → hooks-Dl6ZSn_E.mjs} +1 -1
  124. package/dist/web-components/{image-layers-BPnq7jk1.mjs → image-layers-BWmHzoSJ.mjs} +1 -1
  125. package/dist/web-components/{imageService-DFPkPNfe.mjs → imageService-Dhb-E5rq.mjs} +1 -1
  126. package/dist/web-components/index-BAkCMEQf.mjs +1 -0
  127. package/dist/web-components/index.d.mts +3 -0
  128. package/dist/web-components/index.mjs +1 -1
  129. package/dist/web-components/{items-D03KhDg6.mjs → items-CDbMZvPN.mjs} +1 -1
  130. package/dist/web-components/items-Z6uMtKSM.mjs +1 -0
  131. package/dist/web-components/label-B32XGxUM.mjs +1 -0
  132. package/dist/web-components/{layout-DVa_DnGH.mjs → layout-BixQWLYR.mjs} +1 -1
  133. package/dist/web-components/{link-DxXxMXiw.mjs → link-DoDZrIK7.mjs} +1 -1
  134. package/dist/web-components/logo-DFdob1X0.mjs +1 -0
  135. package/dist/web-components/{models-pO77sm3z.mjs → models-qg8TrXAe.mjs} +1 -1
  136. package/dist/web-components/{nodes-CmL3eoRE.mjs → nodes-C_TYa0cJ.mjs} +1 -1
  137. package/dist/web-components/{overlayImage-DFGetjMh.mjs → overlayImage-utUhUeIp.mjs} +1 -1
  138. package/dist/web-components/{panel-B1vzUm6_.mjs → panel-Do2CIE4L.mjs} +1 -1
  139. package/dist/web-components/part-1MCSi0Gx.mjs +1 -0
  140. package/dist/web-components/{playerSurface-CQ1wrIAQ.mjs → playerSurface-D3T1sYp4.mjs} +1 -1
  141. package/dist/web-components/{pointer-DWnCT3D3.mjs → pointer-CAZRjvDP.mjs} +1 -1
  142. package/dist/web-components/{provider-U7xzX_0T.mjs → provider-CTvn2JYS.mjs} +1 -1
  143. package/dist/web-components/{range-regions-Di_lmVqZ.mjs → range-regions-Bn6iZRLa.mjs} +1 -1
  144. package/dist/web-components/{read-more-BtA1sriO.mjs → read-more-sUL-TwGp.mjs} +1 -1
  145. package/dist/web-components/{readingLanguages-Ptho-Co9.mjs → readingLanguages-JQPbnrhL.mjs} +1 -1
  146. package/dist/web-components/{rendererSurface-BgZPnAwj.mjs → rendererSurface-CE09-Vp6.mjs} +2 -2
  147. package/dist/web-components/{renderers-hoD3WKYA.mjs → renderers-J_Go4mqn.mjs} +1 -1
  148. package/dist/web-components/{resource-DuTMsPEj.mjs → resource-DU94ocC-.mjs} +1 -1
  149. package/dist/web-components/{save-file-CLB5IM4a.mjs → save-file-CYFtT-_E.mjs} +1 -1
  150. package/dist/web-components/{search-Dd2Y1dsZ.mjs → search-BhcYrsRY.mjs} +1 -1
  151. package/dist/web-components/{shared-CCg1Iag8.mjs → shared-BtCBrxx9.mjs} +1 -1
  152. package/dist/web-components/{show-link-NjacLIdz.mjs → show-link-21y7MiKT.mjs} +1 -1
  153. package/dist/web-components/{sizedImage-CKOGmqhN.mjs → sizedImage-C4pD0cZa.mjs} +1 -1
  154. package/dist/web-components/{split-CcoXZcGX.mjs → split-w6D-xEIb.mjs} +1 -1
  155. package/dist/web-components/{status-B4a3Izph.mjs → status-Yo7BOr8p.mjs} +1 -1
  156. package/dist/web-components/styles-CAv9WP3T.mjs +1 -0
  157. package/dist/web-components/three.mjs +1 -1
  158. package/dist/web-components/{thumbnail-ez20ssEY.mjs → thumbnail-BdKVLxxw.mjs} +1 -1
  159. package/dist/web-components/{tip-DeFPN33O.mjs → tip-D1BgXKQ-.mjs} +1 -1
  160. package/dist/web-components/toggle-Cqtdko9H.mjs +1 -0
  161. package/dist/web-components/{useContainerName-BfyeBf6_.mjs → useContainerName-C2L1lj9-.mjs} +1 -1
  162. package/dist/web-components/{useControlsVisibility-oRiMiQhD.mjs → useControlsVisibility-B4X3mKyY.mjs} +1 -1
  163. package/dist/web-components/{useNearViewport-BADiMpLi.mjs → useNearViewport-DWtnayYx.mjs} +1 -1
  164. package/dist/web-components/{useScrollTrack-9QsMaHSx.mjs → useScrollTrack-D-Yh7v0Q.mjs} +1 -1
  165. package/dist/web-components/viewer/AnnotationItems-DJxYDDLY.mjs +1 -0
  166. package/dist/web-components/viewer/{AnnotationMenu-d5PT7q8D.mjs → AnnotationMenu-CBQft8tP.mjs} +1 -1
  167. package/dist/web-components/viewer/AnnotationState-D-pYs13c.mjs +1 -0
  168. package/dist/web-components/viewer/{Annotations-D_wg4O99.mjs → Annotations-KDQunny2.mjs} +1 -1
  169. package/dist/web-components/viewer/{Annotations-DKWYJOo2.mjs → Annotations-yD1LhlP3.mjs} +2 -2
  170. package/dist/web-components/viewer/{Canvas2DBackend-B4IXvdsN.mjs → Canvas2DBackend-M6vNWI1j.mjs} +1 -1
  171. package/dist/web-components/viewer/CaptionDetails-BhXwMQyX.mjs +1 -0
  172. package/dist/web-components/viewer/{ChaptersMenu-CaAIaRZN.mjs → ChaptersMenu-CQoZerOz.mjs} +1 -1
  173. package/dist/web-components/viewer/ChoiceMenu-zk7-RWGR.mjs +1 -0
  174. package/dist/web-components/viewer/Collection-CMHNssor.mjs +1 -0
  175. package/dist/web-components/viewer/{Connected-9VGl2Xnx.mjs → Connected-CWTe22Y4.mjs} +1 -1
  176. package/dist/web-components/viewer/{Connected-Cd2qwuuo.mjs → Connected-o-wFtqr5.mjs} +1 -1
  177. package/dist/web-components/viewer/{Contents-CsG9e7v2.mjs → Contents-6XNd1KtI.mjs} +1 -1
  178. package/dist/web-components/viewer/{ControlMenu-q_u_UC8q.mjs → ControlMenu-D5LwsByV.mjs} +1 -1
  179. package/dist/web-components/viewer/ControlsFade-C164aYHv.mjs +1 -0
  180. package/dist/web-components/viewer/{CountMenu-Dn0-z5A9.mjs → CountMenu-DGWnbRTj.mjs} +1 -1
  181. package/dist/web-components/viewer/Cue-RCMyZKdq.mjs +1 -0
  182. package/dist/web-components/viewer/Document-XCWKzfno.mjs +1 -0
  183. package/dist/web-components/viewer/{DomLayers-CwHg1jZg.mjs → DomLayers-D5F-HKU-.mjs} +1 -1
  184. package/dist/web-components/viewer/{Download-Clx_e2ga.mjs → Download-D9sTED6x.mjs} +1 -1
  185. package/dist/web-components/viewer/{EntryBodies-B4SnV6NJ.mjs → EntryBodies-D9GDp-K4.mjs} +1 -1
  186. package/dist/web-components/viewer/{EntryThumbnail-CsAqKh38.mjs → EntryThumbnail-FgoJmUgn.mjs} +1 -1
  187. package/dist/web-components/viewer/{FieldPill-NQfq8SXA.mjs → FieldPill-BRzwSwLf.mjs} +1 -1
  188. package/dist/web-components/viewer/{FrameAnimation-wN2VNW7D.mjs → FrameAnimation-BfqvPgd9.mjs} +1 -1
  189. package/dist/web-components/viewer/{Gallery-nX9kQlft.mjs → Gallery-71gebgEA.mjs} +1 -1
  190. package/dist/web-components/viewer/HideToggle-rX4vxm05.mjs +1 -0
  191. package/dist/web-components/viewer/{ImageControls--qeUY5kg.mjs → ImageControls-XEFV3Uq0.mjs} +1 -1
  192. package/dist/web-components/viewer/{LanguageChoice-CZ6K3Mhv.mjs → LanguageChoice-DXFfN1n1.mjs} +1 -1
  193. package/dist/web-components/viewer/LightboxView-CF4mcC0I.mjs +1 -0
  194. package/dist/web-components/viewer/ListEnd-BlsK9wx6.mjs +1 -0
  195. package/dist/web-components/viewer/MapView-DCxcUkUC.mjs +3 -0
  196. package/dist/web-components/viewer/MediaBody-4ZFKNnr3.mjs +1 -0
  197. package/dist/web-components/viewer/MediaBody-B_T8alBZ.mjs +1 -0
  198. package/dist/web-components/viewer/{NavDate-Clj6OMa6.mjs → NavDate-DtMXkvCo.mjs} +1 -1
  199. package/dist/web-components/viewer/{Navigator-DPdR3SYX.mjs → Navigator-B4RQiJXK.mjs} +1 -1
  200. package/dist/web-components/viewer/PagerLayout-CAk2XDZs.mjs +1 -0
  201. package/dist/web-components/viewer/PanelPart-DyxYm0ly.mjs +1 -0
  202. package/dist/web-components/viewer/{PartOfManifest-NAXs2DYd.mjs → PartOfManifest-Cu4fmoxn.mjs} +1 -1
  203. package/dist/web-components/viewer/{PlaceBox-C2k5Fsfo.mjs → PlaceBox-CSYpxMgb.mjs} +1 -1
  204. package/dist/web-components/viewer/{Placeholder-DF6dRMjt.mjs → Placeholder-DLJ6qaSl.mjs} +1 -1
  205. package/dist/web-components/viewer/{Search-DoUc8tWu.mjs → Search-BOI3sJa2.mjs} +1 -1
  206. package/dist/web-components/viewer/SeekMarks-DfTSWZph.mjs +1 -0
  207. package/dist/web-components/viewer/StandaloneItems-B1Ul8G2q.mjs +1 -0
  208. package/dist/web-components/viewer/Steps-5eg2Dbfd.mjs +1 -0
  209. package/dist/web-components/viewer/{TargetItems-DOFSQtYR.mjs → TargetItems-5JGXJ5e4.mjs} +1 -1
  210. package/dist/web-components/viewer/{Transcript-Dy-FHWMo.mjs → Transcript-jk8NyuUI.mjs} +1 -1
  211. package/dist/web-components/viewer/Transport-BbvsG9Qr.mjs +1 -0
  212. package/dist/web-components/viewer/Transport-D0-7mRrT.mjs +1 -0
  213. package/dist/web-components/viewer/{annotation-collection-A0PNdPhI.mjs → annotation-collection-C_5hyuvw.mjs} +1 -1
  214. package/dist/web-components/viewer/{annotation-name-CfQs7Mb2.mjs → annotation-name-Bb6Dgo3i.mjs} +1 -1
  215. package/dist/web-components/viewer/{annotations-content-B52-zM99.mjs → annotations-content-Jts8hjGT.mjs} +1 -1
  216. package/dist/web-components/viewer/{cloverEngine-4sgpB7Rz.mjs → cloverEngine-rvO-m6rC.mjs} +2 -2
  217. package/dist/web-components/viewer/{content-state-reader-vtATl-W3.mjs → content-state-reader-CP0H4Gnm.mjs} +1 -1
  218. package/dist/web-components/viewer/{dragToClose-B4rj1D3r.mjs → dragToClose-CfijwC7H.mjs} +1 -1
  219. package/dist/web-components/viewer/{fetchManifest-gAj8phm4.mjs → fetchManifest-CI3k9v0b.mjs} +1 -1
  220. package/dist/web-components/viewer/{host-Hv8WXfiF.mjs → host-CTbjXNd9.mjs} +1 -1
  221. package/dist/web-components/viewer/image-layers-C3YwnNvq.mjs +1 -0
  222. package/dist/web-components/viewer/index.mjs +1 -1
  223. package/dist/web-components/viewer/{link-DIh6ysyo.mjs → link-CUm6T-7L.mjs} +1 -1
  224. package/dist/web-components/viewer/overlayImage-JHIugjA0.mjs +1 -0
  225. package/dist/web-components/viewer/range-regions-ulWKWvhS.mjs +1 -0
  226. package/dist/web-components/viewer/{renderers-C5EfPrd7.mjs → renderers-Hs9tzSPp.mjs} +1 -1
  227. package/dist/web-components/viewer/{save-file-dIa0LCAn.mjs → save-file-CWKAFvNb.mjs} +1 -1
  228. package/dist/web-components/viewer/{search-Bbv9dCNq.mjs → search-HCPnXtXW.mjs} +1 -1
  229. package/dist/web-components/viewer/styles-DvZTMHkr.mjs +1 -0
  230. package/dist/web-components/viewer/{useControlsVisibility-jopIdHZi.mjs → useControlsVisibility-ClvKjBYI.mjs} +1 -1
  231. package/dist/web-components/viewer/viewer-BFDNip3h.mjs +29 -0
  232. package/dist/web-components/viewer/{vtt-DpgB_K8v.mjs → vtt-B3wqH_vT.mjs} +1 -1
  233. package/dist/web-components/viewer-C-eGBKAn.mjs +1 -0
  234. package/dist/web-components/{vtt-KUQbi4PK.mjs → vtt-BYJ_dF4L.mjs} +1 -1
  235. package/package.json +1 -1
  236. package/dist/templates/shared/useLazyPanelPane.mjs +0 -16
  237. package/dist/web-components/Button-BIaw5k1q.mjs +0 -1
  238. package/dist/web-components/CanvasView-CmDxczm9.mjs +0 -2
  239. package/dist/web-components/ControlsFade-CleBsk-W.mjs +0 -1
  240. package/dist/web-components/Cue-2zGQuUOC.mjs +0 -1
  241. package/dist/web-components/Document-pjc2qOX4.mjs +0 -1
  242. package/dist/web-components/Items-BHTQJU7T.mjs +0 -1
  243. package/dist/web-components/LightboxView-D-aBaKfB.mjs +0 -1
  244. package/dist/web-components/LoadedMap-0_prxuA4.mjs +0 -1
  245. package/dist/web-components/MapView-nHeg39Kz.mjs +0 -3
  246. package/dist/web-components/MediaBody-DH-rr_0N.mjs +0 -1
  247. package/dist/web-components/MediaBody-eSThjFzH.mjs +0 -1
  248. package/dist/web-components/PagerLayout-CkSwDAnp.mjs +0 -1
  249. package/dist/web-components/PanelPart-BA1NoeLA.mjs +0 -1
  250. package/dist/web-components/PanelToggle-CrKP8BqE.mjs +0 -1
  251. package/dist/web-components/Scene-C7t16NjC.mjs +0 -1
  252. package/dist/web-components/Timeline-Danuk_Nn.mjs +0 -1
  253. package/dist/web-components/Transport-BKona8RD.mjs +0 -1
  254. package/dist/web-components/Transport-Bonmu77-.mjs +0 -1
  255. package/dist/web-components/index-ClM6Kq8w.mjs +0 -1
  256. package/dist/web-components/items-BHporT5i.mjs +0 -1
  257. package/dist/web-components/label-r0ki6r1U.mjs +0 -1
  258. package/dist/web-components/logo-Br42Vlsk.mjs +0 -1
  259. package/dist/web-components/part-DmRBh4pf.mjs +0 -1
  260. package/dist/web-components/styles-C7PVxtkQ.mjs +0 -1
  261. package/dist/web-components/toggle-CGSnnjW-.mjs +0 -1
  262. package/dist/web-components/useLazyPanelPane-CReKsr8z.mjs +0 -1
  263. package/dist/web-components/viewer/AnnotationItems-Cvh3jfmf.mjs +0 -1
  264. package/dist/web-components/viewer/AnnotationState-DbtYTHMy.mjs +0 -1
  265. package/dist/web-components/viewer/CaptionDetails-Bxh9VD7n.mjs +0 -1
  266. package/dist/web-components/viewer/ChoiceMenu-Clp4Zeog.mjs +0 -1
  267. package/dist/web-components/viewer/Collection-C5BfoUOH.mjs +0 -1
  268. package/dist/web-components/viewer/ControlsFade-Db3IWArv.mjs +0 -1
  269. package/dist/web-components/viewer/Cue-slOJQhPI.mjs +0 -1
  270. package/dist/web-components/viewer/Document-r3Sz3RfH.mjs +0 -1
  271. package/dist/web-components/viewer/HideToggle-B843JuKU.mjs +0 -1
  272. package/dist/web-components/viewer/LightboxView-BcbP3cJD.mjs +0 -1
  273. package/dist/web-components/viewer/ListEnd-DbYDv46a.mjs +0 -1
  274. package/dist/web-components/viewer/MapView-Dj7Iq7P2.mjs +0 -3
  275. package/dist/web-components/viewer/MediaBody-TN4XsCm7.mjs +0 -1
  276. package/dist/web-components/viewer/MediaBody-iAxGgXNy.mjs +0 -1
  277. package/dist/web-components/viewer/PagerLayout-CtlmDRjI.mjs +0 -1
  278. package/dist/web-components/viewer/PanelPart-DzZWRlK1.mjs +0 -1
  279. package/dist/web-components/viewer/StandaloneItems-DuXasJO0.mjs +0 -1
  280. package/dist/web-components/viewer/Steps-B3MrG4Cv.mjs +0 -1
  281. package/dist/web-components/viewer/Transport-C5wkxVOF.mjs +0 -1
  282. package/dist/web-components/viewer/Transport-CUXmY_jW.mjs +0 -1
  283. package/dist/web-components/viewer/image-layers-gFEDKVkV.mjs +0 -1
  284. package/dist/web-components/viewer/overlayImage-BRjcH40Q.mjs +0 -1
  285. package/dist/web-components/viewer/range-regions-uPqjKIER.mjs +0 -1
  286. package/dist/web-components/viewer/styles-L1HpSoL2.mjs +0 -1
  287. package/dist/web-components/viewer/useLazyPanelPane-CoPgtYkx.mjs +0 -1
  288. package/dist/web-components/viewer/viewer-DqpSyvH-.mjs +0 -29
  289. package/dist/web-components/viewer-D2lGdifc.mjs +0 -1
@@ -743,6 +743,10 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
743
743
  autoPlay: !player && stills.length > 0 && model.quietlyOpened !== canvasKey,
744
744
  language,
745
745
  notes: model.timed,
746
+ marked: model.placed,
747
+ selectedAnnotation: model.selected,
748
+ onAnnotationSelect: hasAnnotations ? model.select : void 0,
749
+ onAnnotationActivate: model.activate,
746
750
  player: player && canvases ? {
747
751
  canvas: canvases[0],
748
752
  title: ownName,
@@ -35,6 +35,10 @@ const MediaBody = ({
35
35
  onChapterHighlight,
36
36
  language: givenLanguage,
37
37
  notes,
38
+ marked,
39
+ selectedAnnotation,
40
+ onAnnotationSelect,
41
+ onAnnotationActivate,
38
42
  player
39
43
  }) => {
40
44
  var _a, _b;
@@ -191,6 +195,31 @@ const MediaBody = ({
191
195
  ),
192
196
  [notes, currentTime]
193
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]);
194
223
  const transport = /* @__PURE__ */ jsx(
195
224
  Transport,
196
225
  {
@@ -213,7 +242,14 @@ const MediaBody = ({
213
242
  highlightedChapter,
214
243
  onChapterHighlight,
215
244
  request,
216
- 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
217
253
  }
218
254
  );
219
255
  const noteLines = playing.map((note) => /* @__PURE__ */ jsxs(
@@ -268,15 +304,7 @@ const MediaBody = ({
268
304
  language
269
305
  }
270
306
  ),
271
- playing.length > 0 && /* @__PURE__ */ jsx(
272
- "div",
273
- {
274
- className: "clover-canvas-captions clover-canvas-player-notes",
275
- "aria-live": "off",
276
- children: noteLines
277
- }
278
- ),
279
- 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 }) }),
280
308
  transport,
281
309
  /* @__PURE__ */ jsx(BodyUnloadable, { kind: media.kind, shown: failed, room: true })
282
310
  ] })
@@ -0,0 +1,236 @@
1
+ "use client";
2
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
+ import { useRef, useState, useLayoutEffect, useMemo } from "react";
4
+ import { alongBar } from "./seekGaps.mjs";
5
+ import { Steps } from "../../../ui/Steps.mjs";
6
+ import { hideUntilBack } from "../../../ui/Tip.mjs";
7
+ import { useCloverTranslation } from "../../../i18n/useCloverTranslation.mjs";
8
+ import { languageProps } from "../../../i18n/direction.mjs";
9
+ import { formatTime } from "../../../lib/time.mjs";
10
+ const THUMB = 12;
11
+ function groupMarks(marks, duration, width, target) {
12
+ const x = (mark) => THUMB / 2 + (width - THUMB) * (mark.start / duration);
13
+ const groups = [];
14
+ for (const mark of marks) {
15
+ const group = groups[groups.length - 1];
16
+ const near = group ? width > 0 ? x(mark) - x(group[0]) < target : mark.start === group[0].start : false;
17
+ if (near) group.push(mark);
18
+ else groups.push([mark]);
19
+ }
20
+ return groups;
21
+ }
22
+ const SCROLL_KEYS = {
23
+ ArrowDown: (words) => parseFloat(getComputedStyle(words).lineHeight) || 16,
24
+ ArrowUp: (words) => -(parseFloat(getComputedStyle(words).lineHeight) || 16),
25
+ PageDown: (words) => words.clientHeight,
26
+ PageUp: (words) => -words.clientHeight
27
+ };
28
+ function scrollWords(event) {
29
+ const words = event.currentTarget.querySelector(
30
+ ".clover-canvas-transport-mark-words"
31
+ );
32
+ const by = SCROLL_KEYS[event.key];
33
+ if (!words || !by || event.altKey || event.ctrlKey || event.metaKey)
34
+ return false;
35
+ const delta = by(words);
36
+ const room = delta > 0 ? words.scrollHeight - words.clientHeight - words.scrollTop : words.scrollTop;
37
+ if (room < 1) return false;
38
+ event.preventDefault();
39
+ words.scrollBy({ top: delta });
40
+ return true;
41
+ }
42
+ function SeekMarks({
43
+ marks,
44
+ duration,
45
+ selected,
46
+ onSelect,
47
+ onActivate
48
+ }) {
49
+ const { t, langOf } = useCloverTranslation();
50
+ const toolbar = useRef(null);
51
+ const [bar, setBar] = useState({ width: 0, target: 0, from: 0 });
52
+ useLayoutEffect(() => {
53
+ const element = toolbar.current;
54
+ if (!element) return;
55
+ const body = element.closest(".clover-canvas-media");
56
+ const measure = () => {
57
+ const button = element.querySelector(
58
+ ".clover-canvas-transport-mark"
59
+ );
60
+ const next = {
61
+ width: element.clientWidth,
62
+ target: (button == null ? void 0 : button.offsetWidth) ?? 0,
63
+ from: body ? element.getBoundingClientRect().left - body.getBoundingClientRect().left : 0
64
+ };
65
+ setBar(
66
+ (was) => was.width === next.width && was.target === next.target && was.from === next.from ? was : next
67
+ );
68
+ };
69
+ measure();
70
+ const observer = new ResizeObserver(measure);
71
+ observer.observe(element);
72
+ if (body) observer.observe(body);
73
+ return () => observer.disconnect();
74
+ }, []);
75
+ const groups = useMemo(
76
+ () => groupMarks(marks, duration, bar.width, bar.target),
77
+ [marks, duration, bar]
78
+ );
79
+ const [stepped, setStepped] = useState({});
80
+ const shownIn = (group) => {
81
+ const picked = group.findIndex((mark) => mark.id === selected);
82
+ if (picked >= 0) return picked;
83
+ return Math.min(stepped[group[0].id] ?? 0, group.length - 1);
84
+ };
85
+ const [focused, setFocused] = useState(null);
86
+ const [lit, setLit] = useState(null);
87
+ const light = (id) => {
88
+ setLit(id);
89
+ onActivate == null ? void 0 : onActivate(id);
90
+ };
91
+ const buttons = useRef([]);
92
+ const escaped = useRef(/* @__PURE__ */ new Set());
93
+ if (!marks.length || !(duration > 0)) return null;
94
+ const holds = (group, id) => Boolean(id) && group.some((mark) => mark.id === id);
95
+ const stop = Math.max(
96
+ 0,
97
+ groups.findIndex((group) => holds(group, focused ?? selected))
98
+ );
99
+ const moveTo = (index) => {
100
+ var _a;
101
+ const next = Math.min(groups.length - 1, Math.max(0, index));
102
+ (_a = buttons.current[next]) == null ? void 0 : _a.focus();
103
+ };
104
+ const along = (group) => alongBar(group[0].start / duration * 100);
105
+ const inBody = (group) => `${bar.from + THUMB / 2 + (bar.width - THUMB) * (group[0].start / duration)}px`;
106
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
107
+ /* @__PURE__ */ jsx("span", { className: "clover-canvas-transport-points", "aria-hidden": "true", children: groups.map((group) => /* @__PURE__ */ jsx(
108
+ "span",
109
+ {
110
+ className: "clover-canvas-transport-mark-point",
111
+ "data-active": holds(group, lit) || holds(group, selected) ? "true" : void 0,
112
+ style: { left: along(group) }
113
+ },
114
+ group[0].id
115
+ )) }),
116
+ /* @__PURE__ */ jsx(
117
+ "div",
118
+ {
119
+ ref: toolbar,
120
+ className: "clover-canvas-transport-marks",
121
+ role: "toolbar",
122
+ "aria-label": t("informationPanelTabsAnnotations"),
123
+ lang: langOf("informationPanelTabsAnnotations"),
124
+ onKeyDown: (event) => {
125
+ const index = buttons.current.findIndex(
126
+ (button) => button === document.activeElement
127
+ );
128
+ if (index < 0) return;
129
+ const step = getComputedStyle(event.currentTarget).direction === "rtl" ? -1 : 1;
130
+ if (event.key === "ArrowRight") moveTo(index + step);
131
+ else if (event.key === "ArrowLeft") moveTo(index - step);
132
+ else if (event.key === "Home") moveTo(0);
133
+ else if (event.key === "End") moveTo(groups.length - 1);
134
+ else return;
135
+ event.preventDefault();
136
+ },
137
+ children: groups.map((group, index) => {
138
+ const shown = shownIn(group);
139
+ const mark = group[shown];
140
+ const time = formatTime(mark.start);
141
+ const place = group.length > 1 ? ` ${shown + 1} / ${group.length}` : "";
142
+ const show = (to) => {
143
+ setStepped((was) => ({ ...was, [group[0].id]: to }));
144
+ light(group[to].id);
145
+ onSelect(group[to].id);
146
+ };
147
+ return /* @__PURE__ */ jsxs(
148
+ "div",
149
+ {
150
+ className: "clover-canvas-transport-mark-group",
151
+ style: {
152
+ left: along(group),
153
+ ...bar.width > 0 && { "--clover-mark-x": inBody(group) }
154
+ },
155
+ onPointerEnter: () => {
156
+ escaped.current.delete(group[0].id);
157
+ light(mark.id);
158
+ },
159
+ onPointerLeave: () => light(null),
160
+ onFocus: () => {
161
+ escaped.current.delete(group[0].id);
162
+ setFocused(mark.id);
163
+ light(mark.id);
164
+ },
165
+ onBlur: (event) => {
166
+ if (!event.currentTarget.contains(event.relatedTarget))
167
+ light(null);
168
+ },
169
+ onKeyDown: (event) => {
170
+ if (event.defaultPrevented) return;
171
+ if (scrollWords(event)) return;
172
+ if (event.key !== "Escape") return;
173
+ if (escaped.current.has(group[0].id)) return;
174
+ event.preventDefault();
175
+ escaped.current.add(group[0].id);
176
+ const point = buttons.current[index];
177
+ if (point && document.activeElement !== point) point.focus();
178
+ hideUntilBack(event.currentTarget, "tipHidden", [
179
+ "pointerenter",
180
+ "focusin"
181
+ ]);
182
+ },
183
+ children: [
184
+ /* @__PURE__ */ jsx(
185
+ "button",
186
+ {
187
+ ref: (button) => {
188
+ buttons.current[index] = button;
189
+ },
190
+ type: "button",
191
+ className: "clover-canvas-transport-mark",
192
+ tabIndex: index === stop ? 0 : -1,
193
+ "aria-label": `${time} ${mark.label}${place}`,
194
+ ...languageProps(mark.lang),
195
+ "aria-current": holds(group, selected) ? "true" : void 0,
196
+ "data-active": holds(group, selected) ? "true" : void 0,
197
+ onClick: () => onSelect(mark.id)
198
+ }
199
+ ),
200
+ /* @__PURE__ */ jsxs("span", { className: "clover-tip clover-canvas-transport-mark-tip", children: [
201
+ /* @__PURE__ */ jsxs(
202
+ "span",
203
+ {
204
+ className: "clover-canvas-transport-mark-words",
205
+ "aria-hidden": "true",
206
+ ...languageProps(mark.lang),
207
+ children: [
208
+ /* @__PURE__ */ jsx("span", { className: "clover-tip-lead", children: time }),
209
+ mark.label
210
+ ]
211
+ }
212
+ ),
213
+ group.length > 1 && /* @__PURE__ */ jsx(
214
+ Steps,
215
+ {
216
+ steps: {
217
+ position: shown,
218
+ total: group.length,
219
+ step: (by) => show(shown + by)
220
+ }
221
+ }
222
+ )
223
+ ] })
224
+ ]
225
+ },
226
+ group[0].id
227
+ );
228
+ })
229
+ }
230
+ )
231
+ ] });
232
+ }
233
+ export {
234
+ SeekMarks,
235
+ groupMarks
236
+ };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
3
- import { useRef, useState, useLayoutEffect, useMemo, useEffect } from "react";
3
+ import { useRef, useState, useLayoutEffect, useMemo, Suspense, lazy, useEffect } from "react";
4
4
  import { TransportButton } from "./TransportButton.mjs";
5
5
  import { useBarHeight } from "./useBarHeight.mjs";
6
6
  import { gapsOf, gapMask, alongBar, lengthOnBar, seekShare } from "./seekGaps.mjs";
@@ -20,6 +20,10 @@ import { languageProps } from "../../../i18n/direction.mjs";
20
20
  import { adoptSheet } from "../../../ui/adoptSheet.mjs";
21
21
  import __clover_sheet_media from "../../../ui/sheets/media.mjs";
22
22
  import { formatTime } from "../../../lib/time.mjs";
23
+ const SeekMarks = lazy(
24
+ () => import("./SeekMarks.mjs").then(({ SeekMarks: SeekMarks2 }) => ({ default: SeekMarks2 }))
25
+ );
26
+ const SEEK_MARKS = ".clover-canvas-transport-marks";
23
27
  const chapterPicture = (chapter) => typeof (chapter == null ? void 0 : chapter.thumbnail) === "string" ? { src: chapter.thumbnail } : imageSource(chapter == null ? void 0 : chapter.thumbnail);
24
28
  function chapterAt(chapters, time) {
25
29
  var _a;
@@ -242,7 +246,11 @@ const Transport = ({
242
246
  highlightedChapter = null,
243
247
  onChapterHighlight,
244
248
  request,
245
- fill
249
+ fill,
250
+ marks = [],
251
+ selectedMark,
252
+ onMarkSelect,
253
+ onMarkActivate
246
254
  }) => {
247
255
  var _a, _b;
248
256
  const { t, langOf } = useCloverTranslation();
@@ -352,8 +360,13 @@ const Transport = ({
352
360
  ref: seekArea,
353
361
  className: "clover-canvas-transport-seek-area",
354
362
  onPointerMove: (event) => {
355
- if (!duration || event.target.closest(".clover-tip"))
363
+ const over = event.target;
364
+ if (over.closest(SEEK_MARKS)) {
365
+ setPointing(false);
366
+ point(-1);
356
367
  return;
368
+ }
369
+ if (!duration || over.closest(".clover-tip")) return;
357
370
  const at = seekShare(event.currentTarget, event.clientX) * duration;
358
371
  setPointing(true);
359
372
  setPointedAt(Math.floor(at));
@@ -370,6 +383,16 @@ const Transport = ({
370
383
  )
371
384
  } : void 0,
372
385
  children: [
386
+ onMarkSelect && marks.length > 0 && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
387
+ SeekMarks,
388
+ {
389
+ marks,
390
+ duration,
391
+ selected: selectedMark,
392
+ onSelect: onMarkSelect,
393
+ onActivate: onMarkActivate
394
+ }
395
+ ) }),
373
396
  /* @__PURE__ */ jsx(
374
397
  "input",
375
398
  {
@@ -34,19 +34,10 @@ function useMediaElement(media, { request, language }) {
34
34
  if (!canceled && url) video.poster = url;
35
35
  }
36
36
  );
37
- media.captions.forEach((caption, index) => {
38
- const track = document.createElement("track");
39
- track.kind = caption.kind;
40
- if (caption.language) track.srclang = caption.language;
41
- track.label = captionName(caption, index, languageRef.current).text;
42
- video.appendChild(track);
43
- loadVtt(caption.id, requestRef.current).then((text) => {
44
- if (!canceled) addCues(track.track, text);
45
- }).catch(() => void 0);
46
- });
47
37
  let hls = null;
38
+ let attached = Promise.resolve();
48
39
  if (isHls(media.src, media.format)) {
49
- import("hls.js").then(({ default: Hls }) => {
40
+ attached = import("hls.js").then(({ default: Hls }) => {
50
41
  if (canceled) return;
51
42
  if (!Hls.isSupported()) {
52
43
  video.src = media.src;
@@ -72,6 +63,22 @@ function useMediaElement(media, { request, language }) {
72
63
  } else {
73
64
  video.src = media.src;
74
65
  }
66
+ media.captions.forEach((caption, index) => {
67
+ const track = document.createElement("track");
68
+ track.kind = caption.kind;
69
+ if (caption.language) track.srclang = caption.language;
70
+ track.label = captionName(caption, index, languageRef.current).text;
71
+ video.appendChild(track);
72
+ Promise.all([loadVtt(caption.id, requestRef.current), attached]).then(([text]) => {
73
+ if (canceled) return;
74
+ addCues(track.track, text);
75
+ whenSettled(track, () => {
76
+ var _a, _b;
77
+ if (!canceled && !((_b = (_a = track.track) == null ? void 0 : _a.cues) == null ? void 0 : _b.length))
78
+ addCues(track.track, text);
79
+ });
80
+ }).catch(() => void 0);
81
+ });
75
82
  for (const track of Array.from(video.textTracks ?? [])) {
76
83
  track.mode = "hidden";
77
84
  }
@@ -106,6 +113,11 @@ function useMediaElement(media, { request, language }) {
106
113
  ]);
107
114
  return element;
108
115
  }
116
+ function whenSettled(element, then) {
117
+ if (element.readyState >= HTMLTrackElement.LOADED) return;
118
+ element.addEventListener("load", then, { once: true });
119
+ element.addEventListener("error", then, { once: true });
120
+ }
109
121
  function addCues(track, text) {
110
122
  if (!track || typeof VTTCue === "undefined") return;
111
123
  for (const { id, start, end, settings, raw } of vttBlocks(text)) {
@@ -9,6 +9,7 @@ import { watchClamp } from "./clamped.mjs";
9
9
  import { languageProps } from "../../i18n/direction.mjs";
10
10
  import { readDate } from "../../core/dates.mjs";
11
11
  import { formatTime } from "../../lib/time.mjs";
12
+ import { visuallyHidden } from "../../ui/visuallyHidden.mjs";
12
13
  const NavDate = lazy(
13
14
  () => import("../../ui/NavDate.mjs").then(({ NavDate: NavDate2 }) => ({ default: NavDate2 }))
14
15
  );
@@ -131,7 +132,8 @@ function ItemFigure({
131
132
  language,
132
133
  request,
133
134
  showSummary = false,
134
- secondary = "summary"
135
+ secondary = "summary",
136
+ labels: shown = true
135
137
  }) {
136
138
  var _a, _b;
137
139
  const labels = item.parts.map(
@@ -163,26 +165,33 @@ function ItemFigure({
163
165
  part.id
164
166
  );
165
167
  }) }),
166
- (labeled || navDate || (summary == null ? void 0 : summary.text)) && /* @__PURE__ */ jsxs("figcaption", { className: "clover-items-caption", children: [
167
- labels.map((label, index) => /* @__PURE__ */ jsx(
168
- ItemLabel,
169
- {
170
- text: label.text,
171
- lang: label.lang,
172
- first: index === 0
173
- },
174
- item.parts[index].id
175
- )),
176
- navDate && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(NavDate, { value: item.navDate, className: "clover-items-date" }) }),
177
- (summary == null ? void 0 : summary.text) && /* @__PURE__ */ jsx(
178
- "span",
179
- {
180
- className: "clover-items-summary",
181
- ...languageProps(summary.lang),
182
- children: summary.text.replace(/<[^>]*>/g, "")
183
- }
184
- )
185
- ] })
168
+ (labeled || navDate || (summary == null ? void 0 : summary.text)) && /* @__PURE__ */ jsxs(
169
+ "figcaption",
170
+ {
171
+ className: "clover-items-caption",
172
+ style: shown ? void 0 : visuallyHidden,
173
+ children: [
174
+ labels.map((label, index) => /* @__PURE__ */ jsx(
175
+ ItemLabel,
176
+ {
177
+ text: label.text,
178
+ lang: label.lang,
179
+ first: index === 0
180
+ },
181
+ item.parts[index].id
182
+ )),
183
+ navDate && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(NavDate, { value: item.navDate, className: "clover-items-date" }) }),
184
+ (summary == null ? void 0 : summary.text) && /* @__PURE__ */ jsx(
185
+ "span",
186
+ {
187
+ className: "clover-items-summary",
188
+ ...languageProps(summary.lang),
189
+ children: summary.text.replace(/<[^>]*>/g, "")
190
+ }
191
+ )
192
+ ]
193
+ }
194
+ )
186
195
  ]
187
196
  }
188
197
  );
@@ -188,6 +188,7 @@ function ItemsView({
188
188
  language,
189
189
  showSummary = false,
190
190
  secondary = "summary",
191
+ labels = true,
191
192
  heading,
192
193
  headingLevel = 2,
193
194
  renderItem,
@@ -293,7 +294,8 @@ function ItemsView({
293
294
  language,
294
295
  request,
295
296
  showSummary,
296
- secondary
297
+ secondary,
298
+ labels
297
299
  }
298
300
  );
299
301
  const positioned = (item) => !(renderItem || localize(item.label, language).text || showSummary && secondary === "summary" && localize(item.summary, language).text);
@@ -19,6 +19,7 @@ function PagerLayout({
19
19
  navigation,
20
20
  of,
21
21
  secondary,
22
+ labels,
22
23
  singleItem,
23
24
  /* eslint-enable @typescript-eslint/no-unused-vars */
24
25
  highContrast,
@@ -169,6 +169,7 @@ function MapView({
169
169
  styleUrl,
170
170
  workerUrl,
171
171
  scrollZoom = false,
172
+ zoom,
172
173
  onSelect,
173
174
  request,
174
175
  forwardedRef,
@@ -561,20 +562,20 @@ function MapView({
561
562
  const extent = bounds.flat().join();
562
563
  if (extent === framed.current) return;
563
564
  framed.current = extent;
564
- frame(map, bounds, POINT_ZOOM);
565
- }, [map, features, overlays, overlay]);
565
+ frame(map, bounds, zoom ?? POINT_ZOOM, zoom);
566
+ }, [map, features, overlays, overlay, zoom]);
566
567
  const choose = (feature) => {
567
568
  var _a;
568
569
  const bounds = boundsOf([feature]);
569
570
  if (map && bounds) {
570
- frame(map, bounds, Math.max(map.getZoom(), POINT_ZOOM));
571
+ frame(map, bounds, Math.max(map.getZoom(), zoom ?? POINT_ZOOM), zoom);
571
572
  (_a = name.current) == null ? void 0 : _a.call(name, feature, center(bounds));
572
573
  }
573
574
  onSelect == null ? void 0 : onSelect(feature);
574
575
  };
575
576
  const show = (item) => {
576
577
  const bounds = boundsOf([], [item]);
577
- if (map && bounds) frame(map, bounds, POINT_ZOOM);
578
+ if (map && bounds) frame(map, bounds, zoom ?? POINT_ZOOM, zoom);
578
579
  };
579
580
  return /* @__PURE__ */ jsx(HostLanguageContext.Provider, { value: root.hostLanguage, children: /* @__PURE__ */ jsxs(
580
581
  Tag,
@@ -676,12 +677,12 @@ function MapView({
676
677
  }
677
678
  ) });
678
679
  }
679
- function frame(map, bounds, zoom) {
680
+ function frame(map, bounds, zoom, most = 12) {
680
681
  const [[west, south], [east, north]] = bounds;
681
682
  if (west === east && south === north) {
682
683
  map.jumpTo({ center: [west, south], zoom });
683
684
  } else {
684
- map.fitBounds(bounds, { padding: 32, maxZoom: 12, duration: 0 });
685
+ map.fitBounds(bounds, { padding: 32, maxZoom: most, duration: 0 });
685
686
  }
686
687
  }
687
688
  function center([[west, south], [east, north]]) {
@@ -6,7 +6,8 @@ import Button from "../../ui/Button.mjs";
6
6
  function PanelToggle({
7
7
  open,
8
8
  onOpenChange,
9
- controls
9
+ controls,
10
+ side
10
11
  }) {
11
12
  const { t, langOf } = useCloverTranslation();
12
13
  const id = useUniqueId().replace(/:/g, "");
@@ -18,6 +19,7 @@ function PanelToggle({
18
19
  lang: langOf("informationPanelToggle"),
19
20
  expanded: open,
20
21
  controls,
22
+ side: side === "start" ? side : void 0,
21
23
  onClick: () => onOpenChange(!open),
22
24
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
23
25
  /* @__PURE__ */ jsx(
package/dist/index.d.mts CHANGED
@@ -1434,6 +1434,12 @@ export interface ItemsProps extends Omit<React.HTMLAttributes<HTMLElement>, "onS
1434
1434
  * `summary` (the default), its `navDate`, or `none`. Default `"summary"`.
1435
1435
  */
1436
1436
  secondary?: ItemSecondary;
1437
+ /**
1438
+ * Show each item's label, and the line under it, beside its picture (`true`, the
1439
+ * default). `false` shows the pictures alone: the labels are hidden from sight but kept
1440
+ * as each item's name for assistive technology (WCAG 4.1.2). Default `true`.
1441
+ */
1442
+ labels?: boolean;
1437
1443
  /**
1438
1444
  * The pager's size: `large` (the default), round controls; or `small`, its steps and
1439
1445
  * count as Search's are, for a header's line. Default `"large"`.
@@ -2164,6 +2170,12 @@ export interface MapProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSel
2164
2170
  workerUrl?: string;
2165
2171
  /** Zoom with the wheel or trackpad. Default false, so an embedded map never traps page scroll. */
2166
2172
  scrollZoom?: boolean;
2173
+ /**
2174
+ * How close it frames its places: a lone point at this zoom, and several no closer.
2175
+ * Default 8 for a point, a region around it, and 12 for several; 15 shows a point's
2176
+ * streets (Mat, 2026-11-04: "zoom map to street level").
2177
+ */
2178
+ zoom?: number;
2167
2179
  /**
2168
2180
  * A place was chosen, on the map or in its list. Inside a `Root`, choosing one on a
2169
2181
  * Canvas also goes there.
@@ -2230,6 +2242,11 @@ export interface PanelToggleProps {
2230
2242
  onOpenChange: (open: boolean) => void;
2231
2243
  /** The panel's `id`, for `aria-controls`. */
2232
2244
  controls?: string;
2245
+ /**
2246
+ * The side of the Body the panel is on: `"end"` (the default) or `"start"`. Among the
2247
+ * Body's controls it keeps that side's top corner, and its glyph draws the panel there.
2248
+ */
2249
+ side?: "start" | "end";
2233
2250
  }
2234
2251
  /**
2235
2252
  * A button that shows and hides an `Panel`. It is styled as a Canvas control,
@@ -2242,7 +2259,7 @@ export interface PanelToggleProps {
2242
2259
  * <Clover.Panel id="panel" hidden={!open} />
2243
2260
  * ```
2244
2261
  */
2245
- export declare function PanelToggle({ open, onOpenChange, controls, }: PanelToggleProps): React.JSX.Element;
2262
+ export declare function PanelToggle({ open, onOpenChange, controls, side, }: PanelToggleProps): React.JSX.Element;
2246
2263
  /**
2247
2264
  * EXPERIMENTAL. Clover's own 2D renderer for images, video and sound, drawn with WebGL2
2248
2265
  * and falling back to Canvas2D.
@@ -2403,8 +2420,14 @@ export declare function useNavigation(): Navigation;
2403
2420
  * (`entries`); null where there are none. `Items of="annotations"` walks them.
2404
2421
  */
2405
2422
  export declare function useAnnotationCollection(): AnnotationCollection | null;
2406
- /** Every annotation set: the Manifest's own (fetched so far) and any the host added. */
2407
- export declare function useAnnotationSets(): AnnotationSet[];
2423
+ /**
2424
+ * Each AnnotationPage the Manifest's Canvases carry (as far as fetched), and each the host
2425
+ * added through the Root's `annotations`, read as a set: its `id`, `label` and annotations
2426
+ * (`entries`), painting annotations and caption files left out.
2427
+ */
2428
+ export declare function useAnnotationPages(): AnnotationSet[];
2429
+ /** @deprecated `useAnnotationPages`, the same hook named for what it reads. */
2430
+ export declare const useAnnotationSets: typeof useAnnotationPages;
2408
2431
  /** A IIIF language map as text in the Root's language, with the tag it is in. */
2409
2432
  export declare function useLocalized(value: LanguageMapLike): LocalizedValue;
2410
2433
  /** Clover's interface strings in the current language: `t("commonClose")`. */