From 26a7d2d4540485d31d4bfd832132ac8105ec97c8 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Wed, 8 Apr 2026 20:52:09 +0300 Subject: [PATCH] Release v0.11.4 --- CHANGELOG.md | 8 ++++++++ desktop/tauri.conf.json | 2 +- package.json | 2 +- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/core/src/canvas/text.ts | 2 +- packages/core/src/clipboard.ts | 13 +++++++++++-- packages/core/src/kiwi/serialize.ts | 12 +++++++----- packages/core/src/text/clipboard-derived-text.ts | 12 +++++++----- packages/mcp/package.json | 2 +- packages/vue/package.json | 2 +- 11 files changed, 40 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cebdf0492..8b7145c28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased +## 0.11.4 — 2026-04-08 + +### Fixes + +- Fix `@open-pencil/core` published package containing stale import paths from before the domain module restructuring — CLI and MCP installs from npm now resolve correctly +- Add `save_file` MCP tool for saving the current document to disk +- Clipboard text export now writes richer v4 `derivedTextData` payloads with glyph outlines for better paste fidelity + ## 0.11.3 — 2026-04-08 ### Fixes diff --git a/desktop/tauri.conf.json b/desktop/tauri.conf.json index d25ab432a..50b6ce78f 100644 --- a/desktop/tauri.conf.json +++ b/desktop/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "OpenPencil", - "version": "0.11.3", + "version": "0.11.4", "identifier": "net.dannote.open-pencil", "build": { "beforeDevCommand": "bun run dev", diff --git a/package.json b/package.json index 9b8275911..32f609e4a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "open-pencil-app", "private": true, - "version": "0.11.3", + "version": "0.11.4", "license": "MIT", "type": "module", "workspaces": [ diff --git a/packages/cli/package.json b/packages/cli/package.json index 10197f8d8..c7564a7af 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@open-pencil/cli", - "version": "0.11.3", + "version": "0.11.4", "license": "MIT", "type": "module", "bin": { diff --git a/packages/core/package.json b/packages/core/package.json index 34cc302cb..99f34cc3d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@open-pencil/core", - "version": "0.11.3", + "version": "0.11.4", "license": "MIT", "type": "module", "sideEffects": false, diff --git a/packages/core/src/canvas/text.ts b/packages/core/src/canvas/text.ts index f66d90796..10008896f 100644 --- a/packages/core/src/canvas/text.ts +++ b/packages/core/src/canvas/text.ts @@ -1,5 +1,5 @@ -import { resolveRGBAForPreview } from '../color/management' import { getCanvasKit } from '../canvaskit' +import { resolveRGBAForPreview } from '../color/management' import { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE } from '../constants' import { resolveNodeTextDirection } from '../text/direction' import { diff --git a/packages/core/src/clipboard.ts b/packages/core/src/clipboard.ts index 5e0b4f546..ee0b32ba1 100644 --- a/packages/core/src/clipboard.ts +++ b/packages/core/src/clipboard.ts @@ -13,8 +13,8 @@ import { makeCanvasNodeChange, buildFontDigestMap } from './kiwi/serialize' -import { buildDerivedTextDataV4 } from './text/clipboard-derived-text' import { randomInt } from './random' +import { buildDerivedTextDataV4 } from './text/clipboard-derived-text' import type { NodeChange as KiwiNodeChange } from './kiwi/codec' import type { InstanceNodeChange } from './kiwi/instance-overrides' @@ -317,7 +317,16 @@ export async function buildFigmaClipboardHTML( for (let i = 0; i < nodes.length; i++) { collectTextNodes(nodes[i]) nodeChanges.push( - ...sceneNodeToKiwi(nodes[i], canvasGuid, i, localIdCounter, graph, blobs, undefined, fontDigestMap) + ...sceneNodeToKiwi( + nodes[i], + canvasGuid, + i, + localIdCounter, + graph, + blobs, + undefined, + fontDigestMap + ) ) } diff --git a/packages/core/src/kiwi/serialize.ts b/packages/core/src/kiwi/serialize.ts index d64c5e83f..bbe1927b5 100644 --- a/packages/core/src/kiwi/serialize.ts +++ b/packages/core/src/kiwi/serialize.ts @@ -2,8 +2,8 @@ export const FIG_KIWI_DEFAULT_VERSION = 101 import { deflateSync, inflateSync } from 'fflate' -import { getGlyphOutlineCommandsSync } from '../text/opentype' import { getLoadedFontData, normalizeFontFamily, weightToStyle } from '../text/fonts' +import { getGlyphOutlineCommandsSync } from '../text/opentype' import { encodeVectorNetworkBlob, buildStyleOverrideTable } from '../vector' import { stringToGuid, VARIABLE_BINDING_FIELDS } from './convert' import { sceneNodeToKiwiWithContext, type KiwiNodeChange } from './node-export' @@ -208,7 +208,8 @@ function buildDerivedTextData( } const style = weightToStyle(node.fontWeight, node.italic) - const glyphCommandLists = getGlyphOutlineCommandsSync(node.fontFamily, style, node.text, node.fontSize) ?? [] + const glyphCommandLists = + getGlyphOutlineCommandsSync(node.fontFamily, style, node.text, node.fontSize) ?? [] const lineHeight = node.lineHeight ?? Math.ceil(node.fontSize * 1.2) const glyphAdvance = node.text.length > 0 ? node.width / Math.max(node.text.length, 1) : 0 @@ -221,8 +222,9 @@ function buildDerivedTextData( rotation: 0 })) - const logicalIndexToCharacterOffsetMap = Array.from({ length: node.text.length + 1 }, (_, index) => - index * glyphAdvance + const logicalIndexToCharacterOffsetMap = Array.from( + { length: node.text.length + 1 }, + (_, index) => index * glyphAdvance ) return { @@ -234,7 +236,7 @@ function buildDerivedTextData( position: { x: 0, y: lineHeight }, width: node.width, lineHeight, - lineAscent: Math.max(lineHeight - (node.fontSize * 0.2), 0) + lineAscent: Math.max(lineHeight - node.fontSize * 0.2, 0) } ], glyphs, diff --git a/packages/core/src/text/clipboard-derived-text.ts b/packages/core/src/text/clipboard-derived-text.ts index 8bab4c281..731ade851 100644 --- a/packages/core/src/text/clipboard-derived-text.ts +++ b/packages/core/src/text/clipboard-derived-text.ts @@ -1,8 +1,8 @@ import { normalizeFontFamily, weightToStyle } from './fonts' import { getGlyphOutlineCommandsSync } from './opentype' -import type { SceneNode } from '../scene-graph' import type { NodeChange } from '../kiwi/codec' +import type { SceneNode } from '../scene-graph' export interface ShapedClipboardText { lineHeight: number @@ -27,7 +27,8 @@ export async function buildDerivedTextDataV4( const normalizedFamily = normalizeFontFamily(node.fontFamily) const key = `${normalizedFamily}|${style}` const lineHeightFallback = node.lineHeight ?? Math.ceil(node.fontSize * 1.2) - const glyphCommandLists = getGlyphOutlineCommandsSync(node.fontFamily, style, node.text, node.fontSize) ?? [] + const glyphCommandLists = + getGlyphOutlineCommandsSync(node.fontFamily, style, node.text, node.fontSize) ?? [] const glyphs = glyphCommandLists.map((commands, index) => { const shapedGlyph = shaped?.glyphs[index] @@ -35,7 +36,7 @@ export async function buildDerivedTextDataV4( commands, position: { x: shapedGlyph?.x ?? 0, - y: shapedGlyph?.y ?? (shaped?.baseline ?? lineHeightFallback) + y: shapedGlyph?.y ?? shaped?.baseline ?? lineHeightFallback }, fontSize: node.fontSize, firstCharacter: shapedGlyph?.firstCharacter ?? index, @@ -53,7 +54,7 @@ export async function buildDerivedTextDataV4( position: { x: 0, y: shaped?.baseline ?? lineHeightFallback }, width: shaped?.lineWidth ?? node.width, lineHeight: shaped?.lineHeight ?? lineHeightFallback, - lineAscent: shaped?.lineAscent ?? Math.max(lineHeightFallback - (node.fontSize * 0.2), 0) + lineAscent: shaped?.lineAscent ?? Math.max(lineHeightFallback - node.fontSize * 0.2, 0) } ], glyphs, @@ -67,7 +68,8 @@ export async function buildDerivedTextDataV4( } ], logicalIndexToCharacterOffsetMap: - shaped?.logicalIndexToCharacterOffsetMap ?? Array.from({ length: node.text.length + 1 }, () => 0), + shaped?.logicalIndexToCharacterOffsetMap ?? + Array.from({ length: node.text.length + 1 }, () => 0), derivedLines: [{ directionality: 'LTR' }], truncationStartIndex: -1, truncatedHeight: -1 diff --git a/packages/mcp/package.json b/packages/mcp/package.json index d1c8dd838..3092b62ee 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@open-pencil/mcp", - "version": "0.11.3", + "version": "0.11.4", "license": "MIT", "type": "module", "main": "./dist/server.js", diff --git a/packages/vue/package.json b/packages/vue/package.json index 2dcefe13c..2a7aa98ea 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@open-pencil/vue", - "version": "0.11.3", + "version": "0.11.4", "license": "MIT", "type": "module", "exports": {