@nulib/clover 4.4.1 → 4.5.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 (353) hide show
  1. package/README.md +4 -3
  2. package/dist/components/Annotations/Annotations.mjs +11 -5
  3. package/dist/components/Body/Caption.mjs +1 -1
  4. package/dist/components/Canvas/AnnotationMenu.mjs +16 -2
  5. package/dist/components/Canvas/AnnotationState.mjs +27 -23
  6. package/dist/components/Canvas/ControlMenu.mjs +9 -0
  7. package/dist/components/Canvas/PlaceBox.mjs +8 -0
  8. package/dist/components/Canvas/media/Transport.mjs +32 -18
  9. package/dist/components/Items/CountMenu.mjs +13 -1
  10. package/dist/components/Items/Items.mjs +24 -7
  11. package/dist/components/Items/PagerLayout.mjs +1 -0
  12. package/dist/components/Map/MapView.mjs +31 -19
  13. package/dist/components/Panel/About.mjs +16 -5
  14. package/dist/components/Panel/AboutActions.mjs +10 -16
  15. package/dist/components/Panel/LanguageToggle.mjs +69 -0
  16. package/dist/components/Panel/Panel.mjs +9 -1
  17. package/dist/components/Panel/ReadingLanguages.mjs +2 -16
  18. package/dist/components/Panel/sections.mjs +6 -1
  19. package/dist/components/Root/useRootState.mjs +43 -4
  20. package/dist/components/Search/Search.mjs +10 -7
  21. package/dist/components/Transcript/Transcript.mjs +42 -33
  22. package/dist/core/image-service-content.mjs +108 -0
  23. package/dist/core/load.mjs +38 -1
  24. package/dist/core/value.mjs +1 -1
  25. package/dist/i18n/config.mjs +88 -14
  26. package/dist/i18n/direction.mjs +2 -2
  27. package/dist/i18n/languages.mjs +42 -8
  28. package/dist/i18n/locales/index.mjs +4 -1
  29. package/dist/i18n/locales/ja.json.mjs +5 -0
  30. package/dist/i18n/locales/zh-Hans.json.mjs +5 -0
  31. package/dist/i18n/locales/zh-Hant.json.mjs +5 -0
  32. package/dist/index.d.mts +109 -24
  33. package/dist/lib/renderer/CanvasRenderer.mjs +20 -5
  34. package/dist/map/index.d.mts +3 -2
  35. package/dist/react/readingLanguages.mjs +15 -2
  36. package/dist/styles/core.css +1 -1
  37. package/dist/styles/default.css +1 -1
  38. package/dist/styles/items.css +1 -1
  39. package/dist/styles/map.css +1 -1
  40. package/dist/styles/media.css +1 -1
  41. package/dist/styles/panel.css +1 -1
  42. package/dist/styles.css +1 -1
  43. package/dist/templates/default/Default.mjs +3 -0
  44. package/dist/templates/document/Document.mjs +6 -1
  45. package/dist/templates/gallery/Gallery.mjs +2 -0
  46. package/dist/templates/index.d.mts +56 -11
  47. package/dist/templates/shared/LightboxView.mjs +3 -0
  48. package/dist/templates/shared/useDrawer.mjs +14 -2
  49. package/dist/ui/ErrorBoundary.mjs +19 -5
  50. package/dist/ui/FieldPill.mjs +2 -0
  51. package/dist/ui/GlobeGlyph.mjs +26 -0
  52. package/dist/ui/LanguageChoice.mjs +87 -20
  53. package/dist/ui/LanguageMenu.mjs +94 -0
  54. package/dist/ui/Sections.mjs +18 -5
  55. package/dist/ui/Tip.mjs +4 -2
  56. package/dist/ui/sheets/map.mjs +1 -1
  57. package/dist/ui/sheets/media.mjs +1 -1
  58. package/dist/ui/useScrollTrack.mjs +34 -19
  59. package/dist/web-components/About-BklM8JA9.mjs +1 -0
  60. package/dist/web-components/AnnotationItems-4mbvOrhN.mjs +1 -0
  61. package/dist/web-components/AnnotationMenu-DtMaxXf5.mjs +1 -0
  62. package/dist/web-components/AnnotationState-BuEpq99k.mjs +1 -0
  63. package/dist/web-components/Annotations-Dyg-RAdd.mjs +2 -0
  64. package/dist/web-components/{Annotations-oXpa3fvs.mjs → Annotations-oPabBO7j.mjs} +1 -1
  65. package/dist/web-components/{Body-BNLhtQi3.mjs → Body-CD7AtOPv.mjs} +1 -1
  66. package/dist/web-components/{BodyAlert-B0AblEtp.mjs → BodyAlert-DzW4__bK.mjs} +1 -1
  67. package/dist/web-components/{Button-0dU8Owcz.mjs → Button-1To2Pwuz.mjs} +1 -1
  68. package/dist/web-components/{Camera-BS8iIH74.mjs → Camera-B82ZMekU.mjs} +1 -1
  69. package/dist/web-components/{Canvas2DBackend-U4BLi8EN.mjs → Canvas2DBackend-Ds-qoQ0W.mjs} +1 -1
  70. package/dist/web-components/CanvasView-B4fnYim4.mjs +2 -0
  71. package/dist/web-components/{CaptionDetails-CtRzBSwh.mjs → CaptionDetails-TTAEPH02.mjs} +1 -1
  72. package/dist/web-components/{ChaptersMenu-DJRfJSwC.mjs → ChaptersMenu-DhbAktrS.mjs} +1 -1
  73. package/dist/web-components/{Chevron-BJFhP5wm.mjs → Chevron-Br3zRRMX.mjs} +1 -1
  74. package/dist/web-components/{ChoiceMenu-Cfjnk3NG.mjs → ChoiceMenu-B4_doj7b.mjs} +1 -1
  75. package/dist/web-components/{Collection-C2ji8AVd.mjs → Collection-DrMfq53r.mjs} +1 -1
  76. package/dist/web-components/{CollectionSelect-CSTSqjG3.mjs → CollectionSelect-PP7IEcwu.mjs} +1 -1
  77. package/dist/web-components/{Connected-B42WdjMx.mjs → Connected-BOPNEv3j.mjs} +1 -1
  78. package/dist/web-components/{Connected-D2y_qBDh.mjs → Connected-BguZSgy4.mjs} +1 -1
  79. package/dist/web-components/{Connected-C-Ars8eC.mjs → Connected-CN94wOYw.mjs} +1 -1
  80. package/dist/web-components/{Contents-BLbU9Qvc.mjs → Contents-Dn7MutL9.mjs} +1 -1
  81. package/dist/web-components/ControlMenu-DlP3JsqV.mjs +1 -0
  82. package/dist/web-components/ControlsFade-Cuh5Mqe7.mjs +1 -0
  83. package/dist/web-components/CountMenu-Aoott7Hu.mjs +1 -0
  84. package/dist/web-components/Cue-BAj92VWz.mjs +1 -0
  85. package/dist/web-components/Document-BjTWX_7P.mjs +1 -0
  86. package/dist/web-components/{DomLayers-DDRNVemT.mjs → DomLayers-GnBlZ7yI.mjs} +1 -1
  87. package/dist/web-components/{Download-VPFf23Kw.mjs → Download-C1RNBLdn.mjs} +1 -1
  88. package/dist/web-components/{EntryBodies-CKgmBQCk.mjs → EntryBodies-BG4F8uub.mjs} +1 -1
  89. package/dist/web-components/{EntryThumbnail-CgukpUtr.mjs → EntryThumbnail-BJPQwkQw.mjs} +1 -1
  90. package/dist/web-components/FieldPill-CgMPW9BB.mjs +1 -0
  91. package/dist/web-components/{FrameAnimation-C2EFrQl0.mjs → FrameAnimation-DWd0yBuN.mjs} +1 -1
  92. package/dist/web-components/Gallery-DpJqgaft.mjs +1 -0
  93. package/dist/web-components/GlobeGlyph-CLM28n1E.mjs +1 -0
  94. package/dist/web-components/{HideToggle-HVrk9D6t.mjs → HideToggle-C4mW4-CK.mjs} +1 -1
  95. package/dist/web-components/{ImageControls-BsGWsB_S.mjs → ImageControls-B36Hng03.mjs} +1 -1
  96. package/dist/web-components/Items-BApzELFW.mjs +1 -0
  97. package/dist/web-components/Label-CRTQApU-.mjs +1 -0
  98. package/dist/web-components/LanguageChoice-B1941Wuu.mjs +1 -0
  99. package/dist/web-components/LanguageMenu-yWDzK3U0.mjs +1 -0
  100. package/dist/web-components/LightboxView-BLHI5EIj.mjs +1 -0
  101. package/dist/web-components/{ListEnd-BPSaqeEg.mjs → ListEnd-CIiLZZzc.mjs} +1 -1
  102. package/dist/web-components/{Loaded-vg9q9y73.mjs → Loaded-X_Pr53fq.mjs} +1 -1
  103. package/dist/web-components/{LoadedCanvas-BtNg_QnI.mjs → LoadedCanvas-1Bi6-QtF.mjs} +1 -1
  104. package/dist/web-components/LoadedMap-58bpxj_6.mjs +1 -0
  105. package/dist/web-components/{Loading-DnCFXiNy.mjs → Loading-CyoVEwax.mjs} +1 -1
  106. package/dist/web-components/{Map-CIGzy4XB.mjs → Map-2oeDIJzq.mjs} +1 -1
  107. package/dist/web-components/MapView-DX3ZLqmp.mjs +3 -0
  108. package/dist/web-components/{Markup-Csh1bNkq.mjs → Markup-B2GbrisO.mjs} +1 -1
  109. package/dist/web-components/{MediaBody-CRJFBpMk.mjs → MediaBody-DZ9JgkKF.mjs} +1 -1
  110. package/dist/web-components/{MediaBody-CeEWPIDp.mjs → MediaBody-eFAZIyGv.mjs} +1 -1
  111. package/dist/web-components/{NavDate-qoFXy3Ou.mjs → NavDate-BwV4kPl-.mjs} +1 -1
  112. package/dist/web-components/{Navigator-9n2yLQdc.mjs → Navigator-CTrfNuwj.mjs} +1 -1
  113. package/dist/web-components/{Pager-4rZjWBna.mjs → Pager-BGjj90LQ.mjs} +1 -1
  114. package/dist/web-components/PagerLayout-Ce7zW_yB.mjs +1 -0
  115. package/dist/web-components/Panel-77xi6y2C.mjs +1 -0
  116. package/dist/web-components/PanelPart-Cm9VykIu.mjs +1 -0
  117. package/dist/web-components/{PanelToggle-0K2YTp6k.mjs → PanelToggle-Cj_FjIgS.mjs} +1 -1
  118. package/dist/web-components/{PartOfManifest-ZUGZW86B.mjs → PartOfManifest-B0RwR4iy.mjs} +1 -1
  119. package/dist/web-components/{Pending-lpHOVvqE.mjs → Pending-s7yYnZzR.mjs} +1 -1
  120. package/dist/web-components/PlaceBox-pt7Vmrs1.mjs +1 -0
  121. package/dist/web-components/{Placeholder-ChFeaw7a.mjs → Placeholder-BK-eqSCl.mjs} +1 -1
  122. package/dist/web-components/{Position-C2Hm7tJZ.mjs → Position-CKsSKMgZ.mjs} +1 -1
  123. package/dist/web-components/Primitives-T7usOLie.mjs +1 -0
  124. package/dist/web-components/Provider-B2k1G-E0.mjs +1 -0
  125. package/dist/web-components/{ReadMore-DsthjUIZ.mjs → ReadMore-Cs2t9xkI.mjs} +1 -1
  126. package/dist/web-components/Root-D942bSXu.mjs +1 -0
  127. package/dist/web-components/Scene-Cwzisn4E.mjs +1 -0
  128. package/dist/web-components/SceneView-_CNm8cGL.mjs +1 -0
  129. package/dist/web-components/Search-u43mfzT8.mjs +1 -0
  130. package/dist/web-components/Sections-CPU5bGvk.mjs +2 -0
  131. package/dist/web-components/{SeekMarks-DNHLgUaX.mjs → SeekMarks-CnqVS-ym.mjs} +1 -1
  132. package/dist/web-components/StandaloneItems-D9Og9pdI.mjs +1 -0
  133. package/dist/web-components/{Status-DLZANUzF.mjs → Status-Cxev3WuC.mjs} +1 -1
  134. package/dist/web-components/{Steps-BigQvWNW.mjs → Steps-l7_NsIBr.mjs} +1 -1
  135. package/dist/web-components/{TargetItems-DzNzoEeh.mjs → TargetItems-nP3Oa9hh.mjs} +1 -1
  136. package/dist/web-components/Timeline-C1g1MXp5.mjs +1 -0
  137. package/dist/web-components/{Tip-CoSRaKjm.mjs → Tip-D2pR3HW4.mjs} +1 -1
  138. package/dist/web-components/Transcript-D_a9jio-.mjs +1 -0
  139. package/dist/web-components/Transport-CowDRPK7.mjs +1 -0
  140. package/dist/web-components/Transport-uqpqUIKE.mjs +1 -0
  141. package/dist/web-components/{annotation-collection-DwJ2R8tG.mjs → annotation-collection-d6JyHnML.mjs} +1 -1
  142. package/dist/web-components/{annotation-name-2rUtUYsN.mjs → annotation-name-BWTrB9nK.mjs} +1 -1
  143. package/dist/web-components/{annotations-content-fTNYRgN_.mjs → annotations-content-Bomfao_5.mjs} +1 -1
  144. package/dist/web-components/{body-qFClz6nF.mjs → body-Dfn0GJa2.mjs} +1 -1
  145. package/dist/web-components/{canvas-DqmG6v1g.mjs → canvas-DHIn2DIV.mjs} +1 -1
  146. package/dist/web-components/{cloverEngine-BBfVDNbE.mjs → cloverEngine-DDVOcZTv.mjs} +1 -1
  147. package/dist/web-components/{content-state-reader-DYXL5lFa.mjs → content-state-reader-CyNkhTZY.mjs} +1 -1
  148. package/dist/web-components/{controlGlyphs-DqZmaT9n.mjs → controlGlyphs-Dymy1PkA.mjs} +1 -1
  149. package/dist/web-components/{controls-BvC6zo32.mjs → controls-CIkf2UoE.mjs} +1 -1
  150. package/dist/web-components/custom-elements.json +35 -3
  151. package/dist/web-components/downloads-DCsDCcA8.mjs +1 -0
  152. package/dist/web-components/{dragToClose-wFiErDub.mjs → dragToClose-BKcu5guw.mjs} +1 -1
  153. package/dist/web-components/{engine-B0W3FXuQ.mjs → engine-BhdQsvOB.mjs} +1 -1
  154. package/dist/web-components/{engines-DVRUnyFv.mjs → engines-pnfVMoUH.mjs} +1 -1
  155. package/dist/web-components/{fetchManifest-f8gYlPDK.mjs → fetchManifest-QmVIeaHo.mjs} +1 -1
  156. package/dist/web-components/{fromManifest-BmpOsc5g.mjs → fromManifest-CvXwGGRI.mjs} +1 -1
  157. package/dist/web-components/{glyphs-oAgi4Au0.mjs → glyphs-BAh9Lia0.mjs} +1 -1
  158. package/dist/web-components/hooks-CTqjdpYl.mjs +1 -0
  159. package/dist/web-components/{image-layers-CndzdWOW.mjs → image-layers-Dp2qOSA5.mjs} +1 -1
  160. package/dist/web-components/image-service-content-B5ICMeIO.mjs +1 -0
  161. package/dist/web-components/{imageService-DTp1mc0F.mjs → imageService-XKWMYAcG.mjs} +1 -1
  162. package/dist/web-components/index-BuoWCrun.mjs +1 -0
  163. package/dist/web-components/index.mjs +1 -1
  164. package/dist/web-components/items-8ZEJCxWU.mjs +1 -0
  165. package/dist/web-components/items-DjpIYUxD.mjs +1 -0
  166. package/dist/web-components/ja-Cg1enUhM.mjs +1 -0
  167. package/dist/web-components/label-BWHRHAY2.mjs +1 -0
  168. package/dist/web-components/layout-B3HyDCsP.mjs +1 -0
  169. package/dist/web-components/{link-CEfxl5hU.mjs → link-Mnt5GrKM.mjs} +1 -1
  170. package/dist/web-components/logo-YR9jXUE4.mjs +1 -0
  171. package/dist/web-components/{models-B-kri8Ov.mjs → models-NfaX6B8u.mjs} +1 -1
  172. package/dist/web-components/{nodes-BKoxD-el.mjs → nodes-CRrc5Svn.mjs} +1 -1
  173. package/dist/web-components/{overlayImage-Dp8CjA_L.mjs → overlayImage-D7Knsh4X.mjs} +1 -1
  174. package/dist/web-components/{panel-ldBDfuIV.mjs → panel-DUMFdAc8.mjs} +1 -1
  175. package/dist/web-components/part-C_V28rvN.mjs +1 -0
  176. package/dist/web-components/{playerSurface-CLWTmyt1.mjs → playerSurface-CF5g-4Po.mjs} +1 -1
  177. package/dist/web-components/pointer-PJLHbbSD.mjs +1 -0
  178. package/dist/web-components/{provider-D24Pm3a1.mjs → provider-b4id5kCa.mjs} +1 -1
  179. package/dist/web-components/{range-regions-9vY5ikPm.mjs → range-regions-DCY76ydS.mjs} +1 -1
  180. package/dist/web-components/{read-more-CoOeWZOF.mjs → read-more-UM90-AEc.mjs} +1 -1
  181. package/dist/web-components/readingLanguages-Qdn21-7Q.mjs +1 -0
  182. package/dist/web-components/rendererSurface-PZlq-wa_.mjs +22 -0
  183. package/dist/web-components/{renderers-BXcv_AqV.mjs → renderers-DIHonXTq.mjs} +1 -1
  184. package/dist/web-components/resource-BlU2Ese6.mjs +1 -0
  185. package/dist/web-components/{save-file-Dj3MRR7Y.mjs → save-file-GI0ekTmd.mjs} +1 -1
  186. package/dist/web-components/{search-C9OyY1qk.mjs → search-CHjjiXkB.mjs} +1 -1
  187. package/dist/web-components/shared-DgJ0bXca.mjs +1 -0
  188. package/dist/web-components/{show-link-4mlfdoeo.mjs → show-link-BlLkTYtm.mjs} +1 -1
  189. package/dist/web-components/{sizedImage-COfCkv_8.mjs → sizedImage-BoGT1x5n.mjs} +1 -1
  190. package/dist/web-components/{split-Ci426kxC.mjs → split-OO6-WiG3.mjs} +1 -1
  191. package/dist/web-components/{status-CzasXLV8.mjs → status-CSenPCO4.mjs} +1 -1
  192. package/dist/web-components/styles-Bvw9LFU7.mjs +1 -0
  193. package/dist/web-components/three.mjs +1 -1
  194. package/dist/web-components/{thumbnail-ByuoouMG.mjs → thumbnail-DYJHCrW_.mjs} +1 -1
  195. package/dist/web-components/{tip-CQEGLOst.mjs → tip-Dr1mfd4o.mjs} +1 -1
  196. package/dist/web-components/{toggle-Dro_EmUU.mjs → toggle-86lqpaU9.mjs} +1 -1
  197. package/dist/web-components/{useContainerName-CUP-TlA5.mjs → useContainerName-BfNL6p3O.mjs} +1 -1
  198. package/dist/web-components/{useControlsVisibility-DeI3NHWp.mjs → useControlsVisibility-C3LCnrb7.mjs} +1 -1
  199. package/dist/web-components/useNearViewport-Dk5q1rzk.mjs +1 -0
  200. package/dist/web-components/useScrollTrack-B_yYmQDS.mjs +1 -0
  201. package/dist/web-components/viewer/{AnnotationItems-ByWBkMRd.mjs → AnnotationItems-BbPnS9EE.mjs} +1 -1
  202. package/dist/web-components/viewer/AnnotationMenu-BGv-HimF.mjs +1 -0
  203. package/dist/web-components/viewer/AnnotationState-uRm7bEwg.mjs +1 -0
  204. package/dist/web-components/viewer/{Annotations-CJRF_IwO.mjs → Annotations-_2PMmUfu.mjs} +1 -1
  205. package/dist/web-components/viewer/Annotations-reaO1ILe.mjs +2 -0
  206. package/dist/web-components/viewer/{Canvas2DBackend-DPDF0a8D.mjs → Canvas2DBackend-Dru1ImJh.mjs} +1 -1
  207. package/dist/web-components/viewer/CaptionDetails-3OlEaKmX.mjs +1 -0
  208. package/dist/web-components/viewer/{ChaptersMenu-D7b9t6bm.mjs → ChaptersMenu-kchuXDZy.mjs} +1 -1
  209. package/dist/web-components/viewer/{ChoiceMenu-f2774ZaY.mjs → ChoiceMenu-C8pEoSC6.mjs} +1 -1
  210. package/dist/web-components/viewer/{Collection-D1E6A8es.mjs → Collection-B4LN_80C.mjs} +1 -1
  211. package/dist/web-components/viewer/{Connected-BLeqNIOf.mjs → Connected-80hCJuhg.mjs} +1 -1
  212. package/dist/web-components/viewer/{Connected-DfqFYcTn.mjs → Connected-CzPY2rgu.mjs} +1 -1
  213. package/dist/web-components/viewer/{Contents-DvmP8OGy.mjs → Contents-D4jw_lGe.mjs} +1 -1
  214. package/dist/web-components/viewer/ControlMenu-C3Jh10iR.mjs +1 -0
  215. package/dist/web-components/viewer/ControlsFade-BKkJ95B5.mjs +1 -0
  216. package/dist/web-components/viewer/CountMenu-Blz1oHgs.mjs +1 -0
  217. package/dist/web-components/viewer/Cue-BnC9XuZp.mjs +1 -0
  218. package/dist/web-components/viewer/Document-BG0F97nL.mjs +1 -0
  219. package/dist/web-components/viewer/{DomLayers-CD56oMcR.mjs → DomLayers-BL6vNcmI.mjs} +1 -1
  220. package/dist/web-components/viewer/{Download-DAOzY3Nu.mjs → Download-B0BD_SzR.mjs} +1 -1
  221. package/dist/web-components/viewer/{EntryBodies-0A0uyEwC.mjs → EntryBodies-Cbmr-Eg4.mjs} +1 -1
  222. package/dist/web-components/viewer/{EntryThumbnail-fBaBZJGd.mjs → EntryThumbnail-DAdEyIuL.mjs} +1 -1
  223. package/dist/web-components/viewer/FieldPill-DNL96sDW.mjs +1 -0
  224. package/dist/web-components/viewer/{FrameAnimation-kba5V4Vk.mjs → FrameAnimation-BO3QVSUw.mjs} +1 -1
  225. package/dist/web-components/viewer/Gallery-DN7ajF4i.mjs +1 -0
  226. package/dist/web-components/viewer/GlobeGlyph-B-Wd0AkW.mjs +1 -0
  227. package/dist/web-components/viewer/{HideToggle-D8c_7URN.mjs → HideToggle-DH0u1wFC.mjs} +1 -1
  228. package/dist/web-components/viewer/{ImageControls-C_C0LSj7.mjs → ImageControls-Lz-ESk1X.mjs} +1 -1
  229. package/dist/web-components/viewer/LanguageChoice-BkQkSsPE.mjs +1 -0
  230. package/dist/web-components/viewer/LanguageMenu-gIJHQiBc.mjs +1 -0
  231. package/dist/web-components/viewer/LightboxView-D066VR5m.mjs +1 -0
  232. package/dist/web-components/viewer/{ListEnd-B2hnHrcl.mjs → ListEnd-D4nNouKZ.mjs} +1 -1
  233. package/dist/web-components/viewer/{MapView-Cr3RiB1K.mjs → MapView-C_8iciAK.mjs} +3 -3
  234. package/dist/web-components/viewer/{MediaBody-4ZFKNnr3.mjs → MediaBody-BgBDbfHg.mjs} +1 -1
  235. package/dist/web-components/viewer/{MediaBody-xjpo27Vw.mjs → MediaBody-D4hiLqhm.mjs} +1 -1
  236. package/dist/web-components/viewer/{NavDate-Dz5eW2XY.mjs → NavDate-BMVT6UwB.mjs} +1 -1
  237. package/dist/web-components/viewer/{Navigator-DNZcaADs.mjs → Navigator-DbBBbDZn.mjs} +1 -1
  238. package/dist/web-components/viewer/PagerLayout-D771pC5E.mjs +1 -0
  239. package/dist/web-components/viewer/PanelPart-2H7jd6PS.mjs +1 -0
  240. package/dist/web-components/viewer/{PartOfManifest-BHpVLJOn.mjs → PartOfManifest-BMaH_tsn.mjs} +1 -1
  241. package/dist/web-components/viewer/PlaceBox-OytRM9_s.mjs +1 -0
  242. package/dist/web-components/viewer/{Placeholder-CLITKdu6.mjs → Placeholder-BWuq47Sw.mjs} +1 -1
  243. package/dist/web-components/viewer/Search-Bmz7mUbA.mjs +1 -0
  244. package/dist/web-components/viewer/{SeekMarks-B8cuyVgz.mjs → SeekMarks-CAsMUj2N.mjs} +1 -1
  245. package/dist/web-components/viewer/{StandaloneItems-Cu0aBqAo.mjs → StandaloneItems-BCHhR9sF.mjs} +1 -1
  246. package/dist/web-components/viewer/{Steps-DqszSHcR.mjs → Steps-BDT2W9QN.mjs} +1 -1
  247. package/dist/web-components/viewer/{TargetItems-DN8ebfbK.mjs → TargetItems-CkZbD8GE.mjs} +1 -1
  248. package/dist/web-components/viewer/Transcript-BbFXEJSc.mjs +1 -0
  249. package/dist/web-components/viewer/Transport-CI5UkA3K.mjs +1 -0
  250. package/dist/web-components/viewer/Transport-PgBpf33S.mjs +1 -0
  251. package/dist/web-components/viewer/{annotation-collection-Drwfws4R.mjs → annotation-collection-l4zuf56A.mjs} +1 -1
  252. package/dist/web-components/viewer/{annotation-name-Bp2GHdpi.mjs → annotation-name-CRl0w7NR.mjs} +1 -1
  253. package/dist/web-components/viewer/annotations-content-CYjPRTZn.mjs +1 -0
  254. package/dist/web-components/viewer/{cloverEngine-BmUppb5Y.mjs → cloverEngine-2b_guC4P.mjs} +2 -2
  255. package/dist/web-components/viewer/{content-state-reader-B9u1vc3t.mjs → content-state-reader-Cm-rvusT.mjs} +1 -1
  256. package/dist/web-components/viewer/{dragToClose-C9KwbQpA.mjs → dragToClose-DXXIWV62.mjs} +1 -1
  257. package/dist/web-components/viewer/{fetchManifest-gl9fyg7D.mjs → fetchManifest-DorkDXGC.mjs} +1 -1
  258. package/dist/web-components/viewer/{host-D3tVEhAD.mjs → host-DscGC2S0.mjs} +1 -1
  259. package/dist/web-components/viewer/{image-layers-DSehEFmU.mjs → image-layers-CZ9-efD2.mjs} +1 -1
  260. package/dist/web-components/viewer/image-service-content-C60w8IZm.mjs +1 -0
  261. package/dist/web-components/viewer/index.mjs +1 -1
  262. package/dist/web-components/viewer/{link-BYKFtAno.mjs → link-CysSctMX.mjs} +1 -1
  263. package/dist/web-components/viewer/overlayImage-CwPnVnIi.mjs +1 -0
  264. package/dist/web-components/viewer/{range-regions-CEM4sQKi.mjs → range-regions-C7ZBtSyb.mjs} +1 -1
  265. package/dist/web-components/viewer/{renderers-BiDrFLxn.mjs → renderers-D4wJiQYv.mjs} +1 -1
  266. package/dist/web-components/viewer/{save-file-CzYUFJNg.mjs → save-file-uqsNOVPU.mjs} +1 -1
  267. package/dist/web-components/viewer/{search-Dr6AQ3Lb.mjs → search-CWuD5EZA.mjs} +1 -1
  268. package/dist/web-components/viewer/styles-BjjJM8OS.mjs +1 -0
  269. package/dist/web-components/viewer/{useControlsVisibility-CP5m7oBd.mjs → useControlsVisibility-KTxa_3yJ.mjs} +1 -1
  270. package/dist/web-components/viewer/viewer-C3d_TgAI.mjs +29 -0
  271. package/dist/web-components/viewer/{vtt-CDqR3lHn.mjs → vtt-DqtJ20x0.mjs} +1 -1
  272. package/dist/web-components/viewer-BoyWG64n.mjs +1 -0
  273. package/dist/web-components/{vtt-DHZRkZ_P.mjs → vtt-BNuRzGap.mjs} +1 -1
  274. package/dist/web-components/zh-Hans-DnYm6PWu.mjs +1 -0
  275. package/dist/web-components/zh-Hant-DsxnuLPZ.mjs +1 -0
  276. package/package.json +1 -1
  277. package/dist/web-components/About-DgBOPS3N.mjs +0 -1
  278. package/dist/web-components/AnnotationItems-CBEb7Cew.mjs +0 -1
  279. package/dist/web-components/AnnotationMenu-DiQyu45i.mjs +0 -1
  280. package/dist/web-components/AnnotationState-DemGGP7N.mjs +0 -1
  281. package/dist/web-components/Annotations-CDVyd69_.mjs +0 -2
  282. package/dist/web-components/CanvasView-DeM04pm-.mjs +0 -2
  283. package/dist/web-components/ControlMenu-CJtszzgx.mjs +0 -1
  284. package/dist/web-components/ControlsFade-Pye8AyCz.mjs +0 -1
  285. package/dist/web-components/CountMenu-3-t8974M.mjs +0 -1
  286. package/dist/web-components/Cue-eTms5gbr.mjs +0 -1
  287. package/dist/web-components/Document-CkKoLQ51.mjs +0 -1
  288. package/dist/web-components/FieldPill-M9u0eLtz.mjs +0 -1
  289. package/dist/web-components/Gallery-mqXXjGtK.mjs +0 -1
  290. package/dist/web-components/Items-BoFm0Hlx.mjs +0 -1
  291. package/dist/web-components/Label-GTBsGDCC.mjs +0 -1
  292. package/dist/web-components/LanguageChoice-BEiskuVG.mjs +0 -1
  293. package/dist/web-components/LightboxView-Daz0RCee.mjs +0 -1
  294. package/dist/web-components/LoadedMap-D9Z3zl12.mjs +0 -1
  295. package/dist/web-components/MapView-CExlNO5E.mjs +0 -3
  296. package/dist/web-components/PagerLayout-l6UNSoQ1.mjs +0 -1
  297. package/dist/web-components/Panel-ikILE92M.mjs +0 -1
  298. package/dist/web-components/PanelPart-VPAwSoQZ.mjs +0 -1
  299. package/dist/web-components/PlaceBox-D73C--SU.mjs +0 -1
  300. package/dist/web-components/Primitives-CBRreXtS.mjs +0 -1
  301. package/dist/web-components/Provider-HPVBNZPr.mjs +0 -1
  302. package/dist/web-components/Root-BJwk-F1e.mjs +0 -1
  303. package/dist/web-components/Scene-DC7ofvsK.mjs +0 -1
  304. package/dist/web-components/SceneView-C53yZtMZ.mjs +0 -1
  305. package/dist/web-components/Search-Cd0xLU3y.mjs +0 -1
  306. package/dist/web-components/Sections-Cf3JDxnz.mjs +0 -2
  307. package/dist/web-components/StandaloneItems-DEchYe7Y.mjs +0 -1
  308. package/dist/web-components/Timeline--uq4-_TD.mjs +0 -1
  309. package/dist/web-components/Transcript-Dex719tP.mjs +0 -1
  310. package/dist/web-components/Transport-BV0Rg5Ym.mjs +0 -1
  311. package/dist/web-components/Transport-CHkvmPbN.mjs +0 -1
  312. package/dist/web-components/downloads-CFz0RnMz.mjs +0 -1
  313. package/dist/web-components/hooks-uer3ZRx7.mjs +0 -1
  314. package/dist/web-components/index-BkADsP3U.mjs +0 -1
  315. package/dist/web-components/items-BWG13qDG.mjs +0 -1
  316. package/dist/web-components/items-SD92pRMN.mjs +0 -1
  317. package/dist/web-components/label-Bw9SwLh8.mjs +0 -1
  318. package/dist/web-components/layout-DrVnUBcm.mjs +0 -1
  319. package/dist/web-components/logo-Dzr2M4F7.mjs +0 -1
  320. package/dist/web-components/part-dr-d1XPo.mjs +0 -1
  321. package/dist/web-components/pointer-IZcH8rZy.mjs +0 -1
  322. package/dist/web-components/readingLanguages-Bd4MD2DP.mjs +0 -1
  323. package/dist/web-components/rendererSurface-Ox625xUL.mjs +0 -22
  324. package/dist/web-components/resource-DmK-8hJ-.mjs +0 -1
  325. package/dist/web-components/shared-BmkV0s_d.mjs +0 -1
  326. package/dist/web-components/styles-On1ck1Ob.mjs +0 -1
  327. package/dist/web-components/useNearViewport-yyUYq47j.mjs +0 -1
  328. package/dist/web-components/useScrollTrack-CcFLYR4o.mjs +0 -1
  329. package/dist/web-components/viewer/AnnotationMenu-C-9tbH4G.mjs +0 -1
  330. package/dist/web-components/viewer/AnnotationState-CV4g-WUB.mjs +0 -1
  331. package/dist/web-components/viewer/Annotations-t1K8U5Kp.mjs +0 -2
  332. package/dist/web-components/viewer/CaptionDetails-xzvdqP5N.mjs +0 -1
  333. package/dist/web-components/viewer/ControlMenu-DIfN3xYJ.mjs +0 -1
  334. package/dist/web-components/viewer/ControlsFade-sckPhZ4x.mjs +0 -1
  335. package/dist/web-components/viewer/CountMenu-BQVCtVfu.mjs +0 -1
  336. package/dist/web-components/viewer/Cue-DQ8q-fgb.mjs +0 -1
  337. package/dist/web-components/viewer/Document-B-nJpfDh.mjs +0 -1
  338. package/dist/web-components/viewer/FieldPill-BQcDb4xM.mjs +0 -1
  339. package/dist/web-components/viewer/Gallery-_0dEBq2w.mjs +0 -1
  340. package/dist/web-components/viewer/LanguageChoice-0UWQ5V-y.mjs +0 -1
  341. package/dist/web-components/viewer/LightboxView-Dnlf7m8l.mjs +0 -1
  342. package/dist/web-components/viewer/PagerLayout-PYWFPFSJ.mjs +0 -1
  343. package/dist/web-components/viewer/PanelPart-Bd0JqUwF.mjs +0 -1
  344. package/dist/web-components/viewer/PlaceBox-Bh9V3RLS.mjs +0 -1
  345. package/dist/web-components/viewer/Search-C0B5Jh9V.mjs +0 -1
  346. package/dist/web-components/viewer/Transcript-D3mKmdQY.mjs +0 -1
  347. package/dist/web-components/viewer/Transport-9f_lhebG.mjs +0 -1
  348. package/dist/web-components/viewer/Transport-BudReE7Y.mjs +0 -1
  349. package/dist/web-components/viewer/annotations-content-Ci-orrao.mjs +0 -1
  350. package/dist/web-components/viewer/overlayImage-CdgpMutd.mjs +0 -1
  351. package/dist/web-components/viewer/styles-DvZTMHkr.mjs +0 -1
  352. package/dist/web-components/viewer/viewer-DaG51iO3.mjs +0 -29
  353. package/dist/web-components/viewer-DeAUI9Fi.mjs +0 -1
@@ -183,8 +183,9 @@ export interface ContentStateOutput {
183
183
  * state (JSON or base64url). The resource may be a Manifest, a Collection (its first
184
184
  * Manifest is shown), a lone Canvas (its `partOf` Manifest, or a Manifest made around
185
185
  * it), or annotations, an AnnotationPage or AnnotationCollection (the Manifest their first
186
- * annotation's Canvas is `partOf`, at that Canvas). Everything is fetched once, with the
187
- * request settings, and upgraded to Presentation 4.
186
+ * annotation's Canvas is `partOf`, at that Canvas). It may also be a IIIF Image service,
187
+ * its `info.json` or its base URI, shown as the one image it is (`imageServiceContent`).
188
+ * Everything is fetched once, with the request settings, and upgraded to Presentation 4.
188
189
  */
189
190
  export type IIIFContent = string | Record<string, unknown>;
190
191
  /**
@@ -372,6 +373,11 @@ export interface CloverCanvasOptions {
372
373
  maxZoomPixelRatio?: number;
373
374
  /** Smallest zoom, as a fraction of the home zoom. Default 0.9. */
374
375
  minZoomImageRatio?: number;
376
+ /**
377
+ * Whether home may enlarge the image past `maxZoomPixelRatio` to fill the box. False,
378
+ * home stops at that zoom and centers the image, smaller than the box. Default true.
379
+ */
380
+ upscale?: boolean;
375
381
  /** Seconds for an animation to close most of its distance. 0 disables easing. */
376
382
  animationTime?: number;
377
383
  /**
@@ -462,6 +468,12 @@ export interface ItemsProps extends Omit<React.HTMLAttributes<HTMLElement>, "onS
462
468
  * under the one above it, still in reading order, left to right.
463
469
  */
464
470
  layout?: ItemsLayout;
471
+ /**
472
+ * The slider's direction: a row (`horizontal`), or a column (`vertical`) that fills
473
+ * the height of what holds it, as a filmstrip beside the Body, its pictures as wide as
474
+ * the column. Default `"horizontal"`.
475
+ */
476
+ orientation?: "horizontal" | "vertical";
465
477
  /**
466
478
  * The line under an item's label, where it has one (a Collection's members do): its
467
479
  * `summary` (the default), its `navDate`, or `none`. Default `"summary"`.
@@ -545,7 +557,7 @@ export type PanelSection = "about" | "targets" | "collection" | "contents" | "se
545
557
  /** How the sections are laid out. */
546
558
  export type SectionsLayout = "tabs" | "accordion";
547
559
  /**
548
- * What a page calls a section, in place of Clover's own word for it: its words, taken to
560
+ * What a page calls a section, in place of its word in Clover's interface language: its words, taken to
549
561
  * be in the page's language, or its words by language tag, one of which the tab carries
550
562
  * as its `lang` where it is not the page's (WCAG 3.1.2).
551
563
  */
@@ -601,6 +613,13 @@ export interface PanelProps extends Omit<React.HTMLAttributes<HTMLElement>, "def
601
613
  * leaves the choice out, and the Root reads in its `language`, else the reader's.
602
614
  */
603
615
  languages?: boolean;
616
+ /**
617
+ * Whether About's language toggle also offers Clover's interface languages (its
618
+ * control labels, section titles and announcements) that the resource has none of: the
619
+ * visitor's and the site's, where they differ, one choice for the page. Default
620
+ * `true`; `false` leaves them out, and Clover speaks the visitor's.
621
+ */
622
+ interfaceLanguages?: boolean;
604
623
  /**
605
624
  * Which of the default sections the panel may have, in Clover's own order: with
606
625
  * `["contents", "search"]` it has those two and no About. Each still shows only where
@@ -609,7 +628,7 @@ export interface PanelProps extends Omit<React.HTMLAttributes<HTMLElement>, "def
609
628
  */
610
629
  sections?: readonly PanelSection[];
611
630
  /**
612
- * What a default section's tab or heading says, in place of Clover's own word for it:
631
+ * What a default section's tab or heading says, in place of its word in Clover's interface language:
613
632
  * `{ annotations: "Chapters" }`, or `{ annotations: { en: "Chapters", de: "Kapitel" } }`
614
633
  * to say it in several, read in the one Clover speaks and marked with its language
615
634
  * where that is not the page's (WCAG 3.1.2). A `Tab` of your own says it in `label`.
@@ -654,7 +673,7 @@ export type DefaultProps = Omit<RootProps, "children"> & {
654
673
  */
655
674
  panelSections?: readonly PanelSection[];
656
675
  /**
657
- * What a panel section's tab or heading says, in place of Clover's own word for it:
676
+ * What a panel section's tab or heading says, in place of its word in Clover's interface language:
658
677
  * `{ annotations: "Chapters" }`, or a word by language tag to say it in several (the
659
678
  * Panel's `labels`).
660
679
  */
@@ -666,6 +685,13 @@ export type DefaultProps = Omit<RootProps, "children"> & {
666
685
  * it says of itself comes in several (the Panel's `languages`). Default `true`.
667
686
  */
668
687
  languages?: boolean;
688
+ /**
689
+ * Default, Document and Gallery: whether the panel's language toggle, beside its About
690
+ * heading, also offers Clover's interface languages (its control labels, section
691
+ * titles and announcements) that the resource has none of, the visitor's and the
692
+ * site's, where they differ (the Panel's `interfaceLanguages`). Default `true`.
693
+ */
694
+ interfaceLanguages?: boolean;
669
695
  /** The thumbnails under the Body: a layout, or `false` for none. Default `slider`. */
670
696
  items?: Exclude<ItemsLayout, "pager"> | false;
671
697
  /**
@@ -706,7 +732,7 @@ export type DefaultProps = Omit<RootProps, "children"> & {
706
732
  * uncovered: a click there, Escape or the panel's close button puts it away. Size it with
707
733
  * `--clover-body-height`.
708
734
  */
709
- export declare function Default({ className, header, headingLevel, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, items, singleItem, storageKey, fill, collapseControls, canvasOptions, ...root }: DefaultProps): React.JSX.Element;
735
+ export declare function Default({ className, header, headingLevel, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, interfaceLanguages, items, singleItem, storageKey, fill, collapseControls, canvasOptions, ...root }: DefaultProps): React.JSX.Element;
710
736
  export type DocumentProps = Omit<RootProps, "children"> & {
711
737
  /**
712
738
  * Whether the page thumbnails start shown beside the page. Default `true`. On a phone,
@@ -736,7 +762,7 @@ export type DocumentProps = Omit<RootProps, "children"> & {
736
762
  */
737
763
  panelSections?: readonly PanelSection[];
738
764
  /**
739
- * What a panel section's tab or heading says, in place of Clover's own word for it:
765
+ * What a panel section's tab or heading says, in place of its word in Clover's interface language:
740
766
  * `{ annotations: "Chapters" }`, or a word by language tag to say it in several (the
741
767
  * Panel's `labels`).
742
768
  */
@@ -748,6 +774,13 @@ export type DocumentProps = Omit<RootProps, "children"> & {
748
774
  * it says of itself comes in several (the Panel's `languages`). Default `true`.
749
775
  */
750
776
  languages?: boolean;
777
+ /**
778
+ * Default, Document and Gallery: whether the panel's language toggle, beside its About
779
+ * heading, also offers Clover's interface languages (its control labels, section
780
+ * titles and announcements) that the resource has none of, the visitor's and the
781
+ * site's, where they differ (the Panel's `interfaceLanguages`). Default `true`.
782
+ */
783
+ interfaceLanguages?: boolean;
751
784
  /**
752
785
  * The title's heading level, to fit the outline of the page around the layout (under
753
786
  * an `h2`, 3). The panel's sections, and the downloads' groups, are a level below
@@ -777,7 +810,7 @@ export type DocumentProps = Omit<RootProps, "children"> & {
777
810
  * where there is room for both, and slides out over the page where there is not. Size
778
811
  * it with `--clover-template-document-height`.
779
812
  */
780
- export declare function Document({ className, defaultSidebarOpen, singleItem, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, headingLevel, storageKey, collapseControls, canvasOptions, ...root }: DocumentProps): React.JSX.Element;
813
+ export declare function Document({ className, defaultSidebarOpen, singleItem, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, interfaceLanguages, headingLevel, storageKey, collapseControls, canvasOptions, ...root }: DocumentProps): React.JSX.Element;
781
814
  export type GalleryProps = Omit<RootProps, "children"> & {
782
815
  /** The size of a grid cell. Default `10rem`, through `--clover-items-size`. */
783
816
  size?: string;
@@ -832,7 +865,7 @@ export type GalleryProps = Omit<RootProps, "children"> & {
832
865
  */
833
866
  panelSections?: readonly PanelSection[];
834
867
  /**
835
- * What a panel section's tab or heading says, in place of Clover's own word for it:
868
+ * What a panel section's tab or heading says, in place of its word in Clover's interface language:
836
869
  * `{ annotations: "Chapters" }`, or a word by language tag to say it in several (the
837
870
  * Panel's `labels`).
838
871
  */
@@ -844,6 +877,13 @@ export type GalleryProps = Omit<RootProps, "children"> & {
844
877
  * it says of itself comes in several (the Panel's `languages`). Default `true`.
845
878
  */
846
879
  languages?: boolean;
880
+ /**
881
+ * Default, Document and Gallery: whether the panel's language toggle, beside its About
882
+ * heading, also offers Clover's interface languages (its control labels, section
883
+ * titles and announcements) that the resource has none of, the visitor's and the
884
+ * site's, where they differ (the Panel's `interfaceLanguages`). Default `true`.
885
+ */
886
+ interfaceLanguages?: boolean;
847
887
  /**
848
888
  * Where the panel's width is remembered once the reader drags its bar
849
889
  * (`localStorage`). Default `"clover-template-gallery"`; `false` forgets it.
@@ -870,7 +910,7 @@ export type GalleryProps = Omit<RootProps, "children"> & {
870
910
  * shows that Manifest in the lightbox. Escape, the close button, or a press outside
871
911
  * closes it, and focus returns to the cell.
872
912
  */
873
- export declare function Gallery({ className, size, height, gap, items, secondary, summary, lightboxItems, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, storageKey, headingLevel, collapseControls, canvasOptions, style, ...root }: GalleryProps): React.JSX.Element;
913
+ export declare function Gallery({ className, size, height, gap, items, secondary, summary, lightboxItems, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, interfaceLanguages, storageKey, headingLevel, collapseControls, canvasOptions, style, ...root }: GalleryProps): React.JSX.Element;
874
914
  /**
875
915
  * Focus that follows a control as it moves. A toggle drawn in one place while its pane is
876
916
  * open and in another while it is shut is a new element after every press, and the one
@@ -955,6 +995,7 @@ export declare function usePanelPane({ id, beside, defaultOpen, side, followFocu
955
995
  onFocus: (event: React.SyntheticEvent) => void;
956
996
  };
957
997
  pane: React.RefObject<HTMLElement | null>;
998
+ main: React.RefObject<HTMLElement | null>;
958
999
  over: boolean;
959
1000
  open: boolean;
960
1001
  shown: boolean;
@@ -1025,6 +1066,8 @@ export interface DrawerOptions {
1025
1066
  */
1026
1067
  export declare function useDrawer({ id, beside: measured, defaultOpen, side, focus, slides, alongside, followFocus, }: DrawerOptions): {
1027
1068
  pane: React.RefObject<HTMLElement | null>;
1069
+ /** The page's pane it covers, inert while it is open over the page: the layout's `ref`. */
1070
+ main: React.RefObject<HTMLElement | null>;
1028
1071
  /** Over the page, where there is no room beside it. */
1029
1072
  over: boolean;
1030
1073
  open: boolean;
@@ -1102,7 +1145,7 @@ export interface LightboxProps {
1102
1145
  */
1103
1146
  panelSections?: readonly PanelSection[];
1104
1147
  /**
1105
- * What a panel section's tab or heading says, in place of Clover's own word for it:
1148
+ * What a panel section's tab or heading says, in place of its word in Clover's interface language:
1106
1149
  * `{ annotations: "Chapters" }`, or a word by language tag to say it in several (the
1107
1150
  * Panel's `labels`).
1108
1151
  */
@@ -1111,6 +1154,8 @@ export interface LightboxProps {
1111
1154
  download?: boolean;
1112
1155
  /** The languages to read the resource in, beside the panel's About heading. Default `true`. */
1113
1156
  languages?: boolean;
1157
+ /** Clover's interface languages in the panel's language toggle. Default `true`. */
1158
+ interfaceLanguages?: boolean;
1114
1159
  /** Where the panel's width is remembered once dragged; `false` forgets it. */
1115
1160
  storageKey?: string | false;
1116
1161
  /** The Body's `collapseControls`: when the view's controls collapse behind one button. */
@@ -20,6 +20,7 @@ function LightboxView({
20
20
  panelLabels,
21
21
  download = true,
22
22
  languages = true,
23
+ interfaceLanguages = true,
23
24
  storageKey,
24
25
  collapseControls,
25
26
  canvasOptions,
@@ -75,6 +76,7 @@ function LightboxView({
75
76
  /* @__PURE__ */ jsxs(
76
77
  SplitPane,
77
78
  {
79
+ ref: pane.main,
78
80
  className: "clover-template-lightbox-main",
79
81
  min: panel && pane.over ? void 0 : PAGE_MIN,
80
82
  children: [
@@ -115,6 +117,7 @@ function LightboxView({
115
117
  labels: panelLabels,
116
118
  download,
117
119
  languages,
120
+ interfaceLanguages,
118
121
  headingLevel: (headingLevel ?? 3) + 1
119
122
  }
120
123
  )
@@ -16,6 +16,7 @@ function useDrawer({
16
16
  var _a, _b;
17
17
  const pane = useRef(null);
18
18
  const scrim = useRef(null);
19
+ const main = useRef(null);
19
20
  const over = measured === false;
20
21
  const [openBeside, setOpenBeside] = useState(defaultOpen);
21
22
  const [openOver, setOpenOver] = useState(false);
@@ -23,9 +24,10 @@ function useDrawer({
23
24
  const toggle = () => document.querySelector(`button[aria-controls~="${id}"]`);
24
25
  const follow = () => followFocus(toggle);
25
26
  const handBack = () => {
26
- var _a2, _b2;
27
+ var _a2, _b2, _c;
27
28
  if (!((_a2 = pane.current) == null ? void 0 : _a2.contains(document.activeElement))) return;
28
- (_b2 = toggle()) == null ? void 0 : _b2.focus();
29
+ (_b2 = main.current) == null ? void 0 : _b2.removeAttribute("inert");
30
+ (_c = toggle()) == null ? void 0 : _c.focus();
29
31
  follow();
30
32
  };
31
33
  const tries = useRef(0);
@@ -61,6 +63,14 @@ function useDrawer({
61
63
  const sliding = slides && over;
62
64
  const shown = sliding ? slide.mounted : open;
63
65
  const opened = sliding ? slide.open : open;
66
+ const covering = over && opened;
67
+ useIsomorphicLayoutEffect(() => {
68
+ const element = main.current;
69
+ if (!element) return;
70
+ if (covering) element.setAttribute("inert", "");
71
+ else element.removeAttribute("inert");
72
+ return () => element.removeAttribute("inert");
73
+ }, [covering]);
64
74
  useEffect(() => {
65
75
  if (!tries.current || !pane.current) return;
66
76
  tries.current -= 1;
@@ -78,6 +88,8 @@ function useDrawer({
78
88
  });
79
89
  return {
80
90
  pane,
91
+ /** The page's pane it covers, inert while it is open over the page: the layout's `ref`. */
92
+ main,
81
93
  /** Over the page, where there is no room beside it. */
82
94
  over,
83
95
  open,
@@ -2,8 +2,10 @@
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- import { jsxs, jsx } from "react/jsx-runtime";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import React from "react";
7
+ import { languageProps } from "../i18n/direction.mjs";
8
+ import { useCloverTranslation } from "../i18n/useCloverTranslation.mjs";
7
9
  class ErrorBoundary extends React.Component {
8
10
  constructor() {
9
11
  super(...arguments);
@@ -15,12 +17,24 @@ class ErrorBoundary extends React.Component {
15
17
  render() {
16
18
  const { error } = this.state;
17
19
  if (!error) return this.props.children;
18
- return /* @__PURE__ */ jsxs("div", { className: "clover-canvas-error", role: "alert", lang: "en", children: [
19
- /* @__PURE__ */ jsx("p", { className: "clover-canvas-error-headline", "data-testid": "headline", children: "Something went wrong" }),
20
- error.message && /* @__PURE__ */ jsx("span", { className: "clover-canvas-error-body", children: `Error message: ${error.message}` })
21
- ] });
20
+ return /* @__PURE__ */ jsx(Fallen, { error });
22
21
  }
23
22
  }
23
+ function Fallen({ error }) {
24
+ const { t, langOf } = useCloverTranslation();
25
+ return /* @__PURE__ */ jsxs("div", { className: "clover-canvas-error", role: "alert", children: [
26
+ /* @__PURE__ */ jsx(
27
+ "p",
28
+ {
29
+ className: "clover-canvas-error-headline",
30
+ "data-testid": "headline",
31
+ ...languageProps(langOf("statusError")),
32
+ children: t("statusError")
33
+ }
34
+ ),
35
+ error.message && /* @__PURE__ */ jsx("span", { className: "clover-canvas-error-body", lang: "en", children: error.message })
36
+ ] });
37
+ }
24
38
  export {
25
39
  ErrorBoundary
26
40
  };
@@ -25,6 +25,7 @@ const FieldPill = forwardRef(
25
25
  "form",
26
26
  {
27
27
  role: "search",
28
+ "aria-labelledby": `${id}-label`,
28
29
  className: join("clover-field-pill", classes.form),
29
30
  "data-size": size,
30
31
  onSubmit: (event) => {
@@ -36,6 +37,7 @@ const FieldPill = forwardRef(
36
37
  "label",
37
38
  {
38
39
  htmlFor: id,
40
+ id: `${id}-label`,
39
41
  style: visuallyHidden,
40
42
  ...languageProps(langOf("informationPanelTabsSearch")),
41
43
  children: t("informationPanelTabsSearch")
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ function GlobeGlyph() {
4
+ return /* @__PURE__ */ jsxs(
5
+ "svg",
6
+ {
7
+ xmlns: "http://www.w3.org/2000/svg",
8
+ viewBox: "0 0 512 512",
9
+ "aria-hidden": "true",
10
+ focusable: "false",
11
+ fill: "none",
12
+ stroke: "currentColor",
13
+ strokeWidth: "48",
14
+ strokeLinecap: "round",
15
+ strokeLinejoin: "round",
16
+ children: [
17
+ /* @__PURE__ */ jsx("circle", { cx: "256", cy: "256", r: "200" }),
18
+ /* @__PURE__ */ jsx("ellipse", { cx: "256", cy: "256", rx: "84", ry: "200" }),
19
+ /* @__PURE__ */ jsx("path", { d: "M56 256h400M88 160h336M88 352h336" })
20
+ ]
21
+ }
22
+ );
23
+ }
24
+ export {
25
+ GlobeGlyph
26
+ };
@@ -1,5 +1,6 @@
1
1
  "use client";
2
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
+ import { Suspense, lazy, useState, useRef, useLayoutEffect } from "react";
3
4
  import { useCloverTranslation } from "../i18n/useCloverTranslation.mjs";
4
5
  import { autonym } from "../i18n/autonym.mjs";
5
6
  import { languageCode } from "../i18n/languageCode.mjs";
@@ -8,36 +9,102 @@ import { useContainerName } from "../i18n/useContainerName.mjs";
8
9
  import { useUniqueId } from "./useUniqueId.mjs";
9
10
  import { visuallyHidden } from "./visuallyHidden.mjs";
10
11
  import { languageProps } from "../i18n/direction.mjs";
12
+ import { GlobeGlyph } from "./GlobeGlyph.mjs";
13
+ const LanguageMenu = lazy(() => import("./LanguageMenu.mjs"));
14
+ const ROW_MOST = 5;
15
+ function naturalEnd(label, rtl) {
16
+ const was = label.style.whiteSpace;
17
+ label.style.whiteSpace = "nowrap";
18
+ const rect = label.getBoundingClientRect();
19
+ label.style.whiteSpace = was;
20
+ return rtl ? rect.left : rect.right;
21
+ }
22
+ function useFolded(fit, count, shown) {
23
+ const [element, place] = useState(null);
24
+ const width = useRef(0);
25
+ const [folded, setFolded] = useState(false);
26
+ const [measured, setMeasured] = useState(false);
27
+ const [shownWas, setShownWas] = useState(shown);
28
+ if (shownWas !== shown) {
29
+ setShownWas(shown);
30
+ setFolded(false);
31
+ }
32
+ useLayoutEffect(() => {
33
+ const found = element && (fit == null ? void 0 : fit(element));
34
+ if (element) setMeasured(!!found);
35
+ if (!element || !found) return;
36
+ const { label, box } = found;
37
+ const check = () => {
38
+ const rtl = getComputedStyle(box).direction === "rtl";
39
+ const rect = box.getBoundingClientRect();
40
+ if (!folded) width.current = rect.width;
41
+ const end = rtl ? rect.left : rect.right;
42
+ const start = rtl ? end + width.current : end - width.current;
43
+ const room = parseFloat(getComputedStyle(box).paddingInlineStart) || 0;
44
+ const words = naturalEnd(label, rtl);
45
+ const crosses = rtl ? words < start + room : words > start - room;
46
+ if (crosses !== folded) setFolded(crosses);
47
+ };
48
+ check();
49
+ if (typeof ResizeObserver === "undefined") return;
50
+ const observer = new ResizeObserver(check);
51
+ observer.observe(label);
52
+ if (label.parentElement) observer.observe(label.parentElement);
53
+ return () => observer.disconnect();
54
+ }, [fit, folded, count, element]);
55
+ return { place, folded: measured ? folded : count > ROW_MOST };
56
+ }
11
57
  function LanguageChoice({
12
58
  languages,
13
59
  chosen,
14
60
  onChange,
15
61
  nameKey,
16
- part
62
+ part,
63
+ fit
17
64
  }) {
18
65
  const { t, langOf } = useCloverTranslation();
19
66
  const id = useUniqueId();
20
67
  const name = useContainerName(t(nameKey), langOf(nameKey));
68
+ const { place, folded } = useFolded(
69
+ fit,
70
+ languages.length,
71
+ languages.join(" ")
72
+ );
73
+ if (folded)
74
+ return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
75
+ LanguageMenu,
76
+ {
77
+ languages,
78
+ chosen,
79
+ onChange,
80
+ nameKey,
81
+ part,
82
+ placeRef: place
83
+ }
84
+ ) });
21
85
  return /* @__PURE__ */ jsxs(Fragment, { children: [
22
86
  name.node,
23
- /* @__PURE__ */ jsx("fieldset", { ...name.props, className: `${part}-languages`, children: languages.map((tag) => {
24
- const own = autonym(tag);
25
- return /* @__PURE__ */ jsxs("label", { className: `${part}-language`, children: [
26
- /* @__PURE__ */ jsx(
27
- "input",
28
- {
29
- type: "radio",
30
- name: `${id}-language`,
31
- checked: tag === chosen,
32
- onChange: () => onChange(tag)
33
- }
34
- ),
35
- /* @__PURE__ */ jsx("span", { className: `${part}-language-code`, children: languageCode(tag) }),
36
- " ",
37
- /* @__PURE__ */ jsx("span", { style: visuallyHidden, ...languageProps(tag), children: own }),
38
- /* @__PURE__ */ jsx(Tip, { label: own, lang: tag })
39
- ] }, tag);
40
- }) })
87
+ /* @__PURE__ */ jsxs("fieldset", { ...name.props, className: `${part}-languages`, ref: place, children: [
88
+ /* @__PURE__ */ jsx("span", { className: "clover-languages-glyph", "aria-hidden": "true", children: /* @__PURE__ */ jsx(GlobeGlyph, {}) }),
89
+ languages.map((tag) => {
90
+ const own = autonym(tag);
91
+ return /* @__PURE__ */ jsxs("label", { className: `${part}-language`, children: [
92
+ /* @__PURE__ */ jsx(
93
+ "input",
94
+ {
95
+ type: "radio",
96
+ name: `${id}-language`,
97
+ checked: tag === chosen,
98
+ onChange: () => onChange(tag)
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsx("span", { className: `${part}-language-code`, children: languageCode(tag) }),
102
+ " ",
103
+ /* @__PURE__ */ jsx("span", { style: visuallyHidden, ...languageProps(tag), children: own }),
104
+ /* @__PURE__ */ jsx(Tip, { label: own, lang: tag })
105
+ ] }, tag);
106
+ })
107
+ ] })
41
108
  ] });
42
109
  }
43
110
  export {
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ import { jsxs, jsx } from "react/jsx-runtime";
3
+ import { useState, useCallback } from "react";
4
+ import ControlMenu from "../components/Canvas/ControlMenu.mjs";
5
+ import { autonym } from "../i18n/autonym.mjs";
6
+ import { languageProps } from "../i18n/direction.mjs";
7
+ import { languageCode } from "../i18n/languageCode.mjs";
8
+ import { useCloverTranslation } from "../i18n/useCloverTranslation.mjs";
9
+ import { Chevron } from "./Chevron.mjs";
10
+ import { GlobeGlyph } from "./GlobeGlyph.mjs";
11
+ import { Tip } from "./Tip.mjs";
12
+ import { useUniqueId } from "./useUniqueId.mjs";
13
+ function LanguageMenu({
14
+ languages,
15
+ chosen,
16
+ onChange,
17
+ nameKey,
18
+ part,
19
+ placeRef
20
+ }) {
21
+ const { t, langOf } = useCloverTranslation();
22
+ const [open, setOpen] = useState(false);
23
+ const id = useUniqueId();
24
+ const button = `${id}-languages`;
25
+ const close = useCallback(
26
+ (restoreFocus) => {
27
+ var _a;
28
+ setOpen(false);
29
+ if (restoreFocus) (_a = document.getElementById(button)) == null ? void 0 : _a.focus();
30
+ },
31
+ [button]
32
+ );
33
+ const name = t(nameKey);
34
+ const nameLang = langOf(nameKey);
35
+ return /* @__PURE__ */ jsxs(
36
+ "span",
37
+ {
38
+ ref: placeRef,
39
+ className: `${part}-languages clover-languages-folded`,
40
+ onBlur: (event) => {
41
+ const next = event.relatedTarget;
42
+ if (open && next && !event.currentTarget.contains(next)) setOpen(false);
43
+ },
44
+ children: [
45
+ /* @__PURE__ */ jsxs(
46
+ "button",
47
+ {
48
+ type: "button",
49
+ id: button,
50
+ className: "clover-languages-button",
51
+ "aria-label": `${languageCode(chosen)}, ${name}`,
52
+ ...languageProps(nameLang),
53
+ "aria-expanded": open,
54
+ "aria-controls": open ? `${button}-menu` : void 0,
55
+ onClick: () => setOpen((was) => !was),
56
+ children: [
57
+ /* @__PURE__ */ jsx(GlobeGlyph, {}),
58
+ /* @__PURE__ */ jsx("span", { className: "clover-languages-code", "aria-hidden": "true", children: languageCode(chosen) }),
59
+ /* @__PURE__ */ jsx(Chevron, { open, className: "clover-languages-caret" }),
60
+ /* @__PURE__ */ jsx(Tip, { label: name, lang: nameLang })
61
+ ]
62
+ }
63
+ ),
64
+ open && /* @__PURE__ */ jsx(
65
+ ControlMenu,
66
+ {
67
+ id: `${button}-menu`,
68
+ triggerId: button,
69
+ onClose: close,
70
+ className: "clover-languages-menu",
71
+ children: /* @__PURE__ */ jsxs("fieldset", { children: [
72
+ /* @__PURE__ */ jsx("legend", { ...languageProps(nameLang), children: name }),
73
+ languages.map((tag) => /* @__PURE__ */ jsxs("label", { className: "clover-languages-option", children: [
74
+ /* @__PURE__ */ jsx(
75
+ "input",
76
+ {
77
+ type: "radio",
78
+ name: `${button}-language`,
79
+ checked: tag === chosen,
80
+ onChange: () => onChange(tag)
81
+ }
82
+ ),
83
+ /* @__PURE__ */ jsx("span", { ...languageProps(tag), children: autonym(tag) })
84
+ ] }, tag))
85
+ ] })
86
+ }
87
+ )
88
+ ]
89
+ }
90
+ );
91
+ }
92
+ export {
93
+ LanguageMenu as default
94
+ };
@@ -27,7 +27,7 @@ function Sections({
27
27
  labelLang,
28
28
  headingLevel = 3
29
29
  }) {
30
- var _a;
30
+ var _a, _b;
31
31
  const id = useUniqueId();
32
32
  const name = useContainerName(label ?? "", labelLang, label === void 0);
33
33
  const buttons = useRef([]);
@@ -55,13 +55,13 @@ function Sections({
55
55
  if (scroller2) scroller2.scrollTop -= hidden;
56
56
  }, [open, tabs, items, id]);
57
57
  const keepInSight = (event) => {
58
- var _a2, _b, _c, _d;
58
+ var _a2, _b2, _c, _d;
59
59
  const index = items.findIndex((item) => item.value === open);
60
60
  const panel = document.getElementById(`${id}-panel-${index}`);
61
61
  const target = event.target;
62
62
  if (!panel || target === panel || !panel.contains(target)) return;
63
63
  if (!focusShows(target)) return;
64
- const above = (_b = (_a2 = buttons.current[index]) == null ? void 0 : _a2.parentElement) == null ? void 0 : _b.getBoundingClientRect();
64
+ const above = (_b2 = (_a2 = buttons.current[index]) == null ? void 0 : _a2.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
65
65
  const below = index + 1 < items.length ? (_d = (_c = buttons.current[index + 1]) == null ? void 0 : _c.parentElement) == null ? void 0 : _d.getBoundingClientRect() : void 0;
66
66
  if (!above) return;
67
67
  const box = target.getBoundingClientRect();
@@ -71,6 +71,19 @@ function Sections({
71
71
  };
72
72
  const list = useRef(null);
73
73
  const values = items.map((item) => item.value).join("\n");
74
+ const hadFocus = useRef(false);
75
+ hadFocus.current = Boolean(
76
+ (_b = list.current) == null ? void 0 : _b.contains(list.current.ownerDocument.activeElement)
77
+ );
78
+ useEffect(() => {
79
+ var _a2;
80
+ const root = list.current;
81
+ if (!root || !hadFocus.current) return;
82
+ const { activeElement, body } = root.ownerDocument;
83
+ if (activeElement && activeElement !== body) return;
84
+ const index = items.findIndex((item) => item.value === open);
85
+ (_a2 = buttons.current[index]) == null ? void 0 : _a2.focus();
86
+ }, [values]);
74
87
  useIsomorphicLayoutEffect(() => {
75
88
  const root = list.current;
76
89
  if (tabs || !root || typeof ResizeObserver === "undefined") return;
@@ -111,12 +124,12 @@ function Sections({
111
124
  }
112
125
  };
113
126
  const observer = new ResizeObserver((entries) => {
114
- var _a2, _b;
127
+ var _a2, _b2;
115
128
  for (const entry of entries) {
116
129
  if (!headings.includes(entry.target)) continue;
117
130
  heights.set(
118
131
  entry.target,
119
- ((_b = (_a2 = entry.borderBoxSize) == null ? void 0 : _a2[0]) == null ? void 0 : _b.blockSize) ?? entry.target.getBoundingClientRect().height
132
+ ((_b2 = (_a2 = entry.borderBoxSize) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.blockSize) ?? entry.target.getBoundingClientRect().height
120
133
  );
121
134
  }
122
135
  measure();
package/dist/ui/Tip.mjs CHANGED
@@ -147,7 +147,7 @@ function clipOf(element) {
147
147
  }
148
148
  let listening = 0;
149
149
  function hideTips(event) {
150
- if (event.key !== "Escape") return;
150
+ if (event.key !== "Escape" || event.defaultPrevented) return;
151
151
  const shown = /* @__PURE__ */ new Set();
152
152
  document.querySelectorAll(":hover > .clover-tip").forEach((tip) => tip.parentElement && shown.add(tip.parentElement));
153
153
  const focused = document.activeElement;
@@ -182,7 +182,9 @@ function useTips() {
182
182
  }
183
183
  function forwardShortcut(event, viewport) {
184
184
  const target = event.target;
185
- if (!viewport || target === viewport || viewport.contains(target)) return;
185
+ if (!viewport || target === viewport) return;
186
+ if (viewport.contains(target) && !target.closest(".clover-canvas-overlays"))
187
+ return;
186
188
  if (!SHORTCUT_KEYS.has(event.key)) return;
187
189
  if (event.altKey || event.metaKey || event.ctrlKey) return;
188
190
  if (target.closest("input, select, textarea, [contenteditable]")) return;