@file-viewer/core 2.1.20 → 2.1.21

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.
@@ -42,6 +42,35 @@ export interface FileViewerWatermarkOptions {
42
42
  color?: string;
43
43
  fontFamily?: string;
44
44
  }
45
+ export type FileViewerBrandingPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
46
+ export interface FileViewerBrandLicenseCertificate {
47
+ format?: string;
48
+ product?: string;
49
+ project?: string;
50
+ licenseKind?: string;
51
+ permissions?: string[];
52
+ expiresAt?: string | null;
53
+ [key: string]: unknown;
54
+ }
55
+ export interface FileViewerBrandLicenseBundle {
56
+ format?: string;
57
+ licenseNo?: string;
58
+ algorithm?: string;
59
+ publicKey?: string;
60
+ privateKey?: string;
61
+ certificate?: FileViewerBrandLicenseCertificate | string;
62
+ signature?: string;
63
+ [key: string]: unknown;
64
+ }
65
+ export type FileViewerBrandLicenseInput = string | FileViewerBrandLicenseCertificate | FileViewerBrandLicenseBundle;
66
+ export interface FileViewerBrandingOptions {
67
+ enabled?: boolean;
68
+ text?: string;
69
+ href?: string;
70
+ title?: string;
71
+ position?: FileViewerBrandingPosition;
72
+ license?: FileViewerBrandLicenseInput;
73
+ }
45
74
  export interface FileViewerToolbarOptions {
46
75
  download?: boolean;
47
76
  print?: boolean;
@@ -453,6 +482,11 @@ export interface FileViewerOptions {
453
482
  */
454
483
  presets?: FileViewerRendererPresetInput;
455
484
  renderers?: FileViewerRendererPluginInput;
485
+ /**
486
+ * Built-in attribution badge. Pass `{ enabled:false, license }` with a
487
+ * Flyfish Viewer brand-removal authorization package to hide it legitimately.
488
+ */
489
+ branding?: boolean | FileViewerBrandingOptions;
456
490
  watermark?: boolean | FileViewerWatermarkOptions;
457
491
  ui?: FileViewerUiOptions;
458
492
  toolbar?: boolean | FileViewerToolbarOptions;
@@ -0,0 +1,17 @@
1
+ import type { FileViewerBrandLicenseInput, FileViewerBrandingOptions } from '../contracts/types';
2
+ export declare const FILE_VIEWER_BRAND_LICENSE_FORMAT = "flyfish-viewer-brand-license-v1";
3
+ export declare const FILE_VIEWER_BRAND_LICENSE_PRODUCT = "flyfish-viewer";
4
+ export declare const FILE_VIEWER_BRAND_LICENSE_PROJECT = "file-viewer";
5
+ export declare const FILE_VIEWER_BRAND_LICENSE_KIND = "brand-removal";
6
+ export declare const FILE_VIEWER_BRAND_LICENSE_PERMISSION = "remove-branding";
7
+ export interface FileViewerBrandingPresentationState {
8
+ visible: boolean;
9
+ licenseValid: boolean;
10
+ text: string;
11
+ href: string;
12
+ title: string;
13
+ inlineStyle: string;
14
+ }
15
+ export declare const isFileViewerBrandRemovalLicense: (input: FileViewerBrandLicenseInput | undefined, now?: number) => boolean;
16
+ export declare const buildFileViewerBrandingInlineStyle: (branding?: boolean | FileViewerBrandingOptions) => string;
17
+ export declare const resolveFileViewerBrandingPresentationState: (branding?: boolean | FileViewerBrandingOptions, now?: number) => FileViewerBrandingPresentationState;
@@ -0,0 +1,128 @@
1
+ export const FILE_VIEWER_BRAND_LICENSE_FORMAT = 'flyfish-viewer-brand-license-v1';
2
+ export const FILE_VIEWER_BRAND_LICENSE_PRODUCT = 'flyfish-viewer';
3
+ export const FILE_VIEWER_BRAND_LICENSE_PROJECT = 'file-viewer';
4
+ export const FILE_VIEWER_BRAND_LICENSE_KIND = 'brand-removal';
5
+ export const FILE_VIEWER_BRAND_LICENSE_PERMISSION = 'remove-branding';
6
+ const DEFAULT_BRANDING_TEXT = 'Powered by Flyfish Viewer';
7
+ const DEFAULT_BRANDING_HREF = '';
8
+ const DEFAULT_BRANDING_TITLE = 'Flyfish Viewer';
9
+ const isRecord = (value) => {
10
+ return !!value && typeof value === 'object' && !Array.isArray(value);
11
+ };
12
+ const readJson = (value) => {
13
+ try {
14
+ return JSON.parse(value);
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ };
20
+ const normalizeLicenseInput = (input) => {
21
+ const value = typeof input === 'string' ? readJson(input) : input;
22
+ if (!isRecord(value)) {
23
+ return null;
24
+ }
25
+ const certificateValue = 'certificate' in value ? value.certificate : value;
26
+ const certificate = typeof certificateValue === 'string'
27
+ ? readJson(certificateValue)
28
+ : certificateValue;
29
+ if (!isRecord(certificate)) {
30
+ return null;
31
+ }
32
+ return {
33
+ certificate,
34
+ signature: typeof value.signature === 'string' ? value.signature.trim() : '',
35
+ };
36
+ };
37
+ const getString = (record, key) => {
38
+ const value = record[key];
39
+ return typeof value === 'string' ? value.trim() : '';
40
+ };
41
+ const hasPermission = (record, permission) => {
42
+ const permissions = record.permissions;
43
+ return Array.isArray(permissions) && permissions.some(item => item === permission);
44
+ };
45
+ const isWithinValidTime = (record, now) => {
46
+ const expiresAt = getString(record, 'expiresAt');
47
+ if (!expiresAt) {
48
+ return true;
49
+ }
50
+ const timestamp = Date.parse(expiresAt);
51
+ return Number.isFinite(timestamp) && timestamp >= now;
52
+ };
53
+ export const isFileViewerBrandRemovalLicense = (input, now = Date.now()) => {
54
+ const normalized = normalizeLicenseInput(input);
55
+ if (!normalized || !normalized.signature) {
56
+ return false;
57
+ }
58
+ const certificate = normalized.certificate;
59
+ return getString(certificate, 'format') === FILE_VIEWER_BRAND_LICENSE_FORMAT
60
+ && getString(certificate, 'product') === FILE_VIEWER_BRAND_LICENSE_PRODUCT
61
+ && getString(certificate, 'project') === FILE_VIEWER_BRAND_LICENSE_PROJECT
62
+ && getString(certificate, 'licenseKind') === FILE_VIEWER_BRAND_LICENSE_KIND
63
+ && hasPermission(certificate, FILE_VIEWER_BRAND_LICENSE_PERMISSION)
64
+ && isWithinValidTime(certificate, now);
65
+ };
66
+ const normalizeBrandingOptions = (branding) => {
67
+ if (branding === undefined || branding === false) {
68
+ return null;
69
+ }
70
+ if (branding === true) {
71
+ return { enabled: true };
72
+ }
73
+ return branding;
74
+ };
75
+ const resolvePositionStyle = (position) => {
76
+ switch (position) {
77
+ case 'bottom-left':
78
+ return 'left:10px;bottom:10px;';
79
+ case 'top-left':
80
+ return 'left:10px;top:10px;';
81
+ case 'top-right':
82
+ return 'right:10px;top:10px;';
83
+ case 'bottom-right':
84
+ default:
85
+ return 'right:10px;bottom:10px;';
86
+ }
87
+ };
88
+ export const buildFileViewerBrandingInlineStyle = (branding) => {
89
+ const normalized = normalizeBrandingOptions(branding);
90
+ if (!normalized) {
91
+ return '';
92
+ }
93
+ return [
94
+ 'position:absolute',
95
+ resolvePositionStyle(normalized.position),
96
+ 'z-index:30',
97
+ 'display:inline-flex',
98
+ 'align-items:center',
99
+ 'max-width:calc(100% - 20px)',
100
+ 'height:24px',
101
+ 'padding:0 9px',
102
+ 'border-radius:999px',
103
+ 'box-sizing:border-box',
104
+ 'background:rgba(15,23,42,0.68)',
105
+ 'color:#fff',
106
+ 'font:500 11px/1 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif',
107
+ 'text-decoration:none',
108
+ 'white-space:nowrap',
109
+ 'overflow:hidden',
110
+ 'text-overflow:ellipsis',
111
+ 'backdrop-filter:blur(8px)',
112
+ 'box-shadow:0 6px 18px rgba(15,23,42,0.18)',
113
+ ].join(';');
114
+ };
115
+ export const resolveFileViewerBrandingPresentationState = (branding, now = Date.now()) => {
116
+ var _a, _b, _c;
117
+ const normalized = normalizeBrandingOptions(branding);
118
+ const licenseValid = !!normalized && isFileViewerBrandRemovalLicense(normalized.license, now);
119
+ const visible = !!normalized && (normalized.enabled !== false || !licenseValid);
120
+ return {
121
+ visible,
122
+ licenseValid,
123
+ text: ((_a = normalized === null || normalized === void 0 ? void 0 : normalized.text) === null || _a === void 0 ? void 0 : _a.trim()) || DEFAULT_BRANDING_TEXT,
124
+ href: ((_b = normalized === null || normalized === void 0 ? void 0 : normalized.href) === null || _b === void 0 ? void 0 : _b.trim()) || DEFAULT_BRANDING_HREF,
125
+ title: ((_c = normalized === null || normalized === void 0 ? void 0 : normalized.title) === null || _c === void 0 ? void 0 : _c.trim()) || DEFAULT_BRANDING_TITLE,
126
+ inlineStyle: visible ? buildFileViewerBrandingInlineStyle(normalized || undefined) : '',
127
+ };
128
+ };
@@ -22,6 +22,8 @@ export { cancelFileViewerPreviewRequest, DEFAULT_FILE_VIEWER_PREVIEW_LOAD_ERROR_
22
22
  export type { CancelFileViewerPreviewRequestInput, CommitFileViewerEmptyPreviewResetStateInput, CommitFileViewerLoadStartStateInput, CommitFileViewerPreviewRequestStartStateInput, CommitFileViewerRenderCompleteStateInput, CommitFileViewerRemoteDownloadStateInput, CreateFileViewerLoadStartStateInput, CreateFileViewerPreviewStateTargetInput, CreateFileViewerReadPreviewStateInput, CreateFileViewerRenderCompleteStateInput, CreateFileViewerSourceLoadingActionHandlersInput, FileViewerEmptyPreviewState, FileViewerFileRefSourcePlan, FileViewerLocalFilePreviewState, FileViewerLoadStartState, FileViewerLocationLike, FileViewerMutableAccessor, FileViewerPreviewComponentUnmountState, FileViewerPreviewLoadErrorKind, FileViewerPreviewLoadErrorLogger, FileViewerPreviewLoadErrorPrefixes, FileViewerPreviewRequestResetState, FileViewerPreviewRequestRunState, FileViewerReadAndRenderFileState, FileViewerReadPreviewState, FileViewerRemoteDownloadState, FileViewerRemoteFileDownloadInput, FileViewerRemoteFilePreviewErrorKind, FileViewerRemoteFilePreviewState, FileViewerRemoteSourcePlan, FileViewerRenderCompleteState, FileViewerRenderReadinessState, FileViewerRequestController, FileViewerRequestScope, FileViewerSourceLoadingActionHandlers, FileViewerStreamingPdfPreviewState, FinalizeFileViewerPreviewLoadStateInput, MutableFileViewerPreviewFilenameState, MutableFileViewerPreviewRequestState, MutableFileViewerPreviewSourceUrlState, MutableFileViewerPreviewState, MutableFileViewerReadPreviewState, MutableFileViewerRenderReadinessState, ReportFileViewerMissingRemoteDataInput, ReportFileViewerPreviewLoadErrorInput, ResolveFileViewerFileRefSourcePlanInput, ResolveFileViewerMissingRemoteDataErrorMessageInput, ResolveFileViewerPreviewLoadErrorMessageInput, ResolveFileViewerPreviewRequestReasonInput, RunFileViewerLocalFilePreviewInput, RunFileViewerPreviewComponentUnmountInput, RunFileViewerPreviewRequestInput, RunFileViewerPreviewSourceChangeInput, RunFileViewerReadAndRenderFileInput, RunFileViewerRemoteFilePreviewInput, RunFileViewerStreamingPdfPreviewInput, } from './source/loading';
23
23
  export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION, FILE_VIEWER_PREVIEW_MESSAGES, createFileViewerEmptyState, createFileViewerErrorState, createFileViewerPreviewLoadingState, createFileViewerReadyState, createFileViewerUnsupportedState, formatFileViewerErrorMessage, normalizeFileViewerErrorMessage, } from './viewer/state';
24
24
  export type { FileViewerErrorMessageFormatter, } from './viewer/state';
25
+ export { FILE_VIEWER_BRAND_LICENSE_FORMAT, FILE_VIEWER_BRAND_LICENSE_KIND, FILE_VIEWER_BRAND_LICENSE_PERMISSION, FILE_VIEWER_BRAND_LICENSE_PRODUCT, FILE_VIEWER_BRAND_LICENSE_PROJECT, buildFileViewerBrandingInlineStyle, isFileViewerBrandRemovalLicense, resolveFileViewerBrandingPresentationState, } from './features/branding';
26
+ export type { FileViewerBrandingPresentationState, } from './features/branding';
25
27
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark';
26
28
  export type { FileViewerWatermarkPresentationState, FileViewerWatermarkStyle, } from './features/watermark';
27
- export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
29
+ export type { FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerBrandingOptions, FileViewerBrandingPosition, FileViewerBrandLicenseBundle, FileViewerBrandLicenseCertificate, FileViewerBrandLicenseInput, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerDownloadOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoOptions, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderStateKind, FileViewerRenderedInstance, FileViewerRendererCategory, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RenderSurface, RendererCapability, RendererDefinition, RendererLoadContext, RendererLoader, RendererPlugin, RendererRegistry, RendererSession, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/headless.js CHANGED
@@ -17,4 +17,5 @@ export { buildFileRenderContextFromLoadContext, createFileRenderHandlerRegistry,
17
17
  export { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, decodeFilename, getExtension, normalizeFileExtension, normalizeFilename, normalizeSource, readFileViewerBuffer, readFileViewerDataUrl, readFileViewerText, resolveFileViewerSourceFilename, wrapFileViewerFileRef, } from './source/index.js';
18
18
  export { cancelFileViewerPreviewRequest, DEFAULT_FILE_VIEWER_PREVIEW_LOAD_ERROR_LOGGER, DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME, DEFAULT_PDF_RANGE_CHUNK_SIZE, FILE_VIEWER_PREVIEW_LOAD_ERROR_PREFIXES, FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE, applyFileViewerEmptyPreviewState, applyFileViewerPreviewFilenameState, applyFileViewerPreviewRequestResetState, applyFileViewerPreviewSourceUrlState, applyFileViewerReadPreviewState, applyFileViewerRenderReadinessState, commitFileViewerEmptyPreviewResetState, commitFileViewerLoadStartState, commitFileViewerPreviewRequestStartState, commitFileViewerRemoteDownloadState, createFileViewerEmptyPreviewState, createFileViewerLoadStartState, createFileViewerPreviewRequestResetState, createFileViewerPreviewStateTarget, createFileViewerReadPreviewState, createFileViewerRenderCompleteState, createFileViewerRequestController, createFileViewerRequestScope, createFileViewerSourceLoadingActionHandlers, createFileViewerStreamingPdfPlaceholderFile, finalizeFileViewerPreviewLoadState, hasFileViewerPreviewSource, isFileViewerAbortError, isSameOriginUrl, normalizeFileViewerSourceUrl, normalizePdfStreamingMode, reportFileViewerMissingRemoteData, reportFileViewerPreviewLoadError, resolveFileViewerFileRefSourcePlan, resolveFileViewerLoadStartMessage, resolveFileViewerMissingRemoteDataErrorMessage, resolveFileViewerPageHref, resolveFileViewerPreviewLoadErrorMessage, resolveFileViewerPreviewRequestReason, resolveFileViewerRemoteSourcePlan, runFileViewerLocalFilePreview, runFileViewerPreviewComponentUnmount, runFileViewerPreviewRequest, runFileViewerPreviewSourceChange, runFileViewerRemoteFilePreview, runFileViewerReadAndRenderFile, runFileViewerStreamingPdfPreview, shouldStreamPdfUrl, } from './source/loading.js';
19
19
  export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION, FILE_VIEWER_PREVIEW_MESSAGES, createFileViewerEmptyState, createFileViewerErrorState, createFileViewerPreviewLoadingState, createFileViewerReadyState, createFileViewerUnsupportedState, formatFileViewerErrorMessage, normalizeFileViewerErrorMessage, } from './viewer/state.js';
20
+ export { FILE_VIEWER_BRAND_LICENSE_FORMAT, FILE_VIEWER_BRAND_LICENSE_KIND, FILE_VIEWER_BRAND_LICENSE_PERMISSION, FILE_VIEWER_BRAND_LICENSE_PRODUCT, FILE_VIEWER_BRAND_LICENSE_PROJECT, buildFileViewerBrandingInlineStyle, isFileViewerBrandRemovalLicense, resolveFileViewerBrandingPresentationState, } from './features/branding.js';
20
21
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark.js';
package/dist/index.d.ts CHANGED
@@ -65,6 +65,8 @@ export { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, decodeFilename, getExtension, norm
65
65
  export type { FileViewerReadResult } from './source';
66
66
  export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION, FILE_VIEWER_PREVIEW_MESSAGES, createFileViewerEmptyState, createFileViewerErrorState, createFileViewerPreviewLoadingState, createFileViewerReadyState, createFileViewerUnsupportedState, formatFileViewerErrorMessage, normalizeFileViewerErrorMessage, resolveFileViewerRendererInstallHint, } from './viewer/state';
67
67
  export type { FileViewerErrorMessageFormatter, FileViewerRendererInstallHint, } from './viewer/state';
68
+ export { FILE_VIEWER_BRAND_LICENSE_FORMAT, FILE_VIEWER_BRAND_LICENSE_KIND, FILE_VIEWER_BRAND_LICENSE_PERMISSION, FILE_VIEWER_BRAND_LICENSE_PRODUCT, FILE_VIEWER_BRAND_LICENSE_PROJECT, buildFileViewerBrandingInlineStyle, isFileViewerBrandRemovalLicense, resolveFileViewerBrandingPresentationState, } from './features/branding';
69
+ export type { FileViewerBrandingPresentationState, } from './features/branding';
68
70
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark';
69
71
  export type { FileViewerWatermarkPresentationState, FileViewerWatermarkStyle, } from './features/watermark';
70
72
  export { cancelFileViewerPreviewRequest, DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_LOAD_ERROR_LOGGER, DEFAULT_PDF_RANGE_CHUNK_SIZE, FILE_VIEWER_PREVIEW_LOAD_ERROR_PREFIXES, FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE, applyFileViewerEmptyPreviewState, applyFileViewerPreviewFilenameState, applyFileViewerPreviewSourceUrlState, applyFileViewerReadPreviewState, applyFileViewerRenderReadinessState, applyFileViewerPreviewRequestResetState, commitFileViewerEmptyPreviewResetState, commitFileViewerLoadStartState, commitFileViewerPreviewRequestStartState, commitFileViewerRenderCompleteState, commitFileViewerRemoteDownloadState, createFileViewerEmptyPreviewState, createFileViewerLoadStartState, createFileViewerPreviewStateTarget, createFileViewerSourceLoadingActionHandlers, createFileViewerReadPreviewState, createFileViewerPreviewRequestResetState, createFileViewerRenderCompleteState, createFileViewerRequestController, createFileViewerRequestScope, createFileViewerStreamingPdfPlaceholderFile, finalizeFileViewerPreviewLoadState, hasFileViewerPreviewSource, isFileViewerAbortError, isSameOriginUrl, normalizeFileViewerSourceUrl, normalizePdfStreamingMode, resolveFileViewerFileRefSourcePlan, resolveFileViewerLoadStartMessage, resolveFileViewerMissingRemoteDataErrorMessage, resolveFileViewerPreviewLoadErrorMessage, resolveFileViewerPreviewRequestReason, resolveFileViewerRemoteSourcePlan, resolveFileViewerPageHref, reportFileViewerMissingRemoteData, reportFileViewerPreviewLoadError, runFileViewerLocalFilePreview, runFileViewerPreviewComponentUnmount, runFileViewerPreviewRequest, runFileViewerPreviewSourceChange, runFileViewerRemoteFilePreview, runFileViewerReadAndRenderFile, runFileViewerStreamingPdfPreview, shouldStreamPdfUrl, } from './source/loading';
@@ -85,4 +87,4 @@ export type { CreateFileViewerZoomControllerOptions, FileViewerZoomOperation, }
85
87
  export type { CreateViewerOptions } from './viewer/createViewer';
86
88
  export type { BuildExportHtmlDocumentOptions, BuildFileViewerRenderedHtmlDocumentOptions, } from './output/export';
87
89
  export type { CreateFileViewerWorkerControllerOptions, FileViewerWorkerContext, FileViewerWorkerController, FileViewerWorkerErrorHook, FileViewerWorkerEventHandler, FileViewerWorkerFactory, FileViewerWorkerMessageHook, WorkerProvider, WorkerRef, } from './platform/worker';
88
- export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
90
+ export type { FileViewerAiOptions, FileViewerArchiveEntryActionContext, FileViewerArchiveEntryActionPolicy, FileViewerArchiveEntryActionsOptions, FileViewerArchivePasswordRequestContext, FileViewerArchivePasswordRequestReason, FileViewerArchiveOptions, FileViewerApplyViewStateOptions, FileViewerBeforeOperation, FileViewerBrandingOptions, FileViewerBrandingPosition, FileViewerBrandLicenseBundle, FileViewerBrandLicenseCertificate, FileViewerBrandLicenseInput, FileViewerCadDwfLineWeightMode, FileViewerCadOptions, FileViewerCadRenderer, FileViewerComponentEmits, FileViewerComponentEventMap, FileViewerComponentProps, FileViewerDocumentAnchor, FileViewerDocumentChunk, FileViewerDownloadOptions, FileViewerDocxOptions, FileViewerDrawingOptions, FileViewerEvent, FileViewerEventHandler, FileViewerEventType, FileViewerExportHtmlOptions, FileViewerFileRef, FileViewerFitMode, FileViewerFitOptions, FileViewerFitRequest, FileViewerFitResize, FileViewerFitResult, FileViewerGeoBasemapOptions, FileViewerGeoBasemapPreset, FileViewerGeoOptions, FileRenderContext, FileRenderExportAdapter, FileRenderExportMode, FileRenderExportOptions, FileRenderHandler, FileRenderHandlerComposite, FileViewerBuiltinRendererPreset, FileViewerInstance, FileViewerLifecycleContext, FileViewerLifecycleHooks, FileViewerLifecyclePhase, FileViewerI18nOptions, FileViewerLocale, FileViewerMessageKey, FileViewerMessageParams, FileViewerMessageResolver, FileViewerMessages, FileViewerNavigationState, FileViewerOperationAvailability, FileViewerOperationContext, FileViewerOperationType, FileViewerOptions, FileViewerPdfOptions, FileViewerPresentationOptions, FileViewerPrintOptions, FileViewerPublicApi, FileViewerRenderedInstance, FileViewerRendererMode, FileViewerRendererPluginAssetKind, FileViewerRendererPluginAssetManifest, FileViewerRendererPluginAssetEntry, FileViewerRenderStateKind, FileViewerRendererCategory, FileViewerRendererHandlerRegistration, FileViewerRendererInstallContext, FileViewerRendererPlugin, FileViewerRendererPluginInput, FileViewerRendererPresetInput, FileViewerRendererPresetName, FileViewerRendererPreset, FileViewerSearchMatch, FileViewerSearchOptions, FileViewerSearchProvider, FileViewerSearchState, FileViewerSource, FileViewerSourceKind, FileViewerSpreadsheetOptions, FileViewerStateDescriptor, FileViewerStateTheme, FileViewerStyleIsolation, FileViewerThemeMode, FileViewerToolbarActionMap, FileViewerToolbarItem, FileViewerToolbarOptions, FileViewerToolbarPosition, FileViewerResolvedToolbarItem, FileViewerUiDensity, FileViewerUiOptions, FileViewerTypstOptions, FileViewerViewScrollState, FileViewerViewState, FileViewerViewStateChange, FileViewerViewStateChangeAction, FileViewerViewStateChangeSource, FileViewerViewStateProvider, FileViewerWatermarkOptions, FileViewerZoomProvider, FileViewerZoomState, NormalizedFileViewerSource, RendererCapability, RendererDefinition, RendererPlugin, RendererLoadContext, RendererLoader, RendererRegistry, RendererSession, RenderSurface, ViewerCapabilityState, ViewerLifecycleContext, ViewerOperationContext, } from './contracts/types';
package/dist/index.js CHANGED
@@ -172,6 +172,7 @@ export { createFileViewerRendererDispatcher, } from './rendering/dispatcher.js';
172
172
  export { appendFileViewerStyle, buildFileRenderContextFromLoadContext, applyFileViewerRenderSurfaceState, clearFileViewerRenderSurface, createFileRenderHandlerRendererSession, createFileRenderHandlerRegistry, createFileRenderHandlerLoader, createFileViewerRenderSurfaceActionHandlers, createFileViewerRenderReadinessTarget, createFileViewerRenderSurface, createFileViewerRenderSurfaceState, createFileViewerRenderSurfaceStateTarget, createFileViewerRenderTarget, DEFAULT_FILE_VIEWER_RENDER_TARGET_CLASS, DEFAULT_FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_LOGGER, FILE_VIEWER_RENDER_SESSION_DISPOSE_ERROR_MESSAGE, disposeActiveFileViewerRendererSession, disposeFileViewerRendered, disposeFileViewerRendererSession, getFileViewerShadowRootForNode, isFileViewerShadowRoot, normalizeFileViewerStyleIsolation, removeFileViewerRenderTarget, reportFileViewerRenderSessionDisposeError, resetFileViewerRenderSurface, resolveFileViewerStyleIsolation, resolveFileViewerRenderSessionDisposeErrorMessage, runFileViewerRenderSurfaceClear, runFileViewerRenderSurfaceMount, renderFileViewerHandler, } from './rendering/handler.js';
173
173
  export { DEFAULT_FILE_VIEWER_SOURCE_FILENAME, decodeFilename, getExtension, normalizeFileExtension, normalizeFilename, resolveFileViewerSourceFilename, normalizeSource, readFileViewerBuffer, readFileViewerDataUrl, readFileViewerText, wrapFileViewerFileRef, } from './source/index.js';
174
174
  export { DEFAULT_FILE_VIEWER_STATE_THEME, DEFAULT_FILE_VIEWER_UNSUPPORTED_DESCRIPTION, FILE_VIEWER_PREVIEW_MESSAGES, createFileViewerEmptyState, createFileViewerErrorState, createFileViewerPreviewLoadingState, createFileViewerReadyState, createFileViewerUnsupportedState, formatFileViewerErrorMessage, normalizeFileViewerErrorMessage, resolveFileViewerRendererInstallHint, } from './viewer/state.js';
175
+ export { FILE_VIEWER_BRAND_LICENSE_FORMAT, FILE_VIEWER_BRAND_LICENSE_KIND, FILE_VIEWER_BRAND_LICENSE_PERMISSION, FILE_VIEWER_BRAND_LICENSE_PRODUCT, FILE_VIEWER_BRAND_LICENSE_PROJECT, buildFileViewerBrandingInlineStyle, isFileViewerBrandRemovalLicense, resolveFileViewerBrandingPresentationState, } from './features/branding.js';
175
176
  export { buildFileViewerWatermarkBackgroundImage, buildFileViewerWatermarkInlineStyle, buildFileViewerWatermarkStyle, buildFileViewerWatermarkSvg, normalizeFileViewerWatermark, resolveFileViewerWatermarkPresentationState, } from './features/watermark.js';
176
177
  export { cancelFileViewerPreviewRequest, DEFAULT_FILE_VIEWER_STREAMING_PDF_FILENAME, DEFAULT_FILE_VIEWER_PREVIEW_LOAD_ERROR_LOGGER, DEFAULT_PDF_RANGE_CHUNK_SIZE, FILE_VIEWER_PREVIEW_LOAD_ERROR_PREFIXES, FILE_VIEWER_REMOTE_MISSING_DATA_ERROR_MESSAGE, applyFileViewerEmptyPreviewState, applyFileViewerPreviewFilenameState, applyFileViewerPreviewSourceUrlState, applyFileViewerReadPreviewState, applyFileViewerRenderReadinessState, applyFileViewerPreviewRequestResetState, commitFileViewerEmptyPreviewResetState, commitFileViewerLoadStartState, commitFileViewerPreviewRequestStartState, commitFileViewerRenderCompleteState, commitFileViewerRemoteDownloadState, createFileViewerEmptyPreviewState, createFileViewerLoadStartState, createFileViewerPreviewStateTarget, createFileViewerSourceLoadingActionHandlers, createFileViewerReadPreviewState, createFileViewerPreviewRequestResetState, createFileViewerRenderCompleteState, createFileViewerRequestController, createFileViewerRequestScope, createFileViewerStreamingPdfPlaceholderFile, finalizeFileViewerPreviewLoadState, hasFileViewerPreviewSource, isFileViewerAbortError, isSameOriginUrl, normalizeFileViewerSourceUrl, normalizePdfStreamingMode, resolveFileViewerFileRefSourcePlan, resolveFileViewerLoadStartMessage, resolveFileViewerMissingRemoteDataErrorMessage, resolveFileViewerPreviewLoadErrorMessage, resolveFileViewerPreviewRequestReason, resolveFileViewerRemoteSourcePlan, resolveFileViewerPageHref, reportFileViewerMissingRemoteData, reportFileViewerPreviewLoadError, runFileViewerLocalFilePreview, runFileViewerPreviewComponentUnmount, runFileViewerPreviewRequest, runFileViewerPreviewSourceChange, runFileViewerRemoteFilePreview, runFileViewerReadAndRenderFile, runFileViewerStreamingPdfPreview, shouldStreamPdfUrl, } from './source/loading.js';
177
178
  export { createViewer } from './viewer/createViewer.js';
@@ -17,6 +17,7 @@ import { createFileRenderHandlerLoader, applyFileViewerRenderSurfaceState, creat
17
17
  import { createFileViewerCoreRendererRegistry } from '../renderers/index.js';
18
18
  import { createFileViewerRequestScope } from '../source/loading.js';
19
19
  import { normalizeSource } from '../source/index.js';
20
+ import { resolveFileViewerBrandingPresentationState } from '../features/branding.js';
20
21
  import { buildFileViewerWatermarkInlineStyle } from '../features/watermark.js';
21
22
  import { createFileViewerUnsupportedState } from './state.js';
22
23
  const emitLifecycle = async (options, onEvent, phase, source, version, startedAt, reason) => {
@@ -107,6 +108,7 @@ export const createViewer = (container, createOptions = {}) => {
107
108
  let watermarkResizeObserver = null;
108
109
  let watermarkMutationObserver = null;
109
110
  let watermarkFrame = null;
111
+ let brandingEl = null;
110
112
  const getContainerWindow = () => container.ownerDocument.defaultView || (typeof window !== 'undefined' ? window : undefined);
111
113
  const cancelWatermarkFrame = () => {
112
114
  if (watermarkFrame === null) {
@@ -234,6 +236,40 @@ export const createViewer = (container, createOptions = {}) => {
234
236
  }
235
237
  startWatermarkObservers();
236
238
  };
239
+ const removeBrandingBadge = () => {
240
+ brandingEl === null || brandingEl === void 0 ? void 0 : brandingEl.remove();
241
+ brandingEl = null;
242
+ };
243
+ const syncBrandingBadge = () => {
244
+ const state = resolveFileViewerBrandingPresentationState(options.branding);
245
+ if (!state.visible) {
246
+ removeBrandingBadge();
247
+ return;
248
+ }
249
+ if (!brandingEl || brandingEl.ownerDocument !== container.ownerDocument) {
250
+ brandingEl = container.ownerDocument.createElement('a');
251
+ brandingEl.className = 'viewer-branding';
252
+ brandingEl.target = '_blank';
253
+ brandingEl.rel = 'noreferrer noopener';
254
+ }
255
+ if (state.href) {
256
+ brandingEl.href = state.href;
257
+ }
258
+ else {
259
+ brandingEl.removeAttribute('href');
260
+ }
261
+ brandingEl.textContent = state.text;
262
+ brandingEl.title = state.title;
263
+ brandingEl.setAttribute('aria-label', state.title);
264
+ brandingEl.style.cssText = state.inlineStyle;
265
+ const view = getContainerWindow();
266
+ if ((view === null || view === void 0 ? void 0 : view.getComputedStyle) && view.getComputedStyle(container).position === 'static' && !container.style.position) {
267
+ container.style.position = 'relative';
268
+ }
269
+ if (brandingEl.parentElement !== container) {
270
+ container.appendChild(brandingEl);
271
+ }
272
+ };
237
273
  const ensureRendererPluginsInstalled = async () => {
238
274
  const nextMode = options.rendererMode || 'extend';
239
275
  const nextRendererInput = options.renderers;
@@ -459,6 +495,7 @@ export const createViewer = (container, createOptions = {}) => {
459
495
  renderMissingRendererState(target, normalized.extension, options);
460
496
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session: null });
461
497
  syncWatermarkOverlay();
498
+ syncBrandingBadge();
462
499
  emitZoomAndOperationAvailabilityChange();
463
500
  await emitLifecycle(options, createOptions.onEvent, 'load-complete', normalized, version, startedAt);
464
501
  return null;
@@ -491,6 +528,7 @@ export const createViewer = (container, createOptions = {}) => {
491
528
  }
492
529
  applyFileViewerRenderSurfaceState(renderSurfaceState, { session });
493
530
  syncWatermarkOverlay();
531
+ syncBrandingBadge();
494
532
  zoomController.refreshProvider();
495
533
  viewStateController.refreshProvider();
496
534
  await documentActions.refreshDocumentIndex({ notify: false });
@@ -511,6 +549,7 @@ export const createViewer = (container, createOptions = {}) => {
511
549
  viewStateController.destroy();
512
550
  fitController.destroy();
513
551
  removeWatermarkOverlay();
552
+ removeBrandingBadge();
514
553
  },
515
554
  updateOptions(nextOptions) {
516
555
  const previousFit = options.fit;
@@ -519,6 +558,7 @@ export const createViewer = (container, createOptions = {}) => {
519
558
  ...nextOptions,
520
559
  };
521
560
  syncWatermarkOverlay();
561
+ syncBrandingBadge();
522
562
  if ('fit' in nextOptions && nextOptions.fit !== previousFit) {
523
563
  fitController.resetAutoFit();
524
564
  fitController.scheduleFit('resize');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@file-viewer/core",
3
- "version": "2.1.20",
3
+ "version": "2.1.21",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Framework-neutral modular TypeScript core for Flyfish File Viewer renderer orchestration, lifecycle APIs, search, zoom, print, and export",