@nulib/clover 4.0.0-beta.0 → 4.0.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.
- package/README.md +7 -7
- package/dist/components/Annotations/Annotations.mjs +165 -204
- package/dist/components/Annotations/EntryBodies.mjs +28 -3
- package/dist/components/Annotations/languages.mjs +1 -17
- package/dist/components/Body/BodyAlert.mjs +2 -1
- package/dist/components/Body/Caption.mjs +2 -1
- package/dist/components/Body/CaptionDetails.mjs +2 -1
- package/dist/components/Body/glyphs.mjs +9 -0
- package/dist/components/Canvas/AnnotationMenu.mjs +76 -60
- package/dist/components/Canvas/AnnotationState.mjs +9 -2
- package/dist/components/Canvas/Annotations.mjs +16 -7
- package/dist/components/Canvas/CanvasView.mjs +173 -32
- package/dist/components/Canvas/ChoiceMenu.mjs +51 -31
- package/dist/components/Canvas/Connected.mjs +38 -4
- package/dist/components/Canvas/ControlMenu.mjs +6 -4
- package/dist/components/Canvas/Controls.mjs +17 -1
- package/dist/components/Canvas/FrameAnimation.mjs +568 -167
- package/dist/components/Canvas/LoadedCanvas.mjs +5 -3
- package/dist/components/Canvas/PlaceBox.mjs +74 -0
- package/dist/components/Canvas/Placeholder.mjs +2 -1
- package/dist/components/Canvas/fromManifest.mjs +2 -1
- package/dist/components/Canvas/layout.mjs +121 -32
- package/dist/components/Canvas/media/MediaBody.mjs +32 -6
- package/dist/components/Canvas/media/Player.mjs +11 -25
- package/dist/components/Canvas/media/Transport.mjs +94 -61
- package/dist/components/Canvas/media/TransportButton.mjs +2 -1
- package/dist/components/Canvas/media/placeMenu.mjs +19 -0
- package/dist/components/Canvas/media/seekGaps.mjs +43 -0
- package/dist/components/Canvas/media/sequence.mjs +96 -0
- package/dist/components/Canvas/media/useMediaElement.mjs +22 -3
- package/dist/components/Collection/Collection.mjs +2 -1
- package/dist/components/CollectionSelect/CollectionSelect.mjs +5 -2
- package/dist/components/Contents/Contents.mjs +163 -34
- package/dist/components/Download/Download.mjs +34 -38
- package/dist/components/Download/downloads.mjs +40 -0
- package/dist/components/Items/AnnotationItems.mjs +165 -0
- package/dist/components/Items/CountMenu.mjs +89 -0
- package/dist/components/Items/Item.mjs +24 -17
- package/dist/components/Items/Items.mjs +65 -37
- package/dist/components/Items/Pager.mjs +39 -79
- package/dist/components/Items/PagerLayout.mjs +41 -0
- package/dist/components/Items/Position.mjs +103 -0
- package/dist/components/Items/StandaloneItems.mjs +12 -4
- package/dist/components/Items/TargetItems.mjs +202 -0
- package/dist/components/Label/Label.mjs +2 -1
- package/dist/components/Map/MapView.mjs +375 -64
- package/dist/components/Map/maplibre-worker.mjs +7 -0
- package/dist/components/Map/worker.mjs +22 -0
- package/dist/components/Panel/About.mjs +50 -16
- package/dist/components/Panel/AboutActions.mjs +117 -0
- package/dist/components/Panel/Panel.mjs +58 -18
- package/dist/components/Panel/PartOfManifest.mjs +4 -3
- package/dist/components/Panel/ReadingLanguages.mjs +20 -0
- package/dist/components/Primitives/Primitives.mjs +18 -3
- package/dist/components/Provider/Provider.mjs +19 -5
- package/dist/components/Root/Announcer.mjs +3 -2
- package/dist/components/Root/Root.mjs +5 -2
- package/dist/components/Root/useRootState.mjs +14 -2
- package/dist/components/Scene/SceneView.mjs +23 -6
- package/dist/components/Search/Search.mjs +3 -2
- package/dist/components/Split/Split.mjs +13 -3
- package/dist/components/Status/Status.mjs +10 -2
- package/dist/components/Timeline/playerSurface.mjs +2 -1
- package/dist/components/Transcript/Transcript.mjs +42 -23
- package/dist/core/annotation-bodies.mjs +25 -5
- package/dist/core/annotation-collection.mjs +3 -2
- package/dist/core/annotation-name.mjs +12 -9
- package/dist/core/annotation-sets.mjs +139 -10
- package/dist/core/annotations-content.mjs +8 -1
- package/dist/core/annotations.mjs +8 -1
- package/dist/core/choice-key.mjs +5 -0
- package/dist/core/clover.mjs +105 -20
- package/dist/core/content-state-reader.mjs +33 -2
- package/dist/core/dates-format.mjs +30 -0
- package/dist/core/dates.mjs +19 -0
- package/dist/core/geo.mjs +46 -5
- package/dist/core/image-layers.mjs +96 -0
- package/dist/core/items.mjs +7 -3
- package/dist/core/language-choice.mjs +30 -0
- package/dist/core/link.mjs +15 -1
- package/dist/core/load.mjs +14 -5
- package/dist/core/pages.mjs +20 -1
- package/dist/core/presentation.mjs +6 -4
- package/dist/core/range-regions.mjs +70 -0
- package/dist/core/ranges.mjs +52 -18
- package/dist/core/region.mjs +7 -2
- package/dist/core/sanitize.mjs +86 -1
- package/dist/core/save-file.mjs +33 -0
- package/dist/core/selectors.mjs +12 -0
- package/dist/core/upgrade.mjs +23 -0
- package/dist/core/value.mjs +11 -23
- package/dist/hooks/useFullscreenExit.mjs +26 -0
- package/dist/hooks/useHighContrast.mjs +27 -0
- package/dist/i18n/autonym.mjs +11 -0
- package/dist/i18n/config.mjs +3 -8
- package/dist/{core → i18n}/direction.mjs +5 -1
- package/dist/i18n/languages.mjs +44 -0
- 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/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/{ui → i18n}/useContainerName.mjs +5 -4
- package/dist/{react/language.mjs → i18n/useRootLanguage.mjs} +2 -2
- package/dist/index.d.mts +415 -64
- package/dist/index.mjs +6 -2
- package/dist/lib/fullscreen.mjs +6 -1
- package/dist/lib/renderer/CanvasRenderer.mjs +28 -5
- package/dist/lib/renderer/math/affine.mjs +14 -0
- package/dist/lib/renderer/scene/planFrame.mjs +12 -12
- package/dist/lib/renderer/scene/regions.mjs +11 -1
- package/dist/lib/renderer/scene/sceneItem.mjs +72 -9
- package/dist/lib/time.mjs +10 -0
- package/dist/map/index.d.mts +40 -7
- package/dist/react/fetchManifest.mjs +19 -0
- package/dist/react/hooks.mjs +7 -1
- package/dist/react/readingLanguages.mjs +16 -0
- package/dist/react/usePagesReached.mjs +42 -0
- package/dist/styles.css +1 -1
- package/dist/templates/default/Default.mjs +87 -9
- package/dist/templates/document/Document.mjs +5 -1
- package/dist/templates/index.d.mts +26 -5
- package/dist/templates.css +1 -1
- package/dist/ui/BodyUnloadable.mjs +34 -0
- package/dist/ui/Button.mjs +2 -1
- package/dist/ui/Chevron.mjs +34 -0
- package/dist/ui/ControlCluster.mjs +6 -3
- package/dist/ui/EntryThumbnail.mjs +60 -0
- package/dist/ui/ExitFullscreen.mjs +2 -1
- package/dist/ui/FieldPill.mjs +5 -4
- package/dist/ui/HideToggle.mjs +2 -1
- package/dist/ui/LanguageChoice.mjs +45 -0
- package/dist/ui/ListEnd.mjs +29 -0
- package/dist/ui/Markup.mjs +27 -8
- package/dist/ui/NavDate.mjs +29 -0
- package/dist/ui/ReadMore.mjs +4 -3
- package/dist/ui/Sections.mjs +19 -28
- package/dist/ui/Steps.mjs +4 -3
- package/dist/ui/Tip.mjs +9 -4
- package/dist/web-components/About-DhOGPFaI.mjs +1 -0
- package/dist/web-components/AnnotationItems-CNP4CJiT.mjs +1 -0
- package/dist/web-components/AnnotationMenu-BCwwwfbb.mjs +1 -0
- package/dist/web-components/AnnotationState-CavxnAAq.mjs +1 -0
- package/dist/web-components/Annotations-DDjSrBL5.mjs +2 -0
- package/dist/web-components/Annotations-rBmeI5sR.mjs +1 -0
- package/dist/web-components/Body-DaY1UJIy.mjs +1 -0
- package/dist/web-components/BodyAlert-COKp19lq.mjs +1 -0
- package/dist/web-components/BodyUnloadable-DcTM7hHF.mjs +1 -0
- package/dist/web-components/Button-DLFYqtz9.mjs +1 -0
- package/dist/web-components/{Camera-Dw51CAfF.mjs → Camera-Cp5ma-6C.mjs} +1 -1
- package/dist/web-components/{Canvas2DBackend-RRN2bEkc.mjs → Canvas2DBackend-3PToh87Z.mjs} +1 -1
- package/dist/web-components/CanvasView-BWQ4SK2b.mjs +2 -0
- package/dist/web-components/CaptionDetails-DSziiuQV.mjs +1 -0
- package/dist/web-components/Chevron-r-_hUPn8.mjs +1 -0
- package/dist/web-components/ChoiceMenu-DTuEEUeM.mjs +1 -0
- package/dist/web-components/Collection-B9swJtPW.mjs +1 -0
- package/dist/web-components/CollectionSelect-CBWUbqQi.mjs +1 -0
- package/dist/web-components/Connected-B2d6EoFl.mjs +1 -0
- package/dist/web-components/Connected-BSRM9FJY.mjs +1 -0
- package/dist/web-components/Connected-BnpxYeJN.mjs +1 -0
- package/dist/web-components/Contents-D7FPxSH-.mjs +1 -0
- package/dist/web-components/ControlMenu-Crtho2cs.mjs +1 -0
- package/dist/web-components/CountMenu-DyTp_J4k.mjs +1 -0
- package/dist/web-components/Cue-CbZaGwZh.mjs +1 -0
- package/dist/web-components/Document-BfltLWZZ.mjs +1 -0
- package/dist/web-components/DocumentPanel-ZSe40cV4.mjs +1 -0
- package/dist/web-components/{DomLayers-BsR2AOy-.mjs → DomLayers-CTGub6wo.mjs} +1 -1
- package/dist/web-components/Download-BOYNIb7C.mjs +1 -0
- package/dist/web-components/EntryBodies-Bfd2Z42z.mjs +1 -0
- package/dist/web-components/EntryThumbnail-DQE8ajI9.mjs +1 -0
- package/dist/web-components/FieldPill-D5DNJWLy.mjs +1 -0
- package/dist/web-components/FrameAnimation-IfR1czfc.mjs +1 -0
- package/dist/web-components/Gallery-DD06BDQo.mjs +1 -0
- package/dist/web-components/HideToggle-DL911R1Z.mjs +1 -0
- package/dist/web-components/Items-BHzT9A73.mjs +1 -0
- package/dist/web-components/Label-KabnxuMN.mjs +1 -0
- package/dist/web-components/LanguageChoice-DT1UPiDn.mjs +1 -0
- package/dist/web-components/LightboxBody-BhRhdXo6.mjs +1 -0
- package/dist/web-components/ListEnd-CbwNlty-.mjs +1 -0
- package/dist/web-components/{Loaded-wQurAeJz.mjs → Loaded-BWfEBJyg.mjs} +1 -1
- package/dist/web-components/LoadedCanvas-CdZ5WOWz.mjs +1 -0
- package/dist/web-components/LoadedMap-DQyQVRVQ.mjs +1 -0
- package/dist/web-components/{Loading-BmA--pzr.mjs → Loading-zw74TdAz.mjs} +1 -1
- package/dist/web-components/{Map-DzVGblIS.mjs → Map--dJhk0_0.mjs} +1 -1
- package/dist/web-components/MapView-duA5WGsu.mjs +3 -0
- package/dist/web-components/Markup-D-kioDf9.mjs +2 -0
- package/dist/web-components/MediaBody-CoOiVXcv.mjs +1 -0
- package/dist/web-components/MediaBody-d8ErTuwT.mjs +1 -0
- package/dist/web-components/NavDate-BQHuyLOC.mjs +1 -0
- package/dist/web-components/{Navigator-CIJFA3q1.mjs → Navigator-B3U21_ti.mjs} +1 -1
- package/dist/web-components/Pager-DnJknq92.mjs +1 -0
- package/dist/web-components/PagerLayout-CvOmKtSW.mjs +1 -0
- package/dist/web-components/Panel-CIdjOznL.mjs +1 -0
- package/dist/web-components/{PanelToggle-BYjV2t1j.mjs → PanelToggle-CFtWIeWv.mjs} +1 -1
- package/dist/web-components/PartOfManifest-F87jIrf9.mjs +1 -0
- package/dist/web-components/{Pending-BspZajh5.mjs → Pending-CYAQajKu.mjs} +1 -1
- package/dist/web-components/PlaceBox-BtIbIotm.mjs +1 -0
- package/dist/web-components/Placeholder-TIyj4ZjR.mjs +1 -0
- package/dist/web-components/Position-BkWBRBfW.mjs +1 -0
- package/dist/web-components/Primitives-BmODPlnK.mjs +1 -0
- package/dist/web-components/Provider-C8se8i4I.mjs +1 -0
- package/dist/web-components/ReadMore-BwGFsLS2.mjs +1 -0
- package/dist/web-components/Root-CAJB0-Mh.mjs +1 -0
- package/dist/web-components/Scene-Ctcdt7CD.mjs +1 -0
- package/dist/web-components/SceneView-B6bEx_7x.mjs +1 -0
- package/dist/web-components/Search-CbmK9vLp.mjs +1 -0
- package/dist/web-components/Sections-Dy5_pkyQ.mjs +2 -0
- package/dist/web-components/StandaloneItems-BmUnBp0H.mjs +1 -0
- package/dist/web-components/Status-Dww3Pyf4.mjs +1 -0
- package/dist/web-components/Steps-o_UprQfZ.mjs +1 -0
- package/dist/web-components/TargetItems-BBOGDubv.mjs +1 -0
- package/dist/web-components/Timeline-CfIF4APc.mjs +1 -0
- package/dist/web-components/Tip-BbexILXs.mjs +1 -0
- package/dist/web-components/Transcript-ZVXM3ZDA.mjs +1 -0
- package/dist/web-components/annotation-collection-7SS1ELcO.mjs +1 -0
- package/dist/web-components/annotation-name-CYkZopdd.mjs +1 -0
- package/dist/web-components/annotations-content-Bdtn50sf.mjs +1 -0
- package/dist/web-components/body-CkOBHlJ0.mjs +1 -0
- package/dist/web-components/canvas-CWf_Fag8.mjs +1 -0
- package/dist/web-components/choice-key-BUNebLKe.mjs +1 -0
- package/dist/web-components/{cloverEngine-Dbv-26NP.mjs → cloverEngine-6djEHNCD.mjs} +2 -2
- package/dist/web-components/content-state-reader-Ahh6artg.mjs +1 -0
- package/dist/web-components/{controls-qRYf2jO2.mjs → controls-BJrZVQkS.mjs} +1 -1
- package/dist/web-components/custom-elements.json +109 -13
- package/dist/web-components/dates-DR3gfcON.mjs +1 -0
- package/dist/web-components/downloads-CqVWo-yn.mjs +1 -0
- package/dist/web-components/{engine-D8JLgzqq.mjs → engine-B-sscpLa.mjs} +1 -1
- package/dist/web-components/{engines-BwVb9R_A.mjs → engines-DfCHjbt3.mjs} +1 -1
- package/dist/web-components/es-BYfHUZ7P.mjs +1 -0
- package/dist/web-components/fetchManifest-BIzne1Pj.mjs +1 -0
- package/dist/web-components/fi-B5y2qr8T.mjs +1 -0
- package/dist/web-components/fr-ChezCx6V.mjs +1 -0
- package/dist/web-components/fromManifest-gg5Wx14y.mjs +1 -0
- package/dist/web-components/glyphs-JYl2STEr.mjs +1 -0
- package/dist/web-components/hooks-x7rO95CS.mjs +1 -0
- package/dist/web-components/image-layers-BjbeyHBS.mjs +1 -0
- package/dist/web-components/{imageService-C3yg9DxB.mjs → imageService-0eTvQ-3h.mjs} +1 -1
- package/dist/web-components/index-BZ7b9k0N.mjs +1 -0
- package/dist/web-components/index.d.mts +95 -10
- package/dist/web-components/index.mjs +1 -1
- package/dist/web-components/items-CnAIl9fS.mjs +1 -0
- package/dist/web-components/items-F6hJgdAS.mjs +1 -0
- package/dist/web-components/label-CI88KH2_.mjs +1 -0
- package/dist/web-components/layout-De1MOSYe.mjs +1 -0
- package/dist/web-components/link-GEdiEwlR.mjs +1 -0
- package/dist/web-components/logo-Ckwj7FlP.mjs +1 -0
- package/dist/web-components/models-59cEeiAA.mjs +1 -0
- package/dist/web-components/nb-8J22f9Td.mjs +1 -0
- package/dist/web-components/nn-Dv1EvzI1.mjs +1 -0
- package/dist/web-components/no-8J22f9Td.mjs +1 -0
- package/dist/web-components/{nodes-Bf-Fb7e5.mjs → nodes-CTw9OqlA.mjs} +1 -1
- package/dist/web-components/{overlayImage-DdPs2EGY.mjs → overlayImage-BMt4UTlR.mjs} +1 -1
- package/dist/web-components/{panel-CiqEFDzv.mjs → panel-C17Rl9Ya.mjs} +1 -1
- package/dist/web-components/part-CXts97_M.mjs +1 -0
- package/dist/web-components/playerSurface-HYwEwPK6.mjs +1 -0
- package/dist/web-components/presentation-2-C-U79S_T.mjs +1 -0
- package/dist/web-components/{provider-LUmAQSoP.mjs → provider-BpxorEiq.mjs} +1 -1
- package/dist/web-components/pt-DWYQkATt.mjs +1 -0
- package/dist/web-components/range-regions-BGQy4E9U.mjs +1 -0
- package/dist/web-components/read-more-BDM_6CVc.mjs +1 -0
- package/dist/web-components/readingLanguages-fs_HqvqQ.mjs +1 -0
- package/dist/web-components/rendererSurface-C0aKlE0v.mjs +22 -0
- package/dist/web-components/{renderers-Bg4QqawN.mjs → renderers-CiB74bQh.mjs} +1 -1
- package/dist/web-components/{resource-DzIvB_4m.mjs → resource-CRbpf9pX.mjs} +1 -1
- package/dist/web-components/sanitize-qIOeyIww.mjs +3 -0
- package/dist/web-components/save-file-CCuZEuQr.mjs +1 -0
- package/dist/web-components/search-CkM0O0Z1.mjs +1 -0
- package/dist/web-components/sequence-C28xoNmD.mjs +1 -0
- package/dist/web-components/shared-MTsMddHx.mjs +1 -0
- package/dist/web-components/{show-link-DWRRXSBy.mjs → show-link-BXm7SNIC.mjs} +1 -1
- package/dist/web-components/{sizedImage-DfjlV2-i.mjs → sizedImage-k4Q-eyOB.mjs} +1 -1
- package/dist/web-components/{split-m-_XivaW.mjs → split-Hp6z-v4h.mjs} +1 -1
- package/dist/web-components/{status-DDS7jLNd.mjs → status-BmtuKfAG.mjs} +1 -1
- package/dist/web-components/styles-CZV1nbBQ.mjs +1 -0
- package/dist/web-components/three.mjs +1 -1
- package/dist/web-components/thumbnail-Dp7a8oom.mjs +1 -0
- package/dist/web-components/{tip-BXByhOJ9.mjs → tip-C-oovDZK.mjs} +1 -1
- package/dist/web-components/{toggle-AS72kq6v.mjs → toggle-C7ODWDEZ.mjs} +1 -1
- package/dist/web-components/upgrade-eNW0DPXq.mjs +1 -0
- package/dist/web-components/upgrader-BlbMUEH6.mjs +1 -0
- package/dist/web-components/useContainerName-CrOmY-km.mjs +1 -0
- package/dist/web-components/useNearViewport-BqXi9Gn4.mjs +1 -0
- package/dist/web-components/{useScrollTrack-dLFWnT8N.mjs → useScrollTrack-CEsOU2yT.mjs} +1 -1
- package/dist/web-components/viewer/AnnotationItems-CyhVcRFc.mjs +1 -0
- package/dist/web-components/viewer/AnnotationMenu-DPOSehBo.mjs +1 -0
- package/dist/web-components/viewer/AnnotationState-Bjztkobn.mjs +1 -0
- package/dist/web-components/viewer/Annotations-Dh_8Tzi0.mjs +2 -0
- package/dist/web-components/viewer/Annotations-wwuOCxzI.mjs +1 -0
- package/dist/web-components/viewer/{Canvas2DBackend-CkvI0wUT.mjs → Canvas2DBackend-BTK6ZJh0.mjs} +1 -1
- package/dist/web-components/viewer/CaptionDetails-BwCTovy_.mjs +1 -0
- package/dist/web-components/viewer/ChoiceMenu-DQ1x572Y.mjs +1 -0
- package/dist/web-components/viewer/Collection-DSBxCmXw.mjs +1 -0
- package/dist/web-components/viewer/Connected-CL3N8F2J.mjs +1 -0
- package/dist/web-components/viewer/Connected-DTk1jlyI.mjs +1 -0
- package/dist/web-components/viewer/Contents-DrXckx7d.mjs +1 -0
- package/dist/web-components/viewer/ControlMenu-Bp91s-g_.mjs +1 -0
- package/dist/web-components/viewer/CountMenu-4u6U6yqb.mjs +1 -0
- package/dist/web-components/viewer/Cue-C-aF8peC.mjs +1 -0
- package/dist/web-components/viewer/Document-BN1rICu3.mjs +1 -0
- package/dist/web-components/viewer/DocumentPanel-CEesxdeY.mjs +1 -0
- package/dist/web-components/viewer/{DomLayers-Dybz_aJv.mjs → DomLayers-CGkDtemL.mjs} +1 -1
- package/dist/web-components/viewer/Download-CawEl9MN.mjs +1 -0
- package/dist/web-components/viewer/EntryBodies-nYHMwSSM.mjs +1 -0
- package/dist/web-components/viewer/EntryThumbnail-DrO_0SzR.mjs +1 -0
- package/dist/web-components/viewer/FieldPill-DFXGWrvB.mjs +1 -0
- package/dist/web-components/viewer/FrameAnimation-CZfzpxaD.mjs +1 -0
- package/dist/web-components/viewer/Gallery-MWHtvjti.mjs +1 -0
- package/dist/web-components/viewer/HideToggle-DP5kHzWM.mjs +1 -0
- package/dist/web-components/viewer/LanguageChoice-C50T7dPI.mjs +1 -0
- package/dist/web-components/viewer/{LightboxBody-ClQ4yrTh.mjs → LightboxBody-C2T7IC29.mjs} +1 -1
- package/dist/web-components/viewer/ListEnd-BDuOx__m.mjs +1 -0
- package/dist/web-components/viewer/MapView-BN9wXQKV.mjs +3 -0
- package/dist/web-components/viewer/MediaBody-CEyswliX.mjs +1 -0
- package/dist/web-components/viewer/MediaBody-Dw3DWDjc.mjs +1 -0
- package/dist/web-components/viewer/NavDate-C2-wwLuB.mjs +1 -0
- package/dist/web-components/viewer/{Navigator-Duc69Yes.mjs → Navigator-C3jghOd3.mjs} +1 -1
- package/dist/web-components/viewer/PagerLayout-Cg2NpqoD.mjs +1 -0
- package/dist/web-components/viewer/PartOfManifest-D22yMgCf.mjs +1 -0
- package/dist/web-components/viewer/PlaceBox-Dckw4Sfk.mjs +1 -0
- package/dist/web-components/viewer/Placeholder-NYVWYg5Q.mjs +1 -0
- package/dist/web-components/viewer/Search-DC259m4f.mjs +1 -0
- package/dist/web-components/viewer/StandaloneItems-E4kpMne9.mjs +1 -0
- package/dist/web-components/viewer/Steps-Bw32X5xO.mjs +1 -0
- package/dist/web-components/viewer/TargetItems-DLhUH1Gq.mjs +1 -0
- package/dist/web-components/viewer/Transcript-D_VGJQxn.mjs +1 -0
- package/dist/web-components/viewer/annotation-collection-DZHa18ir.mjs +1 -0
- package/dist/web-components/viewer/annotation-name-BaNdW2Xk.mjs +1 -0
- package/dist/web-components/viewer/annotations-content-CbA3eOIC.mjs +1 -0
- package/dist/web-components/viewer/{cloverEngine-CjuYjUhI.mjs → cloverEngine-C04bCSFR.mjs} +2 -2
- package/dist/web-components/viewer/content-state-reader-C7UBMOq3.mjs +1 -0
- package/dist/web-components/viewer/fetchManifest-C2Yxg3x9.mjs +1 -0
- package/dist/web-components/viewer/{host-yWi4R1bP.mjs → host-CZeyjCKR.mjs} +1 -1
- package/dist/web-components/viewer/image-layers-B09fporZ.mjs +1 -0
- package/dist/web-components/viewer/index.mjs +1 -1
- package/dist/web-components/viewer/link-DssZ0Z2N.mjs +1 -0
- package/dist/web-components/viewer/overlayImage-BR3eJCKq.mjs +1 -0
- package/dist/web-components/viewer/range-regions-By6L5JOK.mjs +1 -0
- package/dist/web-components/viewer/{renderers-L-IlGI1r.mjs → renderers-DLoqv3QO.mjs} +1 -1
- package/dist/web-components/viewer/save-file-CJT5p5Hg.mjs +1 -0
- package/dist/web-components/viewer/{search-DWkwRPo_.mjs → search-PhOwMKHi.mjs} +1 -1
- package/dist/web-components/viewer/styles-NZLnZPAC.mjs +1 -0
- package/dist/web-components/viewer/viewer-D30YHqyF.mjs +29 -0
- package/dist/web-components/viewer/{vtt-1ZJwtElI.mjs → vtt-1Pk7Dhsj.mjs} +1 -1
- package/dist/web-components/viewer-CH7re5OO.mjs +1 -0
- package/dist/web-components/{vtt-GFssZH8Y.mjs → vtt-CacHieeN.mjs} +1 -1
- package/dist/web-components/worker-CjXN0dku.mjs +1 -0
- package/package.json +10 -5
- package/dist/i18n/reader.mjs +0 -13
- package/dist/web-components/About-uKa1wfDr.mjs +0 -1
- package/dist/web-components/AnnotationMenu-BGIYRXW6.mjs +0 -1
- package/dist/web-components/AnnotationState-D2UIgIEC.mjs +0 -1
- package/dist/web-components/Annotations-BhwAv3ah.mjs +0 -1
- package/dist/web-components/Annotations-C_tBJHo3.mjs +0 -2
- package/dist/web-components/Body-DMEERFuB.mjs +0 -1
- package/dist/web-components/BodyAlert-BP8voSLv.mjs +0 -1
- package/dist/web-components/Button-Cl02BFDd.mjs +0 -1
- package/dist/web-components/CanvasView-B8lMMSou.mjs +0 -1
- package/dist/web-components/CaptionDetails-KLMDv-ec.mjs +0 -1
- package/dist/web-components/ChoiceMenu-CXrVOmJl.mjs +0 -1
- package/dist/web-components/Collection-DL4Ui4hF.mjs +0 -1
- package/dist/web-components/CollectionSelect-DL-bbpwJ.mjs +0 -1
- package/dist/web-components/Connected-B0S1HXQb.mjs +0 -1
- package/dist/web-components/Connected-BcjRA5si.mjs +0 -1
- package/dist/web-components/Connected-Q7iizBb8.mjs +0 -1
- package/dist/web-components/Contents-ZC8TiGaW.mjs +0 -1
- package/dist/web-components/ControlMenu-DIoU797-.mjs +0 -1
- package/dist/web-components/Cue-CJxnDMEy.mjs +0 -1
- package/dist/web-components/Document-DHBRAFEK.mjs +0 -1
- package/dist/web-components/DocumentPanel-CqvE2pu9.mjs +0 -1
- package/dist/web-components/Download-DBksL1C0.mjs +0 -1
- package/dist/web-components/EntryBodies-VwEkTVrw.mjs +0 -1
- package/dist/web-components/ErrorBoundary-Cy9PGoZv.mjs +0 -1
- package/dist/web-components/FieldPill-DCJBz6Vj.mjs +0 -1
- package/dist/web-components/FrameAnimation-DRbmgGpF.mjs +0 -1
- package/dist/web-components/Gallery-BM7-VJkB.mjs +0 -1
- package/dist/web-components/HideToggle-BdYgG7us.mjs +0 -1
- package/dist/web-components/Items-_1Jz3FMs.mjs +0 -1
- package/dist/web-components/Label-CAiJ49eA.mjs +0 -1
- package/dist/web-components/LightboxBody-DyhUZiDf.mjs +0 -1
- package/dist/web-components/LoadedCanvas-DWz5IK5m.mjs +0 -1
- package/dist/web-components/LoadedMap-DIeW313M.mjs +0 -1
- package/dist/web-components/MapView-BJaN7VBI.mjs +0 -1
- package/dist/web-components/Markup-D91DbxLk.mjs +0 -2
- package/dist/web-components/MediaBody-BYcVPo2X.mjs +0 -1
- package/dist/web-components/MediaBody-FEzH8VVw.mjs +0 -1
- package/dist/web-components/Pager-BGwCurxE.mjs +0 -1
- package/dist/web-components/Panel-B-GXOkzF.mjs +0 -1
- package/dist/web-components/PartOfManifest-ClbGepVM.mjs +0 -1
- package/dist/web-components/Primitives-CTh59wvs.mjs +0 -1
- package/dist/web-components/Provider-C6rIiDXH.mjs +0 -1
- package/dist/web-components/ReadMore-BJ2i-0uN.mjs +0 -1
- package/dist/web-components/Root-DkkYDtur.mjs +0 -1
- package/dist/web-components/Scene-B_PU_TiX.mjs +0 -1
- package/dist/web-components/SceneView-qcW_sT3j.mjs +0 -1
- package/dist/web-components/Search-UOneIUcP.mjs +0 -1
- package/dist/web-components/Sections-we9U9fXq.mjs +0 -2
- package/dist/web-components/StandaloneItems-DU8oCFc_.mjs +0 -1
- package/dist/web-components/Status-Cs5ZvFvL.mjs +0 -1
- package/dist/web-components/Timeline-WtYZ1bIJ.mjs +0 -1
- package/dist/web-components/Tip-C8J3qsIK.mjs +0 -1
- package/dist/web-components/Transcript-CRL2zToL.mjs +0 -1
- package/dist/web-components/annotation-collection-ZPyvpLFc.mjs +0 -1
- package/dist/web-components/annotations-content-BZChKhJZ.mjs +0 -1
- package/dist/web-components/body-UntgrmoV.mjs +0 -1
- package/dist/web-components/canvas-d_U4v_mh.mjs +0 -1
- package/dist/web-components/content-state-reader-DjdKWjit.mjs +0 -1
- package/dist/web-components/es-BwMkoRod.mjs +0 -1
- package/dist/web-components/fi-gPFOn9RK.mjs +0 -1
- package/dist/web-components/fr-DUHmgdJo.mjs +0 -1
- package/dist/web-components/fromManifest-UrMJgktp.mjs +0 -1
- package/dist/web-components/glyphs-BoX0a88P.mjs +0 -1
- package/dist/web-components/hooks-Dp8pjU8l.mjs +0 -1
- package/dist/web-components/index-DWxMuwDL.mjs +0 -1
- package/dist/web-components/items--Tu7ZM3L.mjs +0 -1
- package/dist/web-components/items-W2vrwArM.mjs +0 -1
- package/dist/web-components/keep-fragments-B5nlv2ck.mjs +0 -1
- package/dist/web-components/label-CYQ7tVl6.mjs +0 -1
- package/dist/web-components/layout-KL0V-iJu.mjs +0 -1
- package/dist/web-components/link-DRRTY4lY.mjs +0 -1
- package/dist/web-components/logo-CnQUCB3Y.mjs +0 -1
- package/dist/web-components/models-BP2qp9nT.mjs +0 -1
- package/dist/web-components/nb-BSvnQ6jd.mjs +0 -1
- package/dist/web-components/nn-Dg2_HdZu.mjs +0 -1
- package/dist/web-components/no-BSvnQ6jd.mjs +0 -1
- package/dist/web-components/part-CUBY90_b.mjs +0 -1
- package/dist/web-components/playerSurface-i2TJz-F4.mjs +0 -1
- package/dist/web-components/pt-B3J80JgO.mjs +0 -1
- package/dist/web-components/read-more-BaaO77el.mjs +0 -1
- package/dist/web-components/rendererSurface-DAvatpMF.mjs +0 -22
- package/dist/web-components/sanitize-Dc7nOsgO.mjs +0 -3
- package/dist/web-components/search-DgcgsI3I.mjs +0 -1
- package/dist/web-components/shared-J3w3gnXD.mjs +0 -1
- package/dist/web-components/styles-Ypl9KrSK.mjs +0 -1
- package/dist/web-components/thumbnail-BZvLSwWW.mjs +0 -1
- package/dist/web-components/time-B9GZoYcm.mjs +0 -1
- package/dist/web-components/upgrader-XNxI-5jo.mjs +0 -1
- package/dist/web-components/useContainerName-DCbE5JXi.mjs +0 -1
- package/dist/web-components/useNearViewport-CyoK3l8W.mjs +0 -1
- package/dist/web-components/viewer/AnnotationMenu-Dd4tnzNV.mjs +0 -1
- package/dist/web-components/viewer/AnnotationState-DZaSy5lH.mjs +0 -1
- package/dist/web-components/viewer/Annotations-D1h-Yi5J.mjs +0 -1
- package/dist/web-components/viewer/Annotations-sj79EMen.mjs +0 -2
- package/dist/web-components/viewer/CaptionDetails-B_JdNjJ7.mjs +0 -1
- package/dist/web-components/viewer/ChoiceMenu-xa51a1DV.mjs +0 -1
- package/dist/web-components/viewer/Collection-CxuLCspj.mjs +0 -1
- package/dist/web-components/viewer/Connected-BSUBc3Ci.mjs +0 -1
- package/dist/web-components/viewer/Connected-CPIxNjF2.mjs +0 -1
- package/dist/web-components/viewer/Contents-DNh9mnsF.mjs +0 -1
- package/dist/web-components/viewer/ControlMenu-DdgIvBdf.mjs +0 -1
- package/dist/web-components/viewer/Cue-90H9_dXz.mjs +0 -1
- package/dist/web-components/viewer/Document-CNCpzkiN.mjs +0 -1
- package/dist/web-components/viewer/DocumentPanel-BdG4TVLE.mjs +0 -1
- package/dist/web-components/viewer/EntryBodies-DGXjFP3N.mjs +0 -1
- package/dist/web-components/viewer/FieldPill-Icmd98OY.mjs +0 -1
- package/dist/web-components/viewer/FrameAnimation-DJZN3Rd4.mjs +0 -1
- package/dist/web-components/viewer/Gallery-CEp3-bh2.mjs +0 -1
- package/dist/web-components/viewer/HideToggle-DB6HTmAO.mjs +0 -1
- package/dist/web-components/viewer/MapView-BVSdybIC.mjs +0 -1
- package/dist/web-components/viewer/MediaBody-BBbSMT1i.mjs +0 -1
- package/dist/web-components/viewer/MediaBody-BzMXMHIF.mjs +0 -1
- package/dist/web-components/viewer/PartOfManifest-X9_q-2t6.mjs +0 -1
- package/dist/web-components/viewer/Search-S4N5QU4R.mjs +0 -1
- package/dist/web-components/viewer/StandaloneItems-BO4VyWRW.mjs +0 -1
- package/dist/web-components/viewer/Transcript-BbDaS064.mjs +0 -1
- package/dist/web-components/viewer/annotation-collection-BjZ1DAHq.mjs +0 -1
- package/dist/web-components/viewer/annotations-content-jn3n5Y2-.mjs +0 -1
- package/dist/web-components/viewer/content-state-reader-CPiShIjP.mjs +0 -1
- package/dist/web-components/viewer/link-CwE-fg5G.mjs +0 -1
- package/dist/web-components/viewer/overlayImage-BpOgqsZ0.mjs +0 -1
- package/dist/web-components/viewer/styles-BRCkEU3w.mjs +0 -1
- package/dist/web-components/viewer/viewer--TreVlJ_.mjs +0 -28
- package/dist/web-components/viewer-DyV864Qe.mjs +0 -1
- /package/dist/{ui → i18n}/languageCode.mjs +0 -0
package/dist/index.mjs
CHANGED
|
@@ -5,7 +5,8 @@ import { Root } from "./components/Root/Root.mjs";
|
|
|
5
5
|
import { Body } from "./components/Body/Body.mjs";
|
|
6
6
|
import { Label } from "./components/Label/Label.mjs";
|
|
7
7
|
import { Items } from "./components/Items/Items.mjs";
|
|
8
|
-
import { Next,
|
|
8
|
+
import { Next, Previous } from "./components/Items/Pager.mjs";
|
|
9
|
+
import { Position } from "./components/Items/Position.mjs";
|
|
9
10
|
import { Status } from "./components/Status/Status.mjs";
|
|
10
11
|
import { Homepage, Id, Metadata, PartOf, Rendering, RequiredStatement, Rights, SeeAlso, Summary, Thumbnail, Value } from "./components/Primitives/Primitives.mjs";
|
|
11
12
|
import { Logo, Provider } from "./components/Provider/Provider.mjs";
|
|
@@ -25,7 +26,7 @@ import { CollectionSelect } from "./components/CollectionSelect/CollectionSelect
|
|
|
25
26
|
import { PanelToggle } from "./components/Panel/PanelToggle.mjs";
|
|
26
27
|
import { Timeline } from "./components/Timeline/Timeline.mjs";
|
|
27
28
|
import { Scene } from "./components/Scene/Scene.mjs";
|
|
28
|
-
import { useActiveCanvas, useAnnotationSets, useLangOf, useLocalized, useManifest, useNavigation, useSequence, useStatus, useT, useVisibleCanvases } from "./react/hooks.mjs";
|
|
29
|
+
import { useActiveCanvas, useAnnotationCollection, useAnnotationSets, useLangOf, useLocalized, useManifest, useNavigation, useSequence, useStatus, useT, useVisibleCanvases } from "./react/hooks.mjs";
|
|
29
30
|
import { useProvider } from "./components/Primitives/resource.mjs";
|
|
30
31
|
import { visuallyHidden } from "./ui/visuallyHidden.mjs";
|
|
31
32
|
import { Tip } from "./ui/Tip.mjs";
|
|
@@ -39,6 +40,7 @@ import { buildContentState, encodeContentState } from "./core/content-state.mjs"
|
|
|
39
40
|
import { decodeContentState } from "./core/content-state-reader.mjs";
|
|
40
41
|
import { cueAt, parseVtt } from "./core/vtt.mjs";
|
|
41
42
|
import { chaptersOf, currentContents, tableOfContents } from "./core/ranges.mjs";
|
|
43
|
+
import { CONTENTS_SET_ID } from "./core/annotation-sets.mjs";
|
|
42
44
|
import { localize } from "./core/value.mjs";
|
|
43
45
|
import { readAs, toPlainText } from "./core/text.mjs";
|
|
44
46
|
import { resolveThumbnail, stillSource, thumbnailSource } from "./core/thumbnail.mjs";
|
|
@@ -50,6 +52,7 @@ export {
|
|
|
50
52
|
Annotations,
|
|
51
53
|
Body,
|
|
52
54
|
CLOVER_I18N_NAMESPACE,
|
|
55
|
+
CONTENTS_SET_ID,
|
|
53
56
|
default2 as Canvas,
|
|
54
57
|
Collection,
|
|
55
58
|
CollectionSelect,
|
|
@@ -115,6 +118,7 @@ export {
|
|
|
115
118
|
toPlainText,
|
|
116
119
|
toPresentation4,
|
|
117
120
|
useActiveCanvas,
|
|
121
|
+
useAnnotationCollection,
|
|
118
122
|
useAnnotationSets,
|
|
119
123
|
useClover,
|
|
120
124
|
useCloverSelector,
|
package/dist/lib/fullscreen.mjs
CHANGED
|
@@ -9,7 +9,12 @@ const isFullscreenSupported = () => {
|
|
|
9
9
|
const doc = document;
|
|
10
10
|
return Boolean(doc.fullscreenEnabled ?? doc.webkitFullscreenEnabled);
|
|
11
11
|
};
|
|
12
|
-
const getCloverRoot = (from) =>
|
|
12
|
+
const getCloverRoot = (from) => {
|
|
13
|
+
const root = from == null ? void 0 : from.closest(".clover-root");
|
|
14
|
+
const dialog = from == null ? void 0 : from.closest("dialog");
|
|
15
|
+
if (root && !(dialog && root.contains(dialog))) return root;
|
|
16
|
+
return (from == null ? void 0 : from.closest(".clover-canvas")) ?? null;
|
|
17
|
+
};
|
|
13
18
|
const enterNativeFullscreen = (video, from) => {
|
|
14
19
|
if (typeof video.webkitEnterFullscreen !== "function") return;
|
|
15
20
|
const canvas = from.closest(".clover-canvas");
|
|
@@ -12,9 +12,9 @@ import { loadImage } from "./io/decode.mjs";
|
|
|
12
12
|
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
|
-
import { union, clamp } from "./math/rect.mjs";
|
|
15
|
+
import { union, clamp, transformRect } from "./math/rect.mjs";
|
|
16
16
|
import { planFrame } from "./scene/planFrame.mjs";
|
|
17
|
-
import { sameSpec, prepareItem, layoutItems, pixelsToWorld, MEDIA_KEY_PREFIX } from "./scene/sceneItem.mjs";
|
|
17
|
+
import { sameSpec, prepareItem, layoutItems, pixelsToWorld, itemToWorld, MEDIA_KEY_PREFIX } from "./scene/sceneItem.mjs";
|
|
18
18
|
const DEFAULTS = {
|
|
19
19
|
maxZoomPixelRatio: 1.1,
|
|
20
20
|
minZoomImageRatio: 0.9,
|
|
@@ -98,6 +98,7 @@ class CanvasRenderer {
|
|
|
98
98
|
__publicField(this, "lastEmitted", null);
|
|
99
99
|
__publicField(this, "generation", 0);
|
|
100
100
|
__publicField(this, "listeners", /* @__PURE__ */ new Map());
|
|
101
|
+
__publicField(this, "unloadable", false);
|
|
101
102
|
__publicField(this, "resizeObserver", null);
|
|
102
103
|
__publicField(this, "intersectionObserver", null);
|
|
103
104
|
__publicField(this, "releaseTimer", null);
|
|
@@ -125,9 +126,13 @@ class CanvasRenderer {
|
|
|
125
126
|
// Fetch for where the camera lands, not for each view on the way.
|
|
126
127
|
destination: animating ? this.camera.destination : void 0
|
|
127
128
|
});
|
|
128
|
-
|
|
129
|
-
|
|
129
|
+
const wants = plan.wants.filter(
|
|
130
|
+
(want) => !want.url.startsWith(MEDIA_KEY_PREFIX)
|
|
130
131
|
);
|
|
132
|
+
this.cache.update(wants);
|
|
133
|
+
if (plan.draws.length) this.setUnloadable(false);
|
|
134
|
+
else if (wants.length && wants.every((want) => this.cache.failed(want.url)))
|
|
135
|
+
this.setUnloadable(true);
|
|
131
136
|
this.paint(plan.draws);
|
|
132
137
|
(_a = this.overlays) == null ? void 0 : _a.position(camera, this.viewport);
|
|
133
138
|
(_b = this.navigator) == null ? void 0 : _b.render(
|
|
@@ -257,6 +262,7 @@ class CanvasRenderer {
|
|
|
257
262
|
this.worldBounds = world ? laidOut ? union([world, laidOut]) : world : laidOut;
|
|
258
263
|
this.contentVersion++;
|
|
259
264
|
if (errors.length) this.emit("error", errors);
|
|
265
|
+
this.setUnloadable(images.length > 0 && !items.length && errors.length > 0);
|
|
260
266
|
if (!this.worldBounds) {
|
|
261
267
|
this.invalidate();
|
|
262
268
|
return;
|
|
@@ -281,6 +287,7 @@ class CanvasRenderer {
|
|
|
281
287
|
* scene, framed afresh. A swap within one resource keeps the old scene up instead.
|
|
282
288
|
*/
|
|
283
289
|
clear() {
|
|
290
|
+
this.setUnloadable(false);
|
|
284
291
|
this.generation++;
|
|
285
292
|
this.items = [];
|
|
286
293
|
this.watchMedia([]);
|
|
@@ -493,7 +500,18 @@ class CanvasRenderer {
|
|
|
493
500
|
itemRectToWorld(index, rect) {
|
|
494
501
|
const item = this.items[index];
|
|
495
502
|
if (!item) return null;
|
|
496
|
-
const { contentClip } = item;
|
|
503
|
+
const { contentClip, clip } = item;
|
|
504
|
+
if (item.turn)
|
|
505
|
+
return transformRect(
|
|
506
|
+
compose(
|
|
507
|
+
itemToWorld(item),
|
|
508
|
+
scale(
|
|
509
|
+
clip.width / contentClip.width,
|
|
510
|
+
clip.height / contentClip.height
|
|
511
|
+
)
|
|
512
|
+
),
|
|
513
|
+
rect
|
|
514
|
+
);
|
|
497
515
|
const kx = item.rect.width / contentClip.width;
|
|
498
516
|
const ky = item.rect.height / contentClip.height;
|
|
499
517
|
return {
|
|
@@ -831,6 +849,11 @@ class CanvasRenderer {
|
|
|
831
849
|
);
|
|
832
850
|
(_d = (_c = this.dprQuery).addEventListener) == null ? void 0 : _d.call(_c, "change", this.onPixelRatioChange);
|
|
833
851
|
}
|
|
852
|
+
setUnloadable(unloadable) {
|
|
853
|
+
if (unloadable === this.unloadable) return;
|
|
854
|
+
this.unloadable = unloadable;
|
|
855
|
+
this.emit("unloadable", unloadable);
|
|
856
|
+
}
|
|
834
857
|
emit(event, detail) {
|
|
835
858
|
var _a;
|
|
836
859
|
(_a = this.listeners.get(event)) == null ? void 0 : _a.forEach((listener) => listener(detail));
|
|
@@ -31,6 +31,19 @@ function multiply(m, n) {
|
|
|
31
31
|
function compose(...transforms) {
|
|
32
32
|
return transforms.reduce((acc, t) => multiply(acc, t), IDENTITY);
|
|
33
33
|
}
|
|
34
|
+
function invert(m) {
|
|
35
|
+
const det = m.a * m.d - m.b * m.c;
|
|
36
|
+
if (!det || !Number.isFinite(det)) return null;
|
|
37
|
+
const inv = 1 / det;
|
|
38
|
+
return {
|
|
39
|
+
a: m.d * inv,
|
|
40
|
+
b: -m.b * inv,
|
|
41
|
+
c: -m.c * inv,
|
|
42
|
+
d: m.a * inv,
|
|
43
|
+
e: (m.c * m.f - m.d * m.e) * inv,
|
|
44
|
+
f: (m.b * m.e - m.a * m.f) * inv
|
|
45
|
+
};
|
|
46
|
+
}
|
|
34
47
|
function apply(m, p) {
|
|
35
48
|
return { x: m.a * p.x + m.c * p.y + m.e, y: m.b * p.x + m.d * p.y + m.f };
|
|
36
49
|
}
|
|
@@ -59,6 +72,7 @@ export {
|
|
|
59
72
|
IDENTITY,
|
|
60
73
|
apply,
|
|
61
74
|
compose,
|
|
75
|
+
invert,
|
|
62
76
|
multiply,
|
|
63
77
|
rotate,
|
|
64
78
|
scale,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { worldToScreen, visibleWorldRect } from "../camera/Camera.mjs";
|
|
3
|
-
import { compose,
|
|
3
|
+
import { compose, scale, translate } from "../math/affine.mjs";
|
|
4
4
|
import { intersects } from "../math/rect.mjs";
|
|
5
|
-
import { pixelsToWorld } from "./sceneItem.mjs";
|
|
5
|
+
import { pixelsToWorld, orientOf, shownPointToPixels, shownToPixels } from "./sceneItem.mjs";
|
|
6
6
|
import { tilesInRegion, chooseLevel } from "../sources/tilePyramid.mjs";
|
|
7
7
|
const TARGET_BAND = 1e7;
|
|
8
8
|
const IN_FLIGHT_BAND = 15e6;
|
|
@@ -78,7 +78,7 @@ function planFrame(input) {
|
|
|
78
78
|
view,
|
|
79
79
|
translate(rect.x, rect.y),
|
|
80
80
|
scale(k.x, k.y),
|
|
81
|
-
|
|
81
|
+
orientOf(item)
|
|
82
82
|
);
|
|
83
83
|
for (const level of paintLevels) {
|
|
84
84
|
const addresses = level === 0 ? coarse : level === target ? fine : tilesInRegion(pyramid, level, area);
|
|
@@ -102,7 +102,7 @@ function planFrame(input) {
|
|
|
102
102
|
return { draws, wants: dedupeWants(wants), levels };
|
|
103
103
|
}
|
|
104
104
|
function itemView(item, camera, viewport, pixelRatio) {
|
|
105
|
-
const { pyramid,
|
|
105
|
+
const { pyramid, rect } = item;
|
|
106
106
|
const visible = visibleWorldRect(camera, viewport);
|
|
107
107
|
if (!intersects(visible, rect)) return null;
|
|
108
108
|
const k = pixelsToWorld(item);
|
|
@@ -112,16 +112,16 @@ function itemView(item, camera, viewport, pixelRatio) {
|
|
|
112
112
|
const y1 = Math.min(visible.y + visible.height, rect.y + rect.height);
|
|
113
113
|
const imagePerDevice = 1 / (k.x * camera.zoom * pixelRatio);
|
|
114
114
|
return {
|
|
115
|
-
area: {
|
|
116
|
-
x:
|
|
117
|
-
y:
|
|
115
|
+
area: shownToPixels(item, {
|
|
116
|
+
x: (x0 - rect.x) / k.x,
|
|
117
|
+
y: (y0 - rect.y) / k.y,
|
|
118
118
|
width: (x1 - x0) / k.x,
|
|
119
119
|
height: (y1 - y0) / k.y
|
|
120
|
-
},
|
|
121
|
-
center: {
|
|
122
|
-
x:
|
|
123
|
-
y:
|
|
124
|
-
},
|
|
120
|
+
}),
|
|
121
|
+
center: shownPointToPixels(item, {
|
|
122
|
+
x: (camera.x - rect.x) / k.x,
|
|
123
|
+
y: (camera.y - rect.y) / k.y
|
|
124
|
+
}),
|
|
125
125
|
target: chooseLevel(pyramid, imagePerDevice)
|
|
126
126
|
};
|
|
127
127
|
}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
function parseRotation(rotation) {
|
|
3
|
+
const match = /^(!)?(\d+(?:\.\d+)?)$/.exec((rotation == null ? void 0 : rotation.trim()) ?? "");
|
|
4
|
+
if (!match) return null;
|
|
5
|
+
const turned = Number(match[2]);
|
|
6
|
+
if (turned > 360) return null;
|
|
7
|
+
const degrees = turned % 360;
|
|
8
|
+
const mirror = Boolean(match[1]);
|
|
9
|
+
return degrees || mirror ? { degrees, mirror } : null;
|
|
10
|
+
}
|
|
2
11
|
function parseRegion(region, width, height) {
|
|
3
12
|
if (!region) return null;
|
|
4
13
|
let value = region.trim().replace(/^xywh=/, "");
|
|
@@ -26,5 +35,6 @@ function parseRegion(region, width, height) {
|
|
|
26
35
|
return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
|
|
27
36
|
}
|
|
28
37
|
export {
|
|
29
|
-
parseRegion
|
|
38
|
+
parseRegion,
|
|
39
|
+
parseRotation
|
|
30
40
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { compose, scale, translate, invert, apply } from "../math/affine.mjs";
|
|
3
|
+
import { union, transformRect } from "../math/rect.mjs";
|
|
4
|
+
import { parseRegion, parseRotation } from "./regions.mjs";
|
|
4
5
|
import { fetchInfo } from "../sources/imageService.mjs";
|
|
5
6
|
import { servicePyramid, staticPyramid, tilesInRegion } from "../sources/tilePyramid.mjs";
|
|
6
7
|
async function prepareItem(spec, context) {
|
|
@@ -37,6 +38,8 @@ async function prepareItem(spec, context) {
|
|
|
37
38
|
width: contentClip.width * toPixelsX,
|
|
38
39
|
height: contentClip.height * toPixelsY
|
|
39
40
|
};
|
|
41
|
+
const rotation = parseRotation(spec.rotation);
|
|
42
|
+
const turn = rotation ? turnOf(clip, rotation) : void 0;
|
|
40
43
|
const item = {
|
|
41
44
|
id: spec.id,
|
|
42
45
|
spec,
|
|
@@ -44,7 +47,8 @@ async function prepareItem(spec, context) {
|
|
|
44
47
|
size,
|
|
45
48
|
clip,
|
|
46
49
|
contentClip,
|
|
47
|
-
rect: { x: 0, y: 0, width: contentClip.width, height: contentClip.height }
|
|
50
|
+
rect: { x: 0, y: 0, width: contentClip.width, height: contentClip.height },
|
|
51
|
+
...turn ? { turn } : {}
|
|
48
52
|
};
|
|
49
53
|
await context.cache.prefetch(
|
|
50
54
|
tilesInRegion(pyramid, 0, clip).map((address) => {
|
|
@@ -80,35 +84,94 @@ function prepareMedia(spec, media) {
|
|
|
80
84
|
rect: { ...clip }
|
|
81
85
|
};
|
|
82
86
|
}
|
|
87
|
+
function turnOf(clip, { degrees, mirror }) {
|
|
88
|
+
const radians = degrees * Math.PI / 180;
|
|
89
|
+
const exact = (value) => Math.abs(value) < 1e-12 ? 0 : value;
|
|
90
|
+
const cos = exact(Math.cos(radians));
|
|
91
|
+
const sin = exact(Math.sin(radians));
|
|
92
|
+
const width = Math.abs(clip.width * cos) + Math.abs(clip.height * sin);
|
|
93
|
+
const height = Math.abs(clip.width * sin) + Math.abs(clip.height * cos);
|
|
94
|
+
const orient = compose(
|
|
95
|
+
translate(width / 2, height / 2),
|
|
96
|
+
{ a: cos, b: sin, c: -sin, d: cos, e: 0, f: 0 },
|
|
97
|
+
scale(mirror ? -1 : 1, 1),
|
|
98
|
+
translate(-(clip.x + clip.width / 2), -(clip.y + clip.height / 2))
|
|
99
|
+
);
|
|
100
|
+
return { orient, unorient: invert(orient), width, height };
|
|
101
|
+
}
|
|
102
|
+
function orientOf(item) {
|
|
103
|
+
var _a;
|
|
104
|
+
return ((_a = item.turn) == null ? void 0 : _a.orient) ?? translate(-item.clip.x, -item.clip.y);
|
|
105
|
+
}
|
|
106
|
+
function shownToPixels(item, rect) {
|
|
107
|
+
const { turn, clip } = item;
|
|
108
|
+
if (!turn) return { ...rect, x: clip.x + rect.x, y: clip.y + rect.y };
|
|
109
|
+
const box = transformRect(turn.unorient, rect);
|
|
110
|
+
const x = Math.max(box.x, clip.x);
|
|
111
|
+
const y = Math.max(box.y, clip.y);
|
|
112
|
+
return {
|
|
113
|
+
x,
|
|
114
|
+
y,
|
|
115
|
+
width: Math.max(0, Math.min(box.x + box.width, clip.x + clip.width) - x),
|
|
116
|
+
height: Math.max(0, Math.min(box.y + box.height, clip.y + clip.height) - y)
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function shownPointToPixels(item, point) {
|
|
120
|
+
const { turn, clip } = item;
|
|
121
|
+
return turn ? apply(turn.unorient, point) : { x: clip.x + point.x, y: clip.y + point.y };
|
|
122
|
+
}
|
|
123
|
+
function shownContent(item) {
|
|
124
|
+
const { turn, clip, contentClip } = item;
|
|
125
|
+
if (!turn) return contentClip;
|
|
126
|
+
return {
|
|
127
|
+
width: turn.width * contentClip.width / clip.width,
|
|
128
|
+
height: turn.height * contentClip.height / clip.height
|
|
129
|
+
};
|
|
130
|
+
}
|
|
83
131
|
function layoutItems(items) {
|
|
84
132
|
if (!items.length) return null;
|
|
85
133
|
if (items.every((item) => item.spec.placement)) {
|
|
86
134
|
for (const item of items) item.rect = { ...item.spec.placement };
|
|
87
135
|
return union(items.map((item) => item.rect));
|
|
88
136
|
}
|
|
89
|
-
const height = items[0].
|
|
137
|
+
const height = shownContent(items[0]).height;
|
|
90
138
|
let x = 0;
|
|
91
139
|
for (const item of items) {
|
|
92
|
-
const
|
|
140
|
+
const shown = shownContent(item);
|
|
141
|
+
const width = shown.width * height / shown.height;
|
|
93
142
|
item.rect = { x, y: 0, width, height };
|
|
94
143
|
x += width;
|
|
95
144
|
}
|
|
96
145
|
return { x: 0, y: 0, width: x, height };
|
|
97
146
|
}
|
|
98
147
|
function pixelsToWorld(item) {
|
|
148
|
+
const shown = item.turn ?? item.clip;
|
|
99
149
|
return {
|
|
100
|
-
x: item.rect.width /
|
|
101
|
-
y: item.rect.height /
|
|
150
|
+
x: item.rect.width / shown.width,
|
|
151
|
+
y: item.rect.height / shown.height
|
|
102
152
|
};
|
|
103
153
|
}
|
|
154
|
+
function itemToWorld(item) {
|
|
155
|
+
const k = pixelsToWorld(item);
|
|
156
|
+
return compose(
|
|
157
|
+
translate(item.rect.x, item.rect.y),
|
|
158
|
+
scale(k.x, k.y),
|
|
159
|
+
orientOf(item)
|
|
160
|
+
);
|
|
161
|
+
}
|
|
104
162
|
function sameSpec(a, b) {
|
|
105
163
|
var _a, _b;
|
|
106
|
-
return a.service === b.service && a.url === b.url && a.width === b.width && a.height === b.height && a.region === b.region && ((_a = a.media) == null ? void 0 : _a.element) === ((_b = b.media) == null ? void 0 : _b.element) && JSON.stringify(a.placement) === JSON.stringify(b.placement);
|
|
164
|
+
return a.service === b.service && a.url === b.url && a.width === b.width && a.height === b.height && a.region === b.region && a.rotation === b.rotation && ((_a = a.media) == null ? void 0 : _a.element) === ((_b = b.media) == null ? void 0 : _b.element) && JSON.stringify(a.placement) === JSON.stringify(b.placement);
|
|
107
165
|
}
|
|
108
166
|
export {
|
|
109
167
|
MEDIA_KEY_PREFIX,
|
|
168
|
+
itemToWorld,
|
|
110
169
|
layoutItems,
|
|
170
|
+
orientOf,
|
|
111
171
|
pixelsToWorld,
|
|
112
172
|
prepareItem,
|
|
113
|
-
sameSpec
|
|
173
|
+
sameSpec,
|
|
174
|
+
shownPointToPixels,
|
|
175
|
+
shownToPixels,
|
|
176
|
+
turnOf
|
|
114
177
|
};
|
package/dist/lib/time.mjs
CHANGED
|
@@ -15,7 +15,17 @@ function playFrom(element, seconds) {
|
|
|
15
15
|
} catch {
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
+
function parseTime(t) {
|
|
19
|
+
if (!t) return void 0;
|
|
20
|
+
const [rawStart, rawEnd] = t.split(",");
|
|
21
|
+
const start = Number(rawStart);
|
|
22
|
+
if (rawStart === "" || Number.isNaN(start)) return void 0;
|
|
23
|
+
if (rawEnd === void 0 || rawEnd === "") return { start };
|
|
24
|
+
const end = Number(rawEnd);
|
|
25
|
+
return Number.isNaN(end) ? { start } : { start, end };
|
|
26
|
+
}
|
|
18
27
|
export {
|
|
19
28
|
formatTime,
|
|
29
|
+
parseTime,
|
|
20
30
|
playFrom
|
|
21
31
|
};
|
package/dist/map/index.d.mts
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
// Generated by dts-bundle-generator v8.0.1
|
|
2
2
|
|
|
3
|
+
import * as P4 from '@iiif/parser/presentation-4/types';
|
|
3
4
|
import React from 'react';
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Clover's one data shape: IIIF Presentation 4.
|
|
8
|
+
*
|
|
9
|
+
* Every resource is upgraded to Presentation 4 on the way in, so no part is written for
|
|
10
|
+
* several shapes. Presentation 2.1 and 3.0 are upgraded by `@iiif/parser`; Presentation 4
|
|
11
|
+
* passes through untouched. The upgrader is imported on demand, so it costs nothing until
|
|
12
|
+
* the first resource that needs it arrives, and its reader of Presentation 2 only with
|
|
13
|
+
* the first resource in 2.
|
|
14
|
+
*/
|
|
15
|
+
export type Manifest = P4.Manifest;
|
|
16
|
+
export type Presentation4Collection = P4.Collection;
|
|
5
17
|
/**
|
|
6
18
|
* IIIF language maps as text: the closest language to the reader's, and that language's
|
|
7
19
|
* tag, so the text can carry a `lang` attribute.
|
|
@@ -13,7 +25,7 @@ export type LanguageMapLike = string | Record<string, string[] | string | undefi
|
|
|
13
25
|
* Only a look, never a read: the panel asks it to offer a Map tab, and the reading
|
|
14
26
|
* (`core/geo.ts`) belongs to the map entry, so an app without a map carries none of it.
|
|
15
27
|
*/
|
|
16
|
-
export declare function hasMapData(manifest: Manifest | null, collection?:
|
|
28
|
+
export declare function hasMapData(manifest: Manifest | null, collection?: Presentation4Collection | null): boolean;
|
|
17
29
|
/**
|
|
18
30
|
* Where a IIIF resource is, read for a map: navPlace (on a Collection, Manifest, Canvas
|
|
19
31
|
* or Annotation, and annotation bodies that are GeoJSON), and Georeference Extension
|
|
@@ -45,6 +57,12 @@ export interface MapFeature {
|
|
|
45
57
|
title?: string;
|
|
46
58
|
titleLang?: string;
|
|
47
59
|
canvasId?: string;
|
|
60
|
+
/** The annotation it is a body of (Cookbook 0139), which a press on it selects. */
|
|
61
|
+
annotationId?: string;
|
|
62
|
+
/** The Collection's member it locates (Cookbook 0318), which a press on it opens. */
|
|
63
|
+
manifestId?: string;
|
|
64
|
+
/** Its owner's `navDate`, as written, shown with its name (Cookbook 0318). */
|
|
65
|
+
navDate?: string;
|
|
48
66
|
};
|
|
49
67
|
}
|
|
50
68
|
export interface MapFeatureCollection {
|
|
@@ -73,12 +91,15 @@ export interface Georeference {
|
|
|
73
91
|
}
|
|
74
92
|
export type Json = Record<string, any>;
|
|
75
93
|
/**
|
|
76
|
-
* Every navPlace feature of the Root's resource: the Collection's,
|
|
94
|
+
* Every navPlace feature of the Root's resource: the Collection's, each of its members'
|
|
95
|
+
* (Cookbook 0318: a Collection of Manifests, each where it is), the Manifest's, each
|
|
77
96
|
* Canvas's, and each loaded annotation's (its `navPlace`, or a GeoJSON body as Cookbook
|
|
78
|
-
* 0139 has). A feature from a
|
|
79
|
-
* Manifest
|
|
97
|
+
* 0139 has). A feature from a member names that member, the open one's place its own
|
|
98
|
+
* Manifest's where it gives one, in the member's place in the Collection's order; one
|
|
99
|
+
* from a Canvas or annotation names that Canvas. Memoized on the Manifest (and the
|
|
100
|
+
* Collection), so the same collection comes back while nothing changes.
|
|
80
101
|
*/
|
|
81
|
-
export declare function navPlaceOf(manifest: Manifest | null, collection?:
|
|
102
|
+
export declare function navPlaceOf(manifest: Manifest | null, collection?: Presentation4Collection | null, language?: string): MapFeatureCollection;
|
|
82
103
|
/**
|
|
83
104
|
* One Georeference Extension annotation as an overlay: its control points, the extent
|
|
84
105
|
* they are measured in, its mask, and the image to draw (the Canvas's painted image, or
|
|
@@ -156,8 +177,8 @@ export interface MapProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSel
|
|
|
156
177
|
/** A MapLibre style URL, used as it is. Default: Clover's relief basemap (OpenFreeMap). */
|
|
157
178
|
styleUrl?: string;
|
|
158
179
|
/**
|
|
159
|
-
* Where MapLibre's worker is served from,
|
|
160
|
-
*
|
|
180
|
+
* Where MapLibre's worker is served from, to serve your own (see the Map docs). By
|
|
181
|
+
* default Clover brings it, from a `blob:` URL.
|
|
161
182
|
*/
|
|
162
183
|
workerUrl?: string;
|
|
163
184
|
/** Zoom with the wheel or trackpad. Default false, so an embedded map never traps page scroll. */
|
|
@@ -171,6 +192,18 @@ export interface MapProps extends Omit<React.HTMLAttributes<HTMLElement>, "onSel
|
|
|
171
192
|
request?: CloverRequest;
|
|
172
193
|
/** Standalone: the language to read IIIF text in. */
|
|
173
194
|
language?: string;
|
|
195
|
+
/**
|
|
196
|
+
* Clover's higher-contrast mode: the accent kept to rings, outlines and marks, and never
|
|
197
|
+
* under words or a glyph, where the controls' dark fill takes its place, edged in the
|
|
198
|
+
* accent. Inside a `Root`, the Root's too; on wherever the reader's system asks for more
|
|
199
|
+
* contrast. Default `false`.
|
|
200
|
+
*/
|
|
201
|
+
highContrast?: boolean;
|
|
202
|
+
/**
|
|
203
|
+
* The basemap's credits, behind an ⓘ in the map's lower corner. Default true. A basemap's license
|
|
204
|
+
* may ask for its credits: give them on the page yourself before setting this false.
|
|
205
|
+
*/
|
|
206
|
+
credits?: boolean;
|
|
174
207
|
as?: React.ElementType;
|
|
175
208
|
}
|
|
176
209
|
declare const CloverMap: React.ForwardRefExoticComponent<MapProps & React.RefAttributes<HTMLElement>>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { loadManifest } from "../core/load.mjs";
|
|
3
|
+
const fetched = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function fetchManifest(clover, id) {
|
|
5
|
+
let byId = fetched.get(clover);
|
|
6
|
+
if (!byId) fetched.set(clover, byId = /* @__PURE__ */ new Map());
|
|
7
|
+
let manifest = byId.get(id);
|
|
8
|
+
if (!manifest) {
|
|
9
|
+
manifest = loadManifest(
|
|
10
|
+
{ id, type: "Manifest" },
|
|
11
|
+
{ request: clover.request }
|
|
12
|
+
).catch(() => null);
|
|
13
|
+
byId.set(id, manifest);
|
|
14
|
+
}
|
|
15
|
+
return manifest;
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
fetchManifest
|
|
19
|
+
};
|
package/dist/react/hooks.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useMemo } from "react";
|
|
3
|
-
import { selectAnnotationSets } from "../core/annotation-sets.mjs";
|
|
3
|
+
import { selectAnnotationCollection, selectAnnotationSets } from "../core/annotation-sets.mjs";
|
|
4
4
|
import { navigationOf } from "../core/clover.mjs";
|
|
5
5
|
import { selectPosition, selectSequence, selectVisibleCanvases, selectCanvas } from "../core/selectors.mjs";
|
|
6
6
|
import { localize } from "../core/value.mjs";
|
|
@@ -40,6 +40,11 @@ function useNavigation() {
|
|
|
40
40
|
[clover, position, total]
|
|
41
41
|
);
|
|
42
42
|
}
|
|
43
|
+
function useAnnotationCollection() {
|
|
44
|
+
return useCloverSelector(
|
|
45
|
+
(state) => selectAnnotationCollection(state.manifest, state.addedSets)
|
|
46
|
+
);
|
|
47
|
+
}
|
|
43
48
|
function useAnnotationSets() {
|
|
44
49
|
return useCloverSelector(
|
|
45
50
|
(state) => selectAnnotationSets(state.manifest, state.addedSets)
|
|
@@ -57,6 +62,7 @@ function useLangOf() {
|
|
|
57
62
|
}
|
|
58
63
|
export {
|
|
59
64
|
useActiveCanvas,
|
|
65
|
+
useAnnotationCollection,
|
|
60
66
|
useAnnotationSets,
|
|
61
67
|
useLangOf,
|
|
62
68
|
useLocalized,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { descriptionLanguages, startingLanguage } from "../core/language-choice.mjs";
|
|
4
|
+
import { useClover, useCloverSelector } from "./context.mjs";
|
|
5
|
+
function useReadingLanguages() {
|
|
6
|
+
const { language, chooseLanguage } = useClover("About");
|
|
7
|
+
const manifest = useCloverSelector(
|
|
8
|
+
(state) => state.manifest
|
|
9
|
+
);
|
|
10
|
+
const languages = useMemo(() => descriptionLanguages(manifest), [manifest]);
|
|
11
|
+
const chosen = startingLanguage(languages, language);
|
|
12
|
+
return chosen && chooseLanguage ? { languages, chosen, onChange: chooseLanguage } : null;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
useReadingLanguages
|
|
16
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useEffect, useCallback } from "react";
|
|
3
|
+
import { findEntry, selectManifestSets } from "../core/annotation-sets.mjs";
|
|
4
|
+
import { selectVisibleCanvases } from "../core/selectors.mjs";
|
|
5
|
+
import { useClover, useCloverSelector } from "./context.mjs";
|
|
6
|
+
function usePagesReached(pages) {
|
|
7
|
+
const { clover } = useClover("Annotations");
|
|
8
|
+
const pickedPage = useCloverSelector(
|
|
9
|
+
(state) => {
|
|
10
|
+
var _a;
|
|
11
|
+
return state.annotationId ? (_a = findEntry(selectManifestSets(state.manifest), state.annotationId)) == null ? void 0 : _a.setId : void 0;
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
const visible = useCloverSelector(
|
|
15
|
+
(state) => selectVisibleCanvases(state.manifest, state.canvasId)
|
|
16
|
+
);
|
|
17
|
+
const [reached, setReached] = useState(0);
|
|
18
|
+
const run = pages.findIndex((page) => !page.fetched);
|
|
19
|
+
const loaded = run === -1 ? pages.length : run;
|
|
20
|
+
const viewPage = pages.reduce(
|
|
21
|
+
(last, page, index) => visible.some((canvas) => canvas.id === page.canvasId) ? index : last,
|
|
22
|
+
-1
|
|
23
|
+
);
|
|
24
|
+
const upTo = Math.max(
|
|
25
|
+
reached,
|
|
26
|
+
pages.findIndex((page) => page.id === pickedPage),
|
|
27
|
+
viewPage,
|
|
28
|
+
0
|
|
29
|
+
);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
const missing = pages.slice(0, upTo + 1).filter((page) => !page.fetched).map((page) => page.id);
|
|
32
|
+
if (missing.length) clover.fetchAnnotationPages(missing);
|
|
33
|
+
}, [clover, pages, upTo]);
|
|
34
|
+
const reachNext = useCallback(
|
|
35
|
+
() => setReached((was) => Math.max(was, loaded)),
|
|
36
|
+
[loaded]
|
|
37
|
+
);
|
|
38
|
+
return { loaded, more: loaded < pages.length, reachNext };
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
usePagesReached
|
|
42
|
+
};
|