@nulib/clover 4.1.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 (253) hide show
  1. package/dist/components/Body/useControlsVisibility.mjs +35 -13
  2. package/dist/components/Panel/Panel.mjs +47 -59
  3. package/dist/components/Panel/sections.mjs +62 -0
  4. package/dist/index.d.mts +70 -6
  5. package/dist/index.mjs +2 -0
  6. package/dist/lib/pointer.mjs +1 -1
  7. package/dist/styles.css +1 -1
  8. package/dist/templates/default/Default.mjs +5 -0
  9. package/dist/templates/document/Document.mjs +10 -1
  10. package/dist/templates/gallery/Gallery.mjs +4 -0
  11. package/dist/templates/index.d.mts +68 -3
  12. package/dist/templates/shared/LightboxView.mjs +5 -0
  13. package/dist/templates/shared/PanelPane.mjs +13 -1
  14. package/dist/web-components/{About-DvyvVUK5.mjs → About-D1TBGGPL.mjs} +1 -1
  15. package/dist/web-components/{AnnotationItems-BpRcSrOM.mjs → AnnotationItems-DTacmRA9.mjs} +1 -1
  16. package/dist/web-components/{AnnotationMenu-BDPec3iI.mjs → AnnotationMenu-DYc9ekWS.mjs} +1 -1
  17. package/dist/web-components/{AnnotationState-Chs_37Kk.mjs → AnnotationState--5ghW0C2.mjs} +1 -1
  18. package/dist/web-components/{Annotations-CLPEq7Ro.mjs → Annotations-BG8lPjk1.mjs} +1 -1
  19. package/dist/web-components/{Annotations-6E-oD_wg.mjs → Annotations-Bvc_FmJ5.mjs} +1 -1
  20. package/dist/web-components/{Body-Ct61yxI7.mjs → Body-QQ1DmnbP.mjs} +1 -1
  21. package/dist/web-components/{BodyAlert-C_Qh3Up_.mjs → BodyAlert-A4xRjOKr.mjs} +1 -1
  22. package/dist/web-components/{Button-L8ZMy5lY.mjs → Button-Cx6VE_UW.mjs} +1 -1
  23. package/dist/web-components/{Camera-BPyLzZjP.mjs → Camera-DqT_1MgD.mjs} +1 -1
  24. package/dist/web-components/{Canvas2DBackend-8wFavYdl.mjs → Canvas2DBackend-TZtR3zHf.mjs} +1 -1
  25. package/dist/web-components/{CanvasView-2Fj9nT06.mjs → CanvasView-DxZASM9E.mjs} +1 -1
  26. package/dist/web-components/{CaptionDetails-DuwS-grE.mjs → CaptionDetails-DMRWmtaY.mjs} +1 -1
  27. package/dist/web-components/{ChaptersMenu-Bj2EqtVJ.mjs → ChaptersMenu-BAZVVDrK.mjs} +1 -1
  28. package/dist/web-components/{Chevron-Cyr_cc9X.mjs → Chevron-DFGbSGPI.mjs} +1 -1
  29. package/dist/web-components/{ChoiceMenu-ConzybVH.mjs → ChoiceMenu-C80kdxvq.mjs} +1 -1
  30. package/dist/web-components/{Collection-CLayN8sv.mjs → Collection-B4CxBsFL.mjs} +1 -1
  31. package/dist/web-components/{CollectionSelect-D2d8dGJ4.mjs → CollectionSelect-DO8YO2p7.mjs} +1 -1
  32. package/dist/web-components/{Connected-pyd0EBD3.mjs → Connected-CcbVqzmj.mjs} +1 -1
  33. package/dist/web-components/{Connected-CBQ6xyhr.mjs → Connected-DthCPaHl.mjs} +1 -1
  34. package/dist/web-components/{Connected-DMXG3imZ.mjs → Connected-sYBn_9MK.mjs} +1 -1
  35. package/dist/web-components/{Contents-tCMXBYDK.mjs → Contents-AVPYYXht.mjs} +1 -1
  36. package/dist/web-components/{ControlMenu-D1zkB0qX.mjs → ControlMenu-BjJsWnuZ.mjs} +1 -1
  37. package/dist/web-components/ControlsFade-C-6WhSxB.mjs +1 -0
  38. package/dist/web-components/{CountMenu-Dnzb7lKo.mjs → CountMenu-Dx8D_RJZ.mjs} +1 -1
  39. package/dist/web-components/Cue-xuo5dgKE.mjs +1 -0
  40. package/dist/web-components/Document-BWdafeEi.mjs +1 -0
  41. package/dist/web-components/{DomLayers-BxPU05-D.mjs → DomLayers-DlRapZ1u.mjs} +1 -1
  42. package/dist/web-components/{Download-Bku9Vptk.mjs → Download-Ci_JUTVd.mjs} +1 -1
  43. package/dist/web-components/{EntryBodies-77vDudCb.mjs → EntryBodies-C0ICfS2R.mjs} +1 -1
  44. package/dist/web-components/{EntryThumbnail-BxQWKW6e.mjs → EntryThumbnail-DxHhfRo_.mjs} +1 -1
  45. package/dist/web-components/{FieldPill-nFGsaru9.mjs → FieldPill-CVfeeafm.mjs} +1 -1
  46. package/dist/web-components/{FrameAnimation-BvKiSXcm.mjs → FrameAnimation-AZpVvu0R.mjs} +1 -1
  47. package/dist/web-components/{Gallery-4Hd58afA.mjs → Gallery-C2PTJmvN.mjs} +1 -1
  48. package/dist/web-components/{HideToggle-TEhY4TS4.mjs → HideToggle-0nlIo-f8.mjs} +1 -1
  49. package/dist/web-components/{ImageControls-CZO7WoPb.mjs → ImageControls-tKVAMpaj.mjs} +1 -1
  50. package/dist/web-components/{Items-CudZ4Lnb.mjs → Items-Drd82_Jj.mjs} +1 -1
  51. package/dist/web-components/{Label-f07N5Fld.mjs → Label-BIjqJ-_T.mjs} +1 -1
  52. package/dist/web-components/{LanguageChoice-B5VM21DV.mjs → LanguageChoice-DkSc-n6g.mjs} +1 -1
  53. package/dist/web-components/LightboxView-Cuqx2H1m.mjs +1 -0
  54. package/dist/web-components/{ListEnd-M39M62Cl.mjs → ListEnd-pq-BgaDI.mjs} +1 -1
  55. package/dist/web-components/{Loaded-oGFyBuos.mjs → Loaded-CSO5NFhm.mjs} +1 -1
  56. package/dist/web-components/{LoadedCanvas-IvpSzPO6.mjs → LoadedCanvas-DK6xMmM1.mjs} +1 -1
  57. package/dist/web-components/LoadedMap-DmPH-LKY.mjs +1 -0
  58. package/dist/web-components/{Loading-YxuKrDAM.mjs → Loading-CoJLSRkv.mjs} +1 -1
  59. package/dist/web-components/{Map-Cw9j3gi3.mjs → Map-BEVtD52O.mjs} +1 -1
  60. package/dist/web-components/{MapView-3OxoCr5l.mjs → MapView-DHJcn9gW.mjs} +2 -2
  61. package/dist/web-components/{Markup-DW75Jx3j.mjs → Markup-Hm6bWOjm.mjs} +1 -1
  62. package/dist/web-components/{MediaBody-CLtd0bf0.mjs → MediaBody-BpgNtpKZ.mjs} +1 -1
  63. package/dist/web-components/{MediaBody-JnKnoIqY.mjs → MediaBody-Co23JjUJ.mjs} +1 -1
  64. package/dist/web-components/{NavDate-BCCOyycx.mjs → NavDate-CYNK0Qmp.mjs} +1 -1
  65. package/dist/web-components/{Navigator-Bx4zS0Yr.mjs → Navigator-DrYPepzN.mjs} +1 -1
  66. package/dist/web-components/{Pager-B9GvQ64b.mjs → Pager-CN4lHURv.mjs} +1 -1
  67. package/dist/web-components/{PagerLayout-BF33VZL_.mjs → PagerLayout-DeqnSQcF.mjs} +1 -1
  68. package/dist/web-components/Panel-CFYUlXup.mjs +1 -0
  69. package/dist/web-components/PanelPart-CpUIRbxr.mjs +1 -0
  70. package/dist/web-components/{PanelToggle-bPcIULGZ.mjs → PanelToggle-9ud55NNI.mjs} +1 -1
  71. package/dist/web-components/{PartOfManifest-HLg-r00O.mjs → PartOfManifest-KUHUq-6q.mjs} +1 -1
  72. package/dist/web-components/{Pending-BxGjjnqq.mjs → Pending-mcmdyZPA.mjs} +1 -1
  73. package/dist/web-components/{PlaceBox-D-Zhe9-U.mjs → PlaceBox-DX4ZLDat.mjs} +1 -1
  74. package/dist/web-components/{Placeholder-DzY5hcbk.mjs → Placeholder-0hE8q-SY.mjs} +1 -1
  75. package/dist/web-components/{Position-TYnzcm8e.mjs → Position-DO5qg5Sp.mjs} +1 -1
  76. package/dist/web-components/{Primitives-C6VJXxZD.mjs → Primitives-c9sIz0oQ.mjs} +1 -1
  77. package/dist/web-components/{Provider-DyB0wpeO.mjs → Provider-a3xY016W.mjs} +1 -1
  78. package/dist/web-components/{ReadMore-De_0T7lc.mjs → ReadMore-D_WmmKEP.mjs} +1 -1
  79. package/dist/web-components/{Root-Bt3NNBFb.mjs → Root-CU1o0wje.mjs} +1 -1
  80. package/dist/web-components/Scene-CboEeptc.mjs +1 -0
  81. package/dist/web-components/SceneView-hcc78jQT.mjs +1 -0
  82. package/dist/web-components/{Search-DgT8OPsK.mjs → Search-BgxEW1UT.mjs} +1 -1
  83. package/dist/web-components/{Sections-d1acn7qm.mjs → Sections-DZVrhoAC.mjs} +1 -1
  84. package/dist/web-components/{StandaloneItems-DUb4YKCB.mjs → StandaloneItems-6cSw7nbF.mjs} +1 -1
  85. package/dist/web-components/{Status-CcU3u6P4.mjs → Status-DHTzuTkh.mjs} +1 -1
  86. package/dist/web-components/{Steps-nlSCzbDQ.mjs → Steps-Dkpy9KiJ.mjs} +1 -1
  87. package/dist/web-components/{TargetItems-BDJM3Ar-.mjs → TargetItems-CyOI9_Z4.mjs} +1 -1
  88. package/dist/web-components/Timeline-B9tD3Rar.mjs +1 -0
  89. package/dist/web-components/{Tip-OCB88zwY.mjs → Tip-nJSTYquc.mjs} +1 -1
  90. package/dist/web-components/{Transcript-bSA3cx_K.mjs → Transcript-WvFFAJQM.mjs} +1 -1
  91. package/dist/web-components/{Transport-DjOYI-fR.mjs → Transport-FxLp_bdW.mjs} +1 -1
  92. package/dist/web-components/Transport-VUxSEIQO.mjs +1 -0
  93. package/dist/web-components/{annotation-collection-D8emkElk.mjs → annotation-collection-BkC3nBPA.mjs} +1 -1
  94. package/dist/web-components/{annotation-name-DbWjhgra.mjs → annotation-name-Du2KAWoD.mjs} +1 -1
  95. package/dist/web-components/{annotations-content-Bg6aVAGC.mjs → annotations-content-CEzAS-P2.mjs} +1 -1
  96. package/dist/web-components/{body-Ct8dmQdW.mjs → body-DPlfbLt3.mjs} +1 -1
  97. package/dist/web-components/{canvas-goEZLqEd.mjs → canvas-BUwBftJW.mjs} +1 -1
  98. package/dist/web-components/{cloverEngine-Df7cMwOP.mjs → cloverEngine-UNw5K4Xg.mjs} +1 -1
  99. package/dist/web-components/{content-state-reader-CNmBpG1L.mjs → content-state-reader-GgQF2MvJ.mjs} +1 -1
  100. package/dist/web-components/{controls-BZr16sYQ.mjs → controls-CC9G5LxK.mjs} +1 -1
  101. package/dist/web-components/custom-elements.json +31 -1
  102. package/dist/web-components/{downloads-EjJ6Hpip.mjs → downloads-CmAYeEIz.mjs} +1 -1
  103. package/dist/web-components/{dragToClose-X9NbZOhA.mjs → dragToClose-DK-eM097.mjs} +1 -1
  104. package/dist/web-components/{engine-DMoc0tff.mjs → engine-Dok0z8WP.mjs} +1 -1
  105. package/dist/web-components/{engines-BmB81VXR.mjs → engines-BD2IfwQF.mjs} +1 -1
  106. package/dist/web-components/{fetchManifest-CwQC6cCh.mjs → fetchManifest-tQXcfFiz.mjs} +1 -1
  107. package/dist/web-components/{fromManifest-DrAmY1lB.mjs → fromManifest-BwQdeAuL.mjs} +1 -1
  108. package/dist/web-components/{glyphs-BFK_hvJJ.mjs → glyphs-dp_HK3Ja.mjs} +1 -1
  109. package/dist/web-components/{hooks-BhtNDs_1.mjs → hooks-C4dJ5K_D.mjs} +1 -1
  110. package/dist/web-components/{image-layers-D2nQC4R-.mjs → image-layers-xcBsiad9.mjs} +1 -1
  111. package/dist/web-components/{imageService-iFElsopt.mjs → imageService-4sFnmAFX.mjs} +1 -1
  112. package/dist/web-components/index-DspT4wUm.mjs +1 -0
  113. package/dist/web-components/index.d.mts +1 -1
  114. package/dist/web-components/index.mjs +1 -1
  115. package/dist/web-components/{items-BnEnc5ot.mjs → items-BUmOy2QY.mjs} +1 -1
  116. package/dist/web-components/items-CWMI53aN.mjs +1 -0
  117. package/dist/web-components/label-BGjL7I4b.mjs +1 -0
  118. package/dist/web-components/{layout-Djwu8f4R.mjs → layout-B29v2RKK.mjs} +1 -1
  119. package/dist/web-components/{link-0lUlTZlw.mjs → link-Ct5PpHEY.mjs} +1 -1
  120. package/dist/web-components/logo-BFstM-0a.mjs +1 -0
  121. package/dist/web-components/{models-BF2pqufA.mjs → models-BXcT4ijX.mjs} +1 -1
  122. package/dist/web-components/{nodes-ChQRLDGU.mjs → nodes-BleXuYE6.mjs} +1 -1
  123. package/dist/web-components/{overlayImage-MKrcgDep.mjs → overlayImage-BJtfot4Y.mjs} +1 -1
  124. package/dist/web-components/{panel-C13V6w6E.mjs → panel-BxxV_JkD.mjs} +1 -1
  125. package/dist/web-components/part-D4gjnYmT.mjs +1 -0
  126. package/dist/web-components/{playerSurface-DG1XipTq.mjs → playerSurface-BXNLaFk0.mjs} +1 -1
  127. package/dist/web-components/{pointer-YQppt0at.mjs → pointer-CJELU3gI.mjs} +1 -1
  128. package/dist/web-components/{provider-DiUkZYiW.mjs → provider-CPp0Sgr_.mjs} +1 -1
  129. package/dist/web-components/{range-regions-CqGjyM76.mjs → range-regions-DAaOu0IS.mjs} +1 -1
  130. package/dist/web-components/{read-more-D8RJYdtQ.mjs → read-more-lcqGslUd.mjs} +1 -1
  131. package/dist/web-components/{readingLanguages-BWOLZK2k.mjs → readingLanguages-FyVsSWJ8.mjs} +1 -1
  132. package/dist/web-components/{rendererSurface-BkbGDL_Z.mjs → rendererSurface-nh6-EfuZ.mjs} +2 -2
  133. package/dist/web-components/{renderers-LtRX5pT0.mjs → renderers-BFS7hFVU.mjs} +1 -1
  134. package/dist/web-components/{resource-Cfydiy4m.mjs → resource-Bufu7lAr.mjs} +1 -1
  135. package/dist/web-components/{save-file-dZyOpXgY.mjs → save-file-CoknKOPz.mjs} +1 -1
  136. package/dist/web-components/{search-BfUZJM3a.mjs → search-5ocrsYmT.mjs} +1 -1
  137. package/dist/web-components/{shared-DkY2a89G.mjs → shared-DFAX0n3B.mjs} +1 -1
  138. package/dist/web-components/{show-link-DgLJzG7k.mjs → show-link-DBaJj4s_.mjs} +1 -1
  139. package/dist/web-components/{sizedImage-NHzhcBYk.mjs → sizedImage-jnOGcIIZ.mjs} +1 -1
  140. package/dist/web-components/{split-CuFiKjin.mjs → split-P6J0qqf5.mjs} +1 -1
  141. package/dist/web-components/{status-C3etlkhY.mjs → status-honoOMNx.mjs} +1 -1
  142. package/dist/web-components/styles-BwkYiCLC.mjs +1 -0
  143. package/dist/web-components/three.mjs +1 -1
  144. package/dist/web-components/{thumbnail-DecrVnpj.mjs → thumbnail-EbURh-UM.mjs} +1 -1
  145. package/dist/web-components/{tip-D5YgaIWW.mjs → tip-BhNI83aT.mjs} +1 -1
  146. package/dist/web-components/{toggle-CZGB65VZ.mjs → toggle-CJKdi5KH.mjs} +1 -1
  147. package/dist/web-components/{useContainerName-hKQjEt7a.mjs → useContainerName-_48Cdi0m.mjs} +1 -1
  148. package/dist/web-components/useControlsVisibility-CieBxGnK.mjs +1 -0
  149. package/dist/web-components/useLazyPanelPane-Da3kJiOt.mjs +1 -0
  150. package/dist/web-components/{useNearViewport-CDbHQUBk.mjs → useNearViewport-B34ebmIW.mjs} +1 -1
  151. package/dist/web-components/{useScrollTrack-D9l_P3_B.mjs → useScrollTrack-DgRGFeP5.mjs} +1 -1
  152. package/dist/web-components/viewer/{AnnotationItems-DtsnDXPM.mjs → AnnotationItems-BNA_92Dv.mjs} +1 -1
  153. package/dist/web-components/viewer/{AnnotationMenu-C-Mz6CCn.mjs → AnnotationMenu-BIQYVR4N.mjs} +1 -1
  154. package/dist/web-components/viewer/{AnnotationState-5pim5K72.mjs → AnnotationState-BbwQqA1U.mjs} +1 -1
  155. package/dist/web-components/viewer/{Annotations-Cqn1TkzD.mjs → Annotations-CZzOZAFP.mjs} +1 -1
  156. package/dist/web-components/viewer/{Annotations-CxwN9FkB.mjs → Annotations-P4XzAlNc.mjs} +1 -1
  157. package/dist/web-components/viewer/{Canvas2DBackend-C-ZMSCak.mjs → Canvas2DBackend-DFfCzyjL.mjs} +1 -1
  158. package/dist/web-components/viewer/{CaptionDetails-CRD-gSZP.mjs → CaptionDetails-DPtE-RQQ.mjs} +1 -1
  159. package/dist/web-components/viewer/{ChaptersMenu-Brcq3yJv.mjs → ChaptersMenu-D6Jmujag.mjs} +1 -1
  160. package/dist/web-components/viewer/{ChoiceMenu-ByGzQQx1.mjs → ChoiceMenu-GkqyTQRQ.mjs} +1 -1
  161. package/dist/web-components/viewer/{Collection-m0GCcsfQ.mjs → Collection-DjY_6qa6.mjs} +1 -1
  162. package/dist/web-components/viewer/{Connected-Dvx7wtot.mjs → Connected-D5T-mtiy.mjs} +1 -1
  163. package/dist/web-components/viewer/Connected-DIOuI3Mv.mjs +1 -0
  164. package/dist/web-components/viewer/{Contents-CwDpfiJY.mjs → Contents-DV-VxXuf.mjs} +1 -1
  165. package/dist/web-components/viewer/{ControlMenu-TcO85hDf.mjs → ControlMenu-BsEpff6N.mjs} +1 -1
  166. package/dist/web-components/viewer/ControlsFade-BowtN96W.mjs +1 -0
  167. package/dist/web-components/viewer/{CountMenu-0-ie8kIZ.mjs → CountMenu-DCmA6HdK.mjs} +1 -1
  168. package/dist/web-components/viewer/Cue-BjbVzrpl.mjs +1 -0
  169. package/dist/web-components/viewer/Document-4ZQd3W3o.mjs +1 -0
  170. package/dist/web-components/viewer/{DomLayers-hc0qARQc.mjs → DomLayers-BCwCxPDU.mjs} +1 -1
  171. package/dist/web-components/viewer/{Download-MO-1Rik4.mjs → Download-CL4IClAD.mjs} +1 -1
  172. package/dist/web-components/viewer/{EntryBodies-g-OEwEsk.mjs → EntryBodies-e40y47bl.mjs} +1 -1
  173. package/dist/web-components/viewer/{EntryThumbnail-DcIDYATi.mjs → EntryThumbnail-B_dP3w4o.mjs} +1 -1
  174. package/dist/web-components/viewer/{FieldPill-B9S21lxw.mjs → FieldPill-Hse1cDBE.mjs} +1 -1
  175. package/dist/web-components/viewer/{FrameAnimation-qI9cZPEs.mjs → FrameAnimation-CE218DCr.mjs} +1 -1
  176. package/dist/web-components/viewer/{Gallery-BOgUqfqw.mjs → Gallery-F2sVj4ph.mjs} +1 -1
  177. package/dist/web-components/viewer/{HideToggle-D8wH49mq.mjs → HideToggle-CYoqe_ez.mjs} +1 -1
  178. package/dist/web-components/viewer/{ImageControls-ZoEC9jWd.mjs → ImageControls-C2G4x2Es.mjs} +1 -1
  179. package/dist/web-components/viewer/{LanguageChoice-CRqsCBAp.mjs → LanguageChoice-BmO-322r.mjs} +1 -1
  180. package/dist/web-components/viewer/LightboxView-DKR8dXcg.mjs +1 -0
  181. package/dist/web-components/viewer/{ListEnd-D9Obxie4.mjs → ListEnd-DX1jsvJk.mjs} +1 -1
  182. package/dist/web-components/viewer/{MapView-DQSwUzd7.mjs → MapView-Df0wZjCh.mjs} +2 -2
  183. package/dist/web-components/viewer/{MediaBody-CIw2nTlj.mjs → MediaBody-CataNonO.mjs} +1 -1
  184. package/dist/web-components/viewer/{MediaBody-D5ff6xy-.mjs → MediaBody-SkIgrEMj.mjs} +1 -1
  185. package/dist/web-components/viewer/{NavDate-BnfDG57h.mjs → NavDate-BZgeaMG9.mjs} +1 -1
  186. package/dist/web-components/viewer/{Navigator-BNwjmkXY.mjs → Navigator-Co76p-1n.mjs} +1 -1
  187. package/dist/web-components/viewer/{PagerLayout-C8jraHqs.mjs → PagerLayout-tUkN1-FV.mjs} +1 -1
  188. package/dist/web-components/viewer/PanelPart-Cl4Sst60.mjs +1 -0
  189. package/dist/web-components/viewer/{PartOfManifest-DX7H0V4g.mjs → PartOfManifest-DXnbEPzS.mjs} +1 -1
  190. package/dist/web-components/viewer/{PlaceBox-CCWfzsNU.mjs → PlaceBox-xrJ4CGdN.mjs} +1 -1
  191. package/dist/web-components/viewer/{Placeholder-CsEkLhz7.mjs → Placeholder-B1AcizHL.mjs} +1 -1
  192. package/dist/web-components/viewer/{Search-CsdYzdq1.mjs → Search-DTg1cHZ3.mjs} +1 -1
  193. package/dist/web-components/viewer/{StandaloneItems-BfvBxbUm.mjs → StandaloneItems-BpBEQG8i.mjs} +1 -1
  194. package/dist/web-components/viewer/{Steps-BH8ZApS4.mjs → Steps-SpwMQdCL.mjs} +1 -1
  195. package/dist/web-components/viewer/{TargetItems-BebPFr-c.mjs → TargetItems-B6Icep5k.mjs} +1 -1
  196. package/dist/web-components/viewer/{Transcript-DXLv5WR9.mjs → Transcript-rTAhuXCF.mjs} +1 -1
  197. package/dist/web-components/viewer/{Transport-C-fh7Kx2.mjs → Transport-vKIDALE-.mjs} +1 -1
  198. package/dist/web-components/viewer/Transport-z_kdVisw.mjs +1 -0
  199. package/dist/web-components/viewer/{annotation-collection-Cjd8Dgyl.mjs → annotation-collection-B7pZiLVk.mjs} +1 -1
  200. package/dist/web-components/viewer/{annotation-name-CwmgQFia.mjs → annotation-name-BKj1O9lA.mjs} +1 -1
  201. package/dist/web-components/viewer/{annotations-content-BARXoAz-.mjs → annotations-content-9AtLlPNn.mjs} +1 -1
  202. package/dist/web-components/viewer/{cloverEngine-CumnJPKO.mjs → cloverEngine-jRrYLrWa.mjs} +1 -1
  203. package/dist/web-components/viewer/{content-state-reader-DuvyLThu.mjs → content-state-reader-CPvkju6Q.mjs} +1 -1
  204. package/dist/web-components/viewer/{dragToClose-CFCxhUxn.mjs → dragToClose-Co9kGk9q.mjs} +1 -1
  205. package/dist/web-components/viewer/{fetchManifest-qNB_KgxL.mjs → fetchManifest-D7N9WhhF.mjs} +1 -1
  206. package/dist/web-components/viewer/{host-GTHX2fPK.mjs → host-DMD9LE4H.mjs} +1 -1
  207. package/dist/web-components/viewer/{image-layers-DKOuaRTj.mjs → image-layers-x_shzPvu.mjs} +1 -1
  208. package/dist/web-components/viewer/index.mjs +1 -1
  209. package/dist/web-components/viewer/{link-BlaM0tCa.mjs → link-DikPGzNO.mjs} +1 -1
  210. package/dist/web-components/viewer/{overlayImage-RVpv69R5.mjs → overlayImage-33kKKB0T.mjs} +1 -1
  211. package/dist/web-components/viewer/{range-regions-CIZiAHOp.mjs → range-regions-TH6WWGTT.mjs} +1 -1
  212. package/dist/web-components/viewer/{renderers-Dw1klwlx.mjs → renderers-BxePmixF.mjs} +1 -1
  213. package/dist/web-components/viewer/{save-file-EvzaBEJN.mjs → save-file-QXKiPlST.mjs} +1 -1
  214. package/dist/web-components/viewer/{search-x1QL_bth.mjs → search-B_NePyas.mjs} +1 -1
  215. package/dist/web-components/viewer/styles-Bedyz7_l.mjs +1 -0
  216. package/dist/web-components/viewer/useControlsVisibility-Cu-jTDzs.mjs +1 -0
  217. package/dist/web-components/viewer/useLazyPanelPane-BhLtRixT.mjs +1 -0
  218. package/dist/web-components/viewer/viewer-nfPJPwwt.mjs +29 -0
  219. package/dist/web-components/viewer/{vtt-C2G89SWH.mjs → vtt-CUn4h5JB.mjs} +1 -1
  220. package/dist/web-components/viewer-DN2Mo3vc.mjs +1 -0
  221. package/dist/web-components/{vtt-Dd0c7psH.mjs → vtt-C5M5WPSG.mjs} +1 -1
  222. package/package.json +1 -1
  223. package/dist/web-components/ControlsFade-BNXVTL_Q.mjs +0 -1
  224. package/dist/web-components/Cue-CUGmPS3k.mjs +0 -1
  225. package/dist/web-components/Document-D-8nalCX.mjs +0 -1
  226. package/dist/web-components/LightboxView-C4OASmkg.mjs +0 -1
  227. package/dist/web-components/LoadedMap-WATGNLxl.mjs +0 -1
  228. package/dist/web-components/Panel-BvDpCn6K.mjs +0 -1
  229. package/dist/web-components/PanelPart-Bd4lSUrP.mjs +0 -1
  230. package/dist/web-components/Scene-DrOM9YlD.mjs +0 -1
  231. package/dist/web-components/SceneView-DA7Yg20p.mjs +0 -1
  232. package/dist/web-components/Timeline-BfdN3lIv.mjs +0 -1
  233. package/dist/web-components/Transport-DaIhfZqC.mjs +0 -1
  234. package/dist/web-components/index-FJEpXukG.mjs +0 -1
  235. package/dist/web-components/items-BPPrqbeh.mjs +0 -1
  236. package/dist/web-components/label-DauFa5sg.mjs +0 -1
  237. package/dist/web-components/logo-DWPxaZaG.mjs +0 -1
  238. package/dist/web-components/part-CekFWrtz.mjs +0 -1
  239. package/dist/web-components/styles-DkkVOSUQ.mjs +0 -1
  240. package/dist/web-components/useControlsVisibility-DPg8uAkW.mjs +0 -1
  241. package/dist/web-components/useLazyPanelPane-eby-OI1V.mjs +0 -1
  242. package/dist/web-components/viewer/Connected-Bmc_CdUD.mjs +0 -1
  243. package/dist/web-components/viewer/ControlsFade-BoZ4ABAE.mjs +0 -1
  244. package/dist/web-components/viewer/Cue-DxmAS9Gx.mjs +0 -1
  245. package/dist/web-components/viewer/Document-BsryuYJ1.mjs +0 -1
  246. package/dist/web-components/viewer/LightboxView-BB-GcbYr.mjs +0 -1
  247. package/dist/web-components/viewer/PanelPart-YNbBI9SQ.mjs +0 -1
  248. package/dist/web-components/viewer/Transport-CY6BWfMi.mjs +0 -1
  249. package/dist/web-components/viewer/styles-I7_LWFGj.mjs +0 -1
  250. package/dist/web-components/viewer/useControlsVisibility-C_SQHIVR.mjs +0 -1
  251. package/dist/web-components/viewer/useLazyPanelPane-UuGDJrf_.mjs +0 -1
  252. package/dist/web-components/viewer/viewer-DJrQuNs1.mjs +0 -29
  253. package/dist/web-components/viewer-Br44EEba.mjs +0 -1
@@ -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);
@@ -6,12 +6,10 @@ import { AboutActions } from "./AboutActions.mjs";
6
6
  import { InPanelContext } from "./ReadingLanguages.mjs";
7
7
  import { Tip } from "../../ui/Tip.mjs";
8
8
  import { Close } from "../Body/glyphs.mjs";
9
- import { canvasTimedText, canvasTextTranscripts } from "../Canvas/layout.mjs";
10
- import { SEARCH_SET_ID, searchServiceOf } from "../../core/search-service.mjs";
11
- import { hasMapData } from "../../core/geo-detect.mjs";
12
- import { tableOfContents } from "../../core/ranges.mjs";
13
- import { partOfCollection, selectVisibleCanvases } from "../../core/selectors.mjs";
14
- import { selectListedSets } from "../../core/annotation-sets.mjs";
9
+ import { SEARCH_SET_ID } from "../../core/search-service.mjs";
10
+ import { usePanelSections } from "./sections.mjs";
11
+ import { langWithin } from "../../i18n/config.mjs";
12
+ import { languageToRead } from "../../i18n/languages.mjs";
15
13
  import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
16
14
  import { join } from "../../lib/classnames.mjs";
17
15
  import { useClover, useCloverSelector } from "../../react/context.mjs";
@@ -54,6 +52,8 @@ const Panel = forwardRef(function Panel2({
54
52
  as: Tag = "aside",
55
53
  download = true,
56
54
  languages = true,
55
+ sections,
56
+ labels,
57
57
  className,
58
58
  children,
59
59
  onKeyDown,
@@ -62,7 +62,7 @@ const Panel = forwardRef(function Panel2({
62
62
  var _a;
63
63
  const { clover } = useClover("Panel");
64
64
  const element = useRef(null);
65
- const { t, langOf } = useCloverTranslation();
65
+ const { t, langOf, hostLanguage, i18n } = useCloverTranslation();
66
66
  const name = useContainerName(
67
67
  t("informationPanelTabs"),
68
68
  langOf("informationPanelTabs"),
@@ -72,38 +72,18 @@ const Panel = forwardRef(function Panel2({
72
72
  const lang = langOf(key);
73
73
  return lang ? /* @__PURE__ */ jsx("span", { ...languageProps(lang), children: t(key) }) : t(key);
74
74
  };
75
- const hasAnnotations = useCloverSelector(
76
- (state) => selectListedSets(state.manifest, state.addedSets).length > 0
77
- );
78
- const hasTranscript = useCloverSelector(
79
- (state) => selectVisibleCanvases(
80
- state.manifest,
81
- state.canvasId
82
- ).some(
83
- (canvas) => canvasTimedText(canvas).length > 0 || canvasTextTranscripts(canvas).length > 0
84
- )
85
- );
86
- const hasContents = useCloverSelector(
87
- (state) => tableOfContents(state.manifest).length > 0
88
- );
89
- const hasSearch = useCloverSelector(
90
- (state) => Boolean(searchServiceOf(state.manifest))
91
- );
92
- const hasMap = useCloverSelector(
93
- (state) => hasMapData(state.manifest, state.collection)
94
- );
95
- const hasTargets = useCloverSelector(
96
- (state) => {
97
- var _a2;
98
- return (((_a2 = state.targets) == null ? void 0 : _a2.items.length) ?? 0) > 1;
99
- }
100
- );
101
- const hasCollection = useCloverSelector(
102
- (state) => {
103
- var _a2, _b;
104
- return (((_b = (_a2 = state.collection) == null ? void 0 : _a2.items) == null ? void 0 : _b.length) ?? 0) > 0 || Boolean(partOfCollection(state.manifest));
105
- }
106
- );
75
+ const sectionLabel = (section, key) => {
76
+ const given2 = labels == null ? void 0 : labels[section];
77
+ if (given2 === void 0) return tabLabel(key);
78
+ if (typeof given2 === "string") return given2;
79
+ const tags = Object.keys(given2);
80
+ const tag = languageToRead(tags, i18n.language);
81
+ if (!tag) return tabLabel(key);
82
+ const lang = langWithin(tag, hostLanguage);
83
+ return lang ? /* @__PURE__ */ jsx("span", { ...languageProps(lang), children: given2[tag] }) : given2[tag];
84
+ };
85
+ const offered = usePanelSections(sections);
86
+ const has = (section) => offered.includes(section);
107
87
  const given = React.Children.toArray(children).filter(
108
88
  (child) => React.isValidElement(child) && child.type === Tab
109
89
  );
@@ -115,62 +95,70 @@ const Panel = forwardRef(function Panel2({
115
95
  content: props.children,
116
96
  ...props.value === "about" && { actions: aboutActions }
117
97
  })) : [
118
- {
119
- value: "about",
120
- label: tabLabel("informationPanelTabsAbout"),
121
- content: /* @__PURE__ */ jsx(About, { headingLevel: inner, download }),
122
- actions: aboutActions
123
- },
124
- ...hasTargets ? [
98
+ ...has("about") ? [
99
+ {
100
+ value: "about",
101
+ label: sectionLabel("about", "informationPanelTabsAbout"),
102
+ content: /* @__PURE__ */ jsx(About, { headingLevel: inner, download }),
103
+ actions: aboutActions
104
+ }
105
+ ] : [],
106
+ ...has("targets") ? [
125
107
  {
126
108
  value: "targets",
127
- label: tabLabel("informationPanelTabsTargets"),
109
+ label: sectionLabel("targets", "informationPanelTabsTargets"),
128
110
  content: later(/* @__PURE__ */ jsx(Targets, { headingLevel: inner }))
129
111
  }
130
112
  ] : [],
131
- ...hasCollection ? [
113
+ ...has("collection") ? [
132
114
  {
133
115
  value: "collection",
134
- label: tabLabel("informationPanelTabsCollection"),
116
+ label: sectionLabel(
117
+ "collection",
118
+ "informationPanelTabsCollection"
119
+ ),
135
120
  content: later(/* @__PURE__ */ jsx(Collection, { headingLevel: inner }))
136
121
  }
137
122
  ] : [],
138
- ...hasContents ? [
123
+ ...has("contents") ? [
139
124
  {
140
125
  value: "contents",
141
- label: tabLabel("informationPanelTabsContents"),
126
+ label: sectionLabel("contents", "informationPanelTabsContents"),
142
127
  content: later(/* @__PURE__ */ jsx(Contents, {}))
143
128
  }
144
129
  ] : [],
145
- ...hasSearch ? [
130
+ ...has("search") ? [
146
131
  {
147
132
  value: "search",
148
- label: tabLabel("informationPanelTabsSearch"),
133
+ label: sectionLabel("search", "informationPanelTabsSearch"),
149
134
  // Its field small and held as the hits scroll (Mat, 2026-10-26).
150
135
  content: later(
151
136
  /* @__PURE__ */ jsx(Search, { headingLevel: inner, sticky: true, size: "small" })
152
137
  )
153
138
  }
154
139
  ] : [],
155
- ...hasMap ? [
140
+ ...has("map") ? [
156
141
  {
157
142
  value: "map",
158
- label: tabLabel("informationPanelTabsMap"),
143
+ label: sectionLabel("map", "informationPanelTabsMap"),
159
144
  content: later(/* @__PURE__ */ jsx(RootMap, {}))
160
145
  }
161
146
  ] : [],
162
- ...hasTranscript ? [
147
+ ...has("transcript") ? [
163
148
  {
164
149
  value: "transcript",
165
- label: tabLabel("transcriptLabel"),
150
+ label: sectionLabel("transcript", "transcriptLabel"),
166
151
  // Its find field small and held as the cues scroll, as Search's.
167
152
  content: later(/* @__PURE__ */ jsx(Transcript, { sticky: true, size: "small" }))
168
153
  }
169
154
  ] : [],
170
- ...hasAnnotations ? [
155
+ ...has("annotations") ? [
171
156
  {
172
157
  value: "annotations",
173
- label: tabLabel("informationPanelTabsAnnotations"),
158
+ label: sectionLabel(
159
+ "annotations",
160
+ "informationPanelTabsAnnotations"
161
+ ),
174
162
  // Every Canvas's, by Canvas, those in view kept in sight.
175
163
  content: later(/* @__PURE__ */ jsx(Annotations, { headingLevel: inner }))
176
164
  }
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { canvasTimedText, canvasTextTranscripts } from "../Canvas/layout.mjs";
3
+ import { hasMapData } from "../../core/geo-detect.mjs";
4
+ import { searchServiceOf } from "../../core/search-service.mjs";
5
+ import { tableOfContents } from "../../core/ranges.mjs";
6
+ import { selectVisibleCanvases, partOfCollection } from "../../core/selectors.mjs";
7
+ import { selectListedSets } from "../../core/annotation-sets.mjs";
8
+ import { useCloverSelector } from "../../react/context.mjs";
9
+ const PANEL_SECTIONS = [
10
+ "about",
11
+ "targets",
12
+ "collection",
13
+ "contents",
14
+ "search",
15
+ "map",
16
+ "transcript",
17
+ "annotations"
18
+ ];
19
+ const HAS = {
20
+ // A content state's several targets (Cookbook 0540), listed as a Collection's members are.
21
+ targets: (state) => {
22
+ var _a;
23
+ return (((_a = state.targets) == null ? void 0 : _a.items.length) ?? 0) > 1;
24
+ },
25
+ // Reached through a Collection, or part of one: offered either way, fetched when opened.
26
+ collection: (state) => {
27
+ var _a, _b;
28
+ return (((_b = (_a = state.collection) == null ? void 0 : _a.items) == null ? void 0 : _b.length) ?? 0) > 0 || Boolean(partOfCollection(state.manifest));
29
+ },
30
+ contents: (state) => tableOfContents(state.manifest).length > 0,
31
+ search: (state) => Boolean(searchServiceOf(state.manifest)),
32
+ map: (state) => hasMapData(state.manifest, state.collection),
33
+ transcript: (state) => selectVisibleCanvases(
34
+ state.manifest,
35
+ state.canvasId
36
+ ).some(
37
+ (canvas) => canvasTimedText(canvas).length > 0 || canvasTextTranscripts(canvas).length > 0
38
+ ),
39
+ annotations: (state) => selectListedSets(state.manifest, state.addedSets).length > 0
40
+ };
41
+ const narrow = (data, sections) => {
42
+ const chosen = Array.isArray(sections) ? new Set(sections) : void 0;
43
+ return PANEL_SECTIONS.filter(
44
+ (section) => data[section] && (!chosen || chosen.has(section))
45
+ );
46
+ };
47
+ function usePanelSections(sections) {
48
+ const data = {
49
+ about: true,
50
+ targets: useCloverSelector(HAS.targets),
51
+ collection: useCloverSelector(HAS.collection),
52
+ contents: useCloverSelector(HAS.contents),
53
+ search: useCloverSelector(HAS.search),
54
+ map: useCloverSelector(HAS.map),
55
+ transcript: useCloverSelector(HAS.transcript),
56
+ annotations: useCloverSelector(HAS.annotations)
57
+ };
58
+ return narrow(data, sections);
59
+ }
60
+ export {
61
+ usePanelSections
62
+ };
package/dist/index.d.mts CHANGED
@@ -989,9 +989,9 @@ export interface CloverCanvasOptions {
989
989
  animationTime?: number;
990
990
  /**
991
991
  * Milliseconds the controls and navigator stay after a mouse (or a pen that hovers)
992
- * stops moving, as the Player's `hideDelay`. Default 2000; `Infinity` keeps them once
993
- * shown. A finger, or a pen that does not hover, has no timer: a tap on the picture
994
- * shows them, and another hides them. Focus that no press brought holds them too.
992
+ * stops moving, or a finger lifts, as the Player's `hideDelay`. Default 3000; `Infinity`
993
+ * keeps them once shown. A tap on the picture shows them, and another hides them. Focus
994
+ * that no press brought holds them, and so does a paused recording.
995
995
  * A Timeline's: a Canvas's controls stay in sight, for now (Mat, 2026-11-01).
996
996
  */
997
997
  hideDelay?: number;
@@ -1611,8 +1611,36 @@ export interface LogoProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement
1611
1611
  * picture.
1612
1612
  */
1613
1613
  export declare function Logo({ of, value, alt, className, ...rest }: LogoProps): React.JSX.Element | null;
1614
+ /**
1615
+ * A section `Panel` draws by itself, from what the Root's resource holds. `sections`
1616
+ * chooses among them; each still shows only where there is data for it.
1617
+ */
1618
+ export type PanelSection = "about" | "targets" | "collection" | "contents" | "search" | "map" | "transcript" | "annotations";
1619
+ /**
1620
+ * The default sections a `Panel` in this Root would have, in its order: About, and each
1621
+ * other one the resource has data for, narrowed to `sections` where the page names the
1622
+ * ones it wants. None of them, and the panel draws nothing, so a layout of your own can
1623
+ * ask first and leave out the pane that would hold it:
1624
+ *
1625
+ * ```jsx
1626
+ * const sections = Clover.usePanelSections(["contents", "search"]);
1627
+ * return sections.length ? <Clover.Panel sections={sections} /> : null;
1628
+ * ```
1629
+ *
1630
+ * Asking costs nothing a `Panel` does not already cost: the same reads of the Root, one
1631
+ * for each section, so a change that moves none of them re-renders nothing.
1632
+ */
1633
+ export declare function usePanelSections(sections?: readonly PanelSection[]): PanelSection[];
1614
1634
  /** How the sections are laid out. */
1615
1635
  export type SectionsLayout = "tabs" | "accordion";
1636
+ /**
1637
+ * What a page calls a section, in place of Clover's own word for it: its words, taken to
1638
+ * be in the page's language, or its words by language tag, one of which the tab carries
1639
+ * as its `lang` where it is not the page's (WCAG 3.1.2).
1640
+ */
1641
+ export type PanelSectionLabel = string | Readonly<Record<string, string>>;
1642
+ /** A label for any of the default sections, by its value. */
1643
+ export type PanelSectionLabels = Partial<Record<PanelSection, PanelSectionLabel>>;
1616
1644
  export interface TabProps {
1617
1645
  /** Identifies the tab, for `value` / `defaultValue` on the panel. */
1618
1646
  value: string;
@@ -1678,7 +1706,22 @@ export interface PanelProps extends Omit<React.HTMLAttributes<HTMLElement>, "def
1678
1706
  */
1679
1707
  languages?: boolean;
1680
1708
  /**
1681
- * `Clover.Tab`s. Without any, the panel has the tabs Clover has data for: About,
1709
+ * Which of the default sections the panel may have, in Clover's own order: with
1710
+ * `["contents", "search"]` it has those two and no About. Each still shows only where
1711
+ * the resource has data for it, so a resource with none of them draws no panel at all.
1712
+ * `Tab` children win over it. Default: every section.
1713
+ */
1714
+ sections?: readonly PanelSection[];
1715
+ /**
1716
+ * What a default section's tab or heading says, in place of Clover's own word for it:
1717
+ * `{ annotations: "Chapters" }`, or `{ annotations: { en: "Chapters", de: "Kapitel" } }`
1718
+ * to say it in several, read in the one Clover speaks and marked with its language
1719
+ * where that is not the page's (WCAG 3.1.2). A `Tab` of your own says it in `label`.
1720
+ */
1721
+ labels?: PanelSectionLabels;
1722
+ /**
1723
+ * `Clover.Tab`s, the panel's sections whole, in their order: they win over `sections`.
1724
+ * Without any, the panel has the tabs Clover has data for: About,
1682
1725
  * Contents when the Manifest has Ranges, Search when it has a Content Search service, a
1683
1726
  * Map when it (or a Canvas or annotation) has navPlace or a georeference,
1684
1727
  * a Transcript when the view's media has captions or a plain-text transcript, and
@@ -1698,6 +1741,14 @@ export interface PanelProps extends Omit<React.HTMLAttributes<HTMLElement>, "def
1698
1741
  * <Clover.Tab value="notes" label="Notes"><MyNotes /></Clover.Tab>
1699
1742
  * </Clover.Panel>
1700
1743
  * ```
1744
+ *
1745
+ * To keep Clover's own sections but not all of them, name the ones you want in
1746
+ * `sections`: each still shows only where the resource has data for it, and a resource
1747
+ * with none of them has no panel.
1748
+ *
1749
+ * ```jsx
1750
+ * <Clover.Panel sections={["contents", "search", "transcript", "annotations"]} />
1751
+ * ```
1701
1752
  */
1702
1753
  export declare const Panel: React.ForwardRefExoticComponent<PanelProps & React.RefAttributes<HTMLElement>>;
1703
1754
  export interface AboutProps extends React.HTMLAttributes<HTMLElement> {
@@ -2085,7 +2136,7 @@ export interface SceneProps {
2085
2136
  options?: {
2086
2137
  /** Credentials and headers for the Scene and its models. Inside a `Root`, the Root's. */
2087
2138
  request?: CloverRequest;
2088
- /** Milliseconds the controls stay after a mouse stops moving, as `Canvas`'s. */
2139
+ /** Milliseconds the controls stay after a mouse stops or a finger lifts, as `Canvas`'s. */
2089
2140
  hideDelay?: number;
2090
2141
  };
2091
2142
  /**
@@ -2541,6 +2592,19 @@ export type DefaultProps = Omit<RootProps, "children"> & {
2541
2592
  * stacked boxes each opened by its heading, or `"tabs"`.
2542
2593
  */
2543
2594
  panelLayout?: PanelLayout;
2595
+ /**
2596
+ * The panel's sections, from Clover's own: with
2597
+ * `["contents", "search", "transcript", "annotations"]` it has those four, each still
2598
+ * only where the resource has data for it, and no panel at all where it has none of
2599
+ * them. Default: every section.
2600
+ */
2601
+ panelSections?: readonly PanelSection[];
2602
+ /**
2603
+ * What a panel section's tab or heading says, in place of Clover's own word for it:
2604
+ * `{ annotations: "Chapters" }`, or a word by language tag to say it in several (the
2605
+ * Panel's `labels`).
2606
+ */
2607
+ panelLabels?: PanelSectionLabels;
2544
2608
  /** The downloads, from a Download button beside the panel's About heading. Default `true`. */
2545
2609
  download?: boolean;
2546
2610
  /**
@@ -2574,7 +2638,7 @@ export type DefaultProps = Omit<RootProps, "children"> & {
2574
2638
  */
2575
2639
  collapseControls?: "auto" | "always";
2576
2640
  };
2577
- declare function Default({ className, header, headingLevel, panel, defaultPanelOpen, panelLayout, download, languages, items, singleItem, storageKey, fill, collapseControls, ...root }: DefaultProps): React.JSX.Element;
2641
+ declare function Default({ className, header, headingLevel, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, items, singleItem, storageKey, fill, collapseControls, ...root }: DefaultProps): React.JSX.Element;
2578
2642
  /**
2579
2643
  * A layout the Viewer draws: one from `@nulib/clover/templates`, or a component of your
2580
2644
  * own that takes the `Clover.Root` props.
package/dist/index.mjs CHANGED
@@ -11,6 +11,7 @@ import { Status } from "./components/Status/Status.mjs";
11
11
  import { Homepage, Id, Metadata, PartOf, Rendering, RequiredStatement, Rights, SeeAlso, Summary, Thumbnail, Value } from "./components/Primitives/Primitives.mjs";
12
12
  import { Logo, Provider } from "./components/Provider/Provider.mjs";
13
13
  import { Panel, Tab } from "./components/Panel/Panel.mjs";
14
+ import { usePanelSections } from "./components/Panel/sections.mjs";
14
15
  import { About } from "./components/Panel/About.mjs";
15
16
  import { Annotations } from "./components/Annotations/Annotations.mjs";
16
17
  import { Transcript } from "./components/Transcript/Transcript.mjs";
@@ -127,6 +128,7 @@ export {
127
128
  useManifest,
128
129
  useNavigation,
129
130
  useOneOpen,
131
+ usePanelSections,
130
132
  useProvider,
131
133
  useSequence,
132
134
  useStatus,
@@ -20,7 +20,7 @@ function isInteractive(target, bodyBox) {
20
20
  var _a;
21
21
  let node = target;
22
22
  while (node && node !== bodyBox) {
23
- if (node instanceof HTMLButtonElement || node instanceof HTMLAnchorElement || node instanceof HTMLInputElement || node instanceof HTMLSelectElement || ((_a = node.dataset) == null ? void 0 : _a.cloverCanvasInteractive) !== void 0) {
23
+ if (node instanceof HTMLButtonElement || node instanceof HTMLAnchorElement || node instanceof HTMLInputElement || node instanceof HTMLLabelElement || node instanceof HTMLSelectElement || ((_a = node.dataset) == null ? void 0 : _a.cloverCanvasInteractive) !== void 0) {
24
24
  return true;
25
25
  }
26
26
  node = node.parentElement;