@file-viewer/core 3.3.1 → 3.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets.d.ts +2 -2
- package/dist/assets.js +1 -5
- package/dist/browser/controller.d.ts +1 -2
- package/dist/browser/controller.js +8 -39
- package/dist/browser/source-feedback.d.ts +1 -2
- package/dist/browser/source-feedback.js +2 -3
- package/dist/browser/toolbar-focus.d.ts +0 -1
- package/dist/browser/toolbar-focus.js +0 -3
- package/dist/browser/toolbar-keyboard.d.ts +1 -0
- package/dist/browser/toolbar-keyboard.js +63 -0
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +2 -2
- package/dist/config/options.d.ts +1 -1
- package/dist/contracts/types.d.ts +1 -470
- package/dist/contracts/xml.d.ts +0 -11
- package/dist/export.d.ts +3 -10
- package/dist/export.js +2 -9
- package/dist/exportDocument.d.ts +1 -12
- package/dist/exportDocument.js +2 -31
- package/dist/features/document/dom/anchors.d.ts +1 -1
- package/dist/features/document/dom/index.d.ts +5 -5
- package/dist/features/document/dom/index.js +3 -3
- package/dist/features/document/dom/providers.d.ts +1 -1
- package/dist/features/document/events.d.ts +2 -2
- package/dist/features/document/events.js +3 -3
- package/dist/features/document/fit.d.ts +1 -1
- package/dist/features/document/fit.js +1 -1
- package/dist/features/document/imageHandTool.d.ts +0 -2
- package/dist/features/document/imageHandTool.js +1 -5
- package/dist/features/document/model.d.ts +1 -1
- package/dist/features/document/search.d.ts +1 -1
- package/dist/features/document/search.js +2 -2
- package/dist/features/document/viewState.d.ts +1 -1
- package/dist/features/document/viewState.js +2 -2
- package/dist/features/document/zoom.d.ts +1 -1
- package/dist/features/document/zoom.js +3 -3
- package/dist/features/document/zoomGestures.d.ts +2 -2
- package/dist/features/document/zoomGestures.js +0 -2
- package/dist/features/printMask.d.ts +1 -1
- package/dist/features/printMaskDesigner.d.ts +2 -6
- package/dist/features/printMaskDesigner.js +2 -11
- package/dist/features/printMaskLoader.d.ts +1 -7
- package/dist/features/printMaskLoader.js +1 -7
- package/dist/features/watermark.d.ts +1 -1
- package/dist/headless.d.ts +29 -29
- package/dist/headless.js +16 -21
- package/dist/i18n/messages.d.ts +1 -1
- package/dist/i18n/messages.de.d.ts +1 -5
- package/dist/i18n/messages.de.js +1 -5
- package/dist/i18n/messages.ja.d.ts +1 -6
- package/dist/i18n/messages.ja.js +1 -6
- package/dist/i18n/messages.js +4 -4
- package/dist/index.d.ts +77 -77
- package/dist/index.js +39 -39
- package/dist/lifecycle/facade.d.ts +4 -4
- package/dist/lifecycle/facade.js +2 -2
- package/dist/lifecycle/operations.d.ts +4 -5
- package/dist/lifecycle/operations.js +4 -10
- package/dist/output/canvasImage.d.ts +1 -2
- package/dist/output/canvasImage.js +1 -4
- package/dist/output/export.d.ts +1 -3
- package/dist/output/export.js +0 -12
- package/dist/output/printLayout.d.ts +0 -5
- package/dist/output/printLayout.js +0 -4
- package/dist/output/snapshotDownload.d.ts +1 -2
- package/dist/output/snapshotDownload.js +2 -3
- package/dist/platform/assets.d.ts +4 -11
- package/dist/platform/assets.js +20 -45
- package/dist/platform/copiedAssets.d.ts +0 -1
- package/dist/platform/copiedAssets.js +1 -2
- package/dist/presentation/colorScheme.d.ts +1 -2
- package/dist/presentation/colorScheme.js +1 -2
- package/dist/presentation/state.d.ts +1 -1
- package/dist/presentation/state.js +3 -3
- package/dist/print-mask.d.ts +2 -2
- package/dist/print-mask.js +1 -1
- package/dist/registry/capabilities.d.ts +1 -14
- package/dist/registry/capabilities.js +2 -15
- package/dist/registry/formats.d.ts +1 -1
- package/dist/registry/formats.generated.d.ts +2 -3
- package/dist/registry/formats.generated.js +2 -3
- package/dist/registry/formats.js +2 -2
- package/dist/registry/registry.d.ts +1 -15
- package/dist/registry/registry.js +2 -10
- package/dist/renderers/image.d.ts +1 -1
- package/dist/renderers/image.js +5 -7
- package/dist/renderers/index.d.ts +3 -3
- package/dist/renderers/index.js +5 -11
- package/dist/rendering/dispatcher.d.ts +1 -6
- package/dist/rendering/dispatcher.js +3 -3
- package/dist/rendering/handler.d.ts +3 -13
- package/dist/rendering/handler.js +9 -21
- package/dist/security/svgResources.d.ts +0 -10
- package/dist/security/svgResources.js +0 -12
- package/dist/source/index.d.ts +3 -3
- package/dist/source/index.js +1 -1
- package/dist/source/loading.d.ts +4 -4
- package/dist/source/loading.js +4 -7
- package/dist/source/precheck.d.ts +1 -13
- package/dist/source/precheck.js +2 -9
- package/dist/source/textEncoding.d.ts +0 -18
- package/dist/source/textEncoding.js +0 -15
- package/dist/viewer/createViewer.d.ts +1 -1
- package/dist/viewer/createViewer.js +17 -28
- package/dist/viewer/loading.d.ts +2 -6
- package/dist/viewer/loading.js +1 -9
- package/dist/viewer/operations.d.ts +3 -3
- package/dist/viewer/operations.js +6 -14
- package/dist/viewer/state.d.ts +2 -6
- package/dist/viewer/state.js +3 -8
- package/package.json +3 -1
package/dist/assets.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export type * from
|
|
1
|
+
export * from "./platform/assets.js";
|
|
2
|
+
export type * from "./platform/assets.js";
|
package/dist/assets.js
CHANGED
|
@@ -1,5 +1 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
// Asset resolution belongs to the platform layer, but this root-level file is
|
|
4
|
-
// intentionally kept as the stable package export declared in package.json.
|
|
5
|
-
export * from './platform/assets.js';
|
|
1
|
+
export * from "./platform/assets.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type FileViewerAiOptions, type FileViewerApplyViewStateOptions, type FileViewerArchiveOptions, type FileViewerCadOptions, type FileViewerDocxOptions, type FileViewerDocumentAnchor, type FileViewerDocumentChunk, type FileViewerEvent, type FileViewerEventHandler, type FileViewerEventType, type FileViewerFileRef, type FileViewerFitMode, type FileViewerFitOptions, type FileViewerFitResult, type FileViewerInstance, type FileViewerLifecycleContext, type FileViewerOperationAvailability, type FileViewerOptions, type FileViewerPdfOptions, type FileViewerPresentationOptions, type FileViewerSpreadsheetOptions, type FileViewerPublicApi, type FileViewerSearchOptions, type FileViewerSearchState, type FileViewerThemeMode, type FileViewerToolbarOptions, type FileViewerToolbarPosition, type FileViewerTypstOptions, type FileViewerUiDensity, type FileViewerUiOptions, type FileViewerViewState, type FileViewerWatermarkOptions, type FileViewerPrintOptions, type FileViewerZoomState, type RendererRegistry } from
|
|
1
|
+
import { type FileViewerAiOptions, type FileViewerApplyViewStateOptions, type FileViewerArchiveOptions, type FileViewerCadOptions, type FileViewerDocxOptions, type FileViewerDocumentAnchor, type FileViewerDocumentChunk, type FileViewerEvent, type FileViewerEventHandler, type FileViewerEventType, type FileViewerFileRef, type FileViewerFitMode, type FileViewerFitOptions, type FileViewerFitResult, type FileViewerInstance, type FileViewerLifecycleContext, type FileViewerOperationAvailability, type FileViewerOptions, type FileViewerPdfOptions, type FileViewerPresentationOptions, type FileViewerSpreadsheetOptions, type FileViewerPublicApi, type FileViewerSearchOptions, type FileViewerSearchState, type FileViewerThemeMode, type FileViewerToolbarOptions, type FileViewerToolbarPosition, type FileViewerTypstOptions, type FileViewerUiDensity, type FileViewerUiOptions, type FileViewerViewState, type FileViewerWatermarkOptions, type FileViewerPrintOptions, type FileViewerZoomState, type RendererRegistry } from "../index.js";
|
|
2
2
|
export type FileRef = FileViewerFileRef;
|
|
3
3
|
export type ViewerWatermarkOptions = FileViewerWatermarkOptions;
|
|
4
4
|
export type ViewerToolbarPosition = FileViewerToolbarPosition;
|
|
@@ -34,7 +34,6 @@ export interface ViewerState {
|
|
|
34
34
|
search: FileViewerSearchState | null;
|
|
35
35
|
zoom: FileViewerZoomState | null;
|
|
36
36
|
location: FileViewerDocumentAnchor | null;
|
|
37
|
-
/** Added in 2.2; optional so existing state fixtures remain source-compatible. */
|
|
38
37
|
viewState?: FileViewerViewState | null;
|
|
39
38
|
}
|
|
40
39
|
export type ViewerStateListener = (state: ViewerState, event?: ViewerEvent) => void;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { appendFileViewerStyle, cloneFileViewerViewState, applyFileViewerZoomAvailability, createViewer, isFileViewerShadowRoot, normalizeFileViewerUiDensity, normalizeFileViewerTheme, normalizeFileViewerStyleIsolation, syncFileViewerRenderSurfaceBackground, } from
|
|
2
|
-
import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, createFileViewerTranslator, getExtension, normalizeFileViewerSourceUrl, hasVisibleFileViewerToolbarActions, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, normalizeFilename, readFileViewerBuffer, resolveFileViewerSourceFilename, resolveFileViewerRemoteSourcePlan, resolveFileViewerColorScheme, resolveFileViewerToolbarOrder, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, toggleFileViewerColorScheme, wrapFileViewerFileRef, } from
|
|
3
|
-
import { resolveFileViewerToolbarZoomButtons } from
|
|
4
|
-
import { createToolbarFocusRestorer } from
|
|
5
|
-
import {
|
|
1
|
+
import { appendFileViewerStyle, cloneFileViewerViewState, applyFileViewerZoomAvailability, createViewer, isFileViewerShadowRoot, normalizeFileViewerUiDensity, normalizeFileViewerTheme, normalizeFileViewerStyleIsolation, syncFileViewerRenderSurfaceBackground, } from "../index.js";
|
|
2
|
+
import { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, createFileViewerTranslator, getExtension, normalizeFileViewerSourceUrl, hasVisibleFileViewerToolbarActions, isFileViewerZoomButtonDisabled, normalizeFileViewerToolbar, normalizeFilename, readFileViewerBuffer, resolveFileViewerSourceFilename, resolveFileViewerRemoteSourcePlan, resolveFileViewerColorScheme, resolveFileViewerToolbarOrder, resolveFileViewerToolbarPosition, resolveVisibleFileViewerToolbar, toggleFileViewerColorScheme, wrapFileViewerFileRef, } from "../index.js";
|
|
3
|
+
import { resolveFileViewerToolbarZoomButtons } from "../lifecycle/operations.js";
|
|
4
|
+
import { createToolbarFocusRestorer } from "./toolbar-focus.js";
|
|
5
|
+
import { bindToolbarKeyboardActivation } from "./toolbar-keyboard.js";
|
|
6
|
+
import { createViewerSourceFeedback } from "./source-feedback.js";
|
|
6
7
|
const isBrowser = () => typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
7
8
|
const hasSource = (options = {}) => {
|
|
8
9
|
return !!(options.url || options.file || options.buffer);
|
|
@@ -16,8 +17,6 @@ const toViewerSourceInput = (options = {}) => ({
|
|
|
16
17
|
type: options.type,
|
|
17
18
|
size: options.size,
|
|
18
19
|
});
|
|
19
|
-
// These options feed renderer selection or rendering itself. Viewer chrome,
|
|
20
|
-
// fitting, watermark, and operation callbacks update in place instead.
|
|
21
20
|
const RENDER_AFFECTING_VIEWER_OPTION_KEYS = [
|
|
22
21
|
'theme',
|
|
23
22
|
'rendererMode',
|
|
@@ -149,8 +148,6 @@ const resolveViewerLoadSource = async (source, options = {}) => {
|
|
|
149
148
|
url: source.url, filename, type,
|
|
150
149
|
pageHref: options.pageHref, streaming: options.streaming,
|
|
151
150
|
});
|
|
152
|
-
// A supplied transport owns authentication/acquisition and keeps its normal
|
|
153
|
-
// buffered contract. Only the default PDF URL path defers bytes to PDF.js.
|
|
154
151
|
if (!options.fetchFile && options.acceptsPdfUrl && plan.streamPdf) {
|
|
155
152
|
(_e = options.onPhase) === null || _e === void 0 ? void 0 : _e.call(options, 'streamingPdf');
|
|
156
153
|
return { url: plan.url, filename: plan.filename, type: plan.extension, size: source.size };
|
|
@@ -316,9 +313,6 @@ const DEFAULT_TOOLBAR_ZOOM_STATE = {
|
|
|
316
313
|
canZoomOut: false,
|
|
317
314
|
canReset: false,
|
|
318
315
|
};
|
|
319
|
-
// A ShadowRoot cannot be detached. Track the exact roots created on viewer
|
|
320
|
-
// hosts so a later light-DOM remount can expose its children through a slot,
|
|
321
|
-
// without mistaking and clearing a ShadowRoot owned by the host application.
|
|
322
316
|
const ownedViewerShadowRoots = new WeakMap();
|
|
323
317
|
const WEB_VIEWER_STYLE = `
|
|
324
318
|
:host,.file-viewer-web-shell{display:block;width:100%;height:100%;min-width:0;min-height:0;contain:content;--file-viewer-bg:transparent;--file-viewer-content-bg:transparent;--file-viewer-text:#172033;--file-viewer-muted:#607282;--file-viewer-font:14px/1.45 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--file-viewer-border:rgba(20,35,53,.08);--file-viewer-toolbar-bg:rgba(255,255,255,.92);--file-viewer-toolbar-border:rgba(20,35,53,.06);--file-viewer-toolbar-shadow:0 18px 44px rgba(15,23,42,.16);--file-viewer-toolbar-radius:999px;--file-viewer-toolbar-gap:6px;--file-viewer-toolbar-min-height:45px;--file-viewer-toolbar-padding:6px 10px;--file-viewer-toolbar-floating-min-height:42px;--file-viewer-toolbar-floating-padding:6px;--file-viewer-toolbar-floating-offset:16px;--file-viewer-group-bg:rgba(20,35,53,.035);--file-viewer-group-border:rgba(20,35,53,.08);--file-viewer-group-gap:2px;--file-viewer-group-padding:2px;--file-viewer-button-color:#40546a;--file-viewer-button-hover-bg:rgba(33,163,102,.1);--file-viewer-button-hover-color:#16774c;--file-viewer-button-disabled-color:#aab5c0;--file-viewer-button-radius:8px;--file-viewer-button-min-width:42px;--file-viewer-button-height:30px;--file-viewer-button-padding:0 10px;--file-viewer-icon-button-size:30px;--file-viewer-zoom-meter-min-width:48px;--file-viewer-zoom-meter-padding:0 8px;--file-viewer-floating-button-min-width:48px;--file-viewer-floating-button-height:32px;--file-viewer-floating-icon-button-size:32px;--file-viewer-floating-zoom-meter-min-width:54px;--file-viewer-search-input-height:30px;--file-viewer-search-input-padding:0 10px;--file-viewer-search-button-min-width:32px;--file-viewer-search-button-padding:0 8px;--file-viewer-search-count-min-width:42px;--file-viewer-floating-search-input-height:32px;--file-viewer-focus-ring:rgba(31,157,103,.22);--file-viewer-z-toolbar:20;--file-viewer-z-floating-toolbar:30}
|
|
@@ -422,26 +416,14 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
422
416
|
}
|
|
423
417
|
else if (shouldUseShadowRoot && canAttachShadowRoot) {
|
|
424
418
|
try {
|
|
425
|
-
// The viewer owns this root even when its host already lives inside a
|
|
426
|
-
// customer's ShadowRoot. Reusing the ancestor would let that component's
|
|
427
|
-
// resets override the toolbar and would make our :host rules mutate the
|
|
428
|
-
// customer's outer custom element.
|
|
429
|
-
// Delegated focus makes Safari taps on renderer controls focus the first
|
|
430
|
-
// toolbar input instead, triggering keyboard zoom and viewport scrolling.
|
|
431
419
|
renderRoot = container.attachShadow({ mode: 'open' });
|
|
432
420
|
ownedViewerShadowRoots.set(container, renderRoot);
|
|
433
421
|
}
|
|
434
422
|
catch {
|
|
435
|
-
// Some HTMLElement subclasses cannot host Shadow DOM, and a closed root
|
|
436
|
-
// is intentionally invisible through `shadowRoot`. Keep the legacy
|
|
437
|
-
// scoped path usable instead of surfacing a raw NotSupportedError.
|
|
438
423
|
renderRoot = container;
|
|
439
424
|
}
|
|
440
425
|
}
|
|
441
426
|
else if (existingHostShadowRoot && !hasOwnedHostShadowRoot) {
|
|
442
|
-
// The application owns this root. Preserve every existing child and mount
|
|
443
|
-
// the viewer in a dedicated boundary. Shadow mode gets a nested root so
|
|
444
|
-
// customer resets in the outer component cannot reach the viewer.
|
|
445
427
|
mountBoundary = documentRef.createElement('div');
|
|
446
428
|
mountBoundary.dataset.fileViewerMountBoundary = 'true';
|
|
447
429
|
existingHostShadowRoot.appendChild(mountBoundary);
|
|
@@ -458,9 +440,6 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
458
440
|
}
|
|
459
441
|
}
|
|
460
442
|
else if (!shouldUseShadowRoot && hasOwnedHostShadowRoot && existingHostShadowRoot) {
|
|
461
|
-
// Light-DOM children of a shadow host are not painted unless the root has
|
|
462
|
-
// a slot. Keep the immutable owned root, but project the real light-DOM
|
|
463
|
-
// viewer so host selectors and legacy deep overrides work as documented.
|
|
464
443
|
const slot = documentRef.createElement('slot');
|
|
465
444
|
slot.dataset.fileViewerLightDomSlot = 'true';
|
|
466
445
|
existingHostShadowRoot.replaceChildren(slot);
|
|
@@ -468,9 +447,6 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
468
447
|
}
|
|
469
448
|
renderRoot.replaceChildren();
|
|
470
449
|
const styleHandle = appendFileViewerStyle(renderRoot, WEB_VIEWER_STYLE, {
|
|
471
|
-
// Adopt only into a root owned by the viewer. Adopting into an ancestor
|
|
472
|
-
// ShadowRoot would leak toolbar selectors and apply :host rules to the
|
|
473
|
-
// customer's custom element.
|
|
474
450
|
adoptedStyleSheet: isFileViewerShadowRoot(renderRoot),
|
|
475
451
|
});
|
|
476
452
|
const shell = documentRef.createElement('div');
|
|
@@ -539,6 +515,7 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
539
515
|
syncFileViewerRenderSurfaceBackground(shell, currentOptions.options);
|
|
540
516
|
};
|
|
541
517
|
const captureToolbarFocus = createToolbarFocusRestorer(toolbarEl, contentEl);
|
|
518
|
+
const disposeToolbarKeyboard = bindToolbarKeyboardActivation(toolbarEl);
|
|
542
519
|
let controller = null;
|
|
543
520
|
let searchDraft = '';
|
|
544
521
|
const isSearchToolbarVisible = (toolbar, options) => {
|
|
@@ -684,12 +661,6 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
684
661
|
group.appendChild(createReadonlyMeter(documentRef, zoomState.label, 'file-viewer-web-zoom-meter'));
|
|
685
662
|
}
|
|
686
663
|
if (zoomButtons.zoomReset) {
|
|
687
|
-
// Placed before the zoom-in button (not after) so that toggling this
|
|
688
|
-
// button's visibility never shifts the zoom-in button's position: the
|
|
689
|
-
// toolbar group is right-aligned, and both icon buttons share the same
|
|
690
|
-
// width, so inserting "1:1" after "+" would make it land exactly on
|
|
691
|
-
// top of the previous "+" position, turning a repeated zoom-in click
|
|
692
|
-
// into an accidental reset (see GitHub issue #88).
|
|
693
664
|
const button = createButton(documentRef, '1:1', 'file-viewer-web-icon-button', () => controller === null || controller === void 0 ? void 0 : controller.resetZoom());
|
|
694
665
|
button.title = t('toolbar.zoomReset');
|
|
695
666
|
button.dataset.viewerToolbarKey = 'zoom-reset';
|
|
@@ -996,9 +967,6 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
996
967
|
}
|
|
997
968
|
};
|
|
998
969
|
if (currentSource) {
|
|
999
|
-
// The initial declarative source has no caller awaiting it. State changes
|
|
1000
|
-
// and the visible error surface remain authoritative without a global
|
|
1001
|
-
// unhandled-rejection event for an expected rendering failure.
|
|
1002
970
|
void loadSource(currentSource).catch(() => undefined);
|
|
1003
971
|
}
|
|
1004
972
|
controller = {
|
|
@@ -1068,6 +1036,7 @@ export const mountViewer = (container, initialOptions = {}, coreOptions = {}) =>
|
|
|
1068
1036
|
if (disposed)
|
|
1069
1037
|
return;
|
|
1070
1038
|
disposed = true;
|
|
1039
|
+
disposeToolbarKeyboard();
|
|
1071
1040
|
cancel();
|
|
1072
1041
|
(_a = viewerColorSchemeQuery === null || viewerColorSchemeQuery === void 0 ? void 0 : viewerColorSchemeQuery.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(viewerColorSchemeQuery, 'change', handleViewerColorSchemeChange);
|
|
1073
1042
|
void instance.destroy('component-unmount');
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type FileViewerI18nInput } from
|
|
1
|
+
import { type FileViewerI18nInput } from "../i18n/messages.js";
|
|
2
2
|
export type ViewerSourcePhase = 'downloading' | 'reading' | 'streamingPdf';
|
|
3
|
-
/** The shell owns acquisition feedback; renderers retain their own error surface. */
|
|
4
3
|
export declare const createViewerSourceFeedback: (shell: HTMLElement, content: HTMLElement) => (phase: ViewerSourcePhase | null, error: unknown, extension: string, options?: FileViewerI18nInput, rendererHasError?: boolean) => void;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { createFileViewerTranslator } from
|
|
2
|
-
import { createFileViewerErrorState } from
|
|
3
|
-
/** The shell owns acquisition feedback; renderers retain their own error surface. */
|
|
1
|
+
import { createFileViewerTranslator } from "../i18n/messages.js";
|
|
2
|
+
import { createFileViewerErrorState } from "../viewer/state.js";
|
|
4
3
|
export const createViewerSourceFeedback = (shell, content) => {
|
|
5
4
|
let surface = null;
|
|
6
5
|
let title = null;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/** Preserve the active logical action across state-driven toolbar rebuilds. */
|
|
2
1
|
export function createToolbarFocusRestorer(toolbar, content) {
|
|
3
2
|
let pendingKey = null;
|
|
4
3
|
const controls = () => Array.from(toolbar.querySelectorAll('[data-viewer-toolbar-key]'));
|
|
@@ -35,8 +34,6 @@ export function createToolbarFocusRestorer(toolbar, content) {
|
|
|
35
34
|
target.setSelectionRange(selection[0], selection[1], selection[2] || undefined);
|
|
36
35
|
}
|
|
37
36
|
else {
|
|
38
|
-
// All actions may be temporarily disabled during a load. Restore only
|
|
39
|
-
// while the user remains here; moving elsewhere clears this pending key.
|
|
40
37
|
pendingKey = key;
|
|
41
38
|
toolbar.tabIndex = -1;
|
|
42
39
|
toolbar.focus({ preventScroll: true });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function bindToolbarKeyboardActivation(toolbar: HTMLElement): () => void;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const isSpace = (event) => event.code === 'Space' || event.key === ' ' || event.key === 'Spacebar';
|
|
2
|
+
export function bindToolbarKeyboardActivation(toolbar) {
|
|
3
|
+
var _a;
|
|
4
|
+
const documentRef = toolbar.ownerDocument;
|
|
5
|
+
let pending = null;
|
|
6
|
+
let releaseTimer;
|
|
7
|
+
const clear = () => { pending = null; };
|
|
8
|
+
const clearOnSpaceDown = (event) => {
|
|
9
|
+
if (isSpace(event) || event.key === 'Tab' || event.key === 'Escape')
|
|
10
|
+
clear();
|
|
11
|
+
};
|
|
12
|
+
const clearAfterSpaceUp = (event) => {
|
|
13
|
+
if (!isSpace(event))
|
|
14
|
+
return;
|
|
15
|
+
const released = pending;
|
|
16
|
+
clearTimeout(releaseTimer);
|
|
17
|
+
releaseTimer = setTimeout(() => { if (pending === released)
|
|
18
|
+
clear(); }, 0);
|
|
19
|
+
};
|
|
20
|
+
const buttonFor = (event) => {
|
|
21
|
+
const target = event.target;
|
|
22
|
+
return (target === null || target === void 0 ? void 0 : target.tagName) === 'BUTTON' && toolbar.contains(target) ? target : null;
|
|
23
|
+
};
|
|
24
|
+
const onKeyDown = (event) => {
|
|
25
|
+
if (!isSpace(event) || event.defaultPrevented || event.isComposing || event.altKey || event.ctrlKey || event.metaKey)
|
|
26
|
+
return;
|
|
27
|
+
const button = buttonFor(event);
|
|
28
|
+
if (!(button === null || button === void 0 ? void 0 : button.dataset.viewerToolbarKey) || button.disabled)
|
|
29
|
+
return;
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
pending = { key: button.dataset.viewerToolbarKey };
|
|
32
|
+
};
|
|
33
|
+
const onKeyUp = (event) => {
|
|
34
|
+
if (!isSpace(event))
|
|
35
|
+
return;
|
|
36
|
+
const activation = pending;
|
|
37
|
+
clear();
|
|
38
|
+
if (!activation || event.defaultPrevented || event.isComposing || event.altKey || event.ctrlKey || event.metaKey)
|
|
39
|
+
return;
|
|
40
|
+
const button = buttonFor(event);
|
|
41
|
+
if (!button || button.disabled || button.dataset.viewerToolbarKey !== activation.key)
|
|
42
|
+
return;
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
button.click();
|
|
45
|
+
};
|
|
46
|
+
documentRef.addEventListener('keydown', clearOnSpaceDown, true);
|
|
47
|
+
documentRef.addEventListener('keyup', clearAfterSpaceUp, true);
|
|
48
|
+
documentRef.addEventListener('pointerdown', clear, true);
|
|
49
|
+
(_a = documentRef.defaultView) === null || _a === void 0 ? void 0 : _a.addEventListener('blur', clear);
|
|
50
|
+
toolbar.addEventListener('keydown', onKeyDown);
|
|
51
|
+
toolbar.addEventListener('keyup', onKeyUp);
|
|
52
|
+
return () => {
|
|
53
|
+
var _a;
|
|
54
|
+
clear();
|
|
55
|
+
clearTimeout(releaseTimer);
|
|
56
|
+
documentRef.removeEventListener('keydown', clearOnSpaceDown, true);
|
|
57
|
+
documentRef.removeEventListener('keyup', clearAfterSpaceUp, true);
|
|
58
|
+
documentRef.removeEventListener('pointerdown', clear, true);
|
|
59
|
+
(_a = documentRef.defaultView) === null || _a === void 0 ? void 0 : _a.removeEventListener('blur', clear);
|
|
60
|
+
toolbar.removeEventListener('keydown', onKeyDown);
|
|
61
|
+
toolbar.removeEventListener('keyup', onKeyUp);
|
|
62
|
+
};
|
|
63
|
+
}
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "./index.js";
|
|
2
|
+
export * from "./browser/controller.js";
|
package/dist/browser.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "./index.js";
|
|
2
|
+
export * from "./browser/controller.js";
|
package/dist/config/options.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from
|
|
1
|
+
import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from "../contracts/types.js";
|
|
2
2
|
export type FileViewerSerializableToolbarOptions = Omit<FileViewerToolbarOptions, 'beforeOperation' | 'beforeDownload' | 'beforePrint' | 'beforeExportHtml'>;
|
|
3
3
|
export type FileViewerSerializableCadOptions = Omit<FileViewerCadOptions, 'workerUrl'> & {
|
|
4
4
|
workerUrl?: string;
|