@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,141 @@
1
+ "use client";
2
+ import { WebGLRenderer, NeutralToneMapping, Scene, PMREMGenerator, PerspectiveCamera, Group, Vector3, Box3, Sphere, Euler } from "three";
3
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
4
+ import { RoomEnvironment } from "three/examples/jsm/environments/RoomEnvironment.js";
5
+ import { sendsCredentials } from "../../core/request.mjs";
6
+ import { FIELD_OF_VIEW, cameraPosition } from "./orbit.mjs";
7
+ import { isDrawable, MODEL_FORMATS } from "./models.mjs";
8
+ const MAX_PIXEL_RATIO = 2;
9
+ function createEngine(host, { onLost }) {
10
+ const renderer = new WebGLRenderer({ antialias: true, alpha: true });
11
+ renderer.setPixelRatio(
12
+ Math.min(globalThis.devicePixelRatio || 1, MAX_PIXEL_RATIO)
13
+ );
14
+ renderer.toneMapping = NeutralToneMapping;
15
+ const canvas = renderer.domElement;
16
+ canvas.className = "clover-canvas-surface";
17
+ canvas.setAttribute("aria-hidden", "true");
18
+ canvas.style.cssText = "position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none";
19
+ const lost = (event) => {
20
+ event.preventDefault();
21
+ onLost();
22
+ };
23
+ canvas.addEventListener("webglcontextlost", lost);
24
+ host.prepend(canvas);
25
+ const scene = new Scene();
26
+ const environment = new PMREMGenerator(renderer);
27
+ const room = new RoomEnvironment();
28
+ scene.environment = environment.fromScene(room, 0.04).texture;
29
+ room.dispose();
30
+ environment.dispose();
31
+ const camera = new PerspectiveCamera(FIELD_OF_VIEW, 1, 0.01, 1e3);
32
+ const root = new Group();
33
+ scene.add(root);
34
+ let bounds = { center: [0, 0, 0], radius: 1 };
35
+ let disposed = false;
36
+ const resize = () => {
37
+ const width = host.clientWidth;
38
+ const height = host.clientHeight;
39
+ if (!width || !height) return;
40
+ renderer.setSize(width, height, false);
41
+ camera.aspect = width / height;
42
+ camera.updateProjectionMatrix();
43
+ };
44
+ resize();
45
+ return {
46
+ async load(models, request) {
47
+ const loader = new GLTFLoader();
48
+ if (sendsCredentials(request)) loader.setWithCredentials(true);
49
+ if (request == null ? void 0 : request.headers) loader.setRequestHeader(request.headers);
50
+ const drawable = models.filter(isDrawable);
51
+ if (!drawable.length) {
52
+ const formats = [
53
+ ...new Set(models.map((model) => model.format ?? model.src))
54
+ ];
55
+ throw new Error(
56
+ models.length ? `Clover draws glTF models (${MODEL_FORMATS.join(", ")}), not ${formats.join(", ")}.` : "The Scene paints no model."
57
+ );
58
+ }
59
+ const loaded = await Promise.all(
60
+ drawable.map((model) => loader.loadAsync(model.src))
61
+ );
62
+ if (disposed) return bounds;
63
+ loaded.forEach((gltf, index) => {
64
+ root.add(place(gltf.scene, drawable[index]));
65
+ });
66
+ const box = new Box3().setFromObject(root, true);
67
+ if (!box.isEmpty()) {
68
+ const sphere = box.getBoundingSphere(new Sphere());
69
+ bounds = {
70
+ center: sphere.center.toArray(),
71
+ radius: sphere.radius || 1
72
+ };
73
+ }
74
+ return bounds;
75
+ },
76
+ draw(orbit) {
77
+ if (disposed) return;
78
+ const [x, y, z] = cameraPosition(orbit, bounds.center);
79
+ camera.position.set(x, y, z);
80
+ camera.near = Math.max(
81
+ bounds.radius / 1e3,
82
+ orbit.distance - bounds.radius * 2
83
+ );
84
+ camera.far = orbit.distance + bounds.radius * 4;
85
+ camera.updateProjectionMatrix();
86
+ camera.lookAt(new Vector3(...bounds.center));
87
+ renderer.render(scene, camera);
88
+ },
89
+ resize,
90
+ dispose() {
91
+ var _a;
92
+ if (disposed) return;
93
+ disposed = true;
94
+ canvas.removeEventListener("webglcontextlost", lost);
95
+ root.traverse((object) => release(object));
96
+ (_a = scene.environment) == null ? void 0 : _a.dispose();
97
+ renderer.dispose();
98
+ renderer.forceContextLoss();
99
+ canvas.remove();
100
+ }
101
+ };
102
+ }
103
+ function place(model, { position, transforms }) {
104
+ let node = model;
105
+ for (const step of transforms) {
106
+ const group = new Group();
107
+ group.add(node);
108
+ if (step.type === "scale") group.scale.set(step.x, step.y, step.z);
109
+ else if (step.type === "translate")
110
+ group.position.set(step.x, step.y, step.z);
111
+ else
112
+ group.rotation.copy(
113
+ new Euler(
114
+ step.x * Math.PI / 180,
115
+ step.y * Math.PI / 180,
116
+ step.z * Math.PI / 180,
117
+ "ZYX"
118
+ )
119
+ );
120
+ node = group;
121
+ }
122
+ const placed = new Group();
123
+ placed.position.set(...position);
124
+ placed.add(node);
125
+ return placed;
126
+ }
127
+ function release(object) {
128
+ var _a;
129
+ const mesh = object;
130
+ (_a = mesh.geometry) == null ? void 0 : _a.dispose();
131
+ const materials = [mesh.material ?? []].flat();
132
+ for (const material of materials) {
133
+ for (const value of Object.values(material)) {
134
+ if (value == null ? void 0 : value.isTexture) value.dispose();
135
+ }
136
+ material.dispose();
137
+ }
138
+ }
139
+ export {
140
+ createEngine
141
+ };
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ const KEY = Symbol.for("@nulib/clover/scene-engines");
3
+ const store = globalThis;
4
+ const registered = store[KEY] ?? (store[KEY] = /* @__PURE__ */ new Map());
5
+ function registerSceneEngine(name, load) {
6
+ registered.set(name, load);
7
+ }
8
+ const clover = () => import("./cloverEngine.mjs");
9
+ let warned = false;
10
+ function engineFor(name = "clover") {
11
+ if (name === "clover") return clover;
12
+ const load = registered.get(name);
13
+ if (load) return load;
14
+ if (!warned) {
15
+ warned = true;
16
+ console.warn(`Clover: no Scene engine "${name}"; drawing with Clover's.`);
17
+ }
18
+ return clover;
19
+ }
20
+ export {
21
+ engineFor,
22
+ registerSceneEngine
23
+ };
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ import { isInteractive, TAP_SLOP } from "../../lib/pointer.mjs";
3
+ const TURN_PER_HEIGHT = 2 * Math.PI;
4
+ const WHEEL_ZOOM = 0.01;
5
+ const wheelPixels = (event) => event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * 400 : event.deltaY;
6
+ function attachOrbitGestures(element, input, span = () => element.clientHeight) {
7
+ const pointers = /* @__PURE__ */ new Map();
8
+ let spread = 0;
9
+ let dragging = false;
10
+ let start = { x: 0, y: 0 };
11
+ const apart = () => {
12
+ const [a, b] = [...pointers.values()];
13
+ return a && b ? Math.hypot(a.x - b.x, a.y - b.y) : 0;
14
+ };
15
+ const down = (event) => {
16
+ if (event.pointerType === "mouse" && event.button !== 0) return;
17
+ if (isInteractive(event.target, element)) return;
18
+ pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });
19
+ try {
20
+ element.setPointerCapture(event.pointerId);
21
+ } catch {
22
+ }
23
+ if (pointers.size === 1) {
24
+ dragging = false;
25
+ start = { x: event.clientX, y: event.clientY };
26
+ }
27
+ if (pointers.size === 2) spread = apart();
28
+ };
29
+ const move = (event) => {
30
+ const last = pointers.get(event.pointerId);
31
+ if (!last) return;
32
+ const now = { x: event.clientX, y: event.clientY };
33
+ pointers.set(event.pointerId, now);
34
+ if (pointers.size === 2) {
35
+ const next = apart();
36
+ if (spread > 0 && next > 0) input.zoom(next / spread);
37
+ spread = next;
38
+ return;
39
+ }
40
+ if (!dragging) {
41
+ if (Math.hypot(now.x - start.x, now.y - start.y) < TAP_SLOP) return;
42
+ dragging = true;
43
+ }
44
+ const height = span() || 1;
45
+ input.turn(
46
+ -(now.x - last.x) / height * TURN_PER_HEIGHT,
47
+ -(now.y - last.y) / height * TURN_PER_HEIGHT
48
+ );
49
+ };
50
+ const up = (event) => {
51
+ pointers.delete(event.pointerId);
52
+ spread = pointers.size === 2 ? apart() : 0;
53
+ };
54
+ const wheel = (event) => {
55
+ if (!event.ctrlKey) return;
56
+ event.preventDefault();
57
+ input.zoom(Math.exp(-wheelPixels(event) * WHEEL_ZOOM));
58
+ };
59
+ element.addEventListener("pointerdown", down);
60
+ element.addEventListener("pointermove", move);
61
+ element.addEventListener("pointerup", up);
62
+ element.addEventListener("pointercancel", up);
63
+ element.addEventListener("wheel", wheel, { passive: false });
64
+ return () => {
65
+ element.removeEventListener("pointerdown", down);
66
+ element.removeEventListener("pointermove", move);
67
+ element.removeEventListener("pointerup", up);
68
+ element.removeEventListener("pointercancel", up);
69
+ element.removeEventListener("wheel", wheel);
70
+ };
71
+ }
72
+ export {
73
+ attachOrbitGestures
74
+ };
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { isPainting, bodiesOf } from "../../core/painting.mjs";
3
+ import { asArray } from "../../lib/asArray.mjs";
4
+ const MODEL_FORMATS = ["model/gltf-binary", "model/gltf+json"];
5
+ const number = (value, fallback) => {
6
+ const read2 = Number(value);
7
+ return Number.isFinite(read2) ? read2 : fallback;
8
+ };
9
+ function isDrawable(model) {
10
+ if (model.format) return MODEL_FORMATS.includes(model.format.toLowerCase());
11
+ return /\.(glb|gltf)(\?|#|$)/i.test(model.src);
12
+ }
13
+ function transformsOf(resource) {
14
+ return asArray(resource.transform).flatMap((raw) => {
15
+ const step = raw;
16
+ const type = (step == null ? void 0 : step.type) === "ScaleTransform" ? "scale" : (step == null ? void 0 : step.type) === "RotateTransform" ? "rotate" : (step == null ? void 0 : step.type) === "TranslateTransform" ? "translate" : null;
17
+ if (!type || !step) return [];
18
+ const rest = type === "scale" ? 1 : 0;
19
+ return [
20
+ {
21
+ type,
22
+ x: number(step.x, rest),
23
+ y: number(step.y, rest),
24
+ z: number(step.z, rest)
25
+ }
26
+ ];
27
+ });
28
+ }
29
+ function positionOf(target) {
30
+ for (const raw of asArray(target)) {
31
+ const each = raw;
32
+ if ((each == null ? void 0 : each.type) !== "SpecificResource") continue;
33
+ const point = asArray(each.selector).find(
34
+ (selector) => (selector == null ? void 0 : selector.type) === "PointSelector"
35
+ );
36
+ if (point)
37
+ return [number(point.x, 0), number(point.y, 0), number(point.z, 0)];
38
+ }
39
+ return [0, 0, 0];
40
+ }
41
+ const read = /* @__PURE__ */ new WeakMap();
42
+ function sceneModels(scene) {
43
+ const cached = read.get(scene);
44
+ if (cached) return cached;
45
+ const models = [];
46
+ for (const page of scene.items ?? []) {
47
+ for (const annotation of (page == null ? void 0 : page.items) ?? []) {
48
+ if (!isPainting(annotation)) continue;
49
+ for (let body of bodiesOf(annotation)) {
50
+ if ((body == null ? void 0 : body.type) === "Choice")
51
+ body = asArray(body.items)[0];
52
+ const specific = (body == null ? void 0 : body.type) === "SpecificResource" ? body : null;
53
+ const source = specific ? typeof specific.source === "string" ? { id: specific.source, type: "Model" } : specific.source : body;
54
+ if ((source == null ? void 0 : source.type) !== "Model" || typeof source.id !== "string") continue;
55
+ models.push({
56
+ id: String(annotation.id ?? source.id),
57
+ src: source.id,
58
+ ...typeof source.format === "string" ? { format: source.format } : {},
59
+ ...source.label ? { label: source.label } : {},
60
+ position: positionOf(annotation.target),
61
+ transforms: specific ? transformsOf(specific) : []
62
+ });
63
+ }
64
+ }
65
+ }
66
+ read.set(scene, models);
67
+ return models;
68
+ }
69
+ function sceneBackground(scene) {
70
+ const color = scene.backgroundColor;
71
+ return typeof color === "string" && /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(color) ? color : void 0;
72
+ }
73
+ export {
74
+ MODEL_FORMATS,
75
+ isDrawable,
76
+ sceneBackground,
77
+ sceneModels
78
+ };
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ const FIELD_OF_VIEW = 45;
3
+ const HOME_PHI = 75 * Math.PI / 180;
4
+ const MIN_PHI = 5 * Math.PI / 180;
5
+ const MAX_PHI = Math.PI - MIN_PHI;
6
+ const MARGIN = 1.1;
7
+ const NEAREST = 0.35;
8
+ const FARTHEST = 4;
9
+ function fitDistance(radius, aspect = 1) {
10
+ const vertical = FIELD_OF_VIEW * Math.PI / 180;
11
+ const horizontal = 2 * Math.atan(Math.tan(vertical / 2) * aspect);
12
+ const narrowest = Math.min(vertical, horizontal);
13
+ return Math.max(radius, 1e-6) / Math.sin(narrowest / 2) * MARGIN;
14
+ }
15
+ function homeOrbit(bounds, aspect = 1) {
16
+ return {
17
+ theta: 0,
18
+ phi: HOME_PHI,
19
+ distance: fitDistance(bounds.radius, aspect)
20
+ };
21
+ }
22
+ function turned(orbit, dTheta, dPhi) {
23
+ return {
24
+ ...orbit,
25
+ theta: orbit.theta + dTheta,
26
+ phi: Math.min(MAX_PHI, Math.max(MIN_PHI, orbit.phi + dPhi))
27
+ };
28
+ }
29
+ function zoomed(orbit, factor, home) {
30
+ const distance = orbit.distance / factor;
31
+ return {
32
+ ...orbit,
33
+ distance: Math.min(
34
+ home.distance * FARTHEST,
35
+ Math.max(home.distance * NEAREST, distance)
36
+ )
37
+ };
38
+ }
39
+ function cameraPosition(orbit, center) {
40
+ const { theta, phi, distance } = orbit;
41
+ return [
42
+ center[0] + distance * Math.sin(phi) * Math.sin(theta),
43
+ center[1] + distance * Math.cos(phi),
44
+ center[2] + distance * Math.sin(phi) * Math.cos(theta)
45
+ ];
46
+ }
47
+ function sameOrbit(a, b) {
48
+ const close = (x, y) => Math.abs(x - y) < 1e-6;
49
+ const turn = (a.theta - b.theta) % (2 * Math.PI);
50
+ return (close(turn, 0) || close(Math.abs(turn), 2 * Math.PI)) && close(a.phi, b.phi) && close(a.distance, b.distance);
51
+ }
52
+ export {
53
+ FIELD_OF_VIEW,
54
+ cameraPosition,
55
+ fitDistance,
56
+ homeOrbit,
57
+ sameOrbit,
58
+ turned,
59
+ zoomed
60
+ };
@@ -0,0 +1,246 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useSyncExternalStore, useState, useEffect, useRef } from "react";
4
+ import { useUniqueId } from "../../ui/useUniqueId.mjs";
5
+ import { searchServiceOf } from "../../core/search-service.mjs";
6
+ import { selectSequence } from "../../core/selectors.mjs";
7
+ import { localize } from "../../core/value.mjs";
8
+ import { useCloverTranslation } from "../../i18n/useCloverTranslation.mjs";
9
+ import { join } from "../../lib/classnames.mjs";
10
+ import { useClover, useCloverSelector } from "../../react/context.mjs";
11
+ import { bringIntoView, scrollerOf } from "../../ui/bringIntoView.mjs";
12
+ import { titleTag } from "../../ui/heading.mjs";
13
+ import { useSectionOpened } from "../../ui/Sections.mjs";
14
+ import { FieldPill } from "../../ui/FieldPill.mjs";
15
+ const CHUNK = 40;
16
+ const Search = forwardRef(function Search2({
17
+ headingLevel = 3,
18
+ sticky = false,
19
+ size = "large",
20
+ as: Tag = "div",
21
+ className,
22
+ ...rest
23
+ }, ref) {
24
+ const { t, langOf } = useCloverTranslation();
25
+ const { clover, language } = useClover("Search");
26
+ const service = useCloverSelector(
27
+ (state) => {
28
+ var _a;
29
+ return ((_a = searchServiceOf(state.manifest)) == null ? void 0 : _a.id) ?? null;
30
+ }
31
+ );
32
+ const search = useCloverSelector((state) => state.search);
33
+ const canvases = useCloverSelector(
34
+ (state) => selectSequence(state.manifest).canvases
35
+ );
36
+ const selected = useCloverSelector((state) => state.annotationId);
37
+ const highlighted = useSyncExternalStore(
38
+ clover.highlight.subscribe,
39
+ clover.highlight.get,
40
+ clover.highlight.get
41
+ );
42
+ const id = useUniqueId();
43
+ const [draft, setDraft] = useState(search.query);
44
+ useEffect(() => setDraft(search.query), [search.query]);
45
+ const field = useRef(null);
46
+ const opened = useSectionOpened();
47
+ const focused = useRef(0);
48
+ const stepped = useRef(false);
49
+ const arrived = useRef(null);
50
+ useEffect(() => {
51
+ if (search.status !== "ready" || !search.set) return;
52
+ if (arrived.current === search.set) return;
53
+ arrived.current = search.set;
54
+ const first = search.hits[0];
55
+ const chosen = search.hits.some(
56
+ (hit) => selected && hit.entryIds.includes(selected)
57
+ );
58
+ if (first && !chosen) clover.selectAnnotation(first.entryIds[0]);
59
+ }, [clover, search.status, search.set, search.hits, selected]);
60
+ useEffect(() => {
61
+ var _a;
62
+ const held = (_a = field.current) == null ? void 0 : _a.closest(
63
+ ".clover-content-search-field"
64
+ );
65
+ const part = held == null ? void 0 : held.parentElement;
66
+ if (!sticky || !held || !part || typeof ResizeObserver === "undefined")
67
+ return;
68
+ const observer = new ResizeObserver(
69
+ () => part.style.setProperty(
70
+ "--clover-content-search-field",
71
+ `${held.offsetHeight}px`
72
+ )
73
+ );
74
+ observer.observe(held);
75
+ return () => {
76
+ observer.disconnect();
77
+ part.style.removeProperty("--clover-content-search-field");
78
+ };
79
+ }, [sticky, service]);
80
+ useEffect(() => {
81
+ var _a, _b;
82
+ if (!stepped.current) return;
83
+ stepped.current = false;
84
+ const current = (_b = (_a = field.current) == null ? void 0 : _a.closest(".clover-content-search")) == null ? void 0 : _b.querySelector(
85
+ '.clover-content-search-hit[aria-current="true"]'
86
+ );
87
+ if (current) bringIntoView(current, "nearest");
88
+ }, [selected]);
89
+ const [more, setMore] = useState({
90
+ set: null,
91
+ count: CHUNK
92
+ });
93
+ const limit = more.set === search.set ? more.count : CHUNK;
94
+ const extend = () => setMore({ set: search.set, count: limit + CHUNK });
95
+ const end = useRef(null);
96
+ const position = selected ? search.hits.findIndex((hit) => hit.entryIds.includes(selected)) : -1;
97
+ const lazy = typeof IntersectionObserver !== "undefined";
98
+ const shown = lazy ? Math.min(search.hits.length, Math.max(limit, position + 1)) : search.hits.length;
99
+ const extendRef = useRef(extend);
100
+ extendRef.current = extend;
101
+ useEffect(() => {
102
+ const node = end.current;
103
+ if (!node || !lazy || shown >= search.hits.length) return;
104
+ const observer = new IntersectionObserver(
105
+ (entries) => {
106
+ if (entries.some((entry) => entry.isIntersecting)) extendRef.current();
107
+ },
108
+ { root: scrollerOf(node), rootMargin: "0px 0px 400px 0px" }
109
+ );
110
+ observer.observe(node);
111
+ return () => observer.disconnect();
112
+ }, [lazy, shown, search.hits.length]);
113
+ useEffect(() => {
114
+ if (!opened || opened === focused.current || !field.current) return;
115
+ focused.current = opened;
116
+ field.current.focus();
117
+ }, [opened, service]);
118
+ if (!service) return null;
119
+ const steps = {
120
+ position,
121
+ total: search.hits.length,
122
+ step: (by) => {
123
+ const to = search.hits[steps.position + by];
124
+ if (!to) return;
125
+ stepped.current = true;
126
+ clover.selectAnnotation(to.entryIds[0]);
127
+ }
128
+ };
129
+ const groups = [];
130
+ search.hits.slice(0, shown).forEach((hit, index) => {
131
+ const last = groups[groups.length - 1];
132
+ if ((last == null ? void 0 : last.canvasId) === hit.canvasId) last.hits.push({ hit, index });
133
+ else groups.push({ canvasId: hit.canvasId, hits: [{ hit, index }] });
134
+ });
135
+ const Heading = titleTag(headingLevel);
136
+ const count = search.hits.length;
137
+ const statusKey = search.status === "loading" ? "contentSearchLoading" : search.status === "error" ? "contentSearchError" : search.status === "ready" ? count === 0 ? "contentSearchResultsNone" : count === 1 ? "contentSearchResult" : "contentSearchResults" : null;
138
+ const status = statusKey ? t(statusKey, { count }) : "";
139
+ const results = search.status === "ready" ? steps : null;
140
+ const bar = /* @__PURE__ */ jsx(
141
+ "p",
142
+ {
143
+ className: "clover-content-search-status",
144
+ role: "status",
145
+ "data-status": search.status,
146
+ lang: statusKey ? langOf(statusKey) : void 0,
147
+ children: status
148
+ }
149
+ );
150
+ return /* @__PURE__ */ jsxs(
151
+ Tag,
152
+ {
153
+ ref,
154
+ className: join("clover-content-search", className),
155
+ "data-status": search.status,
156
+ "data-sticky": sticky || void 0,
157
+ ...rest,
158
+ children: [
159
+ /* @__PURE__ */ jsx("div", { className: "clover-content-search-field", children: /* @__PURE__ */ jsx(
160
+ FieldPill,
161
+ {
162
+ ref: field,
163
+ id: `${id}-query`,
164
+ value: draft,
165
+ onChange: (value) => {
166
+ setDraft(value);
167
+ if (!value && search.query) void clover.search("");
168
+ },
169
+ onSubmit: () => void clover.search(draft),
170
+ onClear: () => {
171
+ var _a;
172
+ setDraft("");
173
+ if (search.query) void clover.search("");
174
+ (_a = field.current) == null ? void 0 : _a.focus();
175
+ },
176
+ results,
177
+ size,
178
+ classes: {
179
+ form: "clover-content-search-form",
180
+ query: "clover-content-search-query",
181
+ clear: "clover-content-search-clear",
182
+ submit: "clover-content-search-submit"
183
+ }
184
+ }
185
+ ) }),
186
+ bar,
187
+ groups.map(({ canvasId, hits }, index) => {
188
+ const canvas = canvases.find((item) => item.id === canvasId);
189
+ const label = localize(canvas == null ? void 0 : canvas.label, language);
190
+ return /* @__PURE__ */ jsxs(
191
+ "section",
192
+ {
193
+ className: "clover-content-search-group",
194
+ "aria-labelledby": `${id}-${index}`,
195
+ children: [
196
+ /* @__PURE__ */ jsx(
197
+ Heading,
198
+ {
199
+ id: `${id}-${index}`,
200
+ className: "clover-content-search-canvas",
201
+ lang: label.text ? label.lang : void 0,
202
+ children: label.text || canvasId
203
+ }
204
+ ),
205
+ /* @__PURE__ */ jsx("ol", { className: "clover-content-search-hits", children: hits.map(({ hit, index: place }) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
206
+ "button",
207
+ {
208
+ type: "button",
209
+ className: "clover-content-search-hit",
210
+ "aria-current": selected && hit.entryIds.includes(selected) ? "true" : void 0,
211
+ "data-highlighted": hit.entryIds.includes(highlighted ?? ""),
212
+ onClick: () => clover.selectAnnotation(hit.entryIds[0]),
213
+ onPointerEnter: () => clover.highlight.emit(hit.entryIds[0]),
214
+ onPointerLeave: () => clover.highlight.emit(null),
215
+ onFocus: () => {
216
+ clover.highlight.emit(hit.entryIds[0]);
217
+ if (shown < count && place >= shown - 5) extend();
218
+ },
219
+ onBlur: () => clover.highlight.emit(null),
220
+ children: [
221
+ hit.before,
222
+ /* @__PURE__ */ jsx("mark", { children: hit.match }),
223
+ hit.after
224
+ ]
225
+ }
226
+ ) }, hit.id)) })
227
+ ]
228
+ },
229
+ `${canvasId}-${index}`
230
+ );
231
+ }),
232
+ shown < count && /* @__PURE__ */ jsx(
233
+ "div",
234
+ {
235
+ ref: end,
236
+ className: "clover-content-search-more",
237
+ "aria-hidden": "true"
238
+ }
239
+ )
240
+ ]
241
+ }
242
+ );
243
+ });
244
+ export {
245
+ Search
246
+ };