@docmentis/udoc-viewer 0.1.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 (434) hide show
  1. package/README.md +180 -0
  2. package/dist/UDocClient.d.ts +197 -0
  3. package/dist/UDocClient.d.ts.map +1 -0
  4. package/dist/UDocClient.js +170 -0
  5. package/dist/UDocClient.js.map +1 -0
  6. package/dist/UDocViewer.d.ts +196 -0
  7. package/dist/UDocViewer.d.ts.map +1 -0
  8. package/dist/UDocViewer.js +427 -0
  9. package/dist/UDocViewer.js.map +1 -0
  10. package/dist/WorkerClient.d.ts +36 -0
  11. package/dist/WorkerClient.d.ts.map +1 -0
  12. package/dist/WorkerClient.js +121 -0
  13. package/dist/WorkerClient.js.map +1 -0
  14. package/dist/annotation/AnnotationLayer.d.ts +166 -0
  15. package/dist/annotation/AnnotationLayer.d.ts.map +1 -0
  16. package/dist/annotation/AnnotationLayer.js +1090 -0
  17. package/dist/annotation/AnnotationLayer.js.map +1 -0
  18. package/dist/annotation/index.d.ts +6 -0
  19. package/dist/annotation/index.d.ts.map +1 -0
  20. package/dist/annotation/index.js +6 -0
  21. package/dist/annotation/index.js.map +1 -0
  22. package/dist/components/FloatingBar.d.ts +102 -0
  23. package/dist/components/FloatingBar.d.ts.map +1 -0
  24. package/dist/components/FloatingBar.js +513 -0
  25. package/dist/components/FloatingBar.js.map +1 -0
  26. package/dist/components/Header.d.ts +46 -0
  27. package/dist/components/Header.d.ts.map +1 -0
  28. package/dist/components/Header.js +93 -0
  29. package/dist/components/Header.js.map +1 -0
  30. package/dist/components/index.d.ts +6 -0
  31. package/dist/components/index.d.ts.map +1 -0
  32. package/dist/components/index.js +4 -0
  33. package/dist/components/index.js.map +1 -0
  34. package/dist/components/panels/CommentsPanel.d.ts +33 -0
  35. package/dist/components/panels/CommentsPanel.d.ts.map +1 -0
  36. package/dist/components/panels/CommentsPanel.js +176 -0
  37. package/dist/components/panels/CommentsPanel.js.map +1 -0
  38. package/dist/components/panels/OutlinePanel.d.ts +30 -0
  39. package/dist/components/panels/OutlinePanel.d.ts.map +1 -0
  40. package/dist/components/panels/OutlinePanel.js +144 -0
  41. package/dist/components/panels/OutlinePanel.js.map +1 -0
  42. package/dist/components/panels/ThumbnailsPanel.d.ts +51 -0
  43. package/dist/components/panels/ThumbnailsPanel.d.ts.map +1 -0
  44. package/dist/components/panels/ThumbnailsPanel.js +160 -0
  45. package/dist/components/panels/ThumbnailsPanel.js.map +1 -0
  46. package/dist/components/panels/index.d.ts +7 -0
  47. package/dist/components/panels/index.d.ts.map +1 -0
  48. package/dist/components/panels/index.js +4 -0
  49. package/dist/components/panels/index.js.map +1 -0
  50. package/dist/constants.d.ts +25 -0
  51. package/dist/constants.d.ts.map +1 -0
  52. package/dist/constants.js +46 -0
  53. package/dist/constants.js.map +1 -0
  54. package/dist/core/NavigationController.d.ts +54 -0
  55. package/dist/core/NavigationController.d.ts.map +1 -0
  56. package/dist/core/NavigationController.js +145 -0
  57. package/dist/core/NavigationController.js.map +1 -0
  58. package/dist/core/PerfTimer.d.ts +12 -0
  59. package/dist/core/PerfTimer.d.ts.map +1 -0
  60. package/dist/core/PerfTimer.js +32 -0
  61. package/dist/core/PerfTimer.js.map +1 -0
  62. package/dist/core/ViewerState.d.ts +108 -0
  63. package/dist/core/ViewerState.d.ts.map +1 -0
  64. package/dist/core/ViewerState.js +179 -0
  65. package/dist/core/ViewerState.js.map +1 -0
  66. package/dist/core/constants.d.ts +24 -0
  67. package/dist/core/constants.d.ts.map +1 -0
  68. package/dist/core/constants.js +42 -0
  69. package/dist/core/constants.js.map +1 -0
  70. package/dist/core/index.d.ts +8 -0
  71. package/dist/core/index.d.ts.map +1 -0
  72. package/dist/core/index.js +11 -0
  73. package/dist/core/index.js.map +1 -0
  74. package/dist/core/types.d.ts +573 -0
  75. package/dist/core/types.d.ts.map +1 -0
  76. package/dist/core/types.js +5 -0
  77. package/dist/core/types.js.map +1 -0
  78. package/dist/icons/icons.d.ts +41 -0
  79. package/dist/icons/icons.d.ts.map +1 -0
  80. package/dist/icons/icons.js +51 -0
  81. package/dist/icons/icons.js.map +1 -0
  82. package/dist/icons/index.d.ts +3 -0
  83. package/dist/icons/index.d.ts.map +1 -0
  84. package/dist/icons/index.js +2 -0
  85. package/dist/icons/index.js.map +1 -0
  86. package/dist/index.d.ts +7 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +6 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/layout/BandManager.d.ts +87 -0
  91. package/dist/layout/BandManager.d.ts.map +1 -0
  92. package/dist/layout/BandManager.js +185 -0
  93. package/dist/layout/BandManager.js.map +1 -0
  94. package/dist/layout/LayoutCalculator.d.ts +42 -0
  95. package/dist/layout/LayoutCalculator.d.ts.map +1 -0
  96. package/dist/layout/LayoutCalculator.js +180 -0
  97. package/dist/layout/LayoutCalculator.js.map +1 -0
  98. package/dist/layout/LayoutState.d.ts +46 -0
  99. package/dist/layout/LayoutState.d.ts.map +1 -0
  100. package/dist/layout/LayoutState.js +109 -0
  101. package/dist/layout/LayoutState.js.map +1 -0
  102. package/dist/layout/TransitionCoordinator.d.ts +11 -0
  103. package/dist/layout/TransitionCoordinator.d.ts.map +1 -0
  104. package/dist/layout/TransitionCoordinator.js +22 -0
  105. package/dist/layout/TransitionCoordinator.js.map +1 -0
  106. package/dist/layout/index.d.ts +7 -0
  107. package/dist/layout/index.d.ts.map +1 -0
  108. package/dist/layout/index.js +4 -0
  109. package/dist/layout/index.js.map +1 -0
  110. package/dist/rendering/BandManager.d.ts +87 -0
  111. package/dist/rendering/BandManager.d.ts.map +1 -0
  112. package/dist/rendering/BandManager.js +185 -0
  113. package/dist/rendering/BandManager.js.map +1 -0
  114. package/dist/rendering/PageCache.d.ts +75 -0
  115. package/dist/rendering/PageCache.d.ts.map +1 -0
  116. package/dist/rendering/PageCache.js +122 -0
  117. package/dist/rendering/PageCache.js.map +1 -0
  118. package/dist/rendering/RenderQueue.d.ts +75 -0
  119. package/dist/rendering/RenderQueue.d.ts.map +1 -0
  120. package/dist/rendering/RenderQueue.js +105 -0
  121. package/dist/rendering/RenderQueue.js.map +1 -0
  122. package/dist/rendering/ThumbnailQueue.d.ts +57 -0
  123. package/dist/rendering/ThumbnailQueue.d.ts.map +1 -0
  124. package/dist/rendering/ThumbnailQueue.js +85 -0
  125. package/dist/rendering/ThumbnailQueue.js.map +1 -0
  126. package/dist/rendering/index.d.ts +13 -0
  127. package/dist/rendering/index.d.ts.map +1 -0
  128. package/dist/rendering/index.js +10 -0
  129. package/dist/rendering/index.js.map +1 -0
  130. package/dist/rendering/types.d.ts +72 -0
  131. package/dist/rendering/types.d.ts.map +1 -0
  132. package/dist/rendering/types.js +5 -0
  133. package/dist/rendering/types.js.map +1 -0
  134. package/dist/styles/index.d.ts +6 -0
  135. package/dist/styles/index.d.ts.map +1 -0
  136. package/dist/styles/index.js +1221 -0
  137. package/dist/styles/index.js.map +1 -0
  138. package/dist/types.d.ts +6 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +6 -0
  141. package/dist/types.js.map +1 -0
  142. package/dist/ui/Component.d.ts +127 -0
  143. package/dist/ui/Component.d.ts.map +1 -0
  144. package/dist/ui/Component.js +201 -0
  145. package/dist/ui/Component.js.map +1 -0
  146. package/dist/ui/annotation/AnnotationLayer.d.ts +90 -0
  147. package/dist/ui/annotation/AnnotationLayer.d.ts.map +1 -0
  148. package/dist/ui/annotation/AnnotationLayer.js +322 -0
  149. package/dist/ui/annotation/AnnotationLayer.js.map +1 -0
  150. package/dist/ui/annotation/LinkRenderer.d.ts +32 -0
  151. package/dist/ui/annotation/LinkRenderer.d.ts.map +1 -0
  152. package/dist/ui/annotation/LinkRenderer.js +74 -0
  153. package/dist/ui/annotation/LinkRenderer.js.map +1 -0
  154. package/dist/ui/annotation/MarkupRenderer.d.ts +40 -0
  155. package/dist/ui/annotation/MarkupRenderer.d.ts.map +1 -0
  156. package/dist/ui/annotation/MarkupRenderer.js +154 -0
  157. package/dist/ui/annotation/MarkupRenderer.js.map +1 -0
  158. package/dist/ui/annotation/ShapeRenderer.d.ts +46 -0
  159. package/dist/ui/annotation/ShapeRenderer.d.ts.map +1 -0
  160. package/dist/ui/annotation/ShapeRenderer.js +376 -0
  161. package/dist/ui/annotation/ShapeRenderer.js.map +1 -0
  162. package/dist/ui/annotation/TextRenderer.d.ts +36 -0
  163. package/dist/ui/annotation/TextRenderer.d.ts.map +1 -0
  164. package/dist/ui/annotation/TextRenderer.js +199 -0
  165. package/dist/ui/annotation/TextRenderer.js.map +1 -0
  166. package/dist/ui/annotation/index.d.ts +17 -0
  167. package/dist/ui/annotation/index.d.ts.map +1 -0
  168. package/dist/ui/annotation/index.js +13 -0
  169. package/dist/ui/annotation/index.js.map +1 -0
  170. package/dist/ui/annotation/utils.d.ts +40 -0
  171. package/dist/ui/annotation/utils.d.ts.map +1 -0
  172. package/dist/ui/annotation/utils.js +62 -0
  173. package/dist/ui/annotation/utils.js.map +1 -0
  174. package/dist/ui/components/CommentsContent.d.ts +35 -0
  175. package/dist/ui/components/CommentsContent.d.ts.map +1 -0
  176. package/dist/ui/components/CommentsContent.js +203 -0
  177. package/dist/ui/components/CommentsContent.js.map +1 -0
  178. package/dist/ui/components/FloatingBar.d.ts +55 -0
  179. package/dist/ui/components/FloatingBar.d.ts.map +1 -0
  180. package/dist/ui/components/FloatingBar.js +585 -0
  181. package/dist/ui/components/FloatingBar.js.map +1 -0
  182. package/dist/ui/components/Header.d.ts +29 -0
  183. package/dist/ui/components/Header.d.ts.map +1 -0
  184. package/dist/ui/components/Header.js +127 -0
  185. package/dist/ui/components/Header.js.map +1 -0
  186. package/dist/ui/components/LeftPanel.d.ts +54 -0
  187. package/dist/ui/components/LeftPanel.d.ts.map +1 -0
  188. package/dist/ui/components/LeftPanel.js +202 -0
  189. package/dist/ui/components/LeftPanel.js.map +1 -0
  190. package/dist/ui/components/OutlineContent.d.ts +34 -0
  191. package/dist/ui/components/OutlineContent.d.ts.map +1 -0
  192. package/dist/ui/components/OutlineContent.js +147 -0
  193. package/dist/ui/components/OutlineContent.js.map +1 -0
  194. package/dist/ui/components/RightPanel.d.ts +52 -0
  195. package/dist/ui/components/RightPanel.d.ts.map +1 -0
  196. package/dist/ui/components/RightPanel.js +142 -0
  197. package/dist/ui/components/RightPanel.js.map +1 -0
  198. package/dist/ui/components/Viewport.d.ts +70 -0
  199. package/dist/ui/components/Viewport.d.ts.map +1 -0
  200. package/dist/ui/components/Viewport.js +173 -0
  201. package/dist/ui/components/Viewport.js.map +1 -0
  202. package/dist/ui/components/index.d.ts +11 -0
  203. package/dist/ui/components/index.d.ts.map +1 -0
  204. package/dist/ui/components/index.js +10 -0
  205. package/dist/ui/components/index.js.map +1 -0
  206. package/dist/ui/framework/component.d.ts +68 -0
  207. package/dist/ui/framework/component.d.ts.map +1 -0
  208. package/dist/ui/framework/component.js +87 -0
  209. package/dist/ui/framework/component.js.map +1 -0
  210. package/dist/ui/framework/dom.d.ts +19 -0
  211. package/dist/ui/framework/dom.d.ts.map +1 -0
  212. package/dist/ui/framework/dom.js +29 -0
  213. package/dist/ui/framework/dom.js.map +1 -0
  214. package/dist/ui/framework/events.d.ts +18 -0
  215. package/dist/ui/framework/events.d.ts.map +1 -0
  216. package/dist/ui/framework/events.js +23 -0
  217. package/dist/ui/framework/events.js.map +1 -0
  218. package/dist/ui/framework/index.d.ts +15 -0
  219. package/dist/ui/framework/index.d.ts.map +1 -0
  220. package/dist/ui/framework/index.js +15 -0
  221. package/dist/ui/framework/index.js.map +1 -0
  222. package/dist/ui/framework/selectors.d.ts +51 -0
  223. package/dist/ui/framework/selectors.d.ts.map +1 -0
  224. package/dist/ui/framework/selectors.js +30 -0
  225. package/dist/ui/framework/selectors.js.map +1 -0
  226. package/dist/ui/framework/store.d.ts +37 -0
  227. package/dist/ui/framework/store.d.ts.map +1 -0
  228. package/dist/ui/framework/store.js +54 -0
  229. package/dist/ui/framework/store.js.map +1 -0
  230. package/dist/ui/icons/icons.d.ts +43 -0
  231. package/dist/ui/icons/icons.d.ts.map +1 -0
  232. package/dist/ui/icons/icons.js +46 -0
  233. package/dist/ui/icons/icons.js.map +1 -0
  234. package/dist/ui/icons/index.d.ts +11 -0
  235. package/dist/ui/icons/index.d.ts.map +1 -0
  236. package/dist/ui/icons/index.js +18 -0
  237. package/dist/ui/icons/index.js.map +1 -0
  238. package/dist/ui/index.d.ts +7 -0
  239. package/dist/ui/index.d.ts.map +1 -0
  240. package/dist/ui/index.js +9 -0
  241. package/dist/ui/index.js.map +1 -0
  242. package/dist/ui/styles/base.css.d.ts +5 -0
  243. package/dist/ui/styles/base.css.d.ts.map +1 -0
  244. package/dist/ui/styles/base.css.js +49 -0
  245. package/dist/ui/styles/base.css.js.map +1 -0
  246. package/dist/ui/styles/floating-bar.css.d.ts +5 -0
  247. package/dist/ui/styles/floating-bar.css.d.ts.map +1 -0
  248. package/dist/ui/styles/floating-bar.css.js +417 -0
  249. package/dist/ui/styles/floating-bar.css.js.map +1 -0
  250. package/dist/ui/styles/header.css.d.ts +5 -0
  251. package/dist/ui/styles/header.css.d.ts.map +1 -0
  252. package/dist/ui/styles/header.css.js +49 -0
  253. package/dist/ui/styles/header.css.js.map +1 -0
  254. package/dist/ui/styles/index.d.ts +21 -0
  255. package/dist/ui/styles/index.d.ts.map +1 -0
  256. package/dist/ui/styles/index.js +48 -0
  257. package/dist/ui/styles/index.js.map +1 -0
  258. package/dist/ui/styles/panels.css.d.ts +5 -0
  259. package/dist/ui/styles/panels.css.d.ts.map +1 -0
  260. package/dist/ui/styles/panels.css.js +446 -0
  261. package/dist/ui/styles/panels.css.js.map +1 -0
  262. package/dist/ui/styles/responsive.css.d.ts +5 -0
  263. package/dist/ui/styles/responsive.css.d.ts.map +1 -0
  264. package/dist/ui/styles/responsive.css.js +201 -0
  265. package/dist/ui/styles/responsive.css.js.map +1 -0
  266. package/dist/ui/styles/variables.css.d.ts +6 -0
  267. package/dist/ui/styles/variables.css.d.ts.map +1 -0
  268. package/dist/ui/styles/variables.css.js +75 -0
  269. package/dist/ui/styles/variables.css.js.map +1 -0
  270. package/dist/ui/styles/viewport.css.d.ts +5 -0
  271. package/dist/ui/styles/viewport.css.d.ts.map +1 -0
  272. package/dist/ui/styles/viewport.css.js +87 -0
  273. package/dist/ui/styles/viewport.css.js.map +1 -0
  274. package/dist/ui/viewer/actions.d.ts +103 -0
  275. package/dist/ui/viewer/actions.d.ts.map +1 -0
  276. package/dist/ui/viewer/actions.js +2 -0
  277. package/dist/ui/viewer/actions.js.map +1 -0
  278. package/dist/ui/viewer/annotation/LinkRenderer.d.ts +9 -0
  279. package/dist/ui/viewer/annotation/LinkRenderer.d.ts.map +1 -0
  280. package/dist/ui/viewer/annotation/LinkRenderer.js +17 -0
  281. package/dist/ui/viewer/annotation/LinkRenderer.js.map +1 -0
  282. package/dist/ui/viewer/annotation/MarkupRenderer.d.ts +21 -0
  283. package/dist/ui/viewer/annotation/MarkupRenderer.d.ts.map +1 -0
  284. package/dist/ui/viewer/annotation/MarkupRenderer.js +138 -0
  285. package/dist/ui/viewer/annotation/MarkupRenderer.js.map +1 -0
  286. package/dist/ui/viewer/annotation/ShapeRenderer.d.ts +33 -0
  287. package/dist/ui/viewer/annotation/ShapeRenderer.d.ts.map +1 -0
  288. package/dist/ui/viewer/annotation/ShapeRenderer.js +378 -0
  289. package/dist/ui/viewer/annotation/ShapeRenderer.js.map +1 -0
  290. package/dist/ui/viewer/annotation/TextRenderer.d.ts +23 -0
  291. package/dist/ui/viewer/annotation/TextRenderer.d.ts.map +1 -0
  292. package/dist/ui/viewer/annotation/TextRenderer.js +196 -0
  293. package/dist/ui/viewer/annotation/TextRenderer.js.map +1 -0
  294. package/dist/ui/viewer/annotation/index.d.ts +8 -0
  295. package/dist/ui/viewer/annotation/index.d.ts.map +1 -0
  296. package/dist/ui/viewer/annotation/index.js +8 -0
  297. package/dist/ui/viewer/annotation/index.js.map +1 -0
  298. package/dist/ui/viewer/annotation/render.d.ts +24 -0
  299. package/dist/ui/viewer/annotation/render.d.ts.map +1 -0
  300. package/dist/ui/viewer/annotation/render.js +184 -0
  301. package/dist/ui/viewer/annotation/render.js.map +1 -0
  302. package/dist/ui/viewer/annotation/types.d.ts +239 -0
  303. package/dist/ui/viewer/annotation/types.d.ts.map +1 -0
  304. package/dist/ui/viewer/annotation/types.js +7 -0
  305. package/dist/ui/viewer/annotation/types.js.map +1 -0
  306. package/dist/ui/viewer/annotation/utils.d.ts +37 -0
  307. package/dist/ui/viewer/annotation/utils.d.ts.map +1 -0
  308. package/dist/ui/viewer/annotation/utils.js +82 -0
  309. package/dist/ui/viewer/annotation/utils.js.map +1 -0
  310. package/dist/ui/viewer/components/AnnotationPanel.d.ts +19 -0
  311. package/dist/ui/viewer/components/AnnotationPanel.d.ts.map +1 -0
  312. package/dist/ui/viewer/components/AnnotationPanel.js +284 -0
  313. package/dist/ui/viewer/components/AnnotationPanel.js.map +1 -0
  314. package/dist/ui/viewer/components/FloatingToolbar.d.ts +9 -0
  315. package/dist/ui/viewer/components/FloatingToolbar.d.ts.map +1 -0
  316. package/dist/ui/viewer/components/FloatingToolbar.js +305 -0
  317. package/dist/ui/viewer/components/FloatingToolbar.js.map +1 -0
  318. package/dist/ui/viewer/components/LeftPanel.d.ts +10 -0
  319. package/dist/ui/viewer/components/LeftPanel.d.ts.map +1 -0
  320. package/dist/ui/viewer/components/LeftPanel.js +165 -0
  321. package/dist/ui/viewer/components/LeftPanel.js.map +1 -0
  322. package/dist/ui/viewer/components/OutlinePanel.d.ts +10 -0
  323. package/dist/ui/viewer/components/OutlinePanel.d.ts.map +1 -0
  324. package/dist/ui/viewer/components/OutlinePanel.js +169 -0
  325. package/dist/ui/viewer/components/OutlinePanel.js.map +1 -0
  326. package/dist/ui/viewer/components/RightPanel.d.ts +9 -0
  327. package/dist/ui/viewer/components/RightPanel.d.ts.map +1 -0
  328. package/dist/ui/viewer/components/RightPanel.js +102 -0
  329. package/dist/ui/viewer/components/RightPanel.js.map +1 -0
  330. package/dist/ui/viewer/components/Spread.d.ts +41 -0
  331. package/dist/ui/viewer/components/Spread.d.ts.map +1 -0
  332. package/dist/ui/viewer/components/Spread.js +278 -0
  333. package/dist/ui/viewer/components/Spread.js.map +1 -0
  334. package/dist/ui/viewer/components/ThumbnailPanel.d.ts +11 -0
  335. package/dist/ui/viewer/components/ThumbnailPanel.d.ts.map +1 -0
  336. package/dist/ui/viewer/components/ThumbnailPanel.js +206 -0
  337. package/dist/ui/viewer/components/ThumbnailPanel.js.map +1 -0
  338. package/dist/ui/viewer/components/Toolbar.d.ts +9 -0
  339. package/dist/ui/viewer/components/Toolbar.d.ts.map +1 -0
  340. package/dist/ui/viewer/components/Toolbar.js +93 -0
  341. package/dist/ui/viewer/components/Toolbar.js.map +1 -0
  342. package/dist/ui/viewer/components/ViewModeMenu.d.ts +9 -0
  343. package/dist/ui/viewer/components/ViewModeMenu.d.ts.map +1 -0
  344. package/dist/ui/viewer/components/ViewModeMenu.js +169 -0
  345. package/dist/ui/viewer/components/ViewModeMenu.js.map +1 -0
  346. package/dist/ui/viewer/components/Viewport.d.ts +10 -0
  347. package/dist/ui/viewer/components/Viewport.d.ts.map +1 -0
  348. package/dist/ui/viewer/components/Viewport.js +793 -0
  349. package/dist/ui/viewer/components/Viewport.js.map +1 -0
  350. package/dist/ui/viewer/effects.d.ts +9 -0
  351. package/dist/ui/viewer/effects.d.ts.map +1 -0
  352. package/dist/ui/viewer/effects.js +179 -0
  353. package/dist/ui/viewer/effects.js.map +1 -0
  354. package/dist/ui/viewer/icons.d.ts +32 -0
  355. package/dist/ui/viewer/icons.d.ts.map +1 -0
  356. package/dist/ui/viewer/icons.js +44 -0
  357. package/dist/ui/viewer/icons.js.map +1 -0
  358. package/dist/ui/viewer/index.d.ts +6 -0
  359. package/dist/ui/viewer/index.d.ts.map +1 -0
  360. package/dist/ui/viewer/index.js +6 -0
  361. package/dist/ui/viewer/index.js.map +1 -0
  362. package/dist/ui/viewer/layout/index.d.ts +3 -0
  363. package/dist/ui/viewer/layout/index.d.ts.map +1 -0
  364. package/dist/ui/viewer/layout/index.js +3 -0
  365. package/dist/ui/viewer/layout/index.js.map +1 -0
  366. package/dist/ui/viewer/layout/pixelAlign.d.ts +7 -0
  367. package/dist/ui/viewer/layout/pixelAlign.d.ts.map +1 -0
  368. package/dist/ui/viewer/layout/pixelAlign.js +22 -0
  369. package/dist/ui/viewer/layout/pixelAlign.js.map +1 -0
  370. package/dist/ui/viewer/layout/spreadLayout.d.ts +93 -0
  371. package/dist/ui/viewer/layout/spreadLayout.d.ts.map +1 -0
  372. package/dist/ui/viewer/layout/spreadLayout.js +303 -0
  373. package/dist/ui/viewer/layout/spreadLayout.js.map +1 -0
  374. package/dist/ui/viewer/navigation.d.ts +80 -0
  375. package/dist/ui/viewer/navigation.d.ts.map +1 -0
  376. package/dist/ui/viewer/navigation.js +59 -0
  377. package/dist/ui/viewer/navigation.js.map +1 -0
  378. package/dist/ui/viewer/reducer.d.ts +4 -0
  379. package/dist/ui/viewer/reducer.d.ts.map +1 -0
  380. package/dist/ui/viewer/reducer.js +229 -0
  381. package/dist/ui/viewer/reducer.js.map +1 -0
  382. package/dist/ui/viewer/rendering/RenderManager.d.ts +76 -0
  383. package/dist/ui/viewer/rendering/RenderManager.d.ts.map +1 -0
  384. package/dist/ui/viewer/rendering/RenderManager.js +236 -0
  385. package/dist/ui/viewer/rendering/RenderManager.js.map +1 -0
  386. package/dist/ui/viewer/shell.d.ts +29 -0
  387. package/dist/ui/viewer/shell.d.ts.map +1 -0
  388. package/dist/ui/viewer/shell.js +70 -0
  389. package/dist/ui/viewer/shell.js.map +1 -0
  390. package/dist/ui/viewer/state.d.ts +72 -0
  391. package/dist/ui/viewer/state.d.ts.map +1 -0
  392. package/dist/ui/viewer/state.js +47 -0
  393. package/dist/ui/viewer/state.js.map +1 -0
  394. package/dist/view/LayoutCalculator.d.ts +42 -0
  395. package/dist/view/LayoutCalculator.d.ts.map +1 -0
  396. package/dist/view/LayoutCalculator.js +180 -0
  397. package/dist/view/LayoutCalculator.js.map +1 -0
  398. package/dist/view/TransitionCoordinator.d.ts +11 -0
  399. package/dist/view/TransitionCoordinator.d.ts.map +1 -0
  400. package/dist/view/TransitionCoordinator.js +22 -0
  401. package/dist/view/TransitionCoordinator.js.map +1 -0
  402. package/dist/view/ViewState.d.ts +46 -0
  403. package/dist/view/ViewState.d.ts.map +1 -0
  404. package/dist/view/ViewState.js +109 -0
  405. package/dist/view/ViewState.js.map +1 -0
  406. package/dist/view/index.d.ts +7 -0
  407. package/dist/view/index.d.ts.map +1 -0
  408. package/dist/view/index.js +4 -0
  409. package/dist/view/index.js.map +1 -0
  410. package/dist/wasm/udoc.d.ts +202 -0
  411. package/dist/wasm/udoc.js +929 -0
  412. package/dist/wasm/udoc_bg.wasm +0 -0
  413. package/dist/wasm/udoc_bg.wasm.d.ts +28 -0
  414. package/dist/worker/WorkerClient.d.ts +103 -0
  415. package/dist/worker/WorkerClient.d.ts.map +1 -0
  416. package/dist/worker/WorkerClient.js +182 -0
  417. package/dist/worker/WorkerClient.js.map +1 -0
  418. package/dist/worker/index.d.ts +4 -0
  419. package/dist/worker/index.d.ts.map +1 -0
  420. package/dist/worker/index.js +2 -0
  421. package/dist/worker/index.js.map +1 -0
  422. package/dist/worker/types.d.ts +81 -0
  423. package/dist/worker/types.d.ts.map +1 -0
  424. package/dist/worker/types.js +6 -0
  425. package/dist/worker/types.js.map +1 -0
  426. package/dist/worker/worker.d.ts +191 -0
  427. package/dist/worker/worker.d.ts.map +1 -0
  428. package/dist/worker/worker.js +127 -0
  429. package/dist/worker/worker.js.map +1 -0
  430. package/dist/worker.d.ts +2 -0
  431. package/dist/worker.d.ts.map +1 -0
  432. package/dist/worker.js +205 -0
  433. package/dist/worker.js.map +1 -0
  434. package/package.json +32 -0
@@ -0,0 +1,793 @@
1
+ import { subscribeSelector } from "../../framework/selectors";
2
+ import { getPointsToPixels } from "../state";
3
+ import { showAnnotationPopup, closeAnnotationPopup } from "../annotation";
4
+ import { calculateSpreads, calculateSpreadLayouts, findSpreadForPage, findVisibleSpreadRange, getSpreadPrimaryPage, getSpreadDimensions } from "../layout/spreadLayout";
5
+ import { createSpread } from "./Spread";
6
+ import { createFloatingToolbar } from "./FloatingToolbar";
7
+ import { on } from "../../framework/events";
8
+ import { getDevicePixelRatio, snapToDevice, toCssPixels, toDevicePixels } from "../layout";
9
+ function viewportSliceEqual(a, b) {
10
+ return (a.docId === b.docId &&
11
+ a.page === b.page &&
12
+ a.pageCount === b.pageCount &&
13
+ a.pageInfos === b.pageInfos &&
14
+ a.scrollMode === b.scrollMode &&
15
+ a.layoutMode === b.layoutMode &&
16
+ a.zoomMode === b.zoomMode &&
17
+ a.zoom === b.zoom &&
18
+ a.dpi === b.dpi &&
19
+ a.pageRotation === b.pageRotation &&
20
+ a.spacingMode === b.spacingMode &&
21
+ a.pageSpacing === b.pageSpacing &&
22
+ a.spreadSpacing === b.spreadSpacing &&
23
+ a.pageAnnotations === b.pageAnnotations &&
24
+ a.highlightedAnnotation === b.highlightedAnnotation);
25
+ }
26
+ let cachedScrollbarSize = null;
27
+ /** Number of spreads to render above/below viewport for smooth scrolling */
28
+ const RENDER_BUFFER = 2;
29
+ function parsePixel(value) {
30
+ const parsed = parseFloat(value);
31
+ return Number.isFinite(parsed) ? parsed : 0;
32
+ }
33
+ function readInsets(style) {
34
+ return {
35
+ top: parsePixel(style.paddingTop),
36
+ right: parsePixel(style.paddingRight),
37
+ bottom: parsePixel(style.paddingBottom),
38
+ left: parsePixel(style.paddingLeft)
39
+ };
40
+ }
41
+ function addInsets(a, b) {
42
+ return {
43
+ top: a.top + b.top,
44
+ right: a.right + b.right,
45
+ bottom: a.bottom + b.bottom,
46
+ left: a.left + b.left
47
+ };
48
+ }
49
+ function readViewportMetrics(scrollArea, container) {
50
+ const scrollStyle = getComputedStyle(scrollArea);
51
+ const containerStyle = getComputedStyle(container);
52
+ const padding = addInsets(readInsets(scrollStyle), readInsets(containerStyle));
53
+ const width = scrollArea.clientWidth;
54
+ const height = scrollArea.clientHeight;
55
+ const innerWidth = Math.max(0, width - padding.left - padding.right);
56
+ const innerHeight = Math.max(0, height - padding.top - padding.bottom);
57
+ return {
58
+ width,
59
+ height,
60
+ innerWidth,
61
+ innerHeight,
62
+ padding
63
+ };
64
+ }
65
+ function metricsEqual(a, b) {
66
+ // Use epsilon tolerance to prevent oscillation from 1px fluctuations
67
+ const epsilon = 1;
68
+ return (Math.abs(a.width - b.width) <= epsilon &&
69
+ Math.abs(a.height - b.height) <= epsilon &&
70
+ Math.abs(a.innerWidth - b.innerWidth) <= epsilon &&
71
+ Math.abs(a.innerHeight - b.innerHeight) <= epsilon &&
72
+ a.padding.top === b.padding.top &&
73
+ a.padding.right === b.padding.right &&
74
+ a.padding.bottom === b.padding.bottom &&
75
+ a.padding.left === b.padding.left);
76
+ }
77
+ function resolveOverflowState(prev, delta, threshold) {
78
+ if (prev === null)
79
+ return delta > threshold;
80
+ if (prev)
81
+ return delta >= -threshold;
82
+ return delta > threshold;
83
+ }
84
+ function clamp(value, min, max) {
85
+ return Math.min(max, Math.max(min, value));
86
+ }
87
+ function getCenteredOffset(containerSize, contentSize) {
88
+ const dpr = getDevicePixelRatio();
89
+ const containerDevice = toDevicePixels(containerSize, dpr);
90
+ const contentDevice = toDevicePixels(contentSize, dpr);
91
+ const offsetDevice = Math.max(0, Math.floor((containerDevice - contentDevice) / 2));
92
+ return toCssPixels(offsetDevice, dpr);
93
+ }
94
+ function getScrollbarSize() {
95
+ if (cachedScrollbarSize)
96
+ return cachedScrollbarSize;
97
+ if (!document.body) {
98
+ cachedScrollbarSize = { width: 0, height: 0 };
99
+ return cachedScrollbarSize;
100
+ }
101
+ const probe = document.createElement("div");
102
+ probe.style.width = "100px";
103
+ probe.style.height = "100px";
104
+ probe.style.overflow = "scroll";
105
+ probe.style.position = "absolute";
106
+ probe.style.top = "-9999px";
107
+ document.body.appendChild(probe);
108
+ const width = probe.offsetWidth - probe.clientWidth;
109
+ const height = probe.offsetHeight - probe.clientHeight;
110
+ probe.remove();
111
+ cachedScrollbarSize = { width, height };
112
+ return cachedScrollbarSize;
113
+ }
114
+ function computeScale(slice, metrics, spreads) {
115
+ if (slice.zoomMode === "custom")
116
+ return slice.zoom;
117
+ if (metrics.innerWidth <= 0 || metrics.innerHeight <= 0)
118
+ return slice.zoom;
119
+ if (spreads.length === 0)
120
+ return slice.zoom;
121
+ let maxWidth = 0;
122
+ let maxHeight = 0;
123
+ for (const spread of spreads) {
124
+ const dims = getSpreadDimensions(spread, slice.pageInfos, 1, slice.pageSpacing, slice.dpi, slice.pageRotation);
125
+ maxWidth = Math.max(maxWidth, dims.width);
126
+ maxHeight = Math.max(maxHeight, dims.height);
127
+ }
128
+ if (maxWidth <= 0 || maxHeight <= 0)
129
+ return slice.zoom;
130
+ // Use snapped values to match layout calculations exactly.
131
+ // Round to the nearest device pixel to avoid scrollbar feedback loops.
132
+ const snappedSpacing = snapToDevice(slice.spreadSpacing);
133
+ const snappedViewportHeight = snapToDevice(metrics.innerHeight);
134
+ const snappedViewportWidth = snapToDevice(metrics.innerWidth);
135
+ const verticalSpacing = snappedSpacing * 2;
136
+ // Add 1 pixel buffer to compensate for device pixel rounding in layout calculations.
137
+ // Without this, the spread may be slightly smaller than the viewport, allowing
138
+ // a thin line of the next page to show at the bottom in continuous scroll mode.
139
+ // The same buffer is used in spread mode for consistency when switching modes.
140
+ // Scrollbar overflow in spread mode is handled by applySingleLayout using viewport height.
141
+ const targetHeight = Math.max(0, snappedViewportHeight - verticalSpacing + 1);
142
+ const widthScale = snappedViewportWidth / maxWidth;
143
+ const heightScale = targetHeight / maxHeight;
144
+ switch (slice.zoomMode) {
145
+ case "fit-spread-width":
146
+ return widthScale;
147
+ case "fit-spread-height":
148
+ return heightScale;
149
+ case "fit-spread":
150
+ return Math.min(widthScale, heightScale);
151
+ default:
152
+ return slice.zoom;
153
+ }
154
+ }
155
+ function buildLayout(slice, metrics) {
156
+ const spreads = calculateSpreads(slice.pageCount, slice.layoutMode);
157
+ const scale = computeScale(slice, metrics, spreads);
158
+ const layout = calculateSpreadLayouts(spreads, slice.pageInfos, scale, slice.pageSpacing, slice.spreadSpacing, slice.dpi, slice.pageRotation);
159
+ return {
160
+ spreads,
161
+ layouts: layout.layouts,
162
+ contentWidth: layout.contentWidth,
163
+ contentHeight: layout.contentHeight,
164
+ scale
165
+ };
166
+ }
167
+ function computeViewportUpdate(prevSlice, nextSlice, prevMetrics, nextMetrics, lastScrollMode) {
168
+ const metricsChanged = !prevMetrics || !metricsEqual(prevMetrics, nextMetrics);
169
+ const layoutChanged = !prevSlice ||
170
+ nextSlice.docId !== prevSlice.docId ||
171
+ nextSlice.pageCount !== prevSlice.pageCount ||
172
+ nextSlice.pageInfos !== prevSlice.pageInfos ||
173
+ nextSlice.layoutMode !== prevSlice.layoutMode ||
174
+ nextSlice.zoomMode !== prevSlice.zoomMode ||
175
+ nextSlice.zoom !== prevSlice.zoom ||
176
+ nextSlice.dpi !== prevSlice.dpi ||
177
+ nextSlice.pageRotation !== prevSlice.pageRotation ||
178
+ nextSlice.pageSpacing !== prevSlice.pageSpacing ||
179
+ nextSlice.spreadSpacing !== prevSlice.spreadSpacing ||
180
+ metricsChanged;
181
+ const modeChanged = !prevSlice || nextSlice.scrollMode !== prevSlice.scrollMode;
182
+ const zoomModeChanged = !prevSlice || nextSlice.zoomMode !== prevSlice.zoomMode;
183
+ const fitZoomChanged = nextSlice.zoomMode !== "custom" && (!prevSlice || nextSlice.zoom !== prevSlice.zoom);
184
+ const spreadsChanged = !prevSlice ||
185
+ nextSlice.docId !== prevSlice.docId ||
186
+ nextSlice.pageCount !== prevSlice.pageCount ||
187
+ nextSlice.pageInfos !== prevSlice.pageInfos ||
188
+ nextSlice.layoutMode !== prevSlice.layoutMode;
189
+ const shouldClearSpreads = layoutChanged && spreadsChanged;
190
+ const shouldCaptureAnchor = layoutChanged &&
191
+ !spreadsChanged &&
192
+ nextSlice.scrollMode === "continuous" &&
193
+ !fitZoomChanged &&
194
+ !zoomModeChanged;
195
+ const shouldCenterOnModeChange = modeChanged && lastScrollMode !== null && lastScrollMode !== "continuous";
196
+ const shouldScrollToPage = spreadsChanged || zoomModeChanged || fitZoomChanged;
197
+ const shouldResetSingleScroll = (modeChanged && lastScrollMode === "continuous") ||
198
+ spreadsChanged ||
199
+ (layoutChanged && nextSlice.zoomMode !== "custom");
200
+ return {
201
+ layoutChanged,
202
+ shouldClearSpreads,
203
+ shouldCaptureAnchor,
204
+ shouldCenterOnModeChange,
205
+ shouldScrollToPage,
206
+ shouldResetSingleScroll
207
+ };
208
+ }
209
+ export function createViewport() {
210
+ const el = document.createElement("div");
211
+ el.className = "udoc-viewport";
212
+ const scrollArea = document.createElement("div");
213
+ scrollArea.className = "udoc-viewport__scroll";
214
+ el.appendChild(scrollArea);
215
+ const container = document.createElement("div");
216
+ container.className = "udoc-viewport__container";
217
+ scrollArea.appendChild(container);
218
+ const floatingToolbar = createFloatingToolbar();
219
+ let renderManager = null;
220
+ let storeRef = null;
221
+ let unsubRender = null;
222
+ let unsubScroll = null;
223
+ let unsubNavigation = null;
224
+ let resizeObserver = null;
225
+ let currentSlice = null;
226
+ let lastSlice = null;
227
+ let lastMetrics = null;
228
+ let layoutState = null;
229
+ let spreadComponents = new Map();
230
+ let layoutDirty = false;
231
+ let lastVisibleRange = { start: 0, end: -1 };
232
+ let containerSize = { width: 0, height: 0 };
233
+ let lastScrollMode = null;
234
+ let lastOverflowX = null;
235
+ let lastOverflowY = null;
236
+ let updateRaf = 0;
237
+ let scrollRaf = 0;
238
+ const unsubEvents = [];
239
+ function mount(parent, store, rm) {
240
+ parent.appendChild(el);
241
+ renderManager = rm;
242
+ storeRef = store;
243
+ floatingToolbar.mount(el, store);
244
+ currentSlice = selectViewport(store.getState());
245
+ scheduleUpdate();
246
+ unsubRender = subscribeSelector(store, selectViewport, (slice) => {
247
+ currentSlice = slice;
248
+ scheduleUpdate();
249
+ }, {
250
+ equality: viewportSliceEqual
251
+ });
252
+ unsubScroll = on(scrollArea, "scroll", () => {
253
+ if (!currentSlice || currentSlice.scrollMode !== "continuous")
254
+ return;
255
+ if (scrollRaf)
256
+ return;
257
+ scrollRaf = requestAnimationFrame(() => {
258
+ scrollRaf = 0;
259
+ if (!currentSlice || !layoutState || !lastMetrics)
260
+ return;
261
+ updateVisibleSpreads(currentSlice, lastMetrics, layoutState);
262
+ });
263
+ });
264
+ if (typeof ResizeObserver !== "undefined") {
265
+ resizeObserver = new ResizeObserver(() => scheduleUpdate());
266
+ resizeObserver.observe(scrollArea);
267
+ }
268
+ const handleResize = () => scheduleUpdate();
269
+ window.addEventListener("resize", handleResize);
270
+ unsubEvents.push(() => window.removeEventListener("resize", handleResize));
271
+ // Handle annotation clicks (links and sticky notes)
272
+ const handleAnnotationClick = (e) => {
273
+ const target = e.target;
274
+ // Handle sticky note (text) annotation - show popup
275
+ const textEl = target.closest(".udoc-annotation--text");
276
+ if (textEl) {
277
+ e.stopPropagation();
278
+ const annotationData = textEl.dataset.annotation;
279
+ if (annotationData) {
280
+ try {
281
+ const annotation = JSON.parse(annotationData);
282
+ showAnnotationPopup(annotation, textEl, container);
283
+ }
284
+ catch {
285
+ // Ignore parse errors
286
+ }
287
+ }
288
+ return;
289
+ }
290
+ // Handle link annotation - navigate
291
+ const linkEl = target.closest(".udoc-annotation--link");
292
+ if (linkEl) {
293
+ const actionData = linkEl.getAttribute("data-action");
294
+ if (!actionData)
295
+ return;
296
+ try {
297
+ const action = JSON.parse(actionData);
298
+ if (action.actionType === "goTo" && action.destination) {
299
+ store.dispatch({ type: "NAVIGATE_TO_DESTINATION", destination: action.destination });
300
+ }
301
+ else if (action.actionType === "uri" && action.uri) {
302
+ window.open(action.uri, "_blank", "noopener");
303
+ }
304
+ }
305
+ catch {
306
+ // Ignore parse errors
307
+ }
308
+ return;
309
+ }
310
+ // Click elsewhere closes any open popup
311
+ closeAnnotationPopup();
312
+ };
313
+ container.addEventListener("click", handleAnnotationClick);
314
+ unsubEvents.push(() => container.removeEventListener("click", handleAnnotationClick));
315
+ // Handle mouse wheel for page flip in spread mode
316
+ let wheelCooldown = false;
317
+ const handleWheel = (e) => {
318
+ if (!currentSlice || currentSlice.scrollMode !== "spread")
319
+ return;
320
+ if (!layoutState || layoutState.spreads.length === 0)
321
+ return;
322
+ // Prevent default scroll in spread mode
323
+ e.preventDefault();
324
+ // Debounce rapid wheel events
325
+ if (wheelCooldown)
326
+ return;
327
+ wheelCooldown = true;
328
+ setTimeout(() => { wheelCooldown = false; }, 150);
329
+ const currentSpreadIndex = findSpreadForPage(layoutState.spreads, currentSlice.page);
330
+ if (e.deltaY > 0) {
331
+ // Scroll down - next spread
332
+ const nextSpreadIndex = Math.min(currentSpreadIndex + 1, layoutState.spreads.length - 1);
333
+ if (nextSpreadIndex !== currentSpreadIndex) {
334
+ const nextPage = getSpreadPrimaryPage(layoutState.spreads[nextSpreadIndex]);
335
+ store.dispatch({ type: "SET_PAGE", page: nextPage });
336
+ }
337
+ }
338
+ else if (e.deltaY < 0) {
339
+ // Scroll up - previous spread
340
+ const prevSpreadIndex = Math.max(currentSpreadIndex - 1, 0);
341
+ if (prevSpreadIndex !== currentSpreadIndex) {
342
+ const prevPage = getSpreadPrimaryPage(layoutState.spreads[prevSpreadIndex]);
343
+ store.dispatch({ type: "SET_PAGE", page: prevPage });
344
+ }
345
+ }
346
+ };
347
+ scrollArea.addEventListener("wheel", handleWheel, { passive: false });
348
+ unsubEvents.push(() => scrollArea.removeEventListener("wheel", handleWheel));
349
+ unsubNavigation = store.subscribeEffect((prev, next) => {
350
+ if (prev.navigationTarget === next.navigationTarget)
351
+ return;
352
+ if (next.navigationTarget === null)
353
+ return;
354
+ const target = next.navigationTarget;
355
+ // Handle zoom change if specified
356
+ if (target.zoom !== undefined && target.zoom !== next.zoom) {
357
+ store.dispatch({ type: "SET_ZOOM", zoom: target.zoom });
358
+ }
359
+ if (next.scrollMode === "continuous") {
360
+ scrollToTarget(target);
361
+ }
362
+ else {
363
+ store.dispatch({ type: "SET_PAGE", page: target.page });
364
+ }
365
+ store.dispatch({ type: "CLEAR_NAVIGATION_TARGET" });
366
+ });
367
+ }
368
+ function scheduleUpdate() {
369
+ if (!currentSlice)
370
+ return;
371
+ if (updateRaf)
372
+ return;
373
+ updateRaf = requestAnimationFrame(() => {
374
+ updateRaf = 0;
375
+ if (!currentSlice)
376
+ return;
377
+ applyState(currentSlice);
378
+ });
379
+ }
380
+ function applyState(slice) {
381
+ scrollArea.style.paddingLeft = `${slice.pageSpacing}px`;
382
+ scrollArea.style.paddingRight = `${slice.pageSpacing}px`;
383
+ el.classList.toggle("udoc-viewport--seamless", slice.spacingMode === "none");
384
+ const metrics = readViewportMetrics(scrollArea, container);
385
+ const hasDoc = !!slice.docId && slice.pageCount > 0 && slice.pageInfos.length > 0;
386
+ if (!hasDoc || metrics.innerWidth <= 0 || metrics.innerHeight <= 0) {
387
+ clearSpreads();
388
+ container.style.height = "";
389
+ container.style.width = "";
390
+ scrollArea.style.overflowX = "hidden";
391
+ scrollArea.style.overflowY = "hidden";
392
+ layoutState = null;
393
+ lastVisibleRange = { start: 0, end: -1 };
394
+ syncEffectiveZoom(slice, null);
395
+ lastSlice = slice;
396
+ lastMetrics = metrics;
397
+ lastScrollMode = slice.scrollMode;
398
+ return;
399
+ }
400
+ const plan = computeViewportUpdate(lastSlice, slice, lastMetrics, metrics, lastScrollMode);
401
+ if (plan.shouldClearSpreads) {
402
+ clearSpreads();
403
+ lastVisibleRange = { start: 0, end: -1 };
404
+ }
405
+ const anchor = (plan.shouldCaptureAnchor && layoutState)
406
+ ? captureScrollAnchor(metrics, layoutState)
407
+ : null;
408
+ if (plan.layoutChanged || !layoutState) {
409
+ layoutState = buildLayout(slice, metrics);
410
+ layoutDirty = true;
411
+ // Only update lastMetrics when layout rebuilds, so small changes accumulate
412
+ // until they exceed the epsilon threshold (important for fit-page modes)
413
+ lastMetrics = metrics;
414
+ }
415
+ syncEffectiveZoom(slice, layoutState);
416
+ if (slice.scrollMode === "continuous") {
417
+ applyContinuousLayout(metrics, layoutState);
418
+ if (plan.shouldCenterOnModeChange) {
419
+ // When switching from single to continuous, center the page to maintain position
420
+ scrollToPage(slice.page, metrics, true);
421
+ }
422
+ else if (plan.shouldScrollToPage) {
423
+ scrollToPage(slice.page, metrics);
424
+ }
425
+ else if (anchor) {
426
+ restoreScrollAnchor(anchor, metrics);
427
+ }
428
+ updateVisibleSpreads(slice, metrics, layoutState);
429
+ }
430
+ else {
431
+ applySingleLayout(slice, metrics, layoutState);
432
+ if (plan.shouldResetSingleScroll) {
433
+ scrollArea.scrollTop = 0;
434
+ scrollArea.scrollLeft = 0;
435
+ // Reset overflow state when switching to spread mode to avoid
436
+ // hysteresis from continuous mode keeping scrollbar visible
437
+ lastOverflowX = null;
438
+ lastOverflowY = null;
439
+ }
440
+ showSingleSpread(slice, metrics, layoutState);
441
+ }
442
+ updateOverflow(slice, metrics);
443
+ lastSlice = slice;
444
+ lastScrollMode = slice.scrollMode;
445
+ }
446
+ function updateOverflow(slice, metrics) {
447
+ const epsilon = 1;
448
+ const scrollWidth = scrollArea.scrollWidth;
449
+ const scrollHeight = scrollArea.scrollHeight;
450
+ const clientWidth = scrollArea.clientWidth;
451
+ const clientHeight = scrollArea.clientHeight;
452
+ const scrollbar = getScrollbarSize();
453
+ // Apply hysteresis to avoid scrollbar-induced resize loops near 1px thresholds.
454
+ const assumeY = lastOverflowY ?? (scrollHeight - clientHeight > epsilon);
455
+ const availableWidth = clientWidth + (assumeY ? scrollbar.width : 0);
456
+ const deltaX = scrollWidth - availableWidth;
457
+ const needsX = resolveOverflowState(lastOverflowX, deltaX, epsilon);
458
+ const availableHeight = clientHeight + (needsX ? scrollbar.height : 0);
459
+ const deltaY = scrollHeight - availableHeight;
460
+ const finalNeedsY = resolveOverflowState(lastOverflowY, deltaY, epsilon);
461
+ lastOverflowX = needsX;
462
+ lastOverflowY = finalNeedsY;
463
+ scrollArea.style.overflowX = needsX ? "auto" : "hidden";
464
+ scrollArea.style.overflowY = finalNeedsY ? "auto" : "hidden";
465
+ }
466
+ function applyContinuousLayout(metrics, state) {
467
+ container.style.display = "block";
468
+ const width = snapToDevice(Math.max(metrics.innerWidth, state.contentWidth));
469
+ const height = snapToDevice(Math.max(metrics.innerHeight, state.contentHeight));
470
+ container.style.width = `${width}px`;
471
+ container.style.height = `${height}px`;
472
+ containerSize = { width, height };
473
+ }
474
+ function applySingleLayout(slice, metrics, state) {
475
+ container.style.display = "block";
476
+ const spreadIndex = findSpreadForPage(state.spreads, slice.page);
477
+ const layout = state.layouts[spreadIndex];
478
+ const spreadWidth = layout ? layout.width : 0;
479
+ const spreadHeight = layout ? layout.height : 0;
480
+ const snappedSpreadSpacing = snapToDevice(slice.spreadSpacing);
481
+ const width = snapToDevice(Math.max(metrics.innerWidth, spreadWidth));
482
+ const height = snapToDevice(Math.max(metrics.innerHeight, spreadHeight + snappedSpreadSpacing * 2));
483
+ container.style.width = `${width}px`;
484
+ container.style.height = `${height}px`;
485
+ containerSize = { width, height };
486
+ }
487
+ function syncEffectiveZoom(slice, state) {
488
+ if (!storeRef)
489
+ return;
490
+ const nextZoom = slice.zoomMode === "custom" ? null : state?.scale ?? null;
491
+ const current = storeRef.getState().effectiveZoom;
492
+ if (nextZoom === null) {
493
+ if (current === null)
494
+ return;
495
+ storeRef.dispatch({ type: "SET_EFFECTIVE_ZOOM", zoom: null });
496
+ return;
497
+ }
498
+ if (current !== null && Math.abs(nextZoom - current) < 0.001)
499
+ return;
500
+ storeRef.dispatch({ type: "SET_EFFECTIVE_ZOOM", zoom: nextZoom });
501
+ }
502
+ function captureScrollAnchor(metrics, state) {
503
+ if (state.layouts.length === 0 || state.spreads.length === 0)
504
+ return null;
505
+ const scrollTop = scrollArea.scrollTop;
506
+ const viewportCenter = scrollTop + metrics.innerHeight / 2;
507
+ const focusPage = findFocusPage(viewportCenter, state);
508
+ if (focusPage === null)
509
+ return null;
510
+ const spreadIndex = findSpreadForPage(state.spreads, focusPage);
511
+ const layout = state.layouts[spreadIndex];
512
+ if (!layout)
513
+ return null;
514
+ const spreadCenter = layout.top + layout.height / 2;
515
+ return {
516
+ page: focusPage,
517
+ offset: spreadCenter - scrollTop
518
+ };
519
+ }
520
+ function restoreScrollAnchor(anchor, metrics) {
521
+ if (!layoutState)
522
+ return;
523
+ const spreadIndex = findSpreadForPage(layoutState.spreads, anchor.page);
524
+ const layout = layoutState.layouts[spreadIndex];
525
+ if (!layout)
526
+ return;
527
+ const spreadCenter = layout.top + layout.height / 2;
528
+ const targetScrollTop = spreadCenter - anchor.offset;
529
+ const maxScrollTop = Math.max(0, containerSize.height - metrics.innerHeight);
530
+ scrollArea.scrollTop = clamp(targetScrollTop, 0, maxScrollTop);
531
+ }
532
+ function updateVisibleSpreads(slice, metrics, state) {
533
+ if (!renderManager || !slice.docId)
534
+ return;
535
+ if (state.layouts.length === 0)
536
+ return;
537
+ const scrollTop = scrollArea.scrollTop;
538
+ const visibleRange = findVisibleSpreadRange(state.layouts, scrollTop, metrics.innerHeight, RENDER_BUFFER);
539
+ const rangeChanged = visibleRange.start !== lastVisibleRange.start ||
540
+ visibleRange.end !== lastVisibleRange.end;
541
+ const layoutOptions = {
542
+ pageInfos: slice.pageInfos,
543
+ scale: state.scale,
544
+ dpi: slice.dpi,
545
+ rotation: slice.pageRotation,
546
+ pageSpacing: slice.pageSpacing
547
+ };
548
+ if (layoutDirty || rangeChanged) {
549
+ for (const [index, spread] of spreadComponents) {
550
+ if (index < visibleRange.start || index > visibleRange.end) {
551
+ spread.destroy();
552
+ spreadComponents.delete(index);
553
+ }
554
+ }
555
+ const renderOptions = {
556
+ docId: slice.docId,
557
+ scale: state.scale,
558
+ dpi: slice.dpi
559
+ };
560
+ for (let i = visibleRange.start; i <= visibleRange.end; i++) {
561
+ const layout = state.layouts[i];
562
+ if (!layout)
563
+ continue;
564
+ let spreadComp = spreadComponents.get(i);
565
+ if (!spreadComp) {
566
+ const spreadData = state.spreads[i];
567
+ spreadComp = createSpread(spreadData);
568
+ spreadComp.mount(container);
569
+ spreadComponents.set(i, spreadComp);
570
+ }
571
+ spreadComp.updateLayout(layoutOptions);
572
+ // Set spread position and dimensions from layout.
573
+ // Layout values are pre-snapped with cumulative consistency.
574
+ const spreadEl = spreadComp.getElement();
575
+ spreadEl.style.position = "absolute";
576
+ spreadEl.style.top = `${layout.top}px`;
577
+ spreadEl.style.width = `${layout.width}px`;
578
+ spreadEl.style.height = `${layout.height}px`;
579
+ spreadEl.style.left = `${getCenteredOffset(containerSize.width, layout.width)}px`;
580
+ spreadEl.style.transform = "none";
581
+ spreadComp.render(renderManager, renderOptions);
582
+ }
583
+ lastVisibleRange = visibleRange;
584
+ layoutDirty = false;
585
+ }
586
+ // Always update annotations on visible spreads (annotations may load after layout)
587
+ for (let i = visibleRange.start; i <= visibleRange.end; i++) {
588
+ const spreadComp = spreadComponents.get(i);
589
+ if (spreadComp) {
590
+ spreadComp.updateAnnotations(slice.pageAnnotations, layoutOptions, slice.highlightedAnnotation);
591
+ }
592
+ }
593
+ const viewportCenter = scrollTop + metrics.innerHeight / 2;
594
+ const focusPage = findFocusPage(viewportCenter, state);
595
+ if (focusPage !== null) {
596
+ renderManager.boost(slice.docId, focusPage);
597
+ }
598
+ updateCurrentPageFromScroll(scrollTop, metrics.innerHeight, state);
599
+ }
600
+ function showSingleSpread(slice, metrics, state) {
601
+ if (!renderManager || !slice.docId)
602
+ return;
603
+ const spreadIndex = findSpreadForPage(state.spreads, slice.page);
604
+ const layout = state.layouts[spreadIndex];
605
+ if (!layout)
606
+ return;
607
+ for (const [index, spread] of spreadComponents) {
608
+ if (index !== spreadIndex) {
609
+ spread.destroy();
610
+ spreadComponents.delete(index);
611
+ }
612
+ }
613
+ let spreadComp = spreadComponents.get(spreadIndex);
614
+ if (!spreadComp) {
615
+ const spreadData = state.spreads[spreadIndex];
616
+ spreadComp = createSpread(spreadData);
617
+ spreadComp.mount(container);
618
+ spreadComponents.set(spreadIndex, spreadComp);
619
+ }
620
+ const layoutOptions = {
621
+ pageInfos: slice.pageInfos,
622
+ scale: state.scale,
623
+ dpi: slice.dpi,
624
+ rotation: slice.pageRotation,
625
+ pageSpacing: slice.pageSpacing
626
+ };
627
+ spreadComp.updateLayout(layoutOptions);
628
+ spreadComp.updateAnnotations(slice.pageAnnotations, layoutOptions, slice.highlightedAnnotation);
629
+ // Layout values are pre-snapped
630
+ const top = getCenteredOffset(containerSize.height, layout.height);
631
+ const spreadEl = spreadComp.getElement();
632
+ spreadEl.style.position = "absolute";
633
+ spreadEl.style.top = `${top}px`;
634
+ spreadEl.style.width = `${layout.width}px`;
635
+ spreadEl.style.height = `${layout.height}px`;
636
+ spreadEl.style.left = `${getCenteredOffset(containerSize.width, layout.width)}px`;
637
+ spreadEl.style.transform = "none";
638
+ spreadComp.render(renderManager, {
639
+ docId: slice.docId,
640
+ scale: state.scale,
641
+ dpi: slice.dpi
642
+ });
643
+ lastVisibleRange = { start: spreadIndex, end: spreadIndex };
644
+ layoutDirty = false;
645
+ }
646
+ function findFocusPage(viewportCenter, state) {
647
+ if (state.layouts.length === 0 || state.spreads.length === 0)
648
+ return null;
649
+ let closestIndex = 0;
650
+ let closestDistance = Infinity;
651
+ for (let i = 0; i < state.layouts.length; i++) {
652
+ const layout = state.layouts[i];
653
+ const spreadCenter = layout.top + layout.height / 2;
654
+ const distance = Math.abs(spreadCenter - viewportCenter);
655
+ if (distance < closestDistance) {
656
+ closestDistance = distance;
657
+ closestIndex = i;
658
+ }
659
+ }
660
+ const spread = state.spreads[closestIndex];
661
+ return spread ? getSpreadPrimaryPage(spread) : null;
662
+ }
663
+ function updateCurrentPageFromScroll(scrollTop, viewportHeight, state) {
664
+ if (!storeRef)
665
+ return;
666
+ const viewportCenter = scrollTop + viewportHeight / 2;
667
+ const primaryPage = findFocusPage(viewportCenter, state);
668
+ if (primaryPage === null)
669
+ return;
670
+ const currentState = storeRef.getState();
671
+ if (currentState.page !== primaryPage) {
672
+ storeRef.dispatch({ type: "SET_PAGE", page: primaryPage });
673
+ }
674
+ }
675
+ function scrollToPage(page, metrics, center) {
676
+ if (!layoutState)
677
+ return;
678
+ if (layoutState.layouts.length === 0)
679
+ return;
680
+ const viewport = metrics ?? lastMetrics;
681
+ if (!viewport)
682
+ return;
683
+ const slice = currentSlice ?? lastSlice;
684
+ if (!slice)
685
+ return;
686
+ const spreadIndex = findSpreadForPage(layoutState.spreads, page);
687
+ const layout = layoutState.layouts[spreadIndex];
688
+ if (!layout)
689
+ return;
690
+ // Top-align with spacing (default), or center vertically if requested
691
+ const snappedSpreadSpacing = snapToDevice(slice.spreadSpacing);
692
+ const targetScrollTop = center
693
+ ? layout.top - (viewport.innerHeight - layout.height) / 2
694
+ : layout.top - snappedSpreadSpacing;
695
+ const maxScrollTop = Math.max(0, containerSize.height - viewport.innerHeight);
696
+ scrollArea.scrollTop = clamp(targetScrollTop, 0, maxScrollTop);
697
+ }
698
+ function scrollToTarget(target, metrics) {
699
+ if (!layoutState)
700
+ return;
701
+ if (layoutState.layouts.length === 0)
702
+ return;
703
+ const viewport = metrics ?? lastMetrics;
704
+ if (!viewport)
705
+ return;
706
+ const slice = currentSlice ?? lastSlice;
707
+ if (!slice)
708
+ return;
709
+ const spreadIndex = findSpreadForPage(layoutState.spreads, target.page);
710
+ const layout = layoutState.layouts[spreadIndex];
711
+ if (!layout)
712
+ return;
713
+ let targetScrollTop;
714
+ let targetScrollLeft = 0;
715
+ // Apply scroll offset if specified (convert from PDF points to scaled pixels)
716
+ if (target.scrollTo && target.scrollTo.y !== undefined) {
717
+ // scrollTo.y is in PDF points from top of page (already Y-flipped by WASM)
718
+ // Full conversion: points * (dpi/72) * zoomScale
719
+ const dpiScale = getPointsToPixels(slice.dpi);
720
+ const pointsToPixels = dpiScale * layoutState.scale;
721
+ const yInPixels = target.scrollTo.y * pointsToPixels;
722
+ // Position target at top of viewport
723
+ targetScrollTop = layout.top + yInPixels;
724
+ if (target.scrollTo.x !== undefined) {
725
+ const xInPixels = target.scrollTo.x * pointsToPixels;
726
+ // Center the x position in viewport if possible
727
+ targetScrollLeft = Math.max(0, xInPixels - viewport.innerWidth / 2);
728
+ }
729
+ }
730
+ else {
731
+ // No specific scroll position - scroll to top of spread with spacing
732
+ const snappedSpreadSpacing = snapToDevice(slice.spreadSpacing);
733
+ targetScrollTop = layout.top - snappedSpreadSpacing;
734
+ }
735
+ const maxScrollTop = Math.max(0, containerSize.height - viewport.innerHeight);
736
+ const maxScrollLeft = Math.max(0, containerSize.width - viewport.innerWidth);
737
+ scrollArea.scrollTop = clamp(targetScrollTop, 0, maxScrollTop);
738
+ scrollArea.scrollLeft = clamp(targetScrollLeft, 0, maxScrollLeft);
739
+ }
740
+ function clearSpreads() {
741
+ for (const spread of spreadComponents.values()) {
742
+ spread.destroy();
743
+ }
744
+ spreadComponents.clear();
745
+ lastOverflowX = null;
746
+ lastOverflowY = null;
747
+ }
748
+ function destroy() {
749
+ if (unsubRender)
750
+ unsubRender();
751
+ if (unsubScroll)
752
+ unsubScroll();
753
+ if (unsubNavigation)
754
+ unsubNavigation();
755
+ if (resizeObserver)
756
+ resizeObserver.disconnect();
757
+ for (const off of unsubEvents)
758
+ off();
759
+ if (updateRaf)
760
+ cancelAnimationFrame(updateRaf);
761
+ if (scrollRaf)
762
+ cancelAnimationFrame(scrollRaf);
763
+ floatingToolbar.destroy();
764
+ clearSpreads();
765
+ renderManager = null;
766
+ storeRef = null;
767
+ currentSlice = null;
768
+ lastSlice = null;
769
+ layoutState = null;
770
+ el.remove();
771
+ }
772
+ return { el, mount, destroy };
773
+ }
774
+ function selectViewport(state) {
775
+ return {
776
+ docId: state.doc?.id ?? null,
777
+ page: state.page,
778
+ pageCount: state.pageCount,
779
+ pageInfos: state.pageInfos,
780
+ scrollMode: state.scrollMode,
781
+ layoutMode: state.layoutMode,
782
+ zoomMode: state.zoomMode,
783
+ zoom: state.zoom,
784
+ dpi: state.dpi,
785
+ pageRotation: state.pageRotation,
786
+ spacingMode: state.spacingMode,
787
+ pageSpacing: state.pageSpacing,
788
+ spreadSpacing: state.spreadSpacing,
789
+ pageAnnotations: state.pageAnnotations,
790
+ highlightedAnnotation: state.highlightedAnnotation
791
+ };
792
+ }
793
+ //# sourceMappingURL=Viewport.js.map