@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.
Files changed (410) 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 +538 -0
  55. package/dist/components/Map/basemap.mjs +50 -0
  56. package/dist/components/Map/overlayImage.mjs +17 -0
  57. package/dist/components/Panel/About.mjs +143 -0
  58. package/dist/components/Panel/Panel.mjs +259 -0
  59. package/dist/components/Panel/PanelToggle.mjs +43 -0
  60. package/dist/components/Panel/PartOfManifest.mjs +52 -0
  61. package/dist/components/Primitives/Primitives.mjs +263 -0
  62. package/dist/components/Primitives/resource.mjs +11 -0
  63. package/dist/components/Provider/Provider.mjs +174 -0
  64. package/dist/components/Root/Announcer.mjs +58 -0
  65. package/dist/components/Root/Root.mjs +29 -0
  66. package/dist/components/Root/useRootState.mjs +188 -0
  67. package/dist/components/Scene/Connected.mjs +48 -0
  68. package/dist/components/Scene/Loaded.mjs +56 -0
  69. package/dist/components/Scene/RotatePad.mjs +204 -0
  70. package/dist/components/Scene/Scene.mjs +20 -0
  71. package/dist/components/Scene/SceneView.mjs +539 -0
  72. package/dist/components/Scene/cloverEngine.mjs +105 -0
  73. package/dist/components/Scene/engine.mjs +141 -0
  74. package/dist/components/Scene/engines.mjs +23 -0
  75. package/dist/components/Scene/gestures.mjs +74 -0
  76. package/dist/components/Scene/models.mjs +78 -0
  77. package/dist/components/Scene/orbit.mjs +60 -0
  78. package/dist/components/Search/Search.mjs +246 -0
  79. package/dist/components/Split/Split.mjs +203 -0
  80. package/dist/components/Split/splitting.mjs +203 -0
  81. package/dist/components/Status/Status.mjs +47 -0
  82. package/dist/components/Timeline/Connected.mjs +25 -0
  83. package/dist/components/Timeline/Timeline.mjs +40 -0
  84. package/dist/components/Timeline/playerSurface.mjs +84 -0
  85. package/dist/components/Transcript/Transcript.mjs +377 -0
  86. package/dist/components/Viewer/Viewer.mjs +19 -0
  87. package/dist/core/annotation-bodies.mjs +29 -0
  88. package/dist/core/annotation-collection.mjs +55 -0
  89. package/dist/core/annotation-name.mjs +31 -0
  90. package/dist/core/annotation-sets.mjs +155 -0
  91. package/dist/core/annotations-content.mjs +27 -0
  92. package/dist/core/annotations.mjs +73 -0
  93. package/dist/core/clover.mjs +393 -0
  94. package/dist/core/content-state-reader.mjs +82 -0
  95. package/dist/core/content-state.mjs +43 -0
  96. package/dist/core/direction.mjs +12 -0
  97. package/dist/core/geo-detect.mjs +30 -0
  98. package/dist/core/geo.mjs +283 -0
  99. package/dist/core/items.mjs +74 -0
  100. package/dist/core/keep-fragments.mjs +40 -0
  101. package/dist/core/link.mjs +28 -0
  102. package/dist/core/load.mjs +176 -0
  103. package/dist/core/map-config.mjs +12 -0
  104. package/dist/core/markdown.mjs +139 -0
  105. package/dist/core/pages.mjs +51 -0
  106. package/dist/core/painted-bodies.mjs +20 -0
  107. package/dist/core/painting.mjs +17 -0
  108. package/dist/core/presentation.mjs +27 -0
  109. package/dist/core/ranges.mjs +133 -0
  110. package/dist/core/region.mjs +32 -0
  111. package/dist/core/request.mjs +40 -0
  112. package/dist/core/sanitize.mjs +72 -0
  113. package/dist/core/search-service.mjs +22 -0
  114. package/dist/core/search.mjs +154 -0
  115. package/dist/core/selectors.mjs +94 -0
  116. package/dist/core/sequence.mjs +70 -0
  117. package/dist/core/show-link.mjs +16 -0
  118. package/dist/core/store.mjs +40 -0
  119. package/dist/core/svg-shape.mjs +183 -0
  120. package/dist/core/text.mjs +36 -0
  121. package/dist/core/thumbnail.mjs +55 -0
  122. package/dist/core/value.mjs +39 -0
  123. package/dist/core/vtt.mjs +111 -0
  124. package/dist/hooks/useFullscreen.mjs +21 -0
  125. package/dist/hooks/useFullscreenSupported.mjs +11 -0
  126. package/dist/hooks/useLoaded.mjs +27 -0
  127. package/dist/hooks/useWithinFullscreen.mjs +24 -0
  128. package/dist/i18n/config.mjs +170 -0
  129. package/dist/i18n/hostLanguage.mjs +6 -0
  130. package/dist/i18n/locales/en.json.mjs +5 -0
  131. package/dist/i18n/locales/es.json.mjs +5 -0
  132. package/dist/i18n/locales/fi.json.mjs +5 -0
  133. package/dist/i18n/locales/fr.json.mjs +5 -0
  134. package/dist/i18n/locales/index.mjs +13 -0
  135. package/dist/i18n/locales/nb.json.mjs +5 -0
  136. package/dist/i18n/locales/nn.json.mjs +5 -0
  137. package/dist/i18n/locales/no.json.mjs +5 -0
  138. package/dist/i18n/locales/pt.json.mjs +5 -0
  139. package/dist/i18n/reader.mjs +13 -0
  140. package/dist/i18n/useCloverTranslation.mjs +28 -0
  141. package/dist/index.d.mts +2204 -0
  142. package/dist/index.mjs +133 -0
  143. package/dist/lib/asArray.mjs +5 -0
  144. package/dist/lib/classnames.mjs +5 -0
  145. package/dist/lib/fullscreen.mjs +65 -0
  146. package/dist/lib/gltf/bounds.mjs +44 -0
  147. package/dist/lib/gltf/load.mjs +156 -0
  148. package/dist/lib/gltf/mat4.mjs +150 -0
  149. package/dist/lib/gltf/renderer.mjs +342 -0
  150. package/dist/lib/gltf/shaders.mjs +192 -0
  151. package/dist/lib/hls.mjs +6 -0
  152. package/dist/lib/pointer.mjs +38 -0
  153. package/dist/lib/renderer/CanvasRenderer.mjs +857 -0
  154. package/dist/lib/renderer/backends/backend.mjs +21 -0
  155. package/dist/lib/renderer/backends/canvas2d/Canvas2DBackend.mjs +91 -0
  156. package/dist/lib/renderer/backends/contexts.mjs +27 -0
  157. package/dist/lib/renderer/backends/dom/DomLayers.mjs +91 -0
  158. package/dist/lib/renderer/backends/webgl2/WebGL2Backend.mjs +248 -0
  159. package/dist/lib/renderer/backends/webgl2/shaders.mjs +28 -0
  160. package/dist/lib/renderer/camera/Camera.mjs +64 -0
  161. package/dist/lib/renderer/camera/CameraAnimator.mjs +90 -0
  162. package/dist/lib/renderer/input/GestureController.mjs +252 -0
  163. package/dist/lib/renderer/io/TileCache.mjs +207 -0
  164. package/dist/lib/renderer/io/decode.mjs +156 -0
  165. package/dist/lib/renderer/loop/FrameLoop.mjs +50 -0
  166. package/dist/lib/renderer/math/affine.mjs +68 -0
  167. package/dist/lib/renderer/math/rect.mjs +45 -0
  168. package/dist/lib/renderer/overlays/Navigator.mjs +141 -0
  169. package/dist/lib/renderer/overlays/OverlayLayer.mjs +94 -0
  170. package/dist/lib/renderer/scene/planFrame.mjs +168 -0
  171. package/dist/lib/renderer/scene/regions.mjs +30 -0
  172. package/dist/lib/renderer/scene/sceneItem.mjs +114 -0
  173. package/dist/lib/renderer/scene/uploadBudget.mjs +30 -0
  174. package/dist/lib/renderer/sources/imageService.mjs +160 -0
  175. package/dist/lib/renderer/sources/sizedImage.mjs +38 -0
  176. package/dist/lib/renderer/sources/tilePyramid.mjs +172 -0
  177. package/dist/lib/time.mjs +21 -0
  178. package/dist/map/index.d.mts +184 -0
  179. package/dist/map/index.mjs +16 -0
  180. package/dist/react/context.mjs +46 -0
  181. package/dist/react/hooks.mjs +69 -0
  182. package/dist/react/language.mjs +30 -0
  183. package/dist/styles.css +1 -0
  184. package/dist/templates/default/Default.mjs +229 -0
  185. package/dist/templates/document/Document.mjs +286 -0
  186. package/dist/templates/document/DocumentPanel.mjs +9 -0
  187. package/dist/templates/document/Sheets.mjs +360 -0
  188. package/dist/templates/gallery/Gallery.mjs +62 -0
  189. package/dist/templates/index.d.mts +273 -0
  190. package/dist/templates/index.mjs +11 -0
  191. package/dist/templates/shared/Lightbox.mjs +111 -0
  192. package/dist/templates/shared/LightboxBody.mjs +9 -0
  193. package/dist/templates/shared/dragToClose.mjs +129 -0
  194. package/dist/templates/shared/useDragToClose.mjs +35 -0
  195. package/dist/templates/shared/useDrawer.mjs +113 -0
  196. package/dist/templates/shared/useFollowFocus.mjs +24 -0
  197. package/dist/templates/shared/useSlide.mjs +52 -0
  198. package/dist/templates/shared/useSpine.mjs +26 -0
  199. package/dist/templates.css +1 -0
  200. package/dist/three/index.d.mts +6 -0
  201. package/dist/three/index.mjs +8 -0
  202. package/dist/ui/Button.mjs +53 -0
  203. package/dist/ui/ControlCluster.mjs +87 -0
  204. package/dist/ui/Cue.mjs +13 -0
  205. package/dist/ui/ErrorBoundary.mjs +26 -0
  206. package/dist/ui/ExitFullscreen.mjs +46 -0
  207. package/dist/ui/FieldPill.mjs +153 -0
  208. package/dist/ui/HideToggle.mjs +57 -0
  209. package/dist/ui/Loading.mjs +20 -0
  210. package/dist/ui/Markup.mjs +95 -0
  211. package/dist/ui/ReadMore.mjs +84 -0
  212. package/dist/ui/Sections.mjs +448 -0
  213. package/dist/ui/Steps.mjs +84 -0
  214. package/dist/ui/Tip.mjs +196 -0
  215. package/dist/ui/bringIntoView.mjs +27 -0
  216. package/dist/ui/controlGlyphs.mjs +120 -0
  217. package/dist/ui/heading.mjs +19 -0
  218. package/dist/ui/languageCode.mjs +8 -0
  219. package/dist/ui/mediaIcons.mjs +104 -0
  220. package/dist/ui/useClusterReach.mjs +50 -0
  221. package/dist/ui/useContainerName.mjs +19 -0
  222. package/dist/ui/useOneOpen.mjs +22 -0
  223. package/dist/ui/useRovingFocus.mjs +64 -0
  224. package/dist/ui/useScrollTrack.mjs +150 -0
  225. package/dist/ui/useUniqueId.mjs +10 -0
  226. package/dist/ui/visuallyHidden.mjs +15 -0
  227. package/dist/web-components/About-uKa1wfDr.mjs +1 -0
  228. package/dist/web-components/AnnotationMenu-BGIYRXW6.mjs +1 -0
  229. package/dist/web-components/AnnotationState-D2UIgIEC.mjs +1 -0
  230. package/dist/web-components/Annotations-BhwAv3ah.mjs +1 -0
  231. package/dist/web-components/Annotations-C_tBJHo3.mjs +2 -0
  232. package/dist/web-components/Body-DMEERFuB.mjs +1 -0
  233. package/dist/web-components/BodyAlert-BP8voSLv.mjs +1 -0
  234. package/dist/web-components/Button-Cl02BFDd.mjs +1 -0
  235. package/dist/web-components/Camera-Dw51CAfF.mjs +1 -0
  236. package/dist/web-components/Canvas2DBackend-RRN2bEkc.mjs +1 -0
  237. package/dist/web-components/CanvasView-B8lMMSou.mjs +1 -0
  238. package/dist/web-components/CaptionDetails-KLMDv-ec.mjs +1 -0
  239. package/dist/web-components/ChoiceMenu-CXrVOmJl.mjs +1 -0
  240. package/dist/web-components/Collection-DL4Ui4hF.mjs +1 -0
  241. package/dist/web-components/CollectionSelect-DL-bbpwJ.mjs +1 -0
  242. package/dist/web-components/Connected-B0S1HXQb.mjs +1 -0
  243. package/dist/web-components/Connected-BcjRA5si.mjs +1 -0
  244. package/dist/web-components/Connected-Q7iizBb8.mjs +1 -0
  245. package/dist/web-components/Contents-ZC8TiGaW.mjs +1 -0
  246. package/dist/web-components/ControlMenu-DIoU797-.mjs +1 -0
  247. package/dist/web-components/Cue-CJxnDMEy.mjs +1 -0
  248. package/dist/web-components/Document-DHBRAFEK.mjs +1 -0
  249. package/dist/web-components/DocumentPanel-CqvE2pu9.mjs +1 -0
  250. package/dist/web-components/DomLayers-BsR2AOy-.mjs +1 -0
  251. package/dist/web-components/Download-DBksL1C0.mjs +1 -0
  252. package/dist/web-components/EntryBodies-VwEkTVrw.mjs +1 -0
  253. package/dist/web-components/ErrorBoundary-Cy9PGoZv.mjs +1 -0
  254. package/dist/web-components/FieldPill-DCJBz6Vj.mjs +1 -0
  255. package/dist/web-components/FrameAnimation-DRbmgGpF.mjs +1 -0
  256. package/dist/web-components/Gallery-BM7-VJkB.mjs +1 -0
  257. package/dist/web-components/HideToggle-BdYgG7us.mjs +1 -0
  258. package/dist/web-components/Items-_1Jz3FMs.mjs +1 -0
  259. package/dist/web-components/Label-CAiJ49eA.mjs +1 -0
  260. package/dist/web-components/LightboxBody-DyhUZiDf.mjs +1 -0
  261. package/dist/web-components/Loaded-wQurAeJz.mjs +1 -0
  262. package/dist/web-components/LoadedCanvas-DWz5IK5m.mjs +1 -0
  263. package/dist/web-components/LoadedMap-DIeW313M.mjs +1 -0
  264. package/dist/web-components/Loading-BmA--pzr.mjs +1 -0
  265. package/dist/web-components/Map-DzVGblIS.mjs +1 -0
  266. package/dist/web-components/MapView-BJaN7VBI.mjs +1 -0
  267. package/dist/web-components/Markup-D91DbxLk.mjs +2 -0
  268. package/dist/web-components/MediaBody-BYcVPo2X.mjs +1 -0
  269. package/dist/web-components/MediaBody-FEzH8VVw.mjs +1 -0
  270. package/dist/web-components/Navigator-CIJFA3q1.mjs +1 -0
  271. package/dist/web-components/Pager-BGwCurxE.mjs +1 -0
  272. package/dist/web-components/Panel-B-GXOkzF.mjs +1 -0
  273. package/dist/web-components/PanelToggle-BYjV2t1j.mjs +1 -0
  274. package/dist/web-components/PartOfManifest-ClbGepVM.mjs +1 -0
  275. package/dist/web-components/Pending-BspZajh5.mjs +1 -0
  276. package/dist/web-components/Primitives-CTh59wvs.mjs +1 -0
  277. package/dist/web-components/Provider-C6rIiDXH.mjs +1 -0
  278. package/dist/web-components/ReadMore-BJ2i-0uN.mjs +1 -0
  279. package/dist/web-components/Root-DkkYDtur.mjs +1 -0
  280. package/dist/web-components/Scene-B_PU_TiX.mjs +1 -0
  281. package/dist/web-components/SceneView-qcW_sT3j.mjs +1 -0
  282. package/dist/web-components/Search-UOneIUcP.mjs +1 -0
  283. package/dist/web-components/Sections-we9U9fXq.mjs +2 -0
  284. package/dist/web-components/StandaloneItems-DU8oCFc_.mjs +1 -0
  285. package/dist/web-components/Status-Cs5ZvFvL.mjs +1 -0
  286. package/dist/web-components/Timeline-WtYZ1bIJ.mjs +1 -0
  287. package/dist/web-components/Tip-C8J3qsIK.mjs +1 -0
  288. package/dist/web-components/Transcript-CRL2zToL.mjs +1 -0
  289. package/dist/web-components/annotation-collection-ZPyvpLFc.mjs +1 -0
  290. package/dist/web-components/annotations-content-BZChKhJZ.mjs +1 -0
  291. package/dist/web-components/assets/maplibre-gl-worker-kTz9OPxr.js +13831 -0
  292. package/dist/web-components/body-UntgrmoV.mjs +1 -0
  293. package/dist/web-components/bringIntoView-CQH5ZgMM.mjs +1 -0
  294. package/dist/web-components/canvas-d_U4v_mh.mjs +1 -0
  295. package/dist/web-components/classnames-DukgfdpI.mjs +1 -0
  296. package/dist/web-components/cloverEngine-Dbv-26NP.mjs +164 -0
  297. package/dist/web-components/content-state-reader-DjdKWjit.mjs +1 -0
  298. package/dist/web-components/contexts-ByL3eA_T.mjs +1 -0
  299. package/dist/web-components/controls-qRYf2jO2.mjs +1 -0
  300. package/dist/web-components/custom-elements.json +2739 -0
  301. package/dist/web-components/dragToClose-C-Pf1IeO.mjs +1 -0
  302. package/dist/web-components/engine-D8JLgzqq.mjs +4228 -0
  303. package/dist/web-components/engines-BwVb9R_A.mjs +1 -0
  304. package/dist/web-components/es-BwMkoRod.mjs +1 -0
  305. package/dist/web-components/fi-gPFOn9RK.mjs +1 -0
  306. package/dist/web-components/fr-DUHmgdJo.mjs +1 -0
  307. package/dist/web-components/fromManifest-UrMJgktp.mjs +1 -0
  308. package/dist/web-components/glyphs-BoX0a88P.mjs +1 -0
  309. package/dist/web-components/heading-Cjt0f-Eu.mjs +1 -0
  310. package/dist/web-components/hls-CdKrthkC.mjs +40 -0
  311. package/dist/web-components/hooks-Dp8pjU8l.mjs +1 -0
  312. package/dist/web-components/imageService-C3yg9DxB.mjs +1 -0
  313. package/dist/web-components/index-DWxMuwDL.mjs +1 -0
  314. package/dist/web-components/index.d.mts +604 -0
  315. package/dist/web-components/index.mjs +1 -0
  316. package/dist/web-components/index.umd.js +18 -0
  317. package/dist/web-components/items--Tu7ZM3L.mjs +1 -0
  318. package/dist/web-components/items-W2vrwArM.mjs +1 -0
  319. package/dist/web-components/keep-fragments-B5nlv2ck.mjs +1 -0
  320. package/dist/web-components/label-CYQ7tVl6.mjs +1 -0
  321. package/dist/web-components/languageCode-cCpiU0b0.mjs +1 -0
  322. package/dist/web-components/layout-KL0V-iJu.mjs +1 -0
  323. package/dist/web-components/link-DRRTY4lY.mjs +1 -0
  324. package/dist/web-components/logo-CnQUCB3Y.mjs +1 -0
  325. package/dist/web-components/maplibre-gl-CQ4OueXY.mjs +823 -0
  326. package/dist/web-components/markdown-CCYJwzFn.mjs +5 -0
  327. package/dist/web-components/models-BP2qp9nT.mjs +1 -0
  328. package/dist/web-components/nb-BSvnQ6jd.mjs +1 -0
  329. package/dist/web-components/nn-Dg2_HdZu.mjs +1 -0
  330. package/dist/web-components/no-BSvnQ6jd.mjs +1 -0
  331. package/dist/web-components/nodes-Bf-Fb7e5.mjs +1 -0
  332. package/dist/web-components/overlayImage-DdPs2EGY.mjs +1 -0
  333. package/dist/web-components/panClearOfControls-ac9uf-Qs.mjs +1 -0
  334. package/dist/web-components/panel-CiqEFDzv.mjs +1 -0
  335. package/dist/web-components/part-CUBY90_b.mjs +1 -0
  336. package/dist/web-components/playerSurface-i2TJz-F4.mjs +1 -0
  337. package/dist/web-components/provider-LUmAQSoP.mjs +1 -0
  338. package/dist/web-components/pt-B3J80JgO.mjs +1 -0
  339. package/dist/web-components/read-more-BaaO77el.mjs +1 -0
  340. package/dist/web-components/rendererSurface-DAvatpMF.mjs +22 -0
  341. package/dist/web-components/renderers-Bg4QqawN.mjs +1 -0
  342. package/dist/web-components/resource-DzIvB_4m.mjs +1 -0
  343. package/dist/web-components/sanitize-Dc7nOsgO.mjs +3 -0
  344. package/dist/web-components/search-DgcgsI3I.mjs +1 -0
  345. package/dist/web-components/shared-J3w3gnXD.mjs +1 -0
  346. package/dist/web-components/show-link-DWRRXSBy.mjs +1 -0
  347. package/dist/web-components/sizedImage-DfjlV2-i.mjs +1 -0
  348. package/dist/web-components/split-m-_XivaW.mjs +1 -0
  349. package/dist/web-components/splitting-BnQUxxgH.mjs +1 -0
  350. package/dist/web-components/status-DDS7jLNd.mjs +1 -0
  351. package/dist/web-components/styles-Ypl9KrSK.mjs +1 -0
  352. package/dist/web-components/svg-shape-DLY3g7oq.mjs +1 -0
  353. package/dist/web-components/text-BTAkxEfQ.mjs +5 -0
  354. package/dist/web-components/three.mjs +1 -0
  355. package/dist/web-components/thumbnail-BZvLSwWW.mjs +1 -0
  356. package/dist/web-components/time-B9GZoYcm.mjs +1 -0
  357. package/dist/web-components/tip-BXByhOJ9.mjs +1 -0
  358. package/dist/web-components/toggle-AS72kq6v.mjs +1 -0
  359. package/dist/web-components/upgrader-XNxI-5jo.mjs +1 -0
  360. package/dist/web-components/useContainerName-DCbE5JXi.mjs +1 -0
  361. package/dist/web-components/useNearViewport-CyoK3l8W.mjs +1 -0
  362. package/dist/web-components/useScrollTrack-dLFWnT8N.mjs +1 -0
  363. package/dist/web-components/viewer/AnnotationMenu-Dd4tnzNV.mjs +1 -0
  364. package/dist/web-components/viewer/AnnotationState-DZaSy5lH.mjs +1 -0
  365. package/dist/web-components/viewer/Annotations-D1h-Yi5J.mjs +1 -0
  366. package/dist/web-components/viewer/Annotations-sj79EMen.mjs +2 -0
  367. package/dist/web-components/viewer/Canvas2DBackend-CkvI0wUT.mjs +1 -0
  368. package/dist/web-components/viewer/CaptionDetails-B_JdNjJ7.mjs +1 -0
  369. package/dist/web-components/viewer/ChoiceMenu-xa51a1DV.mjs +1 -0
  370. package/dist/web-components/viewer/Collection-CxuLCspj.mjs +1 -0
  371. package/dist/web-components/viewer/Connected-BSUBc3Ci.mjs +1 -0
  372. package/dist/web-components/viewer/Connected-CPIxNjF2.mjs +1 -0
  373. package/dist/web-components/viewer/Contents-DNh9mnsF.mjs +1 -0
  374. package/dist/web-components/viewer/ControlMenu-DdgIvBdf.mjs +1 -0
  375. package/dist/web-components/viewer/Cue-90H9_dXz.mjs +1 -0
  376. package/dist/web-components/viewer/Document-CNCpzkiN.mjs +1 -0
  377. package/dist/web-components/viewer/DocumentPanel-BdG4TVLE.mjs +1 -0
  378. package/dist/web-components/viewer/DomLayers-Dybz_aJv.mjs +1 -0
  379. package/dist/web-components/viewer/EntryBodies-DGXjFP3N.mjs +1 -0
  380. package/dist/web-components/viewer/FieldPill-Icmd98OY.mjs +1 -0
  381. package/dist/web-components/viewer/FrameAnimation-DJZN3Rd4.mjs +1 -0
  382. package/dist/web-components/viewer/Gallery-CEp3-bh2.mjs +1 -0
  383. package/dist/web-components/viewer/HideToggle-DB6HTmAO.mjs +1 -0
  384. package/dist/web-components/viewer/LightboxBody-ClQ4yrTh.mjs +1 -0
  385. package/dist/web-components/viewer/MapView-BVSdybIC.mjs +1 -0
  386. package/dist/web-components/viewer/MediaBody-BBbSMT1i.mjs +1 -0
  387. package/dist/web-components/viewer/MediaBody-BzMXMHIF.mjs +1 -0
  388. package/dist/web-components/viewer/Navigator-Duc69Yes.mjs +1 -0
  389. package/dist/web-components/viewer/PartOfManifest-X9_q-2t6.mjs +1 -0
  390. package/dist/web-components/viewer/Search-S4N5QU4R.mjs +1 -0
  391. package/dist/web-components/viewer/StandaloneItems-BO4VyWRW.mjs +1 -0
  392. package/dist/web-components/viewer/Transcript-BbDaS064.mjs +1 -0
  393. package/dist/web-components/viewer/annotation-collection-BjZ1DAHq.mjs +1 -0
  394. package/dist/web-components/viewer/annotations-content-jn3n5Y2-.mjs +1 -0
  395. package/dist/web-components/viewer/cloverEngine-CjuYjUhI.mjs +164 -0
  396. package/dist/web-components/viewer/content-state-reader-CPiShIjP.mjs +1 -0
  397. package/dist/web-components/viewer/host-yWi4R1bP.mjs +1 -0
  398. package/dist/web-components/viewer/index.d.mts +7 -0
  399. package/dist/web-components/viewer/index.mjs +1 -0
  400. package/dist/web-components/viewer/index.umd.js +18 -0
  401. package/dist/web-components/viewer/link-CwE-fg5G.mjs +1 -0
  402. package/dist/web-components/viewer/overlayImage-BpOgqsZ0.mjs +1 -0
  403. package/dist/web-components/viewer/renderers-L-IlGI1r.mjs +1 -0
  404. package/dist/web-components/viewer/search-DWkwRPo_.mjs +1 -0
  405. package/dist/web-components/viewer/styles-BRCkEU3w.mjs +1 -0
  406. package/dist/web-components/viewer/viewer--TreVlJ_.mjs +28 -0
  407. package/dist/web-components/viewer/vtt-1ZJwtElI.mjs +5 -0
  408. package/dist/web-components/viewer-DyV864Qe.mjs +1 -0
  409. package/dist/web-components/vtt-GFssZH8Y.mjs +5 -0
  410. package/package.json +110 -4
@@ -0,0 +1,377 @@
1
+ "use client";
2
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
+ import { forwardRef, useMemo, useState, useEffect, useSyncExternalStore, useRef } from "react";
4
+ import { useUniqueId } from "../../ui/useUniqueId.mjs";
5
+ import { createPortal } from "react-dom";
6
+ import { canvasCaptions, canvasTextTranscripts } from "../Canvas/layout.mjs";
7
+ import { selectVisibleCanvases } from "../../core/selectors.mjs";
8
+ import { localize } from "../../core/value.mjs";
9
+ import { loadVtt, loadText, parseVtt, paragraphsOf, cueAt } from "../../core/vtt.mjs";
10
+ import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
11
+ import { join } from "../../lib/classnames.mjs";
12
+ import { playFrom } from "../../lib/time.mjs";
13
+ import { useClover, useCloverSelector } from "../../react/context.mjs";
14
+ import { bringIntoView, scrollerOf } from "../../ui/bringIntoView.mjs";
15
+ import { CueTime } from "../../ui/Cue.mjs";
16
+ import { FieldPill } from "../../ui/FieldPill.mjs";
17
+ import { languageCode } from "../../ui/languageCode.mjs";
18
+ import { useSectionActions } from "../../ui/Sections.mjs";
19
+ import { Tip } from "../../ui/Tip.mjs";
20
+ import { useContainerName } from "../../ui/useContainerName.mjs";
21
+ import { visuallyHidden } from "../../ui/visuallyHidden.mjs";
22
+ const CHUNK = 40;
23
+ const fold = (text) => text.toLocaleLowerCase();
24
+ function marked(text, query) {
25
+ if (!query) return text;
26
+ const folded = fold(text);
27
+ const parts = [];
28
+ let from = 0;
29
+ for (let at = folded.indexOf(query); at >= 0; at = folded.indexOf(query, at + query.length)) {
30
+ if (at > from) parts.push(text.slice(from, at));
31
+ parts.push(/* @__PURE__ */ jsx("mark", { children: text.slice(at, at + query.length) }, at));
32
+ from = at + query.length;
33
+ }
34
+ if (from < text.length) parts.push(text.slice(from));
35
+ return parts;
36
+ }
37
+ const Transcript = forwardRef(
38
+ function Transcript2({
39
+ as: Tag = "div",
40
+ follow = true,
41
+ find = true,
42
+ sticky = false,
43
+ size = "large",
44
+ className,
45
+ ...rest
46
+ }, ref) {
47
+ const { t, langOf } = useCloverTranslation();
48
+ const { clover, language } = useClover("Transcript");
49
+ const canvases = useCloverSelector(
50
+ (state) => selectVisibleCanvases(state.manifest, state.canvasId)
51
+ );
52
+ const canvas = canvases.find(
53
+ (candidate) => canvasCaptions(candidate).length > 0 || canvasTextTranscripts(candidate).length > 0
54
+ );
55
+ const tracks = useMemo(
56
+ () => canvas ? [
57
+ ...canvasCaptions(canvas).map((each) => ({
58
+ ...each,
59
+ kind: "captions"
60
+ })),
61
+ ...canvasTextTranscripts(canvas).map((each) => ({
62
+ ...each,
63
+ kind: "text"
64
+ }))
65
+ ] : [],
66
+ [canvas]
67
+ );
68
+ const [choice, setChoice] = useState(0);
69
+ const track = tracks[choice] ?? tracks[0];
70
+ useEffect(() => {
71
+ const follow2 = (id2) => {
72
+ const index = tracks.findIndex(
73
+ (option) => option.kind === "captions" && option.id === id2
74
+ );
75
+ if (index >= 0) setChoice(index);
76
+ };
77
+ follow2(clover.captions.get());
78
+ return clover.captions.subscribe(follow2);
79
+ }, [clover, tracks]);
80
+ const [cues, setCues] = useState([]);
81
+ const [paragraphs, setParagraphs] = useState([]);
82
+ useEffect(() => {
83
+ setCues([]);
84
+ setParagraphs([]);
85
+ if (!track) return;
86
+ let live = true;
87
+ (track.kind === "captions" ? loadVtt(track.id, clover.request).then(
88
+ (text) => live && setCues(parseVtt(text))
89
+ ) : loadText(track.id, clover.request).then(
90
+ (text) => live && setParagraphs(paragraphsOf(text))
91
+ )).catch(() => void 0);
92
+ return () => {
93
+ live = false;
94
+ };
95
+ }, [track, clover]);
96
+ const element = useSyncExternalStore(
97
+ clover.media.subscribe,
98
+ clover.media.get,
99
+ clover.media.get
100
+ );
101
+ const active = useActiveCue(element, cues);
102
+ const list = useRef(null);
103
+ useEffect(() => {
104
+ var _a;
105
+ if (!follow || active < 0 || !element || element.paused) return;
106
+ const item = (_a = list.current) == null ? void 0 : _a.children[active];
107
+ if (item) bringIntoView(item, "nearest");
108
+ }, [active, follow, element]);
109
+ const [draft, setDraft] = useState("");
110
+ const query = fold(draft.trim());
111
+ const matches = useMemo(
112
+ () => query ? cues.flatMap(
113
+ (cue, index) => fold(cue.text).includes(query) ? [index] : []
114
+ ) : [],
115
+ [cues, query]
116
+ );
117
+ const [match, setMatch] = useState({
118
+ query: "",
119
+ at: 0
120
+ });
121
+ const at = match.query === query ? match.at : 0;
122
+ const field = useRef(null);
123
+ const stepped = useRef(false);
124
+ const [more, setMore] = useState({
125
+ cues: [],
126
+ count: CHUNK
127
+ });
128
+ const limit = more.cues === cues ? more.count : CHUNK;
129
+ const extend = () => setMore({ cues, count: limit + CHUNK });
130
+ const extendRef = useRef(extend);
131
+ extendRef.current = extend;
132
+ const lazy = typeof IntersectionObserver !== "undefined";
133
+ const drawn = lazy ? Math.min(
134
+ cues.length,
135
+ Math.max(limit, active + 1, (matches[at] ?? -1) + 1)
136
+ ) : cues.length;
137
+ const end = useRef(null);
138
+ useEffect(() => {
139
+ const node = end.current;
140
+ if (!node || !lazy || drawn >= cues.length) return;
141
+ const observer = new IntersectionObserver(
142
+ (entries) => {
143
+ if (entries.some((entry) => entry.isIntersecting))
144
+ extendRef.current();
145
+ },
146
+ { root: scrollerOf(node), rootMargin: "0px 0px 400px 0px" }
147
+ );
148
+ observer.observe(node);
149
+ return () => observer.disconnect();
150
+ }, [lazy, drawn, cues.length]);
151
+ const currentMatch = matches[at];
152
+ useEffect(() => {
153
+ var _a;
154
+ if (currentMatch === void 0) return;
155
+ const item = (_a = list.current) == null ? void 0 : _a.children[currentMatch];
156
+ if (item) bringIntoView(item, "nearest");
157
+ stepped.current = false;
158
+ }, [currentMatch, query]);
159
+ const hasCues = cues.length > 0;
160
+ useEffect(() => {
161
+ var _a;
162
+ const held = (_a = field.current) == null ? void 0 : _a.closest(
163
+ ".clover-transcript-find"
164
+ );
165
+ const part = held == null ? void 0 : held.parentElement;
166
+ if (!sticky || !held || !part || typeof ResizeObserver === "undefined")
167
+ return;
168
+ const observer = new ResizeObserver(
169
+ () => part.style.setProperty(
170
+ "--clover-transcript-find",
171
+ `${held.offsetHeight}px`
172
+ )
173
+ );
174
+ observer.observe(held);
175
+ return () => {
176
+ observer.disconnect();
177
+ part.style.removeProperty("--clover-transcript-find");
178
+ };
179
+ }, [sticky, hasCues, find]);
180
+ const id = useUniqueId();
181
+ const actions = useSectionActions();
182
+ const nameKey = tracks.every((each) => each.kind === "captions") ? "playerCaptions" : "transcriptLabel";
183
+ const name = useContainerName(t(nameKey), langOf(nameKey));
184
+ if (!canvas || !track) return null;
185
+ const texts = tracks.filter((each) => each.kind === "text").length;
186
+ const shown = tracks.map((each) => {
187
+ const code = languageCode(each.language);
188
+ if (each.kind === "captions") return code;
189
+ return texts > 1 && code ? `TXT ${code}` : "TXT";
190
+ });
191
+ const codes = shown.map(
192
+ (code) => code && shown.filter((each) => each === code).length === 1 ? code : void 0
193
+ );
194
+ const lang = track.language && track.language !== "none" ? track.language : void 0;
195
+ const languages = tracks.length > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
196
+ name.node,
197
+ /* @__PURE__ */ jsx("fieldset", { ...name.props, className: "clover-transcript-languages", children: tracks.map((option, index) => {
198
+ const label = localize(option.label, language);
199
+ const code = codes[index];
200
+ const text = label.text || option.language || String(index + 1);
201
+ return /* @__PURE__ */ jsxs("label", { className: "clover-transcript-language", children: [
202
+ /* @__PURE__ */ jsx(
203
+ "input",
204
+ {
205
+ type: "radio",
206
+ name: `${id}-language`,
207
+ checked: index === choice,
208
+ onChange: () => {
209
+ setChoice(index);
210
+ if (option.kind === "captions")
211
+ clover.captions.emit(option.id);
212
+ }
213
+ }
214
+ ),
215
+ code && /* @__PURE__ */ jsxs(Fragment, { children: [
216
+ /* @__PURE__ */ jsx("span", { className: "clover-transcript-code", children: code }),
217
+ " "
218
+ ] }),
219
+ /* @__PURE__ */ jsx(
220
+ "span",
221
+ {
222
+ style: code ? visuallyHidden : void 0,
223
+ lang: label.text ? label.lang : void 0,
224
+ children: text
225
+ }
226
+ ),
227
+ code && label.text && /* @__PURE__ */ jsx(Tip, { label: label.text, lang: label.lang })
228
+ ] }, option.id);
229
+ }) })
230
+ ] });
231
+ const seek = (cue, play = true) => {
232
+ if (element) {
233
+ if (play) playFrom(element, cue.start);
234
+ else element.currentTime = cue.start;
235
+ return;
236
+ }
237
+ clover.goTo(canvas.id, { time: cue.start });
238
+ };
239
+ const go = (index) => {
240
+ const cue = cues[matches[index]];
241
+ if (!cue) return;
242
+ stepped.current = true;
243
+ setMatch({ query, at: index });
244
+ seek(cue, false);
245
+ };
246
+ const steps = {
247
+ position: matches.length ? at : -1,
248
+ total: matches.length,
249
+ step: (by) => go(at + by)
250
+ };
251
+ const count = matches.length;
252
+ const statusKey = !query ? null : count === 0 ? "contentSearchResultsNone" : count === 1 ? "contentSearchResult" : "contentSearchResults";
253
+ const finding = find && track.kind === "captions" && cues.length > 0 && /* @__PURE__ */ jsxs("div", { className: "clover-transcript-find", children: [
254
+ /* @__PURE__ */ jsx(
255
+ FieldPill,
256
+ {
257
+ ref: field,
258
+ id: `${id}-find`,
259
+ value: draft,
260
+ onChange: setDraft,
261
+ onSubmit: () => {
262
+ if (!count) return;
263
+ const gone = match.query === query && stepped.current;
264
+ go(gone ? (at + 1) % count : at);
265
+ },
266
+ onClear: () => {
267
+ var _a;
268
+ setDraft("");
269
+ (_a = field.current) == null ? void 0 : _a.focus();
270
+ },
271
+ results: query ? steps : null,
272
+ size,
273
+ classes: { form: "clover-transcript-find-field" }
274
+ }
275
+ ),
276
+ /* @__PURE__ */ jsx(
277
+ "p",
278
+ {
279
+ className: "clover-transcript-find-status",
280
+ role: "status",
281
+ lang: statusKey ? langOf(statusKey) : void 0,
282
+ children: statusKey ? t(statusKey, { count }) : ""
283
+ }
284
+ )
285
+ ] });
286
+ return /* @__PURE__ */ jsxs(
287
+ Tag,
288
+ {
289
+ ref,
290
+ className: join("clover-transcript", className),
291
+ "data-sticky": sticky || void 0,
292
+ ...rest,
293
+ children: [
294
+ languages && (actions ? createPortal(languages, actions) : languages),
295
+ finding,
296
+ track.kind === "text" ? (
297
+ // Untimed: the words alone, a paragraph each, nothing to press.
298
+ /* @__PURE__ */ jsx("div", { className: "clover-transcript-body", lang, children: paragraphs.map((paragraph, index) => /* @__PURE__ */ jsx("p", { children: paragraph }, index)) })
299
+ ) : /* @__PURE__ */ jsx(
300
+ "ol",
301
+ {
302
+ ref: list,
303
+ className: "clover-transcript-cues",
304
+ id: `${id}-cues`,
305
+ lang,
306
+ children: cues.slice(0, drawn).map((cue, index) => /* @__PURE__ */ jsx(
307
+ "li",
308
+ {
309
+ className: "clover-transcript-cue",
310
+ "aria-current": index === active ? "true" : void 0,
311
+ "data-match": query && matches.includes(index) ? index === currentMatch ? "current" : "true" : void 0,
312
+ children: /* @__PURE__ */ jsxs(
313
+ "button",
314
+ {
315
+ type: "button",
316
+ onClick: () => seek(cue),
317
+ onFocus: () => {
318
+ if (drawn < cues.length && index >= drawn - 5) extend();
319
+ },
320
+ children: [
321
+ /* @__PURE__ */ jsx(
322
+ CueTime,
323
+ {
324
+ start: cue.start,
325
+ className: "clover-transcript-time"
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsxs("span", { className: "clover-transcript-text clover-cue-text", children: [
329
+ cue.voice && /* @__PURE__ */ jsxs("span", { className: "clover-transcript-voice", children: [
330
+ cue.voice,
331
+ ":",
332
+ " "
333
+ ] }),
334
+ marked(cue.text, query)
335
+ ] })
336
+ ]
337
+ }
338
+ )
339
+ },
340
+ `${cue.start}-${index}`
341
+ ))
342
+ }
343
+ ),
344
+ track.kind === "captions" && drawn < cues.length && /* @__PURE__ */ jsx(
345
+ "div",
346
+ {
347
+ ref: end,
348
+ className: "clover-transcript-more",
349
+ "aria-hidden": "true"
350
+ }
351
+ )
352
+ ]
353
+ }
354
+ );
355
+ }
356
+ );
357
+ function useActiveCue(element, cues) {
358
+ const [active, setActive] = useState(-1);
359
+ useEffect(() => {
360
+ if (!element || !cues.length) {
361
+ setActive(-1);
362
+ return;
363
+ }
364
+ const update = () => setActive(cueAt(cues, element.currentTime));
365
+ update();
366
+ element.addEventListener("timeupdate", update);
367
+ element.addEventListener("seeked", update);
368
+ return () => {
369
+ element.removeEventListener("timeupdate", update);
370
+ element.removeEventListener("seeked", update);
371
+ };
372
+ }, [element, cues]);
373
+ return active;
374
+ }
375
+ export {
376
+ Transcript
377
+ };
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { lazy, Suspense } from "react";
4
+ const LazyDefault = lazy(
5
+ () => import("../../templates/default/Default.mjs").then((module) => ({
6
+ default: module.Default
7
+ }))
8
+ );
9
+ function Viewer({
10
+ template,
11
+ ...props
12
+ }) {
13
+ const Template = template ?? LazyDefault;
14
+ const drawn = /* @__PURE__ */ jsx(Template, { ...props });
15
+ return template ? drawn : /* @__PURE__ */ jsx(Suspense, { fallback: null, children: drawn });
16
+ }
17
+ export {
18
+ Viewer
19
+ };
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { bodiesOf } from "./painting.mjs";
3
+ import { asArray } from "../lib/asArray.mjs";
4
+ const isCaptionFile = (body) => (body == null ? void 0 : body.format) === "text/vtt" || typeof (body == null ? void 0 : body.id) === "string" && /\.vtt(\?|$)/i.test(body.id);
5
+ function readBodies(annotation) {
6
+ const bodies = [];
7
+ for (let body of bodiesOf(annotation)) {
8
+ if ((body == null ? void 0 : body.type) === "Choice") body = asArray(body.items)[0];
9
+ if (!body || isCaptionFile(body)) continue;
10
+ if (body.type === "TextualBody" || typeof body.value === "string") {
11
+ bodies.push({
12
+ value: String(body.value ?? ""),
13
+ format: body.format,
14
+ language: asArray(body.language)[0]
15
+ });
16
+ } else if (body.type === "Image" && body.id) {
17
+ const label = body.label ?? annotation.label;
18
+ bodies.push({
19
+ image: body.id,
20
+ format: body.format,
21
+ ...label ? { label } : {}
22
+ });
23
+ }
24
+ }
25
+ return bodies;
26
+ }
27
+ export {
28
+ readBodies
29
+ };
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { readPage } from "./annotation-sets.mjs";
3
+ import { upgradePage } from "./pages.mjs";
4
+ import { fetchJson } from "./request.mjs";
5
+ import { asArray } from "../lib/asArray.mjs";
6
+ const MAX_PAGES = 100;
7
+ async function resolve(item, request, signal) {
8
+ if (typeof item === "string") {
9
+ return await fetchJson(request, item, signal);
10
+ }
11
+ const json = item;
12
+ if ((json == null ? void 0 : json.id) && json.type === "AnnotationPage" && !json.items) {
13
+ return await fetchJson(request, json.id, signal);
14
+ }
15
+ return json;
16
+ }
17
+ async function pagesOf(json, request, signal) {
18
+ const type = String((json == null ? void 0 : json.type) ?? (json == null ? void 0 : json["@type"]) ?? "");
19
+ const collection = /AnnotationCollection/.test(type);
20
+ const pages = collection ? [] : [json];
21
+ const seen = new Set(collection ? [] : [json.id]);
22
+ let next = collection ? json.first : json.next;
23
+ while (next && pages.length < MAX_PAGES) {
24
+ const id = typeof next === "string" ? next : next.id;
25
+ if (seen.has(id ?? next)) break;
26
+ seen.add(id ?? next);
27
+ const page = await resolve(next, request, signal);
28
+ pages.push(page);
29
+ next = page.next;
30
+ }
31
+ return pages;
32
+ }
33
+ async function loadAnnotationSets(input, { request, signal } = {}) {
34
+ const sets = [];
35
+ for (const item of asArray(input)) {
36
+ const json = await resolve(item, request, signal);
37
+ for (const raw of await pagesOf(json, request, signal)) {
38
+ const page = await upgradePage(raw);
39
+ const id = page.id ?? `added-${sets.length}`;
40
+ const entries = readPage(page, id);
41
+ if (entries.length) {
42
+ sets.push({
43
+ id,
44
+ label: page.label ?? json.label,
45
+ source: "added",
46
+ entries
47
+ });
48
+ }
49
+ }
50
+ }
51
+ return sets;
52
+ }
53
+ export {
54
+ loadAnnotationSets
55
+ };
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import { toPlainText, readAs, markdownToPlainText } from "./text.mjs";
3
+ import { localize } from "./value.mjs";
4
+ function annotationName(bodies, language) {
5
+ const named = (text2, lang) => text2 ? { text: text2, ...lang ? { lang } : {} } : {};
6
+ const texts = bodies.filter((body2) => {
7
+ var _a;
8
+ return (_a = body2.value) == null ? void 0 : _a.trim();
9
+ });
10
+ if (!texts.length) {
11
+ const image = bodies.find((body2) => body2.image && body2.label);
12
+ if (!image) return {};
13
+ const { text: text2, lang } = localize(image.label, language);
14
+ return named(toPlainText(text2).trim(), lang);
15
+ }
16
+ const tagOf = (body2) => body2.language && body2.language !== "none" ? body2.language : "none";
17
+ const first = {};
18
+ texts.forEach((body2, index) => {
19
+ var _a;
20
+ first[_a = tagOf(body2)] ?? (first[_a] = [String(index)]);
21
+ });
22
+ const body = texts[Number(localize(first, language).text) || 0];
23
+ const value = body.value;
24
+ const kind = readAs(body.format, value);
25
+ const text = kind === "markdown" ? markdownToPlainText(value) : kind === "html" ? toPlainText(value) : value;
26
+ const tag = tagOf(body);
27
+ return named(text.trim(), tag === "none" ? void 0 : tag);
28
+ }
29
+ export {
30
+ annotationName
31
+ };
@@ -0,0 +1,155 @@
1
+ "use client";
2
+ import { isRegionText, parseAnnotationTarget } from "./annotations.mjs";
3
+ import { readBodies } from "./annotation-bodies.mjs";
4
+ import { asArray } from "../lib/asArray.mjs";
5
+ import { SEARCH_SET_ID } from "./search-service.mjs";
6
+ import { selectCanvas, selectSequence } from "./selectors.mjs";
7
+ const isLinking = (annotation) => asArray(annotation == null ? void 0 : annotation.motivation).includes("linking");
8
+ function readPage(page, setId, fallbackCanvasId) {
9
+ const entries = [];
10
+ for (const annotation of asArray(page == null ? void 0 : page.items)) {
11
+ const motivation = asArray(annotation == null ? void 0 : annotation.motivation);
12
+ if (motivation.includes("painting")) continue;
13
+ const bodies = readBodies(annotation);
14
+ if (!bodies.length && !isLinking(annotation)) continue;
15
+ const target = parseAnnotationTarget(asArray(annotation.target)[0]);
16
+ const canvasId = target.id || fallbackCanvasId;
17
+ if (!canvasId || !annotation.id) continue;
18
+ entries.push({
19
+ id: annotation.id,
20
+ setId,
21
+ canvasId,
22
+ target,
23
+ motivation,
24
+ bodies,
25
+ annotation
26
+ });
27
+ }
28
+ return entries;
29
+ }
30
+ const manifestSets = /* @__PURE__ */ new WeakMap();
31
+ function selectManifestSets(manifest) {
32
+ if (!manifest) return [];
33
+ let sets = manifestSets.get(manifest);
34
+ if (!sets) {
35
+ const byId = /* @__PURE__ */ new Map();
36
+ for (const canvas of selectSequence(manifest).canvases) {
37
+ for (const page of asArray(canvas.annotations)) {
38
+ if (!Array.isArray(page == null ? void 0 : page.items)) continue;
39
+ const id = page.id ?? `${canvas.id}#annotations`;
40
+ let set = byId.get(id);
41
+ if (!set) {
42
+ set = { id, label: page.label, source: "manifest", entries: [] };
43
+ byId.set(id, set);
44
+ }
45
+ set.entries.push(...readPage(page, id, canvas.id));
46
+ }
47
+ }
48
+ sets = [...byId.values()].filter((set) => set.entries.length);
49
+ manifestSets.set(manifest, sets);
50
+ }
51
+ return sets;
52
+ }
53
+ const allSets = /* @__PURE__ */ new WeakMap();
54
+ const NO_SETS = [];
55
+ function selectAnnotationSets(manifest, added) {
56
+ const own = selectManifestSets(manifest);
57
+ if (!added.length) return own.length ? own : NO_SETS;
58
+ const key = manifest ?? NO_SETS;
59
+ let byAdded = allSets.get(key);
60
+ if (!byAdded) allSets.set(key, byAdded = /* @__PURE__ */ new Map());
61
+ let sets = byAdded.get(added);
62
+ if (!sets) {
63
+ sets = [...own, ...added];
64
+ byAdded.set(added, sets);
65
+ }
66
+ return sets;
67
+ }
68
+ const drawnSets = /* @__PURE__ */ new WeakMap();
69
+ function selectDrawnSets(manifest, added, searchSet) {
70
+ const sets = selectAnnotationSets(manifest, added);
71
+ if (!(searchSet == null ? void 0 : searchSet.entries.length)) return sets;
72
+ let bySearch = drawnSets.get(sets);
73
+ if (!bySearch) drawnSets.set(sets, bySearch = /* @__PURE__ */ new Map());
74
+ let drawn = bySearch.get(searchSet);
75
+ if (!drawn) {
76
+ drawn = [...sets, searchSet];
77
+ bySearch.set(searchSet, drawn);
78
+ }
79
+ return drawn;
80
+ }
81
+ const plays = (canvas) => Number(canvas == null ? void 0 : canvas.duration) > 0;
82
+ function startsHidden(set, canvasOf) {
83
+ if (set.source === "search" || !set.entries.length) return false;
84
+ return set.entries.every(
85
+ (entry) => isRegionText(entry.motivation, entry.target) && !plays(canvasOf(entry.canvasId))
86
+ );
87
+ }
88
+ const listedOf = /* @__PURE__ */ new WeakMap();
89
+ function selectListedSets(manifest, added) {
90
+ const sets = selectAnnotationSets(manifest, added);
91
+ let listed = listedOf.get(sets);
92
+ if (!listed) {
93
+ const kept = sets.filter(
94
+ (set) => !startsHidden(set, (id) => selectCanvas(manifest, id) ?? void 0)
95
+ );
96
+ listed = kept.length === sets.length ? sets : kept;
97
+ listedOf.set(sets, listed);
98
+ }
99
+ return listed;
100
+ }
101
+ const hiddenOf = /* @__PURE__ */ new WeakMap();
102
+ function selectHiddenSets(manifest, added, hidden, shown) {
103
+ const sets = selectAnnotationSets(manifest, added);
104
+ const cached = hiddenOf.get(sets);
105
+ if (cached && cached.hidden === hidden && cached.shown === shown)
106
+ return cached.ids;
107
+ const quiet = sets.filter(
108
+ (set) => !hidden.includes(set.id) && !shown.includes(set.id) && startsHidden(set, (id) => selectCanvas(manifest, id) ?? void 0)
109
+ ).map((set) => set.id);
110
+ const ids = quiet.length ? [...hidden, ...quiet] : hidden;
111
+ hiddenOf.set(sets, { hidden, shown, ids });
112
+ return ids;
113
+ }
114
+ const unlistedOf = /* @__PURE__ */ new WeakMap();
115
+ function selectUnlistedSets(manifest, added, hidden, shown) {
116
+ const drawnHidden = selectHiddenSets(manifest, added, hidden, shown);
117
+ const cached = unlistedOf.get(drawnHidden);
118
+ if (cached && cached.hidden === hidden) return cached.ids;
119
+ const ids = [
120
+ SEARCH_SET_ID,
121
+ ...drawnHidden.filter((id) => !hidden.includes(id))
122
+ ];
123
+ unlistedOf.set(drawnHidden, { hidden, ids });
124
+ return ids;
125
+ }
126
+ function manifestOfAnnotation(annotation) {
127
+ for (const target of asArray(annotation == null ? void 0 : annotation.target)) {
128
+ const source = (target == null ? void 0 : target.type) === "SpecificResource" ? target.source : target;
129
+ const part = asArray(source == null ? void 0 : source.partOf).find(
130
+ (each) => (each == null ? void 0 : each.id) && (!each.type || each.type === "Manifest")
131
+ );
132
+ if (part) return part.id;
133
+ }
134
+ return void 0;
135
+ }
136
+ function findEntry(sets, id) {
137
+ if (!id) return null;
138
+ for (const set of sets) {
139
+ const entry = set.entries.find((candidate) => candidate.id === id);
140
+ if (entry) return entry;
141
+ }
142
+ return null;
143
+ }
144
+ export {
145
+ findEntry,
146
+ manifestOfAnnotation,
147
+ readPage,
148
+ selectAnnotationSets,
149
+ selectDrawnSets,
150
+ selectHiddenSets,
151
+ selectListedSets,
152
+ selectManifestSets,
153
+ selectUnlistedSets,
154
+ startsHidden
155
+ };
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { loadAnnotationSets } from "./annotation-collection.mjs";
3
+ import { manifestOfAnnotation } from "./annotation-sets.mjs";
4
+ import { CloverContentError, loadManifest } from "./load.mjs";
5
+ async function annotationsContent(json, options) {
6
+ const annotationSets = await loadAnnotationSets(json, options);
7
+ const entries = annotationSets.flatMap((set) => set.entries);
8
+ const first = entries.find(
9
+ (entry) => options.manifestId && manifestOfAnnotation(entry.annotation) === options.manifestId
10
+ ) ?? entries.find((entry) => manifestOfAnnotation(entry.annotation));
11
+ if (!first) {
12
+ throw new CloverContentError("The annotations name no Manifest");
13
+ }
14
+ const manifest = await loadManifest(
15
+ { id: manifestOfAnnotation(first.annotation), type: "Manifest" },
16
+ options
17
+ );
18
+ return {
19
+ manifest,
20
+ target: { canvasId: first.canvasId },
21
+ annotationSets,
22
+ pick: first.id
23
+ };
24
+ }
25
+ export {
26
+ annotationsContent
27
+ };