@nulib/clover 4.5.9 → 4.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Canvas/CanvasView.mjs +37 -4
- package/dist/components/Canvas/Connected.mjs +6 -2
- package/dist/components/Canvas/FrameAnimation.mjs +4 -48
- package/dist/components/Canvas/LoadedCanvas.mjs +26 -6
- package/dist/components/Canvas/Placeholder.mjs +1 -1
- package/dist/components/Canvas/media/Player.mjs +2 -2
- package/dist/components/CollectionSelect/CollectionSelect.mjs +6 -4
- package/dist/components/Items/Items.mjs +33 -7
- package/dist/components/Items/Position.mjs +2 -5
- package/dist/components/Items/StandaloneItems.mjs +6 -0
- package/dist/components/Items/vertical/ItemsVertical.mjs +8 -0
- package/dist/components/Map/MapView.mjs +2 -8
- package/dist/components/Root/useRootState.mjs +15 -14
- package/dist/components/Scene/Loaded.mjs +5 -1
- package/dist/core/clover.mjs +38 -10
- package/dist/core/geo.mjs +5 -4
- package/dist/core/request.mjs +7 -0
- package/dist/core/save-file.mjs +5 -2
- package/dist/core/selectors.mjs +16 -2
- package/dist/core/vtt.mjs +6 -4
- package/dist/i18n/locales/en.json.mjs +1 -1
- package/dist/i18n/locales/es.json.mjs +1 -1
- package/dist/i18n/locales/fi.json.mjs +1 -1
- package/dist/i18n/locales/fr.json.mjs +1 -1
- package/dist/i18n/locales/it.json.mjs +1 -1
- package/dist/i18n/locales/ja.json.mjs +1 -1
- package/dist/i18n/locales/nb.json.mjs +1 -1
- package/dist/i18n/locales/nn.json.mjs +1 -1
- package/dist/i18n/locales/no.json.mjs +1 -1
- package/dist/i18n/locales/pt.json.mjs +1 -1
- package/dist/i18n/locales/zh-Hans.json.mjs +1 -1
- package/dist/i18n/locales/zh-Hant.json.mjs +1 -1
- package/dist/index.d.mts +14 -2
- package/dist/lib/gltf/load.mjs +5 -2
- package/dist/lib/renderer/CanvasRenderer.mjs +183 -45
- package/dist/lib/renderer/backends/webgl2/shaders.mjs +2 -1
- package/dist/lib/renderer/io/TileCache.mjs +1 -1
- package/dist/lib/renderer/io/decode.mjs +2 -1
- package/dist/lib/renderer/scene/planFrame.mjs +17 -0
- package/dist/lib/renderer/scene/sceneItem.mjs +9 -4
- package/dist/lib/renderer/sources/imageService.mjs +2 -1
- package/dist/lib/renderer/sources/tilePyramid.mjs +14 -3
- package/dist/map/index.d.mts +2 -1
- package/dist/styles/core.css +1 -1
- package/dist/styles/items-vertical.css +1 -0
- package/dist/styles/items.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/ui/EntryThumbnail.mjs +6 -3
- package/dist/ui/Loading.mjs +9 -0
- package/dist/ui/loadingPass.mjs +52 -0
- package/dist/ui/sheets/items-vertical.mjs +5 -0
- package/dist/web-components/About-I4h1cfup.mjs +1 -0
- package/dist/web-components/AnnotationItems-BfQm1YRD.mjs +1 -0
- package/dist/web-components/{AnnotationMenu-CkTdOVgU.mjs → AnnotationMenu-guk9SbaL.mjs} +1 -1
- package/dist/web-components/{AnnotationState-DMgUWawu.mjs → AnnotationState-BX7xh-bd.mjs} +1 -1
- package/dist/web-components/{Annotations-DZX4QhcQ.mjs → Annotations-BJrje3Ey.mjs} +1 -1
- package/dist/web-components/{Annotations-CEshACVg.mjs → Annotations-DBxLDLDf.mjs} +1 -1
- package/dist/web-components/{Body-CLEco7_N.mjs → Body-CQuiRv9p.mjs} +1 -1
- package/dist/web-components/{BodyAlert-BP4r3Cd6.mjs → BodyAlert-DF9rnG5o.mjs} +1 -1
- package/dist/web-components/{Button-JqNjqiWi.mjs → Button-qhI73GCI.mjs} +1 -1
- package/dist/web-components/{Camera-Ccshr6VH.mjs → Camera-D2MnETlC.mjs} +1 -1
- package/dist/web-components/{Canvas2DBackend-B6073uEb.mjs → Canvas2DBackend-kJpOk_Pb.mjs} +1 -1
- package/dist/web-components/CanvasView-B752g1bm.mjs +2 -0
- package/dist/web-components/{CaptionDetails-Cg-Qs1Vo.mjs → CaptionDetails-Cl3fLJfr.mjs} +1 -1
- package/dist/web-components/ChaptersMenu-CB4zdVOh.mjs +1 -0
- package/dist/web-components/{Chevron-h5qzcEcw.mjs → Chevron-CT1ntI6B.mjs} +1 -1
- package/dist/web-components/{ChoiceMenu-DJzv0hit.mjs → ChoiceMenu-DoXMSLjk.mjs} +1 -1
- package/dist/web-components/{Collection-DdgyAL7y.mjs → Collection-B8ipKdPl.mjs} +1 -1
- package/dist/web-components/CollectionSelect-C0Tunk6c.mjs +1 -0
- package/dist/web-components/{Connected-Bfk00vQd.mjs → Connected-DaP_DgGw.mjs} +1 -1
- package/dist/web-components/{Connected-XzGCGV5F.mjs → Connected-L47VwCva.mjs} +1 -1
- package/dist/web-components/Connected-shq2_tc-.mjs +1 -0
- package/dist/web-components/{Contents-RRatJCsY.mjs → Contents-_u13TaBJ.mjs} +1 -1
- package/dist/web-components/{ControlMenu-CbGB6ddJ.mjs → ControlMenu-BW39OjKC.mjs} +1 -1
- package/dist/web-components/ControlsFade-LFHufW32.mjs +1 -0
- package/dist/web-components/{CountMenu-sy7-np4i.mjs → CountMenu-CQ7ThPWJ.mjs} +1 -1
- package/dist/web-components/Cue-B1IlY4Ae.mjs +1 -0
- package/dist/web-components/{Document-CeqDB3XD.mjs → Document-BChOw20c.mjs} +1 -1
- package/dist/web-components/{DomLayers-taxnJRum.mjs → DomLayers-BIFA6J56.mjs} +1 -1
- package/dist/web-components/{Download-Car7CU2u.mjs → Download-BfZJVu-O.mjs} +1 -1
- package/dist/web-components/{EntryBodies-BtpwwwYE.mjs → EntryBodies-Bld2RXeE.mjs} +1 -1
- package/dist/web-components/EntryThumbnail-C5df3CaH.mjs +1 -0
- package/dist/web-components/{FieldPill-cf9eBuE6.mjs → FieldPill-Dx--yBoK.mjs} +1 -1
- package/dist/web-components/FrameAnimation-CpniJMTK.mjs +1 -0
- package/dist/web-components/{Gallery-QK3ww9Sn.mjs → Gallery-CkaSdVAP.mjs} +1 -1
- package/dist/web-components/{GlobeGlyph-D3XRo_IQ.mjs → GlobeGlyph-CCi1sZgm.mjs} +1 -1
- package/dist/web-components/{HideToggle-BdulLE7z.mjs → HideToggle-nvJtMFOZ.mjs} +1 -1
- package/dist/web-components/{ImageControls-CiL_D1jJ.mjs → ImageControls-Df-M7F2R.mjs} +1 -1
- package/dist/web-components/Items-BsKByN_b.mjs +1 -0
- package/dist/web-components/ItemsVertical-Dmhm1DBy.mjs +1 -0
- package/dist/web-components/Label-DElSTYS5.mjs +1 -0
- package/dist/web-components/{LanguageChoice-CPvKeMS_.mjs → LanguageChoice-t55qbd8x.mjs} +1 -1
- package/dist/web-components/{LanguageMenu-DEoDIxlR.mjs → LanguageMenu-BlFBWRSO.mjs} +1 -1
- package/dist/web-components/{LightboxView-D42ogB9b.mjs → LightboxView-BhPao9ao.mjs} +1 -1
- package/dist/web-components/{ListEnd-1VWK96re.mjs → ListEnd-KSoUQrsM.mjs} +1 -1
- package/dist/web-components/Loaded-uGqT3xyD.mjs +1 -0
- package/dist/web-components/LoadedCanvas-fqjWHH0H.mjs +3 -0
- package/dist/web-components/LoadedMap-BpRHQPoU.mjs +1 -0
- package/dist/web-components/Loading-DSaV1vxb.mjs +1 -0
- package/dist/web-components/{Map-1SoA6_NY.mjs → Map-CUY8HEgh.mjs} +1 -1
- package/dist/web-components/MapView-DIVMYZZ1.mjs +3 -0
- package/dist/web-components/{Markup-CGp-sAk0.mjs → Markup-DzUsOaNC.mjs} +1 -1
- package/dist/web-components/{MediaBody-nPvqRq1E.mjs → MediaBody-CJELKAWJ.mjs} +1 -1
- package/dist/web-components/{MediaBody-BCwNSKUW.mjs → MediaBody-CN2ZTxK0.mjs} +1 -1
- package/dist/web-components/{NavDate-BQjEV2AU.mjs → NavDate-CD3sFxZJ.mjs} +1 -1
- package/dist/web-components/{Navigator-BVKUD0-V.mjs → Navigator-CVDhe8R_.mjs} +1 -1
- package/dist/web-components/{Pager-Ccdj43ZQ.mjs → Pager-BmZaB--9.mjs} +1 -1
- package/dist/web-components/PagerLayout-DhIz3hKA.mjs +1 -0
- package/dist/web-components/{Panel-xCi9RT4Z.mjs → Panel-CdJyJVBh.mjs} +1 -1
- package/dist/web-components/PanelPart-m2QWHh_4.mjs +1 -0
- package/dist/web-components/{PanelToggle-CSRKyPCu.mjs → PanelToggle-BqVj7sX0.mjs} +1 -1
- package/dist/web-components/PartOfManifest-Dgw1shMM.mjs +1 -0
- package/dist/web-components/{Pending-Dagi9Hhc.mjs → Pending-CDXsIk5O.mjs} +1 -1
- package/dist/web-components/{PlaceBox-C4_JBM6I.mjs → PlaceBox-DNnl9coD.mjs} +1 -1
- package/dist/web-components/Placeholder-D8Sabput.mjs +1 -0
- package/dist/web-components/Position-oFMJoo4P.mjs +1 -0
- package/dist/web-components/{Primitives-C2f-ZV1J.mjs → Primitives-BdXIEpYW.mjs} +1 -1
- package/dist/web-components/{Provider-DQ5Gz-Bh.mjs → Provider-DWIlPOzR.mjs} +1 -1
- package/dist/web-components/{ReadMore-D4zZ4ZJ5.mjs → ReadMore-f34RbHMm.mjs} +1 -1
- package/dist/web-components/Root-CEtLCE4Y.mjs +1 -0
- package/dist/web-components/Scene-BJE8miZL.mjs +1 -0
- package/dist/web-components/{SceneView-BgjiTjRe.mjs → SceneView-D635_fRV.mjs} +1 -1
- package/dist/web-components/{Search-DGAEkL-h.mjs → Search-219u7M8o.mjs} +1 -1
- package/dist/web-components/{Sections-CPCPWIFr.mjs → Sections-C3fPhGNx.mjs} +1 -1
- package/dist/web-components/{SeekMarks-DemiDpFP.mjs → SeekMarks-Ds8v3SaW.mjs} +1 -1
- package/dist/web-components/StandaloneItems-Mdh-k3w9.mjs +1 -0
- package/dist/web-components/{Status-BYnM-ITS.mjs → Status-CEkhPlDF.mjs} +1 -1
- package/dist/web-components/{Steps-DByLc8pX.mjs → Steps-BoNd47eB.mjs} +1 -1
- package/dist/web-components/{TargetItems-BDt6OXh8.mjs → TargetItems-dFjJs-VP.mjs} +1 -1
- package/dist/web-components/Timeline-DPdS6bYG.mjs +1 -0
- package/dist/web-components/{Tip-h4Abk6aH.mjs → Tip-mcI7IRQh.mjs} +1 -1
- package/dist/web-components/{Transcript-CfOhWPdJ.mjs → Transcript-5wVgmZmU.mjs} +1 -1
- package/dist/web-components/{Transport-Xwq6Cpn3.mjs → Transport-DYjd2GnA.mjs} +1 -1
- package/dist/web-components/{Transport-B58M-XIa.mjs → Transport-DdNRlSa0.mjs} +1 -1
- package/dist/web-components/{annotation-collection-BH66kiGL.mjs → annotation-collection-C3UpNV1K.mjs} +1 -1
- package/dist/web-components/{annotation-name-Biu7-abB.mjs → annotation-name-DhMF4ZHj.mjs} +1 -1
- package/dist/web-components/{annotations-content-tLJ5sUiC.mjs → annotations-content-CuWJZr4t.mjs} +1 -1
- package/dist/web-components/{body-BIieugrZ.mjs → body-Bym9Uvav.mjs} +1 -1
- package/dist/web-components/canvas-BIXBggVo.mjs +1 -0
- package/dist/web-components/{viewer/cloverEngine-Cd4MoqAY.mjs → cloverEngine-BEdb3g52.mjs} +3 -3
- package/dist/web-components/{content-state-reader-DtRv0vnr.mjs → content-state-reader-BGZEChSM.mjs} +1 -1
- package/dist/web-components/{controlGlyphs-QLLc8cpa.mjs → controlGlyphs-DMQCxKaT.mjs} +1 -1
- package/dist/web-components/{controls-DuLb0zYy.mjs → controls-B1pIwRgH.mjs} +1 -1
- package/dist/web-components/{downloads-DUWW30ai.mjs → downloads-DwzBIS-9.mjs} +1 -1
- package/dist/web-components/{dragToClose-DAS5OWSl.mjs → dragToClose-BYUJ9qgo.mjs} +1 -1
- package/dist/web-components/{engine-DaDzKDum.mjs → engine-DUv-Syum.mjs} +1 -1
- package/dist/web-components/{engines-DGQYmjhi.mjs → engines-BzM_oBU_.mjs} +1 -1
- package/dist/web-components/{es-Bn4XnLxy.mjs → es-Bx-zZBfZ.mjs} +1 -1
- package/dist/web-components/{fetchManifest-CDLkWDgP.mjs → fetchManifest-Cp7c8vs5.mjs} +1 -1
- package/dist/web-components/{fi-CjAXeLqH.mjs → fi-DsP1FhBy.mjs} +1 -1
- package/dist/web-components/{follow-content-Rav98zXa.mjs → follow-content-CmXq05TW.mjs} +1 -1
- package/dist/web-components/{fr-CeFhkxoi.mjs → fr-BuL_F9Jq.mjs} +1 -1
- package/dist/web-components/{fromManifest-B8AlKP6a.mjs → fromManifest-DbgwTeBo.mjs} +1 -1
- package/dist/web-components/{glyphs-BzZKC9_8.mjs → glyphs-atKuagcd.mjs} +1 -1
- package/dist/web-components/{hooks-BGorrvz7.mjs → hooks-DhTYPPVG.mjs} +1 -1
- package/dist/web-components/image-layers-CoBPhMZw.mjs +1 -0
- package/dist/web-components/{image-service-content-BGBge-Nu.mjs → image-service-content-CL_EZugL.mjs} +1 -1
- package/dist/web-components/imageService-BoQQvo1U.mjs +1 -0
- package/dist/web-components/{index-GH8QRDv1.mjs → index-Ciz5x8Tt.mjs} +1 -1
- package/dist/web-components/index.mjs +1 -1
- package/dist/web-components/{it-DxtfVek2.mjs → it-DH3EtrgI.mjs} +1 -1
- package/dist/web-components/{items-CtOmANs8.mjs → items-CjtUJjSU.mjs} +1 -1
- package/dist/web-components/items-DiQ3K5TV.mjs +1 -0
- package/dist/web-components/{ja-rsicBgWR.mjs → ja-BEHbDotv.mjs} +1 -1
- package/dist/web-components/label-CKgFcOzZ.mjs +1 -0
- package/dist/web-components/{layout-BmDYodJC.mjs → layout-zjkkOHIj.mjs} +1 -1
- package/dist/web-components/{link-CQUMZL8-.mjs → link-CrNaByf-.mjs} +1 -1
- package/dist/web-components/logo-C2xm9WAL.mjs +1 -0
- package/dist/web-components/{models-BbiJP5tM.mjs → models-BFKa5v_H.mjs} +1 -1
- package/dist/web-components/{no-BkyI1fhp.mjs → nb-Bdfn_mZs.mjs} +1 -1
- package/dist/web-components/{nn-n_xM6AGl.mjs → nn-BCWbSuK0.mjs} +1 -1
- package/dist/web-components/{nb-BkyI1fhp.mjs → no-Bdfn_mZs.mjs} +1 -1
- package/dist/web-components/{nodes-DARyEM2G.mjs → nodes-BDyXzQhk.mjs} +1 -1
- package/dist/web-components/{overlayImage-F-EX6YpI.mjs → overlayImage-BGxovfPN.mjs} +1 -1
- package/dist/web-components/{panel-COE-wxFK.mjs → panel-rEGhe5fL.mjs} +1 -1
- package/dist/web-components/part-PF-s_vD-.mjs +1 -0
- package/dist/web-components/{playerSurface-BAK0g9ik.mjs → playerSurface-BthXi9l2.mjs} +1 -1
- package/dist/web-components/{pointer-DnJMax9Y.mjs → pointer-C22ufJ5w.mjs} +1 -1
- package/dist/web-components/{provider-B9I7nScH.mjs → provider-B2C3eH9p.mjs} +1 -1
- package/dist/web-components/{pt-COchUT7D.mjs → pt-Da5El49z.mjs} +1 -1
- package/dist/web-components/{range-regions-DEnDbiy7.mjs → range-regions-Ytq4QkMX.mjs} +1 -1
- package/dist/web-components/{read-more-DkDjZsOx.mjs → read-more-B7LHzF4-.mjs} +1 -1
- package/dist/web-components/{readingLanguages-DZxj1se7.mjs → readingLanguages-B20n_dkw.mjs} +1 -1
- package/dist/web-components/rendererSurface-BfZP5clN.mjs +22 -0
- package/dist/web-components/{renderers-17347cy8.mjs → renderers-C569MeQB.mjs} +1 -1
- package/dist/web-components/{resource-CtPBxzcn.mjs → resource-C5cMic8z.mjs} +1 -1
- package/dist/web-components/save-file-DsYdCZpi.mjs +1 -0
- package/dist/web-components/{search-CE2oKdT4.mjs → search-kJ_71fbN.mjs} +1 -1
- package/dist/web-components/shared-ByrLMUQa.mjs +1 -0
- package/dist/web-components/{show-link-DuRktUta.mjs → show-link-BqrJDDMV.mjs} +1 -1
- package/dist/web-components/{sizedImage-DAaoYkRy.mjs → sizedImage-CyCf0GtL.mjs} +1 -1
- package/dist/web-components/{split-BP3eTM8x.mjs → split-BZRKCI3g.mjs} +1 -1
- package/dist/web-components/{status-CpVNchw2.mjs → status-CwO2mygB.mjs} +1 -1
- package/dist/web-components/styles-BOXm_R8o.mjs +1 -0
- package/dist/web-components/three.mjs +1 -1
- package/dist/web-components/{thumbnail-BcediRH4.mjs → thumbnail-Np4ftjUo.mjs} +1 -1
- package/dist/web-components/{tip-BRNRex1D.mjs → tip-CNyxI6xd.mjs} +1 -1
- package/dist/web-components/{toggle-hREejXk6.mjs → toggle-lop2se80.mjs} +1 -1
- package/dist/web-components/{useContainerName-DeDFbnAs.mjs → useContainerName-DR_6TyDU.mjs} +1 -1
- package/dist/web-components/{useControlsVisibility-BYHbIHGH.mjs → useControlsVisibility-Dig_1-0T.mjs} +1 -1
- package/dist/web-components/{useNearViewport-BgvHaTUu.mjs → useNearViewport-B_kjW0WB.mjs} +1 -1
- package/dist/web-components/{useScrollTrack-B7zWqV5x.mjs → useScrollTrack-6BV6IizZ.mjs} +1 -1
- package/dist/web-components/viewer/{AnnotationItems-CDMYXEJY.mjs → AnnotationItems-BDFH_6F_.mjs} +1 -1
- package/dist/web-components/viewer/{AnnotationMenu-R-IJnoJr.mjs → AnnotationMenu-BHCrJoNx.mjs} +1 -1
- package/dist/web-components/viewer/{AnnotationState-CvRSbJoR.mjs → AnnotationState-BV0fzlj8.mjs} +1 -1
- package/dist/web-components/viewer/{Annotations-CX2kTFir.mjs → Annotations-BhA_Bbyj.mjs} +1 -1
- package/dist/web-components/viewer/{Annotations-D-vxlAH-.mjs → Annotations-DEqkGlE1.mjs} +1 -1
- package/dist/web-components/viewer/{Canvas2DBackend-CRyXTdaF.mjs → Canvas2DBackend-Bq_bo1mL.mjs} +1 -1
- package/dist/web-components/viewer/CaptionDetails-D6Gd_EGS.mjs +1 -0
- package/dist/web-components/viewer/{ChaptersMenu-B84VO_Mr.mjs → ChaptersMenu-DE2TFesS.mjs} +1 -1
- package/dist/web-components/viewer/{ChoiceMenu-CDG8LFjh.mjs → ChoiceMenu-BVlpPUhr.mjs} +1 -1
- package/dist/web-components/viewer/{Collection-BE7-wcaT.mjs → Collection-DIgmeOCD.mjs} +1 -1
- package/dist/web-components/viewer/{Connected-BgYoWJ9x.mjs → Connected-7TgFouaR.mjs} +1 -1
- package/dist/web-components/viewer/{Connected-CDglyxHQ.mjs → Connected-D9dz_v1p.mjs} +1 -1
- package/dist/web-components/viewer/{Contents-YlFDgYna.mjs → Contents-ROI1iuuR.mjs} +1 -1
- package/dist/web-components/viewer/{ControlMenu-CwOThPXI.mjs → ControlMenu-CZlN7x0D.mjs} +1 -1
- package/dist/web-components/viewer/ControlsFade-QEgqI3wY.mjs +1 -0
- package/dist/web-components/viewer/{CountMenu-Bio1pBA5.mjs → CountMenu-CCEH_rEu.mjs} +1 -1
- package/dist/web-components/viewer/Cue-CLbO9g2X.mjs +1 -0
- package/dist/web-components/viewer/{Document-D3QFxaMG.mjs → Document-8ADB98RM.mjs} +1 -1
- package/dist/web-components/viewer/{DomLayers-DqluSP_z.mjs → DomLayers-BXPbPq1a.mjs} +1 -1
- package/dist/web-components/viewer/{Download-COC-nK6_.mjs → Download-YfjzAcAF.mjs} +1 -1
- package/dist/web-components/viewer/{EntryBodies-UbloKBFE.mjs → EntryBodies-B2DBmUYl.mjs} +1 -1
- package/dist/web-components/viewer/EntryThumbnail-B2cRaP5D.mjs +1 -0
- package/dist/web-components/viewer/{FieldPill-D9c-u2aG.mjs → FieldPill-C7o8586T.mjs} +1 -1
- package/dist/web-components/viewer/FrameAnimation-CytZC2Lx.mjs +1 -0
- package/dist/web-components/viewer/{Gallery-ByCLq8nD.mjs → Gallery-CQma5dBZ.mjs} +1 -1
- package/dist/web-components/viewer/{GlobeGlyph-KKxBlsfc.mjs → GlobeGlyph-UxhwZJy1.mjs} +1 -1
- package/dist/web-components/viewer/{HideToggle-BNnJlKG3.mjs → HideToggle-DZMCACLG.mjs} +1 -1
- package/dist/web-components/viewer/{ImageControls-BCz88aeX.mjs → ImageControls-fzFWqFVh.mjs} +1 -1
- package/dist/web-components/viewer/ItemsVertical-BftsRVJP.mjs +1 -0
- package/dist/web-components/viewer/{LanguageChoice-DSERkWEF.mjs → LanguageChoice-B8F2WhUM.mjs} +1 -1
- package/dist/web-components/viewer/{LanguageMenu-Cv7bWG0F.mjs → LanguageMenu-BIpATvd4.mjs} +1 -1
- package/dist/web-components/viewer/{LightboxView-ClQSmYRQ.mjs → LightboxView-D-6yYXCc.mjs} +1 -1
- package/dist/web-components/viewer/{ListEnd-B6VtWReK.mjs → ListEnd-DhrDIRKM.mjs} +1 -1
- package/dist/web-components/viewer/MapView-XFUp4DVX.mjs +3 -0
- package/dist/web-components/viewer/{MediaBody-Cshfh_3F.mjs → MediaBody-C3fVbzuD.mjs} +1 -1
- package/dist/web-components/viewer/{MediaBody-CvXptO7l.mjs → MediaBody-D-1SNnW2.mjs} +1 -1
- package/dist/web-components/viewer/{NavDate-l4WnJ7Ph.mjs → NavDate-B47wyKdc.mjs} +1 -1
- package/dist/web-components/viewer/{Navigator-DilJ4hOg.mjs → Navigator-BqNBxE5l.mjs} +1 -1
- package/dist/web-components/viewer/{PagerLayout-ZMGl6Hso.mjs → PagerLayout-DKdFxLZ1.mjs} +1 -1
- package/dist/web-components/viewer/PanelPart-CuddftmQ.mjs +1 -0
- package/dist/web-components/viewer/{PartOfManifest-Ci8XArjU.mjs → PartOfManifest-DF40jLNB.mjs} +1 -1
- package/dist/web-components/viewer/{PlaceBox-DIKp5Qgf.mjs → PlaceBox-Bi1inmQv.mjs} +1 -1
- package/dist/web-components/viewer/{Placeholder-BFtTc4a5.mjs → Placeholder-BhAzmG0d.mjs} +1 -1
- package/dist/web-components/viewer/{Search-CffzBngs.mjs → Search-CTkCx-SZ.mjs} +1 -1
- package/dist/web-components/viewer/{SeekMarks-BEujwiot.mjs → SeekMarks-8NvVfr4F.mjs} +1 -1
- package/dist/web-components/viewer/StandaloneItems-P1ygiZtX.mjs +1 -0
- package/dist/web-components/viewer/{Steps-MQSxvD8B.mjs → Steps-DwqiM7sH.mjs} +1 -1
- package/dist/web-components/viewer/{TargetItems-BdAvyfvp.mjs → TargetItems-B873PbFR.mjs} +1 -1
- package/dist/web-components/viewer/{Transcript-DR4SbDcf.mjs → Transcript-D7cFMWGk.mjs} +1 -1
- package/dist/web-components/viewer/{Transport-e9YUnvid.mjs → Transport-DPURF464.mjs} +1 -1
- package/dist/web-components/viewer/{Transport-CWkJ1XOL.mjs → Transport-TvkdinN-.mjs} +1 -1
- package/dist/web-components/viewer/{annotation-collection-BmIgw-9-.mjs → annotation-collection-BwY8uYqa.mjs} +1 -1
- package/dist/web-components/viewer/{annotation-name-BcZahQW_.mjs → annotation-name-DQMCd2DB.mjs} +1 -1
- package/dist/web-components/viewer/{annotations-content-BsCUZUiG.mjs → annotations-content-q11OcPdT.mjs} +1 -1
- package/dist/web-components/{cloverEngine-qypryrZ2.mjs → viewer/cloverEngine-K2HNl3W1.mjs} +3 -3
- package/dist/web-components/viewer/{content-state-reader-CZzZVuIS.mjs → content-state-reader-BhDMcVmC.mjs} +1 -1
- package/dist/web-components/viewer/{dragToClose-DwFUE5k_.mjs → dragToClose-BFhEkxmf.mjs} +1 -1
- package/dist/web-components/viewer/{fetchManifest--iK6wT8O.mjs → fetchManifest-aJRqlL7Q.mjs} +1 -1
- package/dist/web-components/viewer/{follow-content-CEoIPewi.mjs → follow-content-Cy0flRSN.mjs} +1 -1
- package/dist/web-components/viewer/{host-B9_p4Vyw.mjs → host-C4OSSUrc.mjs} +1 -1
- package/dist/web-components/viewer/{image-layers-TE9lUAo8.mjs → image-layers-BmOyugIr.mjs} +1 -1
- package/dist/web-components/viewer/{image-service-content-BghMNjSP.mjs → image-service-content-BuqFuXBZ.mjs} +1 -1
- package/dist/web-components/viewer/index.mjs +1 -1
- package/dist/web-components/viewer/{link-BDYoIIG6.mjs → link-BtdcvLLg.mjs} +1 -1
- package/dist/web-components/viewer/overlayImage-BOilakHT.mjs +1 -0
- package/dist/web-components/viewer/{range-regions-BD5RPgtX.mjs → range-regions-S1HcVfpb.mjs} +1 -1
- package/dist/web-components/viewer/{renderers-BGTNG2ao.mjs → renderers-CetbXlHH.mjs} +1 -1
- package/dist/web-components/viewer/save-file-BohgaD35.mjs +1 -0
- package/dist/web-components/viewer/{search-BFTaFcIE.mjs → search-C0ZHXQW-.mjs} +1 -1
- package/dist/web-components/viewer/styles-XRfyRUPf.mjs +1 -0
- package/dist/web-components/viewer/{useControlsVisibility-CdHbUJ_5.mjs → useControlsVisibility-CmA6PMfv.mjs} +1 -1
- package/dist/web-components/viewer/viewer-BXbkj7DJ.mjs +29 -0
- package/dist/web-components/viewer/vtt-BIJk7HEl.mjs +5 -0
- package/dist/web-components/{viewer-PeMy2VzH.mjs → viewer-f_6tefcG.mjs} +1 -1
- package/dist/web-components/vtt-BRwnCWbJ.mjs +5 -0
- package/dist/web-components/{zh-Hans-Bfn3LUnq.mjs → zh-Hans-BhTHTZXT.mjs} +1 -1
- package/dist/web-components/{zh-Hant-DzmK541A.mjs → zh-Hant-_CJAOTzC.mjs} +1 -1
- package/package.json +1 -1
- package/dist/web-components/About-CGMm1-_m.mjs +0 -1
- package/dist/web-components/AnnotationItems-D5YRBYo7.mjs +0 -1
- package/dist/web-components/CanvasView-BCyHQxwA.mjs +0 -2
- package/dist/web-components/ChaptersMenu-BlH2m--N.mjs +0 -1
- package/dist/web-components/CollectionSelect-CI-gJrdr.mjs +0 -1
- package/dist/web-components/Connected-Dz38Bzpd.mjs +0 -1
- package/dist/web-components/ControlsFade-BPl7QLD-.mjs +0 -1
- package/dist/web-components/Cue-BtLDY60I.mjs +0 -1
- package/dist/web-components/EntryThumbnail-BsvULLOE.mjs +0 -1
- package/dist/web-components/FrameAnimation-HthNp8Wy.mjs +0 -1
- package/dist/web-components/Items-Ch80infd.mjs +0 -1
- package/dist/web-components/Label-Bo3CK-L6.mjs +0 -1
- package/dist/web-components/Loaded-1HMGKert.mjs +0 -1
- package/dist/web-components/LoadedCanvas-CDXDAq7C.mjs +0 -1
- package/dist/web-components/LoadedMap-CKE1VBTk.mjs +0 -1
- package/dist/web-components/Loading-DJ1DTuTP.mjs +0 -1
- package/dist/web-components/MapView-Bh4hjBql.mjs +0 -3
- package/dist/web-components/PagerLayout-DwHzuFi9.mjs +0 -1
- package/dist/web-components/PanelPart-BZDTLVZL.mjs +0 -1
- package/dist/web-components/PartOfManifest-VSzd2d_m.mjs +0 -1
- package/dist/web-components/Placeholder-BLHxv7em.mjs +0 -1
- package/dist/web-components/Position-SN6EMJW-.mjs +0 -1
- package/dist/web-components/Root-ijCOCdMK.mjs +0 -1
- package/dist/web-components/Scene-BnuKH1Ht.mjs +0 -1
- package/dist/web-components/StandaloneItems-DSTZPmPt.mjs +0 -1
- package/dist/web-components/Timeline-DtE58r-z.mjs +0 -1
- package/dist/web-components/canvas-Cni09Q09.mjs +0 -1
- package/dist/web-components/image-layers-DPZluciF.mjs +0 -1
- package/dist/web-components/imageService-DygjhKL0.mjs +0 -1
- package/dist/web-components/items-BSsoG42S.mjs +0 -1
- package/dist/web-components/label-WSQUfpL6.mjs +0 -1
- package/dist/web-components/logo-QdGDNl77.mjs +0 -1
- package/dist/web-components/part-CLteOpEJ.mjs +0 -1
- package/dist/web-components/rendererSurface-DKU6SaHP.mjs +0 -22
- package/dist/web-components/save-file-BF9IHyiG.mjs +0 -1
- package/dist/web-components/shared-BzLnvFn3.mjs +0 -1
- package/dist/web-components/styles-DbqlZvMR.mjs +0 -1
- package/dist/web-components/viewer/CaptionDetails-CpfNg-6d.mjs +0 -1
- package/dist/web-components/viewer/ControlsFade-JiHTC1PR.mjs +0 -1
- package/dist/web-components/viewer/Cue-Dtgk1XOR.mjs +0 -1
- package/dist/web-components/viewer/EntryThumbnail-DftAANer.mjs +0 -1
- package/dist/web-components/viewer/FrameAnimation-DljklLUX.mjs +0 -1
- package/dist/web-components/viewer/MapView-4SX7XTs-.mjs +0 -3
- package/dist/web-components/viewer/PanelPart-BiYn_NxJ.mjs +0 -1
- package/dist/web-components/viewer/StandaloneItems-t0PWVVTU.mjs +0 -1
- package/dist/web-components/viewer/overlayImage-B43PyGj2.mjs +0 -1
- package/dist/web-components/viewer/save-file-B9oonwkE.mjs +0 -1
- package/dist/web-components/viewer/styles-nU97HodU.mjs +0 -1
- package/dist/web-components/viewer/viewer-xpsvi-tg.mjs +0 -29
- package/dist/web-components/viewer/vtt-CDmiwLtu.mjs +0 -5
- package/dist/web-components/vtt-DRrShcvI.mjs +0 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
const pt = JSON.parse('{"commonClose":"Fechar","commonNext":"Seguinte","commonPrevious":"Anterior","commonSearch":"Pesquisar","commonViewAll":"Ver tudo","controlShortcut":"{{label}} ({{shortcut}})","contentSearchLoading":"A carregar...","contentSearchPlaceholder":"Pesquisar","contentSearchResultsNone":"Sem resultados","contentSearchResult":"1 resultado","contentSearchResults":"{{count}} resultados","contentSearchError":"Não foi possível concluir a pesquisa.","contentSearchPosition":"Resultado {{index}} de {{total}}","contentSearchClear":"Limpar a pesquisa","canvasPosition":"Item {{index}} de {{total}}","canvasImage":"Imagem","bodyUnloadableImage":"Não foi possível carregar esta imagem.","bodyUnloadableVideo":"Não foi possível carregar este vídeo.","bodyUnloadableAudio":"Não foi possível carregar este áudio.","bodyUnloadableModel":"Não foi possível carregar este modelo.","canvasRoleDescription":"imagem ampliável","canvasKeysImage":"Use as teclas de seta para deslocar a imagem, com Shift para ir mais longe, mais e menos para ampliar e reduzir, 0 para repor a vista, e R ou Shift+R para rodar.","canvasKeysMedia":"Prima Espaço ou K para reproduzir ou pausar, J ou L para recuar ou avançar dez segundos, e M para silenciar ou ativar o som.","canvasKeysAnnotations":"Prima Esc para desmarcar a anotação.","sceneModel":"Modelo 3D","sceneRoleDescription":"modelo 3D rotativo","sceneKeys":"Use as teclas de seta para rodar o modelo, com Shift para ir mais longe, mais e menos para ampliar e reduzir, 0 para repor a vista, e R ou Shift+R para o rodar para a direita ou para a esquerda.","sceneRotateUp":"Rodar para cima","sceneRotateDown":"Rodar para baixo","sceneRotate":"Rodar","sceneResetView":"Repor a vista","statusLoading":"A carregar…","statusError":"Não foi possível carregar este conteúdo.","itemsLabel":"Itens","download":"Transferir","downloadPage":"Esta página","downloadAll":"Todas as páginas","templateSidebar":"Itens","templateSidebarToggle":"Mostrar itens","templateBack":"Voltar","templateBackTo":"Voltar a {{label}}","collectionLabel":"Coleção","itemsScrollBack":"Mostrar itens anteriores","itemsScrollForward":"Mostrar mais itens","aboutRights":"Direitos","aboutDate":"Data","aboutHomepage":"Página inicial","aboutSeeAlso":"Ver também","aboutProvider":"Fornecedor","logo":"Logótipo","aboutManifest":"Manifesto IIIF","aboutCanvas":"Tela IIIF","aboutPartOf":"Parte de","aboutOpenManifest":"Abrir o manifesto completo","aboutCollection":"Coleção IIIF","readingLanguage":"Idioma","annotationsHide":"Ocultar anotações","annotationsHideTip":"Ocultar","readMore":"Ler mais","readLess":"Ler menos","annotationsShow":"Mostrar na imagem","annotationsShowTime":"Mostrar na gravação","annotationsImage":"Imagem","annotationsLanguage":"Idioma","annotationsOpenLink":"Abrir","transcriptLabel":"Transcrição","imageViewerOpen":"Abrir o visualizador de imagens","imageViewerClose":"Fechar o visualizador de imagens","canvasChoice":"Alternativas","canvasViewerControls":"Controlos do visualizador","canvasExpandControls":"Expandir os controlos do visualizador","canvasCollapseControls":"Recolher os controlos do visualizador","canvasScrollBack":"Mostrar controlos anteriores","canvasScrollForward":"Mostrar mais controlos","imageFullScreen":"Ecrã completo","imageExitFullScreen":"Sair do ecrã completo","imageResetZoom":"Repor o zoom","imageRotateLeft":"Rodar para a esquerda","imageRotateRight":"Rodar para a direita","imageZoomIn":"Ampliar","imageZoomOut":"Reduzir","informationPanelTabs":"Painel de informações","sectionsScrollBack":"Mostrar separadores anteriores","sectionsScrollForward":"Mostrar mais separadores","informationPanelClose":"Fechar o painel de informações","informationPanelTabsAbout":"Sobre","informationPanelTabsAnnotations":"Anotações","informationPanelTabsSearch":"Pesquisa","informationPanelTabsContents":"Conteúdo","contentsSectionsIn":"Secções de","informationPanelTabsMap":"Mapa","informationPanelTabsCollection":"Coleção","informationPanelTabsTargets":"Vistas","mapUnavailable":"Não foi possível mostrar o mapa.","mapLabel":"Mapa","mapAttribution":"Créditos do mapa","mapPlaceUntitled":"Local {{number}}","mapOverlay":"Imagem georreferenciada","mapPlacesListed":"Locais listados depois do mapa: {{count}}","informationPanelToggle":"Mais informações","playerPlay":"Reproduzir","playerPause":"Pausar","playerMute":"Silenciar","playerUnmute":"Ativar o som","playerVolume":"Volume","playerSeek":"Posição de reprodução","playerCaptions":"Legendas","playerCaptionsOff":"Desativadas","playerChapters":"Capítulos","playerFill":"Preencher o enquadramento","playerFit":"Ajustar ao enquadramento","
|
|
2
|
+
const pt = JSON.parse('{"commonClose":"Fechar","commonNext":"Seguinte","commonPrevious":"Anterior","commonSearch":"Pesquisar","commonViewAll":"Ver tudo","controlShortcut":"{{label}} ({{shortcut}})","contentSearchLoading":"A carregar...","contentSearchPlaceholder":"Pesquisar","contentSearchResultsNone":"Sem resultados","contentSearchResult":"1 resultado","contentSearchResults":"{{count}} resultados","contentSearchError":"Não foi possível concluir a pesquisa.","contentSearchPosition":"Resultado {{index}} de {{total}}","contentSearchClear":"Limpar a pesquisa","canvasPosition":"Item {{index}} de {{total}}","canvasImage":"Imagem","bodyUnloadableImage":"Não foi possível carregar esta imagem.","bodyUnloadableVideo":"Não foi possível carregar este vídeo.","bodyUnloadableAudio":"Não foi possível carregar este áudio.","bodyUnloadableModel":"Não foi possível carregar este modelo.","canvasRoleDescription":"imagem ampliável","canvasKeysImage":"Use as teclas de seta para deslocar a imagem, com Shift para ir mais longe, mais e menos para ampliar e reduzir, 0 para repor a vista, e R ou Shift+R para rodar.","canvasKeysMedia":"Prima Espaço ou K para reproduzir ou pausar, J ou L para recuar ou avançar dez segundos, e M para silenciar ou ativar o som.","canvasKeysAnnotations":"Prima Esc para desmarcar a anotação.","sceneModel":"Modelo 3D","sceneRoleDescription":"modelo 3D rotativo","sceneKeys":"Use as teclas de seta para rodar o modelo, com Shift para ir mais longe, mais e menos para ampliar e reduzir, 0 para repor a vista, e R ou Shift+R para o rodar para a direita ou para a esquerda.","sceneRotateUp":"Rodar para cima","sceneRotateDown":"Rodar para baixo","sceneRotate":"Rodar","sceneResetView":"Repor a vista","statusLoading":"A carregar…","statusError":"Não foi possível carregar este conteúdo.","itemsLabel":"Itens","download":"Transferir","downloadPage":"Esta página","downloadAll":"Todas as páginas","templateSidebar":"Itens","templateSidebarToggle":"Mostrar itens","templateBack":"Voltar","templateBackTo":"Voltar a {{label}}","collectionLabel":"Coleção","itemsScrollBack":"Mostrar itens anteriores","itemsScrollForward":"Mostrar mais itens","aboutRights":"Direitos","aboutDate":"Data","aboutHomepage":"Página inicial","aboutSeeAlso":"Ver também","aboutProvider":"Fornecedor","logo":"Logótipo","aboutManifest":"Manifesto IIIF","aboutCanvas":"Tela IIIF","aboutPartOf":"Parte de","aboutOpenManifest":"Abrir o manifesto completo","aboutCollection":"Coleção IIIF","readingLanguage":"Idioma","annotationsHide":"Ocultar anotações","annotationsHideTip":"Ocultar","readMore":"Ler mais","readLess":"Ler menos","annotationsShow":"Mostrar na imagem","annotationsShowTime":"Mostrar na gravação","annotationsImage":"Imagem","annotationsLanguage":"Idioma","annotationsOpenLink":"Abrir","transcriptLabel":"Transcrição","imageViewerOpen":"Abrir o visualizador de imagens","imageViewerClose":"Fechar o visualizador de imagens","canvasChoice":"Alternativas","canvasViewerControls":"Controlos do visualizador","canvasExpandControls":"Expandir os controlos do visualizador","canvasCollapseControls":"Recolher os controlos do visualizador","canvasScrollBack":"Mostrar controlos anteriores","canvasScrollForward":"Mostrar mais controlos","imageFullScreen":"Ecrã completo","imageExitFullScreen":"Sair do ecrã completo","imageResetZoom":"Repor o zoom","imageRotateLeft":"Rodar para a esquerda","imageRotateRight":"Rodar para a direita","imageZoomIn":"Ampliar","imageZoomOut":"Reduzir","informationPanelTabs":"Painel de informações","sectionsScrollBack":"Mostrar separadores anteriores","sectionsScrollForward":"Mostrar mais separadores","informationPanelClose":"Fechar o painel de informações","informationPanelTabsAbout":"Sobre","informationPanelTabsAnnotations":"Anotações","informationPanelTabsSearch":"Pesquisa","informationPanelTabsContents":"Conteúdo","contentsSectionsIn":"Secções de","informationPanelTabsMap":"Mapa","informationPanelTabsCollection":"Coleção","informationPanelTabsTargets":"Vistas","mapUnavailable":"Não foi possível mostrar o mapa.","mapLabel":"Mapa","mapAttribution":"Créditos do mapa","mapPlaceUntitled":"Local {{number}}","mapOverlay":"Imagem georreferenciada","mapPlacesListed":"Locais listados depois do mapa: {{count}}","informationPanelToggle":"Mais informações","playerPlay":"Reproduzir","playerPause":"Pausar","playerMute":"Silenciar","playerUnmute":"Ativar o som","playerVolume":"Volume","playerSeek":"Posição de reprodução","playerCaptions":"Legendas","playerCaptionsOff":"Desativadas","playerChapters":"Capítulos","playerFill":"Preencher o enquadramento","playerFit":"Ajustar ao enquadramento","playerCurrentTime":"Tempo atual","playerDuration":"Duração","splitHandle":"Redimensionar os painéis"}');
|
|
3
3
|
export {
|
|
4
4
|
pt as default
|
|
5
5
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
const zhHans = JSON.parse('{"commonClose":"关闭","commonNext":"下一个","commonPrevious":"上一个","commonSearch":"搜索","commonViewAll":"查看全部","controlShortcut":"{{label}}({{shortcut}})","contentSearchLoading":"正在加载…","contentSearchPlaceholder":"搜索","contentSearchResultsNone":"无结果","contentSearchResult":"1 个结果","contentSearchResults":"{{count}} 个结果","contentSearchError":"无法完成搜索。","contentSearchPosition":"第 {{index}} 个结果,共 {{total}} 个","contentSearchClear":"清除搜索","canvasPosition":"第 {{index}} 项,共 {{total}} 项","canvasImage":"图像","bodyUnloadableImage":"无法加载此图像。","bodyUnloadableVideo":"无法加载此视频。","bodyUnloadableAudio":"无法加载此音频。","bodyUnloadableModel":"无法加载此模型。","canvasRoleDescription":"可缩放图像","canvasKeysImage":"使用方向键平移(按住 Shift 可大步移动),按加号和减号缩放,按 0 重置视图,按 R 或 Shift+R 旋转。","canvasKeysMedia":"按空格键或 K 播放或暂停,按 J 或 L 后退或前进十秒,按 M 静音或取消静音。","canvasKeysAnnotations":"按 Esc 键清除所选注释。","sceneModel":"3D 模型","sceneRoleDescription":"可旋转 3D 模型","sceneKeys":"使用方向键旋转模型(按住 Shift 可大步旋转),按加号和减号缩放,按 0 重置视图,按 R 或 Shift+R 向右或向左旋转。","sceneRotateUp":"向上旋转","sceneRotateDown":"向下旋转","sceneRotate":"旋转","sceneResetView":"重置视图","statusLoading":"正在加载…","statusError":"无法加载。","itemsLabel":"项目","download":"下载","downloadPage":"本页","downloadAll":"所有页面","templateSidebar":"项目","templateSidebarToggle":"显示项目","templateBack":"返回","templateBackTo":"返回{{label}}","collectionLabel":"集合","itemsScrollBack":"显示上一组项目","itemsScrollForward":"显示更多项目","aboutRights":"权利","aboutDate":"日期","aboutHomepage":"主页","aboutSeeAlso":"另见","aboutProvider":"提供者","logo":"标志","aboutManifest":"IIIF 清单","aboutCanvas":"IIIF 画布","aboutPartOf":"所属","aboutOpenManifest":"打开完整清单","aboutCollection":"IIIF 集合","readingLanguage":"语言","annotationsHide":"隐藏注释","annotationsHideTip":"隐藏","readMore":"展开","readLess":"收起","annotationsShow":"在图像上查找","annotationsShowTime":"在录音中查找","annotationsImage":"图像","annotationsLanguage":"语言","annotationsOpenLink":"打开","transcriptLabel":"文字记录","imageViewerOpen":"打开图像查看器","imageViewerClose":"关闭图像查看器","canvasChoice":"选项","canvasViewerControls":"查看器控件","canvasExpandControls":"展开查看器控件","canvasCollapseControls":"收起查看器控件","canvasScrollBack":"显示上一组控件","canvasScrollForward":"显示更多控件","imageFullScreen":"全屏","imageExitFullScreen":"退出全屏","imageResetZoom":"重置缩放","imageRotateLeft":"向左旋转","imageRotateRight":"向右旋转","imageZoomIn":"放大","imageZoomOut":"缩小","informationPanelTabs":"信息面板","sectionsScrollBack":"显示上一组标签页","sectionsScrollForward":"显示更多标签页","informationPanelClose":"关闭信息面板","informationPanelTabsAbout":"简介","informationPanelTabsAnnotations":"注释","informationPanelTabsSearch":"搜索","informationPanelTabsContents":"目录","contentsSectionsIn":"下级章节:","informationPanelTabsMap":"地图","informationPanelTabsCollection":"集合","informationPanelTabsTargets":"视图","mapUnavailable":"无法显示地图。","mapLabel":"地图","mapAttribution":"地图来源","mapPlaceUntitled":"地点 {{number}}","mapOverlay":"地理配准图像","mapPlacesListed":"地图后列出的地点:{{count}} 个","informationPanelToggle":"更多信息","playerPlay":"播放","playerPause":"暂停","playerMute":"静音","playerUnmute":"取消静音","playerVolume":"音量","playerSeek":"播放进度","playerCaptions":"字幕","playerCaptionsOff":"关闭","playerChapters":"章节","playerFill":"填满画面","playerFit":"适应画面","
|
|
2
|
+
const zhHans = JSON.parse('{"commonClose":"关闭","commonNext":"下一个","commonPrevious":"上一个","commonSearch":"搜索","commonViewAll":"查看全部","controlShortcut":"{{label}}({{shortcut}})","contentSearchLoading":"正在加载…","contentSearchPlaceholder":"搜索","contentSearchResultsNone":"无结果","contentSearchResult":"1 个结果","contentSearchResults":"{{count}} 个结果","contentSearchError":"无法完成搜索。","contentSearchPosition":"第 {{index}} 个结果,共 {{total}} 个","contentSearchClear":"清除搜索","canvasPosition":"第 {{index}} 项,共 {{total}} 项","canvasImage":"图像","bodyUnloadableImage":"无法加载此图像。","bodyUnloadableVideo":"无法加载此视频。","bodyUnloadableAudio":"无法加载此音频。","bodyUnloadableModel":"无法加载此模型。","canvasRoleDescription":"可缩放图像","canvasKeysImage":"使用方向键平移(按住 Shift 可大步移动),按加号和减号缩放,按 0 重置视图,按 R 或 Shift+R 旋转。","canvasKeysMedia":"按空格键或 K 播放或暂停,按 J 或 L 后退或前进十秒,按 M 静音或取消静音。","canvasKeysAnnotations":"按 Esc 键清除所选注释。","sceneModel":"3D 模型","sceneRoleDescription":"可旋转 3D 模型","sceneKeys":"使用方向键旋转模型(按住 Shift 可大步旋转),按加号和减号缩放,按 0 重置视图,按 R 或 Shift+R 向右或向左旋转。","sceneRotateUp":"向上旋转","sceneRotateDown":"向下旋转","sceneRotate":"旋转","sceneResetView":"重置视图","statusLoading":"正在加载…","statusError":"无法加载。","itemsLabel":"项目","download":"下载","downloadPage":"本页","downloadAll":"所有页面","templateSidebar":"项目","templateSidebarToggle":"显示项目","templateBack":"返回","templateBackTo":"返回{{label}}","collectionLabel":"集合","itemsScrollBack":"显示上一组项目","itemsScrollForward":"显示更多项目","aboutRights":"权利","aboutDate":"日期","aboutHomepage":"主页","aboutSeeAlso":"另见","aboutProvider":"提供者","logo":"标志","aboutManifest":"IIIF 清单","aboutCanvas":"IIIF 画布","aboutPartOf":"所属","aboutOpenManifest":"打开完整清单","aboutCollection":"IIIF 集合","readingLanguage":"语言","annotationsHide":"隐藏注释","annotationsHideTip":"隐藏","readMore":"展开","readLess":"收起","annotationsShow":"在图像上查找","annotationsShowTime":"在录音中查找","annotationsImage":"图像","annotationsLanguage":"语言","annotationsOpenLink":"打开","transcriptLabel":"文字记录","imageViewerOpen":"打开图像查看器","imageViewerClose":"关闭图像查看器","canvasChoice":"选项","canvasViewerControls":"查看器控件","canvasExpandControls":"展开查看器控件","canvasCollapseControls":"收起查看器控件","canvasScrollBack":"显示上一组控件","canvasScrollForward":"显示更多控件","imageFullScreen":"全屏","imageExitFullScreen":"退出全屏","imageResetZoom":"重置缩放","imageRotateLeft":"向左旋转","imageRotateRight":"向右旋转","imageZoomIn":"放大","imageZoomOut":"缩小","informationPanelTabs":"信息面板","sectionsScrollBack":"显示上一组标签页","sectionsScrollForward":"显示更多标签页","informationPanelClose":"关闭信息面板","informationPanelTabsAbout":"简介","informationPanelTabsAnnotations":"注释","informationPanelTabsSearch":"搜索","informationPanelTabsContents":"目录","contentsSectionsIn":"下级章节:","informationPanelTabsMap":"地图","informationPanelTabsCollection":"集合","informationPanelTabsTargets":"视图","mapUnavailable":"无法显示地图。","mapLabel":"地图","mapAttribution":"地图来源","mapPlaceUntitled":"地点 {{number}}","mapOverlay":"地理配准图像","mapPlacesListed":"地图后列出的地点:{{count}} 个","informationPanelToggle":"更多信息","playerPlay":"播放","playerPause":"暂停","playerMute":"静音","playerUnmute":"取消静音","playerVolume":"音量","playerSeek":"播放进度","playerCaptions":"字幕","playerCaptionsOff":"关闭","playerChapters":"章节","playerFill":"填满画面","playerFit":"适应画面","playerCurrentTime":"当前时间","playerDuration":"时长","splitHandle":"调整面板大小"}');
|
|
3
3
|
export {
|
|
4
4
|
zhHans as default
|
|
5
5
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
const zhHant = JSON.parse('{"commonClose":"關閉","commonNext":"下一個","commonPrevious":"上一個","commonSearch":"搜尋","commonViewAll":"檢視全部","controlShortcut":"{{label}}({{shortcut}})","contentSearchLoading":"載入中…","contentSearchPlaceholder":"搜尋","contentSearchResultsNone":"沒有結果","contentSearchResult":"1 筆結果","contentSearchResults":"{{count}} 筆結果","contentSearchError":"無法完成搜尋。","contentSearchPosition":"第 {{index}} 筆結果,共 {{total}} 筆","contentSearchClear":"清除搜尋","canvasPosition":"第 {{index}} 項,共 {{total}} 項","canvasImage":"影像","bodyUnloadableImage":"無法載入此影像。","bodyUnloadableVideo":"無法載入此影片。","bodyUnloadableAudio":"無法載入此音訊。","bodyUnloadableModel":"無法載入此模型。","canvasRoleDescription":"可縮放影像","canvasKeysImage":"使用方向鍵平移(按住 Shift 可大幅移動),按加號和減號縮放,按 0 重設檢視,按 R 或 Shift+R 旋轉。","canvasKeysMedia":"按空白鍵或 K 播放或暫停,按 J 或 L 倒轉或快轉十秒,按 M 靜音或取消靜音。","canvasKeysAnnotations":"按 Esc 鍵清除所選註解。","sceneModel":"3D 模型","sceneRoleDescription":"可旋轉 3D 模型","sceneKeys":"使用方向鍵旋轉模型(按住 Shift 可大幅旋轉),按加號和減號縮放,按 0 重設檢視,按 R 或 Shift+R 向右或向左旋轉。","sceneRotateUp":"向上旋轉","sceneRotateDown":"向下旋轉","sceneRotate":"旋轉","sceneResetView":"重設檢視","statusLoading":"載入中…","statusError":"無法載入。","itemsLabel":"項目","download":"下載","downloadPage":"本頁","downloadAll":"所有頁面","templateSidebar":"項目","templateSidebarToggle":"顯示項目","templateBack":"返回","templateBackTo":"返回{{label}}","collectionLabel":"集合","itemsScrollBack":"顯示上一組項目","itemsScrollForward":"顯示更多項目","aboutRights":"權利","aboutDate":"日期","aboutHomepage":"首頁","aboutSeeAlso":"另見","aboutProvider":"提供者","logo":"標誌","aboutManifest":"IIIF 清單","aboutCanvas":"IIIF 畫布","aboutPartOf":"所屬","aboutOpenManifest":"開啟完整清單","aboutCollection":"IIIF 集合","readingLanguage":"語言","annotationsHide":"隱藏註解","annotationsHideTip":"隱藏","readMore":"展開","readLess":"收合","annotationsShow":"在影像上尋找","annotationsShowTime":"在錄音中尋找","annotationsImage":"影像","annotationsLanguage":"語言","annotationsOpenLink":"開啟","transcriptLabel":"逐字稿","imageViewerOpen":"開啟影像檢視器","imageViewerClose":"關閉影像檢視器","canvasChoice":"選項","canvasViewerControls":"檢視器控制項","canvasExpandControls":"展開檢視器控制項","canvasCollapseControls":"收合檢視器控制項","canvasScrollBack":"顯示上一組控制項","canvasScrollForward":"顯示更多控制項","imageFullScreen":"全螢幕","imageExitFullScreen":"結束全螢幕","imageResetZoom":"重設縮放","imageRotateLeft":"向左旋轉","imageRotateRight":"向右旋轉","imageZoomIn":"放大","imageZoomOut":"縮小","informationPanelTabs":"資訊面板","sectionsScrollBack":"顯示上一組分頁","sectionsScrollForward":"顯示更多分頁","informationPanelClose":"關閉資訊面板","informationPanelTabsAbout":"簡介","informationPanelTabsAnnotations":"註解","informationPanelTabsSearch":"搜尋","informationPanelTabsContents":"目錄","contentsSectionsIn":"下層章節:","informationPanelTabsMap":"地圖","informationPanelTabsCollection":"集合","informationPanelTabsTargets":"檢視","mapUnavailable":"無法顯示地圖。","mapLabel":"地圖","mapAttribution":"地圖來源","mapPlaceUntitled":"地點 {{number}}","mapOverlay":"地理對位影像","mapPlacesListed":"地圖後列出的地點:{{count}} 個","informationPanelToggle":"更多資訊","playerPlay":"播放","playerPause":"暫停","playerMute":"靜音","playerUnmute":"取消靜音","playerVolume":"音量","playerSeek":"播放進度","playerCaptions":"字幕","playerCaptionsOff":"關閉","playerChapters":"章節","playerFill":"填滿畫面","playerFit":"符合畫面","
|
|
2
|
+
const zhHant = JSON.parse('{"commonClose":"關閉","commonNext":"下一個","commonPrevious":"上一個","commonSearch":"搜尋","commonViewAll":"檢視全部","controlShortcut":"{{label}}({{shortcut}})","contentSearchLoading":"載入中…","contentSearchPlaceholder":"搜尋","contentSearchResultsNone":"沒有結果","contentSearchResult":"1 筆結果","contentSearchResults":"{{count}} 筆結果","contentSearchError":"無法完成搜尋。","contentSearchPosition":"第 {{index}} 筆結果,共 {{total}} 筆","contentSearchClear":"清除搜尋","canvasPosition":"第 {{index}} 項,共 {{total}} 項","canvasImage":"影像","bodyUnloadableImage":"無法載入此影像。","bodyUnloadableVideo":"無法載入此影片。","bodyUnloadableAudio":"無法載入此音訊。","bodyUnloadableModel":"無法載入此模型。","canvasRoleDescription":"可縮放影像","canvasKeysImage":"使用方向鍵平移(按住 Shift 可大幅移動),按加號和減號縮放,按 0 重設檢視,按 R 或 Shift+R 旋轉。","canvasKeysMedia":"按空白鍵或 K 播放或暫停,按 J 或 L 倒轉或快轉十秒,按 M 靜音或取消靜音。","canvasKeysAnnotations":"按 Esc 鍵清除所選註解。","sceneModel":"3D 模型","sceneRoleDescription":"可旋轉 3D 模型","sceneKeys":"使用方向鍵旋轉模型(按住 Shift 可大幅旋轉),按加號和減號縮放,按 0 重設檢視,按 R 或 Shift+R 向右或向左旋轉。","sceneRotateUp":"向上旋轉","sceneRotateDown":"向下旋轉","sceneRotate":"旋轉","sceneResetView":"重設檢視","statusLoading":"載入中…","statusError":"無法載入。","itemsLabel":"項目","download":"下載","downloadPage":"本頁","downloadAll":"所有頁面","templateSidebar":"項目","templateSidebarToggle":"顯示項目","templateBack":"返回","templateBackTo":"返回{{label}}","collectionLabel":"集合","itemsScrollBack":"顯示上一組項目","itemsScrollForward":"顯示更多項目","aboutRights":"權利","aboutDate":"日期","aboutHomepage":"首頁","aboutSeeAlso":"另見","aboutProvider":"提供者","logo":"標誌","aboutManifest":"IIIF 清單","aboutCanvas":"IIIF 畫布","aboutPartOf":"所屬","aboutOpenManifest":"開啟完整清單","aboutCollection":"IIIF 集合","readingLanguage":"語言","annotationsHide":"隱藏註解","annotationsHideTip":"隱藏","readMore":"展開","readLess":"收合","annotationsShow":"在影像上尋找","annotationsShowTime":"在錄音中尋找","annotationsImage":"影像","annotationsLanguage":"語言","annotationsOpenLink":"開啟","transcriptLabel":"逐字稿","imageViewerOpen":"開啟影像檢視器","imageViewerClose":"關閉影像檢視器","canvasChoice":"選項","canvasViewerControls":"檢視器控制項","canvasExpandControls":"展開檢視器控制項","canvasCollapseControls":"收合檢視器控制項","canvasScrollBack":"顯示上一組控制項","canvasScrollForward":"顯示更多控制項","imageFullScreen":"全螢幕","imageExitFullScreen":"結束全螢幕","imageResetZoom":"重設縮放","imageRotateLeft":"向左旋轉","imageRotateRight":"向右旋轉","imageZoomIn":"放大","imageZoomOut":"縮小","informationPanelTabs":"資訊面板","sectionsScrollBack":"顯示上一組分頁","sectionsScrollForward":"顯示更多分頁","informationPanelClose":"關閉資訊面板","informationPanelTabsAbout":"簡介","informationPanelTabsAnnotations":"註解","informationPanelTabsSearch":"搜尋","informationPanelTabsContents":"目錄","contentsSectionsIn":"下層章節:","informationPanelTabsMap":"地圖","informationPanelTabsCollection":"集合","informationPanelTabsTargets":"檢視","mapUnavailable":"無法顯示地圖。","mapLabel":"地圖","mapAttribution":"地圖來源","mapPlaceUntitled":"地點 {{number}}","mapOverlay":"地理對位影像","mapPlacesListed":"地圖後列出的地點:{{count}} 個","informationPanelToggle":"更多資訊","playerPlay":"播放","playerPause":"暫停","playerMute":"靜音","playerUnmute":"取消靜音","playerVolume":"音量","playerSeek":"播放進度","playerCaptions":"字幕","playerCaptionsOff":"關閉","playerChapters":"章節","playerFill":"填滿畫面","playerFit":"符合畫面","playerCurrentTime":"目前時間","playerDuration":"長度","splitHandle":"調整面板大小"}');
|
|
3
3
|
export {
|
|
4
4
|
zhHant as default
|
|
5
5
|
};
|
package/dist/index.d.mts
CHANGED
|
@@ -391,8 +391,19 @@ export type CloverStatus = "idle" | "loading" | "ready" | "error";
|
|
|
391
391
|
export interface CloverState {
|
|
392
392
|
status: CloverStatus;
|
|
393
393
|
error: Error | null;
|
|
394
|
-
/**
|
|
394
|
+
/**
|
|
395
|
+
* The Manifest shown, in Presentation 4. Null from the moment another is asked for
|
|
396
|
+
* (`load`, a Collection's member, a content state's target) until it arrives: nothing
|
|
397
|
+
* of the last one shows while the next loads (Mat, 2026-11-06).
|
|
398
|
+
*/
|
|
395
399
|
manifest: Manifest | null;
|
|
400
|
+
/**
|
|
401
|
+
* What was asked for while it loads, by the id it was asked by: a Collection's member,
|
|
402
|
+
* a target's Manifest. What marks the current member (`selectShownId`) reads it until
|
|
403
|
+
* the Manifest arrives, so the choice holds, and a step from it steps from there; and
|
|
404
|
+
* after it fails, so the member the error is for is the one to try again.
|
|
405
|
+
*/
|
|
406
|
+
opening: string | null;
|
|
396
407
|
/** The Collection it was reached through, if any. */
|
|
397
408
|
collection: Presentation4Collection | null;
|
|
398
409
|
/**
|
|
@@ -2144,7 +2155,8 @@ export interface Georeference {
|
|
|
2144
2155
|
* 0139 has). A feature from a member names that member, the open one's place its own
|
|
2145
2156
|
* Manifest's where it gives one, in the member's place in the Collection's order; one
|
|
2146
2157
|
* from a Canvas or annotation names that Canvas. Memoized on the Manifest (and the
|
|
2147
|
-
* Collection), so the same collection comes back while nothing changes.
|
|
2158
|
+
* Collection), so the same collection comes back while nothing changes. While a member
|
|
2159
|
+
* loads, its Manifest put away, the Collection's places stay, each its member's own.
|
|
2148
2160
|
*/
|
|
2149
2161
|
export declare function navPlaceOf(manifest: Manifest | null, collection?: Presentation4Collection | null, language?: string): MapFeatureCollection;
|
|
2150
2162
|
/**
|
package/dist/lib/gltf/load.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { requestKey, cloverFetch } from "../../core/request.mjs";
|
|
2
|
+
import { requestKey, cloverFetch, discardBody } from "../../core/request.mjs";
|
|
3
3
|
const EXTENSIONS = [
|
|
4
4
|
"KHR_materials_unlit",
|
|
5
5
|
"KHR_materials_ior",
|
|
@@ -33,7 +33,10 @@ function parseGlb(data) {
|
|
|
33
33
|
async function fetchBytes(uri, base, request) {
|
|
34
34
|
const url = new URL(uri, base).href;
|
|
35
35
|
const response = url.startsWith("data:") ? await fetch(url) : await cloverFetch(request, url);
|
|
36
|
-
if (!response.ok)
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
discardBody(response);
|
|
38
|
+
throw new Error(`${url} answered ${response.status}`);
|
|
39
|
+
}
|
|
37
40
|
return response.arrayBuffer();
|
|
38
41
|
}
|
|
39
42
|
const loading = /* @__PURE__ */ new WeakMap();
|
|
@@ -13,8 +13,8 @@ import { FrameLoop } from "./loop/FrameLoop.mjs";
|
|
|
13
13
|
import { uploadBudget } from "./scene/uploadBudget.mjs";
|
|
14
14
|
import { apply, compose, rotate, scale } from "./math/affine.mjs";
|
|
15
15
|
import { union, rectCenter, clamp, transformRect } from "./math/rect.mjs";
|
|
16
|
-
import { planFrame } from "./scene/planFrame.mjs";
|
|
17
|
-
import { sameSpec,
|
|
16
|
+
import { TARGET_BAND, planFrame } from "./scene/planFrame.mjs";
|
|
17
|
+
import { sameSpec, layoutItems, resolveItem, pixelsToWorld, itemToWorld, MEDIA_KEY_PREFIX, prefetchCoarse } from "./scene/sceneItem.mjs";
|
|
18
18
|
const DEFAULTS = {
|
|
19
19
|
maxZoomPixelRatio: 1.1,
|
|
20
20
|
minZoomImageRatio: 0.9,
|
|
@@ -25,13 +25,15 @@ const DEFAULTS = {
|
|
|
25
25
|
constrainDuringPan: true,
|
|
26
26
|
request: void 0,
|
|
27
27
|
byteBudget: 192 * 1024 * 1024,
|
|
28
|
-
maxInFlight:
|
|
28
|
+
maxInFlight: 16,
|
|
29
29
|
releaseAfterMs: 2e3
|
|
30
30
|
};
|
|
31
31
|
const MAX_PIXEL_RATIO = 2;
|
|
32
32
|
const MAX_CONTEXT_LOSSES = 3;
|
|
33
33
|
const ANNOTATION_PADDING = 0.1;
|
|
34
34
|
const ZOOM_EPSILON = 1e-6;
|
|
35
|
+
const LANDING_AHEAD = 1e8;
|
|
36
|
+
const PREPARE_AT_ONCE = 6;
|
|
35
37
|
const NO_INSET = { top: 0, right: 0, bottom: 0, left: 0 };
|
|
36
38
|
function readInset(element, box = "padding") {
|
|
37
39
|
if (!element || typeof getComputedStyle !== "function") return NO_INSET;
|
|
@@ -103,6 +105,13 @@ class CanvasRenderer {
|
|
|
103
105
|
__publicField(this, "interacting", false);
|
|
104
106
|
__publicField(this, "lastEmitted", null);
|
|
105
107
|
__publicField(this, "generation", 0);
|
|
108
|
+
/**
|
|
109
|
+
* The tiles a scene still preparing will want where it lands, asked for with every
|
|
110
|
+
* frame's, ahead of them, until it replaces the scene on screen (`setImages`).
|
|
111
|
+
*/
|
|
112
|
+
__publicField(this, "landing", []);
|
|
113
|
+
/** A scene to read ahead (`prefetch`), once every tile the scene on screen wants is in. */
|
|
114
|
+
__publicField(this, "ahead", null);
|
|
106
115
|
__publicField(this, "listeners", /* @__PURE__ */ new Map());
|
|
107
116
|
__publicField(this, "unloadable", false);
|
|
108
117
|
__publicField(this, "resizeObserver", null);
|
|
@@ -128,14 +137,18 @@ class CanvasRenderer {
|
|
|
128
137
|
viewport: this.viewport,
|
|
129
138
|
pixelRatio: this.pixelRatio,
|
|
130
139
|
getTile: uploads.getTile,
|
|
140
|
+
has: this.hasTile,
|
|
131
141
|
wantOverview: Boolean(this.navigator),
|
|
132
142
|
// Fetch for where the camera lands, not for each view on the way.
|
|
133
143
|
destination: animating ? this.camera.destination : void 0
|
|
134
144
|
});
|
|
135
|
-
const wants = plan.wants.filter(
|
|
136
|
-
(want) => !want.url.startsWith(MEDIA_KEY_PREFIX)
|
|
137
|
-
);
|
|
145
|
+
const wants = (this.landing.length ? [...this.landing, ...plan.wants] : plan.wants).filter((want) => !want.url.startsWith(MEDIA_KEY_PREFIX));
|
|
138
146
|
this.cache.update(wants);
|
|
147
|
+
if (this.ahead && !animating && !this.cache.pending) {
|
|
148
|
+
const ahead = this.ahead;
|
|
149
|
+
this.ahead = null;
|
|
150
|
+
void this.readAhead(ahead);
|
|
151
|
+
}
|
|
139
152
|
if (plan.draws.length) this.setUnloadable(false);
|
|
140
153
|
else if (wants.length && wants.every((want) => this.cache.failed(want.url)))
|
|
141
154
|
this.setUnloadable(true);
|
|
@@ -156,6 +169,8 @@ class CanvasRenderer {
|
|
|
156
169
|
return animating || uploads.deferred;
|
|
157
170
|
});
|
|
158
171
|
__publicField(this, "getTile", (url) => this.mediaByKey.get(url) ?? this.cache.get(url));
|
|
172
|
+
/** Decoded and in memory, drawn this frame or held back by the upload budget. */
|
|
173
|
+
__publicField(this, "hasTile", (url) => this.mediaByKey.has(url) || this.cache.has(url));
|
|
159
174
|
/*
|
|
160
175
|
* The browser took the context (too many on the page, a GPU reset). Its canvas goes at
|
|
161
176
|
* once, so the browser's picture of a lost context never shows, only the host's
|
|
@@ -244,65 +259,163 @@ class CanvasRenderer {
|
|
|
244
259
|
* replace the old ones, so a swap never flashes empty. Items whose description is
|
|
245
260
|
* unchanged are kept as they are, and tiles are cached by URL, so swapping between two
|
|
246
261
|
* regions of one image costs nothing at all.
|
|
262
|
+
*
|
|
263
|
+
* The finer tiles do not wait for the coarsest: once every item's size is known, the
|
|
264
|
+
* tiles for the view the new scene will open on are asked for beside them, ahead of the
|
|
265
|
+
* scene being left (`landing`). A page turn then sharpens a round trip sooner.
|
|
266
|
+
*
|
|
267
|
+
* Images are prepared in the scene's order, `PREPARE_AT_ONCE` at a time. On an empty
|
|
268
|
+
* Body, a scene of several placed images (a continuous Manifest's pages) goes up an image
|
|
269
|
+
* at a time, each as soon as its own coarsest tiles are in, where it will stay, framed
|
|
270
|
+
* for all of them from the first; with a scene on screen, the new one replaces it whole.
|
|
247
271
|
*/
|
|
248
272
|
async setImages(images, {
|
|
249
273
|
world,
|
|
250
274
|
fit = false
|
|
251
275
|
} = {}) {
|
|
252
276
|
const generation = ++this.generation;
|
|
277
|
+
const stale = () => generation !== this.generation || this.disposed;
|
|
253
278
|
const previous = new Map(this.items.map((item) => [item.id, item]));
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
279
|
+
this.landing = [];
|
|
280
|
+
this.ahead = null;
|
|
281
|
+
const context = this.prepareContext();
|
|
282
|
+
const queue = [];
|
|
283
|
+
const prepared = images.map((spec) => {
|
|
284
|
+
const kept = previous.get(spec.id);
|
|
285
|
+
if (kept && sameSpec(kept.spec, spec)) {
|
|
286
|
+
kept.spec = spec;
|
|
287
|
+
return { item: Promise.resolve(kept), ready: Promise.resolve() };
|
|
288
|
+
}
|
|
289
|
+
let found;
|
|
290
|
+
let lost;
|
|
291
|
+
let done;
|
|
292
|
+
const item = new Promise((resolve, reject) => {
|
|
293
|
+
found = resolve;
|
|
294
|
+
lost = reject;
|
|
295
|
+
});
|
|
296
|
+
const ready = new Promise((resolve) => done = resolve);
|
|
297
|
+
queue.push(
|
|
298
|
+
() => resolveItem(spec, context).then((resolved) => {
|
|
299
|
+
found(resolved);
|
|
300
|
+
return prefetchCoarse(resolved, this.cache);
|
|
301
|
+
}, lost).then(done, done)
|
|
302
|
+
);
|
|
303
|
+
return { item, ready };
|
|
304
|
+
});
|
|
305
|
+
const work = () => {
|
|
306
|
+
var _a;
|
|
307
|
+
return (_a = queue.shift()) == null ? void 0 : _a().then(work);
|
|
308
|
+
};
|
|
309
|
+
for (let slot = 0; slot < PREPARE_AT_ONCE; slot++) void work();
|
|
310
|
+
const placements = images.flatMap(
|
|
311
|
+
(spec) => spec.placement ? [spec.placement] : []
|
|
312
|
+
);
|
|
313
|
+
let framed = false;
|
|
314
|
+
if (!this.items.length && images.length > 1 && placements.length === images.length) {
|
|
315
|
+
const bounds = union(world ? [world, ...placements] : placements);
|
|
316
|
+
const up = [];
|
|
317
|
+
prepared.forEach(({ item, ready }, index) => {
|
|
318
|
+
void Promise.all([item, ready]).then(
|
|
319
|
+
([resolved]) => {
|
|
320
|
+
if (stale()) return;
|
|
321
|
+
up[index] = resolved;
|
|
322
|
+
this.place(up.filter(Boolean), bounds, fit, !framed, false);
|
|
323
|
+
framed = true;
|
|
324
|
+
},
|
|
325
|
+
() => void 0
|
|
326
|
+
);
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
const results = await Promise.allSettled(prepared.map(({ item }) => item));
|
|
330
|
+
if (stale()) return;
|
|
331
|
+
this.landing = this.landingWants(
|
|
332
|
+
results.flatMap((r) => r.status === "fulfilled" ? [r.value] : []),
|
|
333
|
+
world,
|
|
334
|
+
fit || !this.opened
|
|
267
335
|
);
|
|
268
|
-
|
|
336
|
+
this.invalidate();
|
|
337
|
+
await Promise.all(prepared.map(({ ready }) => ready));
|
|
338
|
+
if (stale()) return;
|
|
339
|
+
this.landing = [];
|
|
269
340
|
const items = results.filter(
|
|
270
341
|
(r) => r.status === "fulfilled"
|
|
271
342
|
).map((r) => r.value);
|
|
272
343
|
const errors = results.filter((r) => r.status === "rejected").map((r) => r.reason);
|
|
344
|
+
if (errors.length) this.emit("error", errors);
|
|
345
|
+
this.setUnloadable(images.length > 0 && !items.length && errors.length > 0);
|
|
346
|
+
this.place(items, world, fit, !framed, true);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Put `items` on screen, the world their layout and `world`: opened, the first time;
|
|
350
|
+
* where `frame`, framed again (home where `fit`, else the reader's view, its limits
|
|
351
|
+
* applied again) and announced; else announced only where `announce`.
|
|
352
|
+
*/
|
|
353
|
+
place(items, world, fit, frame, announce) {
|
|
273
354
|
this.items = items;
|
|
274
355
|
this.watchMedia(items);
|
|
275
356
|
const laidOut = layoutItems(items);
|
|
276
357
|
this.worldBounds = world ? laidOut ? union([world, laidOut]) : world : laidOut;
|
|
277
358
|
this.contentVersion++;
|
|
278
|
-
if (
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
this.emit("
|
|
288
|
-
} else if (fit) {
|
|
289
|
-
this.home(true);
|
|
290
|
-
this.emit("change");
|
|
291
|
-
} else {
|
|
292
|
-
this.camera.set(this.constrain(this.camera.current));
|
|
293
|
-
this.emit("change");
|
|
359
|
+
if (this.worldBounds) {
|
|
360
|
+
if (!this.opened) {
|
|
361
|
+
this.opened = true;
|
|
362
|
+
this.home(true);
|
|
363
|
+
this.emit("open");
|
|
364
|
+
} else if (frame) {
|
|
365
|
+
if (fit) this.home(true);
|
|
366
|
+
else this.camera.set(this.constrain(this.camera.current));
|
|
367
|
+
this.emit("change");
|
|
368
|
+
} else if (announce) this.emit("change");
|
|
294
369
|
}
|
|
295
370
|
this.invalidate();
|
|
296
371
|
}
|
|
372
|
+
/**
|
|
373
|
+
* Read a scene ahead of time: what is shown next, the view after this one. Once every
|
|
374
|
+
* tile the scene on screen wants is in, each image's `info.json` is read, then the
|
|
375
|
+
* coarsest and middle levels its framed view would want are loaded and kept, as loads
|
|
376
|
+
* no frame cancels, so the turn to it draws at once and sharpens a round trip sooner;
|
|
377
|
+
* its sharp tiles wait until it is shown. A later call, `setImages` or `clear` drops it.
|
|
378
|
+
*/
|
|
379
|
+
prefetch(images, { world } = {}) {
|
|
380
|
+
const pictures = images.filter((spec) => !spec.media);
|
|
381
|
+
this.ahead = pictures.length ? { images: pictures, world } : null;
|
|
382
|
+
if (this.ahead) this.invalidate();
|
|
383
|
+
}
|
|
384
|
+
async readAhead({
|
|
385
|
+
images,
|
|
386
|
+
world
|
|
387
|
+
}) {
|
|
388
|
+
const generation = this.generation;
|
|
389
|
+
const context = this.prepareContext();
|
|
390
|
+
const items = (await Promise.allSettled(images.map((spec) => resolveItem(spec, context)))).flatMap(
|
|
391
|
+
(result) => result.status === "fulfilled" ? [result.value] : []
|
|
392
|
+
);
|
|
393
|
+
if (!items.length || generation !== this.generation || this.disposed)
|
|
394
|
+
return;
|
|
395
|
+
const wants = this.landingWants(items, world, true).filter(
|
|
396
|
+
(want) => want.priority < TARGET_BAND - LANDING_AHEAD
|
|
397
|
+
);
|
|
398
|
+
await this.cache.prefetch(wants);
|
|
399
|
+
}
|
|
400
|
+
prepareContext() {
|
|
401
|
+
return {
|
|
402
|
+
cache: this.cache,
|
|
403
|
+
loadStatic: (url) => this.loadTile(url),
|
|
404
|
+
infoOptions: { request: this.options.request }
|
|
405
|
+
};
|
|
406
|
+
}
|
|
297
407
|
/**
|
|
298
408
|
* Put the scene away at once: from the next frame nothing of it is drawn, and a swap
|
|
299
|
-
* still preparing is dropped. For moving to
|
|
300
|
-
* never show
|
|
301
|
-
* scene, framed afresh
|
|
409
|
+
* still preparing is dropped. For moving to another Canvas or another resource, whose
|
|
410
|
+
* pictures should never show the last one's while they load (Mat, 2026-11-06);
|
|
411
|
+
* `setImages` then draws the new scene, framed afresh, each image as it can be drawn.
|
|
412
|
+
* A swap within one Canvas (a Choice picked) keeps the old scene up instead.
|
|
302
413
|
*/
|
|
303
414
|
clear() {
|
|
304
415
|
this.setUnloadable(false);
|
|
305
416
|
this.generation++;
|
|
417
|
+
this.landing = [];
|
|
418
|
+
this.ahead = null;
|
|
306
419
|
this.items = [];
|
|
307
420
|
this.watchMedia([]);
|
|
308
421
|
this.worldBounds = null;
|
|
@@ -428,8 +541,8 @@ class CanvasRenderer {
|
|
|
428
541
|
* those. Measured against the sharpest image in the scene, so an inset photograph
|
|
429
542
|
* denser than the page it sits on can still be zoomed to its own full resolution.
|
|
430
543
|
*/
|
|
431
|
-
closestZoom() {
|
|
432
|
-
const worldPerPixel =
|
|
544
|
+
closestZoom(items = this.items) {
|
|
545
|
+
const worldPerPixel = items.length ? Math.min(...items.map((item) => pixelsToWorld(item).x)) : 1;
|
|
433
546
|
return this.options.maxZoomPixelRatio / worldPerPixel;
|
|
434
547
|
}
|
|
435
548
|
home(immediate = false) {
|
|
@@ -643,6 +756,31 @@ class CanvasRenderer {
|
|
|
643
756
|
this.listeners.clear();
|
|
644
757
|
delete this.host.dataset.backend;
|
|
645
758
|
}
|
|
759
|
+
/**
|
|
760
|
+
* What a scene still preparing will want once shown, for the view it opens on: framed
|
|
761
|
+
* as home where it will be (`fit`), else where the camera is heading. Its items are
|
|
762
|
+
* laid out as copies, since kept ones are still on screen where they are. Each want
|
|
763
|
+
* goes ahead of the scene on screen, which is being left.
|
|
764
|
+
*/
|
|
765
|
+
landingWants(items, world, fit) {
|
|
766
|
+
const placed = items.map((item) => ({ ...item, rect: { ...item.rect } }));
|
|
767
|
+
const laidOut = layoutItems(placed);
|
|
768
|
+
const bounds = world ? laidOut ? union([world, laidOut]) : world : laidOut;
|
|
769
|
+
if (!bounds) return [];
|
|
770
|
+
const camera = fit ? this.homeCamera(bounds, placed) : this.camera.destination;
|
|
771
|
+
if (!camera) return [];
|
|
772
|
+
const { wants } = planFrame({
|
|
773
|
+
items: placed,
|
|
774
|
+
camera,
|
|
775
|
+
viewport: this.viewport,
|
|
776
|
+
pixelRatio: this.pixelRatio,
|
|
777
|
+
getTile: (url) => this.cache.get(url)
|
|
778
|
+
});
|
|
779
|
+
return wants.map((want) => ({
|
|
780
|
+
...want,
|
|
781
|
+
priority: want.priority - LANDING_AHEAD
|
|
782
|
+
}));
|
|
783
|
+
}
|
|
646
784
|
/**
|
|
647
785
|
* Track the scene's media elements: redraw when one has a new frame to show (it
|
|
648
786
|
* started, seeked, or loaded), and drop the listeners when the scene changes.
|
|
@@ -729,15 +867,15 @@ class CanvasRenderer {
|
|
|
729
867
|
* is the whole turn nearest where the camera is heading, so four quarter turns right then
|
|
730
868
|
* home does not spin a full turn back, and three come upright by one more quarter.
|
|
731
869
|
*/
|
|
732
|
-
homeCamera() {
|
|
733
|
-
if (!
|
|
870
|
+
homeCamera(bounds = this.worldBounds, items = this.items) {
|
|
871
|
+
if (!bounds) return null;
|
|
734
872
|
const turn = 2 * Math.PI;
|
|
735
873
|
const upright = Math.round(this.camera.destination.rotation / turn) * turn || 0;
|
|
736
874
|
return this.fit(
|
|
737
|
-
|
|
875
|
+
bounds,
|
|
738
876
|
upright,
|
|
739
877
|
this.inset,
|
|
740
|
-
this.options.upscale ? Infinity : this.closestZoom()
|
|
878
|
+
this.options.upscale ? Infinity : this.closestZoom(items)
|
|
741
879
|
);
|
|
742
880
|
}
|
|
743
881
|
/**
|
|
@@ -11,6 +11,7 @@ void main() {
|
|
|
11
11
|
v_uv = u_crop.xy + a_position * u_crop.zw;
|
|
12
12
|
}
|
|
13
13
|
`;
|
|
14
|
+
const LOD_BIAS = -0.5;
|
|
14
15
|
const FRAGMENT_SHADER = `#version 300 es
|
|
15
16
|
precision highp float;
|
|
16
17
|
in vec2 v_uv;
|
|
@@ -19,7 +20,7 @@ uniform float u_opacity;
|
|
|
19
20
|
out vec4 outColor;
|
|
20
21
|
|
|
21
22
|
void main() {
|
|
22
|
-
outColor = texture(u_texture, v_uv) * u_opacity;
|
|
23
|
+
outColor = texture(u_texture, v_uv, ${LOD_BIAS.toFixed(1)}) * u_opacity;
|
|
23
24
|
}
|
|
24
25
|
`;
|
|
25
26
|
export {
|
|
@@ -4,7 +4,7 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
|
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
5
|
import { releaseImage } from "./decode.mjs";
|
|
6
6
|
const DEFAULT_BUDGET = 192 * 1024 * 1024;
|
|
7
|
-
const DEFAULT_IN_FLIGHT =
|
|
7
|
+
const DEFAULT_IN_FLIGHT = 16;
|
|
8
8
|
const MAX_ATTEMPTS = 2;
|
|
9
9
|
class TileCache {
|
|
10
10
|
constructor(options) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { sendsCredentials, cloverFetch } from "../../../core/request.mjs";
|
|
2
|
+
import { sendsCredentials, cloverFetch, discardBody } from "../../../core/request.mjs";
|
|
3
3
|
class ImageLoadError extends Error {
|
|
4
4
|
constructor(message, url, status) {
|
|
5
5
|
super(message);
|
|
@@ -33,6 +33,7 @@ async function loadImage(url, options = {}) {
|
|
|
33
33
|
return loaded;
|
|
34
34
|
}
|
|
35
35
|
if (!response.ok) {
|
|
36
|
+
discardBody(response);
|
|
36
37
|
throw new ImageLoadError(
|
|
37
38
|
`Image request failed with ${response.status}`,
|
|
38
39
|
url,
|
|
@@ -4,12 +4,14 @@ import { compose, scale, translate } from "../math/affine.mjs";
|
|
|
4
4
|
import { intersects } from "../math/rect.mjs";
|
|
5
5
|
import { pixelsToWorld, orientOf, shownPointToPixels, shownToPixels } from "./sceneItem.mjs";
|
|
6
6
|
import { tilesInRegion, chooseLevel } from "../sources/tilePyramid.mjs";
|
|
7
|
+
const MIDDLE_BAND = 5e6;
|
|
7
8
|
const TARGET_BAND = 1e7;
|
|
8
9
|
const IN_FLIGHT_BAND = 15e6;
|
|
9
10
|
const OVERVIEW_BAND = 2e7;
|
|
10
11
|
const IN_FLIGHT_LEVELS = 2;
|
|
11
12
|
function planFrame(input) {
|
|
12
13
|
const { items, camera, viewport, pixelRatio, getTile, destination } = input;
|
|
14
|
+
const has = input.has ?? ((url) => getTile(url) !== void 0);
|
|
13
15
|
const view = worldToScreen(camera, viewport);
|
|
14
16
|
const draws = [];
|
|
15
17
|
const wants = [];
|
|
@@ -68,6 +70,20 @@ function planFrame(input) {
|
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
}
|
|
73
|
+
const middle = target - IN_FLIGHT_LEVELS;
|
|
74
|
+
if (there === here && middle > 0) {
|
|
75
|
+
const asked = /* @__PURE__ */ new Set();
|
|
76
|
+
for (const address of fine) {
|
|
77
|
+
const tile = pyramid.tile(address);
|
|
78
|
+
if (has(tile.url)) continue;
|
|
79
|
+
for (const under of tilesInRegion(pyramid, middle, tile.region)) {
|
|
80
|
+
const key = `${under.col},${under.row}`;
|
|
81
|
+
if (asked.has(key)) continue;
|
|
82
|
+
asked.add(key);
|
|
83
|
+
want(pyramid, under, MIDDLE_BAND + distance(under));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
71
87
|
if (item.spec.hidden) continue;
|
|
72
88
|
const targetTiles = target === 0 ? coarse : fine;
|
|
73
89
|
const complete = targetTiles.every(
|
|
@@ -164,5 +180,6 @@ function dedupeWants(wants) {
|
|
|
164
180
|
});
|
|
165
181
|
}
|
|
166
182
|
export {
|
|
183
|
+
TARGET_BAND,
|
|
167
184
|
planFrame
|
|
168
185
|
};
|
|
@@ -4,7 +4,7 @@ import { union, transformRect } from "../math/rect.mjs";
|
|
|
4
4
|
import { parseRegion, parseRotation } from "./regions.mjs";
|
|
5
5
|
import { fetchInfo } from "../sources/imageService.mjs";
|
|
6
6
|
import { servicePyramid, staticPyramid, tilesInRegion } from "../sources/tilePyramid.mjs";
|
|
7
|
-
async function
|
|
7
|
+
async function resolveItem(spec, context) {
|
|
8
8
|
if (spec.media) return prepareMedia(spec, spec.media);
|
|
9
9
|
let pyramid = null;
|
|
10
10
|
let serviceError = null;
|
|
@@ -50,13 +50,17 @@ async function prepareItem(spec, context) {
|
|
|
50
50
|
rect: { x: 0, y: 0, width: contentClip.width, height: contentClip.height },
|
|
51
51
|
...turn ? { turn } : {}
|
|
52
52
|
};
|
|
53
|
-
|
|
53
|
+
return item;
|
|
54
|
+
}
|
|
55
|
+
function prefetchCoarse(item, cache) {
|
|
56
|
+
if (item.media) return Promise.resolve();
|
|
57
|
+
const { pyramid, clip } = item;
|
|
58
|
+
return cache.prefetch(
|
|
54
59
|
tilesInRegion(pyramid, 0, clip).map((address) => {
|
|
55
60
|
const tile = pyramid.tile(address);
|
|
56
61
|
return { url: tile.url, fallbackUrl: tile.fallbackUrl };
|
|
57
62
|
})
|
|
58
63
|
);
|
|
59
|
-
return item;
|
|
60
64
|
}
|
|
61
65
|
const MEDIA_KEY_PREFIX = "media:";
|
|
62
66
|
function prepareMedia(spec, media) {
|
|
@@ -169,7 +173,8 @@ export {
|
|
|
169
173
|
layoutItems,
|
|
170
174
|
orientOf,
|
|
171
175
|
pixelsToWorld,
|
|
172
|
-
|
|
176
|
+
prefetchCoarse,
|
|
177
|
+
resolveItem,
|
|
173
178
|
sameSpec,
|
|
174
179
|
shownPointToPixels,
|
|
175
180
|
shownToPixels,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { cloverFetch } from "../../../core/request.mjs";
|
|
2
|
+
import { cloverFetch, discardBody } from "../../../core/request.mjs";
|
|
3
3
|
const DECODABLE = ["jpg", "png", "webp", "gif"];
|
|
4
4
|
class ImageServiceError extends Error {
|
|
5
5
|
constructor(message, url, status) {
|
|
@@ -135,6 +135,7 @@ function fetchInfo(serviceUri, { request } = {}) {
|
|
|
135
135
|
headers: { Accept: "application/ld+json, application/json" }
|
|
136
136
|
}).then(async (response) => {
|
|
137
137
|
if (!response.ok) {
|
|
138
|
+
discardBody(response);
|
|
138
139
|
throw new ImageServiceError(
|
|
139
140
|
`info.json request failed with ${response.status}`,
|
|
140
141
|
url,
|