docxodus 12.2.0 → 12.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +11 -4
  2. package/dist/editor.bundle.js +1208 -28
  3. package/dist/editor.d.ts +10 -1
  4. package/dist/editor.d.ts.map +1 -1
  5. package/dist/editor.js +48 -16
  6. package/dist/editor.js.map +1 -1
  7. package/dist/embed.bundle.js +1212 -31
  8. package/dist/embed.d.ts +5 -2
  9. package/dist/embed.d.ts.map +1 -1
  10. package/dist/embed.iife.js +1212 -31
  11. package/dist/embed.js +10 -3
  12. package/dist/embed.js.map +1 -1
  13. package/dist/export-assets.json +9 -9
  14. package/dist/history-checkpoints.d.ts +50 -0
  15. package/dist/history-checkpoints.d.ts.map +1 -0
  16. package/dist/history-checkpoints.js +102 -0
  17. package/dist/history-checkpoints.js.map +1 -0
  18. package/dist/history-controls.d.ts +33 -0
  19. package/dist/history-controls.d.ts.map +1 -0
  20. package/dist/history-controls.js +375 -0
  21. package/dist/history-controls.js.map +1 -0
  22. package/dist/history-indexeddb.d.ts +12 -0
  23. package/dist/history-indexeddb.d.ts.map +1 -0
  24. package/dist/history-indexeddb.js +154 -0
  25. package/dist/history-indexeddb.js.map +1 -0
  26. package/dist/index.d.ts +4 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/ribbon-chrome.d.ts +1 -1
  31. package/dist/ribbon-chrome.d.ts.map +1 -1
  32. package/dist/ribbon-chrome.js +6 -3
  33. package/dist/ribbon-chrome.js.map +1 -1
  34. package/dist/ribbon-history.d.ts +85 -0
  35. package/dist/ribbon-history.d.ts.map +1 -0
  36. package/dist/ribbon-history.js +508 -0
  37. package/dist/ribbon-history.js.map +1 -0
  38. package/dist/ribbon.d.ts +6 -0
  39. package/dist/ribbon.d.ts.map +1 -1
  40. package/dist/ribbon.js +50 -19
  41. package/dist/ribbon.js.map +1 -1
  42. package/dist/viewport.d.ts +3 -1
  43. package/dist/viewport.d.ts.map +1 -1
  44. package/dist/viewport.js +14 -0
  45. package/dist/viewport.js.map +1 -1
  46. package/dist/wasm/_framework/Docxodus.wasm +0 -0
  47. package/dist/wasm/_framework/Docxodus.wasm.br +0 -0
  48. package/dist/wasm/_framework/DocxodusWasm.wasm +0 -0
  49. package/dist/wasm/_framework/DocxodusWasm.wasm.br +0 -0
  50. package/dist/wasm/_framework/System.Private.CoreLib.wasm +0 -0
  51. package/dist/wasm/_framework/System.Private.CoreLib.wasm.br +0 -0
  52. package/dist/wasm/_framework/System.Runtime.InteropServices.JavaScript.wasm +0 -0
  53. package/dist/wasm/_framework/System.Runtime.InteropServices.JavaScript.wasm.br +0 -0
  54. package/dist/wasm/_framework/dotnet.boot.js +6 -6
  55. package/dist/wasm/_framework/dotnet.boot.js.br +0 -0
  56. package/dist/wasm/_framework/dotnet.native.wasm +0 -0
  57. package/dist/wasm/_framework/dotnet.native.wasm.br +0 -0
  58. package/package.json +8 -7
@@ -0,0 +1,85 @@
1
+ import type { DocxHistoryArchive, DocxHistoryClient, HistoryStorage } from './history.js';
2
+ import type { RibbonEditor } from './ribbon.js';
3
+ export interface RibbonHistoryOptions {
4
+ /** Browser database shared by this app's editors. No document bytes are stored until Save version. */
5
+ storageName?: string;
6
+ /** Stable host-owned workspace key. Reopens its last saved document across reloads. */
7
+ workspaceId?: string;
8
+ author?: string;
9
+ }
10
+ /** Low-level hosts supply their initialized history and preview services. createRibbonEditor wires these automatically. */
11
+ export interface RibbonHistoryBinding extends RibbonHistoryOptions {
12
+ openHistory(storage: HistoryStorage): DocxHistoryClient;
13
+ openArchive(bytes: Uint8Array): Promise<DocxHistoryArchive>;
14
+ preview(container: HTMLElement, bytes: Uint8Array): Promise<{
15
+ destroy(): void;
16
+ }>;
17
+ }
18
+ /** Shared ribbon lifecycle, browser persistence and separate previews. No autosave or network sync. */
19
+ export declare class RibbonHistory {
20
+ private readonly ribbon;
21
+ private readonly options;
22
+ private readonly dialog;
23
+ private readonly previewDialog;
24
+ private readonly body;
25
+ private readonly status;
26
+ private readonly source;
27
+ private readonly recent;
28
+ private readonly back;
29
+ private readonly resumeButton;
30
+ private readonly events;
31
+ private readonly prefix;
32
+ private readonly lastKey;
33
+ private store?;
34
+ private client?;
35
+ private draft?;
36
+ private identity;
37
+ private archive?;
38
+ private panel?;
39
+ private preview?;
40
+ private active?;
41
+ private destroyed;
42
+ private installing;
43
+ private dirty;
44
+ private generation;
45
+ private captured;
46
+ private savedVersion;
47
+ private observedVersion;
48
+ private capturedVersion;
49
+ private capturedBytes?;
50
+ private readonly panelObserver;
51
+ constructor(ribbon: RibbonEditor, options: RibbonHistoryBinding);
52
+ get busy(): boolean;
53
+ private get hasUnsavedChanges();
54
+ /** Called by the ribbon before a programmatic replacement. */
55
+ beforeOpen(): void;
56
+ /** A new DOCX is a new document identity, even if its filename matches another document. */
57
+ documentOpened(name: string): void;
58
+ edited(): void;
59
+ /** Restores a saved workspace only when requested by the host, before exposing the editor. */
60
+ resume(): Promise<void>;
61
+ show(): Promise<void>;
62
+ openFile(file: File): Promise<void>;
63
+ newDocument(): Promise<void>;
64
+ destroy(): Promise<void>;
65
+ private ensureStorage;
66
+ private ensureDraft;
67
+ private loadSaved;
68
+ private install;
69
+ private mountPanel;
70
+ private showPreview;
71
+ private importArchive;
72
+ private closeArchive;
73
+ private remember;
74
+ private readIdentity;
75
+ private updateRecent;
76
+ private confirm;
77
+ private captureState;
78
+ private confirmReplace;
79
+ private explain;
80
+ private command;
81
+ private syncBusy;
82
+ private run;
83
+ private button;
84
+ }
85
+ //# sourceMappingURL=ribbon-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ribbon-history.d.ts","sourceRoot":"","sources":["../src/ribbon-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,508 @@
1
+ import { HistoryCheckpoints } from './history-checkpoints.js';
2
+ import { mountHistoryControls, historyControlError } from './history-controls.js';
3
+ import { openIndexedDbHistoryStore } from './history-indexeddb.js';
4
+ import { DocxHistoryError, MAX_HISTORY_ARCHIVE_BYTES } from './history.js';
5
+ /** Shared ribbon lifecycle, browser persistence and separate previews. No autosave or network sync. */
6
+ export class RibbonHistory {
7
+ constructor(ribbon, options) {
8
+ this.ribbon = ribbon;
9
+ this.options = options;
10
+ this.events = new AbortController();
11
+ this.identity = { id: crypto.randomUUID(), name: 'Untitled.docx' };
12
+ this.destroyed = false;
13
+ this.installing = false;
14
+ this.dirty = false;
15
+ this.generation = 0;
16
+ this.captured = -1;
17
+ this.savedVersion = null;
18
+ this.observedVersion = null;
19
+ this.capturedVersion = null;
20
+ const doc = ribbon.element.ownerDocument;
21
+ this.prefix = `docxodus:versions:${options.storageName ?? 'docxodus-editor'}:document:`;
22
+ this.lastKey = `docxodus:versions:${options.storageName ?? 'docxodus-editor'}:workspace:${options.workspaceId ?? crypto.randomUUID()}`;
23
+ const style = doc.createElement('style');
24
+ style.textContent = HISTORY_DRAWER_CSS;
25
+ this.dialog = doc.createElement('dialog');
26
+ this.dialog.className = 'dxr-history-dialog';
27
+ this.dialog.setAttribute('aria-label', 'Version history');
28
+ const header = doc.createElement('div');
29
+ header.className = 'dxr-history-header';
30
+ this.dialog.append(header);
31
+ const close = this.button('Close version history', () => this.dialog.close(), header);
32
+ close.className = 'dxr-history-close';
33
+ close.textContent = 'Close ✕';
34
+ this.source = doc.createElement('p');
35
+ this.source.className = 'dxr-history-source';
36
+ this.status = doc.createElement('p');
37
+ this.status.setAttribute('role', 'status');
38
+ this.status.className = 'dxr-history-status';
39
+ const recentLabel = doc.createElement('label');
40
+ recentLabel.textContent = 'Saved documents on this device';
41
+ this.recent = doc.createElement('select');
42
+ this.recent.setAttribute('aria-label', recentLabel.textContent);
43
+ recentLabel.append(this.recent);
44
+ this.recent.addEventListener('change', () => this.command(async () => {
45
+ const selectedId = this.recent.value;
46
+ this.recent.value = this.identity.id;
47
+ const selected = this.readIdentity(localStorage.getItem(this.prefix + selectedId));
48
+ if (!selected || !this.confirmReplace())
49
+ return;
50
+ await this.loadSaved(selected);
51
+ await this.mountPanel();
52
+ this.updateRecent();
53
+ }), { signal: this.events.signal });
54
+ this.dialog.append(this.source, this.status, recentLabel);
55
+ this.resumeButton = this.button('Continue editing this document', () => this.command(() => this.importArchive()), this.dialog);
56
+ this.back = this.button('Back to my document', () => this.command(async () => {
57
+ await this.closeArchive();
58
+ await this.mountPanel();
59
+ }), this.dialog);
60
+ this.body = doc.createElement('div');
61
+ this.dialog.append(this.body);
62
+ this.previewDialog = doc.createElement('dialog');
63
+ this.previewDialog.className = 'dxr-version-preview';
64
+ this.previewDialog.setAttribute('aria-label', 'Version preview');
65
+ this.panelObserver = new MutationObserver(() => this.syncBusy());
66
+ ribbon.element.append(style, this.dialog, this.previewDialog);
67
+ for (const dialog of [this.dialog, this.previewDialog]) {
68
+ dialog.addEventListener('keydown', event => event.stopPropagation(), { signal: this.events.signal });
69
+ dialog.addEventListener('click', event => {
70
+ if (event.target === dialog) {
71
+ const rect = dialog.getBoundingClientRect();
72
+ if (event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom)
73
+ dialog.close();
74
+ }
75
+ }, { signal: this.events.signal });
76
+ }
77
+ this.dialog.addEventListener('close', () => ribbon.control('history')?.focus(), { signal: this.events.signal });
78
+ ribbon.control('history')?.addEventListener('click', () => { void this.show(); }, { signal: this.events.signal });
79
+ doc.defaultView?.addEventListener('beforeunload', event => {
80
+ if (this.hasUnsavedChanges || this.busy)
81
+ event.preventDefault();
82
+ }, { signal: this.events.signal });
83
+ doc.defaultView?.addEventListener('pagehide', event => {
84
+ if (!event.persisted)
85
+ void this.destroy();
86
+ }, { signal: this.events.signal });
87
+ }
88
+ get busy() { return !!this.active || this.panel?.element.getAttribute('aria-busy') === 'true'; }
89
+ get hasUnsavedChanges() {
90
+ return this.dirty || (this.ribbon.editor?.version ?? null) !== this.savedVersion;
91
+ }
92
+ /** Called by the ribbon before a programmatic replacement. */
93
+ beforeOpen() {
94
+ if (!this.installing && this.busy)
95
+ throw new DocxHistoryError('Busy', 'Finish the version action before opening another document.');
96
+ }
97
+ /** A new DOCX is a new document identity, even if its filename matches another document. */
98
+ documentOpened(name) {
99
+ if (this.installing)
100
+ return;
101
+ this.identity = { id: crypto.randomUUID(), name };
102
+ this.draft = undefined;
103
+ this.dirty = false;
104
+ this.generation++;
105
+ this.savedVersion = this.observedVersion = this.ribbon.editor?.version ?? null;
106
+ this.dialog.close();
107
+ this.previewDialog.close();
108
+ void this.closeArchive();
109
+ }
110
+ edited() {
111
+ const version = this.ribbon.editor?.version ?? null;
112
+ if (version !== null && version === this.observedVersion)
113
+ return;
114
+ this.observedVersion = version;
115
+ this.dirty = true;
116
+ this.generation++;
117
+ }
118
+ /** Restores a saved workspace only when requested by the host, before exposing the editor. */
119
+ async resume() {
120
+ if (!this.options.workspaceId)
121
+ return;
122
+ try {
123
+ const previous = this.readIdentity(localStorage.getItem(this.lastKey));
124
+ if (previous)
125
+ await this.run(() => this.loadSaved(previous));
126
+ }
127
+ catch (error) {
128
+ // Storage denial/corruption must not prevent an ordinary document from opening.
129
+ this.ribbon.setStatus('Your document is open. Version history is unavailable on this device.');
130
+ this.status.textContent = this.explain(error);
131
+ }
132
+ }
133
+ async show() {
134
+ if (this.destroyed)
135
+ return;
136
+ if (!this.dialog.open)
137
+ this.dialog.showModal();
138
+ if (this.busy)
139
+ return;
140
+ await this.run(async () => { await this.mountPanel(); this.updateRecent(); }).catch(() => { });
141
+ }
142
+ async openFile(file) {
143
+ await this.run(async () => {
144
+ if (/\.docxhistory$/i.test(file.name)) {
145
+ if (file.size > MAX_HISTORY_ARCHIVE_BYTES)
146
+ throw new DocxHistoryError('ResourceLimit', 'History file is too large.');
147
+ const bytes = new Uint8Array(await file.arrayBuffer());
148
+ const reader = await this.options.openArchive(bytes);
149
+ try {
150
+ await reader.read();
151
+ }
152
+ catch (error) {
153
+ reader.close();
154
+ throw error;
155
+ }
156
+ await this.closeArchive();
157
+ this.archive = { reader, bytes, name: file.name };
158
+ if (!this.dialog.open)
159
+ this.dialog.showModal();
160
+ await this.mountPanel();
161
+ this.updateRecent();
162
+ }
163
+ else {
164
+ if (!/\.docx$/i.test(file.name))
165
+ throw new Error('Choose a Word document or a document with version history.');
166
+ if (!this.confirmReplace())
167
+ return;
168
+ const bytes = new Uint8Array(await file.arrayBuffer());
169
+ this.install(bytes, { id: crypto.randomUUID(), name: file.name });
170
+ this.draft = undefined;
171
+ this.dirty = true;
172
+ await this.closeArchive();
173
+ this.dialog.close();
174
+ }
175
+ }).catch(() => { });
176
+ }
177
+ async newDocument() {
178
+ await this.run(async () => {
179
+ if (!this.confirmReplace())
180
+ return;
181
+ this.installing = true;
182
+ try {
183
+ this.ribbon.openBlank('Untitled.docx');
184
+ }
185
+ finally {
186
+ this.installing = false;
187
+ }
188
+ this.identity = { id: crypto.randomUUID(), name: 'Untitled.docx' };
189
+ this.draft = undefined;
190
+ this.dirty = false;
191
+ this.generation++;
192
+ this.savedVersion = this.observedVersion = this.ribbon.editor?.version ?? null;
193
+ // Choosing New survives a reload instead of silently reopening the previous document.
194
+ try {
195
+ localStorage.removeItem(this.lastKey);
196
+ }
197
+ catch { /* editing does not require storage */ }
198
+ await this.closeArchive();
199
+ this.dialog.close();
200
+ }).catch(() => { });
201
+ }
202
+ async destroy() {
203
+ if (this.destroyed)
204
+ return;
205
+ this.destroyed = true;
206
+ this.events.abort();
207
+ this.dialog.remove();
208
+ this.previewDialog.remove();
209
+ this.panelObserver.disconnect();
210
+ await this.active?.catch(() => { });
211
+ await this.closeArchive();
212
+ this.preview?.destroy();
213
+ this.client?.close();
214
+ this.store?.close();
215
+ }
216
+ async ensureStorage() {
217
+ if (this.client)
218
+ return;
219
+ const store = await openIndexedDbHistoryStore(this.options.storageName ?? 'docxodus-editor');
220
+ try {
221
+ this.client = this.options.openHistory(store.storage);
222
+ this.store = store;
223
+ }
224
+ catch (error) {
225
+ store.close();
226
+ throw error;
227
+ }
228
+ }
229
+ async ensureDraft() {
230
+ await this.ensureStorage();
231
+ if (!this.draft) {
232
+ const document = this.client.document(this.identity.id);
233
+ this.draft = { ...this.identity, checkpoints: await HistoryCheckpoints.open(document, this.store.journal(this.identity.id)) };
234
+ }
235
+ return this.draft;
236
+ }
237
+ async loadSaved(identity) {
238
+ await this.ensureStorage();
239
+ const document = this.client.document(identity.id);
240
+ const checkpoints = await HistoryCheckpoints.open(document, this.store.journal(identity.id));
241
+ const pending = checkpoints.pendingRequest;
242
+ const view = checkpoints.view;
243
+ if (!view && pending?.kind !== 'save')
244
+ throw new Error('This saved document is no longer on this device.');
245
+ const bytes = pending?.kind === 'save' ? pending.bytes : await document.exportDocx(view.version.id);
246
+ this.install(bytes, identity);
247
+ this.draft = { ...identity, checkpoints };
248
+ this.dirty = pending?.kind === 'save';
249
+ if (pending?.kind === 'save')
250
+ this.captureState(pending.bytes);
251
+ await this.closeArchive();
252
+ this.remember();
253
+ }
254
+ install(bytes, identity) {
255
+ if (this.destroyed)
256
+ throw new DocxHistoryError('Closed', 'The editor is closed.');
257
+ this.installing = true;
258
+ try {
259
+ this.ribbon.open(bytes, identity.name);
260
+ }
261
+ finally {
262
+ this.installing = false;
263
+ }
264
+ this.identity = identity;
265
+ this.dirty = false;
266
+ this.generation++;
267
+ this.savedVersion = this.observedVersion = this.ribbon.editor?.version ?? null;
268
+ }
269
+ async mountPanel() {
270
+ const current = this.archive ?? await this.ensureDraft();
271
+ const writable = 'checkpoints' in current;
272
+ const holder = this.body.ownerDocument.createElement('div');
273
+ const panel = mountHistoryControls(holder, {
274
+ reader: writable ? current.checkpoints.document : current.reader,
275
+ checkpoints: writable ? current.checkpoints : undefined,
276
+ author: this.options.author, documentName: current.name,
277
+ capture: writable ? () => {
278
+ const bytes = this.ribbon.save();
279
+ if (!bytes)
280
+ throw new Error('Open a document first.');
281
+ // Remember the identity before publication, so uncertain saves can recover after reload.
282
+ this.remember();
283
+ this.captureState(bytes);
284
+ return bytes;
285
+ } : undefined,
286
+ confirmRestore: writable ? title => this.confirm(`Restore ${title}?${this.hasUnsavedChanges ? '\n\nYour unsaved changes will be replaced.' : ''}\n\nAll saved versions will be kept.`) : undefined,
287
+ onCheckpoint: async (view, action, request) => {
288
+ if (this.destroyed)
289
+ return;
290
+ const savedCapture = action === 'save' || (action === 'retry' && request?.kind === 'save'
291
+ && this.capturedBytes && sameBytes(this.capturedBytes, request.bytes));
292
+ if (savedCapture && this.captured === this.generation && this.capturedVersion === (this.ribbon.editor?.version ?? null)) {
293
+ this.dirty = false;
294
+ this.savedVersion = this.capturedVersion;
295
+ }
296
+ this.captured = -1;
297
+ this.capturedBytes = undefined;
298
+ if ((action === 'restore' || (action === 'retry' && request?.kind === 'restore')) && writable)
299
+ this.install(await current.checkpoints.document.exportDocx(view.version.id), this.identity);
300
+ this.remember();
301
+ this.updateRecent();
302
+ },
303
+ restoreUpdatesDraft: true,
304
+ preview: (bytes, title) => this.showPreview(bytes, title),
305
+ });
306
+ try {
307
+ await panel.ready;
308
+ }
309
+ catch (error) {
310
+ await panel.destroy();
311
+ throw error;
312
+ }
313
+ if (this.destroyed) {
314
+ await panel.destroy();
315
+ return;
316
+ }
317
+ await this.panel?.destroy();
318
+ this.panel = panel;
319
+ this.body.replaceChildren(holder);
320
+ this.panelObserver.disconnect();
321
+ this.panelObserver.observe(panel.element, { attributes: true, attributeFilter: ['aria-busy'] });
322
+ this.source.textContent = current.name;
323
+ this.resumeButton.hidden = this.back.hidden = writable;
324
+ this.status.textContent = writable
325
+ ? 'Your saved versions stay on this device.'
326
+ : 'You’re browsing a history file. Your open document is safe.';
327
+ }
328
+ async showPreview(bytes, title) {
329
+ const doc = this.previewDialog.ownerDocument;
330
+ const holder = doc.createElement('div');
331
+ holder.className = 'dxr-version-paper';
332
+ const preview = await this.options.preview(holder, bytes);
333
+ if (this.destroyed) {
334
+ preview.destroy();
335
+ return;
336
+ }
337
+ const heading = doc.createElement('h2');
338
+ heading.textContent = title;
339
+ const actions = doc.createElement('div');
340
+ actions.className = 'dxr-version-actions';
341
+ this.button('Back to version history', () => this.previewDialog.close(), actions);
342
+ if (!this.archive)
343
+ this.button('Use as draft', () => this.command(async () => {
344
+ if (!this.confirmReplace())
345
+ return;
346
+ this.install(bytes, this.identity);
347
+ this.dirty = true;
348
+ this.previewDialog.close();
349
+ this.dialog.close();
350
+ }), actions);
351
+ this.button('Download this version', () => download(bytes, 'version.docx', doc), actions);
352
+ this.preview?.destroy();
353
+ this.preview = preview;
354
+ this.previewDialog.replaceChildren(heading, actions, holder);
355
+ if (!this.previewDialog.open)
356
+ this.previewDialog.showModal();
357
+ }
358
+ async importArchive() {
359
+ if (!this.archive || !this.confirmReplace())
360
+ return;
361
+ await this.ensureStorage();
362
+ const imported = await this.client.importHistoryArchive(this.archive.bytes);
363
+ const identity = { id: imported.archive.documentId, name: this.archive.name.replace(/\.docxhistory$/i, '.docx') };
364
+ const document = this.client.document(identity.id);
365
+ const checkpoints = await HistoryCheckpoints.open(document, this.store.journal(identity.id), imported.view);
366
+ this.install(await document.exportDocx(imported.view.version.id), identity);
367
+ this.draft = { ...identity, checkpoints };
368
+ this.remember();
369
+ await this.closeArchive();
370
+ await this.mountPanel();
371
+ this.updateRecent();
372
+ }
373
+ async closeArchive() {
374
+ this.panelObserver.disconnect();
375
+ const panel = this.panel;
376
+ this.panel = undefined;
377
+ const archive = this.archive;
378
+ this.archive = undefined;
379
+ await panel?.destroy();
380
+ archive?.reader.close();
381
+ }
382
+ remember() {
383
+ localStorage.setItem(this.prefix + this.identity.id, JSON.stringify(this.identity));
384
+ localStorage.setItem(this.lastKey, JSON.stringify(this.identity));
385
+ }
386
+ readIdentity(value) {
387
+ if (!value)
388
+ return null;
389
+ const identity = JSON.parse(value);
390
+ if (typeof identity?.id !== 'string' || !identity.id || typeof identity?.name !== 'string')
391
+ return null;
392
+ return { id: identity.id, name: identity.name };
393
+ }
394
+ updateRecent() {
395
+ this.recent.replaceChildren(new Option('Choose a saved document…', ''));
396
+ for (let i = 0; i < localStorage.length; i++) {
397
+ const key = localStorage.key(i);
398
+ if (!key.startsWith(this.prefix))
399
+ continue;
400
+ try {
401
+ const identity = this.readIdentity(localStorage.getItem(key));
402
+ if (identity)
403
+ this.recent.append(new Option(identity.name, identity.id));
404
+ }
405
+ catch { /* a damaged catalog entry does not hide other saved documents */ }
406
+ }
407
+ this.recent.value = this.identity.id;
408
+ this.recent.parentElement.hidden = this.recent.options.length <= 1;
409
+ }
410
+ confirm(message) { return this.dialog.ownerDocument.defaultView?.confirm(message) ?? false; }
411
+ captureState(bytes) {
412
+ this.captured = this.generation;
413
+ this.capturedVersion = this.ribbon.editor?.version ?? null;
414
+ this.capturedBytes = bytes.slice();
415
+ }
416
+ confirmReplace() { return !this.hasUnsavedChanges || this.confirm('Replace your open document? Save a version or download it first to keep your unsaved changes.'); }
417
+ explain(error) { return historyControlError(error, this.draft?.checkpoints.hasPending); }
418
+ command(action) { void this.run(action).catch(() => { }); }
419
+ syncBusy() {
420
+ const busy = this.busy;
421
+ // Closing the drawer while publication runs must not enable edits that a restore would replace.
422
+ this.ribbon.surface.inert = busy;
423
+ const chrome = this.ribbon.element.querySelector('.dxr-chrome');
424
+ if (chrome)
425
+ chrome.inert = busy;
426
+ this.recent.disabled = this.resumeButton.disabled = this.back.disabled = busy;
427
+ const file = this.ribbon.control('file');
428
+ if (file)
429
+ file.disabled = busy;
430
+ const create = this.ribbon.control('new');
431
+ if (create)
432
+ create.disabled = busy;
433
+ }
434
+ async run(action) {
435
+ if (this.destroyed || this.busy)
436
+ return;
437
+ const work = Promise.resolve().then(action);
438
+ this.active = work;
439
+ this.dialog.setAttribute('aria-busy', 'true');
440
+ this.body.inert = true;
441
+ this.syncBusy();
442
+ this.ribbon.element.querySelector('.dxr-chrome').inert = true;
443
+ this.ribbon.surface.inert = true;
444
+ try {
445
+ await work;
446
+ }
447
+ catch (error) {
448
+ this.status.textContent = this.explain(error);
449
+ this.ribbon.setStatus(this.explain(error));
450
+ throw error;
451
+ }
452
+ finally {
453
+ this.active = undefined;
454
+ this.body.inert = false;
455
+ this.dialog.setAttribute('aria-busy', 'false');
456
+ this.syncBusy();
457
+ this.ribbon.element.querySelector('.dxr-chrome')?.removeAttribute('inert');
458
+ this.ribbon.surface.inert = false;
459
+ }
460
+ }
461
+ button(label, action, parent) {
462
+ const button = parent.ownerDocument.createElement('button');
463
+ button.type = 'button';
464
+ button.textContent = label;
465
+ button.setAttribute('aria-label', label);
466
+ button.addEventListener('click', action, { signal: this.events.signal });
467
+ parent.append(button);
468
+ return button;
469
+ }
470
+ }
471
+ function download(bytes, name, doc) {
472
+ const url = URL.createObjectURL(new Blob([bytes.slice()], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }));
473
+ const link = doc.createElement('a');
474
+ link.href = url;
475
+ link.download = name;
476
+ link.click();
477
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
478
+ }
479
+ function sameBytes(left, right) {
480
+ return left.length === right.length && left.every((value, index) => value === right[index]);
481
+ }
482
+ const HISTORY_DRAWER_CSS = `
483
+ .dxr-history-dialog,.dxr-version-preview{box-sizing:border-box;color:#243b42;background:#fff;border:1px solid #dce5e5;box-shadow:0 24px 80px #163f4033;font:14px/1.5 system-ui,sans-serif;padding:24px;overscroll-behavior:contain}
484
+ .dxr-history-dialog{width:min(420px,calc(100vw - 24px));max-height:calc(100dvh - 24px);margin:12px 12px 12px auto;border-radius:18px}
485
+ .dxr-history-dialog::backdrop,.dxr-version-preview::backdrop{background:#16323333;backdrop-filter:blur(2px)}
486
+ .dxr-history-dialog [hidden],.dxr-version-preview [hidden]{display:none!important}
487
+ .dxr-history-dialog button,.dxr-version-preview button{font:inherit;color:inherit;border:1px solid #cbd9d9;background:#fff;border-radius:9px;min-height:40px;padding:8px 12px;cursor:pointer}
488
+ .dxr-history-dialog button:hover,.dxr-version-preview button:hover{background:#eff8f6}
489
+ .dxr-history-dialog :focus-visible,.dxr-version-preview :focus-visible{outline:3px solid #0f766e;outline-offset:3px}
490
+ .dxr-history-header{display:flex;justify-content:flex-end;position:sticky;top:0;z-index:2;background:#fff;box-shadow:0 0 0 6px #fff}
491
+ .dxr-history-dialog .dxr-history-close{border:0;font-size:13px;background:#fff}
492
+ .dxr-history-source{font-weight:600;overflow-wrap:anywhere;margin:12px 0 4px}
493
+ .dxr-history-status{color:#597273;margin:4px 0 18px}
494
+ .dxr-history-dialog>label{display:block;font-size:12px;color:#597273;margin:12px 0}
495
+ .dxr-history-dialog>label select{display:block;width:100%;font:inherit;padding:8px;border:1px solid #cbd9d9;border-radius:8px;background:#fff;color:#243b42}
496
+ .dxr-history-dialog .dx-history{padding:0;border:0;border-radius:0;background:transparent}
497
+ .dxr-history-dialog .dx-history h2{font-size:24px;letter-spacing:-.6px;margin:12px 0}
498
+ .dxr-history-dialog .dx-history button[data-history-action=save]{background:#0f766e;border-color:#0f766e;color:#fff;font-weight:600}
499
+ .dxr-history-dialog .dx-history select{border-radius:9px;background:#f8fbfa}
500
+ .dxr-history-dialog .dx-history option{padding:10px;font-size:13px}
501
+ .dxr-version-preview{width:min(1080px,calc(100vw - 24px));max-height:calc(100dvh - 24px);border-radius:18px}
502
+ .dxr-version-preview h2{font-size:20px;margin:0 0 12px;overflow-wrap:anywhere}
503
+ .dxr-version-actions{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}
504
+ .dxr-version-paper{max-height:70dvh;overflow:auto;background:#f2f6f5;padding:20px;border-radius:10px}
505
+ @media(max-width:520px){.dxr-history-dialog,.dxr-version-preview{padding:16px}.dxr-version-paper{padding:8px}}
506
+ @media(prefers-reduced-motion:no-preference){.dxr-history-dialog[open]{animation:dxr-history-in .16s ease-out}@keyframes dxr-history-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}}
507
+ `;
508
+ //# sourceMappingURL=ribbon-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ribbon-history.js","sourceRoot":"","sources":["../src/ribbon-history.ts"],"names":[],"mappings":"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"}