@nulib/clover 0.0.0-stage → 4.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +120 -2
  3. package/dist/components/Annotations/Annotations.mjs +674 -0
  4. package/dist/components/Annotations/EntryBodies.mjs +52 -0
  5. package/dist/components/Annotations/languages.mjs +43 -0
  6. package/dist/components/Body/Body.mjs +51 -0
  7. package/dist/components/Body/BodyAlert.mjs +25 -0
  8. package/dist/components/Body/Caption.mjs +90 -0
  9. package/dist/components/Body/CaptionDetails.mjs +50 -0
  10. package/dist/components/Body/Pending.mjs +9 -0
  11. package/dist/components/Body/glyphs.mjs +66 -0
  12. package/dist/components/Body/renderers.mjs +30 -0
  13. package/dist/components/Body/useControlsVisibility.mjs +204 -0
  14. package/dist/components/Body/useNearViewport.mjs +27 -0
  15. package/dist/components/Canvas/AnnotationMenu.mjs +128 -0
  16. package/dist/components/Canvas/AnnotationState.mjs +338 -0
  17. package/dist/components/Canvas/Annotations.mjs +497 -0
  18. package/dist/components/Canvas/CanvasView.mjs +669 -0
  19. package/dist/components/Canvas/ChoiceMenu.mjs +77 -0
  20. package/dist/components/Canvas/Connected.mjs +228 -0
  21. package/dist/components/Canvas/ControlMenu.mjs +67 -0
  22. package/dist/components/Canvas/Controls.mjs +233 -0
  23. package/dist/components/Canvas/FrameAnimation.mjs +344 -0
  24. package/dist/components/Canvas/LoadedCanvas.mjs +177 -0
  25. package/dist/components/Canvas/Placeholder.mjs +105 -0
  26. package/dist/components/Canvas/fromManifest.mjs +44 -0
  27. package/dist/components/Canvas/index.mjs +19 -0
  28. package/dist/components/Canvas/layout.mjs +369 -0
  29. package/dist/components/Canvas/media/MediaBody.mjs +285 -0
  30. package/dist/components/Canvas/media/Player.mjs +193 -0
  31. package/dist/components/Canvas/media/Transport.mjs +511 -0
  32. package/dist/components/Canvas/media/TransportButton.mjs +39 -0
  33. package/dist/components/Canvas/media/useBarHeight.mjs +28 -0
  34. package/dist/components/Canvas/media/useCaptionTracks.mjs +131 -0
  35. package/dist/components/Canvas/media/useMediaController.mjs +77 -0
  36. package/dist/components/Canvas/media/useMediaElement.mjs +100 -0
  37. package/dist/components/Canvas/panClearOfControls.mjs +92 -0
  38. package/dist/components/Canvas/rendererSurface.mjs +6 -0
  39. package/dist/components/Canvas/surface.mjs +5 -0
  40. package/dist/components/Canvas/track.mjs +43 -0
  41. package/dist/components/Canvas/useSvgReader.mjs +23 -0
  42. package/dist/components/Collection/Collection.mjs +76 -0
  43. package/dist/components/CollectionSelect/CollectionSelect.mjs +114 -0
  44. package/dist/components/Contents/Contents.mjs +120 -0
  45. package/dist/components/Download/Download.mjs +105 -0
  46. package/dist/components/Items/Item.mjs +184 -0
  47. package/dist/components/Items/Items.mjs +455 -0
  48. package/dist/components/Items/Pager.mjs +190 -0
  49. package/dist/components/Items/StandaloneItems.mjs +80 -0
  50. package/dist/components/Items/clamped.mjs +90 -0
  51. package/dist/components/Label/Label.mjs +39 -0
  52. package/dist/components/Map/LoadedMap.mjs +26 -0
  53. package/dist/components/Map/Map.mjs +38 -0
  54. package/dist/components/Map/MapView.mjs +539 -0
  55. package/dist/components/Map/basemap.mjs +50 -0
  56. package/dist/components/Map/maplibre-worker.mjs +7 -0
  57. package/dist/components/Map/overlayImage.mjs +17 -0
  58. package/dist/components/Map/worker.mjs +22 -0
  59. package/dist/components/Panel/About.mjs +148 -0
  60. package/dist/components/Panel/Panel.mjs +259 -0
  61. package/dist/components/Panel/PanelToggle.mjs +43 -0
  62. package/dist/components/Panel/PartOfManifest.mjs +52 -0
  63. package/dist/components/Primitives/Primitives.mjs +263 -0
  64. package/dist/components/Primitives/resource.mjs +11 -0
  65. package/dist/components/Provider/Provider.mjs +174 -0
  66. package/dist/components/Root/Announcer.mjs +58 -0
  67. package/dist/components/Root/Root.mjs +29 -0
  68. package/dist/components/Root/useRootState.mjs +188 -0
  69. package/dist/components/Scene/Connected.mjs +48 -0
  70. package/dist/components/Scene/Loaded.mjs +56 -0
  71. package/dist/components/Scene/RotatePad.mjs +204 -0
  72. package/dist/components/Scene/Scene.mjs +20 -0
  73. package/dist/components/Scene/SceneView.mjs +539 -0
  74. package/dist/components/Scene/cloverEngine.mjs +105 -0
  75. package/dist/components/Scene/engine.mjs +141 -0
  76. package/dist/components/Scene/engines.mjs +23 -0
  77. package/dist/components/Scene/gestures.mjs +74 -0
  78. package/dist/components/Scene/models.mjs +78 -0
  79. package/dist/components/Scene/orbit.mjs +60 -0
  80. package/dist/components/Search/Search.mjs +246 -0
  81. package/dist/components/Split/Split.mjs +210 -0
  82. package/dist/components/Split/splitting.mjs +203 -0
  83. package/dist/components/Status/Status.mjs +47 -0
  84. package/dist/components/Timeline/Connected.mjs +25 -0
  85. package/dist/components/Timeline/Timeline.mjs +40 -0
  86. package/dist/components/Timeline/playerSurface.mjs +84 -0
  87. package/dist/components/Transcript/Transcript.mjs +377 -0
  88. package/dist/components/Viewer/Viewer.mjs +19 -0
  89. package/dist/core/annotation-bodies.mjs +29 -0
  90. package/dist/core/annotation-collection.mjs +55 -0
  91. package/dist/core/annotation-name.mjs +31 -0
  92. package/dist/core/annotation-sets.mjs +155 -0
  93. package/dist/core/annotations-content.mjs +27 -0
  94. package/dist/core/annotations.mjs +73 -0
  95. package/dist/core/clover.mjs +393 -0
  96. package/dist/core/content-state-reader.mjs +82 -0
  97. package/dist/core/content-state.mjs +43 -0
  98. package/dist/core/direction.mjs +12 -0
  99. package/dist/core/geo-detect.mjs +30 -0
  100. package/dist/core/geo.mjs +283 -0
  101. package/dist/core/items.mjs +76 -0
  102. package/dist/core/keep-fragments.mjs +40 -0
  103. package/dist/core/link.mjs +28 -0
  104. package/dist/core/load.mjs +183 -0
  105. package/dist/core/map-config.mjs +12 -0
  106. package/dist/core/markdown.mjs +139 -0
  107. package/dist/core/pages.mjs +51 -0
  108. package/dist/core/painted-bodies.mjs +20 -0
  109. package/dist/core/painting.mjs +17 -0
  110. package/dist/core/presentation.mjs +27 -0
  111. package/dist/core/ranges.mjs +133 -0
  112. package/dist/core/region.mjs +32 -0
  113. package/dist/core/request.mjs +40 -0
  114. package/dist/core/sanitize.mjs +72 -0
  115. package/dist/core/search-service.mjs +22 -0
  116. package/dist/core/search.mjs +154 -0
  117. package/dist/core/selectors.mjs +94 -0
  118. package/dist/core/sequence.mjs +70 -0
  119. package/dist/core/show-link.mjs +16 -0
  120. package/dist/core/store.mjs +40 -0
  121. package/dist/core/svg-shape.mjs +183 -0
  122. package/dist/core/text.mjs +36 -0
  123. package/dist/core/thumbnail.mjs +55 -0
  124. package/dist/core/value.mjs +39 -0
  125. package/dist/core/vtt.mjs +111 -0
  126. package/dist/hooks/useFullscreen.mjs +21 -0
  127. package/dist/hooks/useFullscreenSupported.mjs +11 -0
  128. package/dist/hooks/useLoaded.mjs +27 -0
  129. package/dist/hooks/useWithinFullscreen.mjs +24 -0
  130. package/dist/i18n/config.mjs +170 -0
  131. package/dist/i18n/hostLanguage.mjs +6 -0
  132. package/dist/i18n/locales/en.json.mjs +5 -0
  133. package/dist/i18n/locales/es.json.mjs +5 -0
  134. package/dist/i18n/locales/fi.json.mjs +5 -0
  135. package/dist/i18n/locales/fr.json.mjs +5 -0
  136. package/dist/i18n/locales/index.mjs +13 -0
  137. package/dist/i18n/locales/nb.json.mjs +5 -0
  138. package/dist/i18n/locales/nn.json.mjs +5 -0
  139. package/dist/i18n/locales/no.json.mjs +5 -0
  140. package/dist/i18n/locales/pt.json.mjs +5 -0
  141. package/dist/i18n/reader.mjs +13 -0
  142. package/dist/i18n/useCloverTranslation.mjs +28 -0
  143. package/dist/index.d.mts +2215 -0
  144. package/dist/index.mjs +133 -0
  145. package/dist/lib/asArray.mjs +5 -0
  146. package/dist/lib/classnames.mjs +5 -0
  147. package/dist/lib/fullscreen.mjs +65 -0
  148. package/dist/lib/gltf/bounds.mjs +44 -0
  149. package/dist/lib/gltf/load.mjs +156 -0
  150. package/dist/lib/gltf/mat4.mjs +150 -0
  151. package/dist/lib/gltf/renderer.mjs +342 -0
  152. package/dist/lib/gltf/shaders.mjs +192 -0
  153. package/dist/lib/hls.mjs +6 -0
  154. package/dist/lib/pointer.mjs +38 -0
  155. package/dist/lib/renderer/CanvasRenderer.mjs +857 -0
  156. package/dist/lib/renderer/backends/backend.mjs +21 -0
  157. package/dist/lib/renderer/backends/canvas2d/Canvas2DBackend.mjs +91 -0
  158. package/dist/lib/renderer/backends/contexts.mjs +27 -0
  159. package/dist/lib/renderer/backends/dom/DomLayers.mjs +91 -0
  160. package/dist/lib/renderer/backends/webgl2/WebGL2Backend.mjs +248 -0
  161. package/dist/lib/renderer/backends/webgl2/shaders.mjs +28 -0
  162. package/dist/lib/renderer/camera/Camera.mjs +64 -0
  163. package/dist/lib/renderer/camera/CameraAnimator.mjs +90 -0
  164. package/dist/lib/renderer/input/GestureController.mjs +252 -0
  165. package/dist/lib/renderer/io/TileCache.mjs +207 -0
  166. package/dist/lib/renderer/io/decode.mjs +156 -0
  167. package/dist/lib/renderer/loop/FrameLoop.mjs +50 -0
  168. package/dist/lib/renderer/math/affine.mjs +68 -0
  169. package/dist/lib/renderer/math/rect.mjs +45 -0
  170. package/dist/lib/renderer/overlays/Navigator.mjs +141 -0
  171. package/dist/lib/renderer/overlays/OverlayLayer.mjs +94 -0
  172. package/dist/lib/renderer/scene/planFrame.mjs +168 -0
  173. package/dist/lib/renderer/scene/regions.mjs +30 -0
  174. package/dist/lib/renderer/scene/sceneItem.mjs +114 -0
  175. package/dist/lib/renderer/scene/uploadBudget.mjs +30 -0
  176. package/dist/lib/renderer/sources/imageService.mjs +160 -0
  177. package/dist/lib/renderer/sources/sizedImage.mjs +38 -0
  178. package/dist/lib/renderer/sources/tilePyramid.mjs +172 -0
  179. package/dist/lib/time.mjs +21 -0
  180. package/dist/map/index.d.mts +195 -0
  181. package/dist/map/index.mjs +16 -0
  182. package/dist/react/context.mjs +46 -0
  183. package/dist/react/hooks.mjs +69 -0
  184. package/dist/react/language.mjs +30 -0
  185. package/dist/styles.css +1 -0
  186. package/dist/templates/default/Default.mjs +229 -0
  187. package/dist/templates/document/Document.mjs +286 -0
  188. package/dist/templates/document/DocumentPanel.mjs +9 -0
  189. package/dist/templates/document/Sheets.mjs +360 -0
  190. package/dist/templates/gallery/Gallery.mjs +62 -0
  191. package/dist/templates/index.d.mts +276 -0
  192. package/dist/templates/index.mjs +11 -0
  193. package/dist/templates/shared/Lightbox.mjs +111 -0
  194. package/dist/templates/shared/LightboxBody.mjs +9 -0
  195. package/dist/templates/shared/dragToClose.mjs +129 -0
  196. package/dist/templates/shared/useDragToClose.mjs +35 -0
  197. package/dist/templates/shared/useDrawer.mjs +113 -0
  198. package/dist/templates/shared/useFollowFocus.mjs +24 -0
  199. package/dist/templates/shared/useSlide.mjs +52 -0
  200. package/dist/templates/shared/useSpine.mjs +26 -0
  201. package/dist/templates.css +1 -0
  202. package/dist/three/index.d.mts +6 -0
  203. package/dist/three/index.mjs +8 -0
  204. package/dist/ui/Button.mjs +53 -0
  205. package/dist/ui/ControlCluster.mjs +87 -0
  206. package/dist/ui/Cue.mjs +13 -0
  207. package/dist/ui/ErrorBoundary.mjs +26 -0
  208. package/dist/ui/ExitFullscreen.mjs +46 -0
  209. package/dist/ui/FieldPill.mjs +153 -0
  210. package/dist/ui/HideToggle.mjs +57 -0
  211. package/dist/ui/Loading.mjs +20 -0
  212. package/dist/ui/Markup.mjs +95 -0
  213. package/dist/ui/ReadMore.mjs +84 -0
  214. package/dist/ui/Sections.mjs +448 -0
  215. package/dist/ui/Steps.mjs +84 -0
  216. package/dist/ui/Tip.mjs +196 -0
  217. package/dist/ui/bringIntoView.mjs +27 -0
  218. package/dist/ui/controlGlyphs.mjs +120 -0
  219. package/dist/ui/heading.mjs +19 -0
  220. package/dist/ui/languageCode.mjs +8 -0
  221. package/dist/ui/mediaIcons.mjs +104 -0
  222. package/dist/ui/useClusterReach.mjs +50 -0
  223. package/dist/ui/useContainerName.mjs +19 -0
  224. package/dist/ui/useOneOpen.mjs +22 -0
  225. package/dist/ui/useRovingFocus.mjs +64 -0
  226. package/dist/ui/useScrollTrack.mjs +150 -0
  227. package/dist/ui/useUniqueId.mjs +10 -0
  228. package/dist/ui/visuallyHidden.mjs +15 -0
  229. package/dist/web-components/About-DbrFSVBm.mjs +1 -0
  230. package/dist/web-components/AnnotationMenu-EBjIQpQl.mjs +1 -0
  231. package/dist/web-components/AnnotationState-DQTaO6Gz.mjs +1 -0
  232. package/dist/web-components/Annotations-Cb9U7HJ_.mjs +2 -0
  233. package/dist/web-components/Annotations-Dl0SgHBS.mjs +1 -0
  234. package/dist/web-components/Body-DxSz3iST.mjs +1 -0
  235. package/dist/web-components/BodyAlert-C8EOXz24.mjs +1 -0
  236. package/dist/web-components/Button-uWgfvqsL.mjs +1 -0
  237. package/dist/web-components/Camera-cdCqKMup.mjs +1 -0
  238. package/dist/web-components/Canvas2DBackend-CnLEHRs4.mjs +1 -0
  239. package/dist/web-components/CanvasView-BI3YzNdK.mjs +1 -0
  240. package/dist/web-components/CaptionDetails-B80ZhZ7v.mjs +1 -0
  241. package/dist/web-components/ChoiceMenu-DCp7-co7.mjs +1 -0
  242. package/dist/web-components/Collection-B1Le2_TU.mjs +1 -0
  243. package/dist/web-components/CollectionSelect-BL_jQog-.mjs +1 -0
  244. package/dist/web-components/Connected-BxqaRL9o.mjs +1 -0
  245. package/dist/web-components/Connected-DCBI-j9H.mjs +1 -0
  246. package/dist/web-components/Connected-DkhfVWxd.mjs +1 -0
  247. package/dist/web-components/Contents-zYEGHLfe.mjs +1 -0
  248. package/dist/web-components/ControlMenu-CAHiLAtl.mjs +1 -0
  249. package/dist/web-components/Cue-BT2V9VAq.mjs +1 -0
  250. package/dist/web-components/Document-BdCjGnJN.mjs +1 -0
  251. package/dist/web-components/DocumentPanel-X_Rta0Wu.mjs +1 -0
  252. package/dist/web-components/DomLayers-BD4QPbl6.mjs +1 -0
  253. package/dist/web-components/Download-DqU-goFi.mjs +1 -0
  254. package/dist/web-components/EntryBodies-DXAQH0vR.mjs +1 -0
  255. package/dist/web-components/ErrorBoundary-chQaO-Up.mjs +1 -0
  256. package/dist/web-components/FieldPill-CyEssPVm.mjs +1 -0
  257. package/dist/web-components/FrameAnimation-Bb0pOoRl.mjs +1 -0
  258. package/dist/web-components/Gallery-BXU3TcT3.mjs +1 -0
  259. package/dist/web-components/HideToggle-BwMrOBMu.mjs +1 -0
  260. package/dist/web-components/Items-DRj1UEpC.mjs +1 -0
  261. package/dist/web-components/Label-D6aVJB9s.mjs +1 -0
  262. package/dist/web-components/LightboxBody-BzXQGMDn.mjs +1 -0
  263. package/dist/web-components/Loaded-D5xmFRSo.mjs +1 -0
  264. package/dist/web-components/LoadedCanvas-DOjtxLSe.mjs +1 -0
  265. package/dist/web-components/LoadedMap-DouDS2lO.mjs +1 -0
  266. package/dist/web-components/Loading-CBKfwsML.mjs +1 -0
  267. package/dist/web-components/Map-Bcgp_R8H.mjs +1 -0
  268. package/dist/web-components/MapView-CD5zkTs8.mjs +1 -0
  269. package/dist/web-components/Markup-C1hMA8wk.mjs +2 -0
  270. package/dist/web-components/MediaBody-B_Gii4we.mjs +1 -0
  271. package/dist/web-components/MediaBody-BfrKIPte.mjs +1 -0
  272. package/dist/web-components/Navigator-BSJbEbuJ.mjs +1 -0
  273. package/dist/web-components/Pager-Di_2hHM3.mjs +1 -0
  274. package/dist/web-components/Panel-DbsC8A9V.mjs +1 -0
  275. package/dist/web-components/PanelToggle-mUDw73zI.mjs +1 -0
  276. package/dist/web-components/PartOfManifest-7eOwURrF.mjs +1 -0
  277. package/dist/web-components/Pending-BPOQ2z1L.mjs +1 -0
  278. package/dist/web-components/Primitives-XQO3m1wG.mjs +1 -0
  279. package/dist/web-components/Provider-B61118lU.mjs +1 -0
  280. package/dist/web-components/ReadMore-BJH-qqte.mjs +1 -0
  281. package/dist/web-components/Root-Dj277K6p.mjs +1 -0
  282. package/dist/web-components/Scene-BTWpLeec.mjs +1 -0
  283. package/dist/web-components/SceneView-BYo7WmPt.mjs +1 -0
  284. package/dist/web-components/Search-ZV8FFN4p.mjs +1 -0
  285. package/dist/web-components/Sections-ejwu1_Sm.mjs +2 -0
  286. package/dist/web-components/StandaloneItems-BYaiyCca.mjs +1 -0
  287. package/dist/web-components/Status-YbQK2KzY.mjs +1 -0
  288. package/dist/web-components/Timeline-ByyVSd7B.mjs +1 -0
  289. package/dist/web-components/Tip-IO11xX4x.mjs +1 -0
  290. package/dist/web-components/Transcript-D0gUxUoA.mjs +1 -0
  291. package/dist/web-components/annotation-collection-Csv7WIlm.mjs +1 -0
  292. package/dist/web-components/annotations-content-BS_OFz5Z.mjs +1 -0
  293. package/dist/web-components/assets/maplibre-gl-worker-kTz9OPxr.js +13831 -0
  294. package/dist/web-components/body-CKjwwFep.mjs +1 -0
  295. package/dist/web-components/bringIntoView-CQH5ZgMM.mjs +1 -0
  296. package/dist/web-components/canvas-CIzpp-Uz.mjs +1 -0
  297. package/dist/web-components/classnames-DukgfdpI.mjs +1 -0
  298. package/dist/web-components/cloverEngine-B4LinbSt.mjs +164 -0
  299. package/dist/web-components/content-state-reader-D1BkpICh.mjs +1 -0
  300. package/dist/web-components/contexts-ByL3eA_T.mjs +1 -0
  301. package/dist/web-components/controls-Dj2BybWb.mjs +1 -0
  302. package/dist/web-components/custom-elements.json +2739 -0
  303. package/dist/web-components/dragToClose-C-Pf1IeO.mjs +1 -0
  304. package/dist/web-components/engine-BSt8LTso.mjs +4228 -0
  305. package/dist/web-components/engines-CC0OEsVE.mjs +1 -0
  306. package/dist/web-components/es-BwMkoRod.mjs +1 -0
  307. package/dist/web-components/fi-gPFOn9RK.mjs +1 -0
  308. package/dist/web-components/fr-DUHmgdJo.mjs +1 -0
  309. package/dist/web-components/fromManifest-BhemHaoA.mjs +1 -0
  310. package/dist/web-components/glyphs-drROkef9.mjs +1 -0
  311. package/dist/web-components/heading-Cjt0f-Eu.mjs +1 -0
  312. package/dist/web-components/hls-CdKrthkC.mjs +40 -0
  313. package/dist/web-components/hooks-BXzQSllm.mjs +1 -0
  314. package/dist/web-components/imageService-dsdmcegU.mjs +1 -0
  315. package/dist/web-components/index-B7nZdqLg.mjs +1 -0
  316. package/dist/web-components/index.d.mts +604 -0
  317. package/dist/web-components/index.mjs +1 -0
  318. package/dist/web-components/index.umd.js +18 -0
  319. package/dist/web-components/items-CB2Uk7ts.mjs +1 -0
  320. package/dist/web-components/items-jfQ5XzEj.mjs +1 -0
  321. package/dist/web-components/keep-fragments-B5nlv2ck.mjs +1 -0
  322. package/dist/web-components/label-Vbg_cMOJ.mjs +1 -0
  323. package/dist/web-components/languageCode-cCpiU0b0.mjs +1 -0
  324. package/dist/web-components/layout-mMHI0lsj.mjs +1 -0
  325. package/dist/web-components/link-ZRnv5NFR.mjs +1 -0
  326. package/dist/web-components/logo-Boy6u4m2.mjs +1 -0
  327. package/dist/web-components/maplibre-gl-CQ4OueXY.mjs +823 -0
  328. package/dist/web-components/markdown-CCYJwzFn.mjs +5 -0
  329. package/dist/web-components/models-D1EE_CmH.mjs +1 -0
  330. package/dist/web-components/nb-BSvnQ6jd.mjs +1 -0
  331. package/dist/web-components/nn-Dg2_HdZu.mjs +1 -0
  332. package/dist/web-components/no-BSvnQ6jd.mjs +1 -0
  333. package/dist/web-components/nodes-B7JRwBgl.mjs +1 -0
  334. package/dist/web-components/overlayImage-0OgQl1TL.mjs +1 -0
  335. package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +1 -0
  336. package/dist/web-components/panel-CjXfre-g.mjs +1 -0
  337. package/dist/web-components/part-cUiPs2-y.mjs +1 -0
  338. package/dist/web-components/playerSurface-CU5XxI1j.mjs +1 -0
  339. package/dist/web-components/provider-C1wKfdjb.mjs +1 -0
  340. package/dist/web-components/pt-B3J80JgO.mjs +1 -0
  341. package/dist/web-components/read-more-DNHNtG-a.mjs +1 -0
  342. package/dist/web-components/rendererSurface-DhIlOjGT.mjs +22 -0
  343. package/dist/web-components/renderers-BMSWEFUR.mjs +1 -0
  344. package/dist/web-components/resource-DLHocQ1C.mjs +1 -0
  345. package/dist/web-components/sanitize-Dc7nOsgO.mjs +3 -0
  346. package/dist/web-components/search-CLy2Wj01.mjs +1 -0
  347. package/dist/web-components/shared-YUjOSBKO.mjs +1 -0
  348. package/dist/web-components/show-link-CyzYE1eS.mjs +1 -0
  349. package/dist/web-components/sizedImage-uv_NlE0l.mjs +1 -0
  350. package/dist/web-components/split-CYuMjp89.mjs +1 -0
  351. package/dist/web-components/splitting-BnQUxxgH.mjs +1 -0
  352. package/dist/web-components/status-Ms5L0ghK.mjs +1 -0
  353. package/dist/web-components/styles-CyuM_fB1.mjs +1 -0
  354. package/dist/web-components/svg-shape-DLY3g7oq.mjs +1 -0
  355. package/dist/web-components/text-BTAkxEfQ.mjs +5 -0
  356. package/dist/web-components/three.mjs +1 -0
  357. package/dist/web-components/thumbnail-c2K_iQsD.mjs +1 -0
  358. package/dist/web-components/time-B9GZoYcm.mjs +1 -0
  359. package/dist/web-components/tip-dWhupWSr.mjs +1 -0
  360. package/dist/web-components/toggle-BQTjR1I3.mjs +1 -0
  361. package/dist/web-components/upgrader-XNxI-5jo.mjs +1 -0
  362. package/dist/web-components/useContainerName-BpJ3IWY0.mjs +1 -0
  363. package/dist/web-components/useNearViewport-CtLyYg9n.mjs +1 -0
  364. package/dist/web-components/useScrollTrack-WbG28FPD.mjs +1 -0
  365. package/dist/web-components/viewer/AnnotationMenu-ZKyBeyUU.mjs +1 -0
  366. package/dist/web-components/viewer/AnnotationState-DO33zokc.mjs +1 -0
  367. package/dist/web-components/viewer/Annotations-BOjhr5ks.mjs +1 -0
  368. package/dist/web-components/viewer/Annotations-DkLueFLK.mjs +2 -0
  369. package/dist/web-components/viewer/Canvas2DBackend-CAmzJD5P.mjs +1 -0
  370. package/dist/web-components/viewer/CaptionDetails-DOJlUtOn.mjs +1 -0
  371. package/dist/web-components/viewer/ChoiceMenu-BDq6H34G.mjs +1 -0
  372. package/dist/web-components/viewer/Collection-By3puO0V.mjs +1 -0
  373. package/dist/web-components/viewer/Connected-DZNO2CPf.mjs +1 -0
  374. package/dist/web-components/viewer/Connected-ESg5y49m.mjs +1 -0
  375. package/dist/web-components/viewer/Contents-B_FqDwTW.mjs +1 -0
  376. package/dist/web-components/viewer/ControlMenu-DdQl-dTf.mjs +1 -0
  377. package/dist/web-components/viewer/Cue-BTRHfiWQ.mjs +1 -0
  378. package/dist/web-components/viewer/Document-B9_PyD2w.mjs +1 -0
  379. package/dist/web-components/viewer/DocumentPanel-CtEJVPoE.mjs +1 -0
  380. package/dist/web-components/viewer/DomLayers-DRdQSEtN.mjs +1 -0
  381. package/dist/web-components/viewer/EntryBodies-CJuTRcTq.mjs +1 -0
  382. package/dist/web-components/viewer/FieldPill-06uwrNwE.mjs +1 -0
  383. package/dist/web-components/viewer/FrameAnimation-3dcDHf5q.mjs +1 -0
  384. package/dist/web-components/viewer/Gallery-BYasTqZc.mjs +1 -0
  385. package/dist/web-components/viewer/HideToggle-BxkNMX-T.mjs +1 -0
  386. package/dist/web-components/viewer/LightboxBody-CXMc1xOH.mjs +1 -0
  387. package/dist/web-components/viewer/MapView-DCerrRRV.mjs +1 -0
  388. package/dist/web-components/viewer/MediaBody-BdkJcyGy.mjs +1 -0
  389. package/dist/web-components/viewer/MediaBody-waF4KvHp.mjs +1 -0
  390. package/dist/web-components/viewer/Navigator-CKwDgG2x.mjs +1 -0
  391. package/dist/web-components/viewer/PartOfManifest-DalHJFwC.mjs +1 -0
  392. package/dist/web-components/viewer/Search-Di_QQfDb.mjs +1 -0
  393. package/dist/web-components/viewer/StandaloneItems-B9J6nnWn.mjs +1 -0
  394. package/dist/web-components/viewer/Transcript-aHOixfna.mjs +1 -0
  395. package/dist/web-components/viewer/annotation-collection-I2UkdobR.mjs +1 -0
  396. package/dist/web-components/viewer/annotations-content-D-i4j9pD.mjs +1 -0
  397. package/dist/web-components/viewer/cloverEngine-CynoKdta.mjs +164 -0
  398. package/dist/web-components/viewer/content-state-reader-D7GIMcKK.mjs +1 -0
  399. package/dist/web-components/viewer/host-DlCltI_c.mjs +1 -0
  400. package/dist/web-components/viewer/index.d.mts +7 -0
  401. package/dist/web-components/viewer/index.mjs +1 -0
  402. package/dist/web-components/viewer/index.umd.js +18 -0
  403. package/dist/web-components/viewer/link-BX-wzj1u.mjs +1 -0
  404. package/dist/web-components/viewer/overlayImage-CHqn1fG8.mjs +1 -0
  405. package/dist/web-components/viewer/renderers-C_wdmw9v.mjs +1 -0
  406. package/dist/web-components/viewer/search-BHLyNxZ6.mjs +1 -0
  407. package/dist/web-components/viewer/styles-BRCkEU3w.mjs +1 -0
  408. package/dist/web-components/viewer/viewer-ipqAA-xQ.mjs +28 -0
  409. package/dist/web-components/viewer/vtt-XiS_-5Ao.mjs +5 -0
  410. package/dist/web-components/viewer-DEHIsIHd.mjs +1 -0
  411. package/dist/web-components/vtt-DYAOuQoK.mjs +5 -0
  412. package/dist/web-components/worker-CjXN0dku.mjs +1 -0
  413. package/package.json +111 -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,6 @@
1
+ "use client";
2
+ import { CanvasRenderer } from "../../lib/renderer/CanvasRenderer.mjs";
3
+ const rendererSurface = (host, options) => new CanvasRenderer(host, options);
4
+ export {
5
+ rendererSurface
6
+ };
@@ -0,0 +1,5 @@
1
+ "use client";
2
+ const hasCamera = (surface) => Boolean(surface && "overlays" in surface);
3
+ export {
4
+ hasCamera
5
+ };
@@ -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
+ };