@docmentis/udoc-viewer 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wasm/udoc_bg.wasm +0 -0
- package/dist/worker/WorkerClient.js +1 -1
- package/package.json +11 -3
- package/dist/WorkerClient.d.ts +0 -36
- package/dist/WorkerClient.d.ts.map +0 -1
- package/dist/WorkerClient.js +0 -121
- package/dist/WorkerClient.js.map +0 -1
- package/dist/annotation/AnnotationLayer.d.ts +0 -166
- package/dist/annotation/AnnotationLayer.d.ts.map +0 -1
- package/dist/annotation/AnnotationLayer.js +0 -1090
- package/dist/annotation/AnnotationLayer.js.map +0 -1
- package/dist/annotation/index.d.ts +0 -6
- package/dist/annotation/index.d.ts.map +0 -1
- package/dist/annotation/index.js +0 -6
- package/dist/annotation/index.js.map +0 -1
- package/dist/components/FloatingBar.d.ts +0 -102
- package/dist/components/FloatingBar.d.ts.map +0 -1
- package/dist/components/FloatingBar.js +0 -513
- package/dist/components/FloatingBar.js.map +0 -1
- package/dist/components/Header.d.ts +0 -46
- package/dist/components/Header.d.ts.map +0 -1
- package/dist/components/Header.js +0 -93
- package/dist/components/Header.js.map +0 -1
- package/dist/components/index.d.ts +0 -6
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -4
- package/dist/components/index.js.map +0 -1
- package/dist/components/panels/CommentsPanel.d.ts +0 -33
- package/dist/components/panels/CommentsPanel.d.ts.map +0 -1
- package/dist/components/panels/CommentsPanel.js +0 -176
- package/dist/components/panels/CommentsPanel.js.map +0 -1
- package/dist/components/panels/OutlinePanel.d.ts +0 -30
- package/dist/components/panels/OutlinePanel.d.ts.map +0 -1
- package/dist/components/panels/OutlinePanel.js +0 -144
- package/dist/components/panels/OutlinePanel.js.map +0 -1
- package/dist/components/panels/ThumbnailsPanel.d.ts +0 -51
- package/dist/components/panels/ThumbnailsPanel.d.ts.map +0 -1
- package/dist/components/panels/ThumbnailsPanel.js +0 -160
- package/dist/components/panels/ThumbnailsPanel.js.map +0 -1
- package/dist/components/panels/index.d.ts +0 -7
- package/dist/components/panels/index.d.ts.map +0 -1
- package/dist/components/panels/index.js +0 -4
- package/dist/components/panels/index.js.map +0 -1
- package/dist/constants.d.ts +0 -25
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -46
- package/dist/constants.js.map +0 -1
- package/dist/core/NavigationController.d.ts +0 -54
- package/dist/core/NavigationController.d.ts.map +0 -1
- package/dist/core/NavigationController.js +0 -145
- package/dist/core/NavigationController.js.map +0 -1
- package/dist/core/PerfTimer.d.ts +0 -12
- package/dist/core/PerfTimer.d.ts.map +0 -1
- package/dist/core/PerfTimer.js +0 -32
- package/dist/core/PerfTimer.js.map +0 -1
- package/dist/core/ViewerState.d.ts +0 -108
- package/dist/core/ViewerState.d.ts.map +0 -1
- package/dist/core/ViewerState.js +0 -179
- package/dist/core/ViewerState.js.map +0 -1
- package/dist/core/constants.d.ts +0 -24
- package/dist/core/constants.d.ts.map +0 -1
- package/dist/core/constants.js +0 -42
- package/dist/core/constants.js.map +0 -1
- package/dist/core/index.d.ts +0 -8
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -11
- package/dist/core/index.js.map +0 -1
- package/dist/core/types.d.ts +0 -573
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +0 -1
- package/dist/icons/icons.d.ts +0 -41
- package/dist/icons/icons.d.ts.map +0 -1
- package/dist/icons/icons.js +0 -51
- package/dist/icons/icons.js.map +0 -1
- package/dist/icons/index.d.ts +0 -3
- package/dist/icons/index.d.ts.map +0 -1
- package/dist/icons/index.js +0 -2
- package/dist/icons/index.js.map +0 -1
- package/dist/layout/BandManager.d.ts +0 -87
- package/dist/layout/BandManager.d.ts.map +0 -1
- package/dist/layout/BandManager.js +0 -185
- package/dist/layout/BandManager.js.map +0 -1
- package/dist/layout/LayoutCalculator.d.ts +0 -42
- package/dist/layout/LayoutCalculator.d.ts.map +0 -1
- package/dist/layout/LayoutCalculator.js +0 -180
- package/dist/layout/LayoutCalculator.js.map +0 -1
- package/dist/layout/LayoutState.d.ts +0 -46
- package/dist/layout/LayoutState.d.ts.map +0 -1
- package/dist/layout/LayoutState.js +0 -109
- package/dist/layout/LayoutState.js.map +0 -1
- package/dist/layout/TransitionCoordinator.d.ts +0 -11
- package/dist/layout/TransitionCoordinator.d.ts.map +0 -1
- package/dist/layout/TransitionCoordinator.js +0 -22
- package/dist/layout/TransitionCoordinator.js.map +0 -1
- package/dist/layout/index.d.ts +0 -7
- package/dist/layout/index.d.ts.map +0 -1
- package/dist/layout/index.js +0 -4
- package/dist/layout/index.js.map +0 -1
- package/dist/rendering/BandManager.d.ts +0 -87
- package/dist/rendering/BandManager.d.ts.map +0 -1
- package/dist/rendering/BandManager.js +0 -185
- package/dist/rendering/BandManager.js.map +0 -1
- package/dist/rendering/PageCache.d.ts +0 -75
- package/dist/rendering/PageCache.d.ts.map +0 -1
- package/dist/rendering/PageCache.js +0 -122
- package/dist/rendering/PageCache.js.map +0 -1
- package/dist/rendering/RenderQueue.d.ts +0 -75
- package/dist/rendering/RenderQueue.d.ts.map +0 -1
- package/dist/rendering/RenderQueue.js +0 -105
- package/dist/rendering/RenderQueue.js.map +0 -1
- package/dist/rendering/ThumbnailQueue.d.ts +0 -57
- package/dist/rendering/ThumbnailQueue.d.ts.map +0 -1
- package/dist/rendering/ThumbnailQueue.js +0 -85
- package/dist/rendering/ThumbnailQueue.js.map +0 -1
- package/dist/rendering/index.d.ts +0 -13
- package/dist/rendering/index.d.ts.map +0 -1
- package/dist/rendering/index.js +0 -10
- package/dist/rendering/index.js.map +0 -1
- package/dist/rendering/types.d.ts +0 -72
- package/dist/rendering/types.d.ts.map +0 -1
- package/dist/rendering/types.js +0 -5
- package/dist/rendering/types.js.map +0 -1
- package/dist/styles/index.d.ts +0 -6
- package/dist/styles/index.d.ts.map +0 -1
- package/dist/styles/index.js +0 -1221
- package/dist/styles/index.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/ui/Component.d.ts +0 -127
- package/dist/ui/Component.d.ts.map +0 -1
- package/dist/ui/Component.js +0 -201
- package/dist/ui/Component.js.map +0 -1
- package/dist/ui/annotation/AnnotationLayer.d.ts +0 -90
- package/dist/ui/annotation/AnnotationLayer.d.ts.map +0 -1
- package/dist/ui/annotation/AnnotationLayer.js +0 -322
- package/dist/ui/annotation/AnnotationLayer.js.map +0 -1
- package/dist/ui/annotation/LinkRenderer.d.ts +0 -32
- package/dist/ui/annotation/LinkRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/LinkRenderer.js +0 -74
- package/dist/ui/annotation/LinkRenderer.js.map +0 -1
- package/dist/ui/annotation/MarkupRenderer.d.ts +0 -40
- package/dist/ui/annotation/MarkupRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/MarkupRenderer.js +0 -154
- package/dist/ui/annotation/MarkupRenderer.js.map +0 -1
- package/dist/ui/annotation/ShapeRenderer.d.ts +0 -46
- package/dist/ui/annotation/ShapeRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/ShapeRenderer.js +0 -376
- package/dist/ui/annotation/ShapeRenderer.js.map +0 -1
- package/dist/ui/annotation/TextRenderer.d.ts +0 -36
- package/dist/ui/annotation/TextRenderer.d.ts.map +0 -1
- package/dist/ui/annotation/TextRenderer.js +0 -199
- package/dist/ui/annotation/TextRenderer.js.map +0 -1
- package/dist/ui/annotation/index.d.ts +0 -17
- package/dist/ui/annotation/index.d.ts.map +0 -1
- package/dist/ui/annotation/index.js +0 -13
- package/dist/ui/annotation/index.js.map +0 -1
- package/dist/ui/annotation/utils.d.ts +0 -40
- package/dist/ui/annotation/utils.d.ts.map +0 -1
- package/dist/ui/annotation/utils.js +0 -62
- package/dist/ui/annotation/utils.js.map +0 -1
- package/dist/ui/components/CommentsContent.d.ts +0 -35
- package/dist/ui/components/CommentsContent.d.ts.map +0 -1
- package/dist/ui/components/CommentsContent.js +0 -203
- package/dist/ui/components/CommentsContent.js.map +0 -1
- package/dist/ui/components/FloatingBar.d.ts +0 -55
- package/dist/ui/components/FloatingBar.d.ts.map +0 -1
- package/dist/ui/components/FloatingBar.js +0 -585
- package/dist/ui/components/FloatingBar.js.map +0 -1
- package/dist/ui/components/Header.d.ts +0 -29
- package/dist/ui/components/Header.d.ts.map +0 -1
- package/dist/ui/components/Header.js +0 -127
- package/dist/ui/components/Header.js.map +0 -1
- package/dist/ui/components/LeftPanel.d.ts +0 -54
- package/dist/ui/components/LeftPanel.d.ts.map +0 -1
- package/dist/ui/components/LeftPanel.js +0 -202
- package/dist/ui/components/LeftPanel.js.map +0 -1
- package/dist/ui/components/OutlineContent.d.ts +0 -34
- package/dist/ui/components/OutlineContent.d.ts.map +0 -1
- package/dist/ui/components/OutlineContent.js +0 -147
- package/dist/ui/components/OutlineContent.js.map +0 -1
- package/dist/ui/components/RightPanel.d.ts +0 -52
- package/dist/ui/components/RightPanel.d.ts.map +0 -1
- package/dist/ui/components/RightPanel.js +0 -142
- package/dist/ui/components/RightPanel.js.map +0 -1
- package/dist/ui/components/Viewport.d.ts +0 -70
- package/dist/ui/components/Viewport.d.ts.map +0 -1
- package/dist/ui/components/Viewport.js +0 -173
- package/dist/ui/components/Viewport.js.map +0 -1
- package/dist/ui/components/index.d.ts +0 -11
- package/dist/ui/components/index.d.ts.map +0 -1
- package/dist/ui/components/index.js +0 -10
- package/dist/ui/components/index.js.map +0 -1
- package/dist/ui/icons/icons.d.ts +0 -43
- package/dist/ui/icons/icons.d.ts.map +0 -1
- package/dist/ui/icons/icons.js +0 -46
- package/dist/ui/icons/icons.js.map +0 -1
- package/dist/ui/icons/index.d.ts +0 -11
- package/dist/ui/icons/index.d.ts.map +0 -1
- package/dist/ui/icons/index.js +0 -18
- package/dist/ui/icons/index.js.map +0 -1
- package/dist/ui/index.d.ts +0 -7
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js +0 -9
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/styles/base.css.d.ts +0 -5
- package/dist/ui/styles/base.css.d.ts.map +0 -1
- package/dist/ui/styles/base.css.js +0 -49
- package/dist/ui/styles/base.css.js.map +0 -1
- package/dist/ui/styles/floating-bar.css.d.ts +0 -5
- package/dist/ui/styles/floating-bar.css.d.ts.map +0 -1
- package/dist/ui/styles/floating-bar.css.js +0 -417
- package/dist/ui/styles/floating-bar.css.js.map +0 -1
- package/dist/ui/styles/header.css.d.ts +0 -5
- package/dist/ui/styles/header.css.d.ts.map +0 -1
- package/dist/ui/styles/header.css.js +0 -49
- package/dist/ui/styles/header.css.js.map +0 -1
- package/dist/ui/styles/index.d.ts +0 -21
- package/dist/ui/styles/index.d.ts.map +0 -1
- package/dist/ui/styles/index.js +0 -48
- package/dist/ui/styles/index.js.map +0 -1
- package/dist/ui/styles/panels.css.d.ts +0 -5
- package/dist/ui/styles/panels.css.d.ts.map +0 -1
- package/dist/ui/styles/panels.css.js +0 -446
- package/dist/ui/styles/panels.css.js.map +0 -1
- package/dist/ui/styles/responsive.css.d.ts +0 -5
- package/dist/ui/styles/responsive.css.d.ts.map +0 -1
- package/dist/ui/styles/responsive.css.js +0 -201
- package/dist/ui/styles/responsive.css.js.map +0 -1
- package/dist/ui/styles/variables.css.d.ts +0 -6
- package/dist/ui/styles/variables.css.d.ts.map +0 -1
- package/dist/ui/styles/variables.css.js +0 -75
- package/dist/ui/styles/variables.css.js.map +0 -1
- package/dist/ui/styles/viewport.css.d.ts +0 -5
- package/dist/ui/styles/viewport.css.d.ts.map +0 -1
- package/dist/ui/styles/viewport.css.js +0 -87
- package/dist/ui/styles/viewport.css.js.map +0 -1
- package/dist/view/LayoutCalculator.d.ts +0 -42
- package/dist/view/LayoutCalculator.d.ts.map +0 -1
- package/dist/view/LayoutCalculator.js +0 -180
- package/dist/view/LayoutCalculator.js.map +0 -1
- package/dist/view/TransitionCoordinator.d.ts +0 -11
- package/dist/view/TransitionCoordinator.d.ts.map +0 -1
- package/dist/view/TransitionCoordinator.js +0 -22
- package/dist/view/TransitionCoordinator.js.map +0 -1
- package/dist/view/ViewState.d.ts +0 -46
- package/dist/view/ViewState.d.ts.map +0 -1
- package/dist/view/ViewState.js +0 -109
- package/dist/view/ViewState.js.map +0 -1
- package/dist/view/index.d.ts +0 -7
- package/dist/view/index.d.ts.map +0 -1
- package/dist/view/index.js +0 -4
- package/dist/view/index.js.map +0 -1
- package/dist/worker/types.d.ts +0 -81
- package/dist/worker/types.d.ts.map +0 -1
- package/dist/worker/types.js +0 -6
- package/dist/worker/types.js.map +0 -1
- package/dist/worker.d.ts +0 -2
- package/dist/worker.d.ts.map +0 -1
- package/dist/worker.js +0 -205
- package/dist/worker.js.map +0 -1
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { Component } from '../Component';
|
|
2
|
-
/**
|
|
3
|
-
* Floating bar component providing quick access to common viewer controls.
|
|
4
|
-
*
|
|
5
|
-
* Contains:
|
|
6
|
-
* - Tool selector dropdown (select, hand)
|
|
7
|
-
* - Page navigation (prev/next buttons, page input)
|
|
8
|
-
* - Zoom controls (zoom in/out, percentage input, preset dropdown)
|
|
9
|
-
* - Settings popover (display mode, layout mode, rotation, seamless)
|
|
10
|
-
*/
|
|
11
|
-
export declare class FloatingBar extends Component<HTMLDivElement> {
|
|
12
|
-
private toolDropdown;
|
|
13
|
-
private toolDropdownBtn;
|
|
14
|
-
private toolMenu;
|
|
15
|
-
private toolItems;
|
|
16
|
-
private prevBtn;
|
|
17
|
-
private nextBtn;
|
|
18
|
-
private pageInput;
|
|
19
|
-
private pageCountEl;
|
|
20
|
-
private zoomOutBtn;
|
|
21
|
-
private zoomInBtn;
|
|
22
|
-
private zoomInput;
|
|
23
|
-
private zoomDropdownBtn;
|
|
24
|
-
private zoomMenu;
|
|
25
|
-
private settingsBtn;
|
|
26
|
-
private settingsPopover;
|
|
27
|
-
private displayModeOptions;
|
|
28
|
-
private layoutModeOptions;
|
|
29
|
-
private rotationOptions;
|
|
30
|
-
private seamlessOptions;
|
|
31
|
-
private static readonly TOOLS;
|
|
32
|
-
protected createElement(): HTMLDivElement;
|
|
33
|
-
private createToolDropdown;
|
|
34
|
-
private createPageNavigation;
|
|
35
|
-
private createZoomControls;
|
|
36
|
-
private createSettings;
|
|
37
|
-
private createDisplayModeSection;
|
|
38
|
-
private createLayoutModeSection;
|
|
39
|
-
private createRotationSection;
|
|
40
|
-
private createSeamlessSection;
|
|
41
|
-
private createSeparator;
|
|
42
|
-
protected bindEvents(): void;
|
|
43
|
-
protected subscribeToState(): void;
|
|
44
|
-
private updateControlsEnabled;
|
|
45
|
-
private updateNavigationButtons;
|
|
46
|
-
private updateZoomDisplay;
|
|
47
|
-
private updateToolDisplay;
|
|
48
|
-
private closeAllDropdowns;
|
|
49
|
-
/**
|
|
50
|
-
* Close all open dropdown menus.
|
|
51
|
-
* Can be called from the viewer when other menus are opened.
|
|
52
|
-
*/
|
|
53
|
-
closeDropdowns(): void;
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=FloatingBar.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingBar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/FloatingBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC;;;;;;;;GAQG;AACH,qBAAa,WAAY,SAAQ,SAAS,CAAC,cAAc,CAAC;IAEtD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,SAAS,CAAwC;IAGzD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,WAAW,CAAgC;IAGnD,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAA+B;IAG/C,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAG3B;IAEF,SAAS,CAAC,aAAa,IAAI,cAAc;IAyBzC,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,oBAAoB;IAgC5B,OAAO,CAAC,kBAAkB;IAqF1B,OAAO,CAAC,cAAc;IAuCtB,OAAO,CAAC,wBAAwB;IA+BhC,OAAO,CAAC,uBAAuB;IAiC/B,OAAO,CAAC,qBAAqB;IAiC7B,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,eAAe;IAMvB,SAAS,CAAC,UAAU,IAAI,IAAI;IAmI5B,SAAS,CAAC,gBAAgB,IAAI,IAAI;IAkElC,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACH,cAAc,IAAI,IAAI;CAGzB"}
|
|
@@ -1,585 +0,0 @@
|
|
|
1
|
-
import { Component } from '../Component';
|
|
2
|
-
import { ICONS } from '../icons';
|
|
3
|
-
/**
|
|
4
|
-
* Floating bar component providing quick access to common viewer controls.
|
|
5
|
-
*
|
|
6
|
-
* Contains:
|
|
7
|
-
* - Tool selector dropdown (select, hand)
|
|
8
|
-
* - Page navigation (prev/next buttons, page input)
|
|
9
|
-
* - Zoom controls (zoom in/out, percentage input, preset dropdown)
|
|
10
|
-
* - Settings popover (display mode, layout mode, rotation, seamless)
|
|
11
|
-
*/
|
|
12
|
-
export class FloatingBar extends Component {
|
|
13
|
-
// Tool dropdown elements
|
|
14
|
-
toolDropdown = null;
|
|
15
|
-
toolDropdownBtn = null;
|
|
16
|
-
toolMenu = null;
|
|
17
|
-
toolItems = new Map();
|
|
18
|
-
// Page navigation elements
|
|
19
|
-
prevBtn = null;
|
|
20
|
-
nextBtn = null;
|
|
21
|
-
pageInput = null;
|
|
22
|
-
pageCountEl = null;
|
|
23
|
-
// Zoom control elements
|
|
24
|
-
zoomOutBtn = null;
|
|
25
|
-
zoomInBtn = null;
|
|
26
|
-
zoomInput = null;
|
|
27
|
-
zoomDropdownBtn = null;
|
|
28
|
-
zoomMenu = null;
|
|
29
|
-
// Settings elements
|
|
30
|
-
settingsBtn = null;
|
|
31
|
-
settingsPopover = null;
|
|
32
|
-
displayModeOptions = [];
|
|
33
|
-
layoutModeOptions = [];
|
|
34
|
-
rotationOptions = [];
|
|
35
|
-
seamlessOptions = [];
|
|
36
|
-
// Tool configuration (static to be available before super() call)
|
|
37
|
-
static TOOLS = [
|
|
38
|
-
{ id: 'select', icon: ICONS.toolSelect, label: 'Select', shortcut: 'V' },
|
|
39
|
-
{ id: 'hand', icon: ICONS.toolHand, label: 'Hand', shortcut: 'H' },
|
|
40
|
-
];
|
|
41
|
-
createElement() {
|
|
42
|
-
const floatingBar = document.createElement('div');
|
|
43
|
-
floatingBar.className = 'udoc-floating-bar';
|
|
44
|
-
// Tool selector dropdown
|
|
45
|
-
this.createToolDropdown(floatingBar);
|
|
46
|
-
// Separator after tools
|
|
47
|
-
floatingBar.appendChild(this.createSeparator());
|
|
48
|
-
// Page navigation group
|
|
49
|
-
this.createPageNavigation(floatingBar);
|
|
50
|
-
// Separator
|
|
51
|
-
floatingBar.appendChild(this.createSeparator());
|
|
52
|
-
// Zoom controls
|
|
53
|
-
this.createZoomControls(floatingBar);
|
|
54
|
-
// Settings wrapper (hidden on mobile)
|
|
55
|
-
this.createSettings(floatingBar);
|
|
56
|
-
return floatingBar;
|
|
57
|
-
}
|
|
58
|
-
createToolDropdown(parent) {
|
|
59
|
-
this.toolDropdown = document.createElement('div');
|
|
60
|
-
this.toolDropdown.className = 'udoc-tool-dropdown';
|
|
61
|
-
const activeTool = this.viewer.state.get('activeTool');
|
|
62
|
-
const initialTool = FloatingBar.TOOLS.find(t => t.id === activeTool) || FloatingBar.TOOLS[0];
|
|
63
|
-
this.toolDropdownBtn = document.createElement('button');
|
|
64
|
-
this.toolDropdownBtn.className = 'udoc-tool-dropdown-btn';
|
|
65
|
-
this.toolDropdownBtn.innerHTML = `${initialTool.icon}<span class="udoc-tool-chevron">${ICONS.chevronDown}</span>`;
|
|
66
|
-
this.toolDropdownBtn.title = `${initialTool.label} (${initialTool.shortcut})`;
|
|
67
|
-
this.toolMenu = document.createElement('div');
|
|
68
|
-
this.toolMenu.className = 'udoc-tool-menu';
|
|
69
|
-
FloatingBar.TOOLS.forEach(tool => {
|
|
70
|
-
const item = document.createElement('div');
|
|
71
|
-
item.className = 'udoc-tool-item';
|
|
72
|
-
item.dataset.tool = tool.id;
|
|
73
|
-
if (tool.id === activeTool) {
|
|
74
|
-
item.classList.add('selected');
|
|
75
|
-
}
|
|
76
|
-
item.innerHTML = `${tool.icon}<span>${tool.label}</span><span class="udoc-tool-shortcut">${tool.shortcut}</span>`;
|
|
77
|
-
this.toolMenu.appendChild(item);
|
|
78
|
-
this.toolItems.set(tool.id, item);
|
|
79
|
-
});
|
|
80
|
-
this.toolDropdown.append(this.toolDropdownBtn, this.toolMenu);
|
|
81
|
-
parent.appendChild(this.toolDropdown);
|
|
82
|
-
}
|
|
83
|
-
createPageNavigation(parent) {
|
|
84
|
-
const pageGroup = document.createElement('div');
|
|
85
|
-
pageGroup.className = 'udoc-floating-bar-group';
|
|
86
|
-
this.prevBtn = document.createElement('button');
|
|
87
|
-
this.prevBtn.innerHTML = ICONS.chevronLeft;
|
|
88
|
-
this.prevBtn.title = 'Previous page';
|
|
89
|
-
this.prevBtn.disabled = true;
|
|
90
|
-
this.pageInput = document.createElement('input');
|
|
91
|
-
this.pageInput.type = 'text';
|
|
92
|
-
this.pageInput.className = 'udoc-page-input';
|
|
93
|
-
this.pageInput.value = '1';
|
|
94
|
-
this.pageInput.disabled = true;
|
|
95
|
-
const pageInfo = document.createElement('span');
|
|
96
|
-
pageInfo.className = 'udoc-page-info';
|
|
97
|
-
pageInfo.textContent = '/';
|
|
98
|
-
this.pageCountEl = document.createElement('span');
|
|
99
|
-
this.pageCountEl.className = 'udoc-page-info';
|
|
100
|
-
this.pageCountEl.textContent = '1';
|
|
101
|
-
this.nextBtn = document.createElement('button');
|
|
102
|
-
this.nextBtn.innerHTML = ICONS.chevronRight;
|
|
103
|
-
this.nextBtn.title = 'Next page';
|
|
104
|
-
this.nextBtn.disabled = true;
|
|
105
|
-
pageGroup.append(this.prevBtn, this.pageInput, pageInfo, this.pageCountEl, this.nextBtn);
|
|
106
|
-
parent.appendChild(pageGroup);
|
|
107
|
-
}
|
|
108
|
-
createZoomControls(parent) {
|
|
109
|
-
// Zoom controls wrapper (hidden on very small screens)
|
|
110
|
-
const zoomControls = document.createElement('div');
|
|
111
|
-
zoomControls.className = 'udoc-zoom-controls';
|
|
112
|
-
zoomControls.style.cssText = 'display:contents;';
|
|
113
|
-
// Zoom group with dropdown
|
|
114
|
-
const zoomGroup = document.createElement('div');
|
|
115
|
-
zoomGroup.className = 'udoc-floating-bar-group';
|
|
116
|
-
this.zoomOutBtn = document.createElement('button');
|
|
117
|
-
this.zoomOutBtn.innerHTML = ICONS.zoomOut;
|
|
118
|
-
this.zoomOutBtn.title = 'Zoom out';
|
|
119
|
-
this.zoomOutBtn.disabled = true;
|
|
120
|
-
// Zoom dropdown with input
|
|
121
|
-
const zoomDropdown = document.createElement('div');
|
|
122
|
-
zoomDropdown.className = 'udoc-zoom-dropdown';
|
|
123
|
-
const zoomInputWrapper = document.createElement('div');
|
|
124
|
-
zoomInputWrapper.className = 'udoc-zoom-input-wrapper';
|
|
125
|
-
this.zoomInput = document.createElement('input');
|
|
126
|
-
this.zoomInput.type = 'text';
|
|
127
|
-
this.zoomInput.className = 'udoc-zoom-input';
|
|
128
|
-
this.zoomInput.value = '100%';
|
|
129
|
-
this.zoomInput.disabled = true;
|
|
130
|
-
this.zoomDropdownBtn = document.createElement('button');
|
|
131
|
-
this.zoomDropdownBtn.className = 'udoc-zoom-dropdown-btn';
|
|
132
|
-
this.zoomDropdownBtn.innerHTML = ICONS.chevronDown;
|
|
133
|
-
this.zoomDropdownBtn.disabled = true;
|
|
134
|
-
zoomInputWrapper.append(this.zoomInput, this.zoomDropdownBtn);
|
|
135
|
-
this.zoomMenu = document.createElement('div');
|
|
136
|
-
this.zoomMenu.className = 'udoc-dropdown-menu';
|
|
137
|
-
const zoomPresets = [
|
|
138
|
-
{ value: '50', label: '50%' },
|
|
139
|
-
{ value: '75', label: '75%' },
|
|
140
|
-
{ value: '100', label: '100%' },
|
|
141
|
-
{ value: '125', label: '125%' },
|
|
142
|
-
{ value: '150', label: '150%' },
|
|
143
|
-
{ value: '200', label: '200%' },
|
|
144
|
-
];
|
|
145
|
-
const zoomModes = [
|
|
146
|
-
{ value: 'fit-page', label: 'Fit Page' },
|
|
147
|
-
{ value: 'fit-width', label: 'Fit Width' },
|
|
148
|
-
{ value: 'actual-size', label: 'Actual Size' },
|
|
149
|
-
];
|
|
150
|
-
zoomPresets.forEach(preset => {
|
|
151
|
-
const item = document.createElement('div');
|
|
152
|
-
item.className = 'udoc-dropdown-item';
|
|
153
|
-
item.dataset.zoomValue = preset.value;
|
|
154
|
-
item.textContent = preset.label;
|
|
155
|
-
this.zoomMenu.appendChild(item);
|
|
156
|
-
});
|
|
157
|
-
const divider = document.createElement('div');
|
|
158
|
-
divider.className = 'udoc-dropdown-divider';
|
|
159
|
-
this.zoomMenu.appendChild(divider);
|
|
160
|
-
zoomModes.forEach(mode => {
|
|
161
|
-
const item = document.createElement('div');
|
|
162
|
-
item.className = 'udoc-dropdown-item';
|
|
163
|
-
item.dataset.zoomMode = mode.value;
|
|
164
|
-
item.textContent = mode.label;
|
|
165
|
-
this.zoomMenu.appendChild(item);
|
|
166
|
-
});
|
|
167
|
-
zoomDropdown.append(zoomInputWrapper, this.zoomMenu);
|
|
168
|
-
this.zoomInBtn = document.createElement('button');
|
|
169
|
-
this.zoomInBtn.innerHTML = ICONS.zoomIn;
|
|
170
|
-
this.zoomInBtn.title = 'Zoom in';
|
|
171
|
-
this.zoomInBtn.disabled = true;
|
|
172
|
-
zoomGroup.append(this.zoomOutBtn, zoomDropdown, this.zoomInBtn);
|
|
173
|
-
zoomControls.appendChild(zoomGroup);
|
|
174
|
-
parent.appendChild(zoomControls);
|
|
175
|
-
}
|
|
176
|
-
createSettings(parent) {
|
|
177
|
-
// Separator before settings (part of settings wrapper for mobile hiding)
|
|
178
|
-
const settingsSep = this.createSeparator();
|
|
179
|
-
// Settings wrapper (hidden on mobile)
|
|
180
|
-
const settingsWrapper = document.createElement('div');
|
|
181
|
-
settingsWrapper.className = 'udoc-settings-wrapper';
|
|
182
|
-
settingsWrapper.style.cssText = 'display:contents;';
|
|
183
|
-
this.settingsBtn = document.createElement('button');
|
|
184
|
-
this.settingsBtn.className = 'udoc-settings-btn';
|
|
185
|
-
this.settingsBtn.innerHTML = ICONS.settings;
|
|
186
|
-
this.settingsBtn.title = 'View settings';
|
|
187
|
-
this.settingsBtn.disabled = true;
|
|
188
|
-
this.settingsPopover = document.createElement('div');
|
|
189
|
-
this.settingsPopover.className = 'udoc-settings-popover';
|
|
190
|
-
// Display Mode section
|
|
191
|
-
this.createDisplayModeSection();
|
|
192
|
-
// Layout Mode section
|
|
193
|
-
this.createLayoutModeSection();
|
|
194
|
-
// Rotation section
|
|
195
|
-
this.createRotationSection();
|
|
196
|
-
// Seamless section
|
|
197
|
-
this.createSeamlessSection();
|
|
198
|
-
// Settings wrapper contains separator + button + popover
|
|
199
|
-
const settingsInner = document.createElement('div');
|
|
200
|
-
settingsInner.style.cssText = 'position:relative;display:flex;align-items:center;';
|
|
201
|
-
settingsInner.append(this.settingsBtn, this.settingsPopover);
|
|
202
|
-
settingsWrapper.append(settingsSep, settingsInner);
|
|
203
|
-
parent.appendChild(settingsWrapper);
|
|
204
|
-
}
|
|
205
|
-
createDisplayModeSection() {
|
|
206
|
-
const displaySection = document.createElement('div');
|
|
207
|
-
displaySection.className = 'udoc-settings-section';
|
|
208
|
-
const displayLabel = document.createElement('div');
|
|
209
|
-
displayLabel.className = 'udoc-settings-label';
|
|
210
|
-
displayLabel.textContent = 'Display';
|
|
211
|
-
const displayOptions = document.createElement('div');
|
|
212
|
-
displayOptions.className = 'udoc-settings-options';
|
|
213
|
-
const displayMode = this.viewer.state.get('displayMode');
|
|
214
|
-
const displayModes = [
|
|
215
|
-
{ value: 'single', icon: ICONS.displaySingle, title: 'Single page' },
|
|
216
|
-
{ value: 'scroll', icon: ICONS.displayScroll, title: 'Continuous scroll' },
|
|
217
|
-
];
|
|
218
|
-
this.displayModeOptions = [];
|
|
219
|
-
displayModes.forEach(mode => {
|
|
220
|
-
const option = document.createElement('label');
|
|
221
|
-
option.className = 'udoc-settings-option';
|
|
222
|
-
option.dataset.displayMode = mode.value;
|
|
223
|
-
option.innerHTML = mode.icon;
|
|
224
|
-
option.title = mode.title;
|
|
225
|
-
if (mode.value === displayMode) {
|
|
226
|
-
option.classList.add('selected');
|
|
227
|
-
}
|
|
228
|
-
displayOptions.appendChild(option);
|
|
229
|
-
this.displayModeOptions.push(option);
|
|
230
|
-
});
|
|
231
|
-
displaySection.append(displayLabel, displayOptions);
|
|
232
|
-
this.settingsPopover.appendChild(displaySection);
|
|
233
|
-
}
|
|
234
|
-
createLayoutModeSection() {
|
|
235
|
-
const layoutSection = document.createElement('div');
|
|
236
|
-
layoutSection.className = 'udoc-settings-section';
|
|
237
|
-
const layoutLabel = document.createElement('div');
|
|
238
|
-
layoutLabel.className = 'udoc-settings-label';
|
|
239
|
-
layoutLabel.textContent = 'Layout';
|
|
240
|
-
const layoutOptions = document.createElement('div');
|
|
241
|
-
layoutOptions.className = 'udoc-settings-options';
|
|
242
|
-
const layoutMode = this.viewer.state.get('layoutMode');
|
|
243
|
-
const layoutModes = [
|
|
244
|
-
{ value: 'single', icon: ICONS.layout1up, title: '1-up' },
|
|
245
|
-
{ value: 'double', icon: ICONS.layout2up, title: '2-up' },
|
|
246
|
-
{ value: 'double-cover', icon: ICONS.layout2upCover, title: '2-up cover' },
|
|
247
|
-
{ value: 'grid', icon: ICONS.layoutGrid, title: 'Grid' },
|
|
248
|
-
];
|
|
249
|
-
this.layoutModeOptions = [];
|
|
250
|
-
layoutModes.forEach(mode => {
|
|
251
|
-
const option = document.createElement('label');
|
|
252
|
-
option.className = 'udoc-settings-option';
|
|
253
|
-
option.dataset.layoutMode = mode.value;
|
|
254
|
-
option.innerHTML = mode.icon;
|
|
255
|
-
option.title = mode.title;
|
|
256
|
-
if (mode.value === layoutMode) {
|
|
257
|
-
option.classList.add('selected');
|
|
258
|
-
}
|
|
259
|
-
layoutOptions.appendChild(option);
|
|
260
|
-
this.layoutModeOptions.push(option);
|
|
261
|
-
});
|
|
262
|
-
layoutSection.append(layoutLabel, layoutOptions);
|
|
263
|
-
this.settingsPopover.appendChild(layoutSection);
|
|
264
|
-
}
|
|
265
|
-
createRotationSection() {
|
|
266
|
-
const rotationSection = document.createElement('div');
|
|
267
|
-
rotationSection.className = 'udoc-settings-section';
|
|
268
|
-
const rotationLabel = document.createElement('div');
|
|
269
|
-
rotationLabel.className = 'udoc-settings-label';
|
|
270
|
-
rotationLabel.textContent = 'Rotation';
|
|
271
|
-
const rotationOptionsContainer = document.createElement('div');
|
|
272
|
-
rotationOptionsContainer.className = 'udoc-settings-options';
|
|
273
|
-
const rotation = this.viewer.state.get('rotation');
|
|
274
|
-
const rotations = [
|
|
275
|
-
{ value: 0, icon: ICONS.rotate0, title: '0°' },
|
|
276
|
-
{ value: 90, icon: ICONS.rotate90, title: '90°' },
|
|
277
|
-
{ value: 180, icon: ICONS.rotate180, title: '180°' },
|
|
278
|
-
{ value: 270, icon: ICONS.rotate270, title: '270°' },
|
|
279
|
-
];
|
|
280
|
-
this.rotationOptions = [];
|
|
281
|
-
rotations.forEach(rot => {
|
|
282
|
-
const option = document.createElement('label');
|
|
283
|
-
option.className = 'udoc-settings-option';
|
|
284
|
-
option.dataset.rotation = String(rot.value);
|
|
285
|
-
option.innerHTML = rot.icon;
|
|
286
|
-
option.title = rot.title;
|
|
287
|
-
if (rot.value === rotation) {
|
|
288
|
-
option.classList.add('selected');
|
|
289
|
-
}
|
|
290
|
-
rotationOptionsContainer.appendChild(option);
|
|
291
|
-
this.rotationOptions.push(option);
|
|
292
|
-
});
|
|
293
|
-
rotationSection.append(rotationLabel, rotationOptionsContainer);
|
|
294
|
-
this.settingsPopover.appendChild(rotationSection);
|
|
295
|
-
}
|
|
296
|
-
createSeamlessSection() {
|
|
297
|
-
const seamlessSection = document.createElement('div');
|
|
298
|
-
seamlessSection.className = 'udoc-settings-section';
|
|
299
|
-
const seamlessLabel = document.createElement('div');
|
|
300
|
-
seamlessLabel.className = 'udoc-settings-label';
|
|
301
|
-
seamlessLabel.textContent = 'Gaps';
|
|
302
|
-
const seamlessOptionsContainer = document.createElement('div');
|
|
303
|
-
seamlessOptionsContainer.className = 'udoc-settings-options';
|
|
304
|
-
const seamless = this.viewer.state.get('seamless');
|
|
305
|
-
const seamlessModes = [
|
|
306
|
-
{ value: false, icon: ICONS.seamlessOff, title: 'Show gaps' },
|
|
307
|
-
{ value: true, icon: ICONS.seamlessOn, title: 'No gaps' },
|
|
308
|
-
];
|
|
309
|
-
this.seamlessOptions = [];
|
|
310
|
-
seamlessModes.forEach(mode => {
|
|
311
|
-
const option = document.createElement('label');
|
|
312
|
-
option.className = 'udoc-settings-option';
|
|
313
|
-
option.dataset.seamless = String(mode.value);
|
|
314
|
-
option.innerHTML = mode.icon;
|
|
315
|
-
option.title = mode.title;
|
|
316
|
-
if (mode.value === seamless) {
|
|
317
|
-
option.classList.add('selected');
|
|
318
|
-
}
|
|
319
|
-
seamlessOptionsContainer.appendChild(option);
|
|
320
|
-
this.seamlessOptions.push(option);
|
|
321
|
-
});
|
|
322
|
-
seamlessSection.append(seamlessLabel, seamlessOptionsContainer);
|
|
323
|
-
this.settingsPopover.appendChild(seamlessSection);
|
|
324
|
-
}
|
|
325
|
-
createSeparator() {
|
|
326
|
-
const sep = document.createElement('div');
|
|
327
|
-
sep.className = 'udoc-separator';
|
|
328
|
-
return sep;
|
|
329
|
-
}
|
|
330
|
-
bindEvents() {
|
|
331
|
-
// Tool dropdown button
|
|
332
|
-
this.addEventListener(this.toolDropdownBtn, 'click', (e) => {
|
|
333
|
-
e.stopPropagation();
|
|
334
|
-
this.closeAllDropdowns();
|
|
335
|
-
this.toolMenu?.classList.toggle('open');
|
|
336
|
-
});
|
|
337
|
-
// Tool menu items
|
|
338
|
-
this.addEventListener(this.toolMenu, 'click', (e) => {
|
|
339
|
-
const target = e.target;
|
|
340
|
-
const item = target.closest('.udoc-tool-item');
|
|
341
|
-
if (!item)
|
|
342
|
-
return;
|
|
343
|
-
const tool = item.dataset.tool;
|
|
344
|
-
if (tool) {
|
|
345
|
-
this.viewer.setActiveTool(tool);
|
|
346
|
-
}
|
|
347
|
-
this.toolMenu?.classList.remove('open');
|
|
348
|
-
});
|
|
349
|
-
// Pagination
|
|
350
|
-
this.addEventListener(this.prevBtn, 'click', () => this.viewer.prevPage());
|
|
351
|
-
this.addEventListener(this.nextBtn, 'click', () => this.viewer.nextPage());
|
|
352
|
-
this.addEventListener(this.pageInput, 'keydown', (e) => {
|
|
353
|
-
if (e.key === 'Enter') {
|
|
354
|
-
const page = parseInt(this.pageInput.value, 10);
|
|
355
|
-
if (!isNaN(page)) {
|
|
356
|
-
this.viewer.goToPage(page - 1);
|
|
357
|
-
}
|
|
358
|
-
this.pageInput.blur();
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
this.addEventListener(this.pageInput, 'blur', () => {
|
|
362
|
-
const currentPage = this.viewer.state.get('currentPage');
|
|
363
|
-
if (this.pageInput) {
|
|
364
|
-
this.pageInput.value = String(currentPage + 1);
|
|
365
|
-
}
|
|
366
|
-
});
|
|
367
|
-
// Zoom buttons
|
|
368
|
-
this.addEventListener(this.zoomOutBtn, 'click', () => this.viewer.zoomOut());
|
|
369
|
-
this.addEventListener(this.zoomInBtn, 'click', () => this.viewer.zoomIn());
|
|
370
|
-
// Zoom input
|
|
371
|
-
this.addEventListener(this.zoomInput, 'keydown', (e) => {
|
|
372
|
-
if (e.key === 'Enter') {
|
|
373
|
-
const value = parseInt(this.zoomInput.value.replace('%', ''), 10);
|
|
374
|
-
if (!isNaN(value) && value > 0) {
|
|
375
|
-
this.viewer.setZoom(value / 100);
|
|
376
|
-
}
|
|
377
|
-
this.zoomInput.blur();
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
this.addEventListener(this.zoomInput, 'blur', () => {
|
|
381
|
-
this.updateZoomDisplay();
|
|
382
|
-
});
|
|
383
|
-
// Zoom dropdown button
|
|
384
|
-
this.addEventListener(this.zoomDropdownBtn, 'click', (e) => {
|
|
385
|
-
e.stopPropagation();
|
|
386
|
-
this.closeAllDropdowns();
|
|
387
|
-
this.zoomMenu?.classList.toggle('open');
|
|
388
|
-
});
|
|
389
|
-
// Zoom menu items
|
|
390
|
-
this.addEventListener(this.zoomMenu, 'click', (e) => {
|
|
391
|
-
const target = e.target;
|
|
392
|
-
const item = target.closest('.udoc-dropdown-item');
|
|
393
|
-
if (!item)
|
|
394
|
-
return;
|
|
395
|
-
if (item.dataset.zoomValue) {
|
|
396
|
-
const value = parseInt(item.dataset.zoomValue, 10);
|
|
397
|
-
this.viewer.setZoom(value / 100);
|
|
398
|
-
}
|
|
399
|
-
else if (item.dataset.zoomMode) {
|
|
400
|
-
this.viewer.setZoomMode(item.dataset.zoomMode);
|
|
401
|
-
}
|
|
402
|
-
this.zoomMenu?.classList.remove('open');
|
|
403
|
-
});
|
|
404
|
-
// Settings button
|
|
405
|
-
this.addEventListener(this.settingsBtn, 'click', (e) => {
|
|
406
|
-
e.stopPropagation();
|
|
407
|
-
this.closeAllDropdowns();
|
|
408
|
-
this.settingsPopover?.classList.toggle('open');
|
|
409
|
-
});
|
|
410
|
-
// Display mode options
|
|
411
|
-
this.displayModeOptions.forEach(option => {
|
|
412
|
-
this.addEventListener(option, 'click', () => {
|
|
413
|
-
const mode = option.dataset.displayMode;
|
|
414
|
-
if (mode)
|
|
415
|
-
this.viewer.setDisplayMode(mode);
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
// Layout mode options
|
|
419
|
-
this.layoutModeOptions.forEach(option => {
|
|
420
|
-
this.addEventListener(option, 'click', () => {
|
|
421
|
-
const mode = option.dataset.layoutMode;
|
|
422
|
-
if (mode)
|
|
423
|
-
this.viewer.setLayoutMode(mode);
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
// Rotation options
|
|
427
|
-
this.rotationOptions.forEach(option => {
|
|
428
|
-
this.addEventListener(option, 'click', () => {
|
|
429
|
-
const value = parseInt(option.dataset.rotation || '0', 10);
|
|
430
|
-
this.viewer.setRotation(value);
|
|
431
|
-
});
|
|
432
|
-
});
|
|
433
|
-
// Seamless options
|
|
434
|
-
this.seamlessOptions.forEach(option => {
|
|
435
|
-
this.addEventListener(option, 'click', () => {
|
|
436
|
-
const value = option.dataset.seamless === 'true';
|
|
437
|
-
this.viewer.setSeamless(value);
|
|
438
|
-
});
|
|
439
|
-
});
|
|
440
|
-
// Click outside to close dropdowns
|
|
441
|
-
this.addEventListener(document, 'click', (e) => {
|
|
442
|
-
const target = e.target;
|
|
443
|
-
if (!target.closest('.udoc-zoom-dropdown') &&
|
|
444
|
-
!target.closest('.udoc-settings-popover') &&
|
|
445
|
-
!target.closest('.udoc-tool-dropdown')) {
|
|
446
|
-
this.closeAllDropdowns();
|
|
447
|
-
}
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
subscribeToState() {
|
|
451
|
-
// Subscribe to page count changes
|
|
452
|
-
this.subscribe('pageCount', (count) => {
|
|
453
|
-
if (this.pageCountEl) {
|
|
454
|
-
this.pageCountEl.textContent = String(count);
|
|
455
|
-
}
|
|
456
|
-
this.updateControlsEnabled(count > 0);
|
|
457
|
-
});
|
|
458
|
-
// Subscribe to current page changes
|
|
459
|
-
this.subscribe('currentPage', (page) => {
|
|
460
|
-
if (this.pageInput) {
|
|
461
|
-
this.pageInput.value = String(page + 1);
|
|
462
|
-
}
|
|
463
|
-
this.updateNavigationButtons();
|
|
464
|
-
});
|
|
465
|
-
// Subscribe to zoom changes
|
|
466
|
-
this.subscribe('zoom', () => {
|
|
467
|
-
this.updateZoomDisplay();
|
|
468
|
-
});
|
|
469
|
-
// Subscribe to zoomMode changes
|
|
470
|
-
this.subscribe('zoomMode', () => {
|
|
471
|
-
this.updateZoomDisplay();
|
|
472
|
-
});
|
|
473
|
-
// Subscribe to activeTool changes
|
|
474
|
-
this.subscribe('activeTool', (tool) => {
|
|
475
|
-
this.updateToolDisplay(tool);
|
|
476
|
-
});
|
|
477
|
-
// Subscribe to displayMode changes
|
|
478
|
-
this.subscribe('displayMode', (mode) => {
|
|
479
|
-
this.displayModeOptions.forEach(option => {
|
|
480
|
-
option.classList.toggle('selected', option.dataset.displayMode === mode);
|
|
481
|
-
});
|
|
482
|
-
});
|
|
483
|
-
// Subscribe to layoutMode changes
|
|
484
|
-
this.subscribe('layoutMode', (mode) => {
|
|
485
|
-
this.layoutModeOptions.forEach(option => {
|
|
486
|
-
option.classList.toggle('selected', option.dataset.layoutMode === mode);
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
// Subscribe to rotation changes
|
|
490
|
-
this.subscribe('rotation', (rotation) => {
|
|
491
|
-
this.rotationOptions.forEach(option => {
|
|
492
|
-
option.classList.toggle('selected', option.dataset.rotation === String(rotation));
|
|
493
|
-
});
|
|
494
|
-
});
|
|
495
|
-
// Subscribe to seamless changes
|
|
496
|
-
this.subscribe('seamless', (seamless) => {
|
|
497
|
-
this.seamlessOptions.forEach(option => {
|
|
498
|
-
option.classList.toggle('selected', option.dataset.seamless === String(seamless));
|
|
499
|
-
});
|
|
500
|
-
});
|
|
501
|
-
// Subscribe to isLoaded to enable/disable controls
|
|
502
|
-
this.subscribe('isLoaded', (isLoaded) => {
|
|
503
|
-
this.updateControlsEnabled(isLoaded);
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
updateControlsEnabled(enabled) {
|
|
507
|
-
if (this.prevBtn)
|
|
508
|
-
this.prevBtn.disabled = !enabled;
|
|
509
|
-
if (this.nextBtn)
|
|
510
|
-
this.nextBtn.disabled = !enabled;
|
|
511
|
-
if (this.pageInput)
|
|
512
|
-
this.pageInput.disabled = !enabled;
|
|
513
|
-
if (this.zoomOutBtn)
|
|
514
|
-
this.zoomOutBtn.disabled = !enabled;
|
|
515
|
-
if (this.zoomInBtn)
|
|
516
|
-
this.zoomInBtn.disabled = !enabled;
|
|
517
|
-
if (this.zoomInput)
|
|
518
|
-
this.zoomInput.disabled = !enabled;
|
|
519
|
-
if (this.zoomDropdownBtn)
|
|
520
|
-
this.zoomDropdownBtn.disabled = !enabled;
|
|
521
|
-
if (this.settingsBtn)
|
|
522
|
-
this.settingsBtn.disabled = !enabled;
|
|
523
|
-
// Update navigation buttons based on current page
|
|
524
|
-
if (enabled) {
|
|
525
|
-
this.updateNavigationButtons();
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
updateNavigationButtons() {
|
|
529
|
-
const currentPage = this.viewer.state.get('currentPage');
|
|
530
|
-
const pageCount = this.viewer.state.get('pageCount');
|
|
531
|
-
const isLoaded = this.viewer.state.get('isLoaded');
|
|
532
|
-
if (!isLoaded || pageCount === 0)
|
|
533
|
-
return;
|
|
534
|
-
if (this.prevBtn) {
|
|
535
|
-
this.prevBtn.disabled = currentPage <= 0;
|
|
536
|
-
}
|
|
537
|
-
if (this.nextBtn) {
|
|
538
|
-
this.nextBtn.disabled = currentPage >= pageCount - 1;
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
updateZoomDisplay() {
|
|
542
|
-
const zoom = this.viewer.state.get('zoom');
|
|
543
|
-
const zoomMode = this.viewer.state.get('zoomMode');
|
|
544
|
-
// Always show the percentage in the input
|
|
545
|
-
if (this.zoomInput) {
|
|
546
|
-
this.zoomInput.value = `${Math.round(zoom * 100)}%`;
|
|
547
|
-
}
|
|
548
|
-
// Update zoom menu selection
|
|
549
|
-
if (this.zoomMenu) {
|
|
550
|
-
const items = this.zoomMenu.querySelectorAll('.udoc-dropdown-item');
|
|
551
|
-
const zoomPercent = Math.round(zoom * 100);
|
|
552
|
-
items.forEach(item => {
|
|
553
|
-
const el = item;
|
|
554
|
-
const isZoomValue = el.dataset.zoomValue === String(zoomPercent);
|
|
555
|
-
const isZoomMode = el.dataset.zoomMode === zoomMode;
|
|
556
|
-
el.classList.toggle('selected', isZoomValue || isZoomMode);
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
updateToolDisplay(tool) {
|
|
561
|
-
const toolConfig = FloatingBar.TOOLS.find(t => t.id === tool) || FloatingBar.TOOLS[0];
|
|
562
|
-
// Update dropdown button icon
|
|
563
|
-
if (this.toolDropdownBtn) {
|
|
564
|
-
this.toolDropdownBtn.innerHTML = `${toolConfig.icon}<span class="udoc-tool-chevron">${ICONS.chevronDown}</span>`;
|
|
565
|
-
this.toolDropdownBtn.title = `${toolConfig.label} (${toolConfig.shortcut})`;
|
|
566
|
-
}
|
|
567
|
-
// Update menu selection
|
|
568
|
-
this.toolItems.forEach((item, id) => {
|
|
569
|
-
item.classList.toggle('selected', id === tool);
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
closeAllDropdowns() {
|
|
573
|
-
this.toolMenu?.classList.remove('open');
|
|
574
|
-
this.zoomMenu?.classList.remove('open');
|
|
575
|
-
this.settingsPopover?.classList.remove('open');
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* Close all open dropdown menus.
|
|
579
|
-
* Can be called from the viewer when other menus are opened.
|
|
580
|
-
*/
|
|
581
|
-
closeDropdowns() {
|
|
582
|
-
this.closeAllDropdowns();
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
//# sourceMappingURL=FloatingBar.js.map
|