@openpresentation/opf-editor 0.10.2 → 0.10.4

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Unfinished prepared shaping work is preserved in the [September 15 roadmap](docs/roadmap-shaping-20260915.md); it is not part of the published runtime.
4
4
 
5
- Version 0.10.2 adds pointer caret entry on the canvas (one click puts the caret where you click; new `textEntry` option; keyboard entry still selects all) and keeps the 0.10.1 and 0.10.0 requirements. Version 0.10.1 adds the opt-in font gate (`createFontGate`, FF-41) and keeps the 0.10.0 requirements; develop and test it against renderer 0.11.2 and PPTX 0.11.1. Version 0.10.0 requires `@openpresentation/opf` ^0.11.2, renderer ^0.11.0, and PPTX ^0.11.0 (install them together so cover centering resolves the same core everywhere; renderer 0.11.0 also activates the playground's automatic script fonts and lazy Intos fonts). Version 0.9.0 required `@openpresentation/opf` ^0.11.1, renderer ^0.10.0, and PPTX ^0.10.0. Composition and slide transfer fall back to the shared `aptos` font scheme and report unknown scheme ids through `onDiagnostic`; gallery apply keeps every font-scheme role.
5
+ Version 0.10.4 changes no editor behavior: it requires `@openpresentation/opf` ^0.11.3 (the 70 legacy gallery layout ids and their geometry; install it with renderer 0.11.6 and PPTX 0.11.4 so the canvas, preview and export resolve the same core). Version 0.10.3 passes the host's render options (`catalogs`) through the font gate to the registry, so layouts and font schemes that only the host's catalogs know load their faces, and asks the script and vendored-face loaders separately; it keeps the 0.10.2 requirements and gates nothing new on renderers before 0.11.5. Version 0.10.2 adds pointer caret entry on the canvas (one click puts the caret where you click; new `textEntry` option; keyboard entry still selects all) and keeps the 0.10.1 and 0.10.0 requirements. Version 0.10.1 adds the opt-in font gate (`createFontGate`, FF-41) and keeps the 0.10.0 requirements; develop and test it against renderer 0.11.2 and PPTX 0.11.1. Version 0.10.0 requires `@openpresentation/opf` ^0.11.2, renderer ^0.11.0, and PPTX ^0.11.0 (install them together so cover centering resolves the same core everywhere; renderer 0.11.0 also activates the playground's automatic script fonts and lazy Intos fonts). Version 0.9.0 required `@openpresentation/opf` ^0.11.1, renderer ^0.10.0, and PPTX ^0.10.0. Composition and slide transfer fall back to the shared `aptos` font scheme and report unknown scheme ids through `onDiagnostic`; gallery apply keeps every font-scheme role.
6
6
 
7
7
  Version 0.8.0 required `@openpresentation/opf` ^0.11.0, renderer ^0.9.0, and PPTX ^0.9.0. Named ColorRefs (scheme slots, roles, and `var:<id>`) paint through the published renderer and hex-resolve on export. Payload ids share the slide id namespace for pagination and transfer. Native `schemeClr`, theme write, and `p:hf` remain out of scope.
8
8
 
@@ -80,6 +80,9 @@ Fonts load before pixels (FF-41). A document can need faces the browser registry
80
80
  import { createCanvasEditor, createFontGate } from '@openpresentation/opf-editor/canvas';
81
81
 
82
82
  const fonts = createFontGate(fontRegistry); // a registry without the lazy loaders gates nothing
83
+ // The canvas gives the gate its current renderOptions (catalogs, ...), so layouts and font schemes only your catalogs know
84
+ // resolve in the registry too (renderer 0.11.5+). For your own gate calls: fonts.pending(document, renderOptions), or
85
+ // createFontGate(fontRegistry, { renderOptions: () => currentRenderOptions }).
83
86
  const canvas = createCanvasEditor(container, { document, fonts, renderOptions: { textMeasurement: fontRegistry.textMeasurement } });
84
87
  // Other renders of your own: fonts.run(document, { ready: draw, failed: showError, loading: showSpinner })
85
88
  ```
@@ -274,7 +277,7 @@ Public npm package publication is handled by `.github/workflows/release.yml` thr
274
277
 
275
278
  The current checkout uses `@openpresentation/opf/composition` for portable geometry. Slides can select `auto`, `row`, `column`, or `grid`, set weighted tracks, and request path-specific overflow diagnostics. See the sibling OPF repo's `docs/dynamic-composition.md` for the complete contract.
276
279
 
277
- Version 0.10.2 requires `@openpresentation/opf@^0.11.2` (unchanged since 0.10.0). The optional renderer peer requires `@openpresentation/opf-render@^0.11.0` (the font gate gates nothing on a registry without the lazy loaders). Development and coordinated playground export use renderer 0.11.2 and `@openpresentation/opf-pptx@^0.11.1`. Clean registry installs support the composition APIs without sibling checkouts. For coordinated source development, build OPF and run `node scripts/link-ecosystem.mjs` there; `pnpm test:ecosystem` verifies shared geometry and import/export behavior.
280
+ Version 0.10.4 requires `@openpresentation/opf@^0.11.3` (0.10.3 and earlier: ^0.11.2). The optional renderer peer requires `@openpresentation/opf-render@^0.11.0` (the font gate gates nothing on a registry without the lazy loaders). Development and coordinated playground export use renderer 0.11.6 (chart label rotation; 0.11.5 face-level lazy fonts; the gate passes render options, which older renderers ignore) and `@openpresentation/opf-pptx@^0.11.4`. Clean registry installs support the composition APIs without sibling checkouts. For coordinated source development, build OPF and run `node scripts/link-ecosystem.mjs` there; `pnpm test:ecosystem` verifies shared geometry and import/export behavior.
278
281
 
279
282
  ## Local interactive demo
280
283
 
package/dist/canvas.d.ts CHANGED
@@ -3,10 +3,10 @@ import type { RenderSvgOptions } from "@openpresentation/opf-render";
3
3
  import type { SlideComposition } from "@openpresentation/opf/composition";
4
4
  /** Faces a document needs (script packages and vendored files) that are not loaded yet, and the way to load them. */
5
5
  export interface FontGate {
6
- /** Synchronous. Empty means the document can render now. Never throws. */
7
- pending(document: unknown): string[];
6
+ /** Synchronous. Empty means the document can render now. Never throws. `renderOptions` are the options the host renders with (`catalogs`, ...); the canvas passes its current ones. */
7
+ pending(document: unknown, renderOptions?: RenderSvgOptions): string[];
8
8
  /** Load every pending face (vendored faces first, then script faces). Rejects with a `fonts-unavailable` error; never retries by itself. */
9
- ensure(document: unknown, options?: { signal?: AbortSignal }): Promise<void>;
9
+ ensure(document: unknown, options?: { signal?: AbortSignal; renderOptions?: RenderSvgOptions }): Promise<void>;
10
10
  /** `whenFontsReady` on this gate. */
11
11
  run(document: unknown, handlers?: FontGateHandlers): Promise<void>;
12
12
  }
@@ -16,11 +16,17 @@ export interface FontGateHandlers {
16
16
  loading?: (pending: string[]) => void;
17
17
  ready?: () => void;
18
18
  failed?: (error: Error) => void;
19
+ /** The options the host renders with (`catalogs`, ...), passed to the gate. */
20
+ renderOptions?: RenderSvgOptions;
19
21
  }
20
22
  export declare const FONTS_PENDING: "fonts-pending";
21
23
  export declare const FONTS_UNAVAILABLE: "fonts-unavailable";
22
24
  /** Wrap a browser font registry (`loadBrowserFontRegistry`). Registries without the lazy loaders gate nothing. */
23
- export declare function createFontGate(registry: object): FontGate;
25
+ /**
26
+ * `options.renderOptions` (an object, or a function called on every use) are the default render options passed to the registry
27
+ * (`catalogs`, ...), under a call's own; the canvas passes its current `renderOptions` itself, so a gate needs none.
28
+ */
29
+ export declare function createFontGate(registry: object, options?: { renderOptions?: RenderSvgOptions | (() => RenderSvgOptions | undefined) }): FontGate;
24
30
  /**
25
31
  * Ensure fonts for a document, then run `ready` (synchronously when nothing is pending). The one
26
32
  * "ensure fonts, then render" helper: load failures and exceptions from `ready` go to `failed`.
package/dist/canvas.js CHANGED
@@ -163,11 +163,11 @@ export function createCanvasEditor(container, options = {}) {
163
163
  // A synchronous render or validation of a document whose faces are still loading fails with a clear "fonts-pending"
164
164
  // error and starts the load, so the next attempt succeeds. It never draws glyphs the registry cannot provide.
165
165
  function requireFonts(document) {
166
- const pending = fonts?.pending(document) ?? [];
166
+ const pending = fonts?.pending(document, renderOptions) ?? [];
167
167
  if (!pending.length) return;
168
168
  notice.hidden = false;
169
169
  notice.textContent = pendingMessage;
170
- fonts.ensure(document).then(
170
+ fonts.ensure(document, { renderOptions }).then(
171
171
  () => { if (!disposed && notice.textContent === pendingMessage) clearNotice(); },
172
172
  (error) => { if (!disposed) report(error); },
173
173
  );
@@ -206,6 +206,7 @@ export function createCanvasEditor(container, options = {}) {
206
206
  if (disposed) return;
207
207
  const token = ++showToken;
208
208
  return whenFontsReady(fonts, target ?? editor.document, {
209
+ renderOptions,
209
210
  isCurrent: () => !disposed && token === showToken,
210
211
  loading: (pending) => fontsState("loading", pending),
211
212
  ready: () => {
@@ -221,7 +222,7 @@ export function createCanvasEditor(container, options = {}) {
221
222
  }
222
223
  // Renders now when the document's fonts are loaded (errors throw to the caller), otherwise after loading them.
223
224
  function renderFor(document) {
224
- if (fonts?.pending(document ?? editor.document).length) show(document);
225
+ if (fonts?.pending(document ?? editor.document, renderOptions).length) show(document);
225
226
  else render(document);
226
227
  }
227
228
  function render(document = editor.document) {
@@ -341,11 +342,11 @@ export function createCanvasEditor(container, options = {}) {
341
342
  }
342
343
  // An in-progress edit whose text needs faces that are not loaded yet waits for them, then draws again.
343
344
  function deferDraft(draft) {
344
- if (!fonts?.pending(draft).length) return false;
345
+ if (!fonts?.pending(draft, renderOptions).length) return false;
345
346
  active.valid = false;
346
347
  notice.hidden = false;
347
348
  notice.textContent = pendingMessage;
348
- fonts.ensure(draft).then(
349
+ fonts.ensure(draft, { renderOptions }).then(
349
350
  () => {
350
351
  if (disposed) return;
351
352
  if (notice.textContent === pendingMessage) clearNotice();
package/dist/font-gate.js CHANGED
@@ -16,39 +16,56 @@ const MAX_ROUNDS = 4;
16
16
  * Wrap a browser font registry (`loadBrowserFontRegistry` from `@openpresentation/opf-render/fonts-browser`).
17
17
  * Registries without the lazy loaders (renderer 0.10.0 and older) gate nothing and keep the fonts they have.
18
18
  *
19
- * - `pending(document)` lists the faces (script packages and vendored files) the document needs that are not loaded.
20
- * Synchronous; empty means the document can render now. Never throws: a document the renderer rejects for other
21
- * reasons reports nothing pending and fails with its own validation message when rendered.
22
- * - `ensure(document, { signal })` loads vendored faces first (script fallback depends on them), then script faces,
19
+ * - `pending(document, renderOptions?)` lists the faces (script packages and vendored files) the document needs that are
20
+ * not loaded. Synchronous; empty means the document can render now. Never throws: a document the renderer rejects for
21
+ * other reasons reports nothing pending and fails with its own validation message when rendered. Script faces and
22
+ * vendored faces are asked separately, so one that cannot be answered does not hide the other.
23
+ * - `ensure(document, { signal, renderOptions })` loads vendored faces first (script fallback depends on them), then script faces,
23
24
  * and repeats until nothing is pending. It makes a bounded number of rounds and rejects with a `fonts-unavailable`
24
25
  * error (the registry's error is its `cause`); it never retries by itself, a later call is a new attempt.
25
26
  * - `run(document, handlers)` is `whenFontsReady` on this gate.
27
+ * - `renderOptions` (per call, or `createFontGate(registry, { renderOptions })` as an object or a getter) are the options the
28
+ * host renders with (`catalogs`, ...). They are passed to the registry, so a layout or font scheme that only the host's
29
+ * catalogs know resolves the same way there (renderer 0.11.5 and newer; older renderers ignore them).
26
30
  */
27
- export function createFontGate(registry) {
28
- const pending = (document) => {
29
- try {
30
- const scripts = registry?.pendingScripts?.(document) ?? [];
31
- const lazy = (registry?.pendingLazyFonts?.(document) ?? []).map((face) => face?.file ?? String(face));
32
- return [...lazy, ...scripts];
33
- } catch {
34
- return [];
35
- }
31
+ export function createFontGate(registry, gateOptions = {}) {
32
+ // FF-41: the render options (`catalogs` above all) the document resolves with. The registry resolves a document the way the
33
+ // host renders it only when it gets the same options, so every call passes them: the gate's defaults (an object, or a
34
+ // function called each time, for options that change like `canvas.setRenderOptions`) under the call's own.
35
+ const defaults = () => (typeof gateOptions.renderOptions === "function" ? gateOptions.renderOptions() : gateOptions.renderOptions) ?? {};
36
+ const optionsFor = (renderOptions) => ({ ...defaults(), ...renderOptions });
37
+ // Each source answers on its own: a document one loader cannot resolve (an unresolvable layout throws in the renderer's
38
+ // lazy font loader) must not hide what the other still reports pending.
39
+ const sources = (document, renderOptions) => {
40
+ const options = optionsFor(renderOptions);
41
+ let scripts = [], lazy = [];
42
+ try { scripts = registry?.pendingScripts?.(document, options) ?? []; } catch { /* the renderer reports the document itself when it renders */ }
43
+ try { lazy = (registry?.pendingLazyFonts?.(document, options) ?? []).map((face) => face?.file ?? String(face)); } catch { /* likewise */ }
44
+ return { lazy, scripts };
45
+ };
46
+ const pending = (document, renderOptions) => {
47
+ const { lazy, scripts } = sources(document, renderOptions);
48
+ return [...lazy, ...scripts];
36
49
  };
37
50
  const gate = {
38
51
  pending,
39
52
  async ensure(document, options = {}) {
40
- const { signal } = options;
53
+ const { signal, renderOptions } = options;
54
+ const call = { ...optionsFor(renderOptions), signal };
41
55
  try {
42
- for (let round = 0; round < MAX_ROUNDS && pending(document).length; round++) {
56
+ for (let round = 0; round < MAX_ROUNDS; round++) {
57
+ const { lazy, scripts } = sources(document, renderOptions);
58
+ if (!lazy.length && !scripts.length) break;
43
59
  signal?.throwIfAborted?.();
44
- await registry.ensureLazyFonts?.(document, { signal });
45
- await registry.ensureScripts?.(document, { signal });
60
+ // Vendored faces first (script fallback depends on them). A source with nothing pending is not asked to load.
61
+ if (lazy.length) await registry.ensureLazyFonts?.(document, call);
62
+ if (scripts.length) await registry.ensureScripts?.(document, call);
46
63
  }
47
64
  } catch (cause) {
48
65
  if (signal?.aborted) throw cause;
49
66
  throw fontsUnavailable(cause?.message ?? String(cause), cause);
50
67
  }
51
- const left = pending(document);
68
+ const left = pending(document, renderOptions);
52
69
  if (left.length) throw fontsUnavailable(`${left.join(", ")} did not finish loading.`);
53
70
  },
54
71
  };
@@ -75,10 +92,11 @@ export function fontsPendingError(pending) {
75
92
  * With nothing pending, `ready` runs synchronously, so documents in already-loaded fonts render at once. Otherwise
76
93
  * `loading(pending)` runs, the faces load and `ready` runs after them. `isCurrent()` is checked after the wait, so a
77
94
  * result for a superseded document is dropped. A load failure, and an exception thrown by `ready`, go to `failed(error)`
78
- * (they are rethrown when there is no `failed`). `gate` is any object with `pending(document)` and `ensure(document)`;
95
+ * (they are rethrown when there is no `failed`). `renderOptions` are passed to the gate. `gate` is any object with
96
+ * `pending(document, renderOptions)` and `ensure(document, { renderOptions })`;
79
97
  * without one the document is treated as ready. Resolves once `ready` or `failed` has run.
80
98
  */
81
- export function whenFontsReady(gate, document, { isCurrent = () => true, loading, ready, failed } = {}) {
99
+ export function whenFontsReady(gate, document, { isCurrent = () => true, loading, ready, failed, renderOptions } = {}) {
82
100
  const finish = () => {
83
101
  try {
84
102
  ready?.();
@@ -87,13 +105,13 @@ export function whenFontsReady(gate, document, { isCurrent = () => true, loading
87
105
  failed(error);
88
106
  }
89
107
  };
90
- const left = gate?.pending?.(document) ?? [];
108
+ const left = gate?.pending?.(document, renderOptions) ?? [];
91
109
  if (!left.length) {
92
110
  finish();
93
111
  return Promise.resolve();
94
112
  }
95
113
  loading?.(left);
96
- return Promise.resolve(gate.ensure(document)).then(
114
+ return Promise.resolve(gate.ensure(document, { renderOptions })).then(
97
115
  () => {
98
116
  if (isCurrent()) finish();
99
117
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openpresentation/opf-editor",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "description": "Embeddable local OPF editor primitives built on the deterministic renderer.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -87,15 +87,15 @@
87
87
  "sideEffects": false,
88
88
  "scripts": {
89
89
  "build": "node scripts/build.mjs",
90
- "typecheck": "node --check src/index.js && node --check src/react.js && node --check src/svelte.js && node --check scripts/build.mjs && node --check scripts/validate-package.mjs && node --check test/smoke.mjs && node --check test/component-smoke.mjs && node --check src/canvas.js && node --check src/canvas-fields.js && node --check test/canvas-fields.mjs && node --check test/browser-canvas.mjs && node --check src/transfer.js && node --check src/presentation-ids.js && node --check src/font-defaults.js && node --check src/color-authoring.js && node --check test/presentation-ids.mjs && node --check src/galleries.js && node --check examples/transfer-controls.js && node --check src/schema.js && node --check src/schema-inspector.js && node --check test/rich-table-browser.mjs && node --check test/styled-table.mjs && node --check test/styled-table-browser.mjs && node --check examples/pptx-controls.js && node --check scripts/build-playground.mjs && node --check test/playground-pptx.mjs && node --check test/playground-script-fonts.mjs && node --check test/playground-lazy-fonts.mjs && node --check src/text-input.js && node --check src/rich-text.js && node --check src/rich-text-input.js && node --check src/rich-text-toolbar.js && node --check test/rich-text.mjs && node --check test/rich-input-browser.mjs && node --check src/json-editor.js && node --check src/json-menu.js && node --check src/json-options.js && node --check src/json-source.js && node --check src/switches.js && node --check test/switches.mjs && node --check test/switches-export.mjs && node --check test/placeholder-selection.mjs && node --check test/selection-browser.mjs && node --check scripts/check-font-hotlinks.mjs && node --check scripts/check-font-hotlinks.test.mjs && node --check src/exact-source.js && node --check test/exact-source.mjs && node --check test/playground-source.mjs && node --check src/font-gate.js && node --check test/font-gate.mjs && node --check test/playground-ensure-fonts.mjs && node --check test/canvas-fonts-browser.mjs && node --check src/text-pointer.js && node --check test/click-entry-browser.mjs",
91
- "test": "npm run build && npm run check:font-hotlinks && node test/accepted-text.mjs && node test/smoke.mjs && node test/component-smoke.mjs && node test/canvas-fields.mjs && node test/transfer.mjs && node test/gallery-font-roles.mjs && node test/default-font-scheme.mjs && node test/presentation-ids.mjs && node test/schema.mjs && node test/rich-text.mjs && node test/layout.mjs && node test/blocks.mjs && node test/styled-table.mjs && node test/json-source.mjs && node test/json-options.mjs && node test/switches.mjs && node test/switches-export.mjs && node test/placeholder-selection.mjs && node test/exact-source.mjs && node test/font-gate.mjs",
90
+ "typecheck": "node --check src/index.js && node --check src/react.js && node --check src/svelte.js && node --check scripts/build.mjs && node --check scripts/validate-package.mjs && node --check test/smoke.mjs && node --check test/component-smoke.mjs && node --check src/canvas.js && node --check src/canvas-fields.js && node --check test/canvas-fields.mjs && node --check test/browser-canvas.mjs && node --check src/transfer.js && node --check src/presentation-ids.js && node --check src/font-defaults.js && node --check src/color-authoring.js && node --check test/presentation-ids.mjs && node --check src/galleries.js && node --check examples/transfer-controls.js && node --check src/schema.js && node --check src/schema-inspector.js && node --check test/rich-table-browser.mjs && node --check test/styled-table.mjs && node --check test/styled-table-browser.mjs && node --check examples/pptx-controls.js && node --check scripts/build-playground.mjs && node --check test/playground-pptx.mjs && node --check test/playground-script-fonts.mjs && node --check test/playground-lazy-fonts.mjs && node --check test/playground-base-fonts.mjs && node --check examples/base-font-gate.js && node --check src/text-input.js && node --check src/rich-text.js && node --check src/rich-text-input.js && node --check src/rich-text-toolbar.js && node --check test/rich-text.mjs && node --check test/rich-input-browser.mjs && node --check src/json-editor.js && node --check src/json-menu.js && node --check src/json-options.js && node --check src/json-source.js && node --check src/switches.js && node --check test/switches.mjs && node --check test/switches-export.mjs && node --check test/placeholder-selection.mjs && node --check test/selection-browser.mjs && node --check scripts/check-font-hotlinks.mjs && node --check scripts/check-font-hotlinks.test.mjs && node --check src/exact-source.js && node --check test/exact-source.mjs && node --check test/playground-source.mjs && node --check src/font-gate.js && node --check test/font-gate.mjs && node --check test/font-gate-registry.mjs && node --check test/playground-ensure-fonts.mjs && node --check test/canvas-fonts-browser.mjs && node --check src/text-pointer.js && node --check test/click-entry-browser.mjs",
91
+ "test": "npm run build && npm run check:font-hotlinks && node test/accepted-text.mjs && node test/smoke.mjs && node test/component-smoke.mjs && node test/canvas-fields.mjs && node test/transfer.mjs && node test/gallery-font-roles.mjs && node test/default-font-scheme.mjs && node test/presentation-ids.mjs && node test/schema.mjs && node test/rich-text.mjs && node test/layout.mjs && node test/blocks.mjs && node test/styled-table.mjs && node test/json-source.mjs && node test/json-options.mjs && node test/switches.mjs && node test/switches-export.mjs && node test/placeholder-selection.mjs && node test/exact-source.mjs && node test/font-gate.mjs && node test/font-gate-registry.mjs",
92
92
  "validate": "node scripts/validate-package.mjs",
93
93
  "test:packed": "node test/packed-install.mjs",
94
94
  "prepack": "npm run build",
95
95
  "check:font-hotlinks": "node --test scripts/check-font-hotlinks.test.mjs && node scripts/check-font-hotlinks.mjs",
96
96
  "check:font-hotlinks:built": "node scripts/check-font-hotlinks.mjs --built dist artifacts/playground",
97
97
  "build:playground": "node scripts/build-playground.mjs",
98
- "test:playground": "npm run build:playground && npm run check:font-hotlinks:built && node test/playground-pptx.mjs && node test/playground-script-fonts.mjs artifacts/playground-script-fonts && node test/playground-lazy-fonts.mjs artifacts/playground-lazy-fonts && node test/playground-source.mjs && node test/playground-ensure-fonts.mjs artifacts/playground-ensure-fonts && node test/canvas-fonts-browser.mjs artifacts/canvas-fonts",
98
+ "test:playground": "npm run build:playground && npm run check:font-hotlinks:built && node test/playground-pptx.mjs && node test/playground-script-fonts.mjs artifacts/playground-script-fonts && node test/playground-lazy-fonts.mjs artifacts/playground-lazy-fonts && node test/playground-base-fonts.mjs artifacts/playground-base-fonts && node test/playground-source.mjs && node test/playground-ensure-fonts.mjs artifacts/playground-ensure-fonts && node test/canvas-fonts-browser.mjs artifacts/canvas-fonts",
99
99
  "test:code-browser": "node test/code-browser.mjs",
100
100
  "test:selection-browser": "node test/selection-browser.mjs",
101
101
  "test:click-entry-browser": "node test/click-entry-browser.mjs",
@@ -114,7 +114,7 @@
114
114
  "@codemirror/state": "6.7.6",
115
115
  "@codemirror/view": "6.43.13",
116
116
  "@lezer/highlight": "1.2.4",
117
- "@openpresentation/opf": "^0.11.2",
117
+ "@openpresentation/opf": "^0.11.3",
118
118
  "jsonc-parser": "3.3.1"
119
119
  },
120
120
  "peerDependencies": {
@@ -157,8 +157,8 @@
157
157
  "@expo-google-fonts/noto-sans-thai": "0.4.2",
158
158
  "@expo-google-fonts/noto-serif-hebrew": "0.4.2",
159
159
  "@expo-google-fonts/noto-serif-tibetan": "0.4.2",
160
- "@openpresentation/opf-pptx": "^0.11.1",
161
- "@openpresentation/opf-render": "^0.11.2",
160
+ "@openpresentation/opf-pptx": "^0.11.4",
161
+ "@openpresentation/opf-render": "^0.11.6",
162
162
  "esbuild": "0.28.2",
163
163
  "playwright": "1.63.0"
164
164
  }