@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
@@ -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,53 @@ 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
+ const spoken = moved.current;
129
+ moved.current = void 0;
130
+ if (spoken && cloverI18n.chosenLanguage === spoken)
131
+ void cloverI18n.chooseInterfaceLanguage();
132
+ }, [key]);
133
+ const interfaceChosen = useSyncExternalStore(
134
+ cloverI18n.subscribe,
135
+ () => cloverI18n.chosenLanguage,
136
+ () => cloverI18n.chosenLanguage
137
+ );
138
+ const reading = chosen ?? language ?? interfaceChosen;
139
+ const chooseLanguage = useCallback((tag) => {
140
+ setChosen(tag);
141
+ const spoken = cloverI18n.stringsFor(tag);
142
+ moved.current = spoken;
143
+ if (spoken) void cloverI18n.chooseInterfaceLanguage(spoken);
144
+ }, []);
145
+ const [toggles, setToggles] = useState(0);
146
+ const drawsToggle = useCallback(() => {
147
+ setToggles((count) => count + 1);
148
+ return () => setToggles((count) => count - 1);
149
+ }, []);
150
+ const toggleDrawn = toggles > 0;
121
151
  const context = useMemo(
122
152
  () => ({
123
153
  clover,
124
154
  language: reading,
125
155
  renderers: stableRenderers,
126
- chooseLanguage: setChosen
156
+ chooseLanguage,
157
+ toggleDrawn,
158
+ drawsToggle
127
159
  }),
128
- [clover, reading, stableRenderers]
160
+ [
161
+ clover,
162
+ reading,
163
+ stableRenderers,
164
+ chooseLanguage,
165
+ toggleDrawn,
166
+ drawsToggle
167
+ ]
129
168
  );
130
169
  return [context, status, rest];
131
170
  }
@@ -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) {
@@ -0,0 +1,108 @@
1
+ "use client";
2
+ import { parseInfo, imageRequestUrl } from "../lib/renderer/sources/imageService.mjs";
3
+ import { toPresentation4 } from "./presentation.mjs";
4
+ function fittedSize(info) {
5
+ const { width, height, maxWidth, maxHeight, maxArea } = info;
6
+ const fits = (w, h) => (!maxWidth || w <= maxWidth) && (!maxHeight || h <= maxHeight) && (!maxArea || w * h <= maxArea);
7
+ if (fits(width, height)) return { width, height };
8
+ const listed = info.sizes.filter((size) => fits(size.width, size.height));
9
+ if (listed.length) return listed[listed.length - 1];
10
+ if (!info.sizeByW) return { width, height };
11
+ const scale = Math.min(
12
+ maxWidth ? maxWidth / width : 1,
13
+ maxHeight ? maxHeight / height : 1,
14
+ maxArea ? Math.sqrt(maxArea / (width * height)) : 1
15
+ );
16
+ return {
17
+ width: Math.max(1, Math.floor(width * scale)),
18
+ height: Math.max(1, Math.floor(height * scale))
19
+ };
20
+ }
21
+ function thumbnailSize(info, edge = 200) {
22
+ return info.sizes.find((size) => Math.max(size.width, size.height) >= edge) ?? fittedSize(info);
23
+ }
24
+ const FORMATS = {
25
+ jpg: "image/jpeg",
26
+ png: "image/png",
27
+ webp: "image/webp",
28
+ gif: "image/gif"
29
+ };
30
+ function imageBody(info, service, size) {
31
+ const whole = { x: 0, y: 0, width: info.width, height: info.height };
32
+ return {
33
+ id: imageRequestUrl(info, whole, size.width, size.height),
34
+ type: "Image",
35
+ format: FORMATS[info.format] ?? "image/jpeg",
36
+ width: size.width,
37
+ height: size.height,
38
+ service: [service]
39
+ };
40
+ }
41
+ function serviceEntry(doc, info) {
42
+ if (info.version === 3) {
43
+ return {
44
+ id: info.id,
45
+ type: "ImageService3",
46
+ profile: typeof doc.profile === "string" ? doc.profile : "level0"
47
+ };
48
+ }
49
+ const profile = [].concat(doc.profile ?? []).find((value) => typeof value === "string");
50
+ return {
51
+ "@id": info.id,
52
+ "@type": "ImageService2",
53
+ profile: profile ?? "http://iiif.io/api/image/2/level0.json"
54
+ };
55
+ }
56
+ async function imageServiceContent(json, requestedId) {
57
+ const info = parseInfo(json, requestedId);
58
+ const service = serviceEntry(json, info);
59
+ const canvasId = `${info.id}/canvas`;
60
+ const rights = [json.rights, json.license].flat().find((value) => typeof value === "string");
61
+ const attribution = json.attribution;
62
+ const manifest = {
63
+ "@context": "http://iiif.io/api/presentation/3/context.json",
64
+ id: info.id,
65
+ type: "Manifest",
66
+ label: { none: [""] },
67
+ thumbnail: [imageBody(info, service, thumbnailSize(info))],
68
+ items: [
69
+ {
70
+ id: canvasId,
71
+ type: "Canvas",
72
+ width: info.width,
73
+ height: info.height,
74
+ items: [
75
+ {
76
+ id: `${canvasId}/page`,
77
+ type: "AnnotationPage",
78
+ items: [
79
+ {
80
+ id: `${canvasId}/page/image`,
81
+ type: "Annotation",
82
+ motivation: "painting",
83
+ body: imageBody(info, service, fittedSize(info)),
84
+ target: canvasId
85
+ }
86
+ ]
87
+ }
88
+ ]
89
+ }
90
+ ]
91
+ };
92
+ if (rights) manifest.rights = rights;
93
+ if (attribution) {
94
+ manifest.requiredStatement = {
95
+ label: { en: ["Attribution"] },
96
+ value: {
97
+ none: [].concat(attribution).map(
98
+ (value) => typeof value === "string" ? value : String((value == null ? void 0 : value["@value"]) ?? "")
99
+ ).filter(Boolean)
100
+ }
101
+ };
102
+ }
103
+ return { manifest: await toPresentation4(manifest) };
104
+ }
105
+ export {
106
+ fittedSize,
107
+ imageServiceContent
108
+ };
@@ -14,6 +14,30 @@ function isContentState(json) {
14
14
  }
15
15
  return value.type === "SpecificResource";
16
16
  }
17
+ const isImageService = (json) => Boolean(json) && typeof json === "object" && /ImageService[123]|iiif\.io\/api\/image/.test(
18
+ JSON.stringify(
19
+ ["@context", "type", "@type", "protocol"].map(
20
+ (key) => json[key]
21
+ )
22
+ )
23
+ );
24
+ async function fetchContent(request, url, signal) {
25
+ try {
26
+ return await fetchJson(request, url, signal);
27
+ } catch (error) {
28
+ if ((signal == null ? void 0 : signal.aborted) || /\.json([?#]|$)/i.test(url)) throw error;
29
+ try {
30
+ const json = await fetchJson(
31
+ request,
32
+ `${url.replace(/\/+$/, "")}/info.json`,
33
+ signal
34
+ );
35
+ if (isImageService(json)) return json;
36
+ } catch {
37
+ }
38
+ throw error;
39
+ }
40
+ }
17
41
  const DESCRIPTIVE = [
18
42
  "summary",
19
43
  "metadata",
@@ -45,6 +69,10 @@ const isLoneCanvas = (manifest) => {
45
69
  var _a, _b;
46
70
  return Boolean(manifest) && ((_b = (_a = manifest.items) == null ? void 0 : _a[0]) == null ? void 0 : _b.id) === manifest.id;
47
71
  };
72
+ const isImageServiceManifest = (manifest) => {
73
+ var _a, _b;
74
+ return Boolean(manifest) && ((_a = manifest.items) == null ? void 0 : _a.length) === 1 && ((_b = manifest.items[0]) == null ? void 0 : _b.id) === `${manifest.id}/canvas`;
75
+ };
48
76
  const ANNOTATIONS = /^(oa:)?Annotation(Page|Collection)$/;
49
77
  class CloverContentError extends Error {
50
78
  constructor() {
@@ -132,7 +160,7 @@ async function loadContent(input, options = {}) {
132
160
  };
133
161
  if (typeof input === "string") {
134
162
  if (isUrl(input.trim())) {
135
- json = await fetchJson(request, input.trim(), signal);
163
+ json = await fetchContent(request, input.trim(), signal);
136
164
  } else {
137
165
  const { decodeContentState } = await readContentState();
138
166
  const state = decodeContentState(input);
@@ -149,6 +177,13 @@ async function loadContent(input, options = {}) {
149
177
  const { annotationsContent } = await import("./annotations-content.mjs");
150
178
  return annotationsContent(json, options);
151
179
  }
180
+ if (isImageService(json)) {
181
+ const { imageServiceContent } = await import("./image-service-content.mjs");
182
+ return imageServiceContent(
183
+ json,
184
+ typeof input === "string" ? input.trim() : void 0
185
+ );
186
+ }
152
187
  const resource = await toPresentation4(json);
153
188
  (_a = signal == null ? void 0 : signal.throwIfAborted) == null ? void 0 : _a.call(signal);
154
189
  switch (resource.type) {
@@ -185,6 +220,8 @@ async function loadContent(input, options = {}) {
185
220
  export {
186
221
  CloverContentError,
187
222
  fetchResource,
223
+ isImageService,
224
+ isImageServiceManifest,
188
225
  isLoneCanvas,
189
226
  loadContent,
190
227
  loadManifest,
@@ -11,7 +11,7 @@ function localize(value, language, separator = ", ") {
11
11
  const tag = languageToRead(tags, language);
12
12
  const entry = value[tag];
13
13
  const text = Array.isArray(entry) ? entry.join(separator) : String(entry);
14
- return { text, lang: tag === "none" ? void 0 : tag };
14
+ return { text, lang: tag === "none" || tag === "@none" ? void 0 : tag };
15
15
  }
16
16
  const TAG = /^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$/;
17
17
  function hrefLangOf(resource) {