@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.
Files changed (263) hide show
  1. package/dist/wasm/udoc_bg.wasm +0 -0
  2. package/dist/worker/WorkerClient.js +1 -1
  3. package/package.json +11 -3
  4. package/dist/WorkerClient.d.ts +0 -36
  5. package/dist/WorkerClient.d.ts.map +0 -1
  6. package/dist/WorkerClient.js +0 -121
  7. package/dist/WorkerClient.js.map +0 -1
  8. package/dist/annotation/AnnotationLayer.d.ts +0 -166
  9. package/dist/annotation/AnnotationLayer.d.ts.map +0 -1
  10. package/dist/annotation/AnnotationLayer.js +0 -1090
  11. package/dist/annotation/AnnotationLayer.js.map +0 -1
  12. package/dist/annotation/index.d.ts +0 -6
  13. package/dist/annotation/index.d.ts.map +0 -1
  14. package/dist/annotation/index.js +0 -6
  15. package/dist/annotation/index.js.map +0 -1
  16. package/dist/components/FloatingBar.d.ts +0 -102
  17. package/dist/components/FloatingBar.d.ts.map +0 -1
  18. package/dist/components/FloatingBar.js +0 -513
  19. package/dist/components/FloatingBar.js.map +0 -1
  20. package/dist/components/Header.d.ts +0 -46
  21. package/dist/components/Header.d.ts.map +0 -1
  22. package/dist/components/Header.js +0 -93
  23. package/dist/components/Header.js.map +0 -1
  24. package/dist/components/index.d.ts +0 -6
  25. package/dist/components/index.d.ts.map +0 -1
  26. package/dist/components/index.js +0 -4
  27. package/dist/components/index.js.map +0 -1
  28. package/dist/components/panels/CommentsPanel.d.ts +0 -33
  29. package/dist/components/panels/CommentsPanel.d.ts.map +0 -1
  30. package/dist/components/panels/CommentsPanel.js +0 -176
  31. package/dist/components/panels/CommentsPanel.js.map +0 -1
  32. package/dist/components/panels/OutlinePanel.d.ts +0 -30
  33. package/dist/components/panels/OutlinePanel.d.ts.map +0 -1
  34. package/dist/components/panels/OutlinePanel.js +0 -144
  35. package/dist/components/panels/OutlinePanel.js.map +0 -1
  36. package/dist/components/panels/ThumbnailsPanel.d.ts +0 -51
  37. package/dist/components/panels/ThumbnailsPanel.d.ts.map +0 -1
  38. package/dist/components/panels/ThumbnailsPanel.js +0 -160
  39. package/dist/components/panels/ThumbnailsPanel.js.map +0 -1
  40. package/dist/components/panels/index.d.ts +0 -7
  41. package/dist/components/panels/index.d.ts.map +0 -1
  42. package/dist/components/panels/index.js +0 -4
  43. package/dist/components/panels/index.js.map +0 -1
  44. package/dist/constants.d.ts +0 -25
  45. package/dist/constants.d.ts.map +0 -1
  46. package/dist/constants.js +0 -46
  47. package/dist/constants.js.map +0 -1
  48. package/dist/core/NavigationController.d.ts +0 -54
  49. package/dist/core/NavigationController.d.ts.map +0 -1
  50. package/dist/core/NavigationController.js +0 -145
  51. package/dist/core/NavigationController.js.map +0 -1
  52. package/dist/core/PerfTimer.d.ts +0 -12
  53. package/dist/core/PerfTimer.d.ts.map +0 -1
  54. package/dist/core/PerfTimer.js +0 -32
  55. package/dist/core/PerfTimer.js.map +0 -1
  56. package/dist/core/ViewerState.d.ts +0 -108
  57. package/dist/core/ViewerState.d.ts.map +0 -1
  58. package/dist/core/ViewerState.js +0 -179
  59. package/dist/core/ViewerState.js.map +0 -1
  60. package/dist/core/constants.d.ts +0 -24
  61. package/dist/core/constants.d.ts.map +0 -1
  62. package/dist/core/constants.js +0 -42
  63. package/dist/core/constants.js.map +0 -1
  64. package/dist/core/index.d.ts +0 -8
  65. package/dist/core/index.d.ts.map +0 -1
  66. package/dist/core/index.js +0 -11
  67. package/dist/core/index.js.map +0 -1
  68. package/dist/core/types.d.ts +0 -573
  69. package/dist/core/types.d.ts.map +0 -1
  70. package/dist/core/types.js +0 -5
  71. package/dist/core/types.js.map +0 -1
  72. package/dist/icons/icons.d.ts +0 -41
  73. package/dist/icons/icons.d.ts.map +0 -1
  74. package/dist/icons/icons.js +0 -51
  75. package/dist/icons/icons.js.map +0 -1
  76. package/dist/icons/index.d.ts +0 -3
  77. package/dist/icons/index.d.ts.map +0 -1
  78. package/dist/icons/index.js +0 -2
  79. package/dist/icons/index.js.map +0 -1
  80. package/dist/layout/BandManager.d.ts +0 -87
  81. package/dist/layout/BandManager.d.ts.map +0 -1
  82. package/dist/layout/BandManager.js +0 -185
  83. package/dist/layout/BandManager.js.map +0 -1
  84. package/dist/layout/LayoutCalculator.d.ts +0 -42
  85. package/dist/layout/LayoutCalculator.d.ts.map +0 -1
  86. package/dist/layout/LayoutCalculator.js +0 -180
  87. package/dist/layout/LayoutCalculator.js.map +0 -1
  88. package/dist/layout/LayoutState.d.ts +0 -46
  89. package/dist/layout/LayoutState.d.ts.map +0 -1
  90. package/dist/layout/LayoutState.js +0 -109
  91. package/dist/layout/LayoutState.js.map +0 -1
  92. package/dist/layout/TransitionCoordinator.d.ts +0 -11
  93. package/dist/layout/TransitionCoordinator.d.ts.map +0 -1
  94. package/dist/layout/TransitionCoordinator.js +0 -22
  95. package/dist/layout/TransitionCoordinator.js.map +0 -1
  96. package/dist/layout/index.d.ts +0 -7
  97. package/dist/layout/index.d.ts.map +0 -1
  98. package/dist/layout/index.js +0 -4
  99. package/dist/layout/index.js.map +0 -1
  100. package/dist/rendering/BandManager.d.ts +0 -87
  101. package/dist/rendering/BandManager.d.ts.map +0 -1
  102. package/dist/rendering/BandManager.js +0 -185
  103. package/dist/rendering/BandManager.js.map +0 -1
  104. package/dist/rendering/PageCache.d.ts +0 -75
  105. package/dist/rendering/PageCache.d.ts.map +0 -1
  106. package/dist/rendering/PageCache.js +0 -122
  107. package/dist/rendering/PageCache.js.map +0 -1
  108. package/dist/rendering/RenderQueue.d.ts +0 -75
  109. package/dist/rendering/RenderQueue.d.ts.map +0 -1
  110. package/dist/rendering/RenderQueue.js +0 -105
  111. package/dist/rendering/RenderQueue.js.map +0 -1
  112. package/dist/rendering/ThumbnailQueue.d.ts +0 -57
  113. package/dist/rendering/ThumbnailQueue.d.ts.map +0 -1
  114. package/dist/rendering/ThumbnailQueue.js +0 -85
  115. package/dist/rendering/ThumbnailQueue.js.map +0 -1
  116. package/dist/rendering/index.d.ts +0 -13
  117. package/dist/rendering/index.d.ts.map +0 -1
  118. package/dist/rendering/index.js +0 -10
  119. package/dist/rendering/index.js.map +0 -1
  120. package/dist/rendering/types.d.ts +0 -72
  121. package/dist/rendering/types.d.ts.map +0 -1
  122. package/dist/rendering/types.js +0 -5
  123. package/dist/rendering/types.js.map +0 -1
  124. package/dist/styles/index.d.ts +0 -6
  125. package/dist/styles/index.d.ts.map +0 -1
  126. package/dist/styles/index.js +0 -1221
  127. package/dist/styles/index.js.map +0 -1
  128. package/dist/types.d.ts +0 -6
  129. package/dist/types.d.ts.map +0 -1
  130. package/dist/types.js +0 -6
  131. package/dist/types.js.map +0 -1
  132. package/dist/ui/Component.d.ts +0 -127
  133. package/dist/ui/Component.d.ts.map +0 -1
  134. package/dist/ui/Component.js +0 -201
  135. package/dist/ui/Component.js.map +0 -1
  136. package/dist/ui/annotation/AnnotationLayer.d.ts +0 -90
  137. package/dist/ui/annotation/AnnotationLayer.d.ts.map +0 -1
  138. package/dist/ui/annotation/AnnotationLayer.js +0 -322
  139. package/dist/ui/annotation/AnnotationLayer.js.map +0 -1
  140. package/dist/ui/annotation/LinkRenderer.d.ts +0 -32
  141. package/dist/ui/annotation/LinkRenderer.d.ts.map +0 -1
  142. package/dist/ui/annotation/LinkRenderer.js +0 -74
  143. package/dist/ui/annotation/LinkRenderer.js.map +0 -1
  144. package/dist/ui/annotation/MarkupRenderer.d.ts +0 -40
  145. package/dist/ui/annotation/MarkupRenderer.d.ts.map +0 -1
  146. package/dist/ui/annotation/MarkupRenderer.js +0 -154
  147. package/dist/ui/annotation/MarkupRenderer.js.map +0 -1
  148. package/dist/ui/annotation/ShapeRenderer.d.ts +0 -46
  149. package/dist/ui/annotation/ShapeRenderer.d.ts.map +0 -1
  150. package/dist/ui/annotation/ShapeRenderer.js +0 -376
  151. package/dist/ui/annotation/ShapeRenderer.js.map +0 -1
  152. package/dist/ui/annotation/TextRenderer.d.ts +0 -36
  153. package/dist/ui/annotation/TextRenderer.d.ts.map +0 -1
  154. package/dist/ui/annotation/TextRenderer.js +0 -199
  155. package/dist/ui/annotation/TextRenderer.js.map +0 -1
  156. package/dist/ui/annotation/index.d.ts +0 -17
  157. package/dist/ui/annotation/index.d.ts.map +0 -1
  158. package/dist/ui/annotation/index.js +0 -13
  159. package/dist/ui/annotation/index.js.map +0 -1
  160. package/dist/ui/annotation/utils.d.ts +0 -40
  161. package/dist/ui/annotation/utils.d.ts.map +0 -1
  162. package/dist/ui/annotation/utils.js +0 -62
  163. package/dist/ui/annotation/utils.js.map +0 -1
  164. package/dist/ui/components/CommentsContent.d.ts +0 -35
  165. package/dist/ui/components/CommentsContent.d.ts.map +0 -1
  166. package/dist/ui/components/CommentsContent.js +0 -203
  167. package/dist/ui/components/CommentsContent.js.map +0 -1
  168. package/dist/ui/components/FloatingBar.d.ts +0 -55
  169. package/dist/ui/components/FloatingBar.d.ts.map +0 -1
  170. package/dist/ui/components/FloatingBar.js +0 -585
  171. package/dist/ui/components/FloatingBar.js.map +0 -1
  172. package/dist/ui/components/Header.d.ts +0 -29
  173. package/dist/ui/components/Header.d.ts.map +0 -1
  174. package/dist/ui/components/Header.js +0 -127
  175. package/dist/ui/components/Header.js.map +0 -1
  176. package/dist/ui/components/LeftPanel.d.ts +0 -54
  177. package/dist/ui/components/LeftPanel.d.ts.map +0 -1
  178. package/dist/ui/components/LeftPanel.js +0 -202
  179. package/dist/ui/components/LeftPanel.js.map +0 -1
  180. package/dist/ui/components/OutlineContent.d.ts +0 -34
  181. package/dist/ui/components/OutlineContent.d.ts.map +0 -1
  182. package/dist/ui/components/OutlineContent.js +0 -147
  183. package/dist/ui/components/OutlineContent.js.map +0 -1
  184. package/dist/ui/components/RightPanel.d.ts +0 -52
  185. package/dist/ui/components/RightPanel.d.ts.map +0 -1
  186. package/dist/ui/components/RightPanel.js +0 -142
  187. package/dist/ui/components/RightPanel.js.map +0 -1
  188. package/dist/ui/components/Viewport.d.ts +0 -70
  189. package/dist/ui/components/Viewport.d.ts.map +0 -1
  190. package/dist/ui/components/Viewport.js +0 -173
  191. package/dist/ui/components/Viewport.js.map +0 -1
  192. package/dist/ui/components/index.d.ts +0 -11
  193. package/dist/ui/components/index.d.ts.map +0 -1
  194. package/dist/ui/components/index.js +0 -10
  195. package/dist/ui/components/index.js.map +0 -1
  196. package/dist/ui/icons/icons.d.ts +0 -43
  197. package/dist/ui/icons/icons.d.ts.map +0 -1
  198. package/dist/ui/icons/icons.js +0 -46
  199. package/dist/ui/icons/icons.js.map +0 -1
  200. package/dist/ui/icons/index.d.ts +0 -11
  201. package/dist/ui/icons/index.d.ts.map +0 -1
  202. package/dist/ui/icons/index.js +0 -18
  203. package/dist/ui/icons/index.js.map +0 -1
  204. package/dist/ui/index.d.ts +0 -7
  205. package/dist/ui/index.d.ts.map +0 -1
  206. package/dist/ui/index.js +0 -9
  207. package/dist/ui/index.js.map +0 -1
  208. package/dist/ui/styles/base.css.d.ts +0 -5
  209. package/dist/ui/styles/base.css.d.ts.map +0 -1
  210. package/dist/ui/styles/base.css.js +0 -49
  211. package/dist/ui/styles/base.css.js.map +0 -1
  212. package/dist/ui/styles/floating-bar.css.d.ts +0 -5
  213. package/dist/ui/styles/floating-bar.css.d.ts.map +0 -1
  214. package/dist/ui/styles/floating-bar.css.js +0 -417
  215. package/dist/ui/styles/floating-bar.css.js.map +0 -1
  216. package/dist/ui/styles/header.css.d.ts +0 -5
  217. package/dist/ui/styles/header.css.d.ts.map +0 -1
  218. package/dist/ui/styles/header.css.js +0 -49
  219. package/dist/ui/styles/header.css.js.map +0 -1
  220. package/dist/ui/styles/index.d.ts +0 -21
  221. package/dist/ui/styles/index.d.ts.map +0 -1
  222. package/dist/ui/styles/index.js +0 -48
  223. package/dist/ui/styles/index.js.map +0 -1
  224. package/dist/ui/styles/panels.css.d.ts +0 -5
  225. package/dist/ui/styles/panels.css.d.ts.map +0 -1
  226. package/dist/ui/styles/panels.css.js +0 -446
  227. package/dist/ui/styles/panels.css.js.map +0 -1
  228. package/dist/ui/styles/responsive.css.d.ts +0 -5
  229. package/dist/ui/styles/responsive.css.d.ts.map +0 -1
  230. package/dist/ui/styles/responsive.css.js +0 -201
  231. package/dist/ui/styles/responsive.css.js.map +0 -1
  232. package/dist/ui/styles/variables.css.d.ts +0 -6
  233. package/dist/ui/styles/variables.css.d.ts.map +0 -1
  234. package/dist/ui/styles/variables.css.js +0 -75
  235. package/dist/ui/styles/variables.css.js.map +0 -1
  236. package/dist/ui/styles/viewport.css.d.ts +0 -5
  237. package/dist/ui/styles/viewport.css.d.ts.map +0 -1
  238. package/dist/ui/styles/viewport.css.js +0 -87
  239. package/dist/ui/styles/viewport.css.js.map +0 -1
  240. package/dist/view/LayoutCalculator.d.ts +0 -42
  241. package/dist/view/LayoutCalculator.d.ts.map +0 -1
  242. package/dist/view/LayoutCalculator.js +0 -180
  243. package/dist/view/LayoutCalculator.js.map +0 -1
  244. package/dist/view/TransitionCoordinator.d.ts +0 -11
  245. package/dist/view/TransitionCoordinator.d.ts.map +0 -1
  246. package/dist/view/TransitionCoordinator.js +0 -22
  247. package/dist/view/TransitionCoordinator.js.map +0 -1
  248. package/dist/view/ViewState.d.ts +0 -46
  249. package/dist/view/ViewState.d.ts.map +0 -1
  250. package/dist/view/ViewState.js +0 -109
  251. package/dist/view/ViewState.js.map +0 -1
  252. package/dist/view/index.d.ts +0 -7
  253. package/dist/view/index.d.ts.map +0 -1
  254. package/dist/view/index.js +0 -4
  255. package/dist/view/index.js.map +0 -1
  256. package/dist/worker/types.d.ts +0 -81
  257. package/dist/worker/types.d.ts.map +0 -1
  258. package/dist/worker/types.js +0 -6
  259. package/dist/worker/types.js.map +0 -1
  260. package/dist/worker.d.ts +0 -2
  261. package/dist/worker.d.ts.map +0 -1
  262. package/dist/worker.js +0 -205
  263. 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