@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.
Files changed (111) hide show
  1. package/dist/assets.d.ts +2 -2
  2. package/dist/assets.js +1 -5
  3. package/dist/browser/controller.d.ts +1 -2
  4. package/dist/browser/controller.js +8 -39
  5. package/dist/browser/source-feedback.d.ts +1 -2
  6. package/dist/browser/source-feedback.js +2 -3
  7. package/dist/browser/toolbar-focus.d.ts +0 -1
  8. package/dist/browser/toolbar-focus.js +0 -3
  9. package/dist/browser/toolbar-keyboard.d.ts +1 -0
  10. package/dist/browser/toolbar-keyboard.js +63 -0
  11. package/dist/browser.d.ts +2 -2
  12. package/dist/browser.js +2 -2
  13. package/dist/config/options.d.ts +1 -1
  14. package/dist/contracts/types.d.ts +1 -470
  15. package/dist/contracts/xml.d.ts +0 -11
  16. package/dist/export.d.ts +3 -10
  17. package/dist/export.js +2 -9
  18. package/dist/exportDocument.d.ts +1 -12
  19. package/dist/exportDocument.js +2 -31
  20. package/dist/features/document/dom/anchors.d.ts +1 -1
  21. package/dist/features/document/dom/index.d.ts +5 -5
  22. package/dist/features/document/dom/index.js +3 -3
  23. package/dist/features/document/dom/providers.d.ts +1 -1
  24. package/dist/features/document/events.d.ts +2 -2
  25. package/dist/features/document/events.js +3 -3
  26. package/dist/features/document/fit.d.ts +1 -1
  27. package/dist/features/document/fit.js +1 -1
  28. package/dist/features/document/imageHandTool.d.ts +0 -2
  29. package/dist/features/document/imageHandTool.js +1 -5
  30. package/dist/features/document/model.d.ts +1 -1
  31. package/dist/features/document/search.d.ts +1 -1
  32. package/dist/features/document/search.js +2 -2
  33. package/dist/features/document/viewState.d.ts +1 -1
  34. package/dist/features/document/viewState.js +2 -2
  35. package/dist/features/document/zoom.d.ts +1 -1
  36. package/dist/features/document/zoom.js +3 -3
  37. package/dist/features/document/zoomGestures.d.ts +2 -2
  38. package/dist/features/document/zoomGestures.js +0 -2
  39. package/dist/features/printMask.d.ts +1 -1
  40. package/dist/features/printMaskDesigner.d.ts +2 -6
  41. package/dist/features/printMaskDesigner.js +2 -11
  42. package/dist/features/printMaskLoader.d.ts +1 -7
  43. package/dist/features/printMaskLoader.js +1 -7
  44. package/dist/features/watermark.d.ts +1 -1
  45. package/dist/headless.d.ts +29 -29
  46. package/dist/headless.js +16 -21
  47. package/dist/i18n/messages.d.ts +1 -1
  48. package/dist/i18n/messages.de.d.ts +1 -5
  49. package/dist/i18n/messages.de.js +1 -5
  50. package/dist/i18n/messages.ja.d.ts +1 -6
  51. package/dist/i18n/messages.ja.js +1 -6
  52. package/dist/i18n/messages.js +4 -4
  53. package/dist/index.d.ts +77 -77
  54. package/dist/index.js +39 -39
  55. package/dist/lifecycle/facade.d.ts +4 -4
  56. package/dist/lifecycle/facade.js +2 -2
  57. package/dist/lifecycle/operations.d.ts +4 -5
  58. package/dist/lifecycle/operations.js +4 -10
  59. package/dist/output/canvasImage.d.ts +1 -2
  60. package/dist/output/canvasImage.js +1 -4
  61. package/dist/output/export.d.ts +1 -3
  62. package/dist/output/export.js +0 -12
  63. package/dist/output/printLayout.d.ts +0 -5
  64. package/dist/output/printLayout.js +0 -4
  65. package/dist/output/snapshotDownload.d.ts +1 -2
  66. package/dist/output/snapshotDownload.js +2 -3
  67. package/dist/platform/assets.d.ts +4 -11
  68. package/dist/platform/assets.js +20 -45
  69. package/dist/platform/copiedAssets.d.ts +0 -1
  70. package/dist/platform/copiedAssets.js +1 -2
  71. package/dist/presentation/colorScheme.d.ts +1 -2
  72. package/dist/presentation/colorScheme.js +1 -2
  73. package/dist/presentation/state.d.ts +1 -1
  74. package/dist/presentation/state.js +3 -3
  75. package/dist/print-mask.d.ts +2 -2
  76. package/dist/print-mask.js +1 -1
  77. package/dist/registry/capabilities.d.ts +1 -14
  78. package/dist/registry/capabilities.js +2 -15
  79. package/dist/registry/formats.d.ts +1 -1
  80. package/dist/registry/formats.generated.d.ts +2 -3
  81. package/dist/registry/formats.generated.js +2 -3
  82. package/dist/registry/formats.js +2 -2
  83. package/dist/registry/registry.d.ts +1 -15
  84. package/dist/registry/registry.js +2 -10
  85. package/dist/renderers/image.d.ts +1 -1
  86. package/dist/renderers/image.js +5 -7
  87. package/dist/renderers/index.d.ts +3 -3
  88. package/dist/renderers/index.js +5 -11
  89. package/dist/rendering/dispatcher.d.ts +1 -6
  90. package/dist/rendering/dispatcher.js +3 -3
  91. package/dist/rendering/handler.d.ts +3 -13
  92. package/dist/rendering/handler.js +9 -21
  93. package/dist/security/svgResources.d.ts +0 -10
  94. package/dist/security/svgResources.js +0 -12
  95. package/dist/source/index.d.ts +3 -3
  96. package/dist/source/index.js +1 -1
  97. package/dist/source/loading.d.ts +4 -4
  98. package/dist/source/loading.js +4 -7
  99. package/dist/source/precheck.d.ts +1 -13
  100. package/dist/source/precheck.js +2 -9
  101. package/dist/source/textEncoding.d.ts +0 -18
  102. package/dist/source/textEncoding.js +0 -15
  103. package/dist/viewer/createViewer.d.ts +1 -1
  104. package/dist/viewer/createViewer.js +17 -28
  105. package/dist/viewer/loading.d.ts +2 -6
  106. package/dist/viewer/loading.js +1 -9
  107. package/dist/viewer/operations.d.ts +3 -3
  108. package/dist/viewer/operations.js +6 -14
  109. package/dist/viewer/state.d.ts +2 -6
  110. package/dist/viewer/state.js +3 -8
  111. package/package.json +3 -1
package/dist/assets.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from './platform/assets.js';
2
- export type * from './platform/assets.js';
1
+ export * from "./platform/assets.js";
2
+ export type * from "./platform/assets.js";
package/dist/assets.js CHANGED
@@ -1,5 +1 @@
1
- // Public subpath facade for `@file-viewer/core/assets`.
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 '../index.js';
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 '../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 { createViewerSourceFeedback } from './source-feedback.js';
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 '../i18n/messages.js';
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 '../i18n/messages.js';
2
- import { createFileViewerErrorState } from '../viewer/state.js';
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,2 +1 @@
1
- /** Preserve the active logical action across state-driven toolbar rebuilds. */
2
1
  export declare function createToolbarFocusRestorer(toolbar: HTMLElement, content: HTMLElement): () => (temporarilyUnavailable?: boolean) => void;
@@ -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 './index.js';
2
- export * from './browser/controller.js';
1
+ export * from "./index.js";
2
+ export * from "./browser/controller.js";
package/dist/browser.js CHANGED
@@ -1,2 +1,2 @@
1
- export * from './index.js';
2
- export * from './browser/controller.js';
1
+ export * from "./index.js";
2
+ export * from "./browser/controller.js";
@@ -1,4 +1,4 @@
1
- import type { FileViewerArchiveOptions, FileViewerCadOptions, FileViewerOptions, FileViewerResolvedThemeMode, FileViewerThemeMode, FileViewerToolbarOptions, FileViewerUiDensity } from '../contracts/types.js';
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;