@docmentis/udoc-viewer 0.6.10 → 0.6.12

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 (164) hide show
  1. package/README.md +3 -2
  2. package/dist/package.json +15 -9
  3. package/dist/src/UDocClient.d.ts +21 -0
  4. package/dist/src/UDocClient.d.ts.map +1 -1
  5. package/dist/src/UDocClient.js +1 -1
  6. package/dist/src/UDocClient.js.map +1 -1
  7. package/dist/src/UDocViewer.d.ts.map +1 -1
  8. package/dist/src/UDocViewer.js +4 -2
  9. package/dist/src/UDocViewer.js.map +1 -1
  10. package/dist/src/index.d.ts +3 -0
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +1 -0
  13. package/dist/src/index.js.map +1 -1
  14. package/dist/src/ui/viewer/a11y.d.ts +26 -0
  15. package/dist/src/ui/viewer/a11y.d.ts.map +1 -0
  16. package/dist/src/ui/viewer/a11y.js +116 -0
  17. package/dist/src/ui/viewer/a11y.js.map +1 -0
  18. package/dist/src/ui/viewer/components/AnnotationPanel.d.ts +2 -1
  19. package/dist/src/ui/viewer/components/AnnotationPanel.d.ts.map +1 -1
  20. package/dist/src/ui/viewer/components/AnnotationPanel.js +11 -9
  21. package/dist/src/ui/viewer/components/AnnotationPanel.js.map +1 -1
  22. package/dist/src/ui/viewer/components/FloatingToolbar.d.ts +2 -1
  23. package/dist/src/ui/viewer/components/FloatingToolbar.d.ts.map +1 -1
  24. package/dist/src/ui/viewer/components/FloatingToolbar.js +50 -7
  25. package/dist/src/ui/viewer/components/FloatingToolbar.js.map +1 -1
  26. package/dist/src/ui/viewer/components/LayersPanel.d.ts +2 -1
  27. package/dist/src/ui/viewer/components/LayersPanel.d.ts.map +1 -1
  28. package/dist/src/ui/viewer/components/LayersPanel.js +10 -4
  29. package/dist/src/ui/viewer/components/LayersPanel.js.map +1 -1
  30. package/dist/src/ui/viewer/components/LeftPanel.d.ts +2 -1
  31. package/dist/src/ui/viewer/components/LeftPanel.d.ts.map +1 -1
  32. package/dist/src/ui/viewer/components/LeftPanel.js +58 -5
  33. package/dist/src/ui/viewer/components/LeftPanel.js.map +1 -1
  34. package/dist/src/ui/viewer/components/LoadingOverlay.d.ts +2 -1
  35. package/dist/src/ui/viewer/components/LoadingOverlay.d.ts.map +1 -1
  36. package/dist/src/ui/viewer/components/LoadingOverlay.js +132 -17
  37. package/dist/src/ui/viewer/components/LoadingOverlay.js.map +1 -1
  38. package/dist/src/ui/viewer/components/OutlinePanel.d.ts +2 -1
  39. package/dist/src/ui/viewer/components/OutlinePanel.d.ts.map +1 -1
  40. package/dist/src/ui/viewer/components/OutlinePanel.js +141 -3
  41. package/dist/src/ui/viewer/components/OutlinePanel.js.map +1 -1
  42. package/dist/src/ui/viewer/components/PasswordDialog.d.ts +2 -1
  43. package/dist/src/ui/viewer/components/PasswordDialog.d.ts.map +1 -1
  44. package/dist/src/ui/viewer/components/PasswordDialog.js +46 -10
  45. package/dist/src/ui/viewer/components/PasswordDialog.js.map +1 -1
  46. package/dist/src/ui/viewer/components/PrintDialog.d.ts +2 -1
  47. package/dist/src/ui/viewer/components/PrintDialog.d.ts.map +1 -1
  48. package/dist/src/ui/viewer/components/PrintDialog.js +77 -8
  49. package/dist/src/ui/viewer/components/PrintDialog.js.map +1 -1
  50. package/dist/src/ui/viewer/components/RightPanel.d.ts +2 -1
  51. package/dist/src/ui/viewer/components/RightPanel.d.ts.map +1 -1
  52. package/dist/src/ui/viewer/components/RightPanel.js +37 -3
  53. package/dist/src/ui/viewer/components/RightPanel.js.map +1 -1
  54. package/dist/src/ui/viewer/components/SearchPanel.d.ts +2 -1
  55. package/dist/src/ui/viewer/components/SearchPanel.d.ts.map +1 -1
  56. package/dist/src/ui/viewer/components/SearchPanel.js +31 -7
  57. package/dist/src/ui/viewer/components/SearchPanel.js.map +1 -1
  58. package/dist/src/ui/viewer/components/Spread.d.ts +2 -1
  59. package/dist/src/ui/viewer/components/Spread.d.ts.map +1 -1
  60. package/dist/src/ui/viewer/components/Spread.js +112 -11
  61. package/dist/src/ui/viewer/components/Spread.js.map +1 -1
  62. package/dist/src/ui/viewer/components/ThumbnailPanel.d.ts +2 -1
  63. package/dist/src/ui/viewer/components/ThumbnailPanel.d.ts.map +1 -1
  64. package/dist/src/ui/viewer/components/ThumbnailPanel.js +49 -1
  65. package/dist/src/ui/viewer/components/ThumbnailPanel.js.map +1 -1
  66. package/dist/src/ui/viewer/components/Toolbar.d.ts +2 -1
  67. package/dist/src/ui/viewer/components/Toolbar.d.ts.map +1 -1
  68. package/dist/src/ui/viewer/components/Toolbar.js +118 -56
  69. package/dist/src/ui/viewer/components/Toolbar.js.map +1 -1
  70. package/dist/src/ui/viewer/components/ViewModeMenu.d.ts +2 -1
  71. package/dist/src/ui/viewer/components/ViewModeMenu.d.ts.map +1 -1
  72. package/dist/src/ui/viewer/components/ViewModeMenu.js +32 -16
  73. package/dist/src/ui/viewer/components/ViewModeMenu.js.map +1 -1
  74. package/dist/src/ui/viewer/components/Viewport.d.ts +2 -1
  75. package/dist/src/ui/viewer/components/Viewport.d.ts.map +1 -1
  76. package/dist/src/ui/viewer/components/Viewport.js +167 -14
  77. package/dist/src/ui/viewer/components/Viewport.js.map +1 -1
  78. package/dist/src/ui/viewer/effects.d.ts.map +1 -1
  79. package/dist/src/ui/viewer/effects.js +54 -82
  80. package/dist/src/ui/viewer/effects.js.map +1 -1
  81. package/dist/src/ui/viewer/i18n/ar.d.ts +3 -0
  82. package/dist/src/ui/viewer/i18n/ar.d.ts.map +1 -0
  83. package/dist/src/ui/viewer/i18n/ar.js +143 -0
  84. package/dist/src/ui/viewer/i18n/ar.js.map +1 -0
  85. package/dist/src/ui/viewer/i18n/de.d.ts +3 -0
  86. package/dist/src/ui/viewer/i18n/de.d.ts.map +1 -0
  87. package/dist/src/ui/viewer/i18n/de.js +143 -0
  88. package/dist/src/ui/viewer/i18n/de.js.map +1 -0
  89. package/dist/src/ui/viewer/i18n/en.d.ts +3 -0
  90. package/dist/src/ui/viewer/i18n/en.d.ts.map +1 -0
  91. package/dist/src/ui/viewer/i18n/en.js +144 -0
  92. package/dist/src/ui/viewer/i18n/en.js.map +1 -0
  93. package/dist/src/ui/viewer/i18n/es.d.ts +3 -0
  94. package/dist/src/ui/viewer/i18n/es.d.ts.map +1 -0
  95. package/dist/src/ui/viewer/i18n/es.js +143 -0
  96. package/dist/src/ui/viewer/i18n/es.js.map +1 -0
  97. package/dist/src/ui/viewer/i18n/fr.d.ts +3 -0
  98. package/dist/src/ui/viewer/i18n/fr.d.ts.map +1 -0
  99. package/dist/src/ui/viewer/i18n/fr.js +143 -0
  100. package/dist/src/ui/viewer/i18n/fr.js.map +1 -0
  101. package/dist/src/ui/viewer/i18n/index.d.ts +27 -0
  102. package/dist/src/ui/viewer/i18n/index.d.ts.map +1 -0
  103. package/dist/src/ui/viewer/i18n/index.js +88 -0
  104. package/dist/src/ui/viewer/i18n/index.js.map +1 -0
  105. package/dist/src/ui/viewer/i18n/ja.d.ts +3 -0
  106. package/dist/src/ui/viewer/i18n/ja.d.ts.map +1 -0
  107. package/dist/src/ui/viewer/i18n/ja.js +143 -0
  108. package/dist/src/ui/viewer/i18n/ja.js.map +1 -0
  109. package/dist/src/ui/viewer/i18n/ko.d.ts +3 -0
  110. package/dist/src/ui/viewer/i18n/ko.d.ts.map +1 -0
  111. package/dist/src/ui/viewer/i18n/ko.js +143 -0
  112. package/dist/src/ui/viewer/i18n/ko.js.map +1 -0
  113. package/dist/src/ui/viewer/i18n/pt-BR.d.ts +3 -0
  114. package/dist/src/ui/viewer/i18n/pt-BR.d.ts.map +1 -0
  115. package/dist/src/ui/viewer/i18n/pt-BR.js +143 -0
  116. package/dist/src/ui/viewer/i18n/pt-BR.js.map +1 -0
  117. package/dist/src/ui/viewer/i18n/ru.d.ts +3 -0
  118. package/dist/src/ui/viewer/i18n/ru.d.ts.map +1 -0
  119. package/dist/src/ui/viewer/i18n/ru.js +143 -0
  120. package/dist/src/ui/viewer/i18n/ru.js.map +1 -0
  121. package/dist/src/ui/viewer/i18n/types.d.ts +129 -0
  122. package/dist/src/ui/viewer/i18n/types.d.ts.map +1 -0
  123. package/dist/src/ui/viewer/i18n/types.js +2 -0
  124. package/dist/src/ui/viewer/i18n/types.js.map +1 -0
  125. package/dist/src/ui/viewer/i18n/zh-CN.d.ts +3 -0
  126. package/dist/src/ui/viewer/i18n/zh-CN.d.ts.map +1 -0
  127. package/dist/src/ui/viewer/i18n/zh-CN.js +143 -0
  128. package/dist/src/ui/viewer/i18n/zh-CN.js.map +1 -0
  129. package/dist/src/ui/viewer/i18n/zh-TW.d.ts +3 -0
  130. package/dist/src/ui/viewer/i18n/zh-TW.d.ts.map +1 -0
  131. package/dist/src/ui/viewer/i18n/zh-TW.js +143 -0
  132. package/dist/src/ui/viewer/i18n/zh-TW.js.map +1 -0
  133. package/dist/src/ui/viewer/shell.d.ts +1 -1
  134. package/dist/src/ui/viewer/shell.d.ts.map +1 -1
  135. package/dist/src/ui/viewer/shell.js +95 -10
  136. package/dist/src/ui/viewer/shell.js.map +1 -1
  137. package/dist/src/ui/viewer/state.d.ts +2 -0
  138. package/dist/src/ui/viewer/state.d.ts.map +1 -1
  139. package/dist/src/ui/viewer/state.js +1 -0
  140. package/dist/src/ui/viewer/state.js.map +1 -1
  141. package/dist/src/ui/viewer/styles-inline.d.ts +1 -1
  142. package/dist/src/ui/viewer/styles-inline.d.ts.map +1 -1
  143. package/dist/src/ui/viewer/styles-inline.js +148 -43
  144. package/dist/src/ui/viewer/styles-inline.js.map +1 -1
  145. package/dist/src/ui/viewer/transition.d.ts +26 -0
  146. package/dist/src/ui/viewer/transition.d.ts.map +1 -0
  147. package/dist/src/ui/viewer/transition.js +898 -0
  148. package/dist/src/ui/viewer/transition.js.map +1 -0
  149. package/dist/src/wasm/udoc.d.ts +83 -6
  150. package/dist/src/wasm/udoc.js +13 -13
  151. package/dist/src/wasm/udoc_bg.wasm +0 -0
  152. package/dist/src/wasm/udoc_bg.wasm.d.ts +3 -3
  153. package/dist/src/worker/WorkerClient.d.ts +24 -5
  154. package/dist/src/worker/WorkerClient.d.ts.map +1 -1
  155. package/dist/src/worker/WorkerClient.js +243 -98
  156. package/dist/src/worker/WorkerClient.js.map +1 -1
  157. package/dist/src/worker/index.d.ts +1 -1
  158. package/dist/src/worker/index.d.ts.map +1 -1
  159. package/dist/src/worker/worker-inline.js +1 -1
  160. package/dist/src/worker/worker.d.ts +2 -0
  161. package/dist/src/worker/worker.d.ts.map +1 -1
  162. package/dist/src/worker/worker.js +14 -13
  163. package/dist/src/worker/worker.js.map +1 -1
  164. package/package.json +15 -9
@@ -10,6 +10,7 @@ export function createOutlinePanel() {
10
10
  const el = document.createElement("div");
11
11
  el.className = "udoc-outline-panel";
12
12
  let storeRef = null;
13
+ let i18nRef = null;
13
14
  let currentSlice = null;
14
15
  /** Track collapsed items by path (collapsed if in set) */
15
16
  const collapsedItems = new Set();
@@ -19,14 +20,19 @@ export function createOutlinePanel() {
19
20
  const container = document.createElement("div");
20
21
  container.className = "udoc-outline-item";
21
22
  container.dataset.path = path;
23
+ container.setAttribute("role", "treeitem");
24
+ container.setAttribute("aria-label", item.title);
22
25
  const header = document.createElement("div");
23
26
  header.className = "udoc-outline-item__header";
24
27
  header.style.paddingLeft = `${8 + depth * 16}px`;
28
+ header.setAttribute("tabindex", "-1");
25
29
  // Expand/collapse toggle (only if has children)
26
30
  if (item.children.length > 0) {
27
31
  const toggle = document.createElement("button");
28
32
  toggle.className = "udoc-outline-item__toggle";
29
33
  toggle.type = "button";
34
+ toggle.setAttribute("tabindex", "-1");
35
+ toggle.setAttribute("aria-hidden", "true");
30
36
  toggle.innerHTML = `<svg viewBox="0 0 16 16" width="12" height="12"><path fill="currentColor" d="M6 4l4 4-4 4" stroke="currentColor" stroke-width="1.5" fill="none"/></svg>`;
31
37
  // Determine initial expanded state
32
38
  const isCollapsed = item.initiallyCollapsed || collapsedItems.has(path);
@@ -34,6 +40,7 @@ export function createOutlinePanel() {
34
40
  collapsedItems.add(path);
35
41
  }
36
42
  toggle.classList.toggle("udoc-outline-item__toggle--expanded", !isCollapsed);
43
+ container.setAttribute("aria-expanded", String(!isCollapsed));
37
44
  const onToggle = (e) => {
38
45
  e.stopPropagation();
39
46
  if (collapsedItems.has(path)) {
@@ -75,10 +82,21 @@ export function createOutlinePanel() {
75
82
  header.addEventListener("click", onClick);
76
83
  unsubEvents.push(() => header.removeEventListener("click", onClick));
77
84
  }
85
+ // Keyboard handler for tree navigation
86
+ const onKeyDown = (e) => {
87
+ const handled = handleTreeKeyDown(e, container, path);
88
+ if (handled) {
89
+ e.preventDefault();
90
+ e.stopPropagation();
91
+ }
92
+ };
93
+ header.addEventListener("keydown", onKeyDown);
94
+ unsubEvents.push(() => header.removeEventListener("keydown", onKeyDown));
78
95
  // Children container
79
96
  if (item.children.length > 0) {
80
97
  const childrenContainer = document.createElement("div");
81
98
  childrenContainer.className = "udoc-outline-item__children";
99
+ childrenContainer.setAttribute("role", "group");
82
100
  const isCollapsed = collapsedItems.has(path);
83
101
  childrenContainer.style.display = isCollapsed ? "none" : "block";
84
102
  // Recursively build children
@@ -91,6 +109,117 @@ export function createOutlinePanel() {
91
109
  }
92
110
  return container;
93
111
  }
112
+ function handleTreeKeyDown(e, container, path) {
113
+ const hasChildren = container.querySelector(":scope > .udoc-outline-item__children") !== null;
114
+ const isExpanded = hasChildren && !collapsedItems.has(path);
115
+ switch (e.key) {
116
+ case "ArrowDown": {
117
+ const next = getNextVisibleTreeItem(container);
118
+ if (next)
119
+ focusTreeItem(next);
120
+ return true;
121
+ }
122
+ case "ArrowUp": {
123
+ const prev = getPrevVisibleTreeItem(container);
124
+ if (prev)
125
+ focusTreeItem(prev);
126
+ return true;
127
+ }
128
+ case "ArrowRight": {
129
+ if (hasChildren && !isExpanded) {
130
+ collapsedItems.delete(path);
131
+ updateExpandState(container, path);
132
+ }
133
+ else if (hasChildren && isExpanded) {
134
+ const firstChild = container.querySelector(":scope > .udoc-outline-item__children > .udoc-outline-item");
135
+ if (firstChild)
136
+ focusTreeItem(firstChild);
137
+ }
138
+ return true;
139
+ }
140
+ case "ArrowLeft": {
141
+ if (hasChildren && isExpanded) {
142
+ collapsedItems.add(path);
143
+ updateExpandState(container, path);
144
+ }
145
+ else {
146
+ const parent = container.parentElement?.closest(".udoc-outline-item");
147
+ if (parent)
148
+ focusTreeItem(parent);
149
+ }
150
+ return true;
151
+ }
152
+ case "Home": {
153
+ const first = el.querySelector(".udoc-outline-item");
154
+ if (first)
155
+ focusTreeItem(first);
156
+ return true;
157
+ }
158
+ case "End": {
159
+ const allVisible = el.querySelectorAll(".udoc-outline-item");
160
+ for (let i = allVisible.length - 1; i >= 0; i--) {
161
+ const item = allVisible[i];
162
+ if (item.offsetParent !== null) {
163
+ focusTreeItem(item);
164
+ break;
165
+ }
166
+ }
167
+ return true;
168
+ }
169
+ case "Enter":
170
+ case " ": {
171
+ const header = container.querySelector(":scope > .udoc-outline-item__header");
172
+ if (header)
173
+ header.click();
174
+ return true;
175
+ }
176
+ default:
177
+ return false;
178
+ }
179
+ }
180
+ function focusTreeItem(item) {
181
+ const header = item.querySelector(":scope > .udoc-outline-item__header");
182
+ if (header)
183
+ header.focus();
184
+ }
185
+ function getNextVisibleTreeItem(current) {
186
+ // If expanded, first child
187
+ const children = current.querySelector(":scope > .udoc-outline-item__children");
188
+ if (children && children.style.display !== "none") {
189
+ const firstChild = children.querySelector(":scope > .udoc-outline-item");
190
+ if (firstChild)
191
+ return firstChild;
192
+ }
193
+ // Next sibling
194
+ let node = current;
195
+ while (node) {
196
+ const next = node.nextElementSibling;
197
+ if (next && next.classList.contains("udoc-outline-item"))
198
+ return next;
199
+ // Go up to parent's next sibling
200
+ node = node.parentElement?.closest(".udoc-outline-item");
201
+ }
202
+ return null;
203
+ }
204
+ function getPrevVisibleTreeItem(current) {
205
+ const prev = current.previousElementSibling;
206
+ if (prev && prev.classList.contains("udoc-outline-item")) {
207
+ // Go to deepest last visible descendant
208
+ return getLastVisibleDescendant(prev);
209
+ }
210
+ // Go to parent
211
+ const parent = current.parentElement?.closest(".udoc-outline-item");
212
+ return parent;
213
+ }
214
+ function getLastVisibleDescendant(item) {
215
+ const children = item.querySelector(":scope > .udoc-outline-item__children");
216
+ if (children && children.style.display !== "none") {
217
+ const lastChild = children.querySelector(":scope > .udoc-outline-item:last-child");
218
+ if (lastChild)
219
+ return getLastVisibleDescendant(lastChild);
220
+ }
221
+ return item;
222
+ }
94
223
  function updateExpandState(container, path) {
95
224
  const toggle = container.querySelector(":scope > .udoc-outline-item__header > .udoc-outline-item__toggle");
96
225
  const children = container.querySelector(":scope > .udoc-outline-item__children");
@@ -99,29 +228,37 @@ export function createOutlinePanel() {
99
228
  const isCollapsed = collapsedItems.has(path);
100
229
  toggle.classList.toggle("udoc-outline-item__toggle--expanded", !isCollapsed);
101
230
  children.style.display = isCollapsed ? "none" : "block";
231
+ container.setAttribute("aria-expanded", String(!isCollapsed));
102
232
  }
103
233
  function buildOutlineTree(outline) {
104
234
  // Clear existing content but preserve event cleanup
105
235
  el.innerHTML = "";
106
236
  if (outline.length === 0) {
237
+ el.removeAttribute("role");
107
238
  const empty = document.createElement("div");
108
239
  empty.className = "udoc-outline-panel__empty";
109
- empty.textContent = "No outline available";
240
+ empty.textContent = i18nRef.t("outline.empty");
110
241
  el.appendChild(empty);
111
242
  return;
112
243
  }
244
+ el.setAttribute("role", "tree");
245
+ el.setAttribute("aria-label", i18nRef.t("outline.label"));
113
246
  // Build outline items
114
247
  outline.forEach((item, index) => {
115
248
  const path = String(index);
116
249
  const itemEl = createOutlineItemElement(item, path, 0);
117
250
  el.appendChild(itemEl);
118
251
  });
252
+ // Focus first item for keyboard navigation entry
253
+ const firstHeader = el.querySelector(".udoc-outline-item__header");
254
+ if (firstHeader)
255
+ firstHeader.setAttribute("tabindex", "0");
119
256
  }
120
257
  function showLoading() {
121
258
  el.innerHTML = "";
122
259
  const loading = document.createElement("div");
123
260
  loading.className = "udoc-outline-panel__loading";
124
- loading.textContent = "Loading outline...";
261
+ loading.textContent = i18nRef.t("outline.loading");
125
262
  el.appendChild(loading);
126
263
  }
127
264
  function applyState(slice) {
@@ -146,9 +283,10 @@ export function createOutlinePanel() {
146
283
  }
147
284
  currentSlice = slice;
148
285
  }
149
- function mount(container, store) {
286
+ function mount(container, store, i18n) {
150
287
  container.appendChild(el);
151
288
  storeRef = store;
289
+ i18nRef = i18n;
152
290
  // Apply initial state
153
291
  applyState(selectOutlineSlice(store.getState()));
154
292
  unsubRender = subscribeSelector(store, selectOutlineSlice, applyState, { equality: shallowEqual });
@@ -1 +1 @@
1
- {"version":3,"file":"OutlinePanel.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/OutlinePanel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OutlinePanel.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/OutlinePanel.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,13 @@
4
4
  import type { Store } from "../../framework/store";
5
5
  import type { ViewerState } from "../state";
6
6
  import type { Action } from "../actions";
7
+ import type { I18n } from "../i18n/index.js";
7
8
  export interface PasswordDialogCallbacks {
8
9
  onSubmit: (password: string) => void;
9
10
  }
10
11
  export declare function createPasswordDialog(): {
11
12
  el: HTMLDivElement;
12
- mount: (container: HTMLElement, store: Store<ViewerState, Action>, cb: PasswordDialogCallbacks) => void;
13
+ mount: (container: HTMLElement, store: Store<ViewerState, Action>, i18n: I18n, cb: PasswordDialogCallbacks) => void;
13
14
  destroy: () => void;
14
15
  };
15
16
  //# sourceMappingURL=PasswordDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordDialog.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/PasswordDialog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,oBAAoB;;uBAkGN,WAAW,SAAS,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,uBAAuB,KAAG,IAAI;mBAiDxF,IAAI;EAO3B"}
1
+ {"version":3,"file":"PasswordDialog.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/PasswordDialog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,oBAAoB;;uBA6FjB,WAAW,SACf,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,QAC3B,IAAI,MACN,uBAAuB,KAC5B,IAAI;mBAqFa,IAAI;EAY3B"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Password dialog component for encrypted PDF documents.
3
3
  */
4
+ import { trapFocus } from "../a11y";
4
5
  export function createPasswordDialog() {
5
6
  // Create overlay
6
7
  const overlay = document.createElement("div");
@@ -29,6 +30,7 @@ export function createPasswordDialog() {
29
30
  placeholder="Enter password"
30
31
  autocomplete="off"
31
32
  aria-label="Password"
33
+ aria-describedby="udoc-password-error"
32
34
  />
33
35
  <button type="button" class="udoc-password-toggle" aria-label="Show password">
34
36
  <svg class="udoc-password-eye-open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -41,7 +43,7 @@ export function createPasswordDialog() {
41
43
  </svg>
42
44
  </button>
43
45
  </div>
44
- <p class="udoc-password-error" aria-live="polite"></p>
46
+ <p class="udoc-password-error" id="udoc-password-error" aria-live="polite"></p>
45
47
  <button type="submit" class="udoc-password-submit">
46
48
  <span class="udoc-password-submit-text">Unlock</span>
47
49
  <span class="udoc-password-submit-spinner" style="display:none">
@@ -67,14 +69,8 @@ export function createPasswordDialog() {
67
69
  const submitSpinner = dialog.querySelector(".udoc-password-submit-spinner");
68
70
  let callbacks = null;
69
71
  let unsubRender = null;
70
- // Toggle password visibility
71
- toggleBtn.addEventListener("click", () => {
72
- const isPassword = input.type === "password";
73
- input.type = isPassword ? "text" : "password";
74
- eyeOpen.style.display = isPassword ? "none" : "";
75
- eyeClosed.style.display = isPassword ? "" : "none";
76
- toggleBtn.setAttribute("aria-label", isPassword ? "Hide password" : "Show password");
77
- });
72
+ let cleanupTrap = null;
73
+ let previousFocus = null;
78
74
  // Handle form submit
79
75
  form.addEventListener("submit", (e) => {
80
76
  e.preventDefault();
@@ -90,9 +86,30 @@ export function createPasswordDialog() {
90
86
  errorEl.style.display = "none";
91
87
  }
92
88
  });
93
- function mount(container, store, cb) {
89
+ function mount(container, store, i18n, cb) {
94
90
  container.appendChild(overlay);
95
91
  callbacks = cb;
92
+ // Update i18n strings in the dialog
93
+ const titleEl = dialog.querySelector("#udoc-password-title");
94
+ if (titleEl)
95
+ titleEl.textContent = i18n.t("password.title");
96
+ const messageEl = dialog.querySelector(".udoc-password-message");
97
+ if (messageEl)
98
+ messageEl.textContent = i18n.t("password.message");
99
+ input.placeholder = i18n.t("password.placeholder");
100
+ input.setAttribute("aria-label", i18n.t("password.label"));
101
+ toggleBtn.setAttribute("aria-label", i18n.t("password.showPassword"));
102
+ const submitTextEl = dialog.querySelector(".udoc-password-submit-text");
103
+ if (submitTextEl)
104
+ submitTextEl.textContent = i18n.t("password.unlock");
105
+ // Toggle password visibility
106
+ toggleBtn.addEventListener("click", () => {
107
+ const isPassword = input.type === "password";
108
+ input.type = isPassword ? "text" : "password";
109
+ eyeOpen.style.display = isPassword ? "none" : "";
110
+ eyeClosed.style.display = isPassword ? "" : "none";
111
+ toggleBtn.setAttribute("aria-label", isPassword ? i18n.t("password.hidePassword") : i18n.t("password.showPassword"));
112
+ });
96
113
  unsubRender = store.subscribeRender((prev, next) => {
97
114
  // Show/hide dialog based on needsPassword state
98
115
  const wasVisible = prev.needsPassword && prev.doc !== null;
@@ -100,6 +117,8 @@ export function createPasswordDialog() {
100
117
  if (wasVisible !== isVisible) {
101
118
  overlay.style.display = isVisible ? "" : "none";
102
119
  if (isVisible) {
120
+ // Save focus to restore on close
121
+ previousFocus = document.activeElement;
103
122
  // Focus input when dialog appears
104
123
  setTimeout(() => input.focus(), 0);
105
124
  // Reset input
@@ -107,6 +126,18 @@ export function createPasswordDialog() {
107
126
  input.type = "password";
108
127
  eyeOpen.style.display = "";
109
128
  eyeClosed.style.display = "none";
129
+ // Trap focus inside dialog
130
+ cleanupTrap = trapFocus(dialog);
131
+ }
132
+ else {
133
+ if (cleanupTrap) {
134
+ cleanupTrap();
135
+ cleanupTrap = null;
136
+ }
137
+ if (previousFocus && previousFocus.focus) {
138
+ previousFocus.focus();
139
+ previousFocus = null;
140
+ }
110
141
  }
111
142
  }
112
143
  // Update error message
@@ -135,7 +166,12 @@ export function createPasswordDialog() {
135
166
  function destroy() {
136
167
  if (unsubRender)
137
168
  unsubRender();
169
+ if (cleanupTrap) {
170
+ cleanupTrap();
171
+ cleanupTrap = null;
172
+ }
138
173
  callbacks = null;
174
+ previousFocus = null;
139
175
  overlay.remove();
140
176
  }
141
177
  return { el: overlay, mount, destroy };
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordDialog.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/PasswordDialog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PasswordDialog.js","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/PasswordDialog.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  import type { Store } from "../../framework/store";
5
5
  import type { ViewerState } from "../state";
6
6
  import type { Action } from "../actions";
7
+ import type { I18n } from "../i18n/index.js";
7
8
  export type PrintPageRange = {
8
9
  kind: "all";
9
10
  } | {
@@ -27,7 +28,7 @@ export interface PrintDialogCallbacks {
27
28
  }
28
29
  export declare function createPrintDialog(): {
29
30
  el: HTMLDivElement;
30
- mount: (container: HTMLElement, store: Store<ViewerState, Action>, cb: PrintDialogCallbacks) => void;
31
+ mount: (container: HTMLElement, store: Store<ViewerState, Action>, i18n: I18n, cb: PrintDialogCallbacks) => void;
31
32
  destroy: () => void;
32
33
  };
33
34
  //# sourceMappingURL=PrintDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PrintDialog.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/PrintDialog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AA2BD,wBAAgB,iBAAiB;;uBAiLH,WAAW,SAAS,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,oBAAoB,KAAG,IAAI;mBA4CrF,IAAI;EAO3B"}
1
+ {"version":3,"file":"PrintDialog.d.ts","sourceRoot":"","sources":["../../../../../src/ui/viewer/components/PrintDialog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AA2BD,wBAAgB,iBAAiB;;uBAqLd,WAAW,SACf,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,QAC3B,IAAI,MACN,oBAAoB,KACzB,IAAI;mBAmGa,IAAI;EAY3B"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Print dialog component for selecting page range and quality.
3
3
  */
4
+ import { trapFocus } from "../a11y";
4
5
  /** Parse a page range string like "1,3,5-8,12" into an array of 1-based page numbers. */
5
6
  function parsePageRange(input, maxPage) {
6
7
  const pages = new Set();
@@ -60,14 +61,14 @@ export function createPrintDialog() {
60
61
  <label class="udoc-print-radio">
61
62
  <input type="radio" name="udoc-print-range" value="fromTo">
62
63
  <span>Pages</span>
63
- <input type="number" class="udoc-print-input udoc-print-from" min="1" value="1" disabled>
64
+ <input type="number" class="udoc-print-input udoc-print-from" min="1" value="1" disabled aria-describedby="udoc-print-error">
64
65
  <span>to</span>
65
- <input type="number" class="udoc-print-input udoc-print-to" min="1" value="1" disabled>
66
+ <input type="number" class="udoc-print-input udoc-print-to" min="1" value="1" disabled aria-describedby="udoc-print-error">
66
67
  </label>
67
68
  <label class="udoc-print-radio">
68
69
  <input type="radio" name="udoc-print-range" value="custom">
69
70
  <span>Custom</span>
70
- <input type="text" class="udoc-print-input udoc-print-custom" placeholder="e.g. 1,3,5-8" disabled>
71
+ <input type="text" class="udoc-print-input udoc-print-custom" placeholder="e.g. 1,3,5-8" disabled aria-describedby="udoc-print-error">
71
72
  </label>
72
73
  </div>
73
74
  </div>
@@ -81,7 +82,7 @@ export function createPrintDialog() {
81
82
  </select>
82
83
  </div>
83
84
 
84
- <p class="udoc-print-error" aria-live="polite"></p>
85
+ <p class="udoc-print-error" id="udoc-print-error" aria-live="polite"></p>
85
86
 
86
87
  <div class="udoc-print-actions">
87
88
  <button type="button" class="udoc-print-btn udoc-print-btn--cancel">Cancel</button>
@@ -100,7 +101,10 @@ export function createPrintDialog() {
100
101
  const cancelBtn = dialog.querySelector(".udoc-print-btn--cancel");
101
102
  const printBtn = dialog.querySelector(".udoc-print-btn--print");
102
103
  let callbacks = null;
104
+ let i18nRef = null;
103
105
  let unsubRender = null;
106
+ let cleanupTrap = null;
107
+ let previousFocus = null;
104
108
  let pageCount = 1;
105
109
  function getSelectedRange() {
106
110
  for (const r of radios) {
@@ -159,11 +163,11 @@ export function createPrintDialog() {
159
163
  const from = parseInt(fromInput.value, 10);
160
164
  const to = parseInt(toInput.value, 10);
161
165
  if (isNaN(from) || isNaN(to) || from < 1 || to < 1 || from > pageCount || to > pageCount) {
162
- showError(`Please enter page numbers between 1 and ${pageCount}.`);
166
+ showError(i18nRef.t("print.errorPageRange", { max: pageCount }));
163
167
  return;
164
168
  }
165
169
  if (from > to) {
166
- showError("Start page must be less than or equal to end page.");
170
+ showError(i18nRef.t("print.errorStartEnd"));
167
171
  return;
168
172
  }
169
173
  pageRange = { kind: "fromTo", from, to };
@@ -172,7 +176,7 @@ export function createPrintDialog() {
172
176
  case "custom": {
173
177
  const parsed = parsePageRange(customInput.value, pageCount);
174
178
  if (!parsed) {
175
- showError(`Invalid range. Use format like "1,3,5-8". Pages must be between 1 and ${pageCount}.`);
179
+ showError(i18nRef.t("print.errorCustomRange", { max: pageCount }));
176
180
  return;
177
181
  }
178
182
  pageRange = { kind: "custom", pages: parsed };
@@ -197,15 +201,62 @@ export function createPrintDialog() {
197
201
  callbacks?.onCancel();
198
202
  }
199
203
  });
200
- function mount(container, store, cb) {
204
+ function mount(container, store, i18n, cb) {
201
205
  container.appendChild(overlay);
202
206
  callbacks = cb;
207
+ i18nRef = i18n;
208
+ // Update i18n strings in the dialog
209
+ const titleEl = dialog.querySelector("#udoc-print-title");
210
+ if (titleEl)
211
+ titleEl.textContent = i18n.t("print.title");
212
+ const sectionLabels = dialog.querySelectorAll(".udoc-print-section-label");
213
+ if (sectionLabels[0])
214
+ sectionLabels[0].textContent = i18n.t("print.pagesLabel");
215
+ if (sectionLabels[1])
216
+ sectionLabels[1].textContent = i18n.t("print.qualityLabel");
217
+ // Update radio labels - need to update the span text within each radio label
218
+ const radioLabels = dialog.querySelectorAll(".udoc-print-radio");
219
+ // "All pages" radio
220
+ const allPagesSpan = radioLabels[0]?.querySelector("span");
221
+ if (allPagesSpan)
222
+ allPagesSpan.textContent = i18n.t("print.allPages");
223
+ // "Current page (X)" radio - split translation on placeholder to preserve nested span
224
+ const cpParent = radioLabels[1]?.querySelector(":scope > span");
225
+ if (cpParent) {
226
+ const tpl = i18n.t("print.currentPage", { page: "\x00" });
227
+ const [before, after] = tpl.split("\x00");
228
+ cpParent.textContent = "";
229
+ cpParent.append(document.createTextNode(before), currentPageSpan, document.createTextNode(after));
230
+ }
231
+ // "Pages" range label
232
+ const pagesRangeSpans = radioLabels[2]?.querySelectorAll(":scope > span");
233
+ if (pagesRangeSpans && pagesRangeSpans[0])
234
+ pagesRangeSpans[0].textContent = i18n.t("print.pagesRange");
235
+ if (pagesRangeSpans && pagesRangeSpans[1])
236
+ pagesRangeSpans[1].textContent = i18n.t("print.pagesTo");
237
+ // "Custom" label
238
+ const customSpan = radioLabels[3]?.querySelector(":scope > span");
239
+ if (customSpan)
240
+ customSpan.textContent = i18n.t("print.custom");
241
+ customInput.placeholder = i18n.t("print.customPlaceholder");
242
+ // Quality options
243
+ const qualityOptions = qualitySelect.querySelectorAll("option");
244
+ if (qualityOptions[0])
245
+ qualityOptions[0].textContent = i18n.t("print.qualityDraft");
246
+ if (qualityOptions[1])
247
+ qualityOptions[1].textContent = i18n.t("print.qualityStandard");
248
+ if (qualityOptions[2])
249
+ qualityOptions[2].textContent = i18n.t("print.qualityHigh");
250
+ cancelBtn.textContent = i18n.t("print.cancel");
251
+ printBtn.textContent = i18n.t("print.print");
203
252
  unsubRender = store.subscribeRender((prev, next) => {
204
253
  const wasVisible = prev.showPrintDialog;
205
254
  const isVisible = next.showPrintDialog;
206
255
  if (wasVisible !== isVisible) {
207
256
  overlay.style.display = isVisible ? "" : "none";
208
257
  if (isVisible) {
258
+ // Save focus to restore on close
259
+ previousFocus = document.activeElement;
209
260
  // Reset state
210
261
  const allRadio = dialog.querySelector('input[value="all"]');
211
262
  if (allRadio)
@@ -219,6 +270,19 @@ export function createPrintDialog() {
219
270
  updateInputStates();
220
271
  // Focus the print button
221
272
  setTimeout(() => printBtn.focus(), 0);
273
+ // Trap focus inside dialog
274
+ cleanupTrap = trapFocus(dialog);
275
+ }
276
+ else {
277
+ if (cleanupTrap) {
278
+ cleanupTrap();
279
+ cleanupTrap = null;
280
+ }
281
+ // Restore focus to the element that opened the dialog
282
+ if (previousFocus && previousFocus.focus) {
283
+ previousFocus.focus();
284
+ previousFocus = null;
285
+ }
222
286
  }
223
287
  }
224
288
  // Update current page display and max values
@@ -240,7 +304,12 @@ export function createPrintDialog() {
240
304
  function destroy() {
241
305
  if (unsubRender)
242
306
  unsubRender();
307
+ if (cleanupTrap) {
308
+ cleanupTrap();
309
+ cleanupTrap = null;
310
+ }
243
311
  callbacks = null;
312
+ previousFocus = null;
244
313
  overlay.remove();
245
314
  }
246
315
  return { el: overlay, mount, destroy };