@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.
- package/README.md +180 -0
- package/dist/UDocClient.d.ts +197 -0
- package/dist/UDocClient.d.ts.map +1 -0
- package/dist/UDocClient.js +170 -0
- package/dist/UDocClient.js.map +1 -0
- package/dist/UDocViewer.d.ts +196 -0
- package/dist/UDocViewer.d.ts.map +1 -0
- package/dist/UDocViewer.js +427 -0
- package/dist/UDocViewer.js.map +1 -0
- package/dist/WorkerClient.d.ts +36 -0
- package/dist/WorkerClient.d.ts.map +1 -0
- package/dist/WorkerClient.js +121 -0
- package/dist/WorkerClient.js.map +1 -0
- package/dist/annotation/AnnotationLayer.d.ts +166 -0
- package/dist/annotation/AnnotationLayer.d.ts.map +1 -0
- package/dist/annotation/AnnotationLayer.js +1090 -0
- package/dist/annotation/AnnotationLayer.js.map +1 -0
- package/dist/annotation/index.d.ts +6 -0
- package/dist/annotation/index.d.ts.map +1 -0
- package/dist/annotation/index.js +6 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/components/FloatingBar.d.ts +102 -0
- package/dist/components/FloatingBar.d.ts.map +1 -0
- package/dist/components/FloatingBar.js +513 -0
- package/dist/components/FloatingBar.js.map +1 -0
- package/dist/components/Header.d.ts +46 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +93 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/panels/CommentsPanel.d.ts +33 -0
- package/dist/components/panels/CommentsPanel.d.ts.map +1 -0
- package/dist/components/panels/CommentsPanel.js +176 -0
- package/dist/components/panels/CommentsPanel.js.map +1 -0
- package/dist/components/panels/OutlinePanel.d.ts +30 -0
- package/dist/components/panels/OutlinePanel.d.ts.map +1 -0
- package/dist/components/panels/OutlinePanel.js +144 -0
- package/dist/components/panels/OutlinePanel.js.map +1 -0
- package/dist/components/panels/ThumbnailsPanel.d.ts +51 -0
- package/dist/components/panels/ThumbnailsPanel.d.ts.map +1 -0
- package/dist/components/panels/ThumbnailsPanel.js +160 -0
- package/dist/components/panels/ThumbnailsPanel.js.map +1 -0
- package/dist/components/panels/index.d.ts +7 -0
- package/dist/components/panels/index.d.ts.map +1 -0
- package/dist/components/panels/index.js +4 -0
- package/dist/components/panels/index.js.map +1 -0
- package/dist/constants.d.ts +25 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +46 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/NavigationController.d.ts +54 -0
- package/dist/core/NavigationController.d.ts.map +1 -0
- package/dist/core/NavigationController.js +145 -0
- package/dist/core/NavigationController.js.map +1 -0
- package/dist/core/PerfTimer.d.ts +12 -0
- package/dist/core/PerfTimer.d.ts.map +1 -0
- package/dist/core/PerfTimer.js +32 -0
- package/dist/core/PerfTimer.js.map +1 -0
- package/dist/core/ViewerState.d.ts +108 -0
- package/dist/core/ViewerState.d.ts.map +1 -0
- package/dist/core/ViewerState.js +179 -0
- package/dist/core/ViewerState.js.map +1 -0
- package/dist/core/constants.d.ts +24 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +42 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +573 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/icons/icons.d.ts +41 -0
- package/dist/icons/icons.d.ts.map +1 -0
- package/dist/icons/icons.js +51 -0
- package/dist/icons/icons.js.map +1 -0
- package/dist/icons/index.d.ts +3 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +2 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/BandManager.d.ts +87 -0
- package/dist/layout/BandManager.d.ts.map +1 -0
- package/dist/layout/BandManager.js +185 -0
- package/dist/layout/BandManager.js.map +1 -0
- package/dist/layout/LayoutCalculator.d.ts +42 -0
- package/dist/layout/LayoutCalculator.d.ts.map +1 -0
- package/dist/layout/LayoutCalculator.js +180 -0
- package/dist/layout/LayoutCalculator.js.map +1 -0
- package/dist/layout/LayoutState.d.ts +46 -0
- package/dist/layout/LayoutState.d.ts.map +1 -0
- package/dist/layout/LayoutState.js +109 -0
- package/dist/layout/LayoutState.js.map +1 -0
- package/dist/layout/TransitionCoordinator.d.ts +11 -0
- package/dist/layout/TransitionCoordinator.d.ts.map +1 -0
- package/dist/layout/TransitionCoordinator.js +22 -0
- package/dist/layout/TransitionCoordinator.js.map +1 -0
- package/dist/layout/index.d.ts +7 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/rendering/BandManager.d.ts +87 -0
- package/dist/rendering/BandManager.d.ts.map +1 -0
- package/dist/rendering/BandManager.js +185 -0
- package/dist/rendering/BandManager.js.map +1 -0
- package/dist/rendering/PageCache.d.ts +75 -0
- package/dist/rendering/PageCache.d.ts.map +1 -0
- package/dist/rendering/PageCache.js +122 -0
- package/dist/rendering/PageCache.js.map +1 -0
- package/dist/rendering/RenderQueue.d.ts +75 -0
- package/dist/rendering/RenderQueue.d.ts.map +1 -0
- package/dist/rendering/RenderQueue.js +105 -0
- package/dist/rendering/RenderQueue.js.map +1 -0
- package/dist/rendering/ThumbnailQueue.d.ts +57 -0
- package/dist/rendering/ThumbnailQueue.d.ts.map +1 -0
- package/dist/rendering/ThumbnailQueue.js +85 -0
- package/dist/rendering/ThumbnailQueue.js.map +1 -0
- package/dist/rendering/index.d.ts +13 -0
- package/dist/rendering/index.d.ts.map +1 -0
- package/dist/rendering/index.js +10 -0
- package/dist/rendering/index.js.map +1 -0
- package/dist/rendering/types.d.ts +72 -0
- package/dist/rendering/types.d.ts.map +1 -0
- package/dist/rendering/types.js +5 -0
- package/dist/rendering/types.js.map +1 -0
- package/dist/styles/index.d.ts +6 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +1221 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/Component.d.ts +127 -0
- package/dist/ui/Component.d.ts.map +1 -0
- package/dist/ui/Component.js +201 -0
- package/dist/ui/Component.js.map +1 -0
- package/dist/ui/annotation/AnnotationLayer.d.ts +90 -0
- package/dist/ui/annotation/AnnotationLayer.d.ts.map +1 -0
- package/dist/ui/annotation/AnnotationLayer.js +322 -0
- package/dist/ui/annotation/AnnotationLayer.js.map +1 -0
- package/dist/ui/annotation/LinkRenderer.d.ts +32 -0
- package/dist/ui/annotation/LinkRenderer.d.ts.map +1 -0
- package/dist/ui/annotation/LinkRenderer.js +74 -0
- package/dist/ui/annotation/LinkRenderer.js.map +1 -0
- package/dist/ui/annotation/MarkupRenderer.d.ts +40 -0
- package/dist/ui/annotation/MarkupRenderer.d.ts.map +1 -0
- package/dist/ui/annotation/MarkupRenderer.js +154 -0
- package/dist/ui/annotation/MarkupRenderer.js.map +1 -0
- package/dist/ui/annotation/ShapeRenderer.d.ts +46 -0
- package/dist/ui/annotation/ShapeRenderer.d.ts.map +1 -0
- package/dist/ui/annotation/ShapeRenderer.js +376 -0
- package/dist/ui/annotation/ShapeRenderer.js.map +1 -0
- package/dist/ui/annotation/TextRenderer.d.ts +36 -0
- package/dist/ui/annotation/TextRenderer.d.ts.map +1 -0
- package/dist/ui/annotation/TextRenderer.js +199 -0
- package/dist/ui/annotation/TextRenderer.js.map +1 -0
- package/dist/ui/annotation/index.d.ts +17 -0
- package/dist/ui/annotation/index.d.ts.map +1 -0
- package/dist/ui/annotation/index.js +13 -0
- package/dist/ui/annotation/index.js.map +1 -0
- package/dist/ui/annotation/utils.d.ts +40 -0
- package/dist/ui/annotation/utils.d.ts.map +1 -0
- package/dist/ui/annotation/utils.js +62 -0
- package/dist/ui/annotation/utils.js.map +1 -0
- package/dist/ui/components/CommentsContent.d.ts +35 -0
- package/dist/ui/components/CommentsContent.d.ts.map +1 -0
- package/dist/ui/components/CommentsContent.js +203 -0
- package/dist/ui/components/CommentsContent.js.map +1 -0
- package/dist/ui/components/FloatingBar.d.ts +55 -0
- package/dist/ui/components/FloatingBar.d.ts.map +1 -0
- package/dist/ui/components/FloatingBar.js +585 -0
- package/dist/ui/components/FloatingBar.js.map +1 -0
- package/dist/ui/components/Header.d.ts +29 -0
- package/dist/ui/components/Header.d.ts.map +1 -0
- package/dist/ui/components/Header.js +127 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/LeftPanel.d.ts +54 -0
- package/dist/ui/components/LeftPanel.d.ts.map +1 -0
- package/dist/ui/components/LeftPanel.js +202 -0
- package/dist/ui/components/LeftPanel.js.map +1 -0
- package/dist/ui/components/OutlineContent.d.ts +34 -0
- package/dist/ui/components/OutlineContent.d.ts.map +1 -0
- package/dist/ui/components/OutlineContent.js +147 -0
- package/dist/ui/components/OutlineContent.js.map +1 -0
- package/dist/ui/components/RightPanel.d.ts +52 -0
- package/dist/ui/components/RightPanel.d.ts.map +1 -0
- package/dist/ui/components/RightPanel.js +142 -0
- package/dist/ui/components/RightPanel.js.map +1 -0
- package/dist/ui/components/Viewport.d.ts +70 -0
- package/dist/ui/components/Viewport.d.ts.map +1 -0
- package/dist/ui/components/Viewport.js +173 -0
- package/dist/ui/components/Viewport.js.map +1 -0
- package/dist/ui/components/index.d.ts +11 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +10 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/framework/component.d.ts +68 -0
- package/dist/ui/framework/component.d.ts.map +1 -0
- package/dist/ui/framework/component.js +87 -0
- package/dist/ui/framework/component.js.map +1 -0
- package/dist/ui/framework/dom.d.ts +19 -0
- package/dist/ui/framework/dom.d.ts.map +1 -0
- package/dist/ui/framework/dom.js +29 -0
- package/dist/ui/framework/dom.js.map +1 -0
- package/dist/ui/framework/events.d.ts +18 -0
- package/dist/ui/framework/events.d.ts.map +1 -0
- package/dist/ui/framework/events.js +23 -0
- package/dist/ui/framework/events.js.map +1 -0
- package/dist/ui/framework/index.d.ts +15 -0
- package/dist/ui/framework/index.d.ts.map +1 -0
- package/dist/ui/framework/index.js +15 -0
- package/dist/ui/framework/index.js.map +1 -0
- package/dist/ui/framework/selectors.d.ts +51 -0
- package/dist/ui/framework/selectors.d.ts.map +1 -0
- package/dist/ui/framework/selectors.js +30 -0
- package/dist/ui/framework/selectors.js.map +1 -0
- package/dist/ui/framework/store.d.ts +37 -0
- package/dist/ui/framework/store.d.ts.map +1 -0
- package/dist/ui/framework/store.js +54 -0
- package/dist/ui/framework/store.js.map +1 -0
- package/dist/ui/icons/icons.d.ts +43 -0
- package/dist/ui/icons/icons.d.ts.map +1 -0
- package/dist/ui/icons/icons.js +46 -0
- package/dist/ui/icons/icons.js.map +1 -0
- package/dist/ui/icons/index.d.ts +11 -0
- package/dist/ui/icons/index.d.ts.map +1 -0
- package/dist/ui/icons/index.js +18 -0
- package/dist/ui/icons/index.js.map +1 -0
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +9 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/styles/base.css.d.ts +5 -0
- package/dist/ui/styles/base.css.d.ts.map +1 -0
- package/dist/ui/styles/base.css.js +49 -0
- package/dist/ui/styles/base.css.js.map +1 -0
- package/dist/ui/styles/floating-bar.css.d.ts +5 -0
- package/dist/ui/styles/floating-bar.css.d.ts.map +1 -0
- package/dist/ui/styles/floating-bar.css.js +417 -0
- package/dist/ui/styles/floating-bar.css.js.map +1 -0
- package/dist/ui/styles/header.css.d.ts +5 -0
- package/dist/ui/styles/header.css.d.ts.map +1 -0
- package/dist/ui/styles/header.css.js +49 -0
- package/dist/ui/styles/header.css.js.map +1 -0
- package/dist/ui/styles/index.d.ts +21 -0
- package/dist/ui/styles/index.d.ts.map +1 -0
- package/dist/ui/styles/index.js +48 -0
- package/dist/ui/styles/index.js.map +1 -0
- package/dist/ui/styles/panels.css.d.ts +5 -0
- package/dist/ui/styles/panels.css.d.ts.map +1 -0
- package/dist/ui/styles/panels.css.js +446 -0
- package/dist/ui/styles/panels.css.js.map +1 -0
- package/dist/ui/styles/responsive.css.d.ts +5 -0
- package/dist/ui/styles/responsive.css.d.ts.map +1 -0
- package/dist/ui/styles/responsive.css.js +201 -0
- package/dist/ui/styles/responsive.css.js.map +1 -0
- package/dist/ui/styles/variables.css.d.ts +6 -0
- package/dist/ui/styles/variables.css.d.ts.map +1 -0
- package/dist/ui/styles/variables.css.js +75 -0
- package/dist/ui/styles/variables.css.js.map +1 -0
- package/dist/ui/styles/viewport.css.d.ts +5 -0
- package/dist/ui/styles/viewport.css.d.ts.map +1 -0
- package/dist/ui/styles/viewport.css.js +87 -0
- package/dist/ui/styles/viewport.css.js.map +1 -0
- package/dist/ui/viewer/actions.d.ts +103 -0
- package/dist/ui/viewer/actions.d.ts.map +1 -0
- package/dist/ui/viewer/actions.js +2 -0
- package/dist/ui/viewer/actions.js.map +1 -0
- package/dist/ui/viewer/annotation/LinkRenderer.d.ts +9 -0
- package/dist/ui/viewer/annotation/LinkRenderer.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/LinkRenderer.js +17 -0
- package/dist/ui/viewer/annotation/LinkRenderer.js.map +1 -0
- package/dist/ui/viewer/annotation/MarkupRenderer.d.ts +21 -0
- package/dist/ui/viewer/annotation/MarkupRenderer.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/MarkupRenderer.js +138 -0
- package/dist/ui/viewer/annotation/MarkupRenderer.js.map +1 -0
- package/dist/ui/viewer/annotation/ShapeRenderer.d.ts +33 -0
- package/dist/ui/viewer/annotation/ShapeRenderer.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/ShapeRenderer.js +378 -0
- package/dist/ui/viewer/annotation/ShapeRenderer.js.map +1 -0
- package/dist/ui/viewer/annotation/TextRenderer.d.ts +23 -0
- package/dist/ui/viewer/annotation/TextRenderer.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/TextRenderer.js +196 -0
- package/dist/ui/viewer/annotation/TextRenderer.js.map +1 -0
- package/dist/ui/viewer/annotation/index.d.ts +8 -0
- package/dist/ui/viewer/annotation/index.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/index.js +8 -0
- package/dist/ui/viewer/annotation/index.js.map +1 -0
- package/dist/ui/viewer/annotation/render.d.ts +24 -0
- package/dist/ui/viewer/annotation/render.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/render.js +184 -0
- package/dist/ui/viewer/annotation/render.js.map +1 -0
- package/dist/ui/viewer/annotation/types.d.ts +239 -0
- package/dist/ui/viewer/annotation/types.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/types.js +7 -0
- package/dist/ui/viewer/annotation/types.js.map +1 -0
- package/dist/ui/viewer/annotation/utils.d.ts +37 -0
- package/dist/ui/viewer/annotation/utils.d.ts.map +1 -0
- package/dist/ui/viewer/annotation/utils.js +82 -0
- package/dist/ui/viewer/annotation/utils.js.map +1 -0
- package/dist/ui/viewer/components/AnnotationPanel.d.ts +19 -0
- package/dist/ui/viewer/components/AnnotationPanel.d.ts.map +1 -0
- package/dist/ui/viewer/components/AnnotationPanel.js +284 -0
- package/dist/ui/viewer/components/AnnotationPanel.js.map +1 -0
- package/dist/ui/viewer/components/FloatingToolbar.d.ts +9 -0
- package/dist/ui/viewer/components/FloatingToolbar.d.ts.map +1 -0
- package/dist/ui/viewer/components/FloatingToolbar.js +305 -0
- package/dist/ui/viewer/components/FloatingToolbar.js.map +1 -0
- package/dist/ui/viewer/components/LeftPanel.d.ts +10 -0
- package/dist/ui/viewer/components/LeftPanel.d.ts.map +1 -0
- package/dist/ui/viewer/components/LeftPanel.js +165 -0
- package/dist/ui/viewer/components/LeftPanel.js.map +1 -0
- package/dist/ui/viewer/components/OutlinePanel.d.ts +10 -0
- package/dist/ui/viewer/components/OutlinePanel.d.ts.map +1 -0
- package/dist/ui/viewer/components/OutlinePanel.js +169 -0
- package/dist/ui/viewer/components/OutlinePanel.js.map +1 -0
- package/dist/ui/viewer/components/RightPanel.d.ts +9 -0
- package/dist/ui/viewer/components/RightPanel.d.ts.map +1 -0
- package/dist/ui/viewer/components/RightPanel.js +102 -0
- package/dist/ui/viewer/components/RightPanel.js.map +1 -0
- package/dist/ui/viewer/components/Spread.d.ts +41 -0
- package/dist/ui/viewer/components/Spread.d.ts.map +1 -0
- package/dist/ui/viewer/components/Spread.js +278 -0
- package/dist/ui/viewer/components/Spread.js.map +1 -0
- package/dist/ui/viewer/components/ThumbnailPanel.d.ts +11 -0
- package/dist/ui/viewer/components/ThumbnailPanel.d.ts.map +1 -0
- package/dist/ui/viewer/components/ThumbnailPanel.js +206 -0
- package/dist/ui/viewer/components/ThumbnailPanel.js.map +1 -0
- package/dist/ui/viewer/components/Toolbar.d.ts +9 -0
- package/dist/ui/viewer/components/Toolbar.d.ts.map +1 -0
- package/dist/ui/viewer/components/Toolbar.js +93 -0
- package/dist/ui/viewer/components/Toolbar.js.map +1 -0
- package/dist/ui/viewer/components/ViewModeMenu.d.ts +9 -0
- package/dist/ui/viewer/components/ViewModeMenu.d.ts.map +1 -0
- package/dist/ui/viewer/components/ViewModeMenu.js +169 -0
- package/dist/ui/viewer/components/ViewModeMenu.js.map +1 -0
- package/dist/ui/viewer/components/Viewport.d.ts +10 -0
- package/dist/ui/viewer/components/Viewport.d.ts.map +1 -0
- package/dist/ui/viewer/components/Viewport.js +793 -0
- package/dist/ui/viewer/components/Viewport.js.map +1 -0
- package/dist/ui/viewer/effects.d.ts +9 -0
- package/dist/ui/viewer/effects.d.ts.map +1 -0
- package/dist/ui/viewer/effects.js +179 -0
- package/dist/ui/viewer/effects.js.map +1 -0
- package/dist/ui/viewer/icons.d.ts +32 -0
- package/dist/ui/viewer/icons.d.ts.map +1 -0
- package/dist/ui/viewer/icons.js +44 -0
- package/dist/ui/viewer/icons.js.map +1 -0
- package/dist/ui/viewer/index.d.ts +6 -0
- package/dist/ui/viewer/index.d.ts.map +1 -0
- package/dist/ui/viewer/index.js +6 -0
- package/dist/ui/viewer/index.js.map +1 -0
- package/dist/ui/viewer/layout/index.d.ts +3 -0
- package/dist/ui/viewer/layout/index.d.ts.map +1 -0
- package/dist/ui/viewer/layout/index.js +3 -0
- package/dist/ui/viewer/layout/index.js.map +1 -0
- package/dist/ui/viewer/layout/pixelAlign.d.ts +7 -0
- package/dist/ui/viewer/layout/pixelAlign.d.ts.map +1 -0
- package/dist/ui/viewer/layout/pixelAlign.js +22 -0
- package/dist/ui/viewer/layout/pixelAlign.js.map +1 -0
- package/dist/ui/viewer/layout/spreadLayout.d.ts +93 -0
- package/dist/ui/viewer/layout/spreadLayout.d.ts.map +1 -0
- package/dist/ui/viewer/layout/spreadLayout.js +303 -0
- package/dist/ui/viewer/layout/spreadLayout.js.map +1 -0
- package/dist/ui/viewer/navigation.d.ts +80 -0
- package/dist/ui/viewer/navigation.d.ts.map +1 -0
- package/dist/ui/viewer/navigation.js +59 -0
- package/dist/ui/viewer/navigation.js.map +1 -0
- package/dist/ui/viewer/reducer.d.ts +4 -0
- package/dist/ui/viewer/reducer.d.ts.map +1 -0
- package/dist/ui/viewer/reducer.js +229 -0
- package/dist/ui/viewer/reducer.js.map +1 -0
- package/dist/ui/viewer/rendering/RenderManager.d.ts +76 -0
- package/dist/ui/viewer/rendering/RenderManager.d.ts.map +1 -0
- package/dist/ui/viewer/rendering/RenderManager.js +236 -0
- package/dist/ui/viewer/rendering/RenderManager.js.map +1 -0
- package/dist/ui/viewer/shell.d.ts +29 -0
- package/dist/ui/viewer/shell.d.ts.map +1 -0
- package/dist/ui/viewer/shell.js +70 -0
- package/dist/ui/viewer/shell.js.map +1 -0
- package/dist/ui/viewer/state.d.ts +72 -0
- package/dist/ui/viewer/state.d.ts.map +1 -0
- package/dist/ui/viewer/state.js +47 -0
- package/dist/ui/viewer/state.js.map +1 -0
- package/dist/view/LayoutCalculator.d.ts +42 -0
- package/dist/view/LayoutCalculator.d.ts.map +1 -0
- package/dist/view/LayoutCalculator.js +180 -0
- package/dist/view/LayoutCalculator.js.map +1 -0
- package/dist/view/TransitionCoordinator.d.ts +11 -0
- package/dist/view/TransitionCoordinator.d.ts.map +1 -0
- package/dist/view/TransitionCoordinator.js +22 -0
- package/dist/view/TransitionCoordinator.js.map +1 -0
- package/dist/view/ViewState.d.ts +46 -0
- package/dist/view/ViewState.d.ts.map +1 -0
- package/dist/view/ViewState.js +109 -0
- package/dist/view/ViewState.js.map +1 -0
- package/dist/view/index.d.ts +7 -0
- package/dist/view/index.d.ts.map +1 -0
- package/dist/view/index.js +4 -0
- package/dist/view/index.js.map +1 -0
- package/dist/wasm/udoc.d.ts +202 -0
- package/dist/wasm/udoc.js +929 -0
- package/dist/wasm/udoc_bg.wasm +0 -0
- package/dist/wasm/udoc_bg.wasm.d.ts +28 -0
- package/dist/worker/WorkerClient.d.ts +103 -0
- package/dist/worker/WorkerClient.d.ts.map +1 -0
- package/dist/worker/WorkerClient.js +182 -0
- package/dist/worker/WorkerClient.js.map +1 -0
- package/dist/worker/index.d.ts +4 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +2 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/types.d.ts +81 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +6 -0
- package/dist/worker/types.js.map +1 -0
- package/dist/worker/worker.d.ts +191 -0
- package/dist/worker/worker.d.ts.map +1 -0
- package/dist/worker/worker.js +127 -0
- package/dist/worker/worker.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +205 -0
- package/dist/worker.js.map +1 -0
- 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
|