@nulib/clover 4.1.0 → 4.3.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 +1 -1
- package/dist/components/Body/useControlsVisibility.mjs +35 -13
- package/dist/components/Canvas/CanvasView.mjs +33 -4
- package/dist/components/Canvas/ChaptersMenu.mjs +6 -1
- package/dist/components/Canvas/ControlMenu.mjs +9 -2
- package/dist/components/Canvas/Controls.mjs +17 -4
- package/dist/components/Canvas/FrameAnimation.mjs +3 -0
- package/dist/components/Canvas/ImageControls.mjs +8 -3
- package/dist/components/Canvas/Placeholder.mjs +5 -2
- package/dist/components/Canvas/RowFits.mjs +3 -1
- package/dist/components/Canvas/media/MediaBody.mjs +3 -0
- package/dist/components/Canvas/media/Player.mjs +3 -0
- package/dist/components/Canvas/media/Transport.mjs +3 -0
- package/dist/components/Canvas/media/useMediaElement.mjs +32 -9
- package/dist/components/Items/masonry.mjs +2 -0
- package/dist/components/Map/MapView.mjs +42 -2
- package/dist/components/Map/maplibre-sheet.mjs +5 -0
- package/dist/components/Map/sheet.mjs +19 -0
- package/dist/components/Map/worker.mjs +28 -1
- package/dist/components/Panel/Panel.mjs +47 -59
- package/dist/components/Panel/sections.mjs +62 -0
- package/dist/components/Scene/SceneView.mjs +3 -0
- package/dist/core/content-state.mjs +1 -11
- package/dist/core/load.mjs +9 -1
- package/dist/core/presentation.mjs +4 -5
- package/dist/core/sanitize.mjs +15 -3
- package/dist/core/svg-shape.mjs +2 -1
- package/dist/core/thumbnail.mjs +15 -4
- package/dist/core/trusted.mjs +26 -0
- package/dist/core/vtt.mjs +20 -9
- package/dist/index.d.mts +269 -6
- package/dist/index.mjs +13 -0
- package/dist/lib/pointer.mjs +1 -1
- package/dist/lib/renderer/CanvasRenderer.mjs +48 -7
- package/dist/lib/renderer/camera/CameraAnimator.mjs +39 -20
- package/dist/lib/renderer/input/GestureController.mjs +15 -5
- package/dist/map/index.d.mts +6 -1
- package/dist/styles/collection-select.css +1 -0
- package/dist/styles/core.css +1 -0
- package/dist/styles/default.css +1 -0
- package/dist/styles/items.css +1 -0
- package/dist/styles/map.css +1 -0
- package/dist/styles/media.css +1 -0
- package/dist/styles/panel.css +1 -0
- package/dist/styles/scene.css +1 -0
- package/dist/styles/split.css +1 -0
- package/dist/styles.css +1 -1
- package/dist/templates/default/Default.mjs +7 -0
- package/dist/templates/document/Document.mjs +22 -3
- package/dist/templates/document/Sheets.mjs +2 -0
- package/dist/templates/gallery/Gallery.mjs +7 -1
- package/dist/templates/index.d.mts +167 -6
- package/dist/templates/shared/Lightbox.mjs +50 -3
- package/dist/templates/shared/LightboxView.mjs +8 -1
- package/dist/templates/shared/PanelPane.mjs +13 -1
- package/dist/templates.css +1 -1
- package/dist/ui/Button.mjs +3 -1
- package/dist/ui/ControlCluster.mjs +6 -3
- package/dist/ui/Markup.mjs +8 -7
- package/dist/ui/Tip.mjs +6 -1
- package/dist/ui/adoptSheet.mjs +19 -0
- package/dist/ui/sheets/map.mjs +5 -0
- package/dist/ui/sheets/media.mjs +5 -0
- package/dist/ui/sheets/scene.mjs +5 -0
- package/dist/web-components/{About-DvyvVUK5.mjs → About-uNCjvWgs.mjs} +1 -1
- package/dist/web-components/{AnnotationItems-BpRcSrOM.mjs → AnnotationItems-JwlcCvPo.mjs} +1 -1
- package/dist/web-components/{AnnotationMenu-BDPec3iI.mjs → AnnotationMenu-BWyKEyvW.mjs} +1 -1
- package/dist/web-components/{AnnotationState-Chs_37Kk.mjs → AnnotationState-Bhqs75Br.mjs} +1 -1
- package/dist/web-components/{Annotations-CLPEq7Ro.mjs → Annotations-C7y0N8Lj.mjs} +1 -1
- package/dist/web-components/{Annotations-6E-oD_wg.mjs → Annotations-ZwcRh2UE.mjs} +2 -2
- package/dist/web-components/{Body-Ct61yxI7.mjs → Body-DyrvRDkt.mjs} +1 -1
- package/dist/web-components/{BodyAlert-C_Qh3Up_.mjs → BodyAlert-XV88XjL8.mjs} +1 -1
- package/dist/web-components/Button-BIaw5k1q.mjs +1 -0
- package/dist/web-components/{Camera-BPyLzZjP.mjs → Camera-7SlnmGtb.mjs} +1 -1
- package/dist/web-components/{Canvas2DBackend-8wFavYdl.mjs → Canvas2DBackend-DBGZRGid.mjs} +1 -1
- package/dist/web-components/CanvasView-CmDxczm9.mjs +2 -0
- package/dist/web-components/{CaptionDetails-DuwS-grE.mjs → CaptionDetails-Bxz8AXMz.mjs} +1 -1
- package/dist/web-components/ChaptersMenu-CMQiBqvx.mjs +1 -0
- package/dist/web-components/{Chevron-Cyr_cc9X.mjs → Chevron-B3XaClVT.mjs} +1 -1
- package/dist/web-components/{ChoiceMenu-ConzybVH.mjs → ChoiceMenu-pugo5zxI.mjs} +1 -1
- package/dist/web-components/{Collection-CLayN8sv.mjs → Collection-Ch_FeSKp.mjs} +1 -1
- package/dist/web-components/{CollectionSelect-D2d8dGJ4.mjs → CollectionSelect-2jDEkOcK.mjs} +1 -1
- package/dist/web-components/{Connected-CBQ6xyhr.mjs → Connected-3hnIPSWM.mjs} +1 -1
- package/dist/web-components/{Connected-DMXG3imZ.mjs → Connected-Bne3I5E1.mjs} +1 -1
- package/dist/web-components/{Connected-pyd0EBD3.mjs → Connected-DuANHN93.mjs} +1 -1
- package/dist/web-components/{Contents-tCMXBYDK.mjs → Contents-DIQrin_-.mjs} +1 -1
- package/dist/web-components/ControlMenu-BydnCTTQ.mjs +1 -0
- package/dist/web-components/ControlsFade-CleBsk-W.mjs +1 -0
- package/dist/web-components/CountMenu-CReBYVwu.mjs +1 -0
- package/dist/web-components/Cue-2zGQuUOC.mjs +1 -0
- package/dist/web-components/Document-pjc2qOX4.mjs +1 -0
- package/dist/web-components/{DomLayers-BxPU05-D.mjs → DomLayers-D9X_FPto.mjs} +1 -1
- package/dist/web-components/{Download-Bku9Vptk.mjs → Download-B8MpVqgk.mjs} +1 -1
- package/dist/web-components/{EntryBodies-77vDudCb.mjs → EntryBodies-DdpRfU5U.mjs} +1 -1
- package/dist/web-components/{EntryThumbnail-BxQWKW6e.mjs → EntryThumbnail-DM7Zjj1z.mjs} +1 -1
- package/dist/web-components/{FieldPill-nFGsaru9.mjs → FieldPill-BAql8_6s.mjs} +1 -1
- package/dist/web-components/{FrameAnimation-BvKiSXcm.mjs → FrameAnimation-Dj46RxuL.mjs} +1 -1
- package/dist/web-components/Gallery-B9FNA02Z.mjs +1 -0
- package/dist/web-components/{HideToggle-TEhY4TS4.mjs → HideToggle-duXvDvDw.mjs} +1 -1
- package/dist/web-components/ImageControls-DODKjC0d.mjs +1 -0
- package/dist/web-components/{Items-CudZ4Lnb.mjs → Items-BHTQJU7T.mjs} +1 -1
- package/dist/web-components/{Label-f07N5Fld.mjs → Label-D4dlrtpH.mjs} +1 -1
- package/dist/web-components/{LanguageChoice-B5VM21DV.mjs → LanguageChoice-DR3X-dtJ.mjs} +1 -1
- package/dist/web-components/LightboxView-D-aBaKfB.mjs +1 -0
- package/dist/web-components/{ListEnd-M39M62Cl.mjs → ListEnd-CQ4vX-NW.mjs} +1 -1
- package/dist/web-components/{Loaded-oGFyBuos.mjs → Loaded-DsNSPXWf.mjs} +1 -1
- package/dist/web-components/{LoadedCanvas-IvpSzPO6.mjs → LoadedCanvas-Cq7_O2bw.mjs} +1 -1
- package/dist/web-components/LoadedMap-0_prxuA4.mjs +1 -0
- package/dist/web-components/{Loading-YxuKrDAM.mjs → Loading-4PmhMeZ-.mjs} +1 -1
- package/dist/web-components/{Map-Cw9j3gi3.mjs → Map-B29Ba50b.mjs} +1 -1
- package/dist/web-components/MapView-nHeg39Kz.mjs +3 -0
- package/dist/web-components/Markup-BZ7l5GbG.mjs +2 -0
- package/dist/web-components/MediaBody-DH-rr_0N.mjs +1 -0
- package/dist/web-components/{MediaBody-JnKnoIqY.mjs → MediaBody-eSThjFzH.mjs} +1 -1
- package/dist/web-components/{NavDate-BCCOyycx.mjs → NavDate-0MsHRjBW.mjs} +1 -1
- package/dist/web-components/{Navigator-Bx4zS0Yr.mjs → Navigator-qJ79A8Nk.mjs} +1 -1
- package/dist/web-components/{Pager-B9GvQ64b.mjs → Pager-SPd_u0qz.mjs} +1 -1
- package/dist/web-components/{PagerLayout-BF33VZL_.mjs → PagerLayout-CkSwDAnp.mjs} +1 -1
- package/dist/web-components/Panel-C8r3EsWn.mjs +1 -0
- package/dist/web-components/PanelPart-BA1NoeLA.mjs +1 -0
- package/dist/web-components/{PanelToggle-bPcIULGZ.mjs → PanelToggle-CrKP8BqE.mjs} +1 -1
- package/dist/web-components/{PartOfManifest-HLg-r00O.mjs → PartOfManifest-BdDSxK4k.mjs} +1 -1
- package/dist/web-components/{Pending-BxGjjnqq.mjs → Pending-CmgVU1kF.mjs} +1 -1
- package/dist/web-components/{PlaceBox-D-Zhe9-U.mjs → PlaceBox-D7HLNGxE.mjs} +1 -1
- package/dist/web-components/Placeholder-DVAlXejQ.mjs +1 -0
- package/dist/web-components/{Position-TYnzcm8e.mjs → Position-C6KUAceQ.mjs} +1 -1
- package/dist/web-components/{Primitives-C6VJXxZD.mjs → Primitives-ClQVjY6x.mjs} +1 -1
- package/dist/web-components/{Provider-DyB0wpeO.mjs → Provider-C0IUdU6v.mjs} +1 -1
- package/dist/web-components/{ReadMore-De_0T7lc.mjs → ReadMore-BiEJA4yO.mjs} +1 -1
- package/dist/web-components/Root-Drt5N4_s.mjs +1 -0
- package/dist/web-components/Scene-C7t16NjC.mjs +1 -0
- package/dist/web-components/SceneView-BHg37-rs.mjs +1 -0
- package/dist/web-components/{Search-DgT8OPsK.mjs → Search-Bpd_lGzH.mjs} +1 -1
- package/dist/web-components/{Sections-d1acn7qm.mjs → Sections-D_bS5IQH.mjs} +1 -1
- package/dist/web-components/{StandaloneItems-DUb4YKCB.mjs → StandaloneItems-YV9O9M8F.mjs} +1 -1
- package/dist/web-components/{Status-CcU3u6P4.mjs → Status-BCG7AN9B.mjs} +1 -1
- package/dist/web-components/{Steps-nlSCzbDQ.mjs → Steps-Dnn8Ajqf.mjs} +1 -1
- package/dist/web-components/TargetItems-xxbtePln.mjs +1 -0
- package/dist/web-components/Timeline-Danuk_Nn.mjs +1 -0
- package/dist/web-components/Tip-DPFWlNLu.mjs +1 -0
- package/dist/web-components/{Transcript-bSA3cx_K.mjs → Transcript-C-_DbUO5.mjs} +1 -1
- package/dist/web-components/{Transport-DjOYI-fR.mjs → Transport-BKona8RD.mjs} +1 -1
- package/dist/web-components/Transport-Bonmu77-.mjs +1 -0
- package/dist/web-components/{annotation-collection-D8emkElk.mjs → annotation-collection-nmxzo_hO.mjs} +1 -1
- package/dist/web-components/{annotation-name-DbWjhgra.mjs → annotation-name-DoUUo-8D.mjs} +1 -1
- package/dist/web-components/{annotations-content-Bg6aVAGC.mjs → annotations-content-Cl1upbdd.mjs} +1 -1
- package/dist/web-components/{body-Ct8dmQdW.mjs → body-DC8Oq8rY.mjs} +1 -1
- package/dist/web-components/{canvas-goEZLqEd.mjs → canvas-gzoTnBxw.mjs} +1 -1
- package/dist/web-components/{cloverEngine-Df7cMwOP.mjs → cloverEngine-CFL1Bd7n.mjs} +1 -1
- package/dist/web-components/{content-state-reader-CNmBpG1L.mjs → content-state-reader-DYbmXxCp.mjs} +1 -1
- package/dist/web-components/controlGlyphs-d7KUIUwi.mjs +1 -0
- package/dist/web-components/{controls-BZr16sYQ.mjs → controls-VC9D1mwr.mjs} +1 -1
- package/dist/web-components/custom-elements.json +41 -3
- package/dist/web-components/{downloads-EjJ6Hpip.mjs → downloads-D2cnWDbs.mjs} +1 -1
- package/dist/web-components/{dragToClose-X9NbZOhA.mjs → dragToClose-CzYeh_12.mjs} +1 -1
- package/dist/web-components/{engine-DMoc0tff.mjs → engine-Dcfyp2DV.mjs} +1 -1
- package/dist/web-components/{engines-BmB81VXR.mjs → engines-BMr7naGM.mjs} +1 -1
- package/dist/web-components/{fetchManifest-CwQC6cCh.mjs → fetchManifest-DxptUh4u.mjs} +1 -1
- package/dist/web-components/{fromManifest-DrAmY1lB.mjs → fromManifest-BpPFLVyZ.mjs} +1 -1
- package/dist/web-components/{glyphs-BFK_hvJJ.mjs → glyphs-BCnJl8py.mjs} +1 -1
- package/dist/web-components/hooks-Dz_5UXXp.mjs +1 -0
- package/dist/web-components/{image-layers-D2nQC4R-.mjs → image-layers-BPnq7jk1.mjs} +1 -1
- package/dist/web-components/{imageService-iFElsopt.mjs → imageService-DFPkPNfe.mjs} +1 -1
- package/dist/web-components/index-ClM6Kq8w.mjs +1 -0
- package/dist/web-components/index.d.mts +5 -3
- package/dist/web-components/index.mjs +1 -1
- package/dist/web-components/items-BHporT5i.mjs +1 -0
- package/dist/web-components/{items-BnEnc5ot.mjs → items-D03KhDg6.mjs} +1 -1
- package/dist/web-components/label-r0ki6r1U.mjs +1 -0
- package/dist/web-components/{layout-Djwu8f4R.mjs → layout-DVa_DnGH.mjs} +1 -1
- package/dist/web-components/{link-0lUlTZlw.mjs → link-DxXxMXiw.mjs} +1 -1
- package/dist/web-components/logo-Br42Vlsk.mjs +1 -0
- package/dist/web-components/maplibre-sheet-CfiZ6JFk.mjs +1 -0
- package/dist/web-components/masonry-BZCdA3bV.mjs +1 -0
- package/dist/web-components/{models-BF2pqufA.mjs → models-pO77sm3z.mjs} +1 -1
- package/dist/web-components/{nodes-ChQRLDGU.mjs → nodes-CmL3eoRE.mjs} +1 -1
- package/dist/web-components/{overlayImage-MKrcgDep.mjs → overlayImage-DFGetjMh.mjs} +1 -1
- package/dist/web-components/{panel-C13V6w6E.mjs → panel-B1vzUm6_.mjs} +1 -1
- package/dist/web-components/part-DmRBh4pf.mjs +1 -0
- package/dist/web-components/{playerSurface-DG1XipTq.mjs → playerSurface-CQ1wrIAQ.mjs} +1 -1
- package/dist/web-components/pointer-DWnCT3D3.mjs +1 -0
- package/dist/web-components/{provider-DiUkZYiW.mjs → provider-U7xzX_0T.mjs} +1 -1
- package/dist/web-components/{range-regions-CqGjyM76.mjs → range-regions-Di_lmVqZ.mjs} +1 -1
- package/dist/web-components/{read-more-D8RJYdtQ.mjs → read-more-BtA1sriO.mjs} +1 -1
- package/dist/web-components/{readingLanguages-BWOLZK2k.mjs → readingLanguages-Ptho-Co9.mjs} +1 -1
- package/dist/web-components/rendererSurface-BgZPnAwj.mjs +22 -0
- package/dist/web-components/{renderers-LtRX5pT0.mjs → renderers-hoD3WKYA.mjs} +1 -1
- package/dist/web-components/{resource-Cfydiy4m.mjs → resource-DuTMsPEj.mjs} +1 -1
- package/dist/web-components/{sanitize-qIOeyIww.mjs → sanitize-BedC_UE5.mjs} +3 -3
- package/dist/web-components/{save-file-dZyOpXgY.mjs → save-file-CLB5IM4a.mjs} +1 -1
- package/dist/web-components/{search-BfUZJM3a.mjs → search-Dd2Y1dsZ.mjs} +1 -1
- package/dist/web-components/shared-CCg1Iag8.mjs +1 -0
- package/dist/web-components/{show-link-DgLJzG7k.mjs → show-link-NjacLIdz.mjs} +1 -1
- package/dist/web-components/{sizedImage-NHzhcBYk.mjs → sizedImage-CKOGmqhN.mjs} +1 -1
- package/dist/web-components/{split-CuFiKjin.mjs → split-CcoXZcGX.mjs} +1 -1
- package/dist/web-components/{status-C3etlkhY.mjs → status-B4a3Izph.mjs} +1 -1
- package/dist/web-components/styles-C7PVxtkQ.mjs +1 -0
- package/dist/web-components/svg-shape-D1K-WNrY.mjs +1 -0
- package/dist/web-components/three.mjs +1 -1
- package/dist/web-components/thumbnail-ez20ssEY.mjs +1 -0
- package/dist/web-components/{tip-D5YgaIWW.mjs → tip-DeFPN33O.mjs} +1 -1
- package/dist/web-components/{toggle-CZGB65VZ.mjs → toggle-CGSnnjW-.mjs} +1 -1
- package/dist/web-components/trusted-Bvpx307M.mjs +1 -0
- package/dist/web-components/{useContainerName-hKQjEt7a.mjs → useContainerName-BfyeBf6_.mjs} +1 -1
- package/dist/web-components/useControlsVisibility-oRiMiQhD.mjs +1 -0
- package/dist/web-components/useLazyPanelPane-CReKsr8z.mjs +1 -0
- package/dist/web-components/{useNearViewport-CDbHQUBk.mjs → useNearViewport-BADiMpLi.mjs} +1 -1
- package/dist/web-components/{useScrollTrack-D9l_P3_B.mjs → useScrollTrack-9QsMaHSx.mjs} +1 -1
- package/dist/web-components/viewer/{AnnotationItems-DtsnDXPM.mjs → AnnotationItems-Cvh3jfmf.mjs} +1 -1
- package/dist/web-components/viewer/{AnnotationMenu-C-Mz6CCn.mjs → AnnotationMenu-d5PT7q8D.mjs} +1 -1
- package/dist/web-components/viewer/{AnnotationState-5pim5K72.mjs → AnnotationState-DbtYTHMy.mjs} +1 -1
- package/dist/web-components/viewer/{Annotations-Cqn1TkzD.mjs → Annotations-DKWYJOo2.mjs} +2 -2
- package/dist/web-components/viewer/{Annotations-CxwN9FkB.mjs → Annotations-D_wg4O99.mjs} +1 -1
- package/dist/web-components/viewer/{Canvas2DBackend-C-ZMSCak.mjs → Canvas2DBackend-B4IXvdsN.mjs} +1 -1
- package/dist/web-components/viewer/{CaptionDetails-CRD-gSZP.mjs → CaptionDetails-Bxh9VD7n.mjs} +1 -1
- package/dist/web-components/viewer/ChaptersMenu-CaAIaRZN.mjs +1 -0
- package/dist/web-components/viewer/{ChoiceMenu-ByGzQQx1.mjs → ChoiceMenu-Clp4Zeog.mjs} +1 -1
- package/dist/web-components/viewer/{Collection-m0GCcsfQ.mjs → Collection-C5BfoUOH.mjs} +1 -1
- package/dist/web-components/viewer/Connected-9VGl2Xnx.mjs +1 -0
- package/dist/web-components/viewer/{Connected-Dvx7wtot.mjs → Connected-Cd2qwuuo.mjs} +1 -1
- package/dist/web-components/viewer/{Contents-CwDpfiJY.mjs → Contents-CsG9e7v2.mjs} +1 -1
- package/dist/web-components/viewer/ControlMenu-q_u_UC8q.mjs +1 -0
- package/dist/web-components/viewer/ControlsFade-Db3IWArv.mjs +1 -0
- package/dist/web-components/viewer/CountMenu-Dn0-z5A9.mjs +1 -0
- package/dist/web-components/viewer/Cue-slOJQhPI.mjs +1 -0
- package/dist/web-components/viewer/Document-r3Sz3RfH.mjs +1 -0
- package/dist/web-components/viewer/{DomLayers-hc0qARQc.mjs → DomLayers-CwHg1jZg.mjs} +1 -1
- package/dist/web-components/viewer/{Download-MO-1Rik4.mjs → Download-Clx_e2ga.mjs} +1 -1
- package/dist/web-components/viewer/{EntryBodies-g-OEwEsk.mjs → EntryBodies-B4SnV6NJ.mjs} +1 -1
- package/dist/web-components/viewer/{EntryThumbnail-DcIDYATi.mjs → EntryThumbnail-CsAqKh38.mjs} +1 -1
- package/dist/web-components/viewer/{FieldPill-B9S21lxw.mjs → FieldPill-NQfq8SXA.mjs} +1 -1
- package/dist/web-components/viewer/{FrameAnimation-qI9cZPEs.mjs → FrameAnimation-wN2VNW7D.mjs} +1 -1
- package/dist/web-components/viewer/Gallery-nX9kQlft.mjs +1 -0
- package/dist/web-components/viewer/{HideToggle-D8wH49mq.mjs → HideToggle-B843JuKU.mjs} +1 -1
- package/dist/web-components/viewer/ImageControls--qeUY5kg.mjs +1 -0
- package/dist/web-components/viewer/{LanguageChoice-CRqsCBAp.mjs → LanguageChoice-CZ6K3Mhv.mjs} +1 -1
- package/dist/web-components/viewer/LightboxView-BcbP3cJD.mjs +1 -0
- package/dist/web-components/viewer/{ListEnd-D9Obxie4.mjs → ListEnd-DbYDv46a.mjs} +1 -1
- package/dist/web-components/viewer/MapView-Dj7Iq7P2.mjs +3 -0
- package/dist/web-components/viewer/MediaBody-TN4XsCm7.mjs +1 -0
- package/dist/web-components/viewer/{MediaBody-D5ff6xy-.mjs → MediaBody-iAxGgXNy.mjs} +1 -1
- package/dist/web-components/viewer/{NavDate-BnfDG57h.mjs → NavDate-Clj6OMa6.mjs} +1 -1
- package/dist/web-components/viewer/{Navigator-BNwjmkXY.mjs → Navigator-DPdR3SYX.mjs} +1 -1
- package/dist/web-components/viewer/{PagerLayout-C8jraHqs.mjs → PagerLayout-CtlmDRjI.mjs} +1 -1
- package/dist/web-components/viewer/PanelPart-DzZWRlK1.mjs +1 -0
- package/dist/web-components/viewer/{PartOfManifest-DX7H0V4g.mjs → PartOfManifest-NAXs2DYd.mjs} +1 -1
- package/dist/web-components/viewer/{PlaceBox-CCWfzsNU.mjs → PlaceBox-C2k5Fsfo.mjs} +1 -1
- package/dist/web-components/viewer/Placeholder-DF6dRMjt.mjs +1 -0
- package/dist/web-components/viewer/{Search-CsdYzdq1.mjs → Search-DoUc8tWu.mjs} +1 -1
- package/dist/web-components/viewer/{StandaloneItems-BfvBxbUm.mjs → StandaloneItems-DuXasJO0.mjs} +1 -1
- package/dist/web-components/viewer/{Steps-BH8ZApS4.mjs → Steps-B3MrG4Cv.mjs} +1 -1
- package/dist/web-components/viewer/TargetItems-DOFSQtYR.mjs +1 -0
- package/dist/web-components/viewer/{Transcript-DXLv5WR9.mjs → Transcript-Dy-FHWMo.mjs} +1 -1
- package/dist/web-components/viewer/Transport-C5wkxVOF.mjs +1 -0
- package/dist/web-components/viewer/{Transport-C-fh7Kx2.mjs → Transport-CUXmY_jW.mjs} +1 -1
- package/dist/web-components/viewer/{annotation-collection-Cjd8Dgyl.mjs → annotation-collection-A0PNdPhI.mjs} +1 -1
- package/dist/web-components/viewer/annotation-name-CfQs7Mb2.mjs +1 -0
- package/dist/web-components/viewer/{annotations-content-BARXoAz-.mjs → annotations-content-B52-zM99.mjs} +1 -1
- package/dist/web-components/viewer/{cloverEngine-CumnJPKO.mjs → cloverEngine-4sgpB7Rz.mjs} +1 -1
- package/dist/web-components/viewer/{content-state-reader-DuvyLThu.mjs → content-state-reader-vtATl-W3.mjs} +1 -1
- package/dist/web-components/viewer/{dragToClose-CFCxhUxn.mjs → dragToClose-B4rj1D3r.mjs} +1 -1
- package/dist/web-components/viewer/{fetchManifest-qNB_KgxL.mjs → fetchManifest-gAj8phm4.mjs} +1 -1
- package/dist/web-components/viewer/{host-GTHX2fPK.mjs → host-Hv8WXfiF.mjs} +1 -1
- package/dist/web-components/viewer/{image-layers-DKOuaRTj.mjs → image-layers-gFEDKVkV.mjs} +1 -1
- package/dist/web-components/viewer/index.mjs +1 -1
- package/dist/web-components/viewer/{link-BlaM0tCa.mjs → link-DIh6ysyo.mjs} +1 -1
- package/dist/web-components/viewer/{overlayImage-RVpv69R5.mjs → overlayImage-BRjcH40Q.mjs} +1 -1
- package/dist/web-components/viewer/{range-regions-CIZiAHOp.mjs → range-regions-uPqjKIER.mjs} +1 -1
- package/dist/web-components/viewer/{renderers-Dw1klwlx.mjs → renderers-C5EfPrd7.mjs} +1 -1
- package/dist/web-components/viewer/{save-file-EvzaBEJN.mjs → save-file-dIa0LCAn.mjs} +1 -1
- package/dist/web-components/viewer/{search-x1QL_bth.mjs → search-Bbv9dCNq.mjs} +1 -1
- package/dist/web-components/viewer/styles-L1HpSoL2.mjs +1 -0
- package/dist/web-components/viewer/useControlsVisibility-jopIdHZi.mjs +1 -0
- package/dist/web-components/viewer/useLazyPanelPane-CoPgtYkx.mjs +1 -0
- package/dist/web-components/viewer/viewer-DqpSyvH-.mjs +29 -0
- package/dist/web-components/viewer/vtt-DpgB_K8v.mjs +5 -0
- package/dist/web-components/viewer-D2lGdifc.mjs +1 -0
- package/dist/web-components/vtt-KUQbi4PK.mjs +5 -0
- package/dist/web-components/worker-C9aVbya_.mjs +1 -0
- package/package.json +2 -1
- package/dist/web-components/Button-L8ZMy5lY.mjs +0 -1
- package/dist/web-components/CanvasView-2Fj9nT06.mjs +0 -2
- package/dist/web-components/ChaptersMenu-Bj2EqtVJ.mjs +0 -1
- package/dist/web-components/ControlMenu-D1zkB0qX.mjs +0 -1
- package/dist/web-components/ControlsFade-BNXVTL_Q.mjs +0 -1
- package/dist/web-components/CountMenu-Dnzb7lKo.mjs +0 -1
- package/dist/web-components/Cue-CUGmPS3k.mjs +0 -1
- package/dist/web-components/Document-D-8nalCX.mjs +0 -1
- package/dist/web-components/Gallery-4Hd58afA.mjs +0 -1
- package/dist/web-components/ImageControls-CZO7WoPb.mjs +0 -1
- package/dist/web-components/LightboxView-C4OASmkg.mjs +0 -1
- package/dist/web-components/LoadedMap-WATGNLxl.mjs +0 -1
- package/dist/web-components/MapView-3OxoCr5l.mjs +0 -3
- package/dist/web-components/Markup-DW75Jx3j.mjs +0 -2
- package/dist/web-components/MediaBody-CLtd0bf0.mjs +0 -1
- package/dist/web-components/Panel-BvDpCn6K.mjs +0 -1
- package/dist/web-components/PanelPart-Bd4lSUrP.mjs +0 -1
- package/dist/web-components/Placeholder-DzY5hcbk.mjs +0 -1
- package/dist/web-components/Root-Bt3NNBFb.mjs +0 -1
- package/dist/web-components/Scene-DrOM9YlD.mjs +0 -1
- package/dist/web-components/SceneView-DA7Yg20p.mjs +0 -1
- package/dist/web-components/TargetItems-BDJM3Ar-.mjs +0 -1
- package/dist/web-components/Timeline-BfdN3lIv.mjs +0 -1
- package/dist/web-components/Tip-OCB88zwY.mjs +0 -1
- package/dist/web-components/Transport-DaIhfZqC.mjs +0 -1
- package/dist/web-components/hooks-BhtNDs_1.mjs +0 -1
- package/dist/web-components/index-FJEpXukG.mjs +0 -1
- package/dist/web-components/items-BPPrqbeh.mjs +0 -1
- package/dist/web-components/label-DauFa5sg.mjs +0 -1
- package/dist/web-components/logo-DWPxaZaG.mjs +0 -1
- package/dist/web-components/masonry-0QfzOgbB.mjs +0 -1
- package/dist/web-components/part-CekFWrtz.mjs +0 -1
- package/dist/web-components/pointer-YQppt0at.mjs +0 -1
- package/dist/web-components/rendererSurface-BkbGDL_Z.mjs +0 -22
- package/dist/web-components/shared-DkY2a89G.mjs +0 -1
- package/dist/web-components/styles-DkkVOSUQ.mjs +0 -1
- package/dist/web-components/svg-shape-DLY3g7oq.mjs +0 -1
- package/dist/web-components/thumbnail-DecrVnpj.mjs +0 -1
- package/dist/web-components/useControlsVisibility-DPg8uAkW.mjs +0 -1
- package/dist/web-components/useLazyPanelPane-eby-OI1V.mjs +0 -1
- package/dist/web-components/viewer/ChaptersMenu-Brcq3yJv.mjs +0 -1
- package/dist/web-components/viewer/Connected-Bmc_CdUD.mjs +0 -1
- package/dist/web-components/viewer/ControlMenu-TcO85hDf.mjs +0 -1
- package/dist/web-components/viewer/ControlsFade-BoZ4ABAE.mjs +0 -1
- package/dist/web-components/viewer/CountMenu-0-ie8kIZ.mjs +0 -1
- package/dist/web-components/viewer/Cue-DxmAS9Gx.mjs +0 -1
- package/dist/web-components/viewer/Document-BsryuYJ1.mjs +0 -1
- package/dist/web-components/viewer/Gallery-BOgUqfqw.mjs +0 -1
- package/dist/web-components/viewer/ImageControls-ZoEC9jWd.mjs +0 -1
- package/dist/web-components/viewer/LightboxView-BB-GcbYr.mjs +0 -1
- package/dist/web-components/viewer/MapView-DQSwUzd7.mjs +0 -3
- package/dist/web-components/viewer/MediaBody-CIw2nTlj.mjs +0 -1
- package/dist/web-components/viewer/PanelPart-YNbBI9SQ.mjs +0 -1
- package/dist/web-components/viewer/Placeholder-CsEkLhz7.mjs +0 -1
- package/dist/web-components/viewer/TargetItems-BebPFr-c.mjs +0 -1
- package/dist/web-components/viewer/Transport-CY6BWfMi.mjs +0 -1
- package/dist/web-components/viewer/annotation-name-CwmgQFia.mjs +0 -1
- package/dist/web-components/viewer/styles-I7_LWFGj.mjs +0 -1
- package/dist/web-components/viewer/useControlsVisibility-C_SQHIVR.mjs +0 -1
- package/dist/web-components/viewer/useLazyPanelPane-UuGDJrf_.mjs +0 -1
- package/dist/web-components/viewer/viewer-DJrQuNs1.mjs +0 -29
- package/dist/web-components/viewer/vtt-C2G89SWH.mjs +0 -5
- package/dist/web-components/viewer-Br44EEba.mjs +0 -1
- package/dist/web-components/vtt-Dd0c7psH.mjs +0 -5
- package/dist/web-components/worker-CjXN0dku.mjs +0 -1
package/README.md
CHANGED
|
@@ -94,7 +94,7 @@ If you serve Clover's files yourself, copy the whole `dist/web-components` folde
|
|
|
94
94
|
| ------------------------------------- | ------------------------------------------------------------------------------------- |
|
|
95
95
|
| `@nulib/clover` | The Viewer (the default export), and every part, hook and helper (named). |
|
|
96
96
|
| `@nulib/clover/templates` | The templates: `Default`, `Document` and `Gallery`. |
|
|
97
|
-
| `@nulib/clover/map` | `Map
|
|
97
|
+
| `@nulib/clover/map` | `Map` and its helpers, as `@nulib/clover` exports them (`Clover.Map`). |
|
|
98
98
|
| `@nulib/clover/three` | `registerThreeEngine`, to draw a Scene with three.js, which you install. |
|
|
99
99
|
| `@nulib/clover/web-components` | `<clover-viewer>`, and every part as an element. |
|
|
100
100
|
| `@nulib/clover/web-components/viewer` | `<clover-viewer>` alone, for a page that shows a Viewer and nothing else of Clover's. |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useState, useEffect } from "react";
|
|
3
3
|
import { isDirect, TAP_MS, isHovering, TAP_SLOP, isInteractive, DOUBLE_TAP_SLOP } from "../../lib/pointer.mjs";
|
|
4
|
-
const DEFAULT_HIDE_DELAY =
|
|
4
|
+
const DEFAULT_HIDE_DELAY = 3e3;
|
|
5
5
|
const LEAVE_DELAY = 1e3;
|
|
6
6
|
const PRESS_FOCUS_MS = 1e3;
|
|
7
7
|
const FADING_CONTROLS = [
|
|
@@ -20,10 +20,12 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
20
20
|
let focusHeld = false;
|
|
21
21
|
let penHovers = false;
|
|
22
22
|
let pressedAt = -Infinity;
|
|
23
|
+
let pressedInside = false;
|
|
23
24
|
let held = null;
|
|
24
25
|
let swallowClick = false;
|
|
25
26
|
let clickTimer;
|
|
26
27
|
let press = null;
|
|
28
|
+
let using = null;
|
|
27
29
|
let tap = null;
|
|
28
30
|
const set = (value) => {
|
|
29
31
|
shown = value;
|
|
@@ -40,6 +42,11 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
40
42
|
if (tap) clearTimeout(tap.timer);
|
|
41
43
|
tap = null;
|
|
42
44
|
};
|
|
45
|
+
const touchShow = () => {
|
|
46
|
+
set(true);
|
|
47
|
+
stop();
|
|
48
|
+
if (Number.isFinite(hideDelay)) timer = setTimeout(hide, hideDelay);
|
|
49
|
+
};
|
|
43
50
|
const direct = (event) => isDirect(event.pointerType, penHovers);
|
|
44
51
|
const show = (event) => {
|
|
45
52
|
keyboard = event.type === "keydown";
|
|
@@ -59,7 +66,10 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
59
66
|
...at,
|
|
60
67
|
timer: setTimeout(() => {
|
|
61
68
|
tap = null;
|
|
62
|
-
|
|
69
|
+
if (at.onPicture && shown) {
|
|
70
|
+
stop();
|
|
71
|
+
set(false);
|
|
72
|
+
} else touchShow();
|
|
63
73
|
}, TAP_MS)
|
|
64
74
|
};
|
|
65
75
|
};
|
|
@@ -70,10 +80,21 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
70
80
|
press = null;
|
|
71
81
|
}
|
|
72
82
|
};
|
|
83
|
+
const onPicture = (target) => {
|
|
84
|
+
const pictureElement = picture == null ? void 0 : picture.current;
|
|
85
|
+
return Boolean(
|
|
86
|
+
pictureElement && target instanceof Node && pictureElement.contains(target)
|
|
87
|
+
);
|
|
88
|
+
};
|
|
73
89
|
const down = (event) => {
|
|
74
90
|
if (!direct(event)) return show(event);
|
|
75
91
|
keyboard = false;
|
|
76
92
|
stop();
|
|
93
|
+
using = isInteractive(event.target, element) && !onPicture(event.target) ? {
|
|
94
|
+
id: event.pointerId,
|
|
95
|
+
inSight: shown || getComputedStyle(element).getPropertyValue("--clover-controls-shown").trim() === "1"
|
|
96
|
+
} : null;
|
|
97
|
+
if (using) forgetTap();
|
|
77
98
|
press = event.isPrimary === false ? null : {
|
|
78
99
|
id: event.pointerId,
|
|
79
100
|
x: event.clientX,
|
|
@@ -82,26 +103,25 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
82
103
|
};
|
|
83
104
|
};
|
|
84
105
|
const up = (event) => {
|
|
85
|
-
if (!direct(event)
|
|
106
|
+
if (!direct(event)) return;
|
|
107
|
+
if ((using == null ? void 0 : using.id) === event.pointerId) {
|
|
108
|
+
if (using.inSight) touchShow();
|
|
109
|
+
using = null;
|
|
110
|
+
} else if (shown && event.isPrimary !== false) touchShow();
|
|
111
|
+
if ((press == null ? void 0 : press.id) !== event.pointerId) return;
|
|
86
112
|
const { target } = press;
|
|
87
113
|
press = null;
|
|
88
114
|
if (event.type !== "pointerup") return;
|
|
89
115
|
if (isInteractive(target, element)) return;
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
pictureElement && target instanceof Node && pictureElement.contains(target)
|
|
93
|
-
);
|
|
94
|
-
if (onPicture && (tap == null ? void 0 : tap.onPicture) && Math.hypot(event.clientX - tap.x, event.clientY - tap.y) < DOUBLE_TAP_SLOP) {
|
|
116
|
+
const tapped = onPicture(target);
|
|
117
|
+
if (tapped && (tap == null ? void 0 : tap.onPicture) && Math.hypot(event.clientX - tap.x, event.clientY - tap.y) < DOUBLE_TAP_SLOP) {
|
|
95
118
|
forgetTap();
|
|
96
119
|
return;
|
|
97
120
|
}
|
|
98
|
-
later({ x: event.clientX, y: event.clientY, onPicture });
|
|
121
|
+
later({ x: event.clientX, y: event.clientY, onPicture: tapped });
|
|
99
122
|
};
|
|
100
123
|
const underFadedControls = (event) => {
|
|
101
|
-
|
|
102
|
-
const target = event.target;
|
|
103
|
-
if (!pictureElement || !target || !pictureElement.contains(target))
|
|
104
|
-
return false;
|
|
124
|
+
if (!onPicture(event.target)) return false;
|
|
105
125
|
return Array.from(element.querySelectorAll(FADING_CONTROLS)).some(
|
|
106
126
|
(piece) => {
|
|
107
127
|
const box = piece.getBoundingClientRect();
|
|
@@ -144,6 +164,7 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
144
164
|
};
|
|
145
165
|
const pressed = (event) => {
|
|
146
166
|
pressedAt = Date.now();
|
|
167
|
+
pressedInside = element.contains(event.target);
|
|
147
168
|
if (event.type === "pointerdown") focusHeld = false;
|
|
148
169
|
};
|
|
149
170
|
const focus = () => {
|
|
@@ -159,6 +180,7 @@ function useControlsVisibility(element, hideDelay = DEFAULT_HIDE_DELAY, picture)
|
|
|
159
180
|
const blur = (event) => {
|
|
160
181
|
if (element.contains(event.relatedTarget)) return;
|
|
161
182
|
focusHeld = false;
|
|
183
|
+
if (pressedInside && Date.now() - pressedAt < PRESS_FOCUS_MS) return;
|
|
162
184
|
if (shown || keyboard) linger();
|
|
163
185
|
};
|
|
164
186
|
page.addEventListener("pointerdown", pressed, true);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import React, { useRef, useState, useMemo, useEffect, useCallback, useLayoutEffect, Suspense, lazy } from "react";
|
|
4
4
|
import Caption, { hasInformation, captionLabelId } from "../Body/Caption.mjs";
|
|
5
|
-
import Controls from "./Controls.mjs";
|
|
5
|
+
import Controls, { NO_LIMITS } from "./Controls.mjs";
|
|
6
6
|
import { findChoices, startingChoices, animationFrames, canvasScene, paintedType, placeholderStill, frameKey, canvasSize, canvasRectToWorld } from "./layout.mjs";
|
|
7
7
|
import ExitFullscreen from "../../ui/ExitFullscreen.mjs";
|
|
8
8
|
import { useNearViewport } from "../Body/useNearViewport.mjs";
|
|
@@ -24,12 +24,15 @@ import { HostLanguageContext } from "../../i18n/hostLanguage.mjs";
|
|
|
24
24
|
import { useRootLanguage } from "../../i18n/useRootLanguage.mjs";
|
|
25
25
|
import { useContainerName } from "../../i18n/useContainerName.mjs";
|
|
26
26
|
import { union } from "../../lib/renderer/math/rect.mjs";
|
|
27
|
-
import { findImageServiceId } from "../../lib/renderer/sources/imageService.mjs";
|
|
27
|
+
import { findImageServiceId, fetchInfo } from "../../lib/renderer/sources/imageService.mjs";
|
|
28
28
|
import { hasCamera } from "./surface.mjs";
|
|
29
29
|
import { languageProps } from "../../i18n/direction.mjs";
|
|
30
|
-
import { buildContentState } from "../../core/content-state.mjs";
|
|
31
30
|
import { useContentStateOutput, watchMedia } from "../../react/useContentStateOutput.mjs";
|
|
32
31
|
import { resolveDirection } from "../../core/sequence.mjs";
|
|
32
|
+
let writeContentState;
|
|
33
|
+
const loadContentState = () => import("../../core/content-state.mjs").then((module) => {
|
|
34
|
+
writeContentState = module.buildContentState;
|
|
35
|
+
});
|
|
33
36
|
const MediaBody = lazy(() => import("./media/MediaBody.mjs"));
|
|
34
37
|
const loadHotspots = () => import("./AnnotationState.mjs");
|
|
35
38
|
const NO_COMMENTS = /* @__PURE__ */ new Map();
|
|
@@ -166,6 +169,7 @@ const CanvasBody = (props) => {
|
|
|
166
169
|
const [status, setStatus] = useState("loading");
|
|
167
170
|
const [unloadable, setUnloadable] = useState(false);
|
|
168
171
|
const [sceneVersion, setSceneVersion] = useState(0);
|
|
172
|
+
const [viewLimits, setViewLimits] = useState(NO_LIMITS);
|
|
169
173
|
const onReadyRef = useRef(onReady);
|
|
170
174
|
const onViewportChangeRef = useRef(onViewportChange);
|
|
171
175
|
const optionsRef = useRef(options);
|
|
@@ -309,6 +313,15 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
|
|
|
309
313
|
const [imagesOpen, setImagesOpen] = useState(false);
|
|
310
314
|
const [mediaOpenedFor, setMediaOpenedFor] = useState(null);
|
|
311
315
|
const showPlaceholder = !player && stills.length > 0 && (media ? mediaOpenedFor !== canvasKey : !imagesOpen);
|
|
316
|
+
const stillsRequest = options == null ? void 0 : options.request;
|
|
317
|
+
useEffect(() => {
|
|
318
|
+
if (!showPlaceholder) return;
|
|
319
|
+
void import("../../core/thumbnail.mjs");
|
|
320
|
+
for (const { source } of stills)
|
|
321
|
+
if (source.service)
|
|
322
|
+
fetchInfo(source.service, { request: stillsRequest }).catch(() => {
|
|
323
|
+
});
|
|
324
|
+
}, [showPlaceholder, stills, stillsRequest]);
|
|
312
325
|
const onlyInformation = (config, { annotations = false, fullPage = false } = {}) => ({
|
|
313
326
|
...config,
|
|
314
327
|
zoom: false,
|
|
@@ -410,7 +423,11 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
|
|
|
410
423
|
const region = !time && surface2 && hasCamera(surface2) ? canvasRegion(surface2.getBounds(), shown.canvases, shown.placements) : null;
|
|
411
424
|
const canvas = shown.canvases.find((each) => each.id === (region == null ? void 0 : region.canvasId)) ?? shown.canvases[0];
|
|
412
425
|
if (!canvas) return null;
|
|
413
|
-
|
|
426
|
+
if (!writeContentState) {
|
|
427
|
+
void loadContentState().then(() => contentStateChanged());
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
return writeContentState({
|
|
414
431
|
manifestId,
|
|
415
432
|
canvasId: canvas.id,
|
|
416
433
|
type: canvas.type,
|
|
@@ -435,8 +452,16 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
|
|
|
435
452
|
surfaceRef.current = surface2;
|
|
436
453
|
setSurface(surface2);
|
|
437
454
|
surface2.setDismiss(releaseAnnotation);
|
|
455
|
+
const readLimits = () => {
|
|
456
|
+
if (!renderer2) return;
|
|
457
|
+
const next = renderer2.viewLimits();
|
|
458
|
+
setViewLimits(
|
|
459
|
+
(last) => last.atMax === next.atMax && last.atMin === next.atMin && last.atHome === next.atHome ? last : next
|
|
460
|
+
);
|
|
461
|
+
};
|
|
438
462
|
const offOpen = surface2.on("open", () => {
|
|
439
463
|
var _a2;
|
|
464
|
+
readLimits();
|
|
440
465
|
setCleared(false);
|
|
441
466
|
markDrawn();
|
|
442
467
|
contentStateChanged();
|
|
@@ -464,6 +489,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
|
|
|
464
489
|
);
|
|
465
490
|
});
|
|
466
491
|
const offChange = surface2.on("change", () => {
|
|
492
|
+
readLimits();
|
|
467
493
|
setCleared(false);
|
|
468
494
|
markDrawn();
|
|
469
495
|
contentStateChanged();
|
|
@@ -479,6 +505,7 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
|
|
|
479
505
|
);
|
|
480
506
|
const offViewport = surface2.on("viewport", () => {
|
|
481
507
|
var _a2;
|
|
508
|
+
readLimits();
|
|
482
509
|
if (renderer2) (_a2 = onViewportChangeRef.current) == null ? void 0 : _a2.call(onViewportChangeRef, renderer2.getBounds());
|
|
483
510
|
contentStateChanged();
|
|
484
511
|
});
|
|
@@ -594,10 +621,12 @@ ${canvases.map((canvas) => canvas.id).join("|")}` : null;
|
|
|
594
621
|
instance,
|
|
595
622
|
config: shownControls ?? NO_CONTROLS,
|
|
596
623
|
controlButtons,
|
|
624
|
+
limits: viewLimits,
|
|
597
625
|
placeholderIsMore: cornerToggle && !media,
|
|
598
626
|
chapters: media ? chapters : void 0,
|
|
599
627
|
mediaElement,
|
|
600
628
|
onChapter: goToChapter,
|
|
629
|
+
overStill: Boolean(media) && showPlaceholder,
|
|
601
630
|
request: options == null ? void 0 : options.request,
|
|
602
631
|
placeholder: cornerToggle && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
|
|
603
632
|
PlaceholderToggle,
|
|
@@ -15,6 +15,7 @@ const ChaptersMenu = ({
|
|
|
15
15
|
chapters,
|
|
16
16
|
element,
|
|
17
17
|
onChapter,
|
|
18
|
+
overStill = false,
|
|
18
19
|
request,
|
|
19
20
|
onClose
|
|
20
21
|
}) => {
|
|
@@ -59,7 +60,11 @@ const ChaptersMenu = ({
|
|
|
59
60
|
type: "radio",
|
|
60
61
|
name: id,
|
|
61
62
|
checked: index === current,
|
|
62
|
-
onChange: () =>
|
|
63
|
+
onChange: () => {
|
|
64
|
+
if (overStill && !pointer.current)
|
|
65
|
+
setTime(chapters[index].start);
|
|
66
|
+
else go(index);
|
|
67
|
+
},
|
|
63
68
|
onClick: () => {
|
|
64
69
|
if (pointer.current) onClose(true);
|
|
65
70
|
},
|
|
@@ -48,8 +48,15 @@ const ControlMenu = ({
|
|
|
48
48
|
const inside2 = Boolean(
|
|
49
49
|
((_a = ref.current) == null ? void 0 : _a.contains(active)) || ((_b = document.getElementById(triggerId)) == null ? void 0 : _b.contains(active))
|
|
50
50
|
);
|
|
51
|
-
if (inside2)
|
|
52
|
-
|
|
51
|
+
if (inside2) {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
onClose(true);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const after = (late) => {
|
|
57
|
+
if (late === event && !event.defaultPrevented) onClose(false);
|
|
58
|
+
};
|
|
59
|
+
document.addEventListener("keydown", after, { once: true });
|
|
53
60
|
};
|
|
54
61
|
document.addEventListener("pointerdown", onPointerDown);
|
|
55
62
|
document.addEventListener("keydown", onKeyDown, true);
|
|
@@ -26,11 +26,17 @@ const VIEW = /* @__PURE__ */ new Set([
|
|
|
26
26
|
"reset",
|
|
27
27
|
"fullPage"
|
|
28
28
|
]);
|
|
29
|
+
const NO_LIMITS = {
|
|
30
|
+
atMax: false,
|
|
31
|
+
atMin: false,
|
|
32
|
+
atHome: false
|
|
33
|
+
};
|
|
29
34
|
const Controls = ({
|
|
30
35
|
renderer,
|
|
31
36
|
instance,
|
|
32
37
|
config,
|
|
33
38
|
controlButtons,
|
|
39
|
+
limits = NO_LIMITS,
|
|
34
40
|
placeholder,
|
|
35
41
|
placeholderIsMore = false,
|
|
36
42
|
choices = [],
|
|
@@ -40,6 +46,7 @@ const Controls = ({
|
|
|
40
46
|
chapters = [],
|
|
41
47
|
mediaElement = null,
|
|
42
48
|
onChapter,
|
|
49
|
+
overStill,
|
|
43
50
|
request,
|
|
44
51
|
hiddenPages,
|
|
45
52
|
onPageVisibilityChange,
|
|
@@ -168,6 +175,7 @@ const Controls = ({
|
|
|
168
175
|
label: t("imageZoomIn"),
|
|
169
176
|
lang: langOf("imageZoomIn"),
|
|
170
177
|
glyph: /* @__PURE__ */ jsx(ZoomIn, {}),
|
|
178
|
+
unavailable: limits.atMax,
|
|
171
179
|
onClick: () => camera.zoomBy(ZOOM_PER_CLICK)
|
|
172
180
|
},
|
|
173
181
|
{
|
|
@@ -177,6 +185,7 @@ const Controls = ({
|
|
|
177
185
|
label: t("imageZoomOut"),
|
|
178
186
|
lang: langOf("imageZoomOut"),
|
|
179
187
|
glyph: /* @__PURE__ */ jsx(ZoomOut, {}),
|
|
188
|
+
unavailable: limits.atMin,
|
|
180
189
|
onClick: () => camera.zoomBy(1 / ZOOM_PER_CLICK)
|
|
181
190
|
}
|
|
182
191
|
);
|
|
@@ -222,6 +231,7 @@ const Controls = ({
|
|
|
222
231
|
label: t("imageResetZoom"),
|
|
223
232
|
lang: langOf("imageResetZoom"),
|
|
224
233
|
glyph: /* @__PURE__ */ jsx(Reset, {}),
|
|
234
|
+
unavailable: limits.atHome,
|
|
225
235
|
// Home also turns the image upright, as `Image`'s reset does.
|
|
226
236
|
onClick: () => camera.home()
|
|
227
237
|
});
|
|
@@ -325,10 +335,10 @@ const Controls = ({
|
|
|
325
335
|
const always = moreWhen === "always" || placeholderIsMore;
|
|
326
336
|
const ImageControls = (_d = useLoaded(
|
|
327
337
|
loadImageControls,
|
|
328
|
-
fit && (always || !fits) && items.some((item) => item.view)
|
|
338
|
+
fit && (placeholderIsMore || (always || !fits) && items.some((item) => item.view))
|
|
329
339
|
)) == null ? void 0 : _d.ImageControls;
|
|
330
340
|
const tucked = fits && !always || !ImageControls ? [] : items.filter((item) => item.view);
|
|
331
|
-
const deck = placeholderIsMore &&
|
|
341
|
+
const deck = placeholderIsMore && Boolean(placeholder) && Boolean(ImageControls);
|
|
332
342
|
useEffect(() => {
|
|
333
343
|
if (!tucked.length) setMoreOpen(false);
|
|
334
344
|
}, [tucked.length]);
|
|
@@ -338,11 +348,11 @@ const Controls = ({
|
|
|
338
348
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
339
349
|
/* @__PURE__ */ jsxs(ControlCluster, { fit, clusterRef: setCluster, children: [
|
|
340
350
|
shown(lead),
|
|
341
|
-
ImageControls && tucked.length > 0 && /* @__PURE__ */ jsx(
|
|
351
|
+
ImageControls && (tucked.length > 0 || deck) && /* @__PURE__ */ jsx(
|
|
342
352
|
ImageControls,
|
|
343
353
|
{
|
|
344
354
|
instance,
|
|
345
|
-
open: deck
|
|
355
|
+
open: deck ? tucked.length > 0 : moreOpen,
|
|
346
356
|
onOpenChange: setMoreOpen,
|
|
347
357
|
toggle: deck ? placeholder : void 0,
|
|
348
358
|
children: tucked.map(({ node }) => node)
|
|
@@ -358,6 +368,7 @@ const Controls = ({
|
|
|
358
368
|
ids: items.map(({ id }) => id),
|
|
359
369
|
more: `more-${instance}`,
|
|
360
370
|
fits,
|
|
371
|
+
settled: fits || tucked.length > 0 || !items.some((item) => item.view),
|
|
361
372
|
onFits: setFits
|
|
362
373
|
}
|
|
363
374
|
),
|
|
@@ -371,6 +382,7 @@ const Controls = ({
|
|
|
371
382
|
chapters,
|
|
372
383
|
element: mediaElement,
|
|
373
384
|
onChapter,
|
|
385
|
+
overStill,
|
|
374
386
|
request,
|
|
375
387
|
onClose: closeChapters
|
|
376
388
|
}
|
|
@@ -408,5 +420,6 @@ const Controls = ({
|
|
|
408
420
|
] });
|
|
409
421
|
};
|
|
410
422
|
export {
|
|
423
|
+
NO_LIMITS,
|
|
411
424
|
Controls as default
|
|
412
425
|
};
|
|
@@ -19,6 +19,8 @@ import { PauseIcon, PlayIcon, VolumeMutedIcon, VolumeHighIcon } from "../../ui/m
|
|
|
19
19
|
import { formatTime } from "../../lib/time.mjs";
|
|
20
20
|
import { gapsOf, gapMask, alongBar, seekShare } from "./media/seekGaps.mjs";
|
|
21
21
|
import { placeMenu } from "./media/placeMenu.mjs";
|
|
22
|
+
import { adoptSheet } from "../../ui/adoptSheet.mjs";
|
|
23
|
+
import __clover_sheet_media from "../../ui/sheets/media.mjs";
|
|
22
24
|
const clockTime = (seconds, total) => total < 10 ? `${formatTime(seconds)}.${Math.min(9, Math.floor((seconds || 0) % 1 * 10))}` : formatTime(seconds);
|
|
23
25
|
const focusVisible = (element) => {
|
|
24
26
|
try {
|
|
@@ -736,6 +738,7 @@ function FrameAnimation({
|
|
|
736
738
|
)
|
|
737
739
|
] });
|
|
738
740
|
}
|
|
741
|
+
adoptSheet("media", __clover_sheet_media);
|
|
739
742
|
export {
|
|
740
743
|
FrameControls,
|
|
741
744
|
clockTime,
|
|
@@ -7,7 +7,7 @@ import { useContainerName } from "../../i18n/useContainerName.mjs";
|
|
|
7
7
|
import { useOneOpen } from "../../ui/useOneOpen.mjs";
|
|
8
8
|
import { CloseViewer, OpenViewer } from "../Body/glyphs.mjs";
|
|
9
9
|
import { languageProps } from "../../i18n/direction.mjs";
|
|
10
|
-
import { Tip } from "../../ui/Tip.mjs";
|
|
10
|
+
import { placeTipAgain, Tip } from "../../ui/Tip.mjs";
|
|
11
11
|
function overhang(list) {
|
|
12
12
|
var _a, _b;
|
|
13
13
|
const box = list.getBoundingClientRect();
|
|
@@ -90,14 +90,19 @@ function ImageControls({
|
|
|
90
90
|
else if (under > 0) list2.scrollLeft -= Math.min(under, Math.max(left, 0));
|
|
91
91
|
mark();
|
|
92
92
|
};
|
|
93
|
+
const scrolled = () => {
|
|
94
|
+
mark();
|
|
95
|
+
const active = list2.ownerDocument.activeElement;
|
|
96
|
+
if (active && list2.contains(active)) placeTipAgain(active);
|
|
97
|
+
};
|
|
93
98
|
mark();
|
|
94
|
-
list2.addEventListener("scroll",
|
|
99
|
+
list2.addEventListener("scroll", scrolled, { passive: true });
|
|
95
100
|
list2.addEventListener("focusin", reveal);
|
|
96
101
|
list2.addEventListener("animationend", mark);
|
|
97
102
|
const resize = new ResizeObserver(() => mark());
|
|
98
103
|
resize.observe(list2);
|
|
99
104
|
return () => {
|
|
100
|
-
list2.removeEventListener("scroll",
|
|
105
|
+
list2.removeEventListener("scroll", scrolled);
|
|
101
106
|
list2.removeEventListener("focusin", reveal);
|
|
102
107
|
list2.removeEventListener("animationend", mark);
|
|
103
108
|
resize.disconnect();
|
|
@@ -57,6 +57,8 @@ function PlaceholderToggle({
|
|
|
57
57
|
id,
|
|
58
58
|
label: t(toggleKey),
|
|
59
59
|
lang: langOf(toggleKey),
|
|
60
|
+
expanded: more && !media ? !active : void 0,
|
|
61
|
+
controls: more && !media ? `more-${instance}-list` : void 0,
|
|
60
62
|
onClick: (event) => {
|
|
61
63
|
const focused = document.activeElement === event.currentTarget;
|
|
62
64
|
const figure = event.currentTarget.closest(".clover-canvas");
|
|
@@ -100,12 +102,13 @@ const Placeholder = ({
|
|
|
100
102
|
onToggle
|
|
101
103
|
}
|
|
102
104
|
),
|
|
103
|
-
(active || lingering) && /* @__PURE__ */ jsx(
|
|
105
|
+
(active || lingering || !media) && /* @__PURE__ */ jsx(
|
|
104
106
|
"div",
|
|
105
107
|
{
|
|
106
108
|
"aria-hidden": active ? void 0 : true,
|
|
107
109
|
className: "clover-canvas-placeholder",
|
|
108
|
-
"data-
|
|
110
|
+
"data-hidden": !active && !lingering,
|
|
111
|
+
"data-lingering": !active && lingering,
|
|
109
112
|
"data-media": media,
|
|
110
113
|
"data-testid": "clover-canvas-placeholder",
|
|
111
114
|
"data-vertical": vertical,
|
|
@@ -18,6 +18,7 @@ function Fits({
|
|
|
18
18
|
ids,
|
|
19
19
|
more,
|
|
20
20
|
fits,
|
|
21
|
+
settled,
|
|
21
22
|
onFits
|
|
22
23
|
}) {
|
|
23
24
|
const shown = useRef(fits);
|
|
@@ -70,13 +71,14 @@ function Fits({
|
|
|
70
71
|
};
|
|
71
72
|
}, [cluster, key, more]);
|
|
72
73
|
useLayoutEffect(() => {
|
|
74
|
+
if (!settled) return;
|
|
73
75
|
const id = moved.current;
|
|
74
76
|
moved.current = null;
|
|
75
77
|
if (id === null) return;
|
|
76
78
|
const active = cluster.ownerDocument.activeElement;
|
|
77
79
|
if (!active || !cluster.contains(active) || active.closest("[hidden]"))
|
|
78
80
|
refocus(cluster, id, more);
|
|
79
|
-
}, [fits, cluster, more]);
|
|
81
|
+
}, [fits, settled, cluster, more]);
|
|
80
82
|
return null;
|
|
81
83
|
}
|
|
82
84
|
export {
|
|
@@ -11,6 +11,8 @@ import { hasCamera } from "../surface.mjs";
|
|
|
11
11
|
import { useOptionalClover } from "../../../react/context.mjs";
|
|
12
12
|
import { BodyUnloadable } from "../../../ui/BodyUnloadable.mjs";
|
|
13
13
|
import { languageProps } from "../../../i18n/direction.mjs";
|
|
14
|
+
import { adoptSheet } from "../../../ui/adoptSheet.mjs";
|
|
15
|
+
import __clover_sheet_media from "../../../ui/sheets/media.mjs";
|
|
14
16
|
const SKIP_SECONDS = 10;
|
|
15
17
|
const MOMENT_SECONDS = 3;
|
|
16
18
|
const MediaBody = ({
|
|
@@ -363,6 +365,7 @@ function containAspect(box, size) {
|
|
|
363
365
|
height
|
|
364
366
|
};
|
|
365
367
|
}
|
|
368
|
+
adoptSheet("media", __clover_sheet_media);
|
|
366
369
|
export {
|
|
367
370
|
containAspect,
|
|
368
371
|
MediaBody as default,
|
|
@@ -5,6 +5,8 @@ import { thumbnailSource, stillSource } from "../../../core/thumbnail.mjs";
|
|
|
5
5
|
import { localize } from "../../../core/value.mjs";
|
|
6
6
|
import { useThumbnail } from "../../../ui/EntryThumbnail.mjs";
|
|
7
7
|
import { languageProps } from "../../../i18n/direction.mjs";
|
|
8
|
+
import { adoptSheet } from "../../../ui/adoptSheet.mjs";
|
|
9
|
+
import __clover_sheet_media from "../../../ui/sheets/media.mjs";
|
|
8
10
|
const ART_SIZE = 1200;
|
|
9
11
|
const GROUND_SIZE = 32;
|
|
10
12
|
function artworkOf(canvas, language) {
|
|
@@ -119,6 +121,7 @@ function PlayerFace({
|
|
|
119
121
|
] })
|
|
120
122
|
] });
|
|
121
123
|
}
|
|
124
|
+
adoptSheet("media", __clover_sheet_media);
|
|
122
125
|
export {
|
|
123
126
|
PlayerFace
|
|
124
127
|
};
|
|
@@ -17,6 +17,8 @@ import { useCloverTranslation } from "../../../i18n/useCloverTranslation.mjs";
|
|
|
17
17
|
import { toggleFullscreen } from "../../../lib/fullscreen.mjs";
|
|
18
18
|
import useFullscreenSupported from "../../../hooks/useFullscreenSupported.mjs";
|
|
19
19
|
import { languageProps } from "../../../i18n/direction.mjs";
|
|
20
|
+
import { adoptSheet } from "../../../ui/adoptSheet.mjs";
|
|
21
|
+
import __clover_sheet_media from "../../../ui/sheets/media.mjs";
|
|
20
22
|
import { formatTime } from "../../../lib/time.mjs";
|
|
21
23
|
const chapterPicture = (chapter) => typeof (chapter == null ? void 0 : chapter.thumbnail) === "string" ? { src: chapter.thumbnail } : imageSource(chapter == null ? void 0 : chapter.thumbnail);
|
|
22
24
|
function chapterAt(chapters, time) {
|
|
@@ -528,6 +530,7 @@ const Transport = ({
|
|
|
528
530
|
}
|
|
529
531
|
);
|
|
530
532
|
};
|
|
533
|
+
adoptSheet("media", __clover_sheet_media);
|
|
531
534
|
export {
|
|
532
535
|
chapterAt,
|
|
533
536
|
chapterPicture,
|
|
@@ -4,7 +4,7 @@ import { STILL_SIZE } from "../layout.mjs";
|
|
|
4
4
|
import { resolveThumbnail } from "../../../core/thumbnail.mjs";
|
|
5
5
|
import { localize } from "../../../core/value.mjs";
|
|
6
6
|
import { sendsCredentials, requestKey } from "../../../core/request.mjs";
|
|
7
|
-
import { loadVtt } from "../../../core/vtt.mjs";
|
|
7
|
+
import { loadVtt, vttBlocks } from "../../../core/vtt.mjs";
|
|
8
8
|
import { isHls } from "../../../lib/hls.mjs";
|
|
9
9
|
function captionName(caption, index, language) {
|
|
10
10
|
const name = localize(caption.label, language);
|
|
@@ -34,7 +34,6 @@ function useMediaElement(media, { request, language }) {
|
|
|
34
34
|
if (!canceled && url) video.poster = url;
|
|
35
35
|
}
|
|
36
36
|
);
|
|
37
|
-
const blobs = [];
|
|
38
37
|
media.captions.forEach((caption, index) => {
|
|
39
38
|
const track = document.createElement("track");
|
|
40
39
|
track.kind = caption.kind;
|
|
@@ -42,12 +41,7 @@ function useMediaElement(media, { request, language }) {
|
|
|
42
41
|
track.label = captionName(caption, index, languageRef.current).text;
|
|
43
42
|
video.appendChild(track);
|
|
44
43
|
loadVtt(caption.id, requestRef.current).then((text) => {
|
|
45
|
-
if (canceled)
|
|
46
|
-
const url = URL.createObjectURL(
|
|
47
|
-
new Blob([text], { type: "text/vtt" })
|
|
48
|
-
);
|
|
49
|
-
blobs.push(url);
|
|
50
|
-
track.src = url;
|
|
44
|
+
if (!canceled) addCues(track.track, text);
|
|
51
45
|
}).catch(() => void 0);
|
|
52
46
|
});
|
|
53
47
|
let hls = null;
|
|
@@ -100,7 +94,6 @@ function useMediaElement(media, { request, language }) {
|
|
|
100
94
|
video.removeAttribute("src");
|
|
101
95
|
video.load();
|
|
102
96
|
video.remove();
|
|
103
|
-
blobs.forEach((url) => URL.revokeObjectURL(url));
|
|
104
97
|
setElement(null);
|
|
105
98
|
};
|
|
106
99
|
}, [
|
|
@@ -113,7 +106,37 @@ function useMediaElement(media, { request, language }) {
|
|
|
113
106
|
]);
|
|
114
107
|
return element;
|
|
115
108
|
}
|
|
109
|
+
function addCues(track, text) {
|
|
110
|
+
if (!track || typeof VTTCue === "undefined") return;
|
|
111
|
+
for (const { id, start, end, settings, raw } of vttBlocks(text)) {
|
|
112
|
+
const cue = new VTTCue(start, end, raw);
|
|
113
|
+
cue.id = id;
|
|
114
|
+
settle(cue, settings);
|
|
115
|
+
track.addCue(cue);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function settle(cue, settings) {
|
|
119
|
+
for (const setting of settings.split(" ")) {
|
|
120
|
+
const [name, value = ""] = setting.split(":");
|
|
121
|
+
const [first, second] = value.split(",");
|
|
122
|
+
try {
|
|
123
|
+
if (name === "vertical") cue.vertical = first;
|
|
124
|
+
else if (name === "align") cue.align = first;
|
|
125
|
+
else if (name === "size") cue.size = parseFloat(first);
|
|
126
|
+
else if (name === "position") {
|
|
127
|
+
cue.position = parseFloat(first);
|
|
128
|
+
if (second) cue.positionAlign = second;
|
|
129
|
+
} else if (name === "line") {
|
|
130
|
+
cue.snapToLines = !first.endsWith("%");
|
|
131
|
+
cue.line = parseFloat(first);
|
|
132
|
+
if (second) cue.lineAlign = second;
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
116
138
|
export {
|
|
139
|
+
addCues,
|
|
117
140
|
captionName,
|
|
118
141
|
useMediaElement
|
|
119
142
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
function attachMasonry(box) {
|
|
3
|
+
box.dataset.masonry = "";
|
|
3
4
|
const items = () => Array.from(
|
|
4
5
|
box.querySelectorAll(
|
|
5
6
|
".clover-items-track > .clover-items-item"
|
|
@@ -28,6 +29,7 @@ function attachMasonry(box) {
|
|
|
28
29
|
added.disconnect();
|
|
29
30
|
sizes == null ? void 0 : sizes.disconnect();
|
|
30
31
|
items().forEach((item) => item.style.removeProperty("grid-row-end"));
|
|
32
|
+
delete box.dataset.masonry;
|
|
31
33
|
};
|
|
32
34
|
}
|
|
33
35
|
export {
|