@nulib/clover 0.0.0-stage → 4.0.0-beta.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/LICENSE +9 -0
- package/README.md +120 -2
- package/dist/components/Annotations/Annotations.mjs +674 -0
- package/dist/components/Annotations/EntryBodies.mjs +52 -0
- package/dist/components/Annotations/languages.mjs +43 -0
- package/dist/components/Body/Body.mjs +51 -0
- package/dist/components/Body/BodyAlert.mjs +25 -0
- package/dist/components/Body/Caption.mjs +90 -0
- package/dist/components/Body/CaptionDetails.mjs +50 -0
- package/dist/components/Body/Pending.mjs +9 -0
- package/dist/components/Body/glyphs.mjs +66 -0
- package/dist/components/Body/renderers.mjs +30 -0
- package/dist/components/Body/useControlsVisibility.mjs +204 -0
- package/dist/components/Body/useNearViewport.mjs +27 -0
- package/dist/components/Canvas/AnnotationMenu.mjs +128 -0
- package/dist/components/Canvas/AnnotationState.mjs +338 -0
- package/dist/components/Canvas/Annotations.mjs +497 -0
- package/dist/components/Canvas/CanvasView.mjs +669 -0
- package/dist/components/Canvas/ChoiceMenu.mjs +77 -0
- package/dist/components/Canvas/Connected.mjs +228 -0
- package/dist/components/Canvas/ControlMenu.mjs +67 -0
- package/dist/components/Canvas/Controls.mjs +233 -0
- package/dist/components/Canvas/FrameAnimation.mjs +344 -0
- package/dist/components/Canvas/LoadedCanvas.mjs +177 -0
- package/dist/components/Canvas/Placeholder.mjs +105 -0
- package/dist/components/Canvas/fromManifest.mjs +44 -0
- package/dist/components/Canvas/index.mjs +19 -0
- package/dist/components/Canvas/layout.mjs +369 -0
- package/dist/components/Canvas/media/MediaBody.mjs +285 -0
- package/dist/components/Canvas/media/Player.mjs +193 -0
- package/dist/components/Canvas/media/Transport.mjs +511 -0
- package/dist/components/Canvas/media/TransportButton.mjs +39 -0
- package/dist/components/Canvas/media/useBarHeight.mjs +28 -0
- package/dist/components/Canvas/media/useCaptionTracks.mjs +131 -0
- package/dist/components/Canvas/media/useMediaController.mjs +77 -0
- package/dist/components/Canvas/media/useMediaElement.mjs +100 -0
- package/dist/components/Canvas/panClearOfControls.mjs +92 -0
- package/dist/components/Canvas/rendererSurface.mjs +6 -0
- package/dist/components/Canvas/surface.mjs +5 -0
- package/dist/components/Canvas/track.mjs +43 -0
- package/dist/components/Canvas/useSvgReader.mjs +23 -0
- package/dist/components/Collection/Collection.mjs +76 -0
- package/dist/components/CollectionSelect/CollectionSelect.mjs +114 -0
- package/dist/components/Contents/Contents.mjs +120 -0
- package/dist/components/Download/Download.mjs +105 -0
- package/dist/components/Items/Item.mjs +184 -0
- package/dist/components/Items/Items.mjs +455 -0
- package/dist/components/Items/Pager.mjs +190 -0
- package/dist/components/Items/StandaloneItems.mjs +80 -0
- package/dist/components/Items/clamped.mjs +90 -0
- package/dist/components/Label/Label.mjs +39 -0
- package/dist/components/Map/LoadedMap.mjs +26 -0
- package/dist/components/Map/Map.mjs +38 -0
- package/dist/components/Map/MapView.mjs +538 -0
- package/dist/components/Map/basemap.mjs +50 -0
- package/dist/components/Map/overlayImage.mjs +17 -0
- package/dist/components/Panel/About.mjs +143 -0
- package/dist/components/Panel/Panel.mjs +259 -0
- package/dist/components/Panel/PanelToggle.mjs +43 -0
- package/dist/components/Panel/PartOfManifest.mjs +52 -0
- package/dist/components/Primitives/Primitives.mjs +263 -0
- package/dist/components/Primitives/resource.mjs +11 -0
- package/dist/components/Provider/Provider.mjs +174 -0
- package/dist/components/Root/Announcer.mjs +58 -0
- package/dist/components/Root/Root.mjs +29 -0
- package/dist/components/Root/useRootState.mjs +188 -0
- package/dist/components/Scene/Connected.mjs +48 -0
- package/dist/components/Scene/Loaded.mjs +56 -0
- package/dist/components/Scene/RotatePad.mjs +204 -0
- package/dist/components/Scene/Scene.mjs +20 -0
- package/dist/components/Scene/SceneView.mjs +539 -0
- package/dist/components/Scene/cloverEngine.mjs +105 -0
- package/dist/components/Scene/engine.mjs +141 -0
- package/dist/components/Scene/engines.mjs +23 -0
- package/dist/components/Scene/gestures.mjs +74 -0
- package/dist/components/Scene/models.mjs +78 -0
- package/dist/components/Scene/orbit.mjs +60 -0
- package/dist/components/Search/Search.mjs +246 -0
- package/dist/components/Split/Split.mjs +203 -0
- package/dist/components/Split/splitting.mjs +203 -0
- package/dist/components/Status/Status.mjs +47 -0
- package/dist/components/Timeline/Connected.mjs +25 -0
- package/dist/components/Timeline/Timeline.mjs +40 -0
- package/dist/components/Timeline/playerSurface.mjs +84 -0
- package/dist/components/Transcript/Transcript.mjs +377 -0
- package/dist/components/Viewer/Viewer.mjs +19 -0
- package/dist/core/annotation-bodies.mjs +29 -0
- package/dist/core/annotation-collection.mjs +55 -0
- package/dist/core/annotation-name.mjs +31 -0
- package/dist/core/annotation-sets.mjs +155 -0
- package/dist/core/annotations-content.mjs +27 -0
- package/dist/core/annotations.mjs +73 -0
- package/dist/core/clover.mjs +393 -0
- package/dist/core/content-state-reader.mjs +82 -0
- package/dist/core/content-state.mjs +43 -0
- package/dist/core/direction.mjs +12 -0
- package/dist/core/geo-detect.mjs +30 -0
- package/dist/core/geo.mjs +283 -0
- package/dist/core/items.mjs +74 -0
- package/dist/core/keep-fragments.mjs +40 -0
- package/dist/core/link.mjs +28 -0
- package/dist/core/load.mjs +176 -0
- package/dist/core/map-config.mjs +12 -0
- package/dist/core/markdown.mjs +139 -0
- package/dist/core/pages.mjs +51 -0
- package/dist/core/painted-bodies.mjs +20 -0
- package/dist/core/painting.mjs +17 -0
- package/dist/core/presentation.mjs +27 -0
- package/dist/core/ranges.mjs +133 -0
- package/dist/core/region.mjs +32 -0
- package/dist/core/request.mjs +40 -0
- package/dist/core/sanitize.mjs +72 -0
- package/dist/core/search-service.mjs +22 -0
- package/dist/core/search.mjs +154 -0
- package/dist/core/selectors.mjs +94 -0
- package/dist/core/sequence.mjs +70 -0
- package/dist/core/show-link.mjs +16 -0
- package/dist/core/store.mjs +40 -0
- package/dist/core/svg-shape.mjs +183 -0
- package/dist/core/text.mjs +36 -0
- package/dist/core/thumbnail.mjs +55 -0
- package/dist/core/value.mjs +39 -0
- package/dist/core/vtt.mjs +111 -0
- package/dist/hooks/useFullscreen.mjs +21 -0
- package/dist/hooks/useFullscreenSupported.mjs +11 -0
- package/dist/hooks/useLoaded.mjs +27 -0
- package/dist/hooks/useWithinFullscreen.mjs +24 -0
- package/dist/i18n/config.mjs +170 -0
- package/dist/i18n/hostLanguage.mjs +6 -0
- package/dist/i18n/locales/en.json.mjs +5 -0
- package/dist/i18n/locales/es.json.mjs +5 -0
- package/dist/i18n/locales/fi.json.mjs +5 -0
- package/dist/i18n/locales/fr.json.mjs +5 -0
- package/dist/i18n/locales/index.mjs +13 -0
- package/dist/i18n/locales/nb.json.mjs +5 -0
- package/dist/i18n/locales/nn.json.mjs +5 -0
- package/dist/i18n/locales/no.json.mjs +5 -0
- package/dist/i18n/locales/pt.json.mjs +5 -0
- package/dist/i18n/reader.mjs +13 -0
- package/dist/i18n/useCloverTranslation.mjs +28 -0
- package/dist/index.d.mts +2204 -0
- package/dist/index.mjs +133 -0
- package/dist/lib/asArray.mjs +5 -0
- package/dist/lib/classnames.mjs +5 -0
- package/dist/lib/fullscreen.mjs +65 -0
- package/dist/lib/gltf/bounds.mjs +44 -0
- package/dist/lib/gltf/load.mjs +156 -0
- package/dist/lib/gltf/mat4.mjs +150 -0
- package/dist/lib/gltf/renderer.mjs +342 -0
- package/dist/lib/gltf/shaders.mjs +192 -0
- package/dist/lib/hls.mjs +6 -0
- package/dist/lib/pointer.mjs +38 -0
- package/dist/lib/renderer/CanvasRenderer.mjs +857 -0
- package/dist/lib/renderer/backends/backend.mjs +21 -0
- package/dist/lib/renderer/backends/canvas2d/Canvas2DBackend.mjs +91 -0
- package/dist/lib/renderer/backends/contexts.mjs +27 -0
- package/dist/lib/renderer/backends/dom/DomLayers.mjs +91 -0
- package/dist/lib/renderer/backends/webgl2/WebGL2Backend.mjs +248 -0
- package/dist/lib/renderer/backends/webgl2/shaders.mjs +28 -0
- package/dist/lib/renderer/camera/Camera.mjs +64 -0
- package/dist/lib/renderer/camera/CameraAnimator.mjs +90 -0
- package/dist/lib/renderer/input/GestureController.mjs +252 -0
- package/dist/lib/renderer/io/TileCache.mjs +207 -0
- package/dist/lib/renderer/io/decode.mjs +156 -0
- package/dist/lib/renderer/loop/FrameLoop.mjs +50 -0
- package/dist/lib/renderer/math/affine.mjs +68 -0
- package/dist/lib/renderer/math/rect.mjs +45 -0
- package/dist/lib/renderer/overlays/Navigator.mjs +141 -0
- package/dist/lib/renderer/overlays/OverlayLayer.mjs +94 -0
- package/dist/lib/renderer/scene/planFrame.mjs +168 -0
- package/dist/lib/renderer/scene/regions.mjs +30 -0
- package/dist/lib/renderer/scene/sceneItem.mjs +114 -0
- package/dist/lib/renderer/scene/uploadBudget.mjs +30 -0
- package/dist/lib/renderer/sources/imageService.mjs +160 -0
- package/dist/lib/renderer/sources/sizedImage.mjs +38 -0
- package/dist/lib/renderer/sources/tilePyramid.mjs +172 -0
- package/dist/lib/time.mjs +21 -0
- package/dist/map/index.d.mts +184 -0
- package/dist/map/index.mjs +16 -0
- package/dist/react/context.mjs +46 -0
- package/dist/react/hooks.mjs +69 -0
- package/dist/react/language.mjs +30 -0
- package/dist/styles.css +1 -0
- package/dist/templates/default/Default.mjs +229 -0
- package/dist/templates/document/Document.mjs +286 -0
- package/dist/templates/document/DocumentPanel.mjs +9 -0
- package/dist/templates/document/Sheets.mjs +360 -0
- package/dist/templates/gallery/Gallery.mjs +62 -0
- package/dist/templates/index.d.mts +273 -0
- package/dist/templates/index.mjs +11 -0
- package/dist/templates/shared/Lightbox.mjs +111 -0
- package/dist/templates/shared/LightboxBody.mjs +9 -0
- package/dist/templates/shared/dragToClose.mjs +129 -0
- package/dist/templates/shared/useDragToClose.mjs +35 -0
- package/dist/templates/shared/useDrawer.mjs +113 -0
- package/dist/templates/shared/useFollowFocus.mjs +24 -0
- package/dist/templates/shared/useSlide.mjs +52 -0
- package/dist/templates/shared/useSpine.mjs +26 -0
- package/dist/templates.css +1 -0
- package/dist/three/index.d.mts +6 -0
- package/dist/three/index.mjs +8 -0
- package/dist/ui/Button.mjs +53 -0
- package/dist/ui/ControlCluster.mjs +87 -0
- package/dist/ui/Cue.mjs +13 -0
- package/dist/ui/ErrorBoundary.mjs +26 -0
- package/dist/ui/ExitFullscreen.mjs +46 -0
- package/dist/ui/FieldPill.mjs +153 -0
- package/dist/ui/HideToggle.mjs +57 -0
- package/dist/ui/Loading.mjs +20 -0
- package/dist/ui/Markup.mjs +95 -0
- package/dist/ui/ReadMore.mjs +84 -0
- package/dist/ui/Sections.mjs +448 -0
- package/dist/ui/Steps.mjs +84 -0
- package/dist/ui/Tip.mjs +196 -0
- package/dist/ui/bringIntoView.mjs +27 -0
- package/dist/ui/controlGlyphs.mjs +120 -0
- package/dist/ui/heading.mjs +19 -0
- package/dist/ui/languageCode.mjs +8 -0
- package/dist/ui/mediaIcons.mjs +104 -0
- package/dist/ui/useClusterReach.mjs +50 -0
- package/dist/ui/useContainerName.mjs +19 -0
- package/dist/ui/useOneOpen.mjs +22 -0
- package/dist/ui/useRovingFocus.mjs +64 -0
- package/dist/ui/useScrollTrack.mjs +150 -0
- package/dist/ui/useUniqueId.mjs +10 -0
- package/dist/ui/visuallyHidden.mjs +15 -0
- package/dist/web-components/About-uKa1wfDr.mjs +1 -0
- package/dist/web-components/AnnotationMenu-BGIYRXW6.mjs +1 -0
- package/dist/web-components/AnnotationState-D2UIgIEC.mjs +1 -0
- package/dist/web-components/Annotations-BhwAv3ah.mjs +1 -0
- package/dist/web-components/Annotations-C_tBJHo3.mjs +2 -0
- package/dist/web-components/Body-DMEERFuB.mjs +1 -0
- package/dist/web-components/BodyAlert-BP8voSLv.mjs +1 -0
- package/dist/web-components/Button-Cl02BFDd.mjs +1 -0
- package/dist/web-components/Camera-Dw51CAfF.mjs +1 -0
- package/dist/web-components/Canvas2DBackend-RRN2bEkc.mjs +1 -0
- package/dist/web-components/CanvasView-B8lMMSou.mjs +1 -0
- package/dist/web-components/CaptionDetails-KLMDv-ec.mjs +1 -0
- package/dist/web-components/ChoiceMenu-CXrVOmJl.mjs +1 -0
- package/dist/web-components/Collection-DL4Ui4hF.mjs +1 -0
- package/dist/web-components/CollectionSelect-DL-bbpwJ.mjs +1 -0
- package/dist/web-components/Connected-B0S1HXQb.mjs +1 -0
- package/dist/web-components/Connected-BcjRA5si.mjs +1 -0
- package/dist/web-components/Connected-Q7iizBb8.mjs +1 -0
- package/dist/web-components/Contents-ZC8TiGaW.mjs +1 -0
- package/dist/web-components/ControlMenu-DIoU797-.mjs +1 -0
- package/dist/web-components/Cue-CJxnDMEy.mjs +1 -0
- package/dist/web-components/Document-DHBRAFEK.mjs +1 -0
- package/dist/web-components/DocumentPanel-CqvE2pu9.mjs +1 -0
- package/dist/web-components/DomLayers-BsR2AOy-.mjs +1 -0
- package/dist/web-components/Download-DBksL1C0.mjs +1 -0
- package/dist/web-components/EntryBodies-VwEkTVrw.mjs +1 -0
- package/dist/web-components/ErrorBoundary-Cy9PGoZv.mjs +1 -0
- package/dist/web-components/FieldPill-DCJBz6Vj.mjs +1 -0
- package/dist/web-components/FrameAnimation-DRbmgGpF.mjs +1 -0
- package/dist/web-components/Gallery-BM7-VJkB.mjs +1 -0
- package/dist/web-components/HideToggle-BdYgG7us.mjs +1 -0
- package/dist/web-components/Items-_1Jz3FMs.mjs +1 -0
- package/dist/web-components/Label-CAiJ49eA.mjs +1 -0
- package/dist/web-components/LightboxBody-DyhUZiDf.mjs +1 -0
- package/dist/web-components/Loaded-wQurAeJz.mjs +1 -0
- package/dist/web-components/LoadedCanvas-DWz5IK5m.mjs +1 -0
- package/dist/web-components/LoadedMap-DIeW313M.mjs +1 -0
- package/dist/web-components/Loading-BmA--pzr.mjs +1 -0
- package/dist/web-components/Map-DzVGblIS.mjs +1 -0
- package/dist/web-components/MapView-BJaN7VBI.mjs +1 -0
- package/dist/web-components/Markup-D91DbxLk.mjs +2 -0
- package/dist/web-components/MediaBody-BYcVPo2X.mjs +1 -0
- package/dist/web-components/MediaBody-FEzH8VVw.mjs +1 -0
- package/dist/web-components/Navigator-CIJFA3q1.mjs +1 -0
- package/dist/web-components/Pager-BGwCurxE.mjs +1 -0
- package/dist/web-components/Panel-B-GXOkzF.mjs +1 -0
- package/dist/web-components/PanelToggle-BYjV2t1j.mjs +1 -0
- package/dist/web-components/PartOfManifest-ClbGepVM.mjs +1 -0
- package/dist/web-components/Pending-BspZajh5.mjs +1 -0
- package/dist/web-components/Primitives-CTh59wvs.mjs +1 -0
- package/dist/web-components/Provider-C6rIiDXH.mjs +1 -0
- package/dist/web-components/ReadMore-BJ2i-0uN.mjs +1 -0
- package/dist/web-components/Root-DkkYDtur.mjs +1 -0
- package/dist/web-components/Scene-B_PU_TiX.mjs +1 -0
- package/dist/web-components/SceneView-qcW_sT3j.mjs +1 -0
- package/dist/web-components/Search-UOneIUcP.mjs +1 -0
- package/dist/web-components/Sections-we9U9fXq.mjs +2 -0
- package/dist/web-components/StandaloneItems-DU8oCFc_.mjs +1 -0
- package/dist/web-components/Status-Cs5ZvFvL.mjs +1 -0
- package/dist/web-components/Timeline-WtYZ1bIJ.mjs +1 -0
- package/dist/web-components/Tip-C8J3qsIK.mjs +1 -0
- package/dist/web-components/Transcript-CRL2zToL.mjs +1 -0
- package/dist/web-components/annotation-collection-ZPyvpLFc.mjs +1 -0
- package/dist/web-components/annotations-content-BZChKhJZ.mjs +1 -0
- package/dist/web-components/assets/maplibre-gl-worker-kTz9OPxr.js +13831 -0
- package/dist/web-components/body-UntgrmoV.mjs +1 -0
- package/dist/web-components/bringIntoView-CQH5ZgMM.mjs +1 -0
- package/dist/web-components/canvas-d_U4v_mh.mjs +1 -0
- package/dist/web-components/classnames-DukgfdpI.mjs +1 -0
- package/dist/web-components/cloverEngine-Dbv-26NP.mjs +164 -0
- package/dist/web-components/content-state-reader-DjdKWjit.mjs +1 -0
- package/dist/web-components/contexts-ByL3eA_T.mjs +1 -0
- package/dist/web-components/controls-qRYf2jO2.mjs +1 -0
- package/dist/web-components/custom-elements.json +2739 -0
- package/dist/web-components/dragToClose-C-Pf1IeO.mjs +1 -0
- package/dist/web-components/engine-D8JLgzqq.mjs +4228 -0
- package/dist/web-components/engines-BwVb9R_A.mjs +1 -0
- package/dist/web-components/es-BwMkoRod.mjs +1 -0
- package/dist/web-components/fi-gPFOn9RK.mjs +1 -0
- package/dist/web-components/fr-DUHmgdJo.mjs +1 -0
- package/dist/web-components/fromManifest-UrMJgktp.mjs +1 -0
- package/dist/web-components/glyphs-BoX0a88P.mjs +1 -0
- package/dist/web-components/heading-Cjt0f-Eu.mjs +1 -0
- package/dist/web-components/hls-CdKrthkC.mjs +40 -0
- package/dist/web-components/hooks-Dp8pjU8l.mjs +1 -0
- package/dist/web-components/imageService-C3yg9DxB.mjs +1 -0
- package/dist/web-components/index-DWxMuwDL.mjs +1 -0
- package/dist/web-components/index.d.mts +604 -0
- package/dist/web-components/index.mjs +1 -0
- package/dist/web-components/index.umd.js +18 -0
- package/dist/web-components/items--Tu7ZM3L.mjs +1 -0
- package/dist/web-components/items-W2vrwArM.mjs +1 -0
- package/dist/web-components/keep-fragments-B5nlv2ck.mjs +1 -0
- package/dist/web-components/label-CYQ7tVl6.mjs +1 -0
- package/dist/web-components/languageCode-cCpiU0b0.mjs +1 -0
- package/dist/web-components/layout-KL0V-iJu.mjs +1 -0
- package/dist/web-components/link-DRRTY4lY.mjs +1 -0
- package/dist/web-components/logo-CnQUCB3Y.mjs +1 -0
- package/dist/web-components/maplibre-gl-CQ4OueXY.mjs +823 -0
- package/dist/web-components/markdown-CCYJwzFn.mjs +5 -0
- package/dist/web-components/models-BP2qp9nT.mjs +1 -0
- package/dist/web-components/nb-BSvnQ6jd.mjs +1 -0
- package/dist/web-components/nn-Dg2_HdZu.mjs +1 -0
- package/dist/web-components/no-BSvnQ6jd.mjs +1 -0
- package/dist/web-components/nodes-Bf-Fb7e5.mjs +1 -0
- package/dist/web-components/overlayImage-DdPs2EGY.mjs +1 -0
- package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +1 -0
- package/dist/web-components/panel-CiqEFDzv.mjs +1 -0
- package/dist/web-components/part-CUBY90_b.mjs +1 -0
- package/dist/web-components/playerSurface-i2TJz-F4.mjs +1 -0
- package/dist/web-components/provider-LUmAQSoP.mjs +1 -0
- package/dist/web-components/pt-B3J80JgO.mjs +1 -0
- package/dist/web-components/read-more-BaaO77el.mjs +1 -0
- package/dist/web-components/rendererSurface-DAvatpMF.mjs +22 -0
- package/dist/web-components/renderers-Bg4QqawN.mjs +1 -0
- package/dist/web-components/resource-DzIvB_4m.mjs +1 -0
- package/dist/web-components/sanitize-Dc7nOsgO.mjs +3 -0
- package/dist/web-components/search-DgcgsI3I.mjs +1 -0
- package/dist/web-components/shared-J3w3gnXD.mjs +1 -0
- package/dist/web-components/show-link-DWRRXSBy.mjs +1 -0
- package/dist/web-components/sizedImage-DfjlV2-i.mjs +1 -0
- package/dist/web-components/split-m-_XivaW.mjs +1 -0
- package/dist/web-components/splitting-BnQUxxgH.mjs +1 -0
- package/dist/web-components/status-DDS7jLNd.mjs +1 -0
- package/dist/web-components/styles-Ypl9KrSK.mjs +1 -0
- package/dist/web-components/svg-shape-DLY3g7oq.mjs +1 -0
- package/dist/web-components/text-BTAkxEfQ.mjs +5 -0
- package/dist/web-components/three.mjs +1 -0
- package/dist/web-components/thumbnail-BZvLSwWW.mjs +1 -0
- package/dist/web-components/time-B9GZoYcm.mjs +1 -0
- package/dist/web-components/tip-BXByhOJ9.mjs +1 -0
- package/dist/web-components/toggle-AS72kq6v.mjs +1 -0
- package/dist/web-components/upgrader-XNxI-5jo.mjs +1 -0
- package/dist/web-components/useContainerName-DCbE5JXi.mjs +1 -0
- package/dist/web-components/useNearViewport-CyoK3l8W.mjs +1 -0
- package/dist/web-components/useScrollTrack-dLFWnT8N.mjs +1 -0
- package/dist/web-components/viewer/AnnotationMenu-Dd4tnzNV.mjs +1 -0
- package/dist/web-components/viewer/AnnotationState-DZaSy5lH.mjs +1 -0
- package/dist/web-components/viewer/Annotations-D1h-Yi5J.mjs +1 -0
- package/dist/web-components/viewer/Annotations-sj79EMen.mjs +2 -0
- package/dist/web-components/viewer/Canvas2DBackend-CkvI0wUT.mjs +1 -0
- package/dist/web-components/viewer/CaptionDetails-B_JdNjJ7.mjs +1 -0
- package/dist/web-components/viewer/ChoiceMenu-xa51a1DV.mjs +1 -0
- package/dist/web-components/viewer/Collection-CxuLCspj.mjs +1 -0
- package/dist/web-components/viewer/Connected-BSUBc3Ci.mjs +1 -0
- package/dist/web-components/viewer/Connected-CPIxNjF2.mjs +1 -0
- package/dist/web-components/viewer/Contents-DNh9mnsF.mjs +1 -0
- package/dist/web-components/viewer/ControlMenu-DdgIvBdf.mjs +1 -0
- package/dist/web-components/viewer/Cue-90H9_dXz.mjs +1 -0
- package/dist/web-components/viewer/Document-CNCpzkiN.mjs +1 -0
- package/dist/web-components/viewer/DocumentPanel-BdG4TVLE.mjs +1 -0
- package/dist/web-components/viewer/DomLayers-Dybz_aJv.mjs +1 -0
- package/dist/web-components/viewer/EntryBodies-DGXjFP3N.mjs +1 -0
- package/dist/web-components/viewer/FieldPill-Icmd98OY.mjs +1 -0
- package/dist/web-components/viewer/FrameAnimation-DJZN3Rd4.mjs +1 -0
- package/dist/web-components/viewer/Gallery-CEp3-bh2.mjs +1 -0
- package/dist/web-components/viewer/HideToggle-DB6HTmAO.mjs +1 -0
- package/dist/web-components/viewer/LightboxBody-ClQ4yrTh.mjs +1 -0
- package/dist/web-components/viewer/MapView-BVSdybIC.mjs +1 -0
- package/dist/web-components/viewer/MediaBody-BBbSMT1i.mjs +1 -0
- package/dist/web-components/viewer/MediaBody-BzMXMHIF.mjs +1 -0
- package/dist/web-components/viewer/Navigator-Duc69Yes.mjs +1 -0
- package/dist/web-components/viewer/PartOfManifest-X9_q-2t6.mjs +1 -0
- package/dist/web-components/viewer/Search-S4N5QU4R.mjs +1 -0
- package/dist/web-components/viewer/StandaloneItems-BO4VyWRW.mjs +1 -0
- package/dist/web-components/viewer/Transcript-BbDaS064.mjs +1 -0
- package/dist/web-components/viewer/annotation-collection-BjZ1DAHq.mjs +1 -0
- package/dist/web-components/viewer/annotations-content-jn3n5Y2-.mjs +1 -0
- package/dist/web-components/viewer/cloverEngine-CjuYjUhI.mjs +164 -0
- package/dist/web-components/viewer/content-state-reader-CPiShIjP.mjs +1 -0
- package/dist/web-components/viewer/host-yWi4R1bP.mjs +1 -0
- package/dist/web-components/viewer/index.d.mts +7 -0
- package/dist/web-components/viewer/index.mjs +1 -0
- package/dist/web-components/viewer/index.umd.js +18 -0
- package/dist/web-components/viewer/link-CwE-fg5G.mjs +1 -0
- package/dist/web-components/viewer/overlayImage-BpOgqsZ0.mjs +1 -0
- package/dist/web-components/viewer/renderers-L-IlGI1r.mjs +1 -0
- package/dist/web-components/viewer/search-DWkwRPo_.mjs +1 -0
- package/dist/web-components/viewer/styles-BRCkEU3w.mjs +1 -0
- package/dist/web-components/viewer/viewer--TreVlJ_.mjs +28 -0
- package/dist/web-components/viewer/vtt-1ZJwtElI.mjs +5 -0
- package/dist/web-components/viewer-DyV864Qe.mjs +1 -0
- package/dist/web-components/vtt-GFssZH8Y.mjs +5 -0
- package/package.json +110 -4
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useCloverTranslation } from "../../../i18n/useCloverTranslation.mjs";
|
|
4
|
+
import { Tip } from "../../../ui/Tip.mjs";
|
|
5
|
+
function TransportButton({
|
|
6
|
+
words,
|
|
7
|
+
button,
|
|
8
|
+
shortcut,
|
|
9
|
+
disabled,
|
|
10
|
+
pressed,
|
|
11
|
+
onClick,
|
|
12
|
+
buttonRef,
|
|
13
|
+
children
|
|
14
|
+
}) {
|
|
15
|
+
const { t, langOf } = useCloverTranslation();
|
|
16
|
+
const label = t(words);
|
|
17
|
+
return /* @__PURE__ */ jsxs(
|
|
18
|
+
"button",
|
|
19
|
+
{
|
|
20
|
+
"aria-label": label,
|
|
21
|
+
lang: langOf(words),
|
|
22
|
+
"aria-keyshortcuts": shortcut == null ? void 0 : shortcut.keys,
|
|
23
|
+
"aria-disabled": disabled || void 0,
|
|
24
|
+
"aria-pressed": pressed,
|
|
25
|
+
className: "clover-canvas-transport-button",
|
|
26
|
+
"data-button": button,
|
|
27
|
+
onClick,
|
|
28
|
+
ref: buttonRef,
|
|
29
|
+
type: "button",
|
|
30
|
+
children: [
|
|
31
|
+
children,
|
|
32
|
+
/* @__PURE__ */ jsx(Tip, { label, shortcut })
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
TransportButton
|
|
39
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useLayoutEffect } from "react";
|
|
3
|
+
function useBarHeight(bar) {
|
|
4
|
+
useLayoutEffect(() => {
|
|
5
|
+
const element = bar.current;
|
|
6
|
+
const canvas = element == null ? void 0 : element.closest(".clover-canvas");
|
|
7
|
+
if (!element || !canvas) return;
|
|
8
|
+
const write = () => {
|
|
9
|
+
const height = element.offsetHeight;
|
|
10
|
+
if (height) {
|
|
11
|
+
canvas.style.setProperty(
|
|
12
|
+
"--clover-transport-bar-height",
|
|
13
|
+
`${height}px`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
write();
|
|
18
|
+
const observer = new ResizeObserver(write);
|
|
19
|
+
observer.observe(element);
|
|
20
|
+
return () => {
|
|
21
|
+
observer.disconnect();
|
|
22
|
+
canvas.style.removeProperty("--clover-transport-bar-height");
|
|
23
|
+
};
|
|
24
|
+
}, [bar]);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
useBarHeight
|
|
28
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useEffect, useMemo } from "react";
|
|
3
|
+
const SYSTEM_EVENTS = [
|
|
4
|
+
"webkitbeginfullscreen",
|
|
5
|
+
"webkitendfullscreen",
|
|
6
|
+
"enterpictureinpicture",
|
|
7
|
+
"leavepictureinpicture",
|
|
8
|
+
"webkitpresentationmodechanged"
|
|
9
|
+
];
|
|
10
|
+
const NO_TRACKS = [];
|
|
11
|
+
const isCaptions = (track) => track.kind === "captions" || track.kind === "subtitles";
|
|
12
|
+
function inSystemPlayer(video, type) {
|
|
13
|
+
if (type === "webkitbeginfullscreen" || type === "enterpictureinpicture") {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const fullscreen = type !== "webkitendfullscreen" && Boolean(video.webkitDisplayingFullscreen);
|
|
17
|
+
const pictureInPicture = type !== "leavepictureinpicture" && (video.webkitPresentationMode === "picture-in-picture" || typeof document !== "undefined" && document.pictureInPictureElement === video);
|
|
18
|
+
return fullscreen || pictureInPicture;
|
|
19
|
+
}
|
|
20
|
+
function useCaptionTracks(element, own, key) {
|
|
21
|
+
const ownCount = own.length;
|
|
22
|
+
const first = ownCount ? 0 : -1;
|
|
23
|
+
const [selection, setSelection] = useState({
|
|
24
|
+
choice: first,
|
|
25
|
+
picked: false,
|
|
26
|
+
key
|
|
27
|
+
});
|
|
28
|
+
if (selection.key !== key) {
|
|
29
|
+
setSelection({ choice: first, picked: false, key });
|
|
30
|
+
}
|
|
31
|
+
const { choice, picked } = selection;
|
|
32
|
+
const [stream, setStream] = useState(NO_TRACKS);
|
|
33
|
+
const [system, setSystem] = useState(false);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
var _a, _b;
|
|
36
|
+
const list = element == null ? void 0 : element.textTracks;
|
|
37
|
+
if (!list) {
|
|
38
|
+
setStream(NO_TRACKS);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const read = () => {
|
|
42
|
+
const found = Array.from(list).slice(ownCount).filter(isCaptions);
|
|
43
|
+
setStream(
|
|
44
|
+
(current) => current.length === found.length && current.every((track2, index) => track2 === found[index]) ? current : found.length ? found : NO_TRACKS
|
|
45
|
+
);
|
|
46
|
+
};
|
|
47
|
+
read();
|
|
48
|
+
(_a = list.addEventListener) == null ? void 0 : _a.call(list, "addtrack", read);
|
|
49
|
+
(_b = list.addEventListener) == null ? void 0 : _b.call(list, "removetrack", read);
|
|
50
|
+
return () => {
|
|
51
|
+
var _a2, _b2;
|
|
52
|
+
(_a2 = list.removeEventListener) == null ? void 0 : _a2.call(list, "addtrack", read);
|
|
53
|
+
(_b2 = list.removeEventListener) == null ? void 0 : _b2.call(list, "removetrack", read);
|
|
54
|
+
};
|
|
55
|
+
}, [element, ownCount]);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
setSystem(false);
|
|
58
|
+
if (!element) return;
|
|
59
|
+
const video = element;
|
|
60
|
+
const update = (event) => setSystem(inSystemPlayer(video, event.type));
|
|
61
|
+
SYSTEM_EVENTS.forEach((type) => video.addEventListener(type, update));
|
|
62
|
+
return () => SYSTEM_EVENTS.forEach((type) => video.removeEventListener(type, update));
|
|
63
|
+
}, [element]);
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
var _a;
|
|
66
|
+
const list = element == null ? void 0 : element.textTracks;
|
|
67
|
+
if (!list) return;
|
|
68
|
+
const tracks = () => Array.from(list);
|
|
69
|
+
const resolve = (all) => typeof choice === "number" ? choice >= 0 ? all[choice] : void 0 : all.includes(choice) ? choice : void 0;
|
|
70
|
+
const apply = () => {
|
|
71
|
+
const all = tracks();
|
|
72
|
+
const chosen = resolve(all);
|
|
73
|
+
all.forEach((track2, index) => {
|
|
74
|
+
const mode = track2 === chosen ? system ? "showing" : "hidden" : index < ownCount ? "hidden" : isCaptions(track2) ? "disabled" : null;
|
|
75
|
+
if (mode && track2.mode !== mode) track2.mode = mode;
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const adopt = () => {
|
|
79
|
+
if (picked || ownCount || choice !== -1) return false;
|
|
80
|
+
const shown = tracks().slice(ownCount).find((track2) => isCaptions(track2) && track2.mode === "showing");
|
|
81
|
+
if (!shown) return false;
|
|
82
|
+
setSelection({ choice: shown, picked: false, key });
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
85
|
+
const follow = () => {
|
|
86
|
+
const all = tracks();
|
|
87
|
+
const at2 = all.findIndex(
|
|
88
|
+
(track2, index) => (index < ownCount || isCaptions(track2)) && track2.mode === "showing"
|
|
89
|
+
);
|
|
90
|
+
if (all[at2] === resolve(all)) return;
|
|
91
|
+
setSelection({
|
|
92
|
+
choice: at2 < 0 ? -1 : at2 < ownCount ? at2 : all[at2],
|
|
93
|
+
picked: true,
|
|
94
|
+
key
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
if (system || !adopt()) apply();
|
|
98
|
+
const onChange = () => {
|
|
99
|
+
if (system) follow();
|
|
100
|
+
else if (!adopt()) apply();
|
|
101
|
+
};
|
|
102
|
+
(_a = list.addEventListener) == null ? void 0 : _a.call(list, "change", onChange);
|
|
103
|
+
return () => {
|
|
104
|
+
var _a2;
|
|
105
|
+
return (_a2 = list.removeEventListener) == null ? void 0 : _a2.call(list, "change", onChange);
|
|
106
|
+
};
|
|
107
|
+
}, [element, choice, picked, system, ownCount, key, stream]);
|
|
108
|
+
const options = useMemo(
|
|
109
|
+
() => [
|
|
110
|
+
...own,
|
|
111
|
+
...stream.map((track2, index) => ({
|
|
112
|
+
label: track2.label || track2.language || String(own.length + index + 1),
|
|
113
|
+
labelLang: track2.label ? track2.language || void 0 : void 0,
|
|
114
|
+
language: track2.language || void 0
|
|
115
|
+
}))
|
|
116
|
+
],
|
|
117
|
+
[own, stream]
|
|
118
|
+
);
|
|
119
|
+
const at = typeof choice === "number" ? -1 : stream.indexOf(choice);
|
|
120
|
+
const active = typeof choice === "number" ? choice : at < 0 ? -1 : ownCount + at;
|
|
121
|
+
const track = typeof choice === "number" ? choice >= 0 ? Array.from((element == null ? void 0 : element.textTracks) ?? NO_TRACKS)[choice] : void 0 : stream[at];
|
|
122
|
+
const select = (index) => setSelection({
|
|
123
|
+
choice: index < 0 ? -1 : index < ownCount ? index : stream[index - ownCount] ?? -1,
|
|
124
|
+
picked: true,
|
|
125
|
+
key
|
|
126
|
+
});
|
|
127
|
+
return { options, active, select, track };
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
useCaptionTracks
|
|
131
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useState, useEffect } from "react";
|
|
3
|
+
const EVENTS = [
|
|
4
|
+
"play",
|
|
5
|
+
"pause",
|
|
6
|
+
"ended",
|
|
7
|
+
"timeupdate",
|
|
8
|
+
"durationchange",
|
|
9
|
+
"loadedmetadata",
|
|
10
|
+
"volumechange",
|
|
11
|
+
"progress",
|
|
12
|
+
"seeked"
|
|
13
|
+
];
|
|
14
|
+
function useMediaController(element, declaredDuration) {
|
|
15
|
+
const read = useCallback(
|
|
16
|
+
(el) => {
|
|
17
|
+
const duration = el && Number.isFinite(el.duration) && el.duration > 0 ? el.duration : declaredDuration ?? 0;
|
|
18
|
+
let buffered = 0;
|
|
19
|
+
if (el && el.buffered.length) {
|
|
20
|
+
buffered = el.buffered.end(el.buffered.length - 1);
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
paused: (el == null ? void 0 : el.paused) ?? true,
|
|
24
|
+
currentTime: (el == null ? void 0 : el.currentTime) ?? 0,
|
|
25
|
+
duration,
|
|
26
|
+
muted: (el == null ? void 0 : el.muted) ?? false,
|
|
27
|
+
volume: (el == null ? void 0 : el.volume) ?? 1,
|
|
28
|
+
buffered
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
[declaredDuration]
|
|
32
|
+
);
|
|
33
|
+
const [state, setState] = useState(() => read(element));
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
setState(read(element));
|
|
36
|
+
if (!element) return;
|
|
37
|
+
const sync = () => setState(read(element));
|
|
38
|
+
EVENTS.forEach((type) => element.addEventListener(type, sync));
|
|
39
|
+
return () => EVENTS.forEach((type) => element.removeEventListener(type, sync));
|
|
40
|
+
}, [element, read]);
|
|
41
|
+
const play = useCallback(() => {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
(_b = (_a = element == null ? void 0 : element.play()) == null ? void 0 : _a.catch) == null ? void 0 : _b.call(_a, () => void 0);
|
|
44
|
+
}, [element]);
|
|
45
|
+
const pause = useCallback(() => element == null ? void 0 : element.pause(), [element]);
|
|
46
|
+
const toggle = useCallback(
|
|
47
|
+
() => (element == null ? void 0 : element.paused) ? play() : pause(),
|
|
48
|
+
[element, play, pause]
|
|
49
|
+
);
|
|
50
|
+
const seek = useCallback(
|
|
51
|
+
(seconds) => {
|
|
52
|
+
if (!element) return;
|
|
53
|
+
const max = Number.isFinite(element.duration) ? element.duration : state.duration;
|
|
54
|
+
element.currentTime = Math.max(0, Math.min(max || seconds, seconds));
|
|
55
|
+
},
|
|
56
|
+
[element, state.duration]
|
|
57
|
+
);
|
|
58
|
+
const skip = useCallback(
|
|
59
|
+
(seconds) => element && seek(element.currentTime + seconds),
|
|
60
|
+
[element, seek]
|
|
61
|
+
);
|
|
62
|
+
const setVolume = useCallback(
|
|
63
|
+
(volume) => {
|
|
64
|
+
if (!element) return;
|
|
65
|
+
element.volume = Math.max(0, Math.min(1, volume));
|
|
66
|
+
element.muted = element.volume === 0;
|
|
67
|
+
},
|
|
68
|
+
[element]
|
|
69
|
+
);
|
|
70
|
+
const toggleMute = useCallback(() => {
|
|
71
|
+
if (element) element.muted = !element.muted;
|
|
72
|
+
}, [element]);
|
|
73
|
+
return { ...state, play, toggle, seek, skip, setVolume, toggleMute };
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
useMediaController
|
|
77
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useRef, useEffect } from "react";
|
|
3
|
+
import { STILL_SIZE } from "../layout.mjs";
|
|
4
|
+
import { resolveThumbnail } from "../../../core/thumbnail.mjs";
|
|
5
|
+
import { localize } from "../../../core/value.mjs";
|
|
6
|
+
import { sendsCredentials, requestKey } from "../../../core/request.mjs";
|
|
7
|
+
import { loadVtt } from "../../../core/vtt.mjs";
|
|
8
|
+
import { isHls } from "../../../lib/hls.mjs";
|
|
9
|
+
function captionName(caption, index, language) {
|
|
10
|
+
const name = localize(caption.label, language);
|
|
11
|
+
return name.text ? { text: name.text, lang: name.lang } : { text: caption.language || String(index + 1) };
|
|
12
|
+
}
|
|
13
|
+
function useMediaElement(media, { request, language }) {
|
|
14
|
+
const [element, setElement] = useState(null);
|
|
15
|
+
const captionsKey = JSON.stringify(media.captions);
|
|
16
|
+
const posterKey = media.poster ? media.poster.src ?? media.poster.service ?? "" : "";
|
|
17
|
+
const withCredentials = sendsCredentials(request);
|
|
18
|
+
const requestRef = useRef(request);
|
|
19
|
+
requestRef.current = request;
|
|
20
|
+
const languageRef = useRef(language);
|
|
21
|
+
languageRef.current = language;
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
let canceled = false;
|
|
24
|
+
const video = document.createElement("video");
|
|
25
|
+
video.playsInline = true;
|
|
26
|
+
video.preload = "metadata";
|
|
27
|
+
video.className = "clover-canvas-media-element";
|
|
28
|
+
const poster = media.poster;
|
|
29
|
+
if (poster == null ? void 0 : poster.src) video.poster = poster.src;
|
|
30
|
+
else if (poster)
|
|
31
|
+
void resolveThumbnail(poster, STILL_SIZE, requestRef.current).then(
|
|
32
|
+
(url) => {
|
|
33
|
+
if (!canceled && url) video.poster = url;
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
const blobs = [];
|
|
37
|
+
media.captions.forEach((caption, index) => {
|
|
38
|
+
const track = document.createElement("track");
|
|
39
|
+
track.kind = "captions";
|
|
40
|
+
if (caption.language) track.srclang = caption.language;
|
|
41
|
+
track.label = captionName(caption, index, languageRef.current).text;
|
|
42
|
+
video.appendChild(track);
|
|
43
|
+
loadVtt(caption.id, requestRef.current).then((text) => {
|
|
44
|
+
if (canceled) return;
|
|
45
|
+
const url = URL.createObjectURL(
|
|
46
|
+
new Blob([text], { type: "text/vtt" })
|
|
47
|
+
);
|
|
48
|
+
blobs.push(url);
|
|
49
|
+
track.src = url;
|
|
50
|
+
}).catch(() => void 0);
|
|
51
|
+
});
|
|
52
|
+
let hls = null;
|
|
53
|
+
if (isHls(media.src, media.format)) {
|
|
54
|
+
import("hls.js").then(({ default: Hls }) => {
|
|
55
|
+
if (canceled) return;
|
|
56
|
+
if (!Hls.isSupported()) {
|
|
57
|
+
video.src = media.src;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const instance = new Hls({
|
|
61
|
+
xhrSetup: (xhr) => {
|
|
62
|
+
var _a;
|
|
63
|
+
xhr.withCredentials = withCredentials;
|
|
64
|
+
for (const [name, value] of Object.entries(
|
|
65
|
+
((_a = requestRef.current) == null ? void 0 : _a.headers) ?? {}
|
|
66
|
+
)) {
|
|
67
|
+
xhr.setRequestHeader(name, value);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
instance.loadSource(media.src);
|
|
72
|
+
instance.attachMedia(video);
|
|
73
|
+
hls = instance;
|
|
74
|
+
}).catch(() => {
|
|
75
|
+
if (!canceled) video.src = media.src;
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
video.src = media.src;
|
|
79
|
+
}
|
|
80
|
+
for (const track of Array.from(video.textTracks ?? [])) {
|
|
81
|
+
track.mode = "hidden";
|
|
82
|
+
}
|
|
83
|
+
setElement(video);
|
|
84
|
+
return () => {
|
|
85
|
+
canceled = true;
|
|
86
|
+
video.pause();
|
|
87
|
+
hls == null ? void 0 : hls.destroy();
|
|
88
|
+
video.removeAttribute("src");
|
|
89
|
+
video.load();
|
|
90
|
+
video.remove();
|
|
91
|
+
blobs.forEach((url) => URL.revokeObjectURL(url));
|
|
92
|
+
setElement(null);
|
|
93
|
+
};
|
|
94
|
+
}, [media.src, media.format, posterKey, captionsKey, requestKey(request)]);
|
|
95
|
+
return element;
|
|
96
|
+
}
|
|
97
|
+
export {
|
|
98
|
+
captionName,
|
|
99
|
+
useMediaElement
|
|
100
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const CONTROLS = [
|
|
3
|
+
".clover-canvas-controls",
|
|
4
|
+
".clover-canvas-navigator",
|
|
5
|
+
".clover-canvas-transport",
|
|
6
|
+
'.clover-canvas-caption[data-open="true"]',
|
|
7
|
+
".clover-canvas-menu",
|
|
8
|
+
".clover-canvas-placeholder-toggle",
|
|
9
|
+
".clover-canvas-exit-full-screen"
|
|
10
|
+
].join(", ");
|
|
11
|
+
const overlap = (a, b, c, d) => a < d && c < b;
|
|
12
|
+
function panClearOfControls(renderer, hotspot) {
|
|
13
|
+
var _a;
|
|
14
|
+
const layer = (_a = renderer.overlays) == null ? void 0 : _a.container;
|
|
15
|
+
if (!layer) return;
|
|
16
|
+
const figure = layer.closest(".clover-canvas");
|
|
17
|
+
if ((figure == null ? void 0 : figure.getAttribute("data-navigable")) === "false") return;
|
|
18
|
+
const bodyRect = layer.getBoundingClientRect();
|
|
19
|
+
if (!bodyRect.width || !bodyRect.height) return;
|
|
20
|
+
const clear = {
|
|
21
|
+
top: bodyRect.top,
|
|
22
|
+
right: bodyRect.right,
|
|
23
|
+
bottom: bodyRect.bottom,
|
|
24
|
+
left: bodyRect.left
|
|
25
|
+
};
|
|
26
|
+
let pieces = Array.from(
|
|
27
|
+
(figure == null ? void 0 : figure.querySelectorAll(CONTROLS)) ?? []
|
|
28
|
+
).flatMap((piece) => {
|
|
29
|
+
if (piece.closest(".clover-canvas") !== figure) return [];
|
|
30
|
+
const [tx = 0, ty = 0] = (getComputedStyle(piece).translate || "").split(" ").map((length) => parseFloat(length) || 0);
|
|
31
|
+
const moving = piece.getBoundingClientRect();
|
|
32
|
+
const top = moving.top - ty;
|
|
33
|
+
const right = moving.right - tx;
|
|
34
|
+
const bottom = moving.bottom - ty;
|
|
35
|
+
const left = moving.left - tx;
|
|
36
|
+
if (!moving.width || !moving.height || !overlap(left, right, bodyRect.left, bodyRect.right) || !overlap(top, bottom, bodyRect.top, bodyRect.bottom))
|
|
37
|
+
return [];
|
|
38
|
+
const sides = [
|
|
39
|
+
["top", bottom - bodyRect.top],
|
|
40
|
+
["bottom", bodyRect.bottom - top],
|
|
41
|
+
["left", right - bodyRect.left],
|
|
42
|
+
["right", bodyRect.right - left]
|
|
43
|
+
];
|
|
44
|
+
const [side] = sides.reduce(
|
|
45
|
+
(least, cut) => cut[1] < least[1] ? cut : least
|
|
46
|
+
);
|
|
47
|
+
return [{ side, top, right, bottom, left }];
|
|
48
|
+
});
|
|
49
|
+
const boxes = [
|
|
50
|
+
hotspot,
|
|
51
|
+
hotspot.querySelector(".clover-canvas-annotation-point")
|
|
52
|
+
].filter((node) => Boolean(node)).map((node) => node.getBoundingClientRect());
|
|
53
|
+
const own = {
|
|
54
|
+
top: Math.min(...boxes.map((box) => box.top)),
|
|
55
|
+
right: Math.max(...boxes.map((box) => box.right)),
|
|
56
|
+
bottom: Math.max(...boxes.map((box) => box.bottom)),
|
|
57
|
+
left: Math.min(...boxes.map((box) => box.left))
|
|
58
|
+
};
|
|
59
|
+
let dx = 0;
|
|
60
|
+
let dy = 0;
|
|
61
|
+
for (let cut = true; cut; ) {
|
|
62
|
+
const beside = pieces.filter(
|
|
63
|
+
(piece) => piece.side === "top" || piece.side === "bottom" ? overlap(piece.left, piece.right, own.left + dx, own.right + dx) : overlap(piece.top, piece.bottom, own.top + dy, own.bottom + dy)
|
|
64
|
+
);
|
|
65
|
+
pieces = pieces.filter((piece) => !beside.includes(piece));
|
|
66
|
+
cut = beside.length > 0;
|
|
67
|
+
for (const piece of beside) {
|
|
68
|
+
if (piece.side === "top") clear.top = Math.max(clear.top, piece.bottom);
|
|
69
|
+
if (piece.side === "bottom")
|
|
70
|
+
clear.bottom = Math.min(clear.bottom, piece.top);
|
|
71
|
+
if (piece.side === "left") clear.left = Math.max(clear.left, piece.right);
|
|
72
|
+
if (piece.side === "right")
|
|
73
|
+
clear.right = Math.min(clear.right, piece.left);
|
|
74
|
+
}
|
|
75
|
+
dx = shift(own.left, own.right, clear.left, clear.right);
|
|
76
|
+
dy = shift(own.top, own.bottom, clear.top, clear.bottom);
|
|
77
|
+
}
|
|
78
|
+
if (!dx && !dy) return;
|
|
79
|
+
const center = renderer.worldToScreenPoint(renderer.getCamera());
|
|
80
|
+
renderer.panTo(
|
|
81
|
+
renderer.screenToWorldPoint({ x: center.x - dx, y: center.y - dy })
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
function shift(start, end, min, max) {
|
|
85
|
+
if (end - start > max - min) return (min + max - start - end) / 2;
|
|
86
|
+
if (start < min) return min - start;
|
|
87
|
+
if (end > max) return max - end;
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
panClearOfControls
|
|
92
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { parseAnnotationTarget } from "../../core/annotations.mjs";
|
|
3
|
+
import { GROUPS } from "../../core/painting.mjs";
|
|
4
|
+
const partsOf = (target) => Array.isArray(target) ? target.flatMap(partsOf) : GROUPS.includes(target == null ? void 0 : target.type) ? partsOf(target.items ?? []) : target == null ? [] : [target];
|
|
5
|
+
const annotationTargets = (target) => partsOf(target).map((part) => parseAnnotationTarget(part));
|
|
6
|
+
const meets = (key, next) => Math.abs(key.end - next.start) < 1e-3;
|
|
7
|
+
const lerp = (a, b, f) => a + (b - a) * f;
|
|
8
|
+
function orderKeys(keys) {
|
|
9
|
+
const ordered = [...keys].sort((a, b) => a.start - b.start);
|
|
10
|
+
return ordered.map((key, index) => {
|
|
11
|
+
const next = ordered[index + 1];
|
|
12
|
+
return key.end === Infinity && next ? { ...key, end: next.start } : key;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function boxAt(keys, time) {
|
|
16
|
+
let low = 0;
|
|
17
|
+
let high = keys.length - 1;
|
|
18
|
+
let found = -1;
|
|
19
|
+
while (low <= high) {
|
|
20
|
+
const middle = low + high >> 1;
|
|
21
|
+
if (keys[middle].start <= time) {
|
|
22
|
+
found = middle;
|
|
23
|
+
low = middle + 1;
|
|
24
|
+
} else high = middle - 1;
|
|
25
|
+
}
|
|
26
|
+
const key = keys[found];
|
|
27
|
+
if (!key || time >= key.end) return null;
|
|
28
|
+
const next = keys[found + 1];
|
|
29
|
+
if (!next || !meets(key, next) || !Number.isFinite(key.end)) return key.world;
|
|
30
|
+
const f = (time - key.start) / (key.end - key.start || 1);
|
|
31
|
+
const [a, b] = [key.world, next.world];
|
|
32
|
+
return {
|
|
33
|
+
x: lerp(a.x, b.x, f),
|
|
34
|
+
y: lerp(a.y, b.y, f),
|
|
35
|
+
width: lerp(a.width, b.width, f),
|
|
36
|
+
height: lerp(a.height, b.height, f)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
annotationTargets,
|
|
41
|
+
boxAt,
|
|
42
|
+
orderKeys
|
|
43
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { parseAnnotationTarget } from "../../core/annotations.mjs";
|
|
4
|
+
import { useLoaded } from "../../hooks/useLoaded.mjs";
|
|
5
|
+
const loadSvgShape = () => import("../../core/svg-shape.mjs");
|
|
6
|
+
function useSvgReader(annotations) {
|
|
7
|
+
var _a;
|
|
8
|
+
const needed = useMemo(
|
|
9
|
+
() => Boolean(
|
|
10
|
+
annotations == null ? void 0 : annotations.some(
|
|
11
|
+
({ annotation }) => {
|
|
12
|
+
var _a2;
|
|
13
|
+
return (_a2 = parseAnnotationTarget(annotation == null ? void 0 : annotation.target)) == null ? void 0 : _a2.svg;
|
|
14
|
+
}
|
|
15
|
+
)
|
|
16
|
+
),
|
|
17
|
+
[annotations]
|
|
18
|
+
);
|
|
19
|
+
return ((_a = useLoaded(loadSvgShape, needed)) == null ? void 0 : _a.readSvgShape) ?? null;
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
useSvgReader
|
|
23
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useEffect } from "react";
|
|
4
|
+
import { useUniqueId } from "../../ui/useUniqueId.mjs";
|
|
5
|
+
import { Items } from "../Items/Items.mjs";
|
|
6
|
+
import { Label } from "../Label/Label.mjs";
|
|
7
|
+
import { Summary, Id, Homepage } from "../Primitives/Primitives.mjs";
|
|
8
|
+
import { partOfCollection } from "../../core/selectors.mjs";
|
|
9
|
+
import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
|
|
10
|
+
import { join } from "../../lib/classnames.mjs";
|
|
11
|
+
import { useClover, useCloverSelector } from "../../react/context.mjs";
|
|
12
|
+
import { titled } from "../../ui/heading.mjs";
|
|
13
|
+
const Collection = forwardRef(
|
|
14
|
+
function Collection2({ headingLevel = 3, className, ...rest }, ref) {
|
|
15
|
+
const { clover } = useClover("Collection");
|
|
16
|
+
const { t, langOf } = useCloverTranslation();
|
|
17
|
+
const id = useUniqueId();
|
|
18
|
+
const collection = useCloverSelector((state) => state.collection);
|
|
19
|
+
const partOf = useCloverSelector(
|
|
20
|
+
(state) => partOfCollection(state.manifest)
|
|
21
|
+
);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!collection && (partOf == null ? void 0 : partOf.id)) void clover.openCollection(partOf.id);
|
|
24
|
+
}, [clover, collection, partOf]);
|
|
25
|
+
const shown = collection ?? partOf;
|
|
26
|
+
if (!shown) return null;
|
|
27
|
+
const homepage = shown.homepage;
|
|
28
|
+
const label = titled(headingLevel, `${id}-label`);
|
|
29
|
+
const section = (titleKey, part) => {
|
|
30
|
+
const {
|
|
31
|
+
as: Title,
|
|
32
|
+
title,
|
|
33
|
+
group
|
|
34
|
+
} = titled(headingLevel, `${id}-${titleKey}`);
|
|
35
|
+
return /* @__PURE__ */ jsxs("section", { className: "clover-about-section", ...group, children: [
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
Title,
|
|
38
|
+
{
|
|
39
|
+
className: "clover-about-heading",
|
|
40
|
+
lang: langOf(titleKey),
|
|
41
|
+
...title,
|
|
42
|
+
children: t(titleKey)
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
part
|
|
46
|
+
] });
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ jsxs(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
ref,
|
|
52
|
+
className: join("clover-about clover-collection", className),
|
|
53
|
+
...shown.label ? label.group : null,
|
|
54
|
+
...rest,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
Label,
|
|
58
|
+
{
|
|
59
|
+
as: label.as,
|
|
60
|
+
label: shown.label,
|
|
61
|
+
className: "clover-collection-title",
|
|
62
|
+
...label.title
|
|
63
|
+
}
|
|
64
|
+
),
|
|
65
|
+
/* @__PURE__ */ jsx(Summary, { value: shown.summary, className: "clover-about-summary" }),
|
|
66
|
+
/* @__PURE__ */ jsx(Items, { of: "members", layout: "list" }),
|
|
67
|
+
Array.isArray(homepage) && homepage.length > 0 && section("aboutHomepage", /* @__PURE__ */ jsx(Homepage, { value: homepage })),
|
|
68
|
+
section("aboutCollection", /* @__PURE__ */ jsx(Id, { value: shown.id }))
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
export {
|
|
75
|
+
Collection
|
|
76
|
+
};
|