diff --git a/packages/pptx-core/package.json b/packages/pptx-core/package.json
index 4a3bfa8..e7e6dfc 100644
--- a/packages/pptx-core/package.json
+++ b/packages/pptx-core/package.json
@@ -47,6 +47,7 @@
"dependencies": {
"@arcships/office-interaction": "^0.6.0",
"echarts": "^6.0.0",
+ "fflate": "^0.8.2",
"jszip": "^3.10.1"
},
"devDependencies": {
diff --git a/packages/pptx-core/tsup.config.ts b/packages/pptx-core/tsup.config.ts
index bd691d2..bae2a3c 100644
--- a/packages/pptx-core/tsup.config.ts
+++ b/packages/pptx-core/tsup.config.ts
@@ -11,7 +11,6 @@ export default defineConfig({
noExternal: [
/^@arcships\/office-runtime/u,
/^@aiden0z\/pptx-renderer$/u,
- /^fflate$/u,
],
skipNodeModulesBundle: true,
})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a8347d9..d41c453 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -134,6 +134,9 @@ importers:
echarts:
specifier: ^6.0.0
version: 6.1.0
+ fflate:
+ specifier: ^0.8.2
+ version: 0.8.3
jszip:
specifier: ^3.10.1
version: 3.10.1
diff --git a/scripts/ci/pack-consumer.mjs b/scripts/ci/pack-consumer.mjs
index 4409080..1059e69 100644
--- a/scripts/ci/pack-consumer.mjs
+++ b/scripts/ci/pack-consumer.mjs
@@ -190,6 +190,10 @@ try {
path.join(consumerDir, "public", "fixtures", file),
);
}
+ cpSync(
+ path.join(root, "tests", "fixtures", "pptx", "playback-controlled.pptx"),
+ path.join(consumerDir, "public", "fixtures", "playback-controlled.pptx"),
+ );
const packageJson = {
name: "agentic-office-tgz-consumer",
diff --git a/scripts/ci/verify-pptx-consumer.mjs b/scripts/ci/verify-pptx-consumer.mjs
index fd55320..a706722 100644
--- a/scripts/ci/verify-pptx-consumer.mjs
+++ b/scripts/ci/verify-pptx-consumer.mjs
@@ -10,6 +10,7 @@ import { fileURLToPath } from "node:url"
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..")
const coreVersion = JSON.parse(readFileSync(path.join(root, "packages/pptx-core/package.json"), "utf8")).version
const vueVersion = JSON.parse(readFileSync(path.join(root, "packages/vue-pptx/package.json"), "utf8")).version
+const interactionVersion = JSON.parse(readFileSync(path.join(root, "packages/office-interaction/package.json"), "utf8")).version
const temporary = mkdtempSync(path.join(tmpdir(), "pptx-consumer-"))
const packages = path.join(temporary, "packages")
const consumer = path.join(temporary, "consumer")
@@ -57,8 +58,10 @@ async function waitForServer(url) {
try {
run("pnpm", ["pack", "--pack-destination", packages], path.join(root, "packages/pptx-core"))
run("pnpm", ["pack", "--pack-destination", packages], path.join(root, "packages/vue-pptx"))
+ run("pnpm", ["pack", "--pack-destination", packages], path.join(root, "packages/office-interaction"))
const core = path.join(packages, `arcships-pptx-core-${coreVersion}.tgz`)
const vuePptx = path.join(packages, `arcships-vue-pptx-${vueVersion}.tgz`)
+ const interaction = path.join(packages, `arcships-office-interaction-${interactionVersion}.tgz`)
const coreManifest = JSON.parse(run("tar", ["-xOf", core, "package/package.json"], root))
const browserBundle = run("tar", ["-xOf", core, "package/dist/browser.js"], root)
if (coreManifest.dependencies?.["@aiden0z/pptx-renderer"]) {
@@ -82,7 +85,12 @@ try {
vue: "^3.5.0",
},
devDependencies: { typescript: "^5.0.0", vite: "^6.0.0" },
- pnpm: { overrides: { "@arcships/pptx-core": `file:${core}` } },
+ pnpm: {
+ overrides: {
+ "@arcships/pptx-core": `file:${core}`,
+ "@arcships/office-interaction": `file:${interaction}`,
+ },
+ },
}, null, 2))
writeFileSync(path.join(consumer, "tsconfig.json"), JSON.stringify({
compilerOptions: {
diff --git a/tests/consumer/template/src/App.vue b/tests/consumer/template/src/App.vue
index 00b1012..035c680 100644
--- a/tests/consumer/template/src/App.vue
+++ b/tests/consumer/template/src/App.vue
@@ -40,6 +40,19 @@
{{ xlsxSelectedValue }}
+
+ PPTX
+ {{ pptxState }}
+ {{ pptxError }}
+
+
PDF
{{ pdfState }}
@@ -71,6 +84,8 @@ import xlsxWorkerUrl from "@arcships/xlsx-core/worker?worker&url";
import xlsxWasmUrl from "@arcships/xlsx-core/assets/duke_sheets_wasm_bg.wasm?url";
import { DocxEditor, DocxViewer } from "@arcships/vue-docx";
import { XlsxViewer, useXlsxViewerController, type XlsxDiagnostic } from "@arcships/vue-xlsx";
+import { PptxViewer } from "@arcships/vue-pptx";
+import type { PptxPreviewError } from "@arcships/pptx-core";
import {
DEFAULT_PDF_MAX_FILE_SIZE,
PdfViewer,
@@ -88,6 +103,9 @@ const docxState = ref("loading");
const docxSource = ref("pending");
const pdfState = ref("loading");
const pdfError = ref("");
+const pptxFile = shallowRef();
+const pptxState = ref("loading");
+const pptxError = ref("");
const origin = globalThis.location.origin;
function addDiagnostic(event: unknown) {
@@ -151,12 +169,14 @@ const overallState = computed(() => {
docxState.value === "error" ||
xlsxController.sourceState === "error" ||
xlsxWorkerController.sourceState === "error" ||
+ pptxState.value === "error" ||
pdfState.value === "error"
) return "error";
if (
docxState.value === "ready" &&
xlsxController.sourceState === "ready" &&
xlsxWorkerController.sourceState === "ready" &&
+ pptxState.value === "ready" &&
pdfState.value === "ready"
) return "ready";
return "loading";
@@ -171,6 +191,14 @@ onMounted(async () => {
docxState.value = "error";
addDiagnostic({ package: "docx", type: "fixture-error", message: String(error) });
}
+ try {
+ const response = await fetch("/fixtures/playback-controlled.pptx");
+ if (!response.ok) throw new Error(`fixture request failed: ${response.status}`);
+ pptxFile.value = await response.arrayBuffer();
+ } catch (error) {
+ pptxState.value = "error";
+ addDiagnostic({ package: "pptx", type: "fixture-error", message: String(error) });
+ }
});
function onDocxSuccess(result: DocxImportResult) {
@@ -184,6 +212,16 @@ function onDocxError(error: Error) {
addDiagnostic({ package: "docx", type: "load-error", message: error.message });
}
+function onPptxSuccess() {
+ pptxState.value = "ready";
+}
+
+function onPptxError(error: PptxPreviewError) {
+ pptxState.value = "error";
+ pptxError.value = `${error.code}: ${error.message}`;
+ addDiagnostic({ package: "pptx", type: "load-error", message: error.message });
+}
+
function onPdfSuccess() {
pdfState.value = "ready";
}
diff --git a/tests/consumer/template/src/main.ts b/tests/consumer/template/src/main.ts
index 207be49..d3773ae 100644
--- a/tests/consumer/template/src/main.ts
+++ b/tests/consumer/template/src/main.ts
@@ -2,6 +2,7 @@ import { createApp } from "vue";
import "@arcships/vue-docx/style.css";
import "@arcships/vue-xlsx/style.css";
import "@arcships/vue-pdf/style.css";
+import "@arcships/vue-pptx/style.css";
import App from "./App.vue";
import "./package-contract";
diff --git a/tests/consumer/template/src/package-contract.ts b/tests/consumer/template/src/package-contract.ts
index ed4b782..daf745f 100644
--- a/tests/consumer/template/src/package-contract.ts
+++ b/tests/consumer/template/src/package-contract.ts
@@ -75,6 +75,15 @@ import {
type PptxOfficeReferenceDraft,
type PptxReferenceContext,
} from "@arcships/pptx-core";
+import {
+ createPptxDocumentSession,
+ createPptxPreviewSession,
+ type PptxDocumentSession,
+ type PptxDocumentSessionOptions,
+ type PptxPreviewSession,
+ type PptxPreviewSessionOptions,
+ type PptxPreviewSource,
+} from "@arcships/pptx-core/browser";
import {
DocxContextMenu,
DocxDragOverlay,
@@ -124,6 +133,12 @@ import {
type LegendItem,
type XlsxDiagnostic,
} from "@arcships/vue-xlsx";
+import { MemoChartSvg as MemoChartSvgFromSubpath } from "@arcships/vue-xlsx/chart";
+import {
+ buildRegionMapLegendItems,
+ normalizeRegionMapKey,
+} from "@arcships/vue-xlsx/map";
+import { MemoSurfaceChartComposite as MemoSurfaceChartCompositeFromSubpath } from "@arcships/vue-xlsx/webgl";
import {
DEFAULT_PDF_MAX_FILE_SIZE,
PdfViewer,
@@ -144,6 +159,17 @@ import {
type PdfRenderRuntimeConfig,
type PdfSource,
} from "@arcships/vue-pdf";
+import {
+ PptxStage,
+ PptxThumbnail,
+ PptxViewer,
+ usePptxDocument,
+ usePptxPlayback,
+ type PptxPreviewDocument,
+ type PptxStageExpose,
+ type UsePptxDocumentReturn,
+ type UsePptxPlaybackReturn,
+} from "@arcships/vue-pptx";
import {
FileUpload,
OfficeObjectOutlineLayer,
@@ -230,6 +256,17 @@ export const publicRuntimeExports = {
describePptxReference,
pptxReferenceKindForObject,
resolvePptxReference,
+ createPptxDocumentSession,
+ createPptxPreviewSession,
+ PptxStage,
+ PptxThumbnail,
+ PptxViewer,
+ usePptxDocument,
+ usePptxPlayback,
+ MemoChartSvgFromSubpath,
+ buildRegionMapLegendItems,
+ normalizeRegionMapKey,
+ MemoSurfaceChartCompositeFromSubpath,
FileUpload,
};
@@ -297,6 +334,15 @@ export type PublicTypeExports = {
pptxOfficeReferenceDraft: PptxOfficeReferenceDraft;
pptxObjectReferenceOptions: PptxObjectReferenceOptions;
pptxReferenceContext: PptxReferenceContext;
+ pptxDocumentSession: PptxDocumentSession;
+ pptxDocumentSessionOptions: PptxDocumentSessionOptions;
+ pptxPreviewSession: PptxPreviewSession;
+ pptxPreviewSessionOptions: PptxPreviewSessionOptions;
+ pptxPreviewSource: PptxPreviewSource;
+ pptxPreviewDocument: PptxPreviewDocument;
+ pptxStageExpose: PptxStageExpose;
+ pptxDocumentComposable: UsePptxDocumentReturn;
+ pptxPlaybackComposable: UsePptxPlaybackReturn;
docxEditorOptions: UseDocxEditorOptions;
xlsxDiagnostic: XlsxDiagnostic;
pdfSource: PdfSource;