@nulib/clover 4.0.0 → 4.2.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 (386) hide show
  1. package/dist/components/Body/Body.mjs +16 -1
  2. package/dist/components/Body/glyphs.mjs +15 -0
  3. package/dist/components/Body/useControlsVisibility.mjs +35 -13
  4. package/dist/components/Canvas/CanvasView.mjs +116 -12
  5. package/dist/components/Canvas/ChaptersMenu.mjs +105 -0
  6. package/dist/components/Canvas/ControlMenu.mjs +23 -4
  7. package/dist/components/Canvas/Controls.mjs +223 -60
  8. package/dist/components/Canvas/ControlsFade.mjs +16 -0
  9. package/dist/components/Canvas/ImageControls.mjs +209 -0
  10. package/dist/components/Canvas/Placeholder.mjs +44 -12
  11. package/dist/components/Canvas/RowFits.mjs +85 -0
  12. package/dist/components/Canvas/layout.mjs +11 -0
  13. package/dist/components/Canvas/media/MediaBody.mjs +105 -46
  14. package/dist/components/Canvas/media/Player.mjs +0 -55
  15. package/dist/components/Canvas/media/Transport.mjs +14 -23
  16. package/dist/components/Canvas/panClearOfControls.mjs +1 -1
  17. package/dist/components/Collection/Collection.mjs +1 -1
  18. package/dist/components/Items/CountMenu.mjs +1 -0
  19. package/dist/components/Items/Item.mjs +4 -3
  20. package/dist/components/Items/Items.mjs +30 -10
  21. package/dist/components/Items/PagerLayout.mjs +2 -0
  22. package/dist/components/Items/TargetItems.mjs +1 -1
  23. package/dist/components/Items/masonry.mjs +35 -0
  24. package/dist/components/Panel/About.mjs +25 -8
  25. package/dist/components/Panel/Panel.mjs +47 -59
  26. package/dist/components/Panel/sections.mjs +62 -0
  27. package/dist/components/Root/useRootState.mjs +2 -49
  28. package/dist/components/Scene/SceneView.mjs +13 -2
  29. package/dist/components/Scene/cloverEngine.mjs +2 -1
  30. package/dist/components/Timeline/playerSurface.mjs +2 -0
  31. package/dist/core/clover.mjs +7 -4
  32. package/dist/core/content-state.mjs +5 -3
  33. package/dist/i18n/locales/en.json.mjs +1 -1
  34. package/dist/i18n/locales/es.json.mjs +1 -1
  35. package/dist/i18n/locales/fi.json.mjs +1 -1
  36. package/dist/i18n/locales/fr.json.mjs +1 -1
  37. package/dist/i18n/locales/nb.json.mjs +1 -1
  38. package/dist/i18n/locales/nn.json.mjs +1 -1
  39. package/dist/i18n/locales/no.json.mjs +1 -1
  40. package/dist/i18n/locales/pt.json.mjs +1 -1
  41. package/dist/index.d.mts +178 -56
  42. package/dist/index.mjs +2 -0
  43. package/dist/lib/gltf/load.mjs +26 -6
  44. package/dist/lib/pointer.mjs +1 -1
  45. package/dist/lib/renderer/CanvasRenderer.mjs +44 -32
  46. package/dist/lib/renderer/camera/Camera.mjs +1 -1
  47. package/dist/react/useContentStateOutput.mjs +71 -0
  48. package/dist/styles.css +1 -1
  49. package/dist/templates/default/Default.mjs +42 -128
  50. package/dist/templates/document/Document.mjs +51 -65
  51. package/dist/templates/document/Sheets.mjs +13 -5
  52. package/dist/templates/gallery/Gallery.mjs +94 -18
  53. package/dist/templates/index.d.mts +364 -17
  54. package/dist/templates/shared/Lightbox.mjs +161 -69
  55. package/dist/templates/shared/LightboxView.mjs +123 -0
  56. package/dist/templates/shared/PanelPane.mjs +116 -0
  57. package/dist/templates/{document/DocumentPanel.mjs → shared/PanelPart.mjs} +2 -2
  58. package/dist/templates/shared/dragToClose.mjs +51 -8
  59. package/dist/templates/shared/givenAnnotations.mjs +13 -0
  60. package/dist/templates/shared/useDragToClose.mjs +6 -3
  61. package/dist/templates/shared/useLazyPanelPane.mjs +16 -0
  62. package/dist/templates/shared/useSlide.mjs +6 -0
  63. package/dist/templates.css +1 -1
  64. package/dist/ui/ControlCluster.mjs +15 -17
  65. package/dist/ui/Sections.mjs +3 -3
  66. package/dist/ui/mediaIcons.mjs +35 -8
  67. package/dist/ui/useScrollTrack.mjs +2 -1
  68. package/dist/web-components/About-D1TBGGPL.mjs +1 -0
  69. package/dist/web-components/AnnotationItems-DTacmRA9.mjs +1 -0
  70. package/dist/web-components/{AnnotationMenu-BCwwwfbb.mjs → AnnotationMenu-DYc9ekWS.mjs} +1 -1
  71. package/dist/web-components/{AnnotationState-CavxnAAq.mjs → AnnotationState--5ghW0C2.mjs} +1 -1
  72. package/dist/web-components/{Annotations-rBmeI5sR.mjs → Annotations-BG8lPjk1.mjs} +1 -1
  73. package/dist/web-components/{Annotations-DDjSrBL5.mjs → Annotations-Bvc_FmJ5.mjs} +1 -1
  74. package/dist/web-components/Body-QQ1DmnbP.mjs +1 -0
  75. package/dist/web-components/{BodyAlert-COKp19lq.mjs → BodyAlert-A4xRjOKr.mjs} +1 -1
  76. package/dist/web-components/{Button-DLFYqtz9.mjs → Button-Cx6VE_UW.mjs} +1 -1
  77. package/dist/web-components/{Camera-Cp5ma-6C.mjs → Camera-DqT_1MgD.mjs} +1 -1
  78. package/dist/web-components/{Canvas2DBackend-3PToh87Z.mjs → Canvas2DBackend-TZtR3zHf.mjs} +1 -1
  79. package/dist/web-components/CanvasView-DxZASM9E.mjs +2 -0
  80. package/dist/web-components/CaptionDetails-DMRWmtaY.mjs +1 -0
  81. package/dist/web-components/ChaptersMenu-BAZVVDrK.mjs +1 -0
  82. package/dist/web-components/{Chevron-r-_hUPn8.mjs → Chevron-DFGbSGPI.mjs} +1 -1
  83. package/dist/web-components/ChoiceMenu-C80kdxvq.mjs +1 -0
  84. package/dist/web-components/Collection-B4CxBsFL.mjs +1 -0
  85. package/dist/web-components/{CollectionSelect-CBWUbqQi.mjs → CollectionSelect-DO8YO2p7.mjs} +1 -1
  86. package/dist/web-components/{Connected-BnpxYeJN.mjs → Connected-CcbVqzmj.mjs} +1 -1
  87. package/dist/web-components/{Connected-B2d6EoFl.mjs → Connected-DthCPaHl.mjs} +1 -1
  88. package/dist/web-components/{Connected-BSRM9FJY.mjs → Connected-sYBn_9MK.mjs} +1 -1
  89. package/dist/web-components/{Contents-D7FPxSH-.mjs → Contents-AVPYYXht.mjs} +1 -1
  90. package/dist/web-components/ControlMenu-BjJsWnuZ.mjs +1 -0
  91. package/dist/web-components/ControlsFade-C-6WhSxB.mjs +1 -0
  92. package/dist/web-components/{CountMenu-DyTp_J4k.mjs → CountMenu-Dx8D_RJZ.mjs} +1 -1
  93. package/dist/web-components/Cue-xuo5dgKE.mjs +1 -0
  94. package/dist/web-components/Document-BWdafeEi.mjs +1 -0
  95. package/dist/web-components/{DomLayers-CTGub6wo.mjs → DomLayers-DlRapZ1u.mjs} +1 -1
  96. package/dist/web-components/{Download-BOYNIb7C.mjs → Download-Ci_JUTVd.mjs} +1 -1
  97. package/dist/web-components/{EntryBodies-Bfd2Z42z.mjs → EntryBodies-C0ICfS2R.mjs} +1 -1
  98. package/dist/web-components/{EntryThumbnail-DQE8ajI9.mjs → EntryThumbnail-DxHhfRo_.mjs} +1 -1
  99. package/dist/web-components/{FieldPill-D5DNJWLy.mjs → FieldPill-CVfeeafm.mjs} +1 -1
  100. package/dist/web-components/FrameAnimation-AZpVvu0R.mjs +1 -0
  101. package/dist/web-components/Gallery-C2PTJmvN.mjs +1 -0
  102. package/dist/web-components/{HideToggle-DL911R1Z.mjs → HideToggle-0nlIo-f8.mjs} +1 -1
  103. package/dist/web-components/ImageControls-tKVAMpaj.mjs +1 -0
  104. package/dist/web-components/Items-Drd82_Jj.mjs +1 -0
  105. package/dist/web-components/Label-BIjqJ-_T.mjs +1 -0
  106. package/dist/web-components/{LanguageChoice-DT1UPiDn.mjs → LanguageChoice-DkSc-n6g.mjs} +1 -1
  107. package/dist/web-components/LightboxView-Cuqx2H1m.mjs +1 -0
  108. package/dist/web-components/ListEnd-pq-BgaDI.mjs +1 -0
  109. package/dist/web-components/{Loaded-BWfEBJyg.mjs → Loaded-CSO5NFhm.mjs} +1 -1
  110. package/dist/web-components/LoadedCanvas-DK6xMmM1.mjs +1 -0
  111. package/dist/web-components/LoadedMap-DmPH-LKY.mjs +1 -0
  112. package/dist/web-components/{Loading-zw74TdAz.mjs → Loading-CoJLSRkv.mjs} +1 -1
  113. package/dist/web-components/{Map--dJhk0_0.mjs → Map-BEVtD52O.mjs} +1 -1
  114. package/dist/web-components/MapView-DHJcn9gW.mjs +3 -0
  115. package/dist/web-components/Markup-Hm6bWOjm.mjs +2 -0
  116. package/dist/web-components/MediaBody-BpgNtpKZ.mjs +1 -0
  117. package/dist/web-components/MediaBody-Co23JjUJ.mjs +1 -0
  118. package/dist/web-components/{NavDate-BQHuyLOC.mjs → NavDate-CYNK0Qmp.mjs} +1 -1
  119. package/dist/web-components/{Navigator-B3U21_ti.mjs → Navigator-DrYPepzN.mjs} +1 -1
  120. package/dist/web-components/{Pager-DnJknq92.mjs → Pager-CN4lHURv.mjs} +1 -1
  121. package/dist/web-components/PagerLayout-DeqnSQcF.mjs +1 -0
  122. package/dist/web-components/Panel-CFYUlXup.mjs +1 -0
  123. package/dist/web-components/PanelPart-CpUIRbxr.mjs +1 -0
  124. package/dist/web-components/{PanelToggle-CFtWIeWv.mjs → PanelToggle-9ud55NNI.mjs} +1 -1
  125. package/dist/web-components/{PartOfManifest-F87jIrf9.mjs → PartOfManifest-KUHUq-6q.mjs} +1 -1
  126. package/dist/web-components/{Pending-CYAQajKu.mjs → Pending-mcmdyZPA.mjs} +1 -1
  127. package/dist/web-components/PlaceBox-DX4ZLDat.mjs +1 -0
  128. package/dist/web-components/Placeholder-0hE8q-SY.mjs +1 -0
  129. package/dist/web-components/{Position-BkWBRBfW.mjs → Position-DO5qg5Sp.mjs} +1 -1
  130. package/dist/web-components/{Primitives-BmODPlnK.mjs → Primitives-c9sIz0oQ.mjs} +1 -1
  131. package/dist/web-components/Provider-a3xY016W.mjs +1 -0
  132. package/dist/web-components/{ReadMore-BwGFsLS2.mjs → ReadMore-D_WmmKEP.mjs} +1 -1
  133. package/dist/web-components/Root-CU1o0wje.mjs +1 -0
  134. package/dist/web-components/Scene-CboEeptc.mjs +1 -0
  135. package/dist/web-components/SceneView-hcc78jQT.mjs +1 -0
  136. package/dist/web-components/{Search-CbmK9vLp.mjs → Search-BgxEW1UT.mjs} +1 -1
  137. package/dist/web-components/{Sections-Dy5_pkyQ.mjs → Sections-DZVrhoAC.mjs} +2 -2
  138. package/dist/web-components/{StandaloneItems-BmUnBp0H.mjs → StandaloneItems-6cSw7nbF.mjs} +1 -1
  139. package/dist/web-components/{Status-Dww3Pyf4.mjs → Status-DHTzuTkh.mjs} +1 -1
  140. package/dist/web-components/{Steps-o_UprQfZ.mjs → Steps-Dkpy9KiJ.mjs} +1 -1
  141. package/dist/web-components/{TargetItems-BBOGDubv.mjs → TargetItems-CyOI9_Z4.mjs} +1 -1
  142. package/dist/web-components/Timeline-B9tD3Rar.mjs +1 -0
  143. package/dist/web-components/{Tip-BbexILXs.mjs → Tip-nJSTYquc.mjs} +1 -1
  144. package/dist/web-components/{Transcript-ZVXM3ZDA.mjs → Transcript-WvFFAJQM.mjs} +1 -1
  145. package/dist/web-components/Transport-FxLp_bdW.mjs +1 -0
  146. package/dist/web-components/Transport-VUxSEIQO.mjs +1 -0
  147. package/dist/web-components/{annotation-collection-7SS1ELcO.mjs → annotation-collection-BkC3nBPA.mjs} +1 -1
  148. package/dist/web-components/{annotation-name-CYkZopdd.mjs → annotation-name-Du2KAWoD.mjs} +1 -1
  149. package/dist/web-components/{annotations-content-Bdtn50sf.mjs → annotations-content-CEzAS-P2.mjs} +1 -1
  150. package/dist/web-components/{body-CkOBHlJ0.mjs → body-DPlfbLt3.mjs} +1 -1
  151. package/dist/web-components/canvas-BUwBftJW.mjs +1 -0
  152. package/dist/web-components/cloverEngine-UNw5K4Xg.mjs +164 -0
  153. package/dist/web-components/{content-state-reader-Ahh6artg.mjs → content-state-reader-GgQF2MvJ.mjs} +1 -1
  154. package/dist/web-components/{controls-BJrZVQkS.mjs → controls-CC9G5LxK.mjs} +1 -1
  155. package/dist/web-components/custom-elements.json +191 -45
  156. package/dist/web-components/{downloads-CqVWo-yn.mjs → downloads-CmAYeEIz.mjs} +1 -1
  157. package/dist/web-components/dragToClose-DK-eM097.mjs +1 -0
  158. package/dist/web-components/{engine-B-sscpLa.mjs → engine-Dok0z8WP.mjs} +1 -1
  159. package/dist/web-components/{engines-DfCHjbt3.mjs → engines-BD2IfwQF.mjs} +1 -1
  160. package/dist/web-components/es-B1NvdYp-.mjs +1 -0
  161. package/dist/web-components/{fetchManifest-BIzne1Pj.mjs → fetchManifest-tQXcfFiz.mjs} +1 -1
  162. package/dist/web-components/fi-BjtYZNLo.mjs +1 -0
  163. package/dist/web-components/fr-Cd22Lziw.mjs +1 -0
  164. package/dist/web-components/fromManifest-BwQdeAuL.mjs +1 -0
  165. package/dist/web-components/glyphs-dp_HK3Ja.mjs +1 -0
  166. package/dist/web-components/hooks-C4dJ5K_D.mjs +1 -0
  167. package/dist/web-components/image-layers-xcBsiad9.mjs +1 -0
  168. package/dist/web-components/{imageService-0eTvQ-3h.mjs → imageService-4sFnmAFX.mjs} +1 -1
  169. package/dist/web-components/index-DspT4wUm.mjs +1 -0
  170. package/dist/web-components/index.d.mts +5 -5
  171. package/dist/web-components/index.mjs +1 -1
  172. package/dist/web-components/items-BUmOy2QY.mjs +1 -0
  173. package/dist/web-components/items-CWMI53aN.mjs +1 -0
  174. package/dist/web-components/label-BGjL7I4b.mjs +1 -0
  175. package/dist/web-components/layout-B29v2RKK.mjs +1 -0
  176. package/dist/web-components/{link-GEdiEwlR.mjs → link-Ct5PpHEY.mjs} +1 -1
  177. package/dist/web-components/logo-BFstM-0a.mjs +1 -0
  178. package/dist/web-components/masonry-0QfzOgbB.mjs +1 -0
  179. package/dist/web-components/{models-59cEeiAA.mjs → models-BXcT4ijX.mjs} +1 -1
  180. package/dist/web-components/nb-CEwZDBiR.mjs +1 -0
  181. package/dist/web-components/nn-jYQhr9RI.mjs +1 -0
  182. package/dist/web-components/no-CEwZDBiR.mjs +1 -0
  183. package/dist/web-components/{nodes-CTw9OqlA.mjs → nodes-BleXuYE6.mjs} +1 -1
  184. package/dist/web-components/{overlayImage-BMt4UTlR.mjs → overlayImage-BJtfot4Y.mjs} +1 -1
  185. package/dist/web-components/panClearOfControls-Cn2ZXsZi.mjs +1 -0
  186. package/dist/web-components/{panel-C17Rl9Ya.mjs → panel-BxxV_JkD.mjs} +1 -1
  187. package/dist/web-components/part-D4gjnYmT.mjs +1 -0
  188. package/dist/web-components/playerSurface-BXNLaFk0.mjs +1 -0
  189. package/dist/web-components/pointer-CJELU3gI.mjs +1 -0
  190. package/dist/web-components/{provider-BpxorEiq.mjs → provider-CPp0Sgr_.mjs} +1 -1
  191. package/dist/web-components/pt-CWR30SzS.mjs +1 -0
  192. package/dist/web-components/{range-regions-BGQy4E9U.mjs → range-regions-DAaOu0IS.mjs} +1 -1
  193. package/dist/web-components/{read-more-BDM_6CVc.mjs → read-more-lcqGslUd.mjs} +1 -1
  194. package/dist/web-components/readingLanguages-FyVsSWJ8.mjs +1 -0
  195. package/dist/web-components/rendererSurface-nh6-EfuZ.mjs +22 -0
  196. package/dist/web-components/{renderers-CiB74bQh.mjs → renderers-BFS7hFVU.mjs} +1 -1
  197. package/dist/web-components/{resource-CRbpf9pX.mjs → resource-Bufu7lAr.mjs} +1 -1
  198. package/dist/web-components/{save-file-CCuZEuQr.mjs → save-file-CoknKOPz.mjs} +1 -1
  199. package/dist/web-components/search-5ocrsYmT.mjs +1 -0
  200. package/dist/web-components/shared-DFAX0n3B.mjs +1 -0
  201. package/dist/web-components/{show-link-BXm7SNIC.mjs → show-link-DBaJj4s_.mjs} +1 -1
  202. package/dist/web-components/{sizedImage-k4Q-eyOB.mjs → sizedImage-jnOGcIIZ.mjs} +1 -1
  203. package/dist/web-components/{split-Hp6z-v4h.mjs → split-P6J0qqf5.mjs} +1 -1
  204. package/dist/web-components/{status-BmtuKfAG.mjs → status-honoOMNx.mjs} +1 -1
  205. package/dist/web-components/styles-BwkYiCLC.mjs +1 -0
  206. package/dist/web-components/three.mjs +1 -1
  207. package/dist/web-components/{thumbnail-Dp7a8oom.mjs → thumbnail-EbURh-UM.mjs} +1 -1
  208. package/dist/web-components/{tip-C-oovDZK.mjs → tip-BhNI83aT.mjs} +1 -1
  209. package/dist/web-components/{toggle-C7ODWDEZ.mjs → toggle-CJKdi5KH.mjs} +1 -1
  210. package/dist/web-components/{useContainerName-CrOmY-km.mjs → useContainerName-_48Cdi0m.mjs} +1 -1
  211. package/dist/web-components/useControlsVisibility-CieBxGnK.mjs +1 -0
  212. package/dist/web-components/useLazyPanelPane-Da3kJiOt.mjs +1 -0
  213. package/dist/web-components/{useNearViewport-BqXi9Gn4.mjs → useNearViewport-B34ebmIW.mjs} +1 -1
  214. package/dist/web-components/useScrollTrack-DgRGFeP5.mjs +1 -0
  215. package/dist/web-components/viewer/AnnotationItems-BNA_92Dv.mjs +1 -0
  216. package/dist/web-components/viewer/{AnnotationMenu-DPOSehBo.mjs → AnnotationMenu-BIQYVR4N.mjs} +1 -1
  217. package/dist/web-components/viewer/AnnotationState-BbwQqA1U.mjs +1 -0
  218. package/dist/web-components/viewer/Annotations-CZzOZAFP.mjs +2 -0
  219. package/dist/web-components/viewer/Annotations-P4XzAlNc.mjs +1 -0
  220. package/dist/web-components/viewer/{Canvas2DBackend-BTK6ZJh0.mjs → Canvas2DBackend-DFfCzyjL.mjs} +1 -1
  221. package/dist/web-components/viewer/CaptionDetails-DPtE-RQQ.mjs +1 -0
  222. package/dist/web-components/viewer/ChaptersMenu-D6Jmujag.mjs +1 -0
  223. package/dist/web-components/viewer/{ChoiceMenu-DQ1x572Y.mjs → ChoiceMenu-GkqyTQRQ.mjs} +1 -1
  224. package/dist/web-components/viewer/Collection-DjY_6qa6.mjs +1 -0
  225. package/dist/web-components/viewer/Connected-D5T-mtiy.mjs +1 -0
  226. package/dist/web-components/viewer/Connected-DIOuI3Mv.mjs +1 -0
  227. package/dist/web-components/viewer/Contents-DV-VxXuf.mjs +1 -0
  228. package/dist/web-components/viewer/ControlMenu-BsEpff6N.mjs +1 -0
  229. package/dist/web-components/viewer/ControlsFade-BowtN96W.mjs +1 -0
  230. package/dist/web-components/viewer/{CountMenu-4u6U6yqb.mjs → CountMenu-DCmA6HdK.mjs} +1 -1
  231. package/dist/web-components/viewer/Cue-BjbVzrpl.mjs +1 -0
  232. package/dist/web-components/viewer/Document-4ZQd3W3o.mjs +1 -0
  233. package/dist/web-components/viewer/{DomLayers-CGkDtemL.mjs → DomLayers-BCwCxPDU.mjs} +1 -1
  234. package/dist/web-components/viewer/Download-CL4IClAD.mjs +1 -0
  235. package/dist/web-components/viewer/EntryBodies-e40y47bl.mjs +1 -0
  236. package/dist/web-components/viewer/EntryThumbnail-B_dP3w4o.mjs +1 -0
  237. package/dist/web-components/viewer/{FieldPill-DFXGWrvB.mjs → FieldPill-Hse1cDBE.mjs} +1 -1
  238. package/dist/web-components/viewer/FrameAnimation-CE218DCr.mjs +1 -0
  239. package/dist/web-components/viewer/Gallery-F2sVj4ph.mjs +1 -0
  240. package/dist/web-components/viewer/{HideToggle-DP5kHzWM.mjs → HideToggle-CYoqe_ez.mjs} +1 -1
  241. package/dist/web-components/viewer/ImageControls-C2G4x2Es.mjs +1 -0
  242. package/dist/web-components/viewer/LanguageChoice-BmO-322r.mjs +1 -0
  243. package/dist/web-components/viewer/LightboxView-DKR8dXcg.mjs +1 -0
  244. package/dist/web-components/viewer/ListEnd-DX1jsvJk.mjs +1 -0
  245. package/dist/web-components/viewer/{MapView-BN9wXQKV.mjs → MapView-Df0wZjCh.mjs} +2 -2
  246. package/dist/web-components/viewer/MediaBody-CataNonO.mjs +1 -0
  247. package/dist/web-components/viewer/MediaBody-SkIgrEMj.mjs +1 -0
  248. package/dist/web-components/viewer/{NavDate-C2-wwLuB.mjs → NavDate-BZgeaMG9.mjs} +1 -1
  249. package/dist/web-components/viewer/{Navigator-C3jghOd3.mjs → Navigator-Co76p-1n.mjs} +1 -1
  250. package/dist/web-components/viewer/PagerLayout-tUkN1-FV.mjs +1 -0
  251. package/dist/web-components/viewer/PanelPart-Cl4Sst60.mjs +1 -0
  252. package/dist/web-components/viewer/{PartOfManifest-D22yMgCf.mjs → PartOfManifest-DXnbEPzS.mjs} +1 -1
  253. package/dist/web-components/viewer/PlaceBox-xrJ4CGdN.mjs +1 -0
  254. package/dist/web-components/viewer/Placeholder-B1AcizHL.mjs +1 -0
  255. package/dist/web-components/viewer/Search-DTg1cHZ3.mjs +1 -0
  256. package/dist/web-components/viewer/StandaloneItems-BpBEQG8i.mjs +1 -0
  257. package/dist/web-components/viewer/{Steps-Bw32X5xO.mjs → Steps-SpwMQdCL.mjs} +1 -1
  258. package/dist/web-components/viewer/{TargetItems-DLhUH1Gq.mjs → TargetItems-B6Icep5k.mjs} +1 -1
  259. package/dist/web-components/viewer/Transcript-rTAhuXCF.mjs +1 -0
  260. package/dist/web-components/viewer/Transport-vKIDALE-.mjs +1 -0
  261. package/dist/web-components/viewer/Transport-z_kdVisw.mjs +1 -0
  262. package/dist/web-components/viewer/annotation-collection-B7pZiLVk.mjs +1 -0
  263. package/dist/web-components/viewer/annotation-name-BKj1O9lA.mjs +1 -0
  264. package/dist/web-components/viewer/{annotations-content-CbA3eOIC.mjs → annotations-content-9AtLlPNn.mjs} +1 -1
  265. package/dist/web-components/viewer/cloverEngine-jRrYLrWa.mjs +164 -0
  266. package/dist/web-components/viewer/{content-state-reader-C7UBMOq3.mjs → content-state-reader-CPvkju6Q.mjs} +1 -1
  267. package/dist/web-components/viewer/dragToClose-Co9kGk9q.mjs +1 -0
  268. package/dist/web-components/viewer/{fetchManifest-C2Yxg3x9.mjs → fetchManifest-D7N9WhhF.mjs} +1 -1
  269. package/dist/web-components/viewer/{host-CZeyjCKR.mjs → host-DMD9LE4H.mjs} +1 -1
  270. package/dist/web-components/viewer/image-layers-x_shzPvu.mjs +1 -0
  271. package/dist/web-components/viewer/index.mjs +1 -1
  272. package/dist/web-components/viewer/{link-DssZ0Z2N.mjs → link-DikPGzNO.mjs} +1 -1
  273. package/dist/web-components/viewer/overlayImage-33kKKB0T.mjs +1 -0
  274. package/dist/web-components/viewer/range-regions-TH6WWGTT.mjs +1 -0
  275. package/dist/web-components/viewer/{renderers-DLoqv3QO.mjs → renderers-BxePmixF.mjs} +1 -1
  276. package/dist/web-components/viewer/{save-file-CJT5p5Hg.mjs → save-file-QXKiPlST.mjs} +1 -1
  277. package/dist/web-components/viewer/{search-PhOwMKHi.mjs → search-B_NePyas.mjs} +1 -1
  278. package/dist/web-components/viewer/styles-Bedyz7_l.mjs +1 -0
  279. package/dist/web-components/viewer/useControlsVisibility-Cu-jTDzs.mjs +1 -0
  280. package/dist/web-components/viewer/useLazyPanelPane-BhLtRixT.mjs +1 -0
  281. package/dist/web-components/viewer/viewer-nfPJPwwt.mjs +29 -0
  282. package/dist/web-components/viewer/{vtt-1Pk7Dhsj.mjs → vtt-CUn4h5JB.mjs} +1 -1
  283. package/dist/web-components/viewer-DN2Mo3vc.mjs +1 -0
  284. package/dist/web-components/{vtt-CacHieeN.mjs → vtt-C5M5WPSG.mjs} +1 -1
  285. package/package.json +1 -1
  286. package/dist/templates/shared/LightboxBody.mjs +0 -9
  287. package/dist/web-components/About-DhOGPFaI.mjs +0 -1
  288. package/dist/web-components/AnnotationItems-CNP4CJiT.mjs +0 -1
  289. package/dist/web-components/Body-DaY1UJIy.mjs +0 -1
  290. package/dist/web-components/BodyUnloadable-DcTM7hHF.mjs +0 -1
  291. package/dist/web-components/CanvasView-BWQ4SK2b.mjs +0 -2
  292. package/dist/web-components/CaptionDetails-DSziiuQV.mjs +0 -1
  293. package/dist/web-components/ChoiceMenu-DTuEEUeM.mjs +0 -1
  294. package/dist/web-components/Collection-B9swJtPW.mjs +0 -1
  295. package/dist/web-components/ControlMenu-Crtho2cs.mjs +0 -1
  296. package/dist/web-components/Cue-CbZaGwZh.mjs +0 -1
  297. package/dist/web-components/Document-BfltLWZZ.mjs +0 -1
  298. package/dist/web-components/DocumentPanel-ZSe40cV4.mjs +0 -1
  299. package/dist/web-components/FrameAnimation-IfR1czfc.mjs +0 -1
  300. package/dist/web-components/Gallery-DD06BDQo.mjs +0 -1
  301. package/dist/web-components/Items-BHzT9A73.mjs +0 -1
  302. package/dist/web-components/Label-KabnxuMN.mjs +0 -1
  303. package/dist/web-components/LightboxBody-BhRhdXo6.mjs +0 -1
  304. package/dist/web-components/ListEnd-CbwNlty-.mjs +0 -1
  305. package/dist/web-components/LoadedCanvas-CdZ5WOWz.mjs +0 -1
  306. package/dist/web-components/LoadedMap-DQyQVRVQ.mjs +0 -1
  307. package/dist/web-components/MapView-duA5WGsu.mjs +0 -3
  308. package/dist/web-components/Markup-D-kioDf9.mjs +0 -2
  309. package/dist/web-components/MediaBody-CoOiVXcv.mjs +0 -1
  310. package/dist/web-components/MediaBody-d8ErTuwT.mjs +0 -1
  311. package/dist/web-components/PagerLayout-CvOmKtSW.mjs +0 -1
  312. package/dist/web-components/Panel-CIdjOznL.mjs +0 -1
  313. package/dist/web-components/PlaceBox-BtIbIotm.mjs +0 -1
  314. package/dist/web-components/Placeholder-TIyj4ZjR.mjs +0 -1
  315. package/dist/web-components/Provider-C8se8i4I.mjs +0 -1
  316. package/dist/web-components/Root-CAJB0-Mh.mjs +0 -1
  317. package/dist/web-components/Scene-Ctcdt7CD.mjs +0 -1
  318. package/dist/web-components/SceneView-B6bEx_7x.mjs +0 -1
  319. package/dist/web-components/Timeline-CfIF4APc.mjs +0 -1
  320. package/dist/web-components/canvas-CWf_Fag8.mjs +0 -1
  321. package/dist/web-components/cloverEngine-6djEHNCD.mjs +0 -164
  322. package/dist/web-components/dragToClose-C-Pf1IeO.mjs +0 -1
  323. package/dist/web-components/es-BYfHUZ7P.mjs +0 -1
  324. package/dist/web-components/fi-B5y2qr8T.mjs +0 -1
  325. package/dist/web-components/fr-ChezCx6V.mjs +0 -1
  326. package/dist/web-components/fromManifest-gg5Wx14y.mjs +0 -1
  327. package/dist/web-components/glyphs-JYl2STEr.mjs +0 -1
  328. package/dist/web-components/hooks-x7rO95CS.mjs +0 -1
  329. package/dist/web-components/image-layers-BjbeyHBS.mjs +0 -1
  330. package/dist/web-components/index-BZ7b9k0N.mjs +0 -1
  331. package/dist/web-components/items-CnAIl9fS.mjs +0 -1
  332. package/dist/web-components/items-F6hJgdAS.mjs +0 -1
  333. package/dist/web-components/label-CI88KH2_.mjs +0 -1
  334. package/dist/web-components/layout-De1MOSYe.mjs +0 -1
  335. package/dist/web-components/logo-Ckwj7FlP.mjs +0 -1
  336. package/dist/web-components/nb-8J22f9Td.mjs +0 -1
  337. package/dist/web-components/nn-Dv1EvzI1.mjs +0 -1
  338. package/dist/web-components/no-8J22f9Td.mjs +0 -1
  339. package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +0 -1
  340. package/dist/web-components/part-CXts97_M.mjs +0 -1
  341. package/dist/web-components/playerSurface-HYwEwPK6.mjs +0 -1
  342. package/dist/web-components/pt-DWYQkATt.mjs +0 -1
  343. package/dist/web-components/readingLanguages-fs_HqvqQ.mjs +0 -1
  344. package/dist/web-components/rendererSurface-C0aKlE0v.mjs +0 -22
  345. package/dist/web-components/search-CkM0O0Z1.mjs +0 -1
  346. package/dist/web-components/shared-MTsMddHx.mjs +0 -1
  347. package/dist/web-components/styles-CZV1nbBQ.mjs +0 -1
  348. package/dist/web-components/useScrollTrack-CEsOU2yT.mjs +0 -1
  349. package/dist/web-components/viewer/AnnotationItems-CyhVcRFc.mjs +0 -1
  350. package/dist/web-components/viewer/AnnotationState-Bjztkobn.mjs +0 -1
  351. package/dist/web-components/viewer/Annotations-Dh_8Tzi0.mjs +0 -2
  352. package/dist/web-components/viewer/Annotations-wwuOCxzI.mjs +0 -1
  353. package/dist/web-components/viewer/CaptionDetails-BwCTovy_.mjs +0 -1
  354. package/dist/web-components/viewer/Collection-DSBxCmXw.mjs +0 -1
  355. package/dist/web-components/viewer/Connected-CL3N8F2J.mjs +0 -1
  356. package/dist/web-components/viewer/Connected-DTk1jlyI.mjs +0 -1
  357. package/dist/web-components/viewer/Contents-DrXckx7d.mjs +0 -1
  358. package/dist/web-components/viewer/ControlMenu-Bp91s-g_.mjs +0 -1
  359. package/dist/web-components/viewer/Cue-C-aF8peC.mjs +0 -1
  360. package/dist/web-components/viewer/Document-BN1rICu3.mjs +0 -1
  361. package/dist/web-components/viewer/DocumentPanel-CEesxdeY.mjs +0 -1
  362. package/dist/web-components/viewer/Download-CawEl9MN.mjs +0 -1
  363. package/dist/web-components/viewer/EntryBodies-nYHMwSSM.mjs +0 -1
  364. package/dist/web-components/viewer/EntryThumbnail-DrO_0SzR.mjs +0 -1
  365. package/dist/web-components/viewer/FrameAnimation-CZfzpxaD.mjs +0 -1
  366. package/dist/web-components/viewer/Gallery-MWHtvjti.mjs +0 -1
  367. package/dist/web-components/viewer/LanguageChoice-C50T7dPI.mjs +0 -1
  368. package/dist/web-components/viewer/LightboxBody-C2T7IC29.mjs +0 -1
  369. package/dist/web-components/viewer/ListEnd-BDuOx__m.mjs +0 -1
  370. package/dist/web-components/viewer/MediaBody-CEyswliX.mjs +0 -1
  371. package/dist/web-components/viewer/MediaBody-Dw3DWDjc.mjs +0 -1
  372. package/dist/web-components/viewer/PagerLayout-Cg2NpqoD.mjs +0 -1
  373. package/dist/web-components/viewer/PlaceBox-Dckw4Sfk.mjs +0 -1
  374. package/dist/web-components/viewer/Placeholder-NYVWYg5Q.mjs +0 -1
  375. package/dist/web-components/viewer/Search-DC259m4f.mjs +0 -1
  376. package/dist/web-components/viewer/StandaloneItems-E4kpMne9.mjs +0 -1
  377. package/dist/web-components/viewer/Transcript-D_VGJQxn.mjs +0 -1
  378. package/dist/web-components/viewer/annotation-collection-DZHa18ir.mjs +0 -1
  379. package/dist/web-components/viewer/annotation-name-BaNdW2Xk.mjs +0 -1
  380. package/dist/web-components/viewer/cloverEngine-C04bCSFR.mjs +0 -164
  381. package/dist/web-components/viewer/image-layers-B09fporZ.mjs +0 -1
  382. package/dist/web-components/viewer/overlayImage-BR3eJCKq.mjs +0 -1
  383. package/dist/web-components/viewer/range-regions-By6L5JOK.mjs +0 -1
  384. package/dist/web-components/viewer/styles-NZLnZPAC.mjs +0 -1
  385. package/dist/web-components/viewer/viewer-D30YHqyF.mjs +0 -29
  386. 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,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { useState, useEffect } from "react";
3
3
  import { isDirect, TAP_MS, isHovering, TAP_SLOP, isInteractive, DOUBLE_TAP_SLOP } from "../../lib/pointer.mjs";
4
- const DEFAULT_HIDE_DELAY = 2e3;
4
+ const DEFAULT_HIDE_DELAY = 3e3;
5
5
  const LEAVE_DELAY = 1e3;
6
6
  const PRESS_FOCUS_MS = 1e3;
7
7
  const FADING_CONTROLS = [
@@ -20,10 +20,12 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
20
20
  let focusHeld = false;
21
21
  let penHovers = false;
22
22
  let pressedAt = -Infinity;
23
+ let pressedInside = false;
23
24
  let held = null;
24
25
  let swallowClick = false;
25
26
  let clickTimer;
26
27
  let press = null;
28
+ let using = null;
27
29
  let tap = null;
28
30
  const set = (value) => {
29
31
  shown = value;
@@ -40,6 +42,11 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
40
42
  if (tap) clearTimeout(tap.timer);
41
43
  tap = null;
42
44
  };
45
+ const touchShow = () => {
46
+ set(true);
47
+ stop();
48
+ if (Number.isFinite(hideDelay)) timer = setTimeout(hide, hideDelay);
49
+ };
43
50
  const direct = (event) => isDirect(event.pointerType, penHovers);
44
51
  const show = (event) => {
45
52
  keyboard = event.type === "keydown";
@@ -59,7 +66,10 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
59
66
  ...at,
60
67
  timer: setTimeout(() => {
61
68
  tap = null;
62
- set(at.onPicture ? !shown : true);
69
+ if (at.onPicture && shown) {
70
+ stop();
71
+ set(false);
72
+ } else touchShow();
63
73
  }, TAP_MS)
64
74
  };
65
75
  };
@@ -70,10 +80,21 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
70
80
  press = null;
71
81
  }
72
82
  };
83
+ const onPicture = (target) => {
84
+ const pictureElement = picture == null ? void 0 : picture.current;
85
+ return Boolean(
86
+ pictureElement && target instanceof Node && pictureElement.contains(target)
87
+ );
88
+ };
73
89
  const down = (event) => {
74
90
  if (!direct(event)) return show(event);
75
91
  keyboard = false;
76
92
  stop();
93
+ using = isInteractive(event.target, element) && !onPicture(event.target) ? {
94
+ id: event.pointerId,
95
+ inSight: shown || getComputedStyle(element).getPropertyValue("--clover-controls-shown").trim() === "1"
96
+ } : null;
97
+ if (using) forgetTap();
77
98
  press = event.isPrimary === false ? null : {
78
99
  id: event.pointerId,
79
100
  x: event.clientX,
@@ -82,26 +103,25 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
82
103
  };
83
104
  };
84
105
  const up = (event) => {
85
- if (!direct(event) || (press == null ? void 0 : press.id) !== event.pointerId) return;
106
+ if (!direct(event)) return;
107
+ if ((using == null ? void 0 : using.id) === event.pointerId) {
108
+ if (using.inSight) touchShow();
109
+ using = null;
110
+ } else if (shown && event.isPrimary !== false) touchShow();
111
+ if ((press == null ? void 0 : press.id) !== event.pointerId) return;
86
112
  const { target } = press;
87
113
  press = null;
88
114
  if (event.type !== "pointerup") return;
89
115
  if (isInteractive(target, element)) return;
90
- const pictureElement = picture == null ? void 0 : picture.current;
91
- const onPicture = Boolean(
92
- pictureElement && target instanceof Node && pictureElement.contains(target)
93
- );
94
- if (onPicture && (tap == null ? void 0 : tap.onPicture) && Math.hypot(event.clientX - tap.x, event.clientY - tap.y) < DOUBLE_TAP_SLOP) {
116
+ const tapped = onPicture(target);
117
+ if (tapped && (tap == null ? void 0 : tap.onPicture) && Math.hypot(event.clientX - tap.x, event.clientY - tap.y) < DOUBLE_TAP_SLOP) {
95
118
  forgetTap();
96
119
  return;
97
120
  }
98
- later({ x: event.clientX, y: event.clientY, onPicture });
121
+ later({ x: event.clientX, y: event.clientY, onPicture: tapped });
99
122
  };
100
123
  const underFadedControls = (event) => {
101
- const pictureElement = picture == null ? void 0 : picture.current;
102
- const target = event.target;
103
- if (!pictureElement || !target || !pictureElement.contains(target))
104
- return false;
124
+ if (!onPicture(event.target)) return false;
105
125
  return Array.from(element.querySelectorAll(FADING_CONTROLS)).some(
106
126
  (piece) => {
107
127
  const box = piece.getBoundingClientRect();
@@ -144,6 +164,7 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
144
164
  };
145
165
  const pressed = (event) => {
146
166
  pressedAt = Date.now();
167
+ pressedInside = element.contains(event.target);
147
168
  if (event.type === "pointerdown") focusHeld = false;
148
169
  };
149
170
  const focus = () => {
@@ -159,6 +180,7 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
159
180
  const blur = (event) => {
160
181
  if (element.contains(event.relatedTarget)) return;
161
182
  focusHeld = false;
183
+ if (pressedInside && Date.now() - pressedAt < PRESS_FOCUS_MS) return;
162
184
  if (shown || keyboard) linger();
163
185
  };
164
186
  page.addEventListener("pointerdown", pressed, true);
@@ -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
  };