@nulib/clover 4.4.2 → 4.5.1

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 (316) hide show
  1. package/README.md +2 -2
  2. package/dist/components/Annotations/Annotations.mjs +11 -5
  3. package/dist/components/Items/Items.mjs +15 -5
  4. package/dist/components/Items/PagerLayout.mjs +1 -0
  5. package/dist/components/Map/MapView.mjs +1 -1
  6. package/dist/components/Panel/About.mjs +16 -5
  7. package/dist/components/Panel/AboutActions.mjs +10 -16
  8. package/dist/components/Panel/LanguageToggle.mjs +69 -0
  9. package/dist/components/Panel/Panel.mjs +9 -1
  10. package/dist/components/Panel/ReadingLanguages.mjs +2 -16
  11. package/dist/components/Panel/sections.mjs +6 -1
  12. package/dist/components/Root/useRootState.mjs +46 -4
  13. package/dist/components/Search/Search.mjs +10 -7
  14. package/dist/components/Transcript/Transcript.mjs +42 -33
  15. package/dist/core/image-service-content.mjs +108 -0
  16. package/dist/core/load.mjs +38 -1
  17. package/dist/i18n/config.mjs +88 -14
  18. package/dist/i18n/languages.mjs +42 -8
  19. package/dist/i18n/locales/index.mjs +4 -1
  20. package/dist/i18n/locales/ja.json.mjs +5 -0
  21. package/dist/i18n/locales/zh-Hans.json.mjs +5 -0
  22. package/dist/i18n/locales/zh-Hant.json.mjs +5 -0
  23. package/dist/index.d.mts +109 -24
  24. package/dist/lib/renderer/CanvasRenderer.mjs +20 -5
  25. package/dist/map/index.d.mts +3 -2
  26. package/dist/react/readingLanguages.mjs +15 -2
  27. package/dist/styles/default.css +1 -1
  28. package/dist/styles/items.css +1 -1
  29. package/dist/styles/panel.css +1 -1
  30. package/dist/styles.css +1 -1
  31. package/dist/templates/default/Default.mjs +2 -0
  32. package/dist/templates/document/Document.mjs +5 -1
  33. package/dist/templates/gallery/Gallery.mjs +2 -0
  34. package/dist/templates/index.d.mts +53 -11
  35. package/dist/templates/shared/LightboxView.mjs +2 -0
  36. package/dist/ui/GlobeGlyph.mjs +26 -0
  37. package/dist/ui/LanguageChoice.mjs +87 -20
  38. package/dist/ui/LanguageMenu.mjs +94 -0
  39. package/dist/ui/useScrollTrack.mjs +34 -19
  40. package/dist/web-components/About-BMlEaTqj.mjs +1 -0
  41. package/dist/web-components/AnnotationItems-DNur2mn_.mjs +1 -0
  42. package/dist/web-components/{AnnotationMenu-BiM0n-6H.mjs → AnnotationMenu-9pQOKEMb.mjs} +1 -1
  43. package/dist/web-components/AnnotationState-BVDRV-1B.mjs +1 -0
  44. package/dist/web-components/{Annotations-x5H_Vls9.mjs → Annotations-B5WD596p.mjs} +1 -1
  45. package/dist/web-components/Annotations-BmETEgUn.mjs +2 -0
  46. package/dist/web-components/{Body-BWOsHKU1.mjs → Body-BgCsKpGr.mjs} +1 -1
  47. package/dist/web-components/{BodyAlert-DYfrepDo.mjs → BodyAlert-Dt_medBN.mjs} +1 -1
  48. package/dist/web-components/{Button-Ch0E6GVj.mjs → Button-DW1Y9SI4.mjs} +1 -1
  49. package/dist/web-components/{Camera-CY4adJpn.mjs → Camera-Cj_vOD9V.mjs} +1 -1
  50. package/dist/web-components/{Canvas2DBackend-eFcDTxq6.mjs → Canvas2DBackend-BjCgV8Gn.mjs} +1 -1
  51. package/dist/web-components/{CanvasView-BqsXUI8n.mjs → CanvasView-fCOQzA_R.mjs} +2 -2
  52. package/dist/web-components/{CaptionDetails-CuYSbD70.mjs → CaptionDetails-Z5FFvEp8.mjs} +1 -1
  53. package/dist/web-components/{ChaptersMenu-IlAt1pp2.mjs → ChaptersMenu-b80HFV28.mjs} +1 -1
  54. package/dist/web-components/{Chevron-uZe3N2Pt.mjs → Chevron-D9HTNAaC.mjs} +1 -1
  55. package/dist/web-components/{ChoiceMenu-DBJynLGl.mjs → ChoiceMenu-CXtI293_.mjs} +1 -1
  56. package/dist/web-components/{Collection-C1sRlJK1.mjs → Collection-CASEkwgi.mjs} +1 -1
  57. package/dist/web-components/{CollectionSelect-BYMQaanx.mjs → CollectionSelect-Boc7wy9j.mjs} +1 -1
  58. package/dist/web-components/{Connected-Bd2T2EUc.mjs → Connected-Biw2I6Po.mjs} +1 -1
  59. package/dist/web-components/{Connected-Ckar86TI.mjs → Connected-CNlmumRT.mjs} +1 -1
  60. package/dist/web-components/{Connected-Dpp3iO3D.mjs → Connected-DXm_z3q9.mjs} +1 -1
  61. package/dist/web-components/{Contents-DjtD3iKA.mjs → Contents-N3FNf9QU.mjs} +1 -1
  62. package/dist/web-components/{ControlMenu-CaD8Frag.mjs → ControlMenu-DLJsVZnm.mjs} +1 -1
  63. package/dist/web-components/ControlsFade-DcPvrXFf.mjs +1 -0
  64. package/dist/web-components/{CountMenu-DBiLd3X6.mjs → CountMenu-DyBK1e4z.mjs} +1 -1
  65. package/dist/web-components/Cue-CrnTNjnn.mjs +1 -0
  66. package/dist/web-components/Document-CZ3qHszc.mjs +1 -0
  67. package/dist/web-components/{DomLayers-DXbbsOVO.mjs → DomLayers-BwlLZSRc.mjs} +1 -1
  68. package/dist/web-components/{Download-CgRv1Jio.mjs → Download-WldBPDxr.mjs} +1 -1
  69. package/dist/web-components/{EntryBodies-DnXLIVR-.mjs → EntryBodies-BwWEgZ1_.mjs} +1 -1
  70. package/dist/web-components/{EntryThumbnail-BtRvqME5.mjs → EntryThumbnail-C56uAnMQ.mjs} +1 -1
  71. package/dist/web-components/{FieldPill-CmagfxvU.mjs → FieldPill-C1UAftNo.mjs} +1 -1
  72. package/dist/web-components/{FrameAnimation-DmqYAi-M.mjs → FrameAnimation-BpHvVjI3.mjs} +1 -1
  73. package/dist/web-components/Gallery-h9AR15s0.mjs +1 -0
  74. package/dist/web-components/GlobeGlyph-CnvS-FYu.mjs +1 -0
  75. package/dist/web-components/{HideToggle-aDBXi6F0.mjs → HideToggle-D-r79OIC.mjs} +1 -1
  76. package/dist/web-components/{ImageControls-CdEwkNkw.mjs → ImageControls-CdcicjR7.mjs} +1 -1
  77. package/dist/web-components/Items-CVvtjq7r.mjs +1 -0
  78. package/dist/web-components/Label-CvbxytPx.mjs +1 -0
  79. package/dist/web-components/LanguageChoice-BJd_RsYq.mjs +1 -0
  80. package/dist/web-components/LanguageMenu-BsnzmKwN.mjs +1 -0
  81. package/dist/web-components/LightboxView-DReKv-Dd.mjs +1 -0
  82. package/dist/web-components/{ListEnd-D1Y0rzNK.mjs → ListEnd-DwtNoi_1.mjs} +1 -1
  83. package/dist/web-components/{Loaded-Bebqgt6V.mjs → Loaded-BPOKsLbO.mjs} +1 -1
  84. package/dist/web-components/LoadedCanvas-HQwMz-9o.mjs +1 -0
  85. package/dist/web-components/LoadedMap-Totn9tyS.mjs +1 -0
  86. package/dist/web-components/{Loading-B5lpxt7E.mjs → Loading-C5mJstXv.mjs} +1 -1
  87. package/dist/web-components/{Map-DsHQLS6G.mjs → Map-Drj3FcfB.mjs} +1 -1
  88. package/dist/web-components/MapView-Bf4alyhB.mjs +3 -0
  89. package/dist/web-components/{Markup-CQb91uB6.mjs → Markup-DgJRP5fa.mjs} +1 -1
  90. package/dist/web-components/{MediaBody-BbipyE0n.mjs → MediaBody-1FBP2j7l.mjs} +1 -1
  91. package/dist/web-components/{MediaBody-CuCVF-N7.mjs → MediaBody-BEWLYzRU.mjs} +1 -1
  92. package/dist/web-components/{NavDate-CjJTuBbs.mjs → NavDate-rtQNHF_X.mjs} +1 -1
  93. package/dist/web-components/{Navigator-BKVI3csP.mjs → Navigator-Byl5hEjY.mjs} +1 -1
  94. package/dist/web-components/{Pager-CTvxvbel.mjs → Pager-DkTHvyHN.mjs} +1 -1
  95. package/dist/web-components/PagerLayout-C6kl1hk2.mjs +1 -0
  96. package/dist/web-components/Panel-C6gKilND.mjs +1 -0
  97. package/dist/web-components/PanelPart-B_2EB7jQ.mjs +1 -0
  98. package/dist/web-components/{PanelToggle-Dsp3JD1s.mjs → PanelToggle-DqoE9niZ.mjs} +1 -1
  99. package/dist/web-components/{PartOfManifest-Bu5XTdcH.mjs → PartOfManifest-ydDwjNTt.mjs} +1 -1
  100. package/dist/web-components/{Pending-C7ZSt2eL.mjs → Pending-DWJWng2S.mjs} +1 -1
  101. package/dist/web-components/{PlaceBox-PwpqCwOS.mjs → PlaceBox-DB54T8Pe.mjs} +1 -1
  102. package/dist/web-components/{Placeholder-B_DxAE6y.mjs → Placeholder-DJg1rjuD.mjs} +1 -1
  103. package/dist/web-components/{Position-CQ7FBqd0.mjs → Position-BHc5qoff.mjs} +1 -1
  104. package/dist/web-components/Primitives-Ea4kfG9I.mjs +1 -0
  105. package/dist/web-components/Provider-D9_x7agY.mjs +1 -0
  106. package/dist/web-components/{ReadMore-0vMRgzA8.mjs → ReadMore-Dv-gInr5.mjs} +1 -1
  107. package/dist/web-components/Root-Cju5jUFL.mjs +1 -0
  108. package/dist/web-components/Scene-B6doLHT0.mjs +1 -0
  109. package/dist/web-components/{SceneView-DSUVfGQR.mjs → SceneView-CekvA-s4.mjs} +1 -1
  110. package/dist/web-components/Search-Dp2mguRJ.mjs +1 -0
  111. package/dist/web-components/{Sections-BdEZZD0J.mjs → Sections-DURsiaS-.mjs} +1 -1
  112. package/dist/web-components/{SeekMarks-ByDBrurH.mjs → SeekMarks-DT6hra-w.mjs} +1 -1
  113. package/dist/web-components/StandaloneItems-aPSHNgk2.mjs +1 -0
  114. package/dist/web-components/{Status-CK2v5LdZ.mjs → Status-pDPG5ab1.mjs} +1 -1
  115. package/dist/web-components/{Steps-DlYRgYiS.mjs → Steps-DCyGkbOP.mjs} +1 -1
  116. package/dist/web-components/{TargetItems-B0ZkDWAH.mjs → TargetItems-Be6A1gcy.mjs} +1 -1
  117. package/dist/web-components/Timeline-Cj9cCYCA.mjs +1 -0
  118. package/dist/web-components/{Tip-BPxXnFcb.mjs → Tip-Bsd8bCx9.mjs} +1 -1
  119. package/dist/web-components/Transcript-bQaRVoI_.mjs +1 -0
  120. package/dist/web-components/{Transport-nQ1ytZeY.mjs → Transport-DOzVY_IU.mjs} +1 -1
  121. package/dist/web-components/{Transport-Cc1VnGe1.mjs → Transport-DUGGwa-G.mjs} +1 -1
  122. package/dist/web-components/{annotation-collection-JrLc_Org.mjs → annotation-collection-DGCbF6YN.mjs} +1 -1
  123. package/dist/web-components/{annotation-name-WwXE5c2m.mjs → annotation-name-DFdgSllS.mjs} +1 -1
  124. package/dist/web-components/{annotations-content-G5YUyhp2.mjs → annotations-content-CwUfqHPh.mjs} +1 -1
  125. package/dist/web-components/{body-BvY3Vpf_.mjs → body-C3LAo8pl.mjs} +1 -1
  126. package/dist/web-components/{canvas-CaNpS96c.mjs → canvas-BUmbx6sa.mjs} +1 -1
  127. package/dist/web-components/{cloverEngine-Cpp8BjZa.mjs → cloverEngine-gT8L7Xi7.mjs} +1 -1
  128. package/dist/web-components/{content-state-reader-DakKAf36.mjs → content-state-reader-B3GmJui6.mjs} +1 -1
  129. package/dist/web-components/{controlGlyphs-bqWNGQ1-.mjs → controlGlyphs-BC2tLOYb.mjs} +1 -1
  130. package/dist/web-components/{controls-Db0929rf.mjs → controls-n8BSf19H.mjs} +1 -1
  131. package/dist/web-components/custom-elements.json +35 -3
  132. package/dist/web-components/downloads-CurHNK9M.mjs +1 -0
  133. package/dist/web-components/{dragToClose-D5AN98l4.mjs → dragToClose-Cbxkgv9j.mjs} +1 -1
  134. package/dist/web-components/{engine-B1m2m56g.mjs → engine-C51pr0Wa.mjs} +1 -1
  135. package/dist/web-components/{engines-CBm3cDwx.mjs → engines-CZzpPjXO.mjs} +1 -1
  136. package/dist/web-components/{fetchManifest-lvHWlQYu.mjs → fetchManifest-Crn4VJ56.mjs} +1 -1
  137. package/dist/web-components/{fromManifest-ZbH8cYoN.mjs → fromManifest-Ci0vEX5i.mjs} +1 -1
  138. package/dist/web-components/{glyphs-BtnJwbd5.mjs → glyphs-BcLY9GG7.mjs} +1 -1
  139. package/dist/web-components/hooks-C9BeaqLZ.mjs +1 -0
  140. package/dist/web-components/{image-layers-DjUA6eWF.mjs → image-layers-zWauwKEw.mjs} +1 -1
  141. package/dist/web-components/image-service-content-BAmoCFAH.mjs +1 -0
  142. package/dist/web-components/{imageService-B9yNXMcD.mjs → imageService-DXS2KuSL.mjs} +1 -1
  143. package/dist/web-components/index-BxhBBH2G.mjs +1 -0
  144. package/dist/web-components/index.mjs +1 -1
  145. package/dist/web-components/items-CPW7LZpT.mjs +1 -0
  146. package/dist/web-components/items-DUZSfcSf.mjs +1 -0
  147. package/dist/web-components/ja-Cg1enUhM.mjs +1 -0
  148. package/dist/web-components/label-BswVRwfJ.mjs +1 -0
  149. package/dist/web-components/layout-NPxKIp1S.mjs +1 -0
  150. package/dist/web-components/{link-BhvZNgtv.mjs → link-DI1Gv9P_.mjs} +1 -1
  151. package/dist/web-components/logo-Ccv2scvi.mjs +1 -0
  152. package/dist/web-components/{models-CIHL07o7.mjs → models-DtSFB57l.mjs} +1 -1
  153. package/dist/web-components/{nodes-TS4tB7cC.mjs → nodes-BEUmRfuQ.mjs} +1 -1
  154. package/dist/web-components/{overlayImage-B3ItMjXk.mjs → overlayImage-BOqTHR8E.mjs} +1 -1
  155. package/dist/web-components/{panel-M3PpVN7f.mjs → panel-Cd5S9Ezy.mjs} +1 -1
  156. package/dist/web-components/part-C7WLTw20.mjs +1 -0
  157. package/dist/web-components/{playerSurface-BGgYHT2u.mjs → playerSurface-QGjBv9Yq.mjs} +1 -1
  158. package/dist/web-components/{pointer-J2gT4W9m.mjs → pointer-BLFSppkR.mjs} +1 -1
  159. package/dist/web-components/{provider-CdJfEMUj.mjs → provider-BMZpItBJ.mjs} +1 -1
  160. package/dist/web-components/{range-regions-DxSIpIVo.mjs → range-regions-DX9sTrBU.mjs} +1 -1
  161. package/dist/web-components/{read-more-wCGc6ELt.mjs → read-more-DSnuyAMI.mjs} +1 -1
  162. package/dist/web-components/readingLanguages-C83aK9na.mjs +1 -0
  163. package/dist/web-components/rendererSurface-Clg0MuAj.mjs +22 -0
  164. package/dist/web-components/{renderers-zAtpns1S.mjs → renderers-DnnMGnA9.mjs} +1 -1
  165. package/dist/web-components/resource-BxbCXGtG.mjs +1 -0
  166. package/dist/web-components/{save-file-DquBqxrS.mjs → save-file-CuRpXpO7.mjs} +1 -1
  167. package/dist/web-components/{search-ChOKTYz9.mjs → search-B8ycnAKR.mjs} +1 -1
  168. package/dist/web-components/shared-CzlxExGR.mjs +1 -0
  169. package/dist/web-components/{show-link-Dry4M5w1.mjs → show-link-BOEKHpcs.mjs} +1 -1
  170. package/dist/web-components/{sizedImage-CjFqzhUE.mjs → sizedImage-BNlShxVG.mjs} +1 -1
  171. package/dist/web-components/{split-88HcOLCm.mjs → split-BwdAJ7v3.mjs} +1 -1
  172. package/dist/web-components/{status-BNrkhMe7.mjs → status-DwwUoyYG.mjs} +1 -1
  173. package/dist/web-components/styles-C51FhQQr.mjs +1 -0
  174. package/dist/web-components/three.mjs +1 -1
  175. package/dist/web-components/{thumbnail-CoFd2duc.mjs → thumbnail-Bx8UP6ak.mjs} +1 -1
  176. package/dist/web-components/{tip-BCClTo0G.mjs → tip-DNLMHjGA.mjs} +1 -1
  177. package/dist/web-components/{toggle-DavvlVdF.mjs → toggle-D-vRsWQx.mjs} +1 -1
  178. package/dist/web-components/{useContainerName-B_Kzx2Wp.mjs → useContainerName-CAlWJohz.mjs} +1 -1
  179. package/dist/web-components/{useControlsVisibility-BdD2byHj.mjs → useControlsVisibility-IAlNQKAy.mjs} +1 -1
  180. package/dist/web-components/{useNearViewport-Bj8qJEA0.mjs → useNearViewport-B8E_rit4.mjs} +1 -1
  181. package/dist/web-components/useScrollTrack-D7S-3b7o.mjs +1 -0
  182. package/dist/web-components/viewer/{AnnotationItems-3Sf8MxRQ.mjs → AnnotationItems-DLBXufXN.mjs} +1 -1
  183. package/dist/web-components/viewer/{AnnotationMenu-_xBnZtm1.mjs → AnnotationMenu-VQICxqCw.mjs} +1 -1
  184. package/dist/web-components/viewer/AnnotationState-Blwq33RX.mjs +1 -0
  185. package/dist/web-components/viewer/Annotations-DE9evpU8.mjs +2 -0
  186. package/dist/web-components/viewer/{Annotations-24ComVk9.mjs → Annotations-DHKvpN_g.mjs} +1 -1
  187. package/dist/web-components/viewer/{Canvas2DBackend-DPWYD9ST.mjs → Canvas2DBackend-CRMajv3c.mjs} +1 -1
  188. package/dist/web-components/viewer/CaptionDetails-B13rxFZq.mjs +1 -0
  189. package/dist/web-components/viewer/{ChaptersMenu-C5J0d8Ck.mjs → ChaptersMenu-IAVcnwMF.mjs} +1 -1
  190. package/dist/web-components/viewer/{ChoiceMenu-B8iukYiR.mjs → ChoiceMenu-CORn4IQ7.mjs} +1 -1
  191. package/dist/web-components/viewer/{Collection-CPVQ3JtI.mjs → Collection-CefKVGoo.mjs} +1 -1
  192. package/dist/web-components/viewer/{Connected-x3v9xr7x.mjs → Connected-BwhumfiG.mjs} +1 -1
  193. package/dist/web-components/viewer/{Connected-D5_bZzr5.mjs → Connected-KiqCyCyf.mjs} +1 -1
  194. package/dist/web-components/viewer/{Contents-Ma7oDW1R.mjs → Contents-DLGRh2XL.mjs} +1 -1
  195. package/dist/web-components/viewer/{ControlMenu-D2HokCqd.mjs → ControlMenu-DBSEW19Y.mjs} +1 -1
  196. package/dist/web-components/viewer/ControlsFade-CQ-g8cVb.mjs +1 -0
  197. package/dist/web-components/viewer/{CountMenu-BnDN2b0n.mjs → CountMenu-C8_qWHK5.mjs} +1 -1
  198. package/dist/web-components/viewer/Cue-BwJDU9Vs.mjs +1 -0
  199. package/dist/web-components/viewer/Document-CbMXbIZ9.mjs +1 -0
  200. package/dist/web-components/viewer/{DomLayers-BW2A4z82.mjs → DomLayers-ByxbcmL1.mjs} +1 -1
  201. package/dist/web-components/viewer/{Download-Cc_NA7QN.mjs → Download-3rtn7gLF.mjs} +1 -1
  202. package/dist/web-components/viewer/{EntryBodies-Bz69SWZh.mjs → EntryBodies-BP12ovq7.mjs} +1 -1
  203. package/dist/web-components/viewer/{EntryThumbnail-C8cUA5qc.mjs → EntryThumbnail-DpP82iU_.mjs} +1 -1
  204. package/dist/web-components/viewer/{FieldPill-BzKvMF-K.mjs → FieldPill-BSdPIm-Q.mjs} +1 -1
  205. package/dist/web-components/viewer/{FrameAnimation-DiQgfgri.mjs → FrameAnimation-DpoTQ3xX.mjs} +1 -1
  206. package/dist/web-components/viewer/Gallery-BtJZKRID.mjs +1 -0
  207. package/dist/web-components/viewer/GlobeGlyph-CI64v0-v.mjs +1 -0
  208. package/dist/web-components/viewer/{HideToggle-jg311sUK.mjs → HideToggle-CmpZYjui.mjs} +1 -1
  209. package/dist/web-components/viewer/{ImageControls-8ZIWLAkf.mjs → ImageControls-Da6YHXjJ.mjs} +1 -1
  210. package/dist/web-components/viewer/LanguageChoice-CbS8ksEM.mjs +1 -0
  211. package/dist/web-components/viewer/LanguageMenu-l2Me1RBQ.mjs +1 -0
  212. package/dist/web-components/viewer/LightboxView-BCDkk6yf.mjs +1 -0
  213. package/dist/web-components/viewer/{ListEnd-JjGQ_q6c.mjs → ListEnd-DFpeNm-y.mjs} +1 -1
  214. package/dist/web-components/viewer/{MapView-tAZ4vINr.mjs → MapView-DG-ZUI7R.mjs} +2 -2
  215. package/dist/web-components/viewer/{MediaBody-Da60tZIj.mjs → MediaBody-BgBDbfHg.mjs} +1 -1
  216. package/dist/web-components/viewer/{MediaBody-CQAJJpuz.mjs → MediaBody-byvlUB_B.mjs} +1 -1
  217. package/dist/web-components/viewer/{NavDate-B7T2iPfP.mjs → NavDate-DpToOfYG.mjs} +1 -1
  218. package/dist/web-components/viewer/{Navigator-sEfTvK-l.mjs → Navigator-UVu84RyI.mjs} +1 -1
  219. package/dist/web-components/viewer/PagerLayout-C3HEM9Ev.mjs +1 -0
  220. package/dist/web-components/viewer/PanelPart-7DmaKxVo.mjs +1 -0
  221. package/dist/web-components/viewer/{PartOfManifest-BYgk9r1j.mjs → PartOfManifest-CAG-54_j.mjs} +1 -1
  222. package/dist/web-components/viewer/{PlaceBox-BBtsMTsl.mjs → PlaceBox-4kYT5bX0.mjs} +1 -1
  223. package/dist/web-components/viewer/{Placeholder-5focqckW.mjs → Placeholder-BGtNqkT3.mjs} +1 -1
  224. package/dist/web-components/viewer/Search-lYKOtFBO.mjs +1 -0
  225. package/dist/web-components/viewer/{SeekMarks-CUyvbMfC.mjs → SeekMarks-By4ZSK6u.mjs} +1 -1
  226. package/dist/web-components/viewer/{StandaloneItems-DsoMdwWS.mjs → StandaloneItems-NfsSxROI.mjs} +1 -1
  227. package/dist/web-components/viewer/{Steps-zpuoH0K0.mjs → Steps-BOB1n3WM.mjs} +1 -1
  228. package/dist/web-components/viewer/{TargetItems-DIKBor9X.mjs → TargetItems-vP03hWU8.mjs} +1 -1
  229. package/dist/web-components/viewer/Transcript-CCn5yqeZ.mjs +1 -0
  230. package/dist/web-components/viewer/{Transport-DMnPpTsQ.mjs → Transport-B-GTF-rz.mjs} +1 -1
  231. package/dist/web-components/viewer/{Transport-BM3IMXDW.mjs → Transport-Qi3YTaFs.mjs} +1 -1
  232. package/dist/web-components/viewer/{annotation-collection-C_9c9NPs.mjs → annotation-collection-CqFki-7M.mjs} +1 -1
  233. package/dist/web-components/viewer/{annotation-name-jt1y3erg.mjs → annotation-name-z-zyEc1-.mjs} +1 -1
  234. package/dist/web-components/viewer/annotations-content-xp-O7sy-.mjs +1 -0
  235. package/dist/web-components/viewer/{cloverEngine-CVyaltw7.mjs → cloverEngine-BSk-sfvP.mjs} +2 -2
  236. package/dist/web-components/viewer/{content-state-reader-DIcY4zWj.mjs → content-state-reader-DL-mMGZi.mjs} +1 -1
  237. package/dist/web-components/viewer/{dragToClose-D2h8gIpa.mjs → dragToClose-vevhuGlo.mjs} +1 -1
  238. package/dist/web-components/viewer/{fetchManifest-C66Fk39V.mjs → fetchManifest-C-_la_Ym.mjs} +1 -1
  239. package/dist/web-components/viewer/{host-Fl21T-Pt.mjs → host-DHOefZ2L.mjs} +1 -1
  240. package/dist/web-components/viewer/{image-layers-CpDOoRh9.mjs → image-layers-qNcOTmq3.mjs} +1 -1
  241. package/dist/web-components/viewer/image-service-content-D63obMOY.mjs +1 -0
  242. package/dist/web-components/viewer/index.mjs +1 -1
  243. package/dist/web-components/viewer/{link-DlX6OdhG.mjs → link-BZAbKwFF.mjs} +1 -1
  244. package/dist/web-components/viewer/overlayImage-oEpv2EvC.mjs +1 -0
  245. package/dist/web-components/viewer/{range-regions--YB9ll1N.mjs → range-regions-YtOKXMW8.mjs} +1 -1
  246. package/dist/web-components/viewer/{renderers-zvRp3xYJ.mjs → renderers-BdXu40PJ.mjs} +1 -1
  247. package/dist/web-components/viewer/{save-file-83yWcPHX.mjs → save-file-Cktvr4HF.mjs} +1 -1
  248. package/dist/web-components/viewer/{search-DDXsrZz3.mjs → search-CSjEe4Yv.mjs} +1 -1
  249. package/dist/web-components/viewer/styles-BjjJM8OS.mjs +1 -0
  250. package/dist/web-components/viewer/{useControlsVisibility-CudUJBCj.mjs → useControlsVisibility-CBeiyfcO.mjs} +1 -1
  251. package/dist/web-components/viewer/viewer-B7xAOtQD.mjs +29 -0
  252. package/dist/web-components/viewer/{vtt-D1xyC48J.mjs → vtt-BRwEspJw.mjs} +1 -1
  253. package/dist/web-components/viewer-BomG9B8d.mjs +1 -0
  254. package/dist/web-components/{vtt-ChAUl4lm.mjs → vtt-Cx6_Tym1.mjs} +1 -1
  255. package/dist/web-components/zh-Hans-DnYm6PWu.mjs +1 -0
  256. package/dist/web-components/zh-Hant-DsxnuLPZ.mjs +1 -0
  257. package/package.json +1 -1
  258. package/dist/web-components/About-rhhglI1Z.mjs +0 -1
  259. package/dist/web-components/AnnotationItems-9o4vZn9M.mjs +0 -1
  260. package/dist/web-components/AnnotationState-BCfjI6kC.mjs +0 -1
  261. package/dist/web-components/Annotations-bAuL-Vo6.mjs +0 -2
  262. package/dist/web-components/ControlsFade-qs_zu-DZ.mjs +0 -1
  263. package/dist/web-components/Cue-CrlByfoX.mjs +0 -1
  264. package/dist/web-components/Document-C3K-CXHu.mjs +0 -1
  265. package/dist/web-components/Gallery-DMNATgzf.mjs +0 -1
  266. package/dist/web-components/Items-xeEzg7uu.mjs +0 -1
  267. package/dist/web-components/Label-7SZqCiYh.mjs +0 -1
  268. package/dist/web-components/LanguageChoice-DrIQjsPP.mjs +0 -1
  269. package/dist/web-components/LightboxView-BzxRQK6r.mjs +0 -1
  270. package/dist/web-components/LoadedCanvas-8To8LkUE.mjs +0 -1
  271. package/dist/web-components/LoadedMap-BmF3Gmnw.mjs +0 -1
  272. package/dist/web-components/MapView-DcLIazmJ.mjs +0 -3
  273. package/dist/web-components/PagerLayout-DR6V9wwv.mjs +0 -1
  274. package/dist/web-components/Panel-BBRkfdof.mjs +0 -1
  275. package/dist/web-components/PanelPart-Cdbsnr8P.mjs +0 -1
  276. package/dist/web-components/Primitives-D5lVsBs8.mjs +0 -1
  277. package/dist/web-components/Provider-B9X74RHz.mjs +0 -1
  278. package/dist/web-components/Root-COIMTFHh.mjs +0 -1
  279. package/dist/web-components/Scene-DjUgqzXR.mjs +0 -1
  280. package/dist/web-components/Search-DOitIwis.mjs +0 -1
  281. package/dist/web-components/StandaloneItems-DATV9XoT.mjs +0 -1
  282. package/dist/web-components/Timeline-D-FevrUe.mjs +0 -1
  283. package/dist/web-components/Transcript-BLm9tljk.mjs +0 -1
  284. package/dist/web-components/downloads-CGkM4OSO.mjs +0 -1
  285. package/dist/web-components/hooks-BLpTDu28.mjs +0 -1
  286. package/dist/web-components/index-2F1l5TLi.mjs +0 -1
  287. package/dist/web-components/items-C56FfpBX.mjs +0 -1
  288. package/dist/web-components/items-DlG6IYqm.mjs +0 -1
  289. package/dist/web-components/label-DJ-Udq1e.mjs +0 -1
  290. package/dist/web-components/layout-Dh0myod-.mjs +0 -1
  291. package/dist/web-components/logo-k93ZgyqF.mjs +0 -1
  292. package/dist/web-components/part-Df1Vr2Ss.mjs +0 -1
  293. package/dist/web-components/readingLanguages-DmZ8CHoc.mjs +0 -1
  294. package/dist/web-components/rendererSurface-Bk7SHYws.mjs +0 -22
  295. package/dist/web-components/resource-Cb3AnAXL.mjs +0 -1
  296. package/dist/web-components/shared-D4j4IirO.mjs +0 -1
  297. package/dist/web-components/styles-Ca564vB9.mjs +0 -1
  298. package/dist/web-components/useScrollTrack-DBIW4pCJ.mjs +0 -1
  299. package/dist/web-components/viewer/AnnotationState-o4goI6T-.mjs +0 -1
  300. package/dist/web-components/viewer/Annotations-CJamLUnL.mjs +0 -2
  301. package/dist/web-components/viewer/CaptionDetails-DNPq32gk.mjs +0 -1
  302. package/dist/web-components/viewer/ControlsFade-JoRgQt8U.mjs +0 -1
  303. package/dist/web-components/viewer/Cue-FHw5d8zO.mjs +0 -1
  304. package/dist/web-components/viewer/Document-DiXiOkPn.mjs +0 -1
  305. package/dist/web-components/viewer/Gallery-BYmzAEuZ.mjs +0 -1
  306. package/dist/web-components/viewer/LanguageChoice-BXXMBe-A.mjs +0 -1
  307. package/dist/web-components/viewer/LightboxView-DnN0fkeg.mjs +0 -1
  308. package/dist/web-components/viewer/PagerLayout-B4C72jTV.mjs +0 -1
  309. package/dist/web-components/viewer/PanelPart-Di406l-a.mjs +0 -1
  310. package/dist/web-components/viewer/Search-DbHlUxOS.mjs +0 -1
  311. package/dist/web-components/viewer/Transcript-B_puRtfb.mjs +0 -1
  312. package/dist/web-components/viewer/annotations-content-Dg8h7vJX.mjs +0 -1
  313. package/dist/web-components/viewer/overlayImage-yGXMVHgX.mjs +0 -1
  314. package/dist/web-components/viewer/styles-04jB_4IT.mjs +0 -1
  315. package/dist/web-components/viewer/viewer-0aUYzmQj.mjs +0 -29
  316. package/dist/web-components/viewer-B_5rFgy5.mjs +0 -1
package/README.md CHANGED
@@ -109,8 +109,8 @@ If you serve Clover's files yourself, copy the whole `dist/web-components` folde
109
109
  - [Composing layouts](https://clover.iiif.library.northwestern.edu/docs/composing): layouts of your
110
110
  own, from the parts and hooks.
111
111
  - [Styling](https://clover.iiif.library.northwestern.edu/docs/styling): colors, sizes and classes.
112
- - [Technical overview](https://clover.iiif.library.northwestern.edu/docs/technical): events,
113
- languages, types, what each part loads, and coming from Clover 3.x.
112
+ - [Glossary](https://clover.iiif.library.northwestern.edu/docs/composing/glossary): every
113
+ component and helper, and the package's structure.
114
114
 
115
115
  Clover 3.x, `@samvera/clover-iiif`, is deprecated and no longer maintained. Its docs are
116
116
  kept on the same site, under
@@ -26,7 +26,7 @@ import { useLoaded } from "../../hooks/useLoaded.mjs";
26
26
  import { HideToggle } from "../../ui/HideToggle.mjs";
27
27
  import { visuallyHidden } from "../../ui/visuallyHidden.mjs";
28
28
  import { startingLanguage } from "../../core/language-choice.mjs";
29
- import { useReadingLanguages } from "../../react/readingLanguages.mjs";
29
+ import { useReadingLanguages, covers } from "../../react/readingLanguages.mjs";
30
30
  import { LanguageChoice } from "../../ui/LanguageChoice.mjs";
31
31
  import { languagesOf, inLanguage } from "./languages.mjs";
32
32
  import { languageProps } from "../../i18n/direction.mjs";
@@ -160,7 +160,8 @@ function AnnotationGroup({
160
160
  const languages = useMemo(() => languagesOf(entries), [entries]);
161
161
  const [picked, setPicked] = useState();
162
162
  const offered = useReadingLanguages();
163
- const chosen = offered ? startingLanguage(languages, offered.chosen) : startingLanguage(languages, language, picked);
163
+ const follows = covers(offered, languages);
164
+ const chosen = follows ? startingLanguage(languages, offered.chosen) : startingLanguage(languages, (offered == null ? void 0 : offered.chosen) ?? language, picked);
164
165
  const listed = entries.filter((entry) => inLanguage(entry, chosen));
165
166
  return /* @__PURE__ */ jsxs(
166
167
  "section",
@@ -179,7 +180,7 @@ function AnnotationGroup({
179
180
  children: title.text
180
181
  }
181
182
  ),
182
- chosen && !offered && /* @__PURE__ */ jsx(
183
+ chosen && !follows && /* @__PURE__ */ jsx(
183
184
  LanguageChoice,
184
185
  {
185
186
  languages,
@@ -391,7 +392,12 @@ const AnnotationLayers = forwardRef(function AnnotationLayers2({
391
392
  const languages = languagesOf(
392
393
  layer.canvases.flatMap((group) => group.entries)
393
394
  );
394
- const chosen = offered ? startingLanguage(languages, offered.chosen) : startingLanguage(languages, language, picked[layer.key]);
395
+ const follows = covers(offered, languages);
396
+ const chosen = follows ? startingLanguage(languages, offered.chosen) : startingLanguage(
397
+ languages,
398
+ (offered == null ? void 0 : offered.chosen) ?? language,
399
+ picked[layer.key]
400
+ );
395
401
  return /* @__PURE__ */ jsxs(
396
402
  "section",
397
403
  {
@@ -408,7 +414,7 @@ const AnnotationLayers = forwardRef(function AnnotationLayers2({
408
414
  children: layer.title.text
409
415
  }
410
416
  ),
411
- chosen && !offered && /* @__PURE__ */ jsx(
417
+ chosen && !follows && /* @__PURE__ */ jsx(
412
418
  LanguageChoice,
413
419
  {
414
420
  languages,
@@ -183,6 +183,7 @@ function ItemsView({
183
183
  navigation,
184
184
  rtl = false,
185
185
  layout = "slider",
186
+ orientation = "horizontal",
186
187
  thumbnailSize = 200,
187
188
  request,
188
189
  language,
@@ -212,6 +213,7 @@ function ItemsView({
212
213
  const { langOf } = root;
213
214
  const contrast = useHighContrast(highContrast);
214
215
  const slider = layout === "slider";
216
+ const vertical = slider && orientation === "vertical";
215
217
  const listbox = navigation === "id";
216
218
  const viewport = useRef(null);
217
219
  const masonry = layout === "masonry";
@@ -230,12 +232,13 @@ function ItemsView({
230
232
  }, [masonry]);
231
233
  const track = useScrollTrack({
232
234
  align: listbox ? "center" : "start",
233
- itemCount: items.length
235
+ itemCount: items.length,
236
+ axis: vertical ? "y" : "x"
234
237
  });
235
238
  const held = useRef(void 0);
236
239
  useEffect(() => () => window.clearTimeout(held.current), []);
237
240
  const roving = useRovingFocus(items.length, selected, {
238
- orientation: layout === "slider" ? "horizontal" : layout === "list" ? "vertical" : "both",
241
+ orientation: vertical ? "vertical" : layout === "slider" ? "horizontal" : layout === "list" ? "vertical" : "both",
239
242
  rtl,
240
243
  onActivate: (index, event) => onActivate(items[index], event),
241
244
  onMove: followFocus ? (index, event) => {
@@ -301,7 +304,13 @@ function ItemsView({
301
304
  const positioned = (item) => !(renderItem || localize(item.label, language).text || showSummary && secondary === "summary" && localize(item.summary, language).text);
302
305
  const positionName = (item, index) => positioned(item) ? t("canvasPosition", { index: index + 1, total: items.length }) : void 0;
303
306
  const positionLang = (item) => positioned(item) ? langOf("canvasPosition") : void 0;
304
- const trackStyle = slider ? { display: "flex", margin: 0, padding: 0, listStyle: "none" } : void 0;
307
+ const trackStyle = slider ? {
308
+ display: "flex",
309
+ flexDirection: vertical ? "column" : void 0,
310
+ margin: 0,
311
+ padding: 0,
312
+ listStyle: "none"
313
+ } : void 0;
305
314
  const slideStyle = slider ? { flex: "0 0 auto", scrollSnapAlign: listbox ? "center" : "start" } : void 0;
306
315
  const stepping = listbox && selected >= 0;
307
316
  const scrollButton = (step) => {
@@ -339,7 +348,7 @@ function ItemsView({
339
348
  children: /* @__PURE__ */ jsx(
340
349
  "path",
341
350
  {
342
- d: step === "next" !== rtl ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5",
351
+ d: vertical ? step === "next" ? "M3 6l5 5 5-5" : "M3 10l5-5 5 5" : step === "next" !== rtl ? "M6 3l5 5-5 5" : "M10 3L5 8l5 5",
343
352
  fill: "none",
344
353
  stroke: "currentColor",
345
354
  strokeWidth: "2",
@@ -361,6 +370,7 @@ function ItemsView({
361
370
  ref: root.ref,
362
371
  className: join("clover-items", className),
363
372
  "data-layout": layout,
373
+ "data-orientation": vertical ? "vertical" : void 0,
364
374
  "data-navigation": navigation,
365
375
  ...highContrastProps(contrast),
366
376
  ...rest,
@@ -414,7 +424,7 @@ function ItemsView({
414
424
  ref: listRef,
415
425
  role: "listbox",
416
426
  ...listName,
417
- "aria-orientation": slider ? "horizontal" : layout === "list" ? "vertical" : void 0,
427
+ "aria-orientation": vertical ? "vertical" : slider ? "horizontal" : layout === "list" ? "vertical" : void 0,
418
428
  className: "clover-items-track",
419
429
  style: trackStyle,
420
430
  children: items.map((item, index) => {
@@ -10,6 +10,7 @@ function PagerLayout({
10
10
  forwardedRef,
11
11
  /* eslint-disable @typescript-eslint/no-unused-vars -- Items' own, not the nav's */
12
12
  layout,
13
+ orientation,
13
14
  thumbnailSize,
14
15
  renderItem,
15
16
  header,
@@ -243,7 +243,7 @@ function MapView({
243
243
  scrollZoom,
244
244
  // Its credits behind their ⓘ, in the lower corner; none where left out.
245
245
  attributionControl: credits ? { compact: true } : false,
246
- // MapLibre's own names, in Clover's words; kept current below.
246
+ // MapLibre's own names, in Clover's interface words; kept current below.
247
247
  locale: {
248
248
  "Map.Title": t2("mapLabel"),
249
249
  "NavigationControl.ZoomIn": t2("imageZoomIn"),
@@ -2,11 +2,12 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useContext, useRef, useEffect, Suspense, lazy } from "react";
4
4
  import { useUniqueId } from "../../ui/useUniqueId.mjs";
5
- import { isLoneCanvas } from "../../core/load.mjs";
5
+ import { isLoneCanvas, isImageServiceManifest } from "../../core/load.mjs";
6
6
  import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
7
7
  import { join } from "../../lib/classnames.mjs";
8
8
  import { useCloverSelector } from "../../react/context.mjs";
9
- import { InPanelContext, ReadingLanguages } from "./ReadingLanguages.mjs";
9
+ import { LanguageToggle } from "./LanguageToggle.mjs";
10
+ import { InPanelContext } from "./ReadingLanguages.mjs";
10
11
  import { Thumbnail, Summary, Metadata, RequiredStatement, Rights, Homepage, SeeAlso, Id } from "../Primitives/Primitives.mjs";
11
12
  import { useDownloads } from "../Download/downloads.mjs";
12
13
  import { Provider } from "../Provider/Provider.mjs";
@@ -23,14 +24,24 @@ const NavDate = lazy(
23
24
  () => import("../../ui/NavDate.mjs").then(({ NavDate: NavDate2 }) => ({ default: NavDate2 }))
24
25
  );
25
26
  const PartOfManifest = lazy(() => import("./PartOfManifest.mjs"));
26
- function About({ languages = true, ...props }) {
27
+ function About({
28
+ languages = true,
29
+ interfaceLanguages = true,
30
+ ...props
31
+ }) {
27
32
  const inPanel = useContext(InPanelContext);
28
33
  return /* @__PURE__ */ jsx(
29
34
  AboutContent,
30
35
  {
31
36
  ...props,
32
37
  download: !inPanel && props.download !== false,
33
- choice: inPanel || !languages ? null : /* @__PURE__ */ jsx(ReadingLanguages, { part: "clover-about" })
38
+ choice: inPanel ? null : /* @__PURE__ */ jsx(
39
+ LanguageToggle,
40
+ {
41
+ values: languages,
42
+ interfaceLanguages
43
+ }
44
+ )
34
45
  }
35
46
  );
36
47
  }
@@ -182,7 +193,7 @@ function AboutContent({
182
193
  ),
183
194
  section(
184
195
  isLoneCanvas(manifest) ? "aboutCanvas" : "aboutManifest",
185
- manifest.id,
196
+ !isImageServiceManifest(manifest) && manifest.id,
186
197
  /* @__PURE__ */ jsx(Id, {})
187
198
  )
188
199
  ]
@@ -1,18 +1,12 @@
1
1
  "use client";
2
2
  import { jsxs, jsx } from "react/jsx-runtime";
3
- import { Suspense, lazy, useState, useCallback } from "react";
3
+ import { useState, useCallback, Suspense, lazy } from "react";
4
4
  import { useDownloads } from "../Download/downloads.mjs";
5
5
  import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
6
6
  import { Tip } from "../../ui/Tip.mjs";
7
7
  import { useUniqueId } from "../../ui/useUniqueId.mjs";
8
- import "./ReadingLanguages.mjs";
8
+ import { useLanguageToggle, LanguageToggle } from "./LanguageToggle.mjs";
9
9
  import { languageProps } from "../../i18n/direction.mjs";
10
- import { useReadingLanguages } from "../../react/readingLanguages.mjs";
11
- const LanguageChoice = lazy(
12
- () => import("../../ui/LanguageChoice.mjs").then((module) => ({
13
- default: module.LanguageChoice
14
- }))
15
- );
16
10
  const ControlMenu = lazy(() => import("../Canvas/ControlMenu.mjs"));
17
11
  const DownloadGroups = lazy(
18
12
  () => import("../Download/Download.mjs").then(({ DownloadGroups: DownloadGroups2 }) => ({
@@ -21,22 +15,22 @@ const DownloadGroups = lazy(
21
15
  );
22
16
  function AboutActions({
23
17
  languages = true,
18
+ interfaceLanguages = true,
24
19
  download = true
25
20
  }) {
26
- const choice = useReadingLanguages();
21
+ const choice = useLanguageToggle({ values: languages, interfaceLanguages });
27
22
  const { page, all } = useDownloads();
28
23
  const offered = download && page.length + all.length > 0;
29
- if (!(languages && choice) && !offered) return null;
24
+ if (!choice && !offered) return null;
30
25
  return /* @__PURE__ */ jsxs("div", { className: "clover-about-actions", children: [
31
26
  offered && /* @__PURE__ */ jsx(DownloadButton, { page, all }),
32
- languages && choice && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
33
- LanguageChoice,
27
+ choice && /* @__PURE__ */ jsx(
28
+ LanguageToggle,
34
29
  {
35
- ...choice,
36
- nameKey: "readingLanguage",
37
- part: "clover-about"
30
+ values: languages,
31
+ interfaceLanguages
38
32
  }
39
- ) })
33
+ )
40
34
  ] });
41
35
  }
42
36
  function DownloadButton({
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect, Suspense, lazy } from "react";
4
+ import { cloverI18n } from "../../i18n/config.mjs";
5
+ import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
6
+ import { useClover } from "../../react/context.mjs";
7
+ import { useReadingLanguages } from "../../react/readingLanguages.mjs";
8
+ const LanguageChoice = lazy(
9
+ () => import("../../ui/LanguageChoice.mjs").then((module) => ({
10
+ default: module.LanguageChoice
11
+ }))
12
+ );
13
+ const besideHeading = (place) => {
14
+ var _a;
15
+ const box = place.closest(".clover-sections-actions");
16
+ const label = (_a = box == null ? void 0 : box.closest(".clover-sections-item")) == null ? void 0 : _a.querySelector(".clover-sections-heading .clover-sections-label");
17
+ return box && label ? { box, label } : null;
18
+ };
19
+ const chooseInterface = (tag) => void cloverI18n.chooseInterfaceLanguage(tag);
20
+ function useInterfaceLanguages() {
21
+ useCloverTranslation();
22
+ const { languages, chosen } = cloverI18n.interfaceLanguages();
23
+ return languages.length > 1 ? { languages, chosen } : null;
24
+ }
25
+ function useLanguageToggle({
26
+ values = true,
27
+ interfaceLanguages = true
28
+ } = {}) {
29
+ const reading = useReadingLanguages();
30
+ const spoken = useInterfaceLanguages();
31
+ const own = values ? (reading == null ? void 0 : reading.languages) ?? [] : [];
32
+ const names = (tag) => own.some((each) => each === tag || cloverI18n.stringsFor(each) === tag);
33
+ const languages = [
34
+ ...own,
35
+ ...(interfaceLanguages ? (spoken == null ? void 0 : spoken.languages) ?? [] : []).filter(
36
+ (tag) => !names(tag)
37
+ )
38
+ ];
39
+ if (languages.length < 2) return null;
40
+ const picked = cloverI18n.chosenLanguage;
41
+ const pickedTag = picked && cloverI18n.stringsFor(picked);
42
+ const chosen = pickedTag && languages.includes(pickedTag) && !names(pickedTag) ? pickedTag : values && reading ? reading.chosen : (spoken == null ? void 0 : spoken.chosen) ?? languages[0];
43
+ const onChange = (tag) => own.includes(tag) && reading ? reading.onChange(tag) : chooseInterface(tag);
44
+ return { languages, chosen, onChange };
45
+ }
46
+ function LanguageToggle({
47
+ values,
48
+ interfaceLanguages
49
+ }) {
50
+ const choice = useLanguageToggle({ values, interfaceLanguages });
51
+ const { drawsToggle } = useClover("About");
52
+ const drawn = !!choice;
53
+ useEffect(() => drawn ? drawsToggle == null ? void 0 : drawsToggle() : void 0, [drawn, drawsToggle]);
54
+ if (!choice) return null;
55
+ return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
56
+ LanguageChoice,
57
+ {
58
+ ...choice,
59
+ nameKey: "readingLanguage",
60
+ part: "clover-about",
61
+ fit: besideHeading
62
+ }
63
+ ) });
64
+ }
65
+ export {
66
+ LanguageToggle,
67
+ useInterfaceLanguages,
68
+ useLanguageToggle
69
+ };
@@ -52,6 +52,7 @@ const Panel = forwardRef(function Panel2({
52
52
  as: Tag = "aside",
53
53
  download = true,
54
54
  languages = true,
55
+ interfaceLanguages = true,
55
56
  sections,
56
57
  labels,
57
58
  className,
@@ -88,7 +89,14 @@ const Panel = forwardRef(function Panel2({
88
89
  (child) => React.isValidElement(child) && child.type === Tab
89
90
  );
90
91
  const inner = layout === "accordion" ? headingLevel + 1 : headingLevel;
91
- const aboutActions = languages || download ? /* @__PURE__ */ jsx(AboutActions, { languages, download }) : void 0;
92
+ const aboutActions = languages || interfaceLanguages || download ? /* @__PURE__ */ jsx(
93
+ AboutActions,
94
+ {
95
+ languages,
96
+ interfaceLanguages,
97
+ download
98
+ }
99
+ ) : void 0;
92
100
  const tabs = given.length ? given.map(({ props }) => ({
93
101
  value: props.value,
94
102
  label: props.label,
@@ -1,20 +1,6 @@
1
1
  "use client";
2
- import { jsx } from "react/jsx-runtime";
3
- import { createContext, Suspense, lazy } from "react";
4
- import { useReadingLanguages } from "../../react/readingLanguages.mjs";
5
- const LanguageChoice = lazy(
6
- () => import("../../ui/LanguageChoice.mjs").then((module) => ({
7
- default: module.LanguageChoice
8
- }))
9
- );
2
+ import { createContext } from "react";
10
3
  const InPanelContext = createContext(false);
11
- function ReadingLanguages({ part }) {
12
- const choice = useReadingLanguages();
13
- if (!choice) return null;
14
- return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(LanguageChoice, { ...choice, nameKey: "readingLanguage", part }) });
15
- }
16
4
  export {
17
- InPanelContext,
18
- ReadingLanguages,
19
- useReadingLanguages
5
+ InPanelContext
20
6
  };
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { canvasTimedText, canvasTextTranscripts } from "../Canvas/layout.mjs";
3
3
  import { hasMapData } from "../../core/geo-detect.mjs";
4
+ import { isImageServiceManifest } from "../../core/load.mjs";
4
5
  import { searchServiceOf } from "../../core/search-service.mjs";
5
6
  import { tableOfContents } from "../../core/ranges.mjs";
6
7
  import { selectVisibleCanvases, partOfCollection } from "../../core/selectors.mjs";
@@ -17,6 +18,10 @@ const PANEL_SECTIONS = [
17
18
  "annotations"
18
19
  ];
19
20
  const HAS = {
21
+ about: (state) => {
22
+ var _a, _b;
23
+ return !isImageServiceManifest(state.manifest) || Boolean(((_a = state.manifest) == null ? void 0 : _a.rights) || ((_b = state.manifest) == null ? void 0 : _b.requiredStatement));
24
+ },
20
25
  // A content state's several targets (Cookbook 0540), listed as a Collection's members are.
21
26
  targets: (state) => {
22
27
  var _a;
@@ -46,7 +51,7 @@ const narrow = (data, sections) => {
46
51
  };
47
52
  function usePanelSections(sections) {
48
53
  const data = {
49
- about: true,
54
+ about: useCloverSelector(HAS.about),
50
55
  targets: useCloverSelector(HAS.targets),
51
56
  collection: useCloverSelector(HAS.collection),
52
57
  contents: useCloverSelector(HAS.contents),
@@ -1,7 +1,8 @@
1
1
  "use client";
2
- import { useRef, useState, useEffect, useMemo, useSyncExternalStore } from "react";
2
+ import { useRef, useState, useEffect, useSyncExternalStore, useCallback, useMemo } from "react";
3
3
  import { createClover } from "../../core/clover.mjs";
4
4
  import { requestKey } from "../../core/request.mjs";
5
+ import { cloverI18n } from "../../i18n/config.mjs";
5
6
  import { useRootContentState } from "../../react/useContentStateOutput.mjs";
6
7
  import { sameRenderers } from "../Body/renderers.mjs";
7
8
  function useRootState({
@@ -117,15 +118,56 @@ function useRootState({
117
118
  setChosenUnder(language);
118
119
  setChosen(void 0);
119
120
  }
120
- const reading = chosen ?? language;
121
+ const moved = useRef(void 0);
122
+ const [chosenFor, setChosenFor] = useState(key);
123
+ if (chosenFor !== key) {
124
+ setChosenFor(key);
125
+ setChosen(void 0);
126
+ }
127
+ useEffect(
128
+ () => () => {
129
+ const spoken = moved.current;
130
+ moved.current = void 0;
131
+ if (spoken && cloverI18n.chosenLanguage === spoken)
132
+ void cloverI18n.chooseInterfaceLanguage();
133
+ },
134
+ [key]
135
+ );
136
+ const interfaceChosen = useSyncExternalStore(
137
+ cloverI18n.subscribe,
138
+ () => cloverI18n.chosenLanguage,
139
+ () => cloverI18n.chosenLanguage
140
+ );
141
+ const reading = chosen ?? language ?? interfaceChosen;
142
+ const chooseLanguage = useCallback((tag) => {
143
+ setChosen(tag);
144
+ const spoken = cloverI18n.stringsFor(tag);
145
+ moved.current = spoken;
146
+ if (spoken) void cloverI18n.chooseInterfaceLanguage(spoken);
147
+ }, []);
148
+ const [toggles, setToggles] = useState(0);
149
+ const drawsToggle = useCallback(() => {
150
+ setToggles((count) => count + 1);
151
+ return () => setToggles((count) => count - 1);
152
+ }, []);
153
+ const toggleDrawn = toggles > 0;
121
154
  const context = useMemo(
122
155
  () => ({
123
156
  clover,
124
157
  language: reading,
125
158
  renderers: stableRenderers,
126
- chooseLanguage: setChosen
159
+ chooseLanguage,
160
+ toggleDrawn,
161
+ drawsToggle
127
162
  }),
128
- [clover, reading, stableRenderers]
163
+ [
164
+ clover,
165
+ reading,
166
+ stableRenderers,
167
+ chooseLanguage,
168
+ toggleDrawn,
169
+ drawsToggle
170
+ ]
129
171
  );
130
172
  return [context, status, rest];
131
173
  }
@@ -35,6 +35,7 @@ const Search = forwardRef(function Search2({
35
35
  (state) => selectSequence(state.manifest).canvases
36
36
  );
37
37
  const selected = useCloverSelector((state) => state.annotationId);
38
+ const canvasId = useCloverSelector((state) => state.canvasId);
38
39
  const highlighted = useSyncExternalStore(
39
40
  clover.highlight.subscribe,
40
41
  clover.highlight.get,
@@ -52,12 +53,14 @@ const Search = forwardRef(function Search2({
52
53
  if (search.status !== "ready" || !search.set) return;
53
54
  if (arrived.current === search.set) return;
54
55
  arrived.current = search.set;
55
- const first = search.hits[0];
56
56
  const chosen = search.hits.some(
57
57
  (hit) => selected && hit.entryIds.includes(selected)
58
58
  );
59
- if (first && !chosen) clover.selectAnnotation(first.entryIds[0]);
60
- }, [clover, search.status, search.set, search.hits, selected]);
59
+ if (chosen) return;
60
+ const here = search.hits.find((hit) => hit.canvasId === canvasId);
61
+ const to = here ?? search.hits[0];
62
+ if (to) clover.selectAnnotation(to.entryIds[0]);
63
+ }, [clover, search.status, search.set, search.hits, selected, canvasId]);
61
64
  useEffect(() => {
62
65
  var _a;
63
66
  const held = (_a = field.current) == null ? void 0 : _a.closest(
@@ -185,8 +188,8 @@ const Search = forwardRef(function Search2({
185
188
  }
186
189
  ) }),
187
190
  bar,
188
- groups.map(({ canvasId, hits }, index) => {
189
- const canvas = canvases.find((item) => item.id === canvasId);
191
+ groups.map(({ canvasId: canvasId2, hits }, index) => {
192
+ const canvas = canvases.find((item) => item.id === canvasId2);
190
193
  const label = localize(canvas == null ? void 0 : canvas.label, language);
191
194
  return /* @__PURE__ */ jsxs(
192
195
  "section",
@@ -200,7 +203,7 @@ const Search = forwardRef(function Search2({
200
203
  id: `${id}-${index}`,
201
204
  className: "clover-content-search-canvas",
202
205
  ...languageProps(label.text ? label.lang : void 0),
203
- children: label.text || canvasId
206
+ children: label.text || canvasId2
204
207
  }
205
208
  ),
206
209
  /* @__PURE__ */ jsx("ol", { className: "clover-content-search-hits", children: hits.map(({ hit, index: place }) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
@@ -227,7 +230,7 @@ const Search = forwardRef(function Search2({
227
230
  ) }, hit.id)) })
228
231
  ]
229
232
  },
230
- `${canvasId}-${index}`
233
+ `${canvasId2}-${index}`
231
234
  );
232
235
  }),
233
236
  shown < count && /* @__PURE__ */ jsx(
@@ -13,7 +13,8 @@ import { playFrom } from "../../lib/time.mjs";
13
13
  import { sameLanguage } from "../../i18n/languages.mjs";
14
14
  import { languageProps } from "../../i18n/direction.mjs";
15
15
  import { useClover, useCloverSelector } from "../../react/context.mjs";
16
- import { useReadingLanguages } from "../../react/readingLanguages.mjs";
16
+ import { useReadingLanguages, covers } from "../../react/readingLanguages.mjs";
17
+ import { GlobeGlyph } from "../../ui/GlobeGlyph.mjs";
17
18
  import { bringIntoView, scrollerOf } from "../../ui/bringIntoView.mjs";
18
19
  import { CueTime } from "../../ui/Cue.mjs";
19
20
  import { FieldPill } from "../../ui/FieldPill.mjs";
@@ -209,40 +210,48 @@ const Transcript = forwardRef(
209
210
  (code) => code && shown.filter((each) => each === code).length === 1 ? code : void 0
210
211
  );
211
212
  const lang = track.language && track.language !== "none" ? track.language : void 0;
212
- const languages = tracks.length > 1 && !offered && /* @__PURE__ */ jsxs(Fragment, { children: [
213
+ const files = tracks.some((each) => each.read === "text");
214
+ const follows = covers(
215
+ offered,
216
+ tracks.map((each) => each.language)
217
+ );
218
+ const languages = tracks.length > 1 && (files || !follows) && /* @__PURE__ */ jsxs(Fragment, { children: [
213
219
  name.node,
214
- /* @__PURE__ */ jsx("fieldset", { ...name.props, className: "clover-transcript-languages", children: tracks.map((option, index) => {
215
- const label = localize(option.label, language);
216
- const code = codes[index];
217
- const text = label.text || option.language || String(index + 1);
218
- return /* @__PURE__ */ jsxs("label", { className: "clover-transcript-language", children: [
219
- /* @__PURE__ */ jsx(
220
- "input",
221
- {
222
- type: "radio",
223
- name: `${id}-language`,
224
- checked: index === choice,
225
- onChange: () => {
226
- setChoice(index);
227
- if (isCaptionTrack(option)) clover.captions.emit(option.id);
220
+ /* @__PURE__ */ jsxs("fieldset", { ...name.props, className: "clover-transcript-languages", children: [
221
+ !files && /* @__PURE__ */ jsx("span", { className: "clover-languages-glyph", "aria-hidden": "true", children: /* @__PURE__ */ jsx(GlobeGlyph, {}) }),
222
+ tracks.map((option, index) => {
223
+ const label = localize(option.label, language);
224
+ const code = codes[index];
225
+ const text = label.text || option.language || String(index + 1);
226
+ return /* @__PURE__ */ jsxs("label", { className: "clover-transcript-language", children: [
227
+ /* @__PURE__ */ jsx(
228
+ "input",
229
+ {
230
+ type: "radio",
231
+ name: `${id}-language`,
232
+ checked: index === choice,
233
+ onChange: () => {
234
+ setChoice(index);
235
+ if (isCaptionTrack(option)) clover.captions.emit(option.id);
236
+ }
228
237
  }
229
- }
230
- ),
231
- code && /* @__PURE__ */ jsxs(Fragment, { children: [
232
- /* @__PURE__ */ jsx("span", { className: "clover-transcript-code", children: code }),
233
- " "
234
- ] }),
235
- /* @__PURE__ */ jsx(
236
- "span",
237
- {
238
- style: code ? visuallyHidden : void 0,
239
- ...languageProps(label.text ? label.lang : void 0),
240
- children: text
241
- }
242
- ),
243
- code && label.text && /* @__PURE__ */ jsx(Tip, { label: label.text, lang: label.lang })
244
- ] }, option.id);
245
- }) })
238
+ ),
239
+ code && /* @__PURE__ */ jsxs(Fragment, { children: [
240
+ /* @__PURE__ */ jsx("span", { className: "clover-transcript-code", children: code }),
241
+ " "
242
+ ] }),
243
+ /* @__PURE__ */ jsx(
244
+ "span",
245
+ {
246
+ style: code ? visuallyHidden : void 0,
247
+ ...languageProps(label.text ? label.lang : void 0),
248
+ children: text
249
+ }
250
+ ),
251
+ code && label.text && /* @__PURE__ */ jsx(Tip, { label: label.text, lang: label.lang })
252
+ ] }, option.id);
253
+ })
254
+ ] })
246
255
  ] });
247
256
  const seek = (cue, play = true) => {
248
257
  if (element) {