@nulib/clover 4.0.0 → 4.1.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 (381) hide show
  1. package/dist/components/Body/Body.mjs +16 -1
  2. package/dist/components/Body/glyphs.mjs +15 -0
  3. package/dist/components/Canvas/CanvasView.mjs +116 -12
  4. package/dist/components/Canvas/ChaptersMenu.mjs +105 -0
  5. package/dist/components/Canvas/ControlMenu.mjs +23 -4
  6. package/dist/components/Canvas/Controls.mjs +223 -60
  7. package/dist/components/Canvas/ControlsFade.mjs +16 -0
  8. package/dist/components/Canvas/ImageControls.mjs +209 -0
  9. package/dist/components/Canvas/Placeholder.mjs +44 -12
  10. package/dist/components/Canvas/RowFits.mjs +85 -0
  11. package/dist/components/Canvas/layout.mjs +11 -0
  12. package/dist/components/Canvas/media/MediaBody.mjs +105 -46
  13. package/dist/components/Canvas/media/Player.mjs +0 -55
  14. package/dist/components/Canvas/media/Transport.mjs +14 -23
  15. package/dist/components/Canvas/panClearOfControls.mjs +1 -1
  16. package/dist/components/Collection/Collection.mjs +1 -1
  17. package/dist/components/Items/CountMenu.mjs +1 -0
  18. package/dist/components/Items/Item.mjs +4 -3
  19. package/dist/components/Items/Items.mjs +30 -10
  20. package/dist/components/Items/PagerLayout.mjs +2 -0
  21. package/dist/components/Items/TargetItems.mjs +1 -1
  22. package/dist/components/Items/masonry.mjs +35 -0
  23. package/dist/components/Panel/About.mjs +25 -8
  24. package/dist/components/Root/useRootState.mjs +2 -49
  25. package/dist/components/Scene/SceneView.mjs +13 -2
  26. package/dist/components/Scene/cloverEngine.mjs +2 -1
  27. package/dist/components/Timeline/playerSurface.mjs +2 -0
  28. package/dist/core/clover.mjs +7 -4
  29. package/dist/core/content-state.mjs +5 -3
  30. package/dist/i18n/locales/en.json.mjs +1 -1
  31. package/dist/i18n/locales/es.json.mjs +1 -1
  32. package/dist/i18n/locales/fi.json.mjs +1 -1
  33. package/dist/i18n/locales/fr.json.mjs +1 -1
  34. package/dist/i18n/locales/nb.json.mjs +1 -1
  35. package/dist/i18n/locales/nn.json.mjs +1 -1
  36. package/dist/i18n/locales/no.json.mjs +1 -1
  37. package/dist/i18n/locales/pt.json.mjs +1 -1
  38. package/dist/index.d.mts +109 -51
  39. package/dist/lib/gltf/load.mjs +26 -6
  40. package/dist/lib/renderer/CanvasRenderer.mjs +44 -32
  41. package/dist/lib/renderer/camera/Camera.mjs +1 -1
  42. package/dist/react/useContentStateOutput.mjs +71 -0
  43. package/dist/styles.css +1 -1
  44. package/dist/templates/default/Default.mjs +37 -128
  45. package/dist/templates/document/Document.mjs +41 -64
  46. package/dist/templates/document/Sheets.mjs +13 -5
  47. package/dist/templates/gallery/Gallery.mjs +90 -18
  48. package/dist/templates/index.d.mts +299 -17
  49. package/dist/templates/shared/Lightbox.mjs +161 -69
  50. package/dist/templates/shared/LightboxView.mjs +118 -0
  51. package/dist/templates/shared/PanelPane.mjs +104 -0
  52. package/dist/templates/{document/DocumentPanel.mjs → shared/PanelPart.mjs} +2 -2
  53. package/dist/templates/shared/dragToClose.mjs +51 -8
  54. package/dist/templates/shared/givenAnnotations.mjs +13 -0
  55. package/dist/templates/shared/useDragToClose.mjs +6 -3
  56. package/dist/templates/shared/useLazyPanelPane.mjs +16 -0
  57. package/dist/templates/shared/useSlide.mjs +6 -0
  58. package/dist/templates.css +1 -1
  59. package/dist/ui/ControlCluster.mjs +15 -17
  60. package/dist/ui/Sections.mjs +3 -3
  61. package/dist/ui/mediaIcons.mjs +35 -8
  62. package/dist/ui/useScrollTrack.mjs +2 -1
  63. package/dist/web-components/About-DvyvVUK5.mjs +1 -0
  64. package/dist/web-components/AnnotationItems-BpRcSrOM.mjs +1 -0
  65. package/dist/web-components/{AnnotationMenu-BCwwwfbb.mjs → AnnotationMenu-BDPec3iI.mjs} +1 -1
  66. package/dist/web-components/{AnnotationState-CavxnAAq.mjs → AnnotationState-Chs_37Kk.mjs} +1 -1
  67. package/dist/web-components/{Annotations-DDjSrBL5.mjs → Annotations-6E-oD_wg.mjs} +1 -1
  68. package/dist/web-components/{Annotations-rBmeI5sR.mjs → Annotations-CLPEq7Ro.mjs} +1 -1
  69. package/dist/web-components/Body-Ct61yxI7.mjs +1 -0
  70. package/dist/web-components/{BodyAlert-COKp19lq.mjs → BodyAlert-C_Qh3Up_.mjs} +1 -1
  71. package/dist/web-components/{Button-DLFYqtz9.mjs → Button-L8ZMy5lY.mjs} +1 -1
  72. package/dist/web-components/{Camera-Cp5ma-6C.mjs → Camera-BPyLzZjP.mjs} +1 -1
  73. package/dist/web-components/{Canvas2DBackend-3PToh87Z.mjs → Canvas2DBackend-8wFavYdl.mjs} +1 -1
  74. package/dist/web-components/CanvasView-2Fj9nT06.mjs +2 -0
  75. package/dist/web-components/CaptionDetails-DuwS-grE.mjs +1 -0
  76. package/dist/web-components/ChaptersMenu-Bj2EqtVJ.mjs +1 -0
  77. package/dist/web-components/{Chevron-r-_hUPn8.mjs → Chevron-Cyr_cc9X.mjs} +1 -1
  78. package/dist/web-components/ChoiceMenu-ConzybVH.mjs +1 -0
  79. package/dist/web-components/Collection-CLayN8sv.mjs +1 -0
  80. package/dist/web-components/{CollectionSelect-CBWUbqQi.mjs → CollectionSelect-D2d8dGJ4.mjs} +1 -1
  81. package/dist/web-components/{Connected-B2d6EoFl.mjs → Connected-CBQ6xyhr.mjs} +1 -1
  82. package/dist/web-components/{Connected-BSRM9FJY.mjs → Connected-DMXG3imZ.mjs} +1 -1
  83. package/dist/web-components/{Connected-BnpxYeJN.mjs → Connected-pyd0EBD3.mjs} +1 -1
  84. package/dist/web-components/{Contents-D7FPxSH-.mjs → Contents-tCMXBYDK.mjs} +1 -1
  85. package/dist/web-components/ControlMenu-D1zkB0qX.mjs +1 -0
  86. package/dist/web-components/ControlsFade-BNXVTL_Q.mjs +1 -0
  87. package/dist/web-components/{CountMenu-DyTp_J4k.mjs → CountMenu-Dnzb7lKo.mjs} +1 -1
  88. package/dist/web-components/Cue-CUGmPS3k.mjs +1 -0
  89. package/dist/web-components/Document-D-8nalCX.mjs +1 -0
  90. package/dist/web-components/{DomLayers-CTGub6wo.mjs → DomLayers-BxPU05-D.mjs} +1 -1
  91. package/dist/web-components/{Download-BOYNIb7C.mjs → Download-Bku9Vptk.mjs} +1 -1
  92. package/dist/web-components/{EntryBodies-Bfd2Z42z.mjs → EntryBodies-77vDudCb.mjs} +1 -1
  93. package/dist/web-components/{EntryThumbnail-DQE8ajI9.mjs → EntryThumbnail-BxQWKW6e.mjs} +1 -1
  94. package/dist/web-components/{FieldPill-D5DNJWLy.mjs → FieldPill-nFGsaru9.mjs} +1 -1
  95. package/dist/web-components/FrameAnimation-BvKiSXcm.mjs +1 -0
  96. package/dist/web-components/Gallery-4Hd58afA.mjs +1 -0
  97. package/dist/web-components/{HideToggle-DL911R1Z.mjs → HideToggle-TEhY4TS4.mjs} +1 -1
  98. package/dist/web-components/ImageControls-CZO7WoPb.mjs +1 -0
  99. package/dist/web-components/Items-CudZ4Lnb.mjs +1 -0
  100. package/dist/web-components/Label-f07N5Fld.mjs +1 -0
  101. package/dist/web-components/{LanguageChoice-DT1UPiDn.mjs → LanguageChoice-B5VM21DV.mjs} +1 -1
  102. package/dist/web-components/LightboxView-C4OASmkg.mjs +1 -0
  103. package/dist/web-components/ListEnd-M39M62Cl.mjs +1 -0
  104. package/dist/web-components/{Loaded-BWfEBJyg.mjs → Loaded-oGFyBuos.mjs} +1 -1
  105. package/dist/web-components/LoadedCanvas-IvpSzPO6.mjs +1 -0
  106. package/dist/web-components/LoadedMap-WATGNLxl.mjs +1 -0
  107. package/dist/web-components/{Loading-zw74TdAz.mjs → Loading-YxuKrDAM.mjs} +1 -1
  108. package/dist/web-components/{Map--dJhk0_0.mjs → Map-Cw9j3gi3.mjs} +1 -1
  109. package/dist/web-components/MapView-3OxoCr5l.mjs +3 -0
  110. package/dist/web-components/Markup-DW75Jx3j.mjs +2 -0
  111. package/dist/web-components/MediaBody-CLtd0bf0.mjs +1 -0
  112. package/dist/web-components/MediaBody-JnKnoIqY.mjs +1 -0
  113. package/dist/web-components/{NavDate-BQHuyLOC.mjs → NavDate-BCCOyycx.mjs} +1 -1
  114. package/dist/web-components/{Navigator-B3U21_ti.mjs → Navigator-Bx4zS0Yr.mjs} +1 -1
  115. package/dist/web-components/{Pager-DnJknq92.mjs → Pager-B9GvQ64b.mjs} +1 -1
  116. package/dist/web-components/PagerLayout-BF33VZL_.mjs +1 -0
  117. package/dist/web-components/Panel-BvDpCn6K.mjs +1 -0
  118. package/dist/web-components/PanelPart-Bd4lSUrP.mjs +1 -0
  119. package/dist/web-components/{PanelToggle-CFtWIeWv.mjs → PanelToggle-bPcIULGZ.mjs} +1 -1
  120. package/dist/web-components/{PartOfManifest-F87jIrf9.mjs → PartOfManifest-HLg-r00O.mjs} +1 -1
  121. package/dist/web-components/{Pending-CYAQajKu.mjs → Pending-BxGjjnqq.mjs} +1 -1
  122. package/dist/web-components/PlaceBox-D-Zhe9-U.mjs +1 -0
  123. package/dist/web-components/Placeholder-DzY5hcbk.mjs +1 -0
  124. package/dist/web-components/{Position-BkWBRBfW.mjs → Position-TYnzcm8e.mjs} +1 -1
  125. package/dist/web-components/{Primitives-BmODPlnK.mjs → Primitives-C6VJXxZD.mjs} +1 -1
  126. package/dist/web-components/Provider-DyB0wpeO.mjs +1 -0
  127. package/dist/web-components/{ReadMore-BwGFsLS2.mjs → ReadMore-De_0T7lc.mjs} +1 -1
  128. package/dist/web-components/Root-Bt3NNBFb.mjs +1 -0
  129. package/dist/web-components/Scene-DrOM9YlD.mjs +1 -0
  130. package/dist/web-components/SceneView-DA7Yg20p.mjs +1 -0
  131. package/dist/web-components/{Search-CbmK9vLp.mjs → Search-DgT8OPsK.mjs} +1 -1
  132. package/dist/web-components/{Sections-Dy5_pkyQ.mjs → Sections-d1acn7qm.mjs} +2 -2
  133. package/dist/web-components/{StandaloneItems-BmUnBp0H.mjs → StandaloneItems-DUb4YKCB.mjs} +1 -1
  134. package/dist/web-components/{Status-Dww3Pyf4.mjs → Status-CcU3u6P4.mjs} +1 -1
  135. package/dist/web-components/{Steps-o_UprQfZ.mjs → Steps-nlSCzbDQ.mjs} +1 -1
  136. package/dist/web-components/{TargetItems-BBOGDubv.mjs → TargetItems-BDJM3Ar-.mjs} +1 -1
  137. package/dist/web-components/Timeline-BfdN3lIv.mjs +1 -0
  138. package/dist/web-components/{Tip-BbexILXs.mjs → Tip-OCB88zwY.mjs} +1 -1
  139. package/dist/web-components/{Transcript-ZVXM3ZDA.mjs → Transcript-bSA3cx_K.mjs} +1 -1
  140. package/dist/web-components/Transport-DaIhfZqC.mjs +1 -0
  141. package/dist/web-components/Transport-DjOYI-fR.mjs +1 -0
  142. package/dist/web-components/{annotation-collection-7SS1ELcO.mjs → annotation-collection-D8emkElk.mjs} +1 -1
  143. package/dist/web-components/{annotation-name-CYkZopdd.mjs → annotation-name-DbWjhgra.mjs} +1 -1
  144. package/dist/web-components/{annotations-content-Bdtn50sf.mjs → annotations-content-Bg6aVAGC.mjs} +1 -1
  145. package/dist/web-components/{body-CkOBHlJ0.mjs → body-Ct8dmQdW.mjs} +1 -1
  146. package/dist/web-components/canvas-goEZLqEd.mjs +1 -0
  147. package/dist/web-components/cloverEngine-Df7cMwOP.mjs +164 -0
  148. package/dist/web-components/{content-state-reader-Ahh6artg.mjs → content-state-reader-CNmBpG1L.mjs} +1 -1
  149. package/dist/web-components/{controls-BJrZVQkS.mjs → controls-BZr16sYQ.mjs} +1 -1
  150. package/dist/web-components/custom-elements.json +160 -44
  151. package/dist/web-components/{downloads-CqVWo-yn.mjs → downloads-EjJ6Hpip.mjs} +1 -1
  152. package/dist/web-components/dragToClose-X9NbZOhA.mjs +1 -0
  153. package/dist/web-components/{engine-B-sscpLa.mjs → engine-DMoc0tff.mjs} +1 -1
  154. package/dist/web-components/{engines-DfCHjbt3.mjs → engines-BmB81VXR.mjs} +1 -1
  155. package/dist/web-components/es-B1NvdYp-.mjs +1 -0
  156. package/dist/web-components/{fetchManifest-BIzne1Pj.mjs → fetchManifest-CwQC6cCh.mjs} +1 -1
  157. package/dist/web-components/fi-BjtYZNLo.mjs +1 -0
  158. package/dist/web-components/fr-Cd22Lziw.mjs +1 -0
  159. package/dist/web-components/fromManifest-DrAmY1lB.mjs +1 -0
  160. package/dist/web-components/glyphs-BFK_hvJJ.mjs +1 -0
  161. package/dist/web-components/hooks-BhtNDs_1.mjs +1 -0
  162. package/dist/web-components/image-layers-D2nQC4R-.mjs +1 -0
  163. package/dist/web-components/{imageService-0eTvQ-3h.mjs → imageService-iFElsopt.mjs} +1 -1
  164. package/dist/web-components/index-FJEpXukG.mjs +1 -0
  165. package/dist/web-components/index.d.mts +4 -4
  166. package/dist/web-components/index.mjs +1 -1
  167. package/dist/web-components/items-BPPrqbeh.mjs +1 -0
  168. package/dist/web-components/items-BnEnc5ot.mjs +1 -0
  169. package/dist/web-components/label-DauFa5sg.mjs +1 -0
  170. package/dist/web-components/layout-Djwu8f4R.mjs +1 -0
  171. package/dist/web-components/{link-GEdiEwlR.mjs → link-0lUlTZlw.mjs} +1 -1
  172. package/dist/web-components/logo-DWPxaZaG.mjs +1 -0
  173. package/dist/web-components/masonry-0QfzOgbB.mjs +1 -0
  174. package/dist/web-components/{models-59cEeiAA.mjs → models-BF2pqufA.mjs} +1 -1
  175. package/dist/web-components/nb-CEwZDBiR.mjs +1 -0
  176. package/dist/web-components/nn-jYQhr9RI.mjs +1 -0
  177. package/dist/web-components/no-CEwZDBiR.mjs +1 -0
  178. package/dist/web-components/{nodes-CTw9OqlA.mjs → nodes-ChQRLDGU.mjs} +1 -1
  179. package/dist/web-components/{overlayImage-BMt4UTlR.mjs → overlayImage-MKrcgDep.mjs} +1 -1
  180. package/dist/web-components/panClearOfControls-Cn2ZXsZi.mjs +1 -0
  181. package/dist/web-components/{panel-C17Rl9Ya.mjs → panel-C13V6w6E.mjs} +1 -1
  182. package/dist/web-components/part-CekFWrtz.mjs +1 -0
  183. package/dist/web-components/playerSurface-DG1XipTq.mjs +1 -0
  184. package/dist/web-components/pointer-YQppt0at.mjs +1 -0
  185. package/dist/web-components/{provider-BpxorEiq.mjs → provider-DiUkZYiW.mjs} +1 -1
  186. package/dist/web-components/pt-CWR30SzS.mjs +1 -0
  187. package/dist/web-components/{range-regions-BGQy4E9U.mjs → range-regions-CqGjyM76.mjs} +1 -1
  188. package/dist/web-components/{read-more-BDM_6CVc.mjs → read-more-D8RJYdtQ.mjs} +1 -1
  189. package/dist/web-components/readingLanguages-BWOLZK2k.mjs +1 -0
  190. package/dist/web-components/rendererSurface-BkbGDL_Z.mjs +22 -0
  191. package/dist/web-components/{renderers-CiB74bQh.mjs → renderers-LtRX5pT0.mjs} +1 -1
  192. package/dist/web-components/{resource-CRbpf9pX.mjs → resource-Cfydiy4m.mjs} +1 -1
  193. package/dist/web-components/{save-file-CCuZEuQr.mjs → save-file-dZyOpXgY.mjs} +1 -1
  194. package/dist/web-components/search-BfUZJM3a.mjs +1 -0
  195. package/dist/web-components/shared-DkY2a89G.mjs +1 -0
  196. package/dist/web-components/{show-link-BXm7SNIC.mjs → show-link-DgLJzG7k.mjs} +1 -1
  197. package/dist/web-components/{sizedImage-k4Q-eyOB.mjs → sizedImage-NHzhcBYk.mjs} +1 -1
  198. package/dist/web-components/{split-Hp6z-v4h.mjs → split-CuFiKjin.mjs} +1 -1
  199. package/dist/web-components/{status-BmtuKfAG.mjs → status-C3etlkhY.mjs} +1 -1
  200. package/dist/web-components/styles-DkkVOSUQ.mjs +1 -0
  201. package/dist/web-components/three.mjs +1 -1
  202. package/dist/web-components/{thumbnail-Dp7a8oom.mjs → thumbnail-DecrVnpj.mjs} +1 -1
  203. package/dist/web-components/{tip-C-oovDZK.mjs → tip-D5YgaIWW.mjs} +1 -1
  204. package/dist/web-components/{toggle-C7ODWDEZ.mjs → toggle-CZGB65VZ.mjs} +1 -1
  205. package/dist/web-components/{useContainerName-CrOmY-km.mjs → useContainerName-hKQjEt7a.mjs} +1 -1
  206. package/dist/web-components/useControlsVisibility-DPg8uAkW.mjs +1 -0
  207. package/dist/web-components/useLazyPanelPane-eby-OI1V.mjs +1 -0
  208. package/dist/web-components/{useNearViewport-BqXi9Gn4.mjs → useNearViewport-CDbHQUBk.mjs} +1 -1
  209. package/dist/web-components/useScrollTrack-D9l_P3_B.mjs +1 -0
  210. package/dist/web-components/viewer/AnnotationItems-DtsnDXPM.mjs +1 -0
  211. package/dist/web-components/viewer/{AnnotationMenu-DPOSehBo.mjs → AnnotationMenu-C-Mz6CCn.mjs} +1 -1
  212. package/dist/web-components/viewer/AnnotationState-5pim5K72.mjs +1 -0
  213. package/dist/web-components/viewer/Annotations-Cqn1TkzD.mjs +2 -0
  214. package/dist/web-components/viewer/Annotations-CxwN9FkB.mjs +1 -0
  215. package/dist/web-components/viewer/{Canvas2DBackend-BTK6ZJh0.mjs → Canvas2DBackend-C-ZMSCak.mjs} +1 -1
  216. package/dist/web-components/viewer/CaptionDetails-CRD-gSZP.mjs +1 -0
  217. package/dist/web-components/viewer/ChaptersMenu-Brcq3yJv.mjs +1 -0
  218. package/dist/web-components/viewer/{ChoiceMenu-DQ1x572Y.mjs → ChoiceMenu-ByGzQQx1.mjs} +1 -1
  219. package/dist/web-components/viewer/Collection-m0GCcsfQ.mjs +1 -0
  220. package/dist/web-components/viewer/Connected-Bmc_CdUD.mjs +1 -0
  221. package/dist/web-components/viewer/Connected-Dvx7wtot.mjs +1 -0
  222. package/dist/web-components/viewer/Contents-CwDpfiJY.mjs +1 -0
  223. package/dist/web-components/viewer/ControlMenu-TcO85hDf.mjs +1 -0
  224. package/dist/web-components/viewer/ControlsFade-BoZ4ABAE.mjs +1 -0
  225. package/dist/web-components/viewer/{CountMenu-4u6U6yqb.mjs → CountMenu-0-ie8kIZ.mjs} +1 -1
  226. package/dist/web-components/viewer/Cue-DxmAS9Gx.mjs +1 -0
  227. package/dist/web-components/viewer/Document-BsryuYJ1.mjs +1 -0
  228. package/dist/web-components/viewer/{DomLayers-CGkDtemL.mjs → DomLayers-hc0qARQc.mjs} +1 -1
  229. package/dist/web-components/viewer/Download-MO-1Rik4.mjs +1 -0
  230. package/dist/web-components/viewer/EntryBodies-g-OEwEsk.mjs +1 -0
  231. package/dist/web-components/viewer/EntryThumbnail-DcIDYATi.mjs +1 -0
  232. package/dist/web-components/viewer/{FieldPill-DFXGWrvB.mjs → FieldPill-B9S21lxw.mjs} +1 -1
  233. package/dist/web-components/viewer/FrameAnimation-qI9cZPEs.mjs +1 -0
  234. package/dist/web-components/viewer/Gallery-BOgUqfqw.mjs +1 -0
  235. package/dist/web-components/viewer/{HideToggle-DP5kHzWM.mjs → HideToggle-D8wH49mq.mjs} +1 -1
  236. package/dist/web-components/viewer/ImageControls-ZoEC9jWd.mjs +1 -0
  237. package/dist/web-components/viewer/LanguageChoice-CRqsCBAp.mjs +1 -0
  238. package/dist/web-components/viewer/LightboxView-BB-GcbYr.mjs +1 -0
  239. package/dist/web-components/viewer/ListEnd-D9Obxie4.mjs +1 -0
  240. package/dist/web-components/viewer/{MapView-BN9wXQKV.mjs → MapView-DQSwUzd7.mjs} +2 -2
  241. package/dist/web-components/viewer/MediaBody-CIw2nTlj.mjs +1 -0
  242. package/dist/web-components/viewer/MediaBody-D5ff6xy-.mjs +1 -0
  243. package/dist/web-components/viewer/{NavDate-C2-wwLuB.mjs → NavDate-BnfDG57h.mjs} +1 -1
  244. package/dist/web-components/viewer/{Navigator-C3jghOd3.mjs → Navigator-BNwjmkXY.mjs} +1 -1
  245. package/dist/web-components/viewer/PagerLayout-C8jraHqs.mjs +1 -0
  246. package/dist/web-components/viewer/PanelPart-YNbBI9SQ.mjs +1 -0
  247. package/dist/web-components/viewer/{PartOfManifest-D22yMgCf.mjs → PartOfManifest-DX7H0V4g.mjs} +1 -1
  248. package/dist/web-components/viewer/PlaceBox-CCWfzsNU.mjs +1 -0
  249. package/dist/web-components/viewer/Placeholder-CsEkLhz7.mjs +1 -0
  250. package/dist/web-components/viewer/Search-CsdYzdq1.mjs +1 -0
  251. package/dist/web-components/viewer/StandaloneItems-BfvBxbUm.mjs +1 -0
  252. package/dist/web-components/viewer/{Steps-Bw32X5xO.mjs → Steps-BH8ZApS4.mjs} +1 -1
  253. package/dist/web-components/viewer/{TargetItems-DLhUH1Gq.mjs → TargetItems-BebPFr-c.mjs} +1 -1
  254. package/dist/web-components/viewer/Transcript-DXLv5WR9.mjs +1 -0
  255. package/dist/web-components/viewer/Transport-C-fh7Kx2.mjs +1 -0
  256. package/dist/web-components/viewer/Transport-CY6BWfMi.mjs +1 -0
  257. package/dist/web-components/viewer/annotation-collection-Cjd8Dgyl.mjs +1 -0
  258. package/dist/web-components/viewer/annotation-name-CwmgQFia.mjs +1 -0
  259. package/dist/web-components/viewer/{annotations-content-CbA3eOIC.mjs → annotations-content-BARXoAz-.mjs} +1 -1
  260. package/dist/web-components/viewer/cloverEngine-CumnJPKO.mjs +164 -0
  261. package/dist/web-components/viewer/{content-state-reader-C7UBMOq3.mjs → content-state-reader-DuvyLThu.mjs} +1 -1
  262. package/dist/web-components/viewer/dragToClose-CFCxhUxn.mjs +1 -0
  263. package/dist/web-components/viewer/{fetchManifest-C2Yxg3x9.mjs → fetchManifest-qNB_KgxL.mjs} +1 -1
  264. package/dist/web-components/viewer/{host-CZeyjCKR.mjs → host-GTHX2fPK.mjs} +1 -1
  265. package/dist/web-components/viewer/image-layers-DKOuaRTj.mjs +1 -0
  266. package/dist/web-components/viewer/index.mjs +1 -1
  267. package/dist/web-components/viewer/{link-DssZ0Z2N.mjs → link-BlaM0tCa.mjs} +1 -1
  268. package/dist/web-components/viewer/overlayImage-RVpv69R5.mjs +1 -0
  269. package/dist/web-components/viewer/range-regions-CIZiAHOp.mjs +1 -0
  270. package/dist/web-components/viewer/{renderers-DLoqv3QO.mjs → renderers-Dw1klwlx.mjs} +1 -1
  271. package/dist/web-components/viewer/{save-file-CJT5p5Hg.mjs → save-file-EvzaBEJN.mjs} +1 -1
  272. package/dist/web-components/viewer/{search-PhOwMKHi.mjs → search-x1QL_bth.mjs} +1 -1
  273. package/dist/web-components/viewer/styles-I7_LWFGj.mjs +1 -0
  274. package/dist/web-components/viewer/useControlsVisibility-C_SQHIVR.mjs +1 -0
  275. package/dist/web-components/viewer/useLazyPanelPane-UuGDJrf_.mjs +1 -0
  276. package/dist/web-components/viewer/viewer-DJrQuNs1.mjs +29 -0
  277. package/dist/web-components/viewer/{vtt-1Pk7Dhsj.mjs → vtt-C2G89SWH.mjs} +1 -1
  278. package/dist/web-components/viewer-Br44EEba.mjs +1 -0
  279. package/dist/web-components/{vtt-CacHieeN.mjs → vtt-Dd0c7psH.mjs} +1 -1
  280. package/package.json +1 -1
  281. package/dist/templates/shared/LightboxBody.mjs +0 -9
  282. package/dist/web-components/About-DhOGPFaI.mjs +0 -1
  283. package/dist/web-components/AnnotationItems-CNP4CJiT.mjs +0 -1
  284. package/dist/web-components/Body-DaY1UJIy.mjs +0 -1
  285. package/dist/web-components/BodyUnloadable-DcTM7hHF.mjs +0 -1
  286. package/dist/web-components/CanvasView-BWQ4SK2b.mjs +0 -2
  287. package/dist/web-components/CaptionDetails-DSziiuQV.mjs +0 -1
  288. package/dist/web-components/ChoiceMenu-DTuEEUeM.mjs +0 -1
  289. package/dist/web-components/Collection-B9swJtPW.mjs +0 -1
  290. package/dist/web-components/ControlMenu-Crtho2cs.mjs +0 -1
  291. package/dist/web-components/Cue-CbZaGwZh.mjs +0 -1
  292. package/dist/web-components/Document-BfltLWZZ.mjs +0 -1
  293. package/dist/web-components/DocumentPanel-ZSe40cV4.mjs +0 -1
  294. package/dist/web-components/FrameAnimation-IfR1czfc.mjs +0 -1
  295. package/dist/web-components/Gallery-DD06BDQo.mjs +0 -1
  296. package/dist/web-components/Items-BHzT9A73.mjs +0 -1
  297. package/dist/web-components/Label-KabnxuMN.mjs +0 -1
  298. package/dist/web-components/LightboxBody-BhRhdXo6.mjs +0 -1
  299. package/dist/web-components/ListEnd-CbwNlty-.mjs +0 -1
  300. package/dist/web-components/LoadedCanvas-CdZ5WOWz.mjs +0 -1
  301. package/dist/web-components/LoadedMap-DQyQVRVQ.mjs +0 -1
  302. package/dist/web-components/MapView-duA5WGsu.mjs +0 -3
  303. package/dist/web-components/Markup-D-kioDf9.mjs +0 -2
  304. package/dist/web-components/MediaBody-CoOiVXcv.mjs +0 -1
  305. package/dist/web-components/MediaBody-d8ErTuwT.mjs +0 -1
  306. package/dist/web-components/PagerLayout-CvOmKtSW.mjs +0 -1
  307. package/dist/web-components/Panel-CIdjOznL.mjs +0 -1
  308. package/dist/web-components/PlaceBox-BtIbIotm.mjs +0 -1
  309. package/dist/web-components/Placeholder-TIyj4ZjR.mjs +0 -1
  310. package/dist/web-components/Provider-C8se8i4I.mjs +0 -1
  311. package/dist/web-components/Root-CAJB0-Mh.mjs +0 -1
  312. package/dist/web-components/Scene-Ctcdt7CD.mjs +0 -1
  313. package/dist/web-components/SceneView-B6bEx_7x.mjs +0 -1
  314. package/dist/web-components/Timeline-CfIF4APc.mjs +0 -1
  315. package/dist/web-components/canvas-CWf_Fag8.mjs +0 -1
  316. package/dist/web-components/cloverEngine-6djEHNCD.mjs +0 -164
  317. package/dist/web-components/dragToClose-C-Pf1IeO.mjs +0 -1
  318. package/dist/web-components/es-BYfHUZ7P.mjs +0 -1
  319. package/dist/web-components/fi-B5y2qr8T.mjs +0 -1
  320. package/dist/web-components/fr-ChezCx6V.mjs +0 -1
  321. package/dist/web-components/fromManifest-gg5Wx14y.mjs +0 -1
  322. package/dist/web-components/glyphs-JYl2STEr.mjs +0 -1
  323. package/dist/web-components/hooks-x7rO95CS.mjs +0 -1
  324. package/dist/web-components/image-layers-BjbeyHBS.mjs +0 -1
  325. package/dist/web-components/index-BZ7b9k0N.mjs +0 -1
  326. package/dist/web-components/items-CnAIl9fS.mjs +0 -1
  327. package/dist/web-components/items-F6hJgdAS.mjs +0 -1
  328. package/dist/web-components/label-CI88KH2_.mjs +0 -1
  329. package/dist/web-components/layout-De1MOSYe.mjs +0 -1
  330. package/dist/web-components/logo-Ckwj7FlP.mjs +0 -1
  331. package/dist/web-components/nb-8J22f9Td.mjs +0 -1
  332. package/dist/web-components/nn-Dv1EvzI1.mjs +0 -1
  333. package/dist/web-components/no-8J22f9Td.mjs +0 -1
  334. package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +0 -1
  335. package/dist/web-components/part-CXts97_M.mjs +0 -1
  336. package/dist/web-components/playerSurface-HYwEwPK6.mjs +0 -1
  337. package/dist/web-components/pt-DWYQkATt.mjs +0 -1
  338. package/dist/web-components/readingLanguages-fs_HqvqQ.mjs +0 -1
  339. package/dist/web-components/rendererSurface-C0aKlE0v.mjs +0 -22
  340. package/dist/web-components/search-CkM0O0Z1.mjs +0 -1
  341. package/dist/web-components/shared-MTsMddHx.mjs +0 -1
  342. package/dist/web-components/styles-CZV1nbBQ.mjs +0 -1
  343. package/dist/web-components/useScrollTrack-CEsOU2yT.mjs +0 -1
  344. package/dist/web-components/viewer/AnnotationItems-CyhVcRFc.mjs +0 -1
  345. package/dist/web-components/viewer/AnnotationState-Bjztkobn.mjs +0 -1
  346. package/dist/web-components/viewer/Annotations-Dh_8Tzi0.mjs +0 -2
  347. package/dist/web-components/viewer/Annotations-wwuOCxzI.mjs +0 -1
  348. package/dist/web-components/viewer/CaptionDetails-BwCTovy_.mjs +0 -1
  349. package/dist/web-components/viewer/Collection-DSBxCmXw.mjs +0 -1
  350. package/dist/web-components/viewer/Connected-CL3N8F2J.mjs +0 -1
  351. package/dist/web-components/viewer/Connected-DTk1jlyI.mjs +0 -1
  352. package/dist/web-components/viewer/Contents-DrXckx7d.mjs +0 -1
  353. package/dist/web-components/viewer/ControlMenu-Bp91s-g_.mjs +0 -1
  354. package/dist/web-components/viewer/Cue-C-aF8peC.mjs +0 -1
  355. package/dist/web-components/viewer/Document-BN1rICu3.mjs +0 -1
  356. package/dist/web-components/viewer/DocumentPanel-CEesxdeY.mjs +0 -1
  357. package/dist/web-components/viewer/Download-CawEl9MN.mjs +0 -1
  358. package/dist/web-components/viewer/EntryBodies-nYHMwSSM.mjs +0 -1
  359. package/dist/web-components/viewer/EntryThumbnail-DrO_0SzR.mjs +0 -1
  360. package/dist/web-components/viewer/FrameAnimation-CZfzpxaD.mjs +0 -1
  361. package/dist/web-components/viewer/Gallery-MWHtvjti.mjs +0 -1
  362. package/dist/web-components/viewer/LanguageChoice-C50T7dPI.mjs +0 -1
  363. package/dist/web-components/viewer/LightboxBody-C2T7IC29.mjs +0 -1
  364. package/dist/web-components/viewer/ListEnd-BDuOx__m.mjs +0 -1
  365. package/dist/web-components/viewer/MediaBody-CEyswliX.mjs +0 -1
  366. package/dist/web-components/viewer/MediaBody-Dw3DWDjc.mjs +0 -1
  367. package/dist/web-components/viewer/PagerLayout-Cg2NpqoD.mjs +0 -1
  368. package/dist/web-components/viewer/PlaceBox-Dckw4Sfk.mjs +0 -1
  369. package/dist/web-components/viewer/Placeholder-NYVWYg5Q.mjs +0 -1
  370. package/dist/web-components/viewer/Search-DC259m4f.mjs +0 -1
  371. package/dist/web-components/viewer/StandaloneItems-E4kpMne9.mjs +0 -1
  372. package/dist/web-components/viewer/Transcript-D_VGJQxn.mjs +0 -1
  373. package/dist/web-components/viewer/annotation-collection-DZHa18ir.mjs +0 -1
  374. package/dist/web-components/viewer/annotation-name-BaNdW2Xk.mjs +0 -1
  375. package/dist/web-components/viewer/cloverEngine-C04bCSFR.mjs +0 -164
  376. package/dist/web-components/viewer/image-layers-B09fporZ.mjs +0 -1
  377. package/dist/web-components/viewer/overlayImage-BR3eJCKq.mjs +0 -1
  378. package/dist/web-components/viewer/range-regions-By6L5JOK.mjs +0 -1
  379. package/dist/web-components/viewer/styles-NZLnZPAC.mjs +0 -1
  380. package/dist/web-components/viewer/viewer-D30YHqyF.mjs +0 -29
  381. package/dist/web-components/viewer-CH7re5OO.mjs +0 -1
@@ -0,0 +1,85 @@
1
+ "use client";
2
+ import { useRef, useLayoutEffect } from "react";
3
+ function fitsRow(widths, room, gap) {
4
+ return widths.reduce((sum, width) => sum + width + gap, -gap) <= room;
5
+ }
6
+ function refocus(cluster, id, more) {
7
+ const page = cluster.ownerDocument;
8
+ const shown = (node) => node instanceof HTMLElement && cluster.contains(node) && !node.closest("[hidden]");
9
+ const target = [
10
+ page.getElementById(id),
11
+ page.getElementById(more),
12
+ ...Array.from(cluster.querySelectorAll("button"))
13
+ ].find(shown);
14
+ target == null ? void 0 : target.focus();
15
+ }
16
+ function Fits({
17
+ cluster,
18
+ ids,
19
+ more,
20
+ fits,
21
+ onFits
22
+ }) {
23
+ const shown = useRef(fits);
24
+ shown.current = fits;
25
+ const report = useRef(onFits);
26
+ report.current = onFits;
27
+ const widths = useRef(/* @__PURE__ */ new Map());
28
+ const latest = useRef(ids);
29
+ latest.current = ids;
30
+ const moved = useRef(null);
31
+ const key = ids.join(" ");
32
+ useLayoutEffect(() => {
33
+ const page = cluster.ownerDocument;
34
+ const measure = () => {
35
+ var _a;
36
+ const ids2 = latest.current;
37
+ const style = getComputedStyle(cluster);
38
+ const gap = parseFloat(style.columnGap) || 0;
39
+ let room = cluster.clientWidth - (parseFloat(style.paddingLeft) || 0) - (parseFloat(style.paddingRight) || 0);
40
+ let unit = 0;
41
+ for (const id of ids2) {
42
+ const width = (_a = page.getElementById(id)) == null ? void 0 : _a.offsetWidth;
43
+ if (width) widths.current.set(id, width);
44
+ unit = Math.max(unit, widths.current.get(id) ?? 0);
45
+ }
46
+ for (const child of Array.from(cluster.children)) {
47
+ if (!(child instanceof HTMLElement) || ids2.includes(child.id) || child.id === more || child.classList.contains("clover-canvas-more") || !child.offsetWidth || getComputedStyle(child).position === "absolute")
48
+ continue;
49
+ room -= child.offsetWidth + gap;
50
+ }
51
+ const next = fitsRow(
52
+ ids2.map((id) => widths.current.get(id) ?? unit),
53
+ room,
54
+ gap
55
+ );
56
+ if (next === shown.current) return;
57
+ const active = page.activeElement;
58
+ moved.current = active instanceof HTMLElement && cluster.contains(active) ? active.id : null;
59
+ shown.current = next;
60
+ report.current(next);
61
+ };
62
+ measure();
63
+ const resize = new ResizeObserver(() => measure());
64
+ resize.observe(cluster);
65
+ const mutation = new MutationObserver(() => measure());
66
+ mutation.observe(cluster, { childList: true });
67
+ return () => {
68
+ resize.disconnect();
69
+ mutation.disconnect();
70
+ };
71
+ }, [cluster, key, more]);
72
+ useLayoutEffect(() => {
73
+ const id = moved.current;
74
+ moved.current = null;
75
+ if (id === null) return;
76
+ const active = cluster.ownerDocument.activeElement;
77
+ if (!active || !cluster.contains(active) || active.closest("[hidden]"))
78
+ refocus(cluster, id, more);
79
+ }, [fits, cluster, more]);
80
+ return null;
81
+ }
82
+ export {
83
+ Fits,
84
+ fitsRow
85
+ };
@@ -169,6 +169,16 @@ function paintedImages(canvas, selections = {}, { allFrames = false } = {}) {
169
169
  );
170
170
  return images;
171
171
  }
172
+ function paintedType(canvases, selections = {}) {
173
+ for (const canvas of canvases) {
174
+ let type;
175
+ eachPainted(canvas, selections, (resolved) => {
176
+ type ?? (type = resolved.body.type);
177
+ });
178
+ if (typeof type === "string") return type.toLowerCase();
179
+ }
180
+ return void 0;
181
+ }
172
182
  function paintedMedia(canvas, selections = {}) {
173
183
  const media = [];
174
184
  eachPainted(canvas, selections, (resolved, target, _frame, t) => {
@@ -451,6 +461,7 @@ export {
451
461
  mediaSegments,
452
462
  paintedImages,
453
463
  paintedMedia,
464
+ paintedType,
454
465
  placeholderStill,
455
466
  playsHere,
456
467
  resolveBody,
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useMemo, useEffect, useState } from "react";
4
- import { PlayerFace, PlayerChapters } from "./Player.mjs";
5
- import Transport, { chapterAt } from "./Transport.mjs";
3
+ import { useState, useRef, useCallback, useEffect, useMemo } from "react";
4
+ import { PlayerFace } from "./Player.mjs";
5
+ import Transport from "./Transport.mjs";
6
6
  import { useCaptionTracks } from "./useCaptionTracks.mjs";
7
7
  import { useMediaController } from "./useMediaController.mjs";
8
8
  import { useMediaElement, captionName } from "./useMediaElement.mjs";
9
9
  import { cueText } from "../../../core/vtt.mjs";
10
- import { playFrom } from "../../../lib/time.mjs";
10
+ 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";
@@ -16,6 +16,7 @@ const MOMENT_SECONDS = 3;
16
16
  const MediaBody = ({
17
17
  media,
18
18
  request,
19
+ fillable = false,
19
20
  surface,
20
21
  instance,
21
22
  onElement,
@@ -39,6 +40,48 @@ const MediaBody = ({
39
40
  const language = givenLanguage ?? rootLanguage;
40
41
  const element = useMediaElement(media, { request, language });
41
42
  const controller = useMediaController(element, media.duration);
43
+ const [filled, setFilled] = useState(false);
44
+ const filledRef = useRef(filled);
45
+ filledRef.current = filled;
46
+ const frameVideo = useCallback(
47
+ (immediate) => {
48
+ if (!hasCamera(surface)) return;
49
+ if (!filledRef.current) return surface.home(immediate);
50
+ const world = surface.getHomeBounds();
51
+ const host = surface.host;
52
+ if (!world || !(host == null ? void 0 : host.clientWidth) || !host.clientHeight) return;
53
+ surface.fitBounds(
54
+ fillRect(world, host.clientWidth / host.clientHeight),
55
+ immediate
56
+ );
57
+ },
58
+ [surface]
59
+ );
60
+ const firstFit = useRef(true);
61
+ useEffect(() => {
62
+ if (firstFit.current) {
63
+ firstFit.current = false;
64
+ return;
65
+ }
66
+ if (fillable) frameVideo(false);
67
+ }, [filled, fillable, frameVideo]);
68
+ useEffect(() => {
69
+ if (!fillable || !filled || !hasCamera(surface)) return;
70
+ const again = () => frameVideo(true);
71
+ const observer = new ResizeObserver(again);
72
+ observer.observe(surface.host);
73
+ const offOpen = surface.on("open", again);
74
+ const offChange = surface.on("change", again);
75
+ return () => {
76
+ observer.disconnect();
77
+ offOpen();
78
+ offChange();
79
+ };
80
+ }, [fillable, filled, surface, frameVideo]);
81
+ const fill = useMemo(
82
+ () => fillable ? { filled, onToggle: () => setFilled((was) => !was) } : void 0,
83
+ [fillable, filled]
84
+ );
42
85
  const failed = useMediaFailed(element);
43
86
  const own = useMemo(
44
87
  () => media.captions.map((caption2, index) => {
@@ -167,43 +210,45 @@ const MediaBody = ({
167
210
  chapters,
168
211
  highlightedChapter,
169
212
  onChapterHighlight,
170
- request
213
+ request,
214
+ fill
171
215
  }
172
216
  );
173
- const cuesShown = cues.length + playing.length > 0 && /* @__PURE__ */ jsxs("div", { className: "clover-canvas-captions", "aria-live": "off", children: [
174
- playing.map((note) => /* @__PURE__ */ jsxs(
175
- "span",
176
- {
177
- className: "clover-canvas-captions-cue",
178
- "data-kind": "annotation",
179
- children: [
180
- note.page && /* @__PURE__ */ jsx(
181
- "span",
182
- {
183
- className: "clover-canvas-captions-cue-label",
184
- ...languageProps(note.page.lang),
185
- children: note.page.text
186
- }
187
- ),
188
- /* @__PURE__ */ jsx("span", { ...languageProps(note.lang), children: note.label })
189
- ]
190
- },
191
- note.id
192
- )),
193
- cues.map((text, index) => /* @__PURE__ */ jsx(
194
- "span",
195
- {
196
- className: "clover-canvas-captions-cue",
197
- ...languageProps(
198
- captionLanguage && captionLanguage !== "none" ? captionLanguage : void 0
217
+ const noteLines = playing.map((note) => /* @__PURE__ */ jsxs(
218
+ "span",
219
+ {
220
+ className: "clover-canvas-captions-cue",
221
+ "data-kind": "annotation",
222
+ children: [
223
+ note.page && /* @__PURE__ */ jsx(
224
+ "span",
225
+ {
226
+ className: "clover-canvas-captions-cue-label",
227
+ ...languageProps(note.page.lang),
228
+ children: note.page.text
229
+ }
199
230
  ),
200
- children: text
201
- },
202
- index
203
- ))
231
+ /* @__PURE__ */ jsx("span", { ...languageProps(note.lang), children: note.label })
232
+ ]
233
+ },
234
+ note.id
235
+ ));
236
+ const captionLines = cues.map((text, index) => /* @__PURE__ */ jsx(
237
+ "span",
238
+ {
239
+ className: "clover-canvas-captions-cue",
240
+ ...languageProps(
241
+ captionLanguage && captionLanguage !== "none" ? captionLanguage : void 0
242
+ ),
243
+ children: text
244
+ },
245
+ index
246
+ ));
247
+ const cuesShown = cues.length + playing.length > 0 && /* @__PURE__ */ jsxs("div", { className: "clover-canvas-captions", "aria-live": "off", children: [
248
+ noteLines,
249
+ captionLines
204
250
  ] });
205
251
  if (player) {
206
- const current = chapterAt(chapters ?? [], currentTime);
207
252
  return /* @__PURE__ */ jsx(
208
253
  "div",
209
254
  {
@@ -221,17 +266,17 @@ const MediaBody = ({
221
266
  language
222
267
  }
223
268
  ),
224
- cuesShown,
225
- transport,
226
- /* @__PURE__ */ jsx(BodyUnloadable, { kind: media.kind, shown: failed, room: true }),
227
- chapters && chapters.length > 0 && /* @__PURE__ */ jsx(
228
- PlayerChapters,
269
+ playing.length > 0 && /* @__PURE__ */ jsx(
270
+ "div",
229
271
  {
230
- chapters,
231
- current,
232
- onSeek: (seconds) => element && playFrom(element, seconds)
272
+ className: "clover-canvas-captions clover-canvas-player-notes",
273
+ "aria-live": "off",
274
+ children: noteLines
233
275
  }
234
- )
276
+ ),
277
+ cues.length > 0 && /* @__PURE__ */ jsx("div", { className: "clover-canvas-captions", "aria-live": "off", children: captionLines }),
278
+ transport,
279
+ /* @__PURE__ */ jsx(BodyUnloadable, { kind: media.kind, shown: failed, room: true })
235
280
  ] })
236
281
  }
237
282
  );
@@ -291,6 +336,19 @@ function useVideoSize(element) {
291
336
  }, [element]);
292
337
  return size;
293
338
  }
339
+ function fillRect(world, shape) {
340
+ return world.width / world.height > shape ? {
341
+ x: world.x + (world.width - world.height * shape) / 2,
342
+ y: world.y,
343
+ width: world.height * shape,
344
+ height: world.height
345
+ } : {
346
+ x: world.x,
347
+ y: world.y + (world.height - world.width / shape) / 2,
348
+ width: world.width,
349
+ height: world.width / shape
350
+ };
351
+ }
294
352
  function containAspect(box, size) {
295
353
  if (!size) return box;
296
354
  if (!box.width || !box.height)
@@ -307,5 +365,6 @@ function containAspect(box, size) {
307
365
  }
308
366
  export {
309
367
  containAspect,
310
- MediaBody as default
368
+ MediaBody as default,
369
+ fillRect
311
370
  };
@@ -3,9 +3,6 @@ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
3
  import { useMemo, useState } from "react";
4
4
  import { thumbnailSource, stillSource } from "../../../core/thumbnail.mjs";
5
5
  import { localize } from "../../../core/value.mjs";
6
- import { useCloverTranslation } from "../../../i18n/useCloverTranslation.mjs";
7
- import { useContainerName } from "../../../i18n/useContainerName.mjs";
8
- import { CueTime } from "../../../ui/Cue.mjs";
9
6
  import { useThumbnail } from "../../../ui/EntryThumbnail.mjs";
10
7
  import { languageProps } from "../../../i18n/direction.mjs";
11
8
  const ART_SIZE = 1200;
@@ -122,58 +119,6 @@ function PlayerFace({
122
119
  ] })
123
120
  ] });
124
121
  }
125
- function PlayerChapters({
126
- chapters,
127
- current,
128
- onSeek
129
- }) {
130
- const { t, langOf, hostLanguage } = useCloverTranslation();
131
- const name = useContainerName(
132
- t("playerChapters"),
133
- langOf("playerChapters"),
134
- false,
135
- hostLanguage
136
- );
137
- return /* @__PURE__ */ jsxs(Fragment, { children: [
138
- /* @__PURE__ */ jsx("ol", { className: "clover-canvas-player-chapters", ...name.props, children: chapters.map((chapter, index) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
139
- "button",
140
- {
141
- type: "button",
142
- className: "clover-canvas-player-chapter",
143
- "aria-current": index === current ? "true" : void 0,
144
- onClick: () => onSeek(chapter.start),
145
- children: [
146
- /* @__PURE__ */ jsx(
147
- "span",
148
- {
149
- className: "clover-canvas-player-chapter-number",
150
- "aria-hidden": "true",
151
- children: index + 1
152
- }
153
- ),
154
- /* @__PURE__ */ jsx(
155
- "span",
156
- {
157
- className: "clover-canvas-player-chapter-label",
158
- ...languageProps(chapter.lang || void 0),
159
- children: chapter.label
160
- }
161
- ),
162
- " ",
163
- /* @__PURE__ */ jsx(
164
- CueTime,
165
- {
166
- start: chapter.start,
167
- className: "clover-canvas-player-chapter-time"
168
- }
169
- )
170
- ]
171
- }
172
- ) }, chapter.id ?? index)) }),
173
- name.node
174
- ] });
175
- }
176
122
  export {
177
- PlayerChapters,
178
123
  PlayerFace
179
124
  };
@@ -11,7 +11,7 @@ import { join } from "../../../lib/classnames.mjs";
11
11
  import { languageCode } from "../../../i18n/languageCode.mjs";
12
12
  import { Tip, SHORTCUTS } from "../../../ui/Tip.mjs";
13
13
  import { useOneOpen } from "../../../ui/useOneOpen.mjs";
14
- import { PlayIcon, PauseIcon, VolumeMutedIcon, VolumeHighIcon, ChaptersIcon, CaptionsIcon, ExitFullScreenIcon, FullScreenIcon } from "../../../ui/mediaIcons.mjs";
14
+ import { PlayIcon, PauseIcon, VolumeMutedIcon, VolumeHighIcon, CaptionsIcon, FitIcon, FillIcon, ExitFullScreenIcon, FullScreenIcon } from "../../../ui/mediaIcons.mjs";
15
15
  import { useContainerName } from "../../../i18n/useContainerName.mjs";
16
16
  import { useCloverTranslation } from "../../../i18n/useCloverTranslation.mjs";
17
17
  import { toggleFullscreen } from "../../../lib/fullscreen.mjs";
@@ -239,7 +239,8 @@ const Transport = ({
239
239
  chapters = [],
240
240
  highlightedChapter = null,
241
241
  onChapterHighlight,
242
- request
242
+ request,
243
+ fill
243
244
  }) => {
244
245
  var _a, _b;
245
246
  const { t, langOf } = useCloverTranslation();
@@ -487,27 +488,7 @@ const Transport = ({
487
488
  }
488
489
  )
489
490
  ] }),
490
- (chapters.length > 0 || captions.length > 0 || hasFullscreen) && /* @__PURE__ */ jsxs("div", { className: "clover-canvas-transport-end", children: [
491
- chapters.length > 0 && /* @__PURE__ */ jsx(
492
- TransportMenu,
493
- {
494
- id: `${instance}-chapters`,
495
- label: t("playerChapters"),
496
- labelLang: langOf("playerChapters"),
497
- button: "chapters",
498
- icon: /* @__PURE__ */ jsx(ChaptersIcon, {}),
499
- options: chapters.map((item) => ({
500
- label: item.label,
501
- lang: item.lang,
502
- time: formatTime(item.start),
503
- thumbnail: chapterPicture(item)
504
- })),
505
- selected: chapter,
506
- onSelect: (index) => controller.seek(chapters[index].start),
507
- request,
508
- asMenu: true
509
- }
510
- ),
491
+ (captions.length > 0 || hasFullscreen || fill) && /* @__PURE__ */ jsxs("div", { className: "clover-canvas-transport-end", children: [
511
492
  captions.length > 0 && /* @__PURE__ */ jsx(
512
493
  TransportMenu,
513
494
  {
@@ -523,6 +504,15 @@ const Transport = ({
523
504
  onSelect: (index) => onCaptionChange(index - 1)
524
505
  }
525
506
  ),
507
+ fill && /* @__PURE__ */ jsx(
508
+ TransportButton,
509
+ {
510
+ words: fill.filled ? "playerFit" : "playerFill",
511
+ button: "fill",
512
+ onClick: fill.onToggle,
513
+ children: fill.filled ? /* @__PURE__ */ jsx(FitIcon, {}) : /* @__PURE__ */ jsx(FillIcon, {})
514
+ }
515
+ ),
526
516
  hasFullscreen && /* @__PURE__ */ jsx(
527
517
  TransportButton,
528
518
  {
@@ -540,5 +530,6 @@ const Transport = ({
540
530
  };
541
531
  export {
542
532
  chapterAt,
533
+ chapterPicture,
543
534
  Transport as default
544
535
  };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  const CONTROLS = [
3
- ".clover-canvas-controls",
3
+ ".clover-canvas-controls > *",
4
4
  ".clover-canvas-navigator",
5
5
  ".clover-canvas-transport",
6
6
  '.clover-canvas-caption[data-open="true"]',
@@ -59,7 +59,7 @@ const Collection = forwardRef(
59
59
  {
60
60
  as: label.as,
61
61
  label: shown.label,
62
- className: "clover-collection-title",
62
+ className: "clover-collection-title clover-title",
63
63
  ...label.title
64
64
  }
65
65
  ),
@@ -78,6 +78,7 @@ function CountMenu({
78
78
  triggerId,
79
79
  onClose: close,
80
80
  holds,
81
+ inside: true,
81
82
  className: "clover-pager-menu",
82
83
  children: /* @__PURE__ */ jsx("div", { className: "clover-collection clover-pager-list", children: list(() => close(true)) })
83
84
  }
@@ -130,14 +130,15 @@ function ItemFigure({
130
130
  size,
131
131
  language,
132
132
  request,
133
- showSummary = false
133
+ showSummary = false,
134
+ secondary = "summary"
134
135
  }) {
135
136
  var _a, _b;
136
137
  const labels = item.parts.map(
137
138
  (part) => localize(item.parts.length === 1 ? item.label : part.label, language)
138
139
  );
139
- const summary = showSummary ? localize(item.summary, language) : null;
140
- const navDate = showSummary ? readDate(item.navDate) : null;
140
+ const summary = showSummary && secondary === "summary" ? localize(item.summary, language) : null;
141
+ const navDate = showSummary && secondary === "navDate" ? readDate(item.navDate) : null;
141
142
  const labeled = labels.some((label) => label.text);
142
143
  return /* @__PURE__ */ jsxs(
143
144
  "figure",
@@ -115,6 +115,7 @@ function MemberItems({
115
115
  function ViewItems({
116
116
  onSelect,
117
117
  forwardedRef,
118
+ singleItem = false,
118
119
  ...rest
119
120
  }) {
120
121
  const { clover, language } = useOptionalClover();
@@ -126,7 +127,7 @@ function ViewItems({
126
127
  (state) => selectSequence(state.manifest).direction
127
128
  );
128
129
  const items = itemsOfManifest(manifest);
129
- if (items.length < 2) return null;
130
+ if (items.length < (singleItem ? 1 : 2)) return null;
130
131
  const select = (item) => clover.goTo(item.id);
131
132
  if (rest.layout === "pager") {
132
133
  return /* @__PURE__ */ jsx(
@@ -186,6 +187,7 @@ function ItemsView({
186
187
  request,
187
188
  language,
188
189
  showSummary = false,
190
+ secondary = "summary",
189
191
  heading,
190
192
  headingLevel = 2,
191
193
  renderItem,
@@ -194,9 +196,11 @@ function ItemsView({
194
196
  as: Tag = "section",
195
197
  className,
196
198
  "aria-label": ariaLabel,
197
- // The pager's, not a list's.
198
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
199
+ // The pager's, not a list's, and the views' alone (`ViewItems`).
200
+ /* eslint-disable @typescript-eslint/no-unused-vars */
199
201
  size,
202
+ singleItem,
203
+ /* eslint-enable @typescript-eslint/no-unused-vars */
200
204
  highContrast,
201
205
  ...rest
202
206
  }) {
@@ -208,6 +212,21 @@ function ItemsView({
208
212
  const contrast = useHighContrast(highContrast);
209
213
  const slider = layout === "slider";
210
214
  const listbox = navigation === "id";
215
+ const viewport = useRef(null);
216
+ const masonry = layout === "masonry";
217
+ useEffect(() => {
218
+ const box = viewport.current;
219
+ if (!masonry || !box) return;
220
+ let release;
221
+ let live = true;
222
+ void import("./masonry.mjs").then(({ attachMasonry }) => {
223
+ if (live) release = attachMasonry(box);
224
+ });
225
+ return () => {
226
+ live = false;
227
+ release == null ? void 0 : release();
228
+ };
229
+ }, [masonry]);
211
230
  const track = useScrollTrack({
212
231
  align: listbox ? "center" : "start",
213
232
  itemCount: items.length
@@ -245,16 +264,16 @@ function ItemsView({
245
264
  var _a2;
246
265
  if (selected < 0) return;
247
266
  const instant = !arrived.current;
248
- arrived.current = true;
249
267
  if (slider) {
250
- track.scrollToIndex(selected, { instant });
268
+ if (track.scrollToIndex(selected, { instant })) arrived.current = true;
251
269
  return;
252
270
  }
271
+ arrived.current = true;
253
272
  const option = (_a2 = listRef.current) == null ? void 0 : _a2.querySelector(
254
273
  `[data-track-index="${selected}"]`
255
274
  );
256
275
  if (option) keepInView(option, instant);
257
- }, [slider, selected]);
276
+ }, [slider, selected, track.scrollToIndex]);
258
277
  const Title = titleTag(headingLevel);
259
278
  const headingLabel = heading ? localize(heading.label, language) : null;
260
279
  const headingSummary = heading ? localize(heading.summary, language) : null;
@@ -273,10 +292,11 @@ function ItemsView({
273
292
  size: thumbnailSize,
274
293
  language,
275
294
  request,
276
- showSummary
295
+ showSummary,
296
+ secondary
277
297
  }
278
298
  );
279
- const positioned = (item) => !(renderItem || localize(item.label, language).text || showSummary && localize(item.summary, language).text);
299
+ const positioned = (item) => !(renderItem || localize(item.label, language).text || showSummary && secondary === "summary" && localize(item.summary, language).text);
280
300
  const positionName = (item, index) => positioned(item) ? t("canvasPosition", { index: index + 1, total: items.length }) : void 0;
281
301
  const positionLang = (item) => positioned(item) ? langOf("canvasPosition") : void 0;
282
302
  const trackStyle = slider ? { display: "flex", margin: 0, padding: 0, listStyle: "none" } : void 0;
@@ -347,7 +367,7 @@ function ItemsView({
347
367
  (headingLabel == null ? void 0 : headingLabel.text) && /* @__PURE__ */ jsx(
348
368
  Title,
349
369
  {
350
- className: "clover-items-title",
370
+ className: "clover-items-title clover-title",
351
371
  id: `${id}-title`,
352
372
  ...languageProps(headingLabel.lang),
353
373
  children: headingLabel.text
@@ -385,7 +405,7 @@ function ItemsView({
385
405
  {
386
406
  id: `${id}-viewport`,
387
407
  className: "clover-items-viewport",
388
- ref: slider ? track.ref : void 0,
408
+ ref: slider ? track.ref : viewport,
389
409
  children: listbox ? /* @__PURE__ */ jsx(
390
410
  "div",
391
411
  {
@@ -18,6 +18,8 @@ function PagerLayout({
18
18
  language,
19
19
  navigation,
20
20
  of,
21
+ secondary,
22
+ singleItem,
21
23
  /* eslint-enable @typescript-eslint/no-unused-vars */
22
24
  highContrast,
23
25
  ...rest
@@ -172,7 +172,7 @@ function TargetsSection({
172
172
  heading.text && /* @__PURE__ */ jsx(
173
173
  Title,
174
174
  {
175
- className: "clover-collection-title",
175
+ className: "clover-collection-title clover-title",
176
176
  ...languageProps(heading.lang),
177
177
  children: heading.text
178
178
  }
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ function attachMasonry(box) {
3
+ const items = () => Array.from(
4
+ box.querySelectorAll(
5
+ ".clover-items-track > .clover-items-item"
6
+ )
7
+ );
8
+ const span = (item) => {
9
+ const track = item.parentElement;
10
+ if (!track) return;
11
+ const style = getComputedStyle(track);
12
+ const row = parseFloat(style.gridAutoRows) || 1;
13
+ const gap = parseFloat(style.columnGap) || 0;
14
+ const height = item.getBoundingClientRect().height;
15
+ item.style.gridRowEnd = `span ${Math.max(1, Math.ceil((height + gap) / row))}`;
16
+ };
17
+ const sizes = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(
18
+ (entries) => entries.forEach((entry) => span(entry.target))
19
+ );
20
+ const watch = () => items().forEach((item) => {
21
+ sizes == null ? void 0 : sizes.observe(item);
22
+ span(item);
23
+ });
24
+ const added = new MutationObserver(watch);
25
+ added.observe(box, { childList: true, subtree: true });
26
+ watch();
27
+ return () => {
28
+ added.disconnect();
29
+ sizes == null ? void 0 : sizes.disconnect();
30
+ items().forEach((item) => item.style.removeProperty("grid-row-end"));
31
+ };
32
+ }
33
+ export {
34
+ attachMasonry
35
+ };