diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c4870ad5..7e36445be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,90 +4,58 @@ ### Added -- Add a local Assets panel for document components and component sets, including grouped variant assets, default variant insertion, duplicate variant warnings, library metadata badges, component details, documentation links, and rendered asset previews. -- Add component variant property data, core variant actions, and right-inspector variant switching for instances. -- Preserve Figma component library metadata on import/export, including component keys, source library keys, publish/version IDs, descriptions, links, and variant property specs. -- Register desktop file associations for `.fig` and `.pen` so supported design files can be opened from OS file browsers with OpenPencil. -- Add signed Tauri updater configuration, release artifacts, startup update checks, and a native Check for Updates menu item. -- Add light theme selection and theme-aware canvas ruler colors. -- Add PDF export — vector PDF output via SVG→PDF conversion. Available in the export panel, CLI (`--format pdf`), and MCP (`export_pdf` tool). -- Add the `import_svg` tool for importing SVG content through automation. -- Add DeepSeek as a first-class AI provider and bump AI SDK dependencies for newer model support. -- Add editor event bus with typed lifecycle events — subscribe via `editor.onEditorEvent()` in core or `useEditorEvent()` in the Vue SDK. -- Add variable mode management — create, rename, duplicate, delete modes and set the default mode per collection. -- Add collection deletion and a variable type creation menu to the variables dialog. -- Add inspector variable binding controls for fill and stroke colors, width/height sizing, min/max sizing, and typography fields including line height, letter spacing, font weight, paragraph spacing, and paragraph indent. -- Add auto-layout inspector controls for min/max dimensions, Auto gap distribution, wrap cross-axis gap, and two-axis padding controls. -- Add stroke dash/gap controls to the stroke inspector panel. -- Add font settings controls for local font access, fallback font predownloads, and downloaded font cache management. +- Assets panel — browse, search, and insert document components directly from the left sidebar. +- Component variants — switch instance variants from the right inspector; default variant respects property definitions. +- Figma library metadata — component keys, source libraries, version IDs, descriptions, and docs links are preserved on import/export. +- Desktop file associations — double-click `.fig` or `.pen` files in Finder/Explorer to open them in OpenPencil. +- Auto-update — startup update checks and a Check for Updates menu item on desktop. +- Light theme with theme-aware canvas rulers. +- PDF export — available in the export panel, CLI (`--format pdf`), and MCP. +- SVG import tool for automation workflows. +- DeepSeek AI provider. +- Variable modes — create, rename, duplicate, delete, and set defaults per collection. +- Variable binding controls for fills, strokes, sizing, min/max, and typography fields. +- Auto-layout inspector controls for min/max dimensions, auto gap, wrap gap, and two-axis padding. +- Stroke dash/gap controls. +- Font settings — local font access, fallback predownloads, and downloaded font cache management. ### Changed -- Refactor the editor architecture across core, app, Vue SDK, CLI, MCP, docs, and desktop into smaller domain modules with structural lint rules to keep package boundaries explicit. -- Add targeted core subpath exports and package-local import aliases for cleaner app, Vue SDK, CLI, and MCP imports. -- Split the canvas into separate scene and overlay render layers so rulers, labels, selections, and input overlays are isolated from scene rendering. -- Share one generated menu schema between browser and Tauri menus for more consistent app commands. -- Remove `@use-gesture/vanilla` — canvas wheel handling uses a direct passive-false listener with RAF batching. -- Reorganize development docs and roadmap notes under the VitePress docs package. -- Reorganize engine tests to mirror source domain structure — IO formats, text, clipboard, vector, geometry, and profiler modules each have their own test folders. +- Smaller domain modules across core, app, Vue SDK, CLI, MCP, docs, and desktop with enforced package boundaries. +- Separate scene and overlay canvas layers — rulers, labels, and selections no longer cause scene redraws. +- Shared menu schema between browser and native Tauri menus. ### Fixes -- Fix `.fig` export of component variant property definitions — variant types are now serialized as the Kiwi `TEXT` enum value instead of the invalid `VARIANT` literal. -- Fix `.fig` export of text `layoutAlignSelf` — stretch alignment on text nodes is now preserved through Figma clipboard and file roundtrips. -- Fix CJK and Arabic fallback font rendering so text waits for required fallback fonts and repaints after async fallback loading completes. -- Fix large `.fig` files freezing during open — parsing and scene graph import now run in the worker, and opened files fit to the canvas viewport after loading. -- Improve Figma import fidelity for Preline UI files — preserve variable aliases, derived instance layout, nested instance scaling, avatar swaps, badge internals, and input text alignment. -- Improve Figma render fidelity for exports — preserve flipped vector bounds, render Figma stroke geometry for shapes/vectors, fix clipped visual overflow, and render drop shadows for stroked shapes from the stroke outline. -- Fix component variant switching so instances swap their contents instead of only changing the component id. -- Fix default variant selection in Assets by respecting component property definitions. -- Fix asset insertion coordinates inside entered containers. -- Fix text editing inside selected components and instances on double-click. -- Fix paste into selected containers. -- Fix clipboard parsing so invalid Kiwi data is ignored safely. -- Fix undo rendering after state restore and undo/redo shortcuts firing twice during modifier-key release. -- Prevent browser/Safari from intercepting app-level Cmd/Ctrl shortcuts such as undo/redo. -- Fix option-drag duplicate undo/redo so undo removes duplicated subtrees and redo restores them instead of moving the copy back. -- Fix MCP stdio handshake and eval return values. -- Fix default and bundled font provider resolution, including package-root font loading. -- Keep the global startup loader visible until CanvasKit fonts load and the first font-backed render completes, avoiding a flash of missing text in opened files and the demo. -- Fix hot reload creating duplicate editor tabs during development. -- Improve light theme polish across warning colors, the Safari banner, app UI tokens, and canvas rulers. -- Normalize browser zoom speed and restore wheel zoom scaling after gesture handling changes. -- Improve layout inspector dropdown anchoring and icon clarity for spacing and padding controls. -- Fix variable picker popovers and ScrubInput button clicks so binding controls remain clickable during scrub interactions. -- Fix bound color variable inspector swatches to display the resolved variable color and detach the binding when edited directly. -- Fix dashed strokes on vector nodes rendering as solid lines — dash pattern now uses `PathEffect.MakeDash` directly instead of outline conversion, and closed crescent shapes render a single dashed centerline arc instead of two parallel arcs. -- Fix gradient fills on text nodes by clipping gradient paints through the shaped paragraph mask. -- Fix inner shadow rendering for text nodes to be more in line with Figma's behavior. -- Fix exponential decompressed `.fig` growth triggered by repeated save/load cycles. -- Fix `@open-pencil/vue` npm imports that referenced an unexported core canvas subpath. -- Fix canvas size badges so they stay in screen space instead of scaling with zoom. -- Fix section drawing errors and color input attribute forwarding in the property panel. -- Fix demo component instances by laying out source components before creating instances, and restore explicit badge dot/text spacing. +- Fix `.fig` export of component variant properties and text stretch alignment so designs round-trip correctly through Figma. +- Fix CJK and Arabic text rendering — fallback fonts now load before the first paint instead of showing blank text. +- Fix large `.fig` files freezing on open — parsing runs in a worker, and the viewport fits to content after loading. +- Improve Figma import fidelity — variable aliases, nested instances, avatar swaps, badge internals, and input text alignment are preserved. +- Improve Figma export fidelity — flipped vectors, stroke geometry, visual overflow, and stroked-shape drop shadows are preserved. +- Fix variant switching so instances update their contents, not just the component reference. +- Fix text editing inside components and instances on double-click. +- Fix paste into selected containers and entered frames. +- Fix clipboard parsing to safely ignore invalid data. +- Fix undo/redo for duplicate, state restore, and modifier-key release. +- Prevent browser from intercepting app-level undo/redo shortcuts. +- Fix font loading and bundled font resolution. +- Show the startup loader until fonts load and the first render completes. +- Improve light theme polish and canvas ruler colors. +- Normalize browser zoom speed. +- Fix variable picker popovers and color binding swatches. +- Fix dashed strokes on vector nodes and gradient fills on text. +- Fix inner shadow rendering on text nodes. +- Fix exponential `.fig` file growth on repeated save/load cycles. +- Fix canvas size badges scaling with zoom. ### Performance -- Render canvas on editor events instead of continuous RAF polling — scene and overlay layers invalidate independently. -- Coalesce canvas surface frames across scene and overlay surfaces using a shared per-editor RAF scheduler. -- Cache paragraph font-family fallback arrays to avoid repeated allocation during text rendering. -- Gate WebGL draw-call instrumentation — GL method wrapping is only active while the profiler HUD or capture is running. -- Cache downloaded remote fonts in app-local storage so reopened documents can reuse them without repeated network fetches. -- Add a curated fallback font manifest for CJK and Arabic font downloads. -- Cache instance override resolution and lazily populate opened `.fig` pages to reduce load time for large community files. -- Reduce zoom and overlay rendering work by separating scene rendering from rulers, selection, labels, and input overlays. -- Avoid scene picture recording during live edit interactions. - -### Tests - -- Add Tauri API mock coverage for font loading, font cache, external links, document read/write, save dialogs, process helpers, and remaining desktop integrations. -- Add scheduled/manual heavy `.fig` import coverage and mark large fixture metadata tests as heavy. -- Hide rulers in E2E visual regression snapshots so ruler rendering changes don't break unrelated canvas assertions. -- Enforce zero code duplication via jscpd (`--threshold 0`) as part of the `check` gate. -- Add Steiger architecture rule to flag broad engine `basic.test.ts` files (>250 lines, 4+ describe blocks). -- Add oxlint rules for Vue test-id conventions, browser side-effect guards, document.querySelector restrictions, and generated test-id literal drift. -- Standardize E2E selectors on Playwright `getByTestId()` with `data-test-id` attribute and shared test-id helpers/directive. -- Guard Tauri font cache against headless/non-Tauri environments to eliminate spurious test warnings. +- Event-driven canvas rendering — scene and overlay layers only repaint when their inputs change, replacing continuous polling. +- Shared RAF scheduler coalesces scene and overlay frames into a single animation frame per editor. +- Font-family fallback arrays and downloaded remote fonts are cached to avoid repeated work. +- WebGL draw-call instrumentation only runs while the profiler is active. +- Instance override resolution is cached and `.fig` pages load lazily for large files. +- Live drag/resize uses repaint-only previews to skip layout during interaction. ## 0.11.8 — 2026-04-23