@nulib/clover 4.4.2 → 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 (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 +43 -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-BklM8JA9.mjs +1 -0
  41. package/dist/web-components/AnnotationItems-4mbvOrhN.mjs +1 -0
  42. package/dist/web-components/{AnnotationMenu-BiM0n-6H.mjs → AnnotationMenu-DtMaxXf5.mjs} +1 -1
  43. package/dist/web-components/AnnotationState-BuEpq99k.mjs +1 -0
  44. package/dist/web-components/Annotations-Dyg-RAdd.mjs +2 -0
  45. package/dist/web-components/{Annotations-x5H_Vls9.mjs → Annotations-oPabBO7j.mjs} +1 -1
  46. package/dist/web-components/{Body-BWOsHKU1.mjs → Body-CD7AtOPv.mjs} +1 -1
  47. package/dist/web-components/{BodyAlert-DYfrepDo.mjs → BodyAlert-DzW4__bK.mjs} +1 -1
  48. package/dist/web-components/{Button-Ch0E6GVj.mjs → Button-1To2Pwuz.mjs} +1 -1
  49. package/dist/web-components/{Camera-CY4adJpn.mjs → Camera-B82ZMekU.mjs} +1 -1
  50. package/dist/web-components/{Canvas2DBackend-eFcDTxq6.mjs → Canvas2DBackend-Ds-qoQ0W.mjs} +1 -1
  51. package/dist/web-components/{CanvasView-BqsXUI8n.mjs → CanvasView-B4fnYim4.mjs} +2 -2
  52. package/dist/web-components/{CaptionDetails-CuYSbD70.mjs → CaptionDetails-TTAEPH02.mjs} +1 -1
  53. package/dist/web-components/{ChaptersMenu-IlAt1pp2.mjs → ChaptersMenu-DhbAktrS.mjs} +1 -1
  54. package/dist/web-components/{Chevron-uZe3N2Pt.mjs → Chevron-Br3zRRMX.mjs} +1 -1
  55. package/dist/web-components/{ChoiceMenu-DBJynLGl.mjs → ChoiceMenu-B4_doj7b.mjs} +1 -1
  56. package/dist/web-components/{Collection-C1sRlJK1.mjs → Collection-DrMfq53r.mjs} +1 -1
  57. package/dist/web-components/{CollectionSelect-BYMQaanx.mjs → CollectionSelect-PP7IEcwu.mjs} +1 -1
  58. package/dist/web-components/{Connected-Bd2T2EUc.mjs → Connected-BOPNEv3j.mjs} +1 -1
  59. package/dist/web-components/{Connected-Dpp3iO3D.mjs → Connected-BguZSgy4.mjs} +1 -1
  60. package/dist/web-components/{Connected-Ckar86TI.mjs → Connected-CN94wOYw.mjs} +1 -1
  61. package/dist/web-components/{Contents-DjtD3iKA.mjs → Contents-Dn7MutL9.mjs} +1 -1
  62. package/dist/web-components/{ControlMenu-CaD8Frag.mjs → ControlMenu-DlP3JsqV.mjs} +1 -1
  63. package/dist/web-components/ControlsFade-Cuh5Mqe7.mjs +1 -0
  64. package/dist/web-components/{CountMenu-DBiLd3X6.mjs → CountMenu-Aoott7Hu.mjs} +1 -1
  65. package/dist/web-components/Cue-BAj92VWz.mjs +1 -0
  66. package/dist/web-components/Document-BjTWX_7P.mjs +1 -0
  67. package/dist/web-components/{DomLayers-DXbbsOVO.mjs → DomLayers-GnBlZ7yI.mjs} +1 -1
  68. package/dist/web-components/{Download-CgRv1Jio.mjs → Download-C1RNBLdn.mjs} +1 -1
  69. package/dist/web-components/{EntryBodies-DnXLIVR-.mjs → EntryBodies-BG4F8uub.mjs} +1 -1
  70. package/dist/web-components/{EntryThumbnail-BtRvqME5.mjs → EntryThumbnail-BJPQwkQw.mjs} +1 -1
  71. package/dist/web-components/{FieldPill-CmagfxvU.mjs → FieldPill-CgMPW9BB.mjs} +1 -1
  72. package/dist/web-components/{FrameAnimation-DmqYAi-M.mjs → FrameAnimation-DWd0yBuN.mjs} +1 -1
  73. package/dist/web-components/Gallery-DpJqgaft.mjs +1 -0
  74. package/dist/web-components/GlobeGlyph-CLM28n1E.mjs +1 -0
  75. package/dist/web-components/{HideToggle-aDBXi6F0.mjs → HideToggle-C4mW4-CK.mjs} +1 -1
  76. package/dist/web-components/{ImageControls-CdEwkNkw.mjs → ImageControls-B36Hng03.mjs} +1 -1
  77. package/dist/web-components/Items-BApzELFW.mjs +1 -0
  78. package/dist/web-components/Label-CRTQApU-.mjs +1 -0
  79. package/dist/web-components/LanguageChoice-B1941Wuu.mjs +1 -0
  80. package/dist/web-components/LanguageMenu-yWDzK3U0.mjs +1 -0
  81. package/dist/web-components/LightboxView-BLHI5EIj.mjs +1 -0
  82. package/dist/web-components/{ListEnd-D1Y0rzNK.mjs → ListEnd-CIiLZZzc.mjs} +1 -1
  83. package/dist/web-components/{Loaded-Bebqgt6V.mjs → Loaded-X_Pr53fq.mjs} +1 -1
  84. package/dist/web-components/LoadedCanvas-1Bi6-QtF.mjs +1 -0
  85. package/dist/web-components/LoadedMap-58bpxj_6.mjs +1 -0
  86. package/dist/web-components/{Loading-B5lpxt7E.mjs → Loading-CyoVEwax.mjs} +1 -1
  87. package/dist/web-components/{Map-DsHQLS6G.mjs → Map-2oeDIJzq.mjs} +1 -1
  88. package/dist/web-components/MapView-DX3ZLqmp.mjs +3 -0
  89. package/dist/web-components/{Markup-CQb91uB6.mjs → Markup-B2GbrisO.mjs} +1 -1
  90. package/dist/web-components/{MediaBody-CuCVF-N7.mjs → MediaBody-DZ9JgkKF.mjs} +1 -1
  91. package/dist/web-components/{MediaBody-BbipyE0n.mjs → MediaBody-eFAZIyGv.mjs} +1 -1
  92. package/dist/web-components/{NavDate-CjJTuBbs.mjs → NavDate-BwV4kPl-.mjs} +1 -1
  93. package/dist/web-components/{Navigator-BKVI3csP.mjs → Navigator-CTrfNuwj.mjs} +1 -1
  94. package/dist/web-components/{Pager-CTvxvbel.mjs → Pager-BGjj90LQ.mjs} +1 -1
  95. package/dist/web-components/PagerLayout-Ce7zW_yB.mjs +1 -0
  96. package/dist/web-components/Panel-77xi6y2C.mjs +1 -0
  97. package/dist/web-components/PanelPart-Cm9VykIu.mjs +1 -0
  98. package/dist/web-components/{PanelToggle-Dsp3JD1s.mjs → PanelToggle-Cj_FjIgS.mjs} +1 -1
  99. package/dist/web-components/{PartOfManifest-Bu5XTdcH.mjs → PartOfManifest-B0RwR4iy.mjs} +1 -1
  100. package/dist/web-components/{Pending-C7ZSt2eL.mjs → Pending-s7yYnZzR.mjs} +1 -1
  101. package/dist/web-components/{PlaceBox-PwpqCwOS.mjs → PlaceBox-pt7Vmrs1.mjs} +1 -1
  102. package/dist/web-components/{Placeholder-B_DxAE6y.mjs → Placeholder-BK-eqSCl.mjs} +1 -1
  103. package/dist/web-components/{Position-CQ7FBqd0.mjs → Position-CKsSKMgZ.mjs} +1 -1
  104. package/dist/web-components/Primitives-T7usOLie.mjs +1 -0
  105. package/dist/web-components/Provider-B2k1G-E0.mjs +1 -0
  106. package/dist/web-components/{ReadMore-0vMRgzA8.mjs → ReadMore-Cs2t9xkI.mjs} +1 -1
  107. package/dist/web-components/Root-D942bSXu.mjs +1 -0
  108. package/dist/web-components/Scene-Cwzisn4E.mjs +1 -0
  109. package/dist/web-components/{SceneView-DSUVfGQR.mjs → SceneView-_CNm8cGL.mjs} +1 -1
  110. package/dist/web-components/Search-u43mfzT8.mjs +1 -0
  111. package/dist/web-components/{Sections-BdEZZD0J.mjs → Sections-CPU5bGvk.mjs} +1 -1
  112. package/dist/web-components/{SeekMarks-ByDBrurH.mjs → SeekMarks-CnqVS-ym.mjs} +1 -1
  113. package/dist/web-components/StandaloneItems-D9Og9pdI.mjs +1 -0
  114. package/dist/web-components/{Status-CK2v5LdZ.mjs → Status-Cxev3WuC.mjs} +1 -1
  115. package/dist/web-components/{Steps-DlYRgYiS.mjs → Steps-l7_NsIBr.mjs} +1 -1
  116. package/dist/web-components/{TargetItems-B0ZkDWAH.mjs → TargetItems-nP3Oa9hh.mjs} +1 -1
  117. package/dist/web-components/Timeline-C1g1MXp5.mjs +1 -0
  118. package/dist/web-components/{Tip-BPxXnFcb.mjs → Tip-D2pR3HW4.mjs} +1 -1
  119. package/dist/web-components/Transcript-D_a9jio-.mjs +1 -0
  120. package/dist/web-components/{Transport-nQ1ytZeY.mjs → Transport-CowDRPK7.mjs} +1 -1
  121. package/dist/web-components/{Transport-Cc1VnGe1.mjs → Transport-uqpqUIKE.mjs} +1 -1
  122. package/dist/web-components/{annotation-collection-JrLc_Org.mjs → annotation-collection-d6JyHnML.mjs} +1 -1
  123. package/dist/web-components/{annotation-name-WwXE5c2m.mjs → annotation-name-BWTrB9nK.mjs} +1 -1
  124. package/dist/web-components/{annotations-content-G5YUyhp2.mjs → annotations-content-Bomfao_5.mjs} +1 -1
  125. package/dist/web-components/{body-BvY3Vpf_.mjs → body-Dfn0GJa2.mjs} +1 -1
  126. package/dist/web-components/{canvas-CaNpS96c.mjs → canvas-DHIn2DIV.mjs} +1 -1
  127. package/dist/web-components/{cloverEngine-Cpp8BjZa.mjs → cloverEngine-DDVOcZTv.mjs} +1 -1
  128. package/dist/web-components/{content-state-reader-DakKAf36.mjs → content-state-reader-CyNkhTZY.mjs} +1 -1
  129. package/dist/web-components/{controlGlyphs-bqWNGQ1-.mjs → controlGlyphs-Dymy1PkA.mjs} +1 -1
  130. package/dist/web-components/{controls-Db0929rf.mjs → controls-CIkf2UoE.mjs} +1 -1
  131. package/dist/web-components/custom-elements.json +35 -3
  132. package/dist/web-components/downloads-DCsDCcA8.mjs +1 -0
  133. package/dist/web-components/{dragToClose-D5AN98l4.mjs → dragToClose-BKcu5guw.mjs} +1 -1
  134. package/dist/web-components/{engine-B1m2m56g.mjs → engine-BhdQsvOB.mjs} +1 -1
  135. package/dist/web-components/{engines-CBm3cDwx.mjs → engines-pnfVMoUH.mjs} +1 -1
  136. package/dist/web-components/{fetchManifest-lvHWlQYu.mjs → fetchManifest-QmVIeaHo.mjs} +1 -1
  137. package/dist/web-components/{fromManifest-ZbH8cYoN.mjs → fromManifest-CvXwGGRI.mjs} +1 -1
  138. package/dist/web-components/{glyphs-BtnJwbd5.mjs → glyphs-BAh9Lia0.mjs} +1 -1
  139. package/dist/web-components/hooks-CTqjdpYl.mjs +1 -0
  140. package/dist/web-components/{image-layers-DjUA6eWF.mjs → image-layers-Dp2qOSA5.mjs} +1 -1
  141. package/dist/web-components/image-service-content-B5ICMeIO.mjs +1 -0
  142. package/dist/web-components/{imageService-B9yNXMcD.mjs → imageService-XKWMYAcG.mjs} +1 -1
  143. package/dist/web-components/index-BuoWCrun.mjs +1 -0
  144. package/dist/web-components/index.mjs +1 -1
  145. package/dist/web-components/items-8ZEJCxWU.mjs +1 -0
  146. package/dist/web-components/items-DjpIYUxD.mjs +1 -0
  147. package/dist/web-components/ja-Cg1enUhM.mjs +1 -0
  148. package/dist/web-components/label-BWHRHAY2.mjs +1 -0
  149. package/dist/web-components/layout-B3HyDCsP.mjs +1 -0
  150. package/dist/web-components/{link-BhvZNgtv.mjs → link-Mnt5GrKM.mjs} +1 -1
  151. package/dist/web-components/logo-YR9jXUE4.mjs +1 -0
  152. package/dist/web-components/{models-CIHL07o7.mjs → models-NfaX6B8u.mjs} +1 -1
  153. package/dist/web-components/{nodes-TS4tB7cC.mjs → nodes-CRrc5Svn.mjs} +1 -1
  154. package/dist/web-components/{overlayImage-B3ItMjXk.mjs → overlayImage-D7Knsh4X.mjs} +1 -1
  155. package/dist/web-components/{panel-M3PpVN7f.mjs → panel-DUMFdAc8.mjs} +1 -1
  156. package/dist/web-components/part-C_V28rvN.mjs +1 -0
  157. package/dist/web-components/{playerSurface-BGgYHT2u.mjs → playerSurface-CF5g-4Po.mjs} +1 -1
  158. package/dist/web-components/{pointer-J2gT4W9m.mjs → pointer-PJLHbbSD.mjs} +1 -1
  159. package/dist/web-components/{provider-CdJfEMUj.mjs → provider-b4id5kCa.mjs} +1 -1
  160. package/dist/web-components/{range-regions-DxSIpIVo.mjs → range-regions-DCY76ydS.mjs} +1 -1
  161. package/dist/web-components/{read-more-wCGc6ELt.mjs → read-more-UM90-AEc.mjs} +1 -1
  162. package/dist/web-components/readingLanguages-Qdn21-7Q.mjs +1 -0
  163. package/dist/web-components/rendererSurface-PZlq-wa_.mjs +22 -0
  164. package/dist/web-components/{renderers-zAtpns1S.mjs → renderers-DIHonXTq.mjs} +1 -1
  165. package/dist/web-components/resource-BlU2Ese6.mjs +1 -0
  166. package/dist/web-components/{save-file-DquBqxrS.mjs → save-file-GI0ekTmd.mjs} +1 -1
  167. package/dist/web-components/{search-ChOKTYz9.mjs → search-CHjjiXkB.mjs} +1 -1
  168. package/dist/web-components/shared-DgJ0bXca.mjs +1 -0
  169. package/dist/web-components/{show-link-Dry4M5w1.mjs → show-link-BlLkTYtm.mjs} +1 -1
  170. package/dist/web-components/{sizedImage-CjFqzhUE.mjs → sizedImage-BoGT1x5n.mjs} +1 -1
  171. package/dist/web-components/{split-88HcOLCm.mjs → split-OO6-WiG3.mjs} +1 -1
  172. package/dist/web-components/{status-BNrkhMe7.mjs → status-CSenPCO4.mjs} +1 -1
  173. package/dist/web-components/styles-Bvw9LFU7.mjs +1 -0
  174. package/dist/web-components/three.mjs +1 -1
  175. package/dist/web-components/{thumbnail-CoFd2duc.mjs → thumbnail-DYJHCrW_.mjs} +1 -1
  176. package/dist/web-components/{tip-BCClTo0G.mjs → tip-Dr1mfd4o.mjs} +1 -1
  177. package/dist/web-components/{toggle-DavvlVdF.mjs → toggle-86lqpaU9.mjs} +1 -1
  178. package/dist/web-components/{useContainerName-B_Kzx2Wp.mjs → useContainerName-BfNL6p3O.mjs} +1 -1
  179. package/dist/web-components/{useControlsVisibility-BdD2byHj.mjs → useControlsVisibility-C3LCnrb7.mjs} +1 -1
  180. package/dist/web-components/{useNearViewport-Bj8qJEA0.mjs → useNearViewport-Dk5q1rzk.mjs} +1 -1
  181. package/dist/web-components/useScrollTrack-B_yYmQDS.mjs +1 -0
  182. package/dist/web-components/viewer/{AnnotationItems-3Sf8MxRQ.mjs → AnnotationItems-BbPnS9EE.mjs} +1 -1
  183. package/dist/web-components/viewer/{AnnotationMenu-_xBnZtm1.mjs → AnnotationMenu-BGv-HimF.mjs} +1 -1
  184. package/dist/web-components/viewer/AnnotationState-uRm7bEwg.mjs +1 -0
  185. package/dist/web-components/viewer/{Annotations-24ComVk9.mjs → Annotations-_2PMmUfu.mjs} +1 -1
  186. package/dist/web-components/viewer/Annotations-reaO1ILe.mjs +2 -0
  187. package/dist/web-components/viewer/{Canvas2DBackend-DPWYD9ST.mjs → Canvas2DBackend-Dru1ImJh.mjs} +1 -1
  188. package/dist/web-components/viewer/CaptionDetails-3OlEaKmX.mjs +1 -0
  189. package/dist/web-components/viewer/{ChaptersMenu-C5J0d8Ck.mjs → ChaptersMenu-kchuXDZy.mjs} +1 -1
  190. package/dist/web-components/viewer/{ChoiceMenu-B8iukYiR.mjs → ChoiceMenu-C8pEoSC6.mjs} +1 -1
  191. package/dist/web-components/viewer/{Collection-CPVQ3JtI.mjs → Collection-B4LN_80C.mjs} +1 -1
  192. package/dist/web-components/viewer/{Connected-x3v9xr7x.mjs → Connected-80hCJuhg.mjs} +1 -1
  193. package/dist/web-components/viewer/{Connected-D5_bZzr5.mjs → Connected-CzPY2rgu.mjs} +1 -1
  194. package/dist/web-components/viewer/{Contents-Ma7oDW1R.mjs → Contents-D4jw_lGe.mjs} +1 -1
  195. package/dist/web-components/viewer/{ControlMenu-D2HokCqd.mjs → ControlMenu-C3Jh10iR.mjs} +1 -1
  196. package/dist/web-components/viewer/ControlsFade-BKkJ95B5.mjs +1 -0
  197. package/dist/web-components/viewer/{CountMenu-BnDN2b0n.mjs → CountMenu-Blz1oHgs.mjs} +1 -1
  198. package/dist/web-components/viewer/Cue-BnC9XuZp.mjs +1 -0
  199. package/dist/web-components/viewer/Document-BG0F97nL.mjs +1 -0
  200. package/dist/web-components/viewer/{DomLayers-BW2A4z82.mjs → DomLayers-BL6vNcmI.mjs} +1 -1
  201. package/dist/web-components/viewer/{Download-Cc_NA7QN.mjs → Download-B0BD_SzR.mjs} +1 -1
  202. package/dist/web-components/viewer/{EntryBodies-Bz69SWZh.mjs → EntryBodies-Cbmr-Eg4.mjs} +1 -1
  203. package/dist/web-components/viewer/{EntryThumbnail-C8cUA5qc.mjs → EntryThumbnail-DAdEyIuL.mjs} +1 -1
  204. package/dist/web-components/viewer/{FieldPill-BzKvMF-K.mjs → FieldPill-DNL96sDW.mjs} +1 -1
  205. package/dist/web-components/viewer/{FrameAnimation-DiQgfgri.mjs → FrameAnimation-BO3QVSUw.mjs} +1 -1
  206. package/dist/web-components/viewer/Gallery-DN7ajF4i.mjs +1 -0
  207. package/dist/web-components/viewer/GlobeGlyph-B-Wd0AkW.mjs +1 -0
  208. package/dist/web-components/viewer/{HideToggle-jg311sUK.mjs → HideToggle-DH0u1wFC.mjs} +1 -1
  209. package/dist/web-components/viewer/{ImageControls-8ZIWLAkf.mjs → ImageControls-Lz-ESk1X.mjs} +1 -1
  210. package/dist/web-components/viewer/LanguageChoice-BkQkSsPE.mjs +1 -0
  211. package/dist/web-components/viewer/LanguageMenu-gIJHQiBc.mjs +1 -0
  212. package/dist/web-components/viewer/LightboxView-D066VR5m.mjs +1 -0
  213. package/dist/web-components/viewer/{ListEnd-JjGQ_q6c.mjs → ListEnd-D4nNouKZ.mjs} +1 -1
  214. package/dist/web-components/viewer/{MapView-tAZ4vINr.mjs → MapView-C_8iciAK.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-D4hiLqhm.mjs} +1 -1
  217. package/dist/web-components/viewer/{NavDate-B7T2iPfP.mjs → NavDate-BMVT6UwB.mjs} +1 -1
  218. package/dist/web-components/viewer/{Navigator-sEfTvK-l.mjs → Navigator-DbBBbDZn.mjs} +1 -1
  219. package/dist/web-components/viewer/PagerLayout-D771pC5E.mjs +1 -0
  220. package/dist/web-components/viewer/PanelPart-2H7jd6PS.mjs +1 -0
  221. package/dist/web-components/viewer/{PartOfManifest-BYgk9r1j.mjs → PartOfManifest-BMaH_tsn.mjs} +1 -1
  222. package/dist/web-components/viewer/{PlaceBox-BBtsMTsl.mjs → PlaceBox-OytRM9_s.mjs} +1 -1
  223. package/dist/web-components/viewer/{Placeholder-5focqckW.mjs → Placeholder-BWuq47Sw.mjs} +1 -1
  224. package/dist/web-components/viewer/Search-Bmz7mUbA.mjs +1 -0
  225. package/dist/web-components/viewer/{SeekMarks-CUyvbMfC.mjs → SeekMarks-CAsMUj2N.mjs} +1 -1
  226. package/dist/web-components/viewer/{StandaloneItems-DsoMdwWS.mjs → StandaloneItems-BCHhR9sF.mjs} +1 -1
  227. package/dist/web-components/viewer/{Steps-zpuoH0K0.mjs → Steps-BDT2W9QN.mjs} +1 -1
  228. package/dist/web-components/viewer/{TargetItems-DIKBor9X.mjs → TargetItems-CkZbD8GE.mjs} +1 -1
  229. package/dist/web-components/viewer/Transcript-BbFXEJSc.mjs +1 -0
  230. package/dist/web-components/viewer/{Transport-BM3IMXDW.mjs → Transport-CI5UkA3K.mjs} +1 -1
  231. package/dist/web-components/viewer/{Transport-DMnPpTsQ.mjs → Transport-PgBpf33S.mjs} +1 -1
  232. package/dist/web-components/viewer/{annotation-collection-C_9c9NPs.mjs → annotation-collection-l4zuf56A.mjs} +1 -1
  233. package/dist/web-components/viewer/{annotation-name-jt1y3erg.mjs → annotation-name-CRl0w7NR.mjs} +1 -1
  234. package/dist/web-components/viewer/annotations-content-CYjPRTZn.mjs +1 -0
  235. package/dist/web-components/viewer/{cloverEngine-CVyaltw7.mjs → cloverEngine-2b_guC4P.mjs} +2 -2
  236. package/dist/web-components/viewer/{content-state-reader-DIcY4zWj.mjs → content-state-reader-Cm-rvusT.mjs} +1 -1
  237. package/dist/web-components/viewer/{dragToClose-D2h8gIpa.mjs → dragToClose-DXXIWV62.mjs} +1 -1
  238. package/dist/web-components/viewer/{fetchManifest-C66Fk39V.mjs → fetchManifest-DorkDXGC.mjs} +1 -1
  239. package/dist/web-components/viewer/{host-Fl21T-Pt.mjs → host-DscGC2S0.mjs} +1 -1
  240. package/dist/web-components/viewer/{image-layers-CpDOoRh9.mjs → image-layers-CZ9-efD2.mjs} +1 -1
  241. package/dist/web-components/viewer/image-service-content-C60w8IZm.mjs +1 -0
  242. package/dist/web-components/viewer/index.mjs +1 -1
  243. package/dist/web-components/viewer/{link-DlX6OdhG.mjs → link-CysSctMX.mjs} +1 -1
  244. package/dist/web-components/viewer/overlayImage-CwPnVnIi.mjs +1 -0
  245. package/dist/web-components/viewer/{range-regions--YB9ll1N.mjs → range-regions-C7ZBtSyb.mjs} +1 -1
  246. package/dist/web-components/viewer/{renderers-zvRp3xYJ.mjs → renderers-D4wJiQYv.mjs} +1 -1
  247. package/dist/web-components/viewer/{save-file-83yWcPHX.mjs → save-file-uqsNOVPU.mjs} +1 -1
  248. package/dist/web-components/viewer/{search-DDXsrZz3.mjs → search-CWuD5EZA.mjs} +1 -1
  249. package/dist/web-components/viewer/styles-BjjJM8OS.mjs +1 -0
  250. package/dist/web-components/viewer/{useControlsVisibility-CudUJBCj.mjs → useControlsVisibility-KTxa_3yJ.mjs} +1 -1
  251. package/dist/web-components/viewer/viewer-C3d_TgAI.mjs +29 -0
  252. package/dist/web-components/viewer/{vtt-D1xyC48J.mjs → vtt-DqtJ20x0.mjs} +1 -1
  253. package/dist/web-components/viewer-BoyWG64n.mjs +1 -0
  254. package/dist/web-components/{vtt-ChAUl4lm.mjs → vtt-BNuRzGap.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/dist/index.d.mts CHANGED
@@ -307,8 +307,9 @@ export declare function buildContentState({ manifestId, canvasId, type, region,
307
307
  * state (JSON or base64url). The resource may be a Manifest, a Collection (its first
308
308
  * Manifest is shown), a lone Canvas (its `partOf` Manifest, or a Manifest made around
309
309
  * it), or annotations, an AnnotationPage or AnnotationCollection (the Manifest their first
310
- * annotation's Canvas is `partOf`, at that Canvas). Everything is fetched once, with the
311
- * request settings, and upgraded to Presentation 4.
310
+ * annotation's Canvas is `partOf`, at that Canvas). It may also be a IIIF Image service,
311
+ * its `info.json` or its base URI, shown as the one image it is (`imageServiceContent`).
312
+ * Everything is fetched once, with the request settings, and upgraded to Presentation 4.
312
313
  */
313
314
  export type IIIFContent = string | Record<string, unknown>;
314
315
  /**
@@ -934,7 +935,7 @@ export type ControlButtonProps = {
934
935
  "aria-label": string;
935
936
  /**
936
937
  * The language of the name, when it is not the page's: a Choice's own label, or one
937
- * of Clover's strings in another language. Spread it with the rest (WCAG 3.1.2).
938
+ * of Clover's interface strings in another language. Spread it with the rest (WCAG 3.1.2).
938
939
  */
939
940
  lang?: string;
940
941
  /** The key the Canvas answers to for this control, when it has one. */
@@ -1012,6 +1013,11 @@ export interface CloverCanvasOptions {
1012
1013
  maxZoomPixelRatio?: number;
1013
1014
  /** Smallest zoom, as a fraction of the home zoom. Default 0.9. */
1014
1015
  minZoomImageRatio?: number;
1016
+ /**
1017
+ * Whether home may enlarge the image past `maxZoomPixelRatio` to fill the box. False,
1018
+ * home stops at that zoom and centers the image, smaller than the box. Default true.
1019
+ */
1020
+ upscale?: boolean;
1015
1021
  /** Seconds for an animation to close most of its distance. 0 disables easing. */
1016
1022
  animationTime?: number;
1017
1023
  /**
@@ -1429,6 +1435,12 @@ export interface ItemsProps extends Omit<React.HTMLAttributes<HTMLElement>, "onS
1429
1435
  * under the one above it, still in reading order, left to right.
1430
1436
  */
1431
1437
  layout?: ItemsLayout;
1438
+ /**
1439
+ * The slider's direction: a row (`horizontal`), or a column (`vertical`) that fills
1440
+ * the height of what holds it, as a filmstrip beside the Body, its pictures as wide as
1441
+ * the column. Default `"horizontal"`.
1442
+ */
1443
+ orientation?: "horizontal" | "vertical";
1432
1444
  /**
1433
1445
  * The line under an item's label, where it has one (a Collection's members do): its
1434
1446
  * `summary` (the default), its `navDate`, or `none`. Default `"summary"`.
@@ -1676,7 +1688,7 @@ export declare function usePanelSections(sections?: readonly PanelSection[]): Pa
1676
1688
  /** How the sections are laid out. */
1677
1689
  export type SectionsLayout = "tabs" | "accordion";
1678
1690
  /**
1679
- * What a page calls a section, in place of Clover's own word for it: its words, taken to
1691
+ * What a page calls a section, in place of its word in Clover's interface language: its words, taken to
1680
1692
  * be in the page's language, or its words by language tag, one of which the tab carries
1681
1693
  * as its `lang` where it is not the page's (WCAG 3.1.2).
1682
1694
  */
@@ -1747,6 +1759,13 @@ export interface PanelProps extends Omit<React.HTMLAttributes<HTMLElement>, "def
1747
1759
  * leaves the choice out, and the Root reads in its `language`, else the reader's.
1748
1760
  */
1749
1761
  languages?: boolean;
1762
+ /**
1763
+ * Whether About's language toggle also offers Clover's interface languages (its
1764
+ * control labels, section titles and announcements) that the resource has none of: the
1765
+ * visitor's and the site's, where they differ, one choice for the page. Default
1766
+ * `true`; `false` leaves them out, and Clover speaks the visitor's.
1767
+ */
1768
+ interfaceLanguages?: boolean;
1750
1769
  /**
1751
1770
  * Which of the default sections the panel may have, in Clover's own order: with
1752
1771
  * `["contents", "search"]` it has those two and no About. Each still shows only where
@@ -1755,7 +1774,7 @@ export interface PanelProps extends Omit<React.HTMLAttributes<HTMLElement>, "def
1755
1774
  */
1756
1775
  sections?: readonly PanelSection[];
1757
1776
  /**
1758
- * What a default section's tab or heading says, in place of Clover's own word for it:
1777
+ * What a default section's tab or heading says, in place of its word in Clover's interface language:
1759
1778
  * `{ annotations: "Chapters" }`, or `{ annotations: { en: "Chapters", de: "Kapitel" } }`
1760
1779
  * to say it in several, read in the one Clover speaks and marked with its language
1761
1780
  * where that is not the page's (WCAG 3.1.2). A `Tab` of your own says it in `label`.
@@ -1825,6 +1844,13 @@ export interface AboutProps extends React.HTMLAttributes<HTMLElement> {
1825
1844
  * In a Panel, its heading offers them (the Panel's `languages`). Default `true`.
1826
1845
  */
1827
1846
  languages?: boolean;
1847
+ /**
1848
+ * Alone, outside a Panel: whether its language toggle also offers Clover's interface
1849
+ * languages (its control labels, section titles and announcements) that the resource
1850
+ * has none of, the visitor's and the site's, where they differ. In a Panel, the Panel's
1851
+ * `interfaceLanguages`. Default `true`.
1852
+ */
1853
+ interfaceLanguages?: boolean;
1828
1854
  }
1829
1855
  /**
1830
1856
  * Everything the Manifest says about itself, in the order 3.x's About tab shows it:
@@ -1835,11 +1861,12 @@ export interface AboutProps extends React.HTMLAttributes<HTMLElement> {
1835
1861
  * it. The downloads are Download's: the `rendering` of the page in view ("This page")
1836
1862
  * and of the Manifest ("All pages").
1837
1863
  *
1838
- * Where what it says comes in several languages, the languages to read the resource in
1839
- * (`ReadingLanguages`): over what About says, or, in a Panel's `about` section, beside
1840
- * its heading, where they show whichever section is open.
1864
+ * Where what it says comes in several languages, or the visitor's language differs from
1865
+ * the site's, the languages to read in, as one toggle (`LanguageToggle`): over what About
1866
+ * says, or, in a Panel's `about` section, beside its heading, where it shows whichever
1867
+ * section is open.
1841
1868
  */
1842
- export declare function About({ languages, ...props }: AboutProps): React.JSX.Element;
1869
+ export declare function About({ languages, interfaceLanguages, ...props }: AboutProps): React.JSX.Element;
1843
1870
  export interface AnnotationsProps extends React.HTMLAttributes<HTMLElement> {
1844
1871
  /**
1845
1872
  * Every annotation in the Manifest (default), as the Viewer's panel lists them: by
@@ -2433,7 +2460,7 @@ export declare function useLocalized(value: LanguageMapLike): LocalizedValue;
2433
2460
  /** Clover's interface strings in the current language: `t("commonClose")`. */
2434
2461
  export declare function useT(): (key: string, values?: Record<string, unknown>) => string;
2435
2462
  /**
2436
- * The language of one of Clover's strings where it is not the page's (a French reader on
2463
+ * The language of one of Clover's interface strings where it is not the page's (a French reader on
2437
2464
  * an English page, or a key that fell back to English), for the element that shows it, or
2438
2465
  * is named by it, to carry as `lang` (WCAG 3.1.2). Undefined otherwise: the string takes
2439
2466
  * the page's language. The page's is the nearest `lang` around the Root.
@@ -2578,6 +2605,13 @@ export interface CloverContextValue {
2578
2605
  * inside reads in it, until the Root is given another `language`.
2579
2606
  */
2580
2607
  chooseLanguage?: (tag: string) => void;
2608
+ /**
2609
+ * Whether a language toggle of the Root's is drawn (About's, `LanguageToggle`), so the
2610
+ * parts that would offer their own (an annotation set's languages, a Transcript's
2611
+ * caption files) follow it instead; `drawsToggle` says one is, until its cleanup runs.
2612
+ */
2613
+ toggleDrawn?: boolean;
2614
+ drawsToggle?: () => () => void;
2581
2615
  /** Renderers of the host's own, for `Body` to draw some views with. */
2582
2616
  renderers?: BodyRenderer[];
2583
2617
  }
@@ -2718,7 +2752,8 @@ export declare function regionSource(canvas: Json | undefined, rect: {
2718
2752
  h: number;
2719
2753
  }, image?: string): ThumbnailSource | null;
2720
2754
  /**
2721
- * Clover's translations, without a translation library.
2755
+ * Clover's interface language: the language of its control labels ("Zoom in"), section
2756
+ * titles ("About") and announcements ("Item 2 of 17"), without a translation library.
2722
2757
  *
2723
2758
  * Clover needs a key lookup with a fallback chain, `{{name}}` interpolation and language
2724
2759
  * detection. i18next did that at about 20 kB gzipped across three packages;
@@ -2726,44 +2761,84 @@ export declare function regionSource(canvas: Json | undefined, rect: {
2726
2761
  * them, so existing `initCloverI18n` calls keep working:
2727
2762
  *
2728
2763
  * initCloverI18n({
2729
- * lng: "de",
2764
+ * languages: ["de"],
2730
2765
  * fallbackLng: ["de", "en"],
2731
2766
  * resources: { de: { clover: { informationPanelTabsAbout: "Über" } } },
2732
2767
  * });
2733
2768
  *
2769
+ * Which it speaks (Mat, 2026-11-05): the languages configured (`languages`, or `lng` for
2770
+ * one), then the page's `<html lang>` (Mat, 2026-11-05: derived, as the visitor's is),
2771
+ * else English; then the visitor's languages, from
2772
+ * the browser. The visitor's first that Clover has strings for is the default, else the
2773
+ * first configured; where the two differ, `interfaceLanguages()` offers both, and
2774
+ * `chooseInterfaceLanguage` takes the visitor's choice.
2775
+ *
2734
2776
  * English ships with Clover. Each other language it ships loads the first time Clover is
2735
2777
  * to speak it, so until it arrives a string shows in English, marked as English by
2736
- * `langOf`, and the readers re-render when it does. `cloverI18n.ready()` waits for it.
2778
+ * `langOf`, and the parts re-render when it does. `cloverI18n.ready()` waits for it.
2737
2779
  */
2738
2780
  export declare const CLOVER_I18N_NAMESPACE = "clover";
2739
2781
  /** `resources[language][namespace][key]` — i18next's resource shape. */
2740
2782
  export type CloverI18nResources = Record<string, Record<string, Record<string, string>>>;
2741
2783
  export interface CloverI18nOptions {
2742
2784
  /**
2743
- * The language to use. When not given: the page's `<html lang>`, then the browser's
2744
- * languages, so Clover speaks the language of the page around it.
2785
+ * The languages your site offers Clover's interface in, most preferred first. A
2786
+ * visitor whose own language Clover has strings for sees theirs, with these offered
2787
+ * beside it, with the page's `<html lang>`; any other visitor sees the first of these.
2788
+ * When not given, the page's
2789
+ * `<html lang>`, else English.
2745
2790
  */
2791
+ languages?: string | readonly string[];
2792
+ /** One language to offer, as `languages: [lng]` does. */
2746
2793
  lng?: string;
2747
2794
  /** Languages to try, in order, when a key is missing. English is always last. */
2748
2795
  fallbackLng?: string | readonly string[] | false;
2749
2796
  /** Strings to add or override, merged into what Clover ships. */
2750
2797
  resources?: CloverI18nResources;
2751
2798
  }
2752
- /** One of Clover's strings, and the language it is written in. */
2799
+ /** One of Clover's interface strings, and the language it is written in. */
2753
2800
  export interface CloverString {
2754
2801
  text: string;
2755
2802
  /** The language the string came from; undefined when no language has the key. */
2756
2803
  lang?: string;
2757
2804
  }
2758
2805
  declare const cloverI18n: {
2759
- /** The language set, or else the first of the reader's that Clover has strings for. */
2806
+ /**
2807
+ * Clover's interface language: the one the visitor chose, else the first of the chain
2808
+ * whose strings have loaded.
2809
+ */
2760
2810
  readonly language: string;
2811
+ /** The interface language the visitor chose, if they chose one. */
2812
+ readonly chosenLanguage: string | undefined;
2813
+ /**
2814
+ * The tag Clover has strings for that speaks `lng` (`zh-Hans` for `zh-CN`, `en` for
2815
+ * `en-US`), shipped or given by the page; none where it has no strings for it.
2816
+ */
2817
+ stringsFor(lng: string): string | undefined;
2818
+ /**
2819
+ * The interface languages to offer, and the one in use (`chosen`): the default (the
2820
+ * visitor's, where Clover has strings for it), then the languages configured, each as
2821
+ * the tag Clover has strings for. A choice is worth offering only where there are two
2822
+ * or more.
2823
+ */
2824
+ interfaceLanguages(): {
2825
+ languages: string[];
2826
+ chosen: string;
2827
+ };
2761
2828
  /**
2762
- * The language Clover's strings are in: the first of the lookup chain that has any. A
2829
+ * Speak `lng` whatever the visitor's languages, as their choice of interface language;
2830
+ * none goes back to the default. Settles once its strings have loaded, or failed to.
2831
+ *
2832
+ * await cloverI18n.chooseInterfaceLanguage("fr");
2833
+ */
2834
+ chooseInterfaceLanguage(lng?: string): Promise<void>;
2835
+ /**
2836
+ * The language Clover's interface strings are in: the first of the lookup chain that has any. A
2763
2837
  * language set with no strings of its own resolves to the next, English at the last.
2764
2838
  */
2765
2839
  readonly resolvedLanguage: string;
2766
- changeLanguage(lng: string): void;
2840
+ /** As `chooseInterfaceLanguage` does: i18next's name for it. */
2841
+ changeLanguage(lng: string): Promise<void>;
2767
2842
  /** A string and the language it came from, which a missing key leaves in another. */
2768
2843
  resolve(key: string, values?: Record<string, unknown>, namespace?: string): CloverString;
2769
2844
  t(key: string, values?: Record<string, unknown>, namespace?: string): string;
@@ -2778,7 +2853,7 @@ declare const cloverI18n: {
2778
2853
  * Settles once the language Clover speaks has loaded, or failed to: for a server render,
2779
2854
  * or a test, that needs the strings in place before it draws.
2780
2855
  *
2781
- * await initCloverI18n({ lng: "fr" }).ready();
2856
+ * await initCloverI18n({ languages: ["fr"] }).ready();
2782
2857
  */
2783
2858
  ready(): Promise<void>;
2784
2859
  /** For `useSyncExternalStore`: re-render readers when the language or strings change. */
@@ -2787,8 +2862,11 @@ declare const cloverI18n: {
2787
2862
  };
2788
2863
  export type CloverI18n = typeof cloverI18n;
2789
2864
  /**
2790
- * Set Clover's language and add or override strings. Safe to call more than once: each
2791
- * call merges its `resources` and applies any `lng` or `fallbackLng` it is given.
2865
+ * Configure Clover's interface language (`languages`, or `lng` for one) and add or
2866
+ * override strings. Safe to call more than once: each call merges its `resources` and
2867
+ * applies any `languages`, `lng` or `fallbackLng` it is given. A visitor whose language
2868
+ * Clover has strings for still sees theirs first, with yours offered beside it; to speak
2869
+ * one language whatever the visitor's, `chooseInterfaceLanguage`.
2792
2870
  */
2793
2871
  export declare function initCloverI18n(options?: CloverI18nOptions): CloverI18n;
2794
2872
  export type DefaultProps = Omit<RootProps, "children"> & {
@@ -2820,7 +2898,7 @@ export type DefaultProps = Omit<RootProps, "children"> & {
2820
2898
  */
2821
2899
  panelSections?: readonly PanelSection[];
2822
2900
  /**
2823
- * What a panel section's tab or heading says, in place of Clover's own word for it:
2901
+ * What a panel section's tab or heading says, in place of its word in Clover's interface language:
2824
2902
  * `{ annotations: "Chapters" }`, or a word by language tag to say it in several (the
2825
2903
  * Panel's `labels`).
2826
2904
  */
@@ -2832,6 +2910,13 @@ export type DefaultProps = Omit<RootProps, "children"> & {
2832
2910
  * it says of itself comes in several (the Panel's `languages`). Default `true`.
2833
2911
  */
2834
2912
  languages?: boolean;
2913
+ /**
2914
+ * Default, Document and Gallery: whether the panel's language toggle, beside its About
2915
+ * heading, also offers Clover's interface languages (its control labels, section
2916
+ * titles and announcements) that the resource has none of, the visitor's and the
2917
+ * site's, where they differ (the Panel's `interfaceLanguages`). Default `true`.
2918
+ */
2919
+ interfaceLanguages?: boolean;
2835
2920
  /** The thumbnails under the Body: a layout, or `false` for none. Default `slider`. */
2836
2921
  items?: Exclude<ItemsLayout, "pager"> | false;
2837
2922
  /**
@@ -2860,7 +2945,7 @@ export type DefaultProps = Omit<RootProps, "children"> & {
2860
2945
  /** The Body's Canvas `options`: its gestures, zoom limits and motion. */
2861
2946
  canvasOptions?: CloverCanvasOptions;
2862
2947
  };
2863
- declare function Default({ className, header, headingLevel, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, items, singleItem, storageKey, fill, collapseControls, canvasOptions, ...root }: DefaultProps): React.JSX.Element;
2948
+ declare function Default({ className, header, headingLevel, panel, defaultPanelOpen, panelLayout, panelSections, panelLabels, download, languages, interfaceLanguages, items, singleItem, storageKey, fill, collapseControls, canvasOptions, ...root }: DefaultProps): React.JSX.Element;
2864
2949
  /**
2865
2950
  * A layout the Viewer draws: one from `@nulib/clover/templates`, or a component of your
2866
2951
  * own that takes the `Clover.Root` props.
@@ -18,6 +18,7 @@ import { sameSpec, prepareItem, layoutItems, pixelsToWorld, itemToWorld, MEDIA_K
18
18
  const DEFAULTS = {
19
19
  maxZoomPixelRatio: 1.1,
20
20
  minZoomImageRatio: 0.9,
21
+ upscale: true,
21
22
  animationTime: 0.09,
22
23
  animationDuration: void 0,
23
24
  springStiffness: 6.5,
@@ -355,9 +356,9 @@ class CanvasRenderer {
355
356
  * The camera that frames `bounds`, turned by `rotation`, in the part of the viewport
356
357
  * `inset` leaves: centered there, off the viewport's center where its sides differ.
357
358
  */
358
- fit(bounds, rotation, { top, right, bottom, left }) {
359
+ fit(bounds, rotation, { top, right, bottom, left }, maxZoom = Infinity) {
359
360
  const { width, height } = this.viewport;
360
- const { zoom } = fitCamera(
361
+ const fitted = fitCamera(
361
362
  bounds,
362
363
  {
363
364
  width: Math.max(1, width - left - right),
@@ -365,6 +366,7 @@ class CanvasRenderer {
365
366
  },
366
367
  rotation
367
368
  );
369
+ const zoom = Math.min(fitted.zoom, maxZoom);
368
370
  const center = anchoredCenter(
369
371
  rectCenter(bounds),
370
372
  { x: (width + left - right) / 2, y: (height + top - bottom) / 2 },
@@ -415,13 +417,21 @@ class CanvasRenderer {
415
417
  getZoomLimits() {
416
418
  var _a;
417
419
  const home = ((_a = this.homeCamera()) == null ? void 0 : _a.zoom) ?? 1;
418
- const worldPerPixel = this.items.length ? Math.min(...this.items.map((item) => pixelsToWorld(item).x)) : 1;
419
420
  return {
420
421
  home,
421
422
  min: home * this.options.minZoomImageRatio,
422
- max: Math.max(home, this.options.maxZoomPixelRatio / worldPerPixel)
423
+ max: Math.max(home, this.closestZoom())
423
424
  };
424
425
  }
426
+ /**
427
+ * `maxZoomPixelRatio` is CSS pixels per *image* pixel, and world units may differ from
428
+ * those. Measured against the sharpest image in the scene, so an inset photograph
429
+ * denser than the page it sits on can still be zoomed to its own full resolution.
430
+ */
431
+ closestZoom() {
432
+ const worldPerPixel = this.items.length ? Math.min(...this.items.map((item) => pixelsToWorld(item).x)) : 1;
433
+ return this.options.maxZoomPixelRatio / worldPerPixel;
434
+ }
425
435
  home(immediate = false) {
426
436
  const home = this.homeCamera();
427
437
  if (!home) return;
@@ -723,7 +733,12 @@ class CanvasRenderer {
723
733
  if (!this.worldBounds) return null;
724
734
  const turn = 2 * Math.PI;
725
735
  const upright = Math.round(this.camera.destination.rotation / turn) * turn || 0;
726
- return this.fit(this.worldBounds, upright, this.inset);
736
+ return this.fit(
737
+ this.worldBounds,
738
+ upright,
739
+ this.inset,
740
+ this.options.upscale ? Infinity : this.closestZoom()
741
+ );
727
742
  }
728
743
  /**
729
744
  * Keep the camera usable: zoom within limits, and the center over the world so the
@@ -161,8 +161,9 @@ export interface CloverRequest {
161
161
  * state (JSON or base64url). The resource may be a Manifest, a Collection (its first
162
162
  * Manifest is shown), a lone Canvas (its `partOf` Manifest, or a Manifest made around
163
163
  * it), or annotations, an AnnotationPage or AnnotationCollection (the Manifest their first
164
- * annotation's Canvas is `partOf`, at that Canvas). Everything is fetched once, with the
165
- * request settings, and upgraded to Presentation 4.
164
+ * annotation's Canvas is `partOf`, at that Canvas). It may also be a IIIF Image service,
165
+ * its `info.json` or its base URI, shown as the one image it is (`imageServiceContent`).
166
+ * Everything is fetched once, with the request settings, and upgraded to Presentation 4.
166
167
  */
167
168
  export type IIIFContent = string | Record<string, unknown>;
168
169
  export interface MapProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSelect"> {
@@ -1,16 +1,29 @@
1
1
  "use client";
2
2
  import { useMemo } from "react";
3
3
  import { descriptionLanguages, startingLanguage } from "../core/language-choice.mjs";
4
+ import { sameLanguage } from "../i18n/languages.mjs";
4
5
  import { useClover, useCloverSelector } from "./context.mjs";
5
6
  function useReadingLanguages() {
6
- const { language, chooseLanguage } = useClover("About");
7
+ const { language, chooseLanguage, toggleDrawn } = useClover("About");
7
8
  const manifest = useCloverSelector(
8
9
  (state) => state.manifest
9
10
  );
10
11
  const languages = useMemo(() => descriptionLanguages(manifest), [manifest]);
11
12
  const chosen = startingLanguage(languages, language);
12
- return chosen && chooseLanguage ? { languages, chosen, onChange: chooseLanguage } : null;
13
+ return chosen && chooseLanguage ? {
14
+ languages,
15
+ chosen,
16
+ onChange: chooseLanguage,
17
+ drawn: toggleDrawn ?? false
18
+ } : null;
19
+ }
20
+ function covers(offered, languages) {
21
+ if (!(offered == null ? void 0 : offered.drawn)) return false;
22
+ return languages.every(
23
+ (tag) => !!tag && tag !== "none" && offered.languages.some((each) => sameLanguage(each, tag))
24
+ );
13
25
  }
14
26
  export {
27
+ covers,
15
28
  useReadingLanguages
16
29
  };
@@ -1 +1 @@
1
- @layer clover{.clover-template-default{--clover-body-height: min(65vh, 40rem);display:flex;flex-direction:column;color:var(--clover-color-primary, #1a1d1e)}@supports (height: 1svh){.clover-template-default{--clover-body-height: min(65svh, 40rem)}}.clover-template-default:is([data-fill],:fullscreen){--clover-body-height: auto;height:100%;min-height:min-content}.clover-template-default:is([data-fill],:fullscreen)>.clover-template-default-panes{flex:1 1 auto}.clover-template-default:is([data-fill],:fullscreen) .clover-template-default-body{flex:1 1 0;min-height:16rem}.clover-template-default-header{display:flex;align-items:center;gap:var(--clover-space-s);padding:var(--clover-inset)}@media (width < 31rem){.clover-template-default-header,.clover-template-default-rail{--clover-inset: var(--clover-space-m)}}.clover-template-default-pager{flex:none;padding-block:0}.clover-template-default-header:has(>.clover-template-default-pager){flex-wrap:wrap;row-gap:var(--clover-space-xs)}.clover-template-default-header:has(>.clover-template-default-pager)>:is(.clover-template-default-title,.clover-template-default-pager){align-self:last baseline}.clover-template-default-header:has(>.clover-template-default-collection-row){display:grid;grid-template-columns:minmax(0,1fr) fit-content(38.2%);row-gap:var(--clover-space-xs)}.clover-template-default-header>:is(.clover-template-default-title,.clover-template-default-collection-row){grid-column:1}.clover-template-default-header:has(>.clover-template-default-collection-row)>.clover-template-default-provider{grid-column:2;grid-row:1 / span 2;align-self:end;max-width:none}.clover-template-default-collection-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--clover-space-xs) var(--clover-space-s);min-width:0}.clover-template-default-collection{min-width:0;margin:0;overflow-wrap:anywhere;color:var(--clover-color-primary-muted, #26292b);font-size:inherit}.clover-template-default-provider{flex:0 1 auto;max-width:38.2%;margin-inline-start:auto}@container clover-template-default-main (width < 36rem){.clover-template-default-header:has(>.clover-template-default-collection-row)>.clover-template-default-provider{grid-row:1;align-self:start}.clover-template-default-header>.clover-template-default-collection-row{grid-column:1 / -1}}@container clover-template-default-main (width < 26rem){.clover-template-default:has(.clover-template-default-panel[data-about]) .clover-template-default-provider{display:none}}.clover-template-default-panes{position:relative}.clover-template-default-main{display:flex;flex-direction:column;container:clover-template-default-main / inline-size}.clover-template-panes[data-panel=over]>.clover-template-default-main{isolation:isolate}.clover-template-panes{position:relative}.clover-template-panel{contain:size;overflow-y:auto;overscroll-behavior:contain;background-color:var(--clover-color-secondary, #fff)}.clover-template-panel[hidden]{display:none}.clover-template-panes>.clover-template-panel-handle{translate:-1.5px 0}.clover-template-panes:dir(rtl)>.clover-template-panel-handle{translate:1.5px 0}.clover-template-default-panes:dir(ltr) .clover-items-viewport{margin-right:0}.clover-template-default-panes:dir(rtl) .clover-items-viewport{margin-left:0}.clover-template-default-panes:dir(ltr) .clover-items .clover-items-frame:not([dir=rtl]):after,.clover-template-default-panes:dir(ltr) .clover-items .clover-items-frame[dir=rtl]:before{right:0}.clover-template-default-panes:dir(rtl) .clover-items .clover-items-frame:not([dir=rtl]):before,.clover-template-default-panes:dir(rtl) .clover-items .clover-items-frame[dir=rtl]:after{left:0}.clover-template-panes[data-panel=over]{overflow:clip}.clover-template-panes[data-panel=over]>.clover-template-drawer{position:absolute;inset-block:0;inset-inline-end:0;z-index:4;width:min(24rem,calc(100% - var(--clover-space-2xl)));max-width:none;max-height:none;border-inline-start:1px solid var(--clover-color-secondary-muted, #e6e8eb);--clover-template-inner: left;--clover-template-toward: -1;--clover-template-out: translateX(calc(100% + var(--clover-space-xl)));transform:var(--clover-template-out);transition:transform .24s cubic-bezier(.16,1,.3,1)}.clover-template-panes[data-panel=over]>.clover-template-drawer:dir(rtl){--clover-template-out: translateX(calc(-100% - var(--clover-space-xl)));--clover-template-inner: right;--clover-template-toward: 1}.clover-template-panes[data-panel=over]>.clover-template-drawer[data-side=start]{inset-inline:0 auto;border-inline-start:0;border-inline-end:1px solid var(--clover-color-secondary-muted, #e6e8eb);--clover-template-out: translateX(calc(-100% - var(--clover-space-xl)));--clover-template-inner: right;--clover-template-toward: 1}.clover-template-panes[data-panel=over]>.clover-template-drawer[data-side=start]:dir(rtl){--clover-template-out: translateX(calc(100% + var(--clover-space-xl)));--clover-template-inner: left;--clover-template-toward: -1}.clover-template-panes[data-panel=over]>.clover-template-drawer,.clover-template-float{--clover-grip: color-mix( in srgb, var(--clover-color-primary-muted, #26292b) 30%, transparent );background:linear-gradient(var(--clover-grip),var(--clover-grip)) no-repeat var(--clover-template-inner) var(--clover-space-2xs) center / 3px var(--clover-control),var(--clover-color-secondary, #fff);touch-action:pan-y;box-shadow:calc(var(--clover-template-toward) * var(--clover-space-s)) 0 var(--clover-space-l) #0000001f}.clover-template-panes[data-panel=over]>.clover-template-drawer[data-open=true]{transform:none}.clover-template-scrim{position:absolute;inset:0;z-index:3;background-color:#0003;opacity:0;cursor:pointer;transition:opacity .24s ease}.clover-template-scrim[data-open=true]{opacity:1}@media (prefers-reduced-motion: reduce){.clover-template-panes[data-panel=over]>.clover-template-drawer,.clover-template-scrim{transition:none}}.clover-template-default-rail{display:flex;flex-direction:column;gap:var(--clover-space-m);padding:var(--clover-inset)}.clover-template-default-rail>.clover-items{margin-inline-end:calc(-1 * var(--clover-inset))}.clover-template-default-rail .clover-items-viewport{margin-inline-end:0}.clover-template-default-rail .clover-items-frame:not([dir=rtl])>button.clover-items-scroll-prev,.clover-template-default-rail .clover-items-frame[dir=rtl]>button.clover-items-scroll-next{left:calc(-1 * var(--clover-space-s))}.clover-template-default-rail .clover-items-frame:not([dir=rtl])>button.clover-items-scroll-next,.clover-template-default-rail .clover-items-frame[dir=rtl]>button.clover-items-scroll-prev{right:var(--clover-inset)}.clover-template-default-rail:not(:has(.clover-items,.clover-pager-position)){display:none}.clover-template-default-rail-header{display:flex;align-items:baseline;justify-content:space-between;gap:var(--clover-space-s)}.clover-template-default-titles{min-width:0;margin:0;overflow-wrap:anywhere}.clover-template-default-titles>.clover-template-default-titles-dot{margin-inline:var(--clover-space-xs);color:var(--clover-color-primary-muted, #26292b)}.clover-template-default-rail-header .clover-pager-position{flex-shrink:0;margin-inline-start:auto;font-size:var(--clover-text-s)}.clover-template-spine{position:relative;z-index:4;flex:none;width:0}.clover-template-spine>*{position:absolute;top:calc(var(--clover-template-spine-top, 0px) + var(--clover-inset));inset-inline-start:-1.5px;translate:-50%}.clover-template-panes:has(>.clover-template-spine)>:first-child .clover-canvas>.clover-canvas-controls[data-fit]{inset-inline-end:calc(var(--clover-control) / 2 - 1.5px + var(--clover-space-xs))}.clover-template-panes .clover-template-spine>*{transition-property:background-color,color,outline-color}.clover-root[data-status=idle] .clover-template-spine{visibility:hidden}.clover-template-spine:dir(rtl)>*{translate:50%}}
1
+ @layer clover{.clover-template-default{--clover-body-height: min(65vh, 40rem);display:flex;flex-direction:column;color:var(--clover-color-primary, #1a1d1e)}@supports (height: 1svh){.clover-template-default{--clover-body-height: min(65svh, 40rem)}}.clover-template-default:is([data-fill],:fullscreen){--clover-body-height: auto;height:100%;min-height:min-content}.clover-template-default:is([data-fill],:fullscreen)>.clover-template-default-panes{flex:1 1 auto}.clover-template-default:is([data-fill],:fullscreen) .clover-template-default-body{flex:1 1 0;min-height:16rem}.clover-template-default-header{display:flex;align-items:center;gap:var(--clover-space-s);padding:var(--clover-inset)}.clover-template-default-header:empty{display:none}@media (width < 31rem){.clover-template-default-header,.clover-template-default-rail{--clover-inset: var(--clover-space-m)}}.clover-template-default-pager{flex:none;padding-block:0}.clover-template-default-header:has(>.clover-template-default-pager){flex-wrap:wrap;row-gap:var(--clover-space-xs)}.clover-template-default-header:has(>.clover-template-default-pager)>:is(.clover-template-default-title,.clover-template-default-pager){align-self:last baseline}.clover-template-default-header:has(>.clover-template-default-collection-row){display:grid;grid-template-columns:minmax(0,1fr) fit-content(38.2%);row-gap:var(--clover-space-xs)}.clover-template-default-header>:is(.clover-template-default-title,.clover-template-default-collection-row){grid-column:1}.clover-template-default-header:has(>.clover-template-default-collection-row)>.clover-template-default-provider{grid-column:2;grid-row:1 / span 2;align-self:end;max-width:none}.clover-template-default-collection-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--clover-space-xs) var(--clover-space-s);min-width:0}.clover-template-default-collection{min-width:0;margin:0;overflow-wrap:anywhere;color:var(--clover-color-primary-muted, #26292b);font-size:inherit}.clover-template-default-provider{flex:0 1 auto;max-width:38.2%;margin-inline-start:auto}@container clover-template-default-main (width < 36rem){.clover-template-default-header:has(>.clover-template-default-collection-row)>.clover-template-default-provider{grid-row:1;align-self:start}.clover-template-default-header>.clover-template-default-collection-row{grid-column:1 / -1}}@container clover-template-default-main (width < 26rem){.clover-template-default:has(.clover-template-default-panel[data-about]) .clover-template-default-provider{display:none}}.clover-template-default-panes{position:relative}.clover-template-default-main{display:flex;flex-direction:column;container:clover-template-default-main / inline-size}.clover-template-panes[data-panel=over]>.clover-template-default-main{isolation:isolate}.clover-template-panes{position:relative}.clover-template-panel{contain:size;overflow-y:auto;overscroll-behavior:contain;background-color:var(--clover-color-secondary, #fff)}.clover-template-panel[hidden]{display:none}.clover-template-panes>.clover-template-panel-handle{translate:-1.5px 0}.clover-template-panes:dir(rtl)>.clover-template-panel-handle{translate:1.5px 0}.clover-template-default-panes:dir(ltr) .clover-items-viewport{margin-right:0}.clover-template-default-panes:dir(rtl) .clover-items-viewport{margin-left:0}.clover-template-default-panes:dir(ltr) .clover-items .clover-items-frame:not([dir=rtl]):after,.clover-template-default-panes:dir(ltr) .clover-items .clover-items-frame[dir=rtl]:before{right:0}.clover-template-default-panes:dir(rtl) .clover-items .clover-items-frame:not([dir=rtl]):before,.clover-template-default-panes:dir(rtl) .clover-items .clover-items-frame[dir=rtl]:after{left:0}.clover-template-panes[data-panel=over]{overflow:clip}.clover-template-panes[data-panel=over]>.clover-template-drawer{position:absolute;inset-block:0;inset-inline-end:0;z-index:4;width:min(24rem,calc(100% - var(--clover-space-2xl)));max-width:none;max-height:none;border-inline-start:1px solid var(--clover-color-secondary-muted, #e6e8eb);--clover-template-inner: left;--clover-template-toward: -1;--clover-template-out: translateX(calc(100% + var(--clover-space-xl)));transform:var(--clover-template-out);transition:transform .24s cubic-bezier(.16,1,.3,1)}.clover-template-panes[data-panel=over]>.clover-template-drawer:dir(rtl){--clover-template-out: translateX(calc(-100% - var(--clover-space-xl)));--clover-template-inner: right;--clover-template-toward: 1}.clover-template-panes[data-panel=over]>.clover-template-drawer[data-side=start]{inset-inline:0 auto;border-inline-start:0;border-inline-end:1px solid var(--clover-color-secondary-muted, #e6e8eb);--clover-template-out: translateX(calc(-100% - var(--clover-space-xl)));--clover-template-inner: right;--clover-template-toward: 1}.clover-template-panes[data-panel=over]>.clover-template-drawer[data-side=start]:dir(rtl){--clover-template-out: translateX(calc(100% + var(--clover-space-xl)));--clover-template-inner: left;--clover-template-toward: -1}.clover-template-panes[data-panel=over]>.clover-template-drawer,.clover-template-float{--clover-grip: color-mix( in srgb, var(--clover-color-primary-muted, #26292b) 30%, transparent );background:linear-gradient(var(--clover-grip),var(--clover-grip)) no-repeat var(--clover-template-inner) var(--clover-space-2xs) center / 3px var(--clover-control),var(--clover-color-secondary, #fff);touch-action:pan-y;box-shadow:calc(var(--clover-template-toward) * var(--clover-space-s)) 0 var(--clover-space-l) #0000001f}.clover-template-panes[data-panel=over]>.clover-template-drawer[data-open=true]{transform:none}.clover-template-scrim{position:absolute;inset:0;z-index:3;background-color:#0003;opacity:0;cursor:pointer;transition:opacity .24s ease}.clover-template-scrim[data-open=true]{opacity:1}@media (prefers-reduced-motion: reduce){.clover-template-panes[data-panel=over]>.clover-template-drawer,.clover-template-scrim{transition:none}}.clover-template-default-rail{display:flex;flex-direction:column;gap:var(--clover-space-m);padding:var(--clover-inset)}.clover-template-default-rail>.clover-items{margin-inline-end:calc(-1 * var(--clover-inset))}.clover-template-default-rail .clover-items-viewport{margin-inline-end:0}.clover-template-default-rail .clover-items-frame:not([dir=rtl])>button.clover-items-scroll-prev,.clover-template-default-rail .clover-items-frame[dir=rtl]>button.clover-items-scroll-next{left:calc(-1 * var(--clover-space-s))}.clover-template-default-rail .clover-items-frame:not([dir=rtl])>button.clover-items-scroll-next,.clover-template-default-rail .clover-items-frame[dir=rtl]>button.clover-items-scroll-prev{right:var(--clover-inset)}.clover-template-default-rail:not(:has(.clover-items,.clover-pager-position)){display:none}.clover-template-default-rail-header{display:flex;align-items:baseline;justify-content:space-between;gap:var(--clover-space-s)}.clover-template-default-titles{min-width:0;margin:0;overflow-wrap:anywhere}.clover-template-default-titles>.clover-template-default-titles-dot{margin-inline:var(--clover-space-xs);color:var(--clover-color-primary-muted, #26292b)}.clover-template-default-rail-header .clover-pager-position{flex-shrink:0;margin-inline-start:auto;font-size:var(--clover-text-s)}.clover-template-spine{position:relative;z-index:4;flex:none;width:0}.clover-template-spine>*{position:absolute;top:calc(var(--clover-template-spine-top, 0px) + var(--clover-inset));inset-inline-start:-1.5px;translate:-50%}.clover-template-panes:has(>.clover-template-spine)>:first-child .clover-canvas>.clover-canvas-controls[data-fit]{inset-inline-end:calc(var(--clover-control) / 2 - 1.5px + var(--clover-space-xs))}.clover-template-panes .clover-template-spine>*{transition-property:background-color,color,outline-color}.clover-root[data-status=idle] .clover-template-spine{visibility:hidden}.clover-template-spine:dir(rtl)>*{translate:50%}}
@@ -1 +1 @@
1
- @layer clover{.clover-items{--clover-items-ring-room: 4px;--clover-items-picture-height: var(--clover-items-height, 8rem);color:var(--clover-color-primary, #1a1d1e)}.clover-items-header{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--clover-space-xs) var(--clover-space-m);margin-bottom:var(--clover-space-s)}.clover-items-description{flex:1 0 100%;order:3;margin:0;color:var(--clover-color-primary-muted, #26292b)}.clover-items-homepage{margin-inline-start:auto;color:var( --clover-color-accent-text, var(--clover-accent-text-fallback, var(--clover-color-accent, #0065c3)) );text-decoration-line:underline;text-underline-offset:var(--clover-space-3xs)}.clover-items-track{margin:0;padding:0;list-style:none;gap:var(--clover-items-gap, var(--clover-space-m))}.clover-items-viewport{margin:calc(-1 * var(--clover-items-ring-room));padding:var(--clover-items-ring-room);scroll-padding-inline:var(--clover-items-ring-room);scrollbar-width:none}.clover-items-viewport::-webkit-scrollbar{display:none}.clover-items-viewport[data-dragging]{cursor:grabbing;-webkit-user-select:none;user-select:none}@supports (timeline-scope: --clover-items-track){.clover-items[data-layout=slider] .clover-items-frame{timeline-scope:--clover-items-track}.clover-items[data-layout=slider] .clover-items-viewport{scroll-timeline:--clover-items-track inline}.clover-items[data-layout=slider] .clover-items-frame:before,.clover-items[data-layout=slider] .clover-items-frame:after{content:"";position:absolute;top:var(--clover-items-ring-room);z-index:1;width:var(--clover-space-s);height:var(--clover-items-picture-height);background:linear-gradient(var(--clover-items-shade),rgb(0 0 0 / .16),transparent);-webkit-mask-image:linear-gradient(transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);mask-image:linear-gradient(transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);opacity:0;pointer-events:none;animation:clover-shade linear both;animation-timeline:--clover-items-track}.clover-items[data-layout=slider] .clover-items-frame:before{--clover-items-shade: to right;left:calc(-1 * var(--clover-items-ring-room));animation-range:0 var(--clover-space-m)}.clover-items[data-layout=slider] .clover-items-frame:after{--clover-items-shade: to left;right:calc(-1 * var(--clover-items-ring-room));animation-direction:reverse;animation-range:calc(100% - var(--clover-space-m)) 100%}.clover-items[data-layout=slider] .clover-items-frame[dir=rtl]:before{--clover-items-shade: to left;right:calc(-1 * var(--clover-items-ring-room));left:auto}.clover-items[data-layout=slider] .clover-items-frame[dir=rtl]:after{--clover-items-shade: to right;left:calc(-1 * var(--clover-items-ring-room));right:auto}}.clover-items[data-layout=list] .clover-items-track{display:flex;flex-direction:column}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-track{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--clover-items-size, 10rem)),1fr))}.clover-items-item{position:relative;cursor:pointer}.clover-items-link{display:block;color:inherit;text-decoration:none}:is(.clover-items-item[role=option],.clover-items-link){margin:calc(-1 * var(--clover-items-ring-room));padding:var(--clover-items-ring-room);outline:none}.clover-items:not([data-layout=slider]) :is(.clover-items-viewport,.clover-items-item[role=option],.clover-items-link){margin-inline:0;padding-inline:0}.clover-items-figure{display:grid;grid-template-columns:repeat(var(--parts, 1),auto);justify-content:start;gap:var(--clover-space-xs) 0;margin:0}.clover-items-pictures{position:relative;display:grid;grid-column:1 / -1;grid-template-columns:subgrid;border-radius:var(--clover-radius, 3px);outline:3px solid var(--ring-color, transparent);outline-offset:1px;transition:outline-color .2s cubic-bezier(.16,1,.3,1)}.clover-items-picture{position:relative;display:block;overflow:hidden;background-color:var(--clover-color-secondary-muted, #f1f1f1)}.clover-items-picture img{display:block;opacity:0;transition:opacity .3s ease}.clover-items-picture[data-loaded=true] img{opacity:1}.clover-items-picture[data-empty]{display:grid;place-items:center;aspect-ratio:var(--clover-items-ratio, 1);color:var(--clover-color-primary-muted, #26292b)}.clover-items-picture[data-empty]>svg{width:33%;max-width:var(--clover-space-xl);height:auto;fill:currentColor}.clover-items-pictures>.clover-items-picture:first-child{border-start-start-radius:inherit;border-end-start-radius:inherit}.clover-items-pictures>.clover-items-picture:last-child{border-start-end-radius:inherit;border-end-end-radius:inherit}.clover-items-duration{position:absolute;inset-inline-end:var(--clover-space-xs);bottom:var(--clover-space-xs);padding:var(--clover-space-3xs) var(--clover-space-xs);border-radius:var(--clover-radius, 3px);background-color:#000000b8;color:#fff;font-size:var(--clover-text-xs);font-variant-numeric:tabular-nums}.clover-items-caption{display:grid;grid-column:1 / -1;grid-template-columns:subgrid;gap:var(--clover-space-3xs) 0;font-size:var(--clover-text-s)}.clover-items-label{position:relative;contain:inline-size}.clover-items:is([data-layout=slider],[data-layout=grid],[data-layout=masonry]) .clover-items-label-text{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:var(--clover-items-lines, 3);line-clamp:var(--clover-items-lines, 3)}.clover-items-label-full{position:absolute;inset-inline:0;bottom:0;z-index:1;padding-block-start:var(--clover-space-2xs);background-color:var(--clover-color-secondary, #fff);box-shadow:0 calc(-1 * var(--clover-space-2xs)) var(--clover-space-s) #00000029;pointer-events:none}:is(.clover-items-item[role=option],.clover-items-link):is(:hover,:focus-visible):not([data-full-hidden]) .clover-items-label[data-clamped]>.clover-items-label-full{display:block}@media (forced-colors: active){.clover-items-label-full{border:1px solid CanvasText}}.clover-items-date{grid-column:1 / -1;color:var(--clover-color-primary-muted, #26292b);font-size:var(--clover-text-xs)}.clover-items-summary{grid-column:1 / -1;color:var(--clover-color-primary-muted, #26292b)}.clover-items[data-layout=slider] .clover-items-picture[data-empty],.clover-items[data-layout=slider] .clover-items-picture img{width:auto;height:var(--clover-items-picture-height)}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-figure{grid-template-columns:repeat(var(--parts, 1),1fr)}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-pictures{aspect-ratio:1;overflow:hidden}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-picture{min-width:0}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-picture img{width:100%;height:100%;object-fit:contain}.clover-items[data-layout=masonry] .clover-items-viewport[data-masonry] .clover-items-track{grid-auto-rows:4px;row-gap:0;align-items:start}.clover-items[data-layout=masonry] .clover-items-pictures{aspect-ratio:auto}.clover-items[data-layout=masonry] .clover-items-picture img{height:auto}.clover-items[data-layout=list] .clover-items-figure{grid-template-columns:auto 1fr;align-items:start;gap:0 var(--clover-space-s)}.clover-items[data-layout=list] .clover-items-pictures{grid-column:1;grid-template-columns:repeat(var(--parts, 1),auto);gap:0}.clover-items[data-layout=list] .clover-items-caption{grid-column:2;grid-template-columns:none}.clover-items[data-layout=list] .clover-items-label{contain:none}.clover-items[data-layout=list] .clover-items-picture img{width:auto;height:var(--clover-space-xl)}.clover-items[data-layout=list] .clover-items-picture[data-empty]{height:var(--clover-space-xl)}:is(.clover-items-item[role=option],.clover-items-link):hover{--ring-color: color-mix( in srgb, var(--clover-color-accent, #0065c3) 50%, transparent )}.clover-items-item[aria-selected=true]{--ring-color: var(--clover-color-accent, #0065c3)}:is(.clover-items-item[role=option],.clover-items-link):focus-visible{--ring-color: var(--clover-color-primary, #1a1d1e)}:is(.clover-items-item[role=option],.clover-items-link):focus-visible .clover-items-pictures:after{position:absolute;inset:0;border-radius:inherit;outline:2px solid var(--clover-color-secondary, #fff);outline-offset:-2px;box-shadow:inset 0 0 0 4px var(--clover-color-primary, #1a1d1e);content:"";pointer-events:none}:is(.clover-items-item[role=option],.clover-items-link):not(:has(.clover-items-pictures)):focus-visible{border-radius:var(--clover-radius, 3px);outline:3px solid var(--clover-color-primary, #1a1d1e);outline-offset:calc(1px - var(--clover-items-ring-room))}@media (forced-colors: active){.clover-items-pictures{outline-color:var(--ring-color, Canvas)}.clover-items-item[aria-selected=true]{--ring-color: Highlight}:is(.clover-items-item[role=option],.clover-items-link):focus-visible{--ring-color: CanvasText}:is(.clover-items-item[role=option],.clover-items-link):focus-visible .clover-items-pictures:after{outline-color:CanvasText}:is(.clover-items-item[role=option],.clover-items-link):not(:has(.clover-items-pictures)):focus-visible{outline-color:CanvasText}}.clover-items-item[aria-selected=true] .clover-items-label{color:var( --clover-color-accent-text, var(--clover-accent-text-fallback, var(--clover-color-accent, #0065c3)) );font-weight:600}:is(button.clover-items-scroll-prev,button.clover-items-scroll-next){position:absolute;top:calc(var(--clover-items-picture-height) / 2);z-index:2;translate:0 -50%;box-shadow:0 1px 4px #00000040}.clover-items-scroll-prev{inset-inline-start:var(--clover-space-2xs)}.clover-items-scroll-next{inset-inline-end:var(--clover-space-2xs)}.clover-pager{display:flex;align-items:center;justify-content:center;gap:var(--clover-space-s);padding-block:var(--clover-space-s)}.clover-pager-position{display:inline-grid;justify-items:end;font-variant-numeric:tabular-nums;color:var(--clover-color-primary-muted, #26292b)}.clover-pager[data-direction=right-to-left] .clover-pager-position{justify-items:start}.clover-pager-position>[aria-hidden]{grid-area:1 / 1}.clover-pager-position>.clover-pager-room[hidden]{display:block;visibility:hidden}.clover-pager:has(>.clover-pager-count){position:relative;z-index:5}.clover-pager-count{position:relative}.clover-pager:has(>.clover-pager-count)>button,.clover-pager-count>.clover-pager-count-button{position:relative;z-index:1}.clover-pager-count-button{display:inline-flex;align-items:center;gap:var(--clover-space-2xs);min-height:var(--clover-space-l);padding:0 var(--clover-space-xs);border:0;border-radius:var(--clover-radius-pill, 2rem);background:none;color:var(--clover-color-primary-muted, #26292b);font:inherit;cursor:pointer}.clover-pager-count-button .clover-pager-position{color:inherit}.clover-pager-count-button .clover-pager-position>span{grid-area:1 / 1}.clover-pager-count-button:is(:hover,:focus-visible,[aria-expanded=true]){color:var( --clover-color-accent-text, var(--clover-accent-text-fallback, var(--clover-color-accent, #0065c3)) )}.clover-pager-count-button:focus-visible{outline:2px solid var(--clover-color-accent, #0065c3);outline-offset:2px}.clover-pager-count>.clover-pager-menu{z-index:0;top:calc(-1 * var(--clover-space-m));inset-inline-start:calc(-1 * var(--clover-space-m));width:min(20rem,calc(100vw - 2 * var(--clover-space-m)));max-height:min(24rem,60vh);max-height:min(24rem,60dvh);--clover-pager-menu-head: calc( var(--clover-space-m) + var(--clover-space-l) + var(--clover-space-m) );padding:var(--clover-space-m);padding-block:var(--clover-pager-menu-head) 0}.clover-pager-count>.clover-pager-menu{display:flex;flex-direction:column;overflow:hidden}.clover-pager-count>.clover-pager-menu>.clover-pager-list{min-height:0;margin:calc(-1 * var(--clover-items-ring-room, 4px));margin-block-end:0;padding:var(--clover-items-ring-room, 4px);padding-block-end:var(--clover-space-m);overflow-y:auto;overscroll-behavior:contain}@supports (timeline-scope: --clover-pager-list){.clover-pager-count>.clover-pager-menu{timeline-scope:--clover-pager-list}.clover-pager-count>.clover-pager-menu>.clover-pager-list{scroll-timeline:--clover-pager-list block}.clover-pager-count>.clover-pager-menu:before{content:"";position:absolute;z-index:1;top:calc(var(--clover-pager-menu-head) - var(--clover-items-ring-room, 4px));inset-inline:calc(var(--clover-space-m) - var(--clover-items-ring-room, 4px));height:var(--clover-space-s);background:linear-gradient(rgb(0 0 0 / .16),transparent);-webkit-mask-image:linear-gradient(to right,transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);mask-image:linear-gradient(to right,transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);opacity:0;pointer-events:none;animation:clover-shade linear both;animation-timeline:--clover-pager-list;animation-range:0 var(--clover-space-m)}}.clover-pager[data-direction=right-to-left] .clover-pager-count>.clover-pager-menu{inset-inline:auto calc(-1 * var(--clover-space-m))}.clover-pager-count-button[aria-expanded=true] svg{rotate:180deg}.clover-pager-list.clover-collection>.clover-items{--clover-items-gap: var(--clover-space-m);margin:0}.clover-pager[data-size=small]{gap:var(--clover-space-2xs);padding-block:0}.clover-pager[data-size=small] .clover-pager-count-button{font-size:var(--clover-text-xs);line-height:1}.clover-pager[data-size=small] .clover-pager-position{font-weight:600}}
1
+ @layer clover{.clover-items{--clover-items-ring-room: 4px;--clover-items-picture-height: var(--clover-items-height, 8rem);color:var(--clover-color-primary, #1a1d1e)}.clover-items-header{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--clover-space-xs) var(--clover-space-m);margin-bottom:var(--clover-space-s)}.clover-items-description{flex:1 0 100%;order:3;margin:0;color:var(--clover-color-primary-muted, #26292b)}.clover-items-homepage{margin-inline-start:auto;color:var( --clover-color-accent-text, var(--clover-accent-text-fallback, var(--clover-color-accent, #0065c3)) );text-decoration-line:underline;text-underline-offset:var(--clover-space-3xs)}.clover-items-track{margin:0;padding:0;list-style:none;gap:var(--clover-items-gap, var(--clover-space-m))}.clover-items-viewport{margin:calc(-1 * var(--clover-items-ring-room));padding:var(--clover-items-ring-room);scroll-padding-inline:var(--clover-items-ring-room);scrollbar-width:none}.clover-items[data-layout=slider] .clover-items-viewport{padding-inline:calc(var(--clover-items-ring-room) + var(--clover-items-inset, 0px));scroll-padding-inline:calc(var(--clover-items-ring-room) + var(--clover-items-inset, 0px))}.clover-items-viewport::-webkit-scrollbar{display:none}.clover-items-viewport[data-dragging]{cursor:grabbing;-webkit-user-select:none;user-select:none}@supports (timeline-scope: --clover-items-track){.clover-items[data-layout=slider] .clover-items-frame{timeline-scope:--clover-items-track}.clover-items[data-layout=slider] .clover-items-viewport{scroll-timeline:--clover-items-track inline}.clover-items[data-layout=slider] .clover-items-frame:before,.clover-items[data-layout=slider] .clover-items-frame:after{content:"";position:absolute;top:var(--clover-items-ring-room);z-index:1;width:var(--clover-space-s);height:var(--clover-items-picture-height);background:linear-gradient(var(--clover-items-shade),rgb(0 0 0 / .16),transparent);-webkit-mask-image:linear-gradient(transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);mask-image:linear-gradient(transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);opacity:0;pointer-events:none;animation:clover-shade linear both;animation-timeline:--clover-items-track}.clover-items[data-layout=slider] .clover-items-frame:before{--clover-items-shade: to right;left:calc(-1 * var(--clover-items-ring-room));animation-range:0 var(--clover-space-m)}.clover-items[data-layout=slider] .clover-items-frame:after{--clover-items-shade: to left;right:calc(-1 * var(--clover-items-ring-room));animation-direction:reverse;animation-range:calc(100% - var(--clover-space-m)) 100%}.clover-items[data-layout=slider] .clover-items-frame[dir=rtl]:before{--clover-items-shade: to left;right:calc(-1 * var(--clover-items-ring-room));left:auto}.clover-items[data-layout=slider] .clover-items-frame[dir=rtl]:after{--clover-items-shade: to right;left:calc(-1 * var(--clover-items-ring-room));right:auto}}.clover-items[data-layout=list] .clover-items-track{display:flex;flex-direction:column}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-track{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--clover-items-size, 10rem)),1fr))}.clover-items-item{position:relative;cursor:pointer}.clover-items-link{display:block;color:inherit;text-decoration:none}:is(.clover-items-item[role=option],.clover-items-link){margin:calc(-1 * var(--clover-items-ring-room));padding:var(--clover-items-ring-room);outline:none}.clover-items:not([data-layout=slider]) :is(.clover-items-viewport,.clover-items-item[role=option],.clover-items-link){margin-inline:0;padding-inline:0}.clover-items-figure{display:grid;grid-template-columns:repeat(var(--parts, 1),auto);justify-content:start;gap:var(--clover-space-xs) 0;margin:0}.clover-items-pictures{position:relative;display:grid;grid-column:1 / -1;grid-template-columns:subgrid;border-radius:var(--clover-radius, 3px);outline:3px solid var(--ring-color, transparent);outline-offset:1px;transition:outline-color .2s cubic-bezier(.16,1,.3,1)}.clover-items-picture{position:relative;display:block;overflow:hidden;background-color:var(--clover-color-secondary-muted, #f1f1f1)}.clover-items-picture img{display:block;opacity:0;transition:opacity .3s ease}.clover-items-picture[data-loaded=true] img{opacity:1}.clover-items-picture[data-empty]{display:grid;place-items:center;aspect-ratio:var(--clover-items-ratio, 1);color:var(--clover-color-primary-muted, #26292b)}.clover-items-picture[data-empty]>svg{width:33%;max-width:var(--clover-space-xl);height:auto;fill:currentColor}.clover-items-pictures>.clover-items-picture:first-child{border-start-start-radius:inherit;border-end-start-radius:inherit}.clover-items-pictures>.clover-items-picture:last-child{border-start-end-radius:inherit;border-end-end-radius:inherit}.clover-items-duration{position:absolute;inset-inline-end:var(--clover-space-xs);bottom:var(--clover-space-xs);padding:var(--clover-space-3xs) var(--clover-space-xs);border-radius:var(--clover-radius, 3px);background-color:#000000b8;color:#fff;font-size:var(--clover-text-xs);font-variant-numeric:tabular-nums}.clover-items-caption{display:grid;grid-column:1 / -1;grid-template-columns:subgrid;gap:var(--clover-space-3xs) 0;font-size:var(--clover-text-s)}.clover-items-label{position:relative;contain:inline-size}.clover-items:is([data-layout=slider],[data-layout=grid],[data-layout=masonry]) .clover-items-label-text{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:var(--clover-items-lines, 3);line-clamp:var(--clover-items-lines, 3)}.clover-items-label-full{position:absolute;inset-inline:0;bottom:0;z-index:1;padding-block-start:var(--clover-space-2xs);background-color:var(--clover-color-secondary, #fff);box-shadow:0 calc(-1 * var(--clover-space-2xs)) var(--clover-space-s) #00000029;pointer-events:none}:is(.clover-items-item[role=option],.clover-items-link):is(:hover,:focus-visible):not([data-full-hidden]) .clover-items-label[data-clamped]>.clover-items-label-full{display:block}@media (forced-colors: active){.clover-items-label-full{border:1px solid CanvasText}}.clover-items-date{grid-column:1 / -1;color:var(--clover-color-primary-muted, #26292b);font-size:var(--clover-text-xs)}.clover-items-summary{grid-column:1 / -1;color:var(--clover-color-primary-muted, #26292b)}.clover-items[data-layout=slider] .clover-items-picture[data-empty],.clover-items[data-layout=slider] .clover-items-picture img{width:auto;height:var(--clover-items-picture-height)}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-figure{grid-template-columns:repeat(var(--parts, 1),1fr)}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-pictures{aspect-ratio:1;overflow:hidden}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-picture{min-width:0}.clover-items:is([data-layout=grid],[data-layout=masonry]) .clover-items-picture img{width:100%;height:100%;object-fit:contain}.clover-items[data-layout=masonry] .clover-items-viewport[data-masonry] .clover-items-track{grid-auto-rows:4px;row-gap:0;align-items:start}.clover-items[data-layout=masonry] .clover-items-pictures{aspect-ratio:auto}.clover-items[data-layout=masonry] .clover-items-picture img{height:auto}.clover-items[data-layout=list] .clover-items-figure{grid-template-columns:auto 1fr;align-items:start;gap:0 var(--clover-space-s)}.clover-items[data-layout=list] .clover-items-pictures{grid-column:1;grid-template-columns:repeat(var(--parts, 1),auto);gap:0}.clover-items[data-layout=list] .clover-items-caption{grid-column:2;grid-template-columns:none}.clover-items[data-layout=list] .clover-items-label{contain:none}.clover-items[data-layout=list] .clover-items-picture img{width:auto;height:var(--clover-space-xl)}.clover-items[data-layout=list] .clover-items-picture[data-empty]{height:var(--clover-space-xl)}:is(.clover-items-item[role=option],.clover-items-link):hover{--ring-color: color-mix( in srgb, var(--clover-color-accent, #0065c3) 50%, transparent )}.clover-items-item[aria-selected=true]{--ring-color: var(--clover-color-accent, #0065c3)}:is(.clover-items-item[role=option],.clover-items-link):focus-visible{--ring-color: var(--clover-color-primary, #1a1d1e)}:is(.clover-items-item[role=option],.clover-items-link):focus-visible .clover-items-pictures:after{position:absolute;inset:0;border-radius:inherit;outline:2px solid var(--clover-color-secondary, #fff);outline-offset:-2px;box-shadow:inset 0 0 0 4px var(--clover-color-primary, #1a1d1e);content:"";pointer-events:none}:is(.clover-items-item[role=option],.clover-items-link):not(:has(.clover-items-pictures)):focus-visible{border-radius:var(--clover-radius, 3px);outline:3px solid var(--clover-color-primary, #1a1d1e);outline-offset:calc(1px - var(--clover-items-ring-room))}@media (forced-colors: active){.clover-items-pictures{outline-color:var(--ring-color, Canvas)}.clover-items-item[aria-selected=true]{--ring-color: Highlight}:is(.clover-items-item[role=option],.clover-items-link):focus-visible{--ring-color: CanvasText}:is(.clover-items-item[role=option],.clover-items-link):focus-visible .clover-items-pictures:after{outline-color:CanvasText}:is(.clover-items-item[role=option],.clover-items-link):not(:has(.clover-items-pictures)):focus-visible{outline-color:CanvasText}}.clover-items-item[aria-selected=true] .clover-items-label{color:var( --clover-color-accent-text, var(--clover-accent-text-fallback, var(--clover-color-accent, #0065c3)) );font-weight:600}:is(button.clover-items-scroll-prev,button.clover-items-scroll-next){position:absolute;top:calc(var(--clover-items-picture-height) / 2);z-index:2;translate:0 -50%;box-shadow:0 1px 4px #00000040}.clover-items-scroll-prev{inset-inline-start:var(--clover-space-2xs)}.clover-items-scroll-next{inset-inline-end:var(--clover-space-2xs)}.clover-items[data-layout=slider][data-orientation=vertical]{display:flex;flex-direction:column;height:100%}.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-frame{flex:1;min-height:0}.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-viewport{box-sizing:border-box;height:calc(100% + 2 * var(--clover-items-ring-room));padding:calc(var(--clover-items-ring-room) + var(--clover-items-inset, 0px)) var(--clover-items-ring-room);scroll-padding:calc(var(--clover-items-ring-room) + var(--clover-items-inset, 0px)) 0}.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-figure{grid-template-columns:repeat(var(--parts, 1),1fr)}.clover-items[data-orientation=vertical] .clover-items-picture img,.clover-items[data-orientation=vertical] .clover-items-picture[data-empty]{width:100%;height:auto}.clover-items[data-orientation=vertical] .clover-items-picture[data-empty]{aspect-ratio:4 / 3}@supports (timeline-scope: --clover-items-track){.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-viewport{scroll-timeline:--clover-items-track block}.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-frame:before,.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-frame:after{left:0;right:0;width:auto;height:var(--clover-space-s);-webkit-mask-image:linear-gradient(to right,transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);mask-image:linear-gradient(to right,transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent)}.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-frame:before{--clover-items-shade: to bottom;top:calc(-1 * var(--clover-items-ring-room))}.clover-items[data-layout=slider][data-orientation=vertical] .clover-items-frame:after{--clover-items-shade: to top;top:auto;bottom:calc(-1 * var(--clover-items-ring-room))}}.clover-items[data-orientation=vertical] :is(button.clover-items-scroll-prev,button.clover-items-scroll-next){inset-inline:auto;left:50%;translate:-50% 0}.clover-items[data-orientation=vertical] button.clover-items-scroll-prev{top:var(--clover-space-2xs)}.clover-items[data-orientation=vertical] button.clover-items-scroll-next{top:auto;bottom:var(--clover-space-2xs)}.clover-pager{display:flex;align-items:center;justify-content:center;gap:var(--clover-space-s);padding-block:var(--clover-space-s)}.clover-pager-position{display:inline-grid;justify-items:end;font-variant-numeric:tabular-nums;color:var(--clover-color-primary-muted, #26292b)}.clover-pager[data-direction=right-to-left] .clover-pager-position{justify-items:start}.clover-pager-position>[aria-hidden]{grid-area:1 / 1}.clover-pager-position>.clover-pager-room[hidden]{display:block;visibility:hidden}.clover-pager:has(>.clover-pager-count){position:relative;z-index:5}.clover-pager-count{position:relative}.clover-pager:has(>.clover-pager-count)>button,.clover-pager-count>.clover-pager-count-button{position:relative;z-index:1}.clover-pager-count-button{display:inline-flex;align-items:center;gap:var(--clover-space-2xs);min-height:var(--clover-space-l);padding:0 var(--clover-space-xs);border:0;border-radius:var(--clover-radius-pill, 2rem);background:none;color:var(--clover-color-primary-muted, #26292b);font:inherit;cursor:pointer}.clover-pager-count-button .clover-pager-position{color:inherit}.clover-pager-count-button .clover-pager-position>span{grid-area:1 / 1}.clover-pager-count-button:is(:hover,:focus-visible,[aria-expanded=true]){color:var( --clover-color-accent-text, var(--clover-accent-text-fallback, var(--clover-color-accent, #0065c3)) )}.clover-pager-count-button:focus-visible{outline:2px solid var(--clover-color-accent, #0065c3);outline-offset:2px}.clover-pager-count>.clover-pager-menu{z-index:0;top:calc(-1 * var(--clover-space-m));inset-inline-start:calc(-1 * var(--clover-space-m));width:min(20rem,calc(100vw - 2 * var(--clover-space-m)));max-height:min(24rem,60vh);max-height:min(24rem,60dvh);--clover-pager-menu-head: calc( var(--clover-space-m) + var(--clover-space-l) + var(--clover-space-m) );padding:var(--clover-space-m);padding-block:var(--clover-pager-menu-head) 0}.clover-pager-count>.clover-pager-menu{display:flex;flex-direction:column;overflow:hidden}.clover-pager-count>.clover-pager-menu>.clover-pager-list{min-height:0;margin:calc(-1 * var(--clover-items-ring-room, 4px));margin-block-end:0;padding:var(--clover-items-ring-room, 4px);padding-block-end:var(--clover-space-m);overflow-y:auto;overscroll-behavior:contain}@supports (timeline-scope: --clover-pager-list){.clover-pager-count>.clover-pager-menu{timeline-scope:--clover-pager-list}.clover-pager-count>.clover-pager-menu>.clover-pager-list{scroll-timeline:--clover-pager-list block}.clover-pager-count>.clover-pager-menu:before{content:"";position:absolute;z-index:1;top:calc(var(--clover-pager-menu-head) - var(--clover-items-ring-room, 4px));inset-inline:calc(var(--clover-space-m) - var(--clover-items-ring-room, 4px));height:var(--clover-space-s);background:linear-gradient(rgb(0 0 0 / .16),transparent);-webkit-mask-image:linear-gradient(to right,transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);mask-image:linear-gradient(to right,transparent,#000 var(--clover-space-s),#000 calc(100% - var(--clover-space-s)),transparent);opacity:0;pointer-events:none;animation:clover-shade linear both;animation-timeline:--clover-pager-list;animation-range:0 var(--clover-space-m)}}.clover-pager[data-direction=right-to-left] .clover-pager-count>.clover-pager-menu{inset-inline:auto calc(-1 * var(--clover-space-m))}.clover-pager-count-button[aria-expanded=true] svg{rotate:180deg}.clover-pager-list.clover-collection>.clover-items{--clover-items-gap: var(--clover-space-m);margin:0}.clover-pager[data-size=small]{gap:var(--clover-space-2xs);padding-block:0}.clover-pager[data-size=small] .clover-pager-count-button{font-size:var(--clover-text-xs);line-height:1}.clover-pager[data-size=small] .clover-pager-position{font-weight:600}}