{ "schemaVersion": 1, "description": "Native wrapper experience contract used while the viewer is being split into a pure TypeScript core and public framework wrappers.", "baseline": { "sourceBranch": "main", "rootPackage": "@flyfish-group/file-viewer-workspace", "versionSource": "package.json", "formatMatrixSource": "packages/core/src/registry/formats.ts", "wrapperManifestSource": "ecosystem/wrappers.json", "smokeMatrixSource": "ecosystem/smoke-matrix.json" }, "requiredScripts": [ "verify:demo-browser-smoke", "verify:component-browser-smoke", "verify:browser-smoke", "verify:smoke-matrix", "verify:wrapper-api", "verify:wrapper-options" ], "featureGroups": [ { "id": "source-loading", "evidence": ["url-source", "file-source", "buffer-source", "stale-request-guard", "loading-state"] }, { "id": "options", "evidence": ["options-behavior", "theme", "toolbar", "watermark", "search", "ai", "pdf", "docx", "typst", "archive", "cad"] }, { "id": "toolbar-operations", "evidence": ["download", "print", "export-html", "watermark-toggle", "capability-state", "capability-visibility", "before-operation"] }, { "id": "lifecycle-events", "evidence": ["event-callback", "native-wrapper-event", "load-start", "load-complete", "unload-start", "unload-complete"] }, { "id": "document-navigation", "evidence": ["anchors", "current-location", "scroll-to-line", "search-next-previous", "highlight"] }, { "id": "layout-visual", "evidence": ["dom-snapshot", "visual-screenshot", "paper-layout", "fit-to-view", "dark-mode-readability"] }, { "id": "print-export", "evidence": ["print-output", "export-output", "document-only-content", "page-size"] }, { "id": "wrapper-contract", "evidence": ["shared-core-version", "shared-options", "shared-events", "shared-controller-handle", "standalone-package"] } ], "surfaces": [ { "id": "vue3-current-component", "label": "Vue 3 wrapper component", "kind": "baseline-component", "packageName": "@flyfish-group/file-viewer3", "entryFiles": [ "packages/components/vue3/src/package/components/FileViewer/FileViewer.vue", "packages/components/vue3/src/package/index.ts", "apps/viewer-demo/src/main.ts" ], "smokeScripts": ["verify:demo-browser-smoke"], "preserves": ["source-loading", "options", "toolbar-operations", "lifecycle-events", "document-navigation", "layout-visual", "print-export"] }, { "id": "compare-page", "label": "Document compare page", "kind": "baseline-page", "packageName": "@flyfish-group/file-viewer3", "entryFiles": [ "apps/viewer-demo/src/compare/CompareApp.vue", "apps/viewer-demo/src/compare/main.ts", "apps/viewer-demo/src/compare/useSynchronizedScroll.ts" ], "smokeScripts": ["verify:demo-browser-smoke"], "preserves": ["source-loading", "document-navigation", "layout-visual"] }, { "id": "pure-web-native-viewer", "label": "Shared pure Web native viewer", "kind": "native-viewer", "packageName": "@file-viewer/web", "entryFiles": [ "packages/components/web/src/index.ts", "packages/components/web/src/global.ts", "packages/components/web/package.json" ], "smokeScripts": ["verify:component-browser-smoke"], "preserves": ["source-loading", "options", "lifecycle-events", "wrapper-contract"] }, { "id": "react-native-wrapper", "label": "React native component package", "kind": "native-wrapper", "wrapperId": "react", "packageName": "@flyfish-group/file-viewer-react", "entryFiles": ["packages/compat/react/src/index.tsx", "apps/component-demo/src/main.tsx"], "smokeScripts": ["verify:component-browser-smoke"], "preserves": ["source-loading", "options", "lifecycle-events", "wrapper-contract"] }, { "id": "pure-js-native-wrapper", "label": "Pure JS native component package", "kind": "native-wrapper", "wrapperId": "web", "packageName": "@flyfish-group/file-viewer-web", "entryFiles": ["packages/compat/web/src/index.ts", "apps/component-demo/manual-js.html"], "smokeScripts": ["verify:component-browser-smoke"], "preserves": ["source-loading", "options", "lifecycle-events", "wrapper-contract"] }, { "id": "script-tag-iife", "label": "Script tag IIFE entry", "kind": "script-tag", "wrapperId": "web", "packageName": "@file-viewer/web", "entryFiles": ["packages/components/web/src/global.ts", "apps/component-demo/manual-iife.html"], "smokeScripts": ["verify:component-browser-smoke"], "preserves": ["source-loading", "options", "wrapper-contract"] } ], "cases": [ { "id": "vue3-demo-markdown", "surface": "vue3-current-component", "smokeCaseId": "markdown-md", "sample": "markdown.md", "scripts": ["verify:demo-browser-smoke"], "features": ["source-loading", "options", "document-navigation", "layout-visual"], "assertions": ["load-complete", "dark-mode-readable", "search", "dom-snapshot", "visual-screenshot"] }, { "id": "vue3-demo-pdf-operations", "surface": "vue3-current-component", "smokeCaseId": "pdf-document", "sample": "pdf.pdf", "scripts": ["verify:demo-browser-smoke"], "features": ["toolbar-operations", "document-navigation", "print-export", "layout-visual"], "assertions": ["page-navigation", "outline-or-thumbnails", "search", "zoom", "print-capability", "export-output"] }, { "id": "vue3-demo-docx-print", "surface": "vue3-current-component", "smokeCaseId": "word-openxml-docx", "sample": "word.docx", "scripts": ["verify:demo-browser-smoke"], "features": ["print-export", "layout-visual", "document-navigation"], "assertions": ["paper-layout", "page-size", "document-only-content", "print-output", "export-output"] }, { "id": "compare-page-sync-and-search", "surface": "compare-page", "smokeCaseId": "pdf-document", "sample": "pdf.pdf", "scripts": ["verify:demo-browser-smoke"], "features": ["source-loading", "document-navigation", "layout-visual"], "assertions": ["dual-panel", "synchronized-scroll", "shortcut-search", "line-location"] }, { "id": "pure-web-native-viewer-docx", "surface": "pure-web-native-viewer", "smokeCaseId": "word-openxml-docx", "sample": "word.docx", "scripts": ["verify:component-browser-smoke"], "features": ["source-loading", "options", "lifecycle-events", "wrapper-contract"], "assertions": ["mount-viewer", "shared-controller-handle", "load-complete", "lifecycle-events"] }, { "id": "react-native-wrapper-docx", "surface": "react-native-wrapper", "wrapperId": "react", "sample": "word.docx", "scripts": ["verify:component-browser-smoke"], "features": ["source-loading", "options", "lifecycle-events", "wrapper-contract"], "assertions": ["native-mount", "shared-controller-handle", "load-complete"] }, { "id": "pure-js-native-wrapper-docx", "surface": "pure-js-native-wrapper", "wrapperId": "web", "sample": "word.docx", "scripts": ["verify:component-browser-smoke"], "features": ["source-loading", "options", "lifecycle-events", "wrapper-contract"], "assertions": ["native-mount", "mount-viewer", "load-complete"] }, { "id": "script-tag-iife-markdown", "surface": "script-tag-iife", "wrapperId": "web", "sample": "preview.md", "scripts": ["verify:component-browser-smoke"], "features": ["source-loading", "options", "wrapper-contract"], "assertions": ["global-api", "mount-viewer", "load-complete"] } ], "requiredEvidence": [ "dom-snapshot", "visual-screenshot", "event-callback", "capability-state", "options-behavior", "print-output", "export-output" ] }