diff --git a/bun.lock b/bun.lock index dabb23fd2..d9a891803 100644 --- a/bun.lock +++ b/bun.lock @@ -88,7 +88,7 @@ }, "packages/cli": { "name": "@open-pencil/cli", - "version": "0.10.0", + "version": "0.11.3", "bin": { "openpencil": "./src/index.ts", }, @@ -104,7 +104,7 @@ }, "packages/core": { "name": "@open-pencil/core", - "version": "0.10.0", + "version": "0.11.3", "dependencies": { "@iconify/utils": "^3.1.0", "canvaskit-wasm": "^0.40.0", @@ -115,6 +115,7 @@ "fontoxpath": "^3.34.0", "fzstd": "^0.1.1", "nanoevents": "^9.1.0", + "opentype.js": "^1.3.4", "sucrase": "^3.35.1", "svgpath": "^2.6.0", "yoga-layout": "npm:@open-pencil/yoga-layout@3.3.0-grid.2", @@ -122,6 +123,7 @@ "devDependencies": { "@types/culori": "^4.0.1", "@types/diff": "^8.0.0", + "@types/opentype.js": "^1.3.9", "typescript": "~5.8.3", }, }, @@ -137,7 +139,7 @@ }, "packages/mcp": { "name": "@open-pencil/mcp", - "version": "0.8.0", + "version": "0.11.3", "bin": { "openpencil-mcp": "./dist/index.js", }, @@ -156,7 +158,7 @@ }, "packages/vue": { "name": "@open-pencil/vue", - "version": "0.10.0", + "version": "0.11.3", "dependencies": { "@nanostores/i18n": "^1.2.2", "@nanostores/vue": "^1.1.0", diff --git a/packages/core/package.json b/packages/core/package.json index d9736eabf..34cc302cb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -300,6 +300,7 @@ "fontoxpath": "^3.34.0", "fzstd": "^0.1.1", "nanoevents": "^9.1.0", + "opentype.js": "^1.3.4", "sucrase": "^3.35.1", "svgpath": "^2.6.0", "yoga-layout": "npm:@open-pencil/yoga-layout@3.3.0-grid.2" @@ -307,6 +308,7 @@ "devDependencies": { "@types/culori": "^4.0.1", "@types/diff": "^8.0.0", + "@types/opentype.js": "^1.3.9", "typescript": "~5.8.3" } } diff --git a/packages/core/src/clipboard.ts b/packages/core/src/clipboard.ts index e99770132..5e0b4f546 100644 --- a/packages/core/src/clipboard.ts +++ b/packages/core/src/clipboard.ts @@ -13,7 +13,7 @@ import { makeCanvasNodeChange, buildFontDigestMap } from './kiwi/serialize' -import { buildDerivedTextDataV4 } from './kiwi/serialize-clipboard-v4' +import { buildDerivedTextDataV4 } from './text/clipboard-derived-text' import { randomInt } from './random' import type { NodeChange as KiwiNodeChange } from './kiwi/codec' diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e2681e6b7..a8baf9502 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -294,7 +294,7 @@ export { fractionalPosition, mapToFigmaType } from './kiwi/serialize' -export { buildDerivedTextDataV4 } from './kiwi/serialize-clipboard-v4' +export { buildDerivedTextDataV4 } from './text/clipboard-derived-text' export { createElement, @@ -341,7 +341,7 @@ export { type TextPictureBuilder, type OpenPencilClipboardData } from './clipboard' -export { probeGlyphOutlineCommands, type GlyphOutlineProbe } from './clipboard-text-outlines' +export { probeGlyphOutlineCommands, type GlyphOutlineProbe } from './text/opentype' export { readPenFile, parsePenFile } from './io/formats/pen' diff --git a/packages/core/src/kiwi/serialize.ts b/packages/core/src/kiwi/serialize.ts index f08ba86aa..d64c5e83f 100644 --- a/packages/core/src/kiwi/serialize.ts +++ b/packages/core/src/kiwi/serialize.ts @@ -2,7 +2,7 @@ export const FIG_KIWI_DEFAULT_VERSION = 101 import { deflateSync, inflateSync } from 'fflate' -import { getGlyphOutlineCommandsSync } from '../clipboard-text-outlines' +import { getGlyphOutlineCommandsSync } from '../text/opentype' import { getLoadedFontData, normalizeFontFamily, weightToStyle } from '../text/fonts' import { encodeVectorNetworkBlob, buildStyleOverrideTable } from '../vector' import { stringToGuid, VARIABLE_BINDING_FIELDS } from './convert' diff --git a/packages/core/src/kiwi/serialize-clipboard-v4.ts b/packages/core/src/text/clipboard-derived-text.ts similarity index 92% rename from packages/core/src/kiwi/serialize-clipboard-v4.ts rename to packages/core/src/text/clipboard-derived-text.ts index bb18d5d2d..8bab4c281 100644 --- a/packages/core/src/kiwi/serialize-clipboard-v4.ts +++ b/packages/core/src/text/clipboard-derived-text.ts @@ -1,8 +1,8 @@ -import { getGlyphOutlineCommandsSync } from '../clipboard-text-outlines' -import { normalizeFontFamily, weightToStyle } from '../text/fonts' +import { normalizeFontFamily, weightToStyle } from './fonts' +import { getGlyphOutlineCommandsSync } from './opentype' import type { SceneNode } from '../scene-graph' -import type { NodeChange } from './codec' +import type { NodeChange } from '../kiwi/codec' export interface ShapedClipboardText { lineHeight: number diff --git a/packages/core/src/clipboard-text-outlines.ts b/packages/core/src/text/opentype.ts similarity index 98% rename from packages/core/src/clipboard-text-outlines.ts rename to packages/core/src/text/opentype.ts index 1ef94fcf6..1630010d1 100644 --- a/packages/core/src/clipboard-text-outlines.ts +++ b/packages/core/src/text/opentype.ts @@ -1,6 +1,6 @@ import * as OpenTypeSync from 'opentype.js' -import { getLoadedFontData } from './text/fonts' +import { getLoadedFontData } from './fonts' interface OutlineCommand { type: string diff --git a/packages/core/src/types-opentype.d.ts b/packages/core/src/types-opentype.d.ts deleted file mode 100644 index 294eaa519..000000000 --- a/packages/core/src/types-opentype.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -declare module 'opentype.js' { - export interface OpenTypePathCommand { - type: string - x?: number - y?: number - x1?: number - y1?: number - x2?: number - y2?: number - } - - export interface OpenTypeGlyphPath { - commands: OpenTypePathCommand[] - } - - export interface OpenTypeGlyph { - path: OpenTypeGlyphPath - getPath(x: number, y: number, fontSize: number): OpenTypeGlyphPath - } - - export interface OpenTypeFont { - unitsPerEm: number - stringToGlyphs(text: string): OpenTypeGlyph[] - } - - export function parse(buffer: ArrayBuffer): OpenTypeFont -} diff --git a/vite.config.ts b/vite.config.ts index 0e66c44f8..1b3ff7562 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -24,6 +24,7 @@ export default defineConfig(async ({ command }) => ({ '@': resolve(__dirname, 'src'), '@open-pencil/vue': resolve(__dirname, 'packages/vue/src'), '@open-pencil/core': resolve(__dirname, 'packages/core/src'), + 'opentype.js': resolve(__dirname, 'node_modules/opentype.js/dist/opentype.module.js'), // vue-stream-markdown eagerly loads mermaid/beautiful-mermaid as optional peer deps. // Alias to empty shims to avoid runtime errors and reduce bundle size. mermaid: resolve(__dirname, 'src/shims/mermaid.ts'),