@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
@@ -7,6 +7,7 @@ import { rendererSurface } from "../Canvas/rendererSurface.mjs";
7
7
  import { join } from "../../lib/classnames.mjs";
8
8
  import { useClover, useCloverSelector } from "../../react/context.mjs";
9
9
  import { useVisibleCanvases } from "../../react/hooks.mjs";
10
+ import { useRootContentState } from "../../react/useContentStateOutput.mjs";
10
11
  import { Loading } from "../../ui/Loading.mjs";
11
12
  const ConnectedTimeline = lazy(() => import("../Timeline/Connected.mjs"));
12
13
  const ConnectedScene = lazy(() => import("../Scene/Connected.mjs"));
@@ -14,11 +15,14 @@ function Body({
14
15
  className,
15
16
  style,
16
17
  renderers,
18
+ collapseControls,
19
+ onContentStateChange,
17
20
  children,
18
21
  ...canvas
19
22
  }) {
20
23
  var _a;
21
24
  const root = useClover("Body");
25
+ useRootContentState(root.clover, onContentStateChange);
22
26
  const canvases = useVisibleCanvases();
23
27
  const bodies = useMemo(() => paintingBodies(canvases), [canvases]);
24
28
  const renderer = pickRenderer(renderers ?? root.renderers, {
@@ -40,7 +44,18 @@ function Body({
40
44
  ...style
41
45
  },
42
46
  children: [
43
- Renderer ? /* @__PURE__ */ jsx(Renderer, { canvases, bodies, children }) : kind === "Scene" ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Loading, { overlay: true }), children: /* @__PURE__ */ jsx(ConnectedScene, { ...canvas, children }) }) : kind === "Timeline" ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Loading, { overlay: true }), children: /* @__PURE__ */ jsx(ConnectedTimeline, { ...canvas, children }) }) : /* @__PURE__ */ jsx(ConnectedCanvas, { ...canvas, surface: rendererSurface, children }),
47
+ Renderer ? /* @__PURE__ */ jsx(Renderer, { canvases, bodies, children }) : kind === "Scene" ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Loading, { overlay: true }), children: /* @__PURE__ */ jsx(ConnectedScene, { ...canvas, children }) }) : kind === "Timeline" ? /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Loading, { overlay: true }), children: /* @__PURE__ */ jsx(ConnectedTimeline, { ...canvas, children }) }) : (
48
+ // Canvas's alone: a Timeline's and a Scene's controls are their own (as yet).
49
+ /* @__PURE__ */ jsx(
50
+ ConnectedCanvas,
51
+ {
52
+ ...canvas,
53
+ collapseControls,
54
+ surface: rendererSurface,
55
+ children
56
+ }
57
+ )
58
+ ),
44
59
  busy && /* @__PURE__ */ jsx(Loading, { overlay: true })
45
60
  ]
46
61
  }
@@ -8,6 +8,20 @@ const Comment = () => /* @__PURE__ */ jsx(
8
8
  d: "M144 72H368A96 96 0 0 1 464 168V296A96 96 0 0 1 368 392H200L104 460L144 392A96 96 0 0 1 48 296V168A96 96 0 0 1 144 72Z M168 184H344A16 16 0 0 1 344 216H168A16 16 0 0 1 168 184Z M168 264H280A16 16 0 0 1 280 296H168A16 16 0 0 1 168 264Z"
9
9
  }
10
10
  );
11
+ const Chapters = () => /* @__PURE__ */ jsxs(Fragment, { children: [
12
+ /* @__PURE__ */ jsx(
13
+ "path",
14
+ {
15
+ d: "M160 144h288M160 256h288M160 368h288",
16
+ fill: "none",
17
+ strokeLinecap: "round",
18
+ strokeWidth: "32"
19
+ }
20
+ ),
21
+ /* @__PURE__ */ jsx("circle", { cx: "80", cy: "144", r: "20", stroke: "none" }),
22
+ /* @__PURE__ */ jsx("circle", { cx: "80", cy: "256", r: "20", stroke: "none" }),
23
+ /* @__PURE__ */ jsx("circle", { cx: "80", cy: "368", r: "20", stroke: "none" })
24
+ ] });
11
25
  const Information = () => /* @__PURE__ */ jsx(
12
26
  "path",
13
27
  {
@@ -65,6 +79,7 @@ const CloseViewer = () => /* @__PURE__ */ jsxs(Fragment, { children: [
65
79
  )
66
80
  ] });
67
81
  export {
82
+ Chapters,
68
83
  Close,
69
84
  CloseViewer,
70
85
  Comment,
@@ -3,9 +3,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import React, { useRef, useState, useMemo, useEffect, useCallback, useLayoutEffect, Suspense, lazy } from "react";
4
4
  import Caption, { hasInformation, captionLabelId } from "../Body/Caption.mjs";
5
5
  import Controls from "./Controls.mjs";
6
- import { findChoices, startingChoices, animationFrames, canvasScene, placeholderStill, frameKey, canvasRectToWorld, canvasSize } from "./layout.mjs";
6
+ import { findChoices, startingChoices, animationFrames, canvasScene, paintedType, placeholderStill, frameKey, canvasSize, canvasRectToWorld } from "./layout.mjs";
7
7
  import ExitFullscreen from "../../ui/ExitFullscreen.mjs";
8
- import { useControlsVisibility } from "../Body/useControlsVisibility.mjs";
9
8
  import { useNearViewport } from "../Body/useNearViewport.mjs";
10
9
  import useFullscreen from "../../hooks/useFullscreen.mjs";
11
10
  import useWithinFullscreen from "../../hooks/useWithinFullscreen.mjs";
@@ -28,6 +27,8 @@ import { union } from "../../lib/renderer/math/rect.mjs";
28
27
  import { findImageServiceId } from "../../lib/renderer/sources/imageService.mjs";
29
28
  import { hasCamera } from "./surface.mjs";
30
29
  import { languageProps } from "../../i18n/direction.mjs";
30
+ import { buildContentState } from "../../core/content-state.mjs";
31
+ import { useContentStateOutput, watchMedia } from "../../react/useContentStateOutput.mjs";
31
32
  import { resolveDirection } from "../../core/sequence.mjs";
32
33
  const MediaBody = lazy(() => import("./media/MediaBody.mjs"));
33
34
  const loadHotspots = () => import("./AnnotationState.mjs");
@@ -49,6 +50,13 @@ const NO_MODEL = {
49
50
  const FrameAnimation = lazy(() => import("./FrameAnimation.mjs"));
50
51
  const PlaceBox = lazy(() => import("./PlaceBox.mjs"));
51
52
  const Placeholder = lazy(() => import("./Placeholder.mjs"));
53
+ const ControlsFade = lazy(() => import("./ControlsFade.mjs"));
54
+ const inSight = () => true;
55
+ const PlaceholderToggle = lazy(
56
+ () => import("./Placeholder.mjs").then(({ PlaceholderToggle: PlaceholderToggle2 }) => ({
57
+ default: PlaceholderToggle2
58
+ }))
59
+ );
52
60
  const ALL_CONTROLS = {
53
61
  zoom: true,
54
62
  fullPage: true,
@@ -58,6 +66,15 @@ const ALL_CONTROLS = {
58
66
  information: true,
59
67
  map: true
60
68
  };
69
+ const NO_CONTROLS = {
70
+ zoom: false,
71
+ fullPage: false,
72
+ rotation: false,
73
+ reset: false,
74
+ annotations: false,
75
+ information: false,
76
+ map: false
77
+ };
61
78
  const CAMERA_KEYS = {
62
79
  description: "canvasKeysImage",
63
80
  keys: [
@@ -102,10 +119,12 @@ const CanvasBody = (props) => {
102
119
  options,
103
120
  navigator = false,
104
121
  controls = true,
122
+ collapseControls = "auto",
105
123
  controlButtons,
106
124
  annotations: allAnnotations,
107
125
  onReady,
108
126
  onViewportChange,
127
+ onContentStateChange,
109
128
  onMediaElement,
110
129
  onCaptionChange,
111
130
  caption,
@@ -128,11 +147,14 @@ const CanvasBody = (props) => {
128
147
  setWrapperElement
129
148
  );
130
149
  const contrast = useHighContrast(highContrast);
131
- const controlsVisible = useControlsVisibility(
132
- wrapperElement,
150
+ const surfaceFades = Boolean(makeSurface.controlsVisibility);
151
+ const useVisibility = makeSurface.controlsVisibility ?? inSight;
152
+ const surfaceVisible = useVisibility(
153
+ surfaceFades ? wrapperElement : null,
133
154
  options == null ? void 0 : options.hideDelay,
134
155
  hostRef
135
156
  );
157
+ const [videoVisible, setVideoVisible] = useState(false);
136
158
  const nearViewport = useNearViewport(wrapperElement);
137
159
  const made = useUniqueId();
138
160
  const [instance] = useState(() => instanceId ?? `clover-canvas-${made}`);
@@ -248,6 +270,15 @@ const CanvasBody = (props) => {
248
270
  [body, src, isTiledImage]
249
271
  );
250
272
  const media = (scene == null ? void 0 : scene.media[0]) ?? null;
273
+ const videoFades = !surfaceFades && (media == null ? void 0 : media.kind) === "video";
274
+ const fades = surfaceFades || videoFades;
275
+ const controlsVisible = surfaceFades ? surfaceVisible : videoVisible;
276
+ const painted = useMemo(() => {
277
+ if (canvases == null ? void 0 : canvases.length) return paintedType(canvases, selections);
278
+ const handed = (Array.isArray(body) ? body : body ? [body] : [])[0];
279
+ if (typeof (handed == null ? void 0 : handed.type) === "string") return handed.type.toLowerCase();
280
+ return src ? "image" : void 0;
281
+ }, [canvases, selections, body, src]);
251
282
  const [mediaElement, setMediaElement] = useState(
252
283
  null
253
284
  );
@@ -261,6 +292,7 @@ const CanvasBody = (props) => {
261
292
  const baseImages = scene ? scene.images : bodyImages;
262
293
  const mediaOnly = Boolean(media) && (canvases == null ? void 0 : canvases.length) === 1;
263
294
  const player = mediaOnly && (media == null ? void 0 : media.kind) === "audio";
295
+ const fillable = mediaOnly && (media == null ? void 0 : media.kind) === "video";
264
296
  const empty = (canvases == null ? void 0 : canvases.length) === 1 && !media && !animated && baseImages.length === 0;
265
297
  const navigable = !mediaOnly && !empty && ((_b = options == null ? void 0 : options.gestures) == null ? void 0 : _b.navigable) !== false;
266
298
  const canvasKey = canvases ? `${manifestId ?? ""}
@@ -287,7 +319,10 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
287
319
  });
288
320
  const fullscreenExit = empty && withinFullscreen;
289
321
  const hostControls = React.Children.count(children) > 0;
290
- const shownControls = !controlsConfig ? null : showPlaceholder ? captioned.length || hostControls || listedCount ? onlyInformation(controlsConfig, { annotations: true }) : null : mediaOnly || empty ? choices.length || captioned.length || hostControls || listedCount || fullscreenExit && controlsConfig.fullPage ? onlyInformation(controlsConfig, {
322
+ const cornerToggle = stills.length > 0 && !player && !media;
323
+ const shownControls = !controlsConfig ? null : showPlaceholder ? captioned.length || hostControls || listedCount || // A recording's chapters, offered over its still too.
324
+ media && (chapters == null ? void 0 : chapters.length) ? onlyInformation(controlsConfig, { annotations: true }) : null : mediaOnly || empty ? choices.length || captioned.length || hostControls || listedCount || // A recording's chapters, listed by a control of its own (`ChaptersMenu`).
325
+ media && (chapters == null ? void 0 : chapters.length) || fullscreenExit && controlsConfig.fullPage ? onlyInformation(controlsConfig, {
291
326
  annotations: true,
292
327
  fullPage: fullscreenExit
293
328
  }) : null : controlsConfig;
@@ -322,6 +357,20 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
322
357
  else setImagesOpen(showPlaceholder);
323
358
  if (!showPlaceholder) releaseAnnotation();
324
359
  };
360
+ const pendingChapter = useRef(null);
361
+ const goToChapter = (start) => {
362
+ if (mediaElement && !showPlaceholder) {
363
+ mediaElement.currentTime = start;
364
+ return;
365
+ }
366
+ pendingChapter.current = start;
367
+ if (showPlaceholder) togglePlaceholder();
368
+ };
369
+ useEffect(() => {
370
+ if (!mediaElement || pendingChapter.current === null) return;
371
+ mediaElement.currentTime = pendingChapter.current;
372
+ pendingChapter.current = null;
373
+ }, [mediaElement]);
325
374
  const firstBody = Array.isArray(body) ? body[0] : body;
326
375
  const ownName = [label, (_c = canvases == null ? void 0 : canvases[0]) == null ? void 0 : _c.label, firstBody == null ? void 0 : firstBody.label].map((value) => localize(value, language)).find((value) => value.text);
327
376
  const partOfName = useMemo(() => {
@@ -353,6 +402,31 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
353
402
  drawnScene.current = canvases2 && scene2 && shownCanvases.current === canvasKey2 ? { key: canvasKey2, canvases: canvases2, placements: scene2.placements } : null;
354
403
  }, []);
355
404
  const drawn = !canvases || ((_d = drawnScene.current) == null ? void 0 : _d.key) === canvasKey;
405
+ const contentStateChanged = useContentStateOutput(() => {
406
+ const shown = drawnScene.current;
407
+ const surface2 = surfaceRef.current;
408
+ if (!shown || manifestId === "loading") return null;
409
+ const time = mediaElement && mediaElement.currentTime > 0 ? mediaElement.currentTime : null;
410
+ const region = !time && surface2 && hasCamera(surface2) ? canvasRegion(surface2.getBounds(), shown.canvases, shown.placements) : null;
411
+ const canvas = shown.canvases.find((each) => each.id === (region == null ? void 0 : region.canvasId)) ?? shown.canvases[0];
412
+ if (!canvas) return null;
413
+ return buildContentState({
414
+ manifestId,
415
+ canvasId: canvas.id,
416
+ type: canvas.type,
417
+ region: region && {
418
+ x: region.rect.x,
419
+ y: region.rect.y,
420
+ w: region.rect.width,
421
+ h: region.rect.height
422
+ },
423
+ time
424
+ });
425
+ }, onContentStateChange);
426
+ useEffect(
427
+ () => watchMedia(mediaElement, contentStateChanged),
428
+ [mediaElement, contentStateChanged]
429
+ );
356
430
  useEffect(() => {
357
431
  const host = hostRef.current;
358
432
  if (!host) return;
@@ -365,6 +439,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
365
439
  var _a2;
366
440
  setCleared(false);
367
441
  markDrawn();
442
+ contentStateChanged();
368
443
  setStatus("ready");
369
444
  setSceneVersion((v) => v + 1);
370
445
  if (!renderer2) return;
@@ -391,6 +466,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
391
466
  const offChange = surface2.on("change", () => {
392
467
  setCleared(false);
393
468
  markDrawn();
469
+ contentStateChanged();
394
470
  setStatus("ready");
395
471
  setSceneVersion((v) => v + 1);
396
472
  });
@@ -404,6 +480,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
404
480
  const offViewport = surface2.on("viewport", () => {
405
481
  var _a2;
406
482
  if (renderer2) (_a2 = onViewportChangeRef.current) == null ? void 0 : _a2.call(onViewportChangeRef, renderer2.getBounds());
483
+ contentStateChanged();
407
484
  });
408
485
  return () => {
409
486
  offOpen();
@@ -467,8 +544,9 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
467
544
  "data-has-navigator": showNavigator,
468
545
  "data-fullscreen": isFullscreen,
469
546
  "data-exit": exitShown || void 0,
470
- "data-controls": controlsVisible ? "visible" : "hidden",
471
- "data-media": media == null ? void 0 : media.kind,
547
+ "data-controls": fades ? controlsVisible ? "visible" : "hidden" : void 0,
548
+ "data-media": painted,
549
+ "data-recording": media ? "" : void 0,
472
550
  "data-player": player ? "" : void 0,
473
551
  "data-animated": animated ? "" : void 0,
474
552
  "data-navigable": navigable,
@@ -498,16 +576,41 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
498
576
  isolation: "isolate"
499
577
  },
500
578
  children: [
501
- (shownControls || showNavigator) && /* @__PURE__ */ jsx("div", { className: "clover-canvas-scrim", "aria-hidden": "true" }),
579
+ (shownControls || showNavigator) && media && /* @__PURE__ */ jsx("div", { className: "clover-canvas-scrim", "aria-hidden": "true" }),
580
+ videoFades && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
581
+ ControlsFade,
582
+ {
583
+ element: wrapperElement,
584
+ hideDelay: options == null ? void 0 : options.hideDelay,
585
+ picture: hostRef,
586
+ onChange: setVideoVisible
587
+ }
588
+ ) }),
502
589
  /* @__PURE__ */ jsx(ExitFullscreen, { hidden: !exitShown }),
503
- surface && shownControls && /* @__PURE__ */ jsx(
590
+ surface && (shownControls || cornerToggle) && /* @__PURE__ */ jsx(
504
591
  Controls,
505
592
  {
506
593
  renderer,
507
594
  instance,
508
- config: shownControls,
595
+ config: shownControls ?? NO_CONTROLS,
509
596
  controlButtons,
510
- hasPlaceholder: stills.length > 0,
597
+ placeholderIsMore: cornerToggle && !media,
598
+ chapters: media ? chapters : void 0,
599
+ mediaElement,
600
+ onChapter: goToChapter,
601
+ request: options == null ? void 0 : options.request,
602
+ placeholder: cornerToggle && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
603
+ PlaceholderToggle,
604
+ {
605
+ instance,
606
+ media: Boolean(media),
607
+ active: showPlaceholder,
608
+ onToggle: togglePlaceholder,
609
+ more: !!controlsConfig && (controlsConfig.zoom || controlsConfig.rotation || controlsConfig.reset || controlsConfig.fullPage)
610
+ }
611
+ ) }),
612
+ fit: !surfaceFades,
613
+ more: collapseControls,
511
614
  choices: showPlaceholder ? [] : choices,
512
615
  selections,
513
616
  onSelect: selectChoice,
@@ -527,7 +630,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
527
630
  setPlaceOpen((open) => !open);
528
631
  },
529
632
  language,
530
- children
633
+ children: shownControls && children
531
634
  }
532
635
  ),
533
636
  showNavigator && /* @__PURE__ */ jsx(
@@ -594,6 +697,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
594
697
  {
595
698
  media,
596
699
  request: options == null ? void 0 : options.request,
700
+ fillable,
597
701
  surface,
598
702
  instance,
599
703
  onElement: handleMediaElement,
@@ -0,0 +1,105 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef } from "react";
4
+ import ControlMenu from "./ControlMenu.mjs";
5
+ import { chapterAt, chapterPicture } from "./media/Transport.mjs";
6
+ import { languageProps } from "../../i18n/direction.mjs";
7
+ import { useContainerName } from "../../i18n/useContainerName.mjs";
8
+ import { EntryThumbnail } from "../../ui/EntryThumbnail.mjs";
9
+ import { formatTime } from "../../lib/time.mjs";
10
+ const ChaptersMenu = ({
11
+ id,
12
+ triggerId,
13
+ label,
14
+ labelLang,
15
+ chapters,
16
+ element,
17
+ onChapter,
18
+ request,
19
+ onClose
20
+ }) => {
21
+ const name = useContainerName(label, labelLang);
22
+ const [time, setTime] = useState(() => (element == null ? void 0 : element.currentTime) ?? 0);
23
+ useEffect(() => {
24
+ if (!element) return;
25
+ const update = () => setTime(element.currentTime);
26
+ update();
27
+ element.addEventListener("timeupdate", update);
28
+ element.addEventListener("seeked", update);
29
+ return () => {
30
+ element.removeEventListener("timeupdate", update);
31
+ element.removeEventListener("seeked", update);
32
+ };
33
+ }, [element]);
34
+ const current = chapterAt(chapters, time);
35
+ const pointer = useRef(false);
36
+ const go = (index) => {
37
+ onChapter(chapters[index].start);
38
+ setTime(chapters[index].start);
39
+ };
40
+ return /* @__PURE__ */ jsxs(
41
+ ControlMenu,
42
+ {
43
+ "data-testid": "clover-canvas-chapters",
44
+ id,
45
+ onClose,
46
+ triggerId,
47
+ children: [
48
+ /* @__PURE__ */ jsx("fieldset", { className: "clover-canvas-menu-group", ...name.props, children: chapters.map((chapter, index) => /* @__PURE__ */ jsxs(
49
+ "label",
50
+ {
51
+ className: "clover-canvas-menu-item clover-canvas-chapters-item",
52
+ onPointerDown: () => {
53
+ pointer.current = true;
54
+ },
55
+ children: [
56
+ /* @__PURE__ */ jsx(
57
+ "input",
58
+ {
59
+ type: "radio",
60
+ name: id,
61
+ checked: index === current,
62
+ onChange: () => go(index),
63
+ onClick: () => {
64
+ if (pointer.current) onClose(true);
65
+ },
66
+ onKeyDown: (event) => {
67
+ pointer.current = false;
68
+ if (event.key === "Enter") {
69
+ event.preventDefault();
70
+ go(index);
71
+ onClose(true);
72
+ }
73
+ }
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsx("span", { className: "clover-cue-time", children: formatTime(chapter.start) }),
77
+ " ",
78
+ /* @__PURE__ */ jsx(
79
+ "span",
80
+ {
81
+ className: "clover-cue-text",
82
+ ...languageProps(chapter.lang || void 0),
83
+ children: chapter.label
84
+ }
85
+ ),
86
+ index === current && /* @__PURE__ */ jsx(
87
+ EntryThumbnail,
88
+ {
89
+ source: chapterPicture(chapter),
90
+ request,
91
+ large: true
92
+ }
93
+ )
94
+ ]
95
+ },
96
+ chapter.id ?? index
97
+ )) }),
98
+ name.node
99
+ ]
100
+ }
101
+ );
102
+ };
103
+ export {
104
+ ChaptersMenu as default
105
+ };
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { useRef, useEffect } from "react";
3
+ import { useRef, useLayoutEffect, useEffect } from "react";
4
4
  import { join } from "../../lib/classnames.mjs";
5
5
  import { useOneOpen } from "../../ui/useOneOpen.mjs";
6
6
  const ControlMenu = ({
@@ -10,10 +10,15 @@ const ControlMenu = ({
10
10
  "data-testid": testId,
11
11
  className,
12
12
  holds,
13
+ inside = false,
13
14
  children
14
15
  }) => {
15
16
  const ref = useRef(null);
16
17
  useOneOpen(true, () => onClose(false));
18
+ useLayoutEffect(() => {
19
+ const menu = ref.current;
20
+ if (menu && inside) keepInside(menu);
21
+ }, [inside]);
17
22
  useEffect(() => {
18
23
  const menu = ref.current;
19
24
  const item = (menu == null ? void 0 : menu.querySelector('input[type="radio"]:checked')) ?? (menu == null ? void 0 : menu.querySelector(
@@ -40,11 +45,11 @@ const ControlMenu = ({
40
45
  var _a, _b;
41
46
  if (event.key !== "Escape") return;
42
47
  const active = document.activeElement;
43
- const inside = Boolean(
48
+ const inside2 = Boolean(
44
49
  ((_a = ref.current) == null ? void 0 : _a.contains(active)) || ((_b = document.getElementById(triggerId)) == null ? void 0 : _b.contains(active))
45
50
  );
46
- if (inside) event.preventDefault();
47
- onClose(inside);
51
+ if (inside2) event.preventDefault();
52
+ onClose(inside2);
48
53
  };
49
54
  document.addEventListener("pointerdown", onPointerDown);
50
55
  document.addEventListener("keydown", onKeyDown, true);
@@ -64,6 +69,20 @@ const ControlMenu = ({
64
69
  }
65
70
  );
66
71
  };
72
+ function keepInside(menu) {
73
+ const box = menu.getBoundingClientRect();
74
+ let start = 0;
75
+ let end = document.documentElement.clientWidth;
76
+ for (let node = menu.parentElement; node; node = node.parentElement) {
77
+ if (getComputedStyle(node).overflowX === "visible") continue;
78
+ const clip = node.getBoundingClientRect();
79
+ start = Math.max(start, clip.left);
80
+ end = Math.min(end, clip.right);
81
+ break;
82
+ }
83
+ const shift = Math.max(start - box.left, Math.min(0, end - box.right));
84
+ if (shift) menu.style.translate = `${shift}px 0`;
85
+ }
67
86
  export {
68
87
  ControlMenu as default
69
88
  };