Commit graph

1018 commits

Author SHA1 Message Date
Danila Poyarkov 75412ed59f fix(kiwi): preserve rich text schema metadata 2026-05-25 09:19:46 +03:00
Danila Poyarkov 84cf18ba80 fix(kiwi): preserve schema paint fields 2026-05-25 09:19:25 +03:00
Danila Poyarkov 632972d5bb docs: update Figma compatibility roadmap 2026-05-25 08:58:32 +03:00
Danila Poyarkov 5c09ca0299 test(core): stabilize engine unit tests
- Update EffectType schema assertion for modern Figma enum values
- Treat unsupported OpenType font buffers as unavailable
- Skip CJK outline fallback coverage when the LFS font fixture is not materialized
2026-05-25 01:41:59 +03:00
Danila Poyarkov f4b3453fbd chore(lint): check duplicate type shapes across files
- Add a repo-wide TypeScript AST duplicate shape check to the quality gate
- Extract shared named types for existing cross-file duplicates
- Keep same-file oxlint coverage for editor feedback
2026-05-25 00:55:29 +03:00
Danila Poyarkov 2f8dfd883a chore(lint): catch duplicate type shapes
- Add AST-based duplicate object type shape detection
- Reuse shared variable consumption and visual bounds type shapes
- Keep duplicate type shape checks in the default lint gate
2026-05-25 00:47:33 +03:00
Danila Poyarkov 1ed7de6056 chore(lint): reject broad unknown type assertions
- Add AST-based lint checks for broad unknown object assertions and local JsonObject aliases
- Centralize JsonObject in core and package-local MCP RPC JSON typing
- Replace baseline Record<string, unknown> assertions with named shared/domain types
2026-05-25 00:26:02 +03:00
Danila Poyarkov b4dfd90da0 fix(kiwi): resolve variable radius overrides
- Resolve numeric variable aliases in symbol override radius fields
- Preserve imported 999 corner sentinels through G0 to G1 roundtrips
- Remove the resolved corner-radius roundtrip TODO
2026-05-24 23:46:29 +03:00
Danila Poyarkov ae2ba1455b fix(vue): sync locale messages
- Add missing menu and panel translations across locale files
- Restore locale sync check on master
2026-05-24 22:55:45 +03:00
Danila Poyarkov 7f2c21bb23 refactor(core): avoid record casts for dynamic writes
- Use KiwiNodeChange index signature for raw Figma field assignment
- Type preserved raw NodeChange keys with keyof NodeChange
- Replace scene graph property write casts with a typed setter
2026-05-24 22:37:03 +03:00
Danila Poyarkov 22280cc758 fix(kiwi): preserve imported derived text data
- Prefer raw derivedTextData for imported Figma nodes during export
- Keep G1 exports idempotent with preserved text glyph and baseline payloads
- Remove the resolved derivedTextData roundtrip TODO
2026-05-24 22:27:31 +03:00
Danila Poyarkov 15e2c38137 Merge remote-tracking branch 'origin/master' into SantosAlarcon/master 2026-05-24 22:04:51 +03:00
Danila Poyarkov 35db955cb9 fix(kiwi): improve fig roundtrip fidelity
- Refresh the bundled Figma Kiwi schema from a newer embedded schema
- Preserve additional raw node fields and omitted imported stack sizing
- Tighten idempotent roundtrip checks while documenting known G0 import gaps
2026-05-24 19:27:19 +03:00
Danila Poyarkov c4f33036b1 Merge remote-tracking branch 'origin/master' into SantosAlarcon/master
# Conflicts:
#	src/components/ui/AppSelect.vue
2026-05-24 15:52:52 +03:00
Joseph Cumines bfe1b63299 fix(formatting) 2026-05-24 21:10:27 +10:00
Joseph Cumines 2a6c455464 Merge remote-tracking branch 'upstream/HEAD' into fix/fig-roundtrip-fidelity 2026-05-24 21:09:42 +10:00
Danila Poyarkov afd571341b fix(ai): render common generated JSX aliases 2026-05-24 12:45:42 +03:00
Danila Poyarkov abd795bd9a chore: format codebase 2026-05-24 12:15:29 +03:00
Joseph Cumines c4073dc284 fix(kiwi): repair .fig roundtrip - missing nodes, schema mismatch, GUID collisions
Exporting a .fig from OpenPencil and reimporting lost most nodes
(38323 to 57 on gold-preview.fig) and the same files wouldn't open
in Figma. gold-preview.fig now roundtrips into Figma. I haven't
traced each symptom to a specific fix with confidence, but the
changes address the underlying causes:

- fractionalPosition overflow past 94 siblings produced characters
  outside Figma's printable ASCII range (33-126); gold-preview.fig
  has nodes with 492 children so this hit immediately. New telescoping
  ~-prefix scheme matches Figma's own encoding.
- re-export used OpenPencil's subset kiwi schema, likely producing
  field IDs misaligned with the embedded schema. Preserve and use
  the original schema (graph.figSchemaDeflated) instead.
- variable GUIDs assigned before canvas entries could collide with
  source.id-derived canvas GUIDs. Reversed the order, scan all
  imported GUIDs to advance the counter.
- auto-layout child sort ignored parentIndex.position, using only
  transform position which may not reflect original tree order for
  imported nodes. Sort by position first, transform as tiebreaker.
- Object.assign of rawNodeFields overwrote explicit serialization.
  Materialize with paint variables, apply blocklist, skip keys
  already set on nc.

Also fixes: strokeWeight defaulting on strokeless nodes, colorVar
assetRef to guid conversion, per-corner radii emission, textAlignVertical
hardcoding, textAutoResize override for imported nodes, stackReverseZIndex
roundtrip, variable key/version preservation, blendMode on effects,
textCase emission.

Adds exhaustive roundtrip test comparing G0 to G1 to G2 across schema
bytes, node count, tree paths, scene props, and raw node fields.
2026-05-24 18:29:14 +10:00
Danila Poyarkov a38c0ac7b5 fix(core): satisfy type-aware lint 2026-05-23 05:25:06 +03:00
Danila Poyarkov 06dce623db refactor(core): split text data serialization 2026-05-23 03:30:07 +03:00
Danila Poyarkov c337905a02 fix(canvas): preserve text OpenType toggles 2026-05-23 01:43:00 +03:00
Danila Poyarkov f36d6b94b7 fix(canvas): apply affine image fill transforms 2026-05-23 01:31:04 +03:00
Danila Poyarkov 762c86e094 Revert "perf(canvas): defer backing rebuilds while zooming"
This reverts commit 21a79d4cd5.
2026-05-23 01:17:48 +03:00
Danila Poyarkov 21a79d4cd5 perf(canvas): defer backing rebuilds while zooming 2026-05-23 01:17:07 +03:00
Danila Poyarkov 0d5db35147 perf(canvas): bound blend and text mask layers 2026-05-23 01:10:24 +03:00
Danila Poyarkov f07d26c50b perf(canvas): bound effect render layers 2026-05-23 01:01:38 +03:00
Danila Poyarkov 7184bc1b06 Revert "perf(canvas): cap retained backing size"
This reverts commit 7b62c8acca.
2026-05-23 00:45:13 +03:00
Danila Poyarkov 7b62c8acca perf(canvas): cap retained backing size 2026-05-23 00:30:30 +03:00
Danila Poyarkov 054199ac15 fix(kiwi): preserve edited font variation axes 2026-05-23 00:26:58 +03:00
Danila Poyarkov 8c85d2b953 fix(canvas): improve Figma mask and text fidelity 2026-05-23 00:18:33 +03:00
Danila Poyarkov 3dc0904466 fix(canvas): support luminance masks and tile transforms 2026-05-22 23:44:10 +03:00
Danila Poyarkov 98616c8610 fix(canvas): render Figma-style corner smoothing 2026-05-22 23:05:24 +03:00
Danila Poyarkov 76ee122dee fix(canvas): render smoothed corners and effect blend modes 2026-05-22 22:50:58 +03:00
Santos Alarcón Asensio 1d297f090c
Merge branch 'master' into master 2026-05-22 20:27:54 +02:00
Santos Alarcón 091271b05f chore: code formatting 2026-05-22 20:24:02 +02:00
Danila Poyarkov 0ce57ea0fa fix(canvas): render Figma mask stacks 2026-05-22 21:05:35 +03:00
Danila Poyarkov 8e1d5d40e7 fix(canvas): render Figma blend modes 2026-05-22 21:00:34 +03:00
Danila Poyarkov da65cb6dc7 docs: expand agent workflow roadmap 2026-05-22 20:54:10 +03:00
Santos Alarcón Asensio 560285bb4d
Merge branch 'master' into master 2026-05-22 19:33:45 +02:00
Santos Alarcón 0babefa30b fix: build errors 2026-05-22 19:26:28 +02:00
Danila Poyarkov bfd89b9ee9 docs: add shader layers to roadmap 2026-05-22 20:18:43 +03:00
Santos Alarcón Asensio 9bbd57299d
Merge branch 'open-pencil:master' into master 2026-05-22 19:15:23 +02:00
Danila Poyarkov bf232bac8b docs: centralize roadmap 2026-05-22 20:02:05 +03:00
Danila Poyarkov 77307e17da docs: drop README roadmap 2026-05-22 19:54:46 +03:00
Danila Poyarkov 9431c1935e docs: remove stale roadmap pages 2026-05-22 19:46:57 +03:00
Danila Poyarkov 540b706349 docs: document Figma compatibility 2026-05-22 19:31:06 +03:00
Danila Poyarkov b750d1f3dc docs: generate llms files
- Generate llms.txt and llms-full.txt from VitePress content loader

- Advertise the agent-readable docs through alternate links
2026-05-22 16:03:04 +03:00
Danila Poyarkov 8f4f7a47e9 fix(canvas): filter retained backing previews
- Keep stale scene backings available during zoom for smooth interaction

- Draw scaled backings with linear filtering to avoid blocky text artifacts
2026-05-22 14:44:16 +03:00
Santos Alarcón 5461b38ce5 More translations 2026-05-22 13:08:55 +02:00
Danila Poyarkov a49f626e3e fix(canvas): render stroked container shadows from bounds
- Use container bounds for stroked frames with drop shadows

- Keep stroke-geometry shadows for childless stroke-only shapes

- Cover the shadcn dropdown menu case
2026-05-22 13:39:29 +03:00
Danila Poyarkov 1c22b3f7a9 test(canvas): align shadow cleanup checks
- Keep explicit color filter deletion checks compatible with cleanup guards

- Verify text inner-shadow restore balancing through the restore-count loop

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 13:17:04 +03:00
Danila Poyarkov f6e31be707 fix(canvas): delete renderer label resources
- Dispose parent outline paint during renderer teardown

- Dispose section and component label fonts with other renderer-owned fonts

- Cover renderer teardown for label resources

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 13:15:35 +03:00
Danila Poyarkov 420c61e004 fix(canvas): guard retained backing surfaces
- Fall back to live rendering when CanvasKit cannot allocate the backing surface

- Match retained backing metadata against the current graph preview version

- Cover null-surface and stale-preview backing regressions

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 12:51:00 +03:00
Danila Poyarkov 9f67a1086d fix(canvas): restore shadow render state on errors
- Restore canvas save layers and shared paints from shadow effect paths when rendering fails

- Delete temporary paths and color filters through error paths without suppressing failures

- Cover drop-shadow and text inner-shadow cleanup regressions

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 12:47:33 +03:00
Danila Poyarkov 0b4fcc9f77 fix(canvas): render shadows from path shapes
- Use polygon, star, and vector paths for shadows when geometry blobs are unavailable
- Apply shadow spread to copied geometry paths without mutating caches
- Clip and cut out inner shadows with the same path geometry

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 12:37:00 +03:00
Santos Alarcón Asensio 6b2de4ad7a
Merge branch 'open-pencil:master' into master 2026-05-22 11:27:48 +02:00
Danila Poyarkov fadb17b108 fix(canvas): clean up gradient text layers
- Delete gradient text paragraphs through the exception path
- Reset shared effect layer paint after gradient text rendering

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 12:24:14 +03:00
Danila Poyarkov 2fc67e7b6a fix(canvas): clean up boolean render paths
- Delete boolean operation paths even when drawing fails
- Reset fill shaders while preserving the existing render path

Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
2026-05-22 12:19:14 +03:00
Santos Alarcón 74709ffc6c Fix in the tooltip and more i18n strings 2026-05-21 20:19:15 +02:00
Danila Poyarkov 3850be9512 build: publish node-compatible packages 2026-05-21 17:03:19 +03:00
Danila Poyarkov 24ac31d4ab fix(fig): restore lazy badge visibility overrides 2026-05-21 14:54:18 +03:00
Danila Poyarkov d3e82fba44 fix(fig): preserve source metadata during lazy import 2026-05-21 14:54:17 +03:00
Danila Poyarkov da9dbbb9c6 fix(editor): preserve edits over imported metadata 2026-05-21 14:54:17 +03:00
Danila Poyarkov b5451c354f fix(fig): preserve kiwi version in export worker 2026-05-21 14:54:17 +03:00
Danila Poyarkov a48b23129f fix(fig): stabilize engine test suite 2026-05-21 14:54:17 +03:00
Danila Poyarkov 302ed838f5 fix(fig): sanitize preserved payload enums 2026-05-21 14:54:17 +03:00
Danila Poyarkov 749585d737 refactor(fig): group source roundtrip metadata 2026-05-21 14:54:17 +03:00
Danila Poyarkov d78bcb3b40 fix(fig): render headless export thumbnails 2026-05-21 14:54:16 +03:00
Danila Poyarkov c85e06466c fix(fig): preserve imported canvas strokes 2026-05-21 14:54:16 +03:00
Danila Poyarkov dd0a5317fd fix(fig): preserve imported node ordering 2026-05-21 14:54:16 +03:00
Danila Poyarkov 8eedaba84f fix(fig): preserve imported canvas guids 2026-05-21 14:54:16 +03:00
Danila Poyarkov 12d726eee1 Revert "fix(cli): export fig documents by default"
This reverts commit 682e5991a4bf76753ae22046e952070aaa242de9.
2026-05-21 14:54:16 +03:00
Danila Poyarkov 5830b9f976 fix(cli): export fig documents by default 2026-05-21 14:54:16 +03:00
Danila Poyarkov 2ef237f5e1 fix(fig): preserve imported text and paint fallbacks 2026-05-21 14:54:16 +03:00
Danila Poyarkov b784882e88 fix(fig): preserve component prop reference maps
- Export component sets with Figma-compatible frame state-group metadata
- Emit internal component definitions before page instances
- Preserve prop-ref variable maps while continuing to strip unsafe alias maps
2026-05-21 14:54:15 +03:00
Danila Poyarkov 2897e0b20f fix(fig): preserve component prop preferred values
- Add current Kiwi component prop fields used by Figma exports
- Preserve empty instance-swap preferred value arrays instead of dropping them during encoding
2026-05-21 14:54:15 +03:00
Danila Poyarkov e6508c191b fix(fig): preserve import edit metadata
- Add EditInfo to the export schema so preserved raw Figma edit metadata is encoded
- Emit false symbol publishability for components to match imported Figma payloads
2026-05-21 14:54:15 +03:00
Danila Poyarkov 5dff0d4285 fix(fig): keep variable maps inside instance payloads
- Continue stripping top-level variable maps that crash Figma import
- Preserve nested variable maps in symbol overrides, component assignments, and derived symbol data for better instance reconstruction
2026-05-21 14:54:15 +03:00
Danila Poyarkov 450ca16b28 fix(fig): preserve component prop default values
- Add ComponentPropDef.varValue to the static Kiwi schema
- Keep imported boolean component defaults instead of degrading them to empty strings
2026-05-21 14:54:14 +03:00
Danila Poyarkov 35b146b4c6 fix(fig): preserve component variant metadata
- Preserve raw component property definitions, refs, variant specs, and source library metadata
- Add current Figma schema entries needed to encode variantPropSpecs and modern component prop types
2026-05-21 14:54:14 +03:00
Danila Poyarkov ef802b4681 fix(fig): skip unresolved paint variables
- Drop preserved colorVar and opacityVar payload fields together with variable maps
- Keep concrete paint colors as fallbacks so Figma does not render unresolved variables as missing content
2026-05-21 14:54:14 +03:00
Danila Poyarkov 6586b497bb fix(fig): skip variable maps in preserved payloads
- Keep preserving style IDs and paint variable metadata
- Drop variableConsumptionMap and parameterConsumptionMap on export because Figma imports enter invalid Slides rail state with these raw maps
2026-05-21 14:54:14 +03:00
Danila Poyarkov 307b271259 fix(fig): mark exported canvases as design pages
- Add the current Figma pageType field and EditorType enum values
- Write pageType DESIGN on exported CANVAS records so Figma initializes design-mode page state
2026-05-21 14:54:13 +03:00
Danila Poyarkov 25430b1479 fix(kiwi): restore export-stable schema fields
- Keep live clipboard-derived numbers only for fields emitted by preserved payloads
- Restore unused glyph/layout fields to the schema shape Figma imports without triggering Slides state
2026-05-21 14:54:13 +03:00
Danila Poyarkov 82499b8678 fix(kiwi): keep layout fields in schema order
- Move stackWrap and stackCounterSpacing beside adjacent live Figma field IDs
- Preserve clipboard-derived field numbers without appending them after newer high IDs
2026-05-21 14:54:13 +03:00
Danila Poyarkov 213db6373a refactor(kiwi): group fig format internals
- Move codec, NodeChange conversion, and instance overrides under kiwi/fig
- Flatten the codec entrypoint to kiwi/fig/codec
- Keep schema-runtime as the generic Kiwi parser/compiler boundary
2026-05-21 14:54:13 +03:00
Danila Poyarkov 54310308dc refactor(kiwi): split schema text from runtime
- Move the Kiwi runtime under schema-runtime to match folder naming
- Load the Figma schema from a .kiwi text asset with static validation
- Assert Figma clipboard-derived field numbers for fragile layout/text fields
2026-05-21 14:54:12 +03:00
Danila Poyarkov 81fa529332 fix(fig): preserve raw Figma override metadata
- Preserve raw paint variables, style ids, text line metadata, and variable maps
- Keep raw node paint/geometry/effect fields for imported Figma nodes
- Extend the Kiwi schema for current Figma override and variable fields
2026-05-21 14:54:12 +03:00
Danila Poyarkov 513d630653 fix(fig): preserve variable-backed override fields
- Add missing style and variable map fields to the Kiwi schema
- Preserve TEXT_DATA consumption maps and style ids inside instance overrides
- Keep Figma's component override payloads closer to clipboard output
2026-05-21 14:54:12 +03:00
Danila Poyarkov 844b904844 fix(fig): preserve instance component assignments
- Keep top-level componentPropAssignments from imported Figma instances
- Re-emit those assignments with preserved variable values for Figma import
- Fix datepicker instances losing configured component property values
2026-05-21 14:54:12 +03:00
Danila Poyarkov f4ad80d789 fix(fig): preserve imported geometry and prop values
- Keep raw Figma size and transform values for imported nodes during export
- Add current Kiwi schema fields for component prop varValue and symbol id variable values
- Preserve component source geometry used by Figma to reconstruct instances
2026-05-21 14:54:12 +03:00
Danila Poyarkov 1c0122b485 fix(fig): preserve derived instance payloads
- Store imported derivedSymbolData on scene nodes with blob bytes remapped for export
- Re-emit derivedSymbolData and layout versions for Figma instances
- Skip unsupported metadata fields that the current Kiwi encoder cannot write
2026-05-21 14:54:11 +03:00
Danila Poyarkov 40ee1b83d4 fix(fig): preserve instance override payloads
- Keep imported Figma node guids so override paths and symbol references remain stable
- Serialize imported symbolOverrides and uniform scale factors for instances
- Strip unsupported variable consumption maps from preserved overrides before encoding
2026-05-21 14:54:11 +03:00
Danila Poyarkov 9a6e29cf6f fix(fig): preserve imported layout metadata
- Keep Figma stack sizing fields such as RESIZE_TO_FIT_WITH_IMPLICIT_SIZE
- Avoid writing default auto-layout fields onto imported instances when Figma omitted them
- Cover instance layout metadata roundtrips
2026-05-21 14:54:11 +03:00
Danila Poyarkov 68ebef5f9b fix(fig): omit populated instance children on export
- Match Figma files where INSTANCE node changes carry symbol refs, not child nodes
- Prevent exported roundtrips from expanding every populated instance subtree
- Tighten glyph blob preservation now that instance children are omitted
2026-05-21 14:54:11 +03:00
Danila Poyarkov 1c655f34ce fix(fig): preserve auto-layout child transforms
- Stop zeroing transforms for auto-layout children during .fig export
- Match real Figma files, which keep child transform offsets alongside layout data
- Update transform regression coverage to prevent collapsed roundtrips
2026-05-21 14:54:11 +03:00
Danila Poyarkov 4fe2b75dc8 fix(io): keep page descendants in fig exports
- Preserve the source document root when extracting export subgraphs
- Include page descendants when exporting a single page to .fig
- Cover page subgraph extraction so CLI .fig exports are not empty
2026-05-21 14:54:10 +03:00
Danila Poyarkov c1ddbf7039 fix(fig): deduplicate exported text glyph blobs
- Preserve imported Figma glyph outlines for fallback rendering
- Reuse identical glyph command blobs across exported text nodes
- Cover real fixture preservation and generated glyph deduplication
2026-05-21 14:54:10 +03:00
Danila Poyarkov 8542c1db65 fix(vue): ignore click jitter before moving selection
- Start selection moves only after a 4px screen-space threshold
- Keep click selection from previewing or committing 1px geometry changes
- Cover below-threshold and intentional move behavior
2026-05-21 14:54:10 +03:00
Santos Alarcón 33e89b30d1 refactor: added tooltips and i18n new keys 2026-05-21 13:42:42 +02:00
Danila Poyarkov 10f551efc1 fix(mcp): add package json import attribute
- Preserve ESM package metadata import under Node.js 20
- Avoid runtime ERR_IMPORT_ASSERTION_TYPE_MISSING for openpencil-mcp
2026-05-20 15:36:39 +03:00
Danila Poyarkov e6da2736fe fix(fig): sync lazy link component overrides
- Carry resolved text styling and glyph data through component-property text clones
- Align lazy cloned child placement and hidden chevrons with their resolved source
- Cover the gold-preview dropzone link lazy import regression
2026-05-20 15:02:01 +03:00
Danila Poyarkov 11495ee2ce fix(canvas): align small vector strokes and shadows
- Punch hidden shadow interiors at the node position instead of the shifted shadow position
- Render unfilled center-stroked vectors from their centerline for small icon fidelity
2026-05-20 14:23:06 +03:00
Danila Poyarkov 957db338ba fix(fig): sync lazy instance override clones
- Re-propagate resolved overrides after lazy instance population
- Preserve Figma showShadowBehindNode on effects
- Mask unfilled stroke shadows behind their fill geometry
2026-05-20 13:12:16 +03:00
Danila Poyarkov 4603bbf81b fix(canvas): shadow stroked shapes without fills
- Use stroke geometry for drop shadows on unfilled stroked nodes
- Avoid filling the interior of outline-only image icons
2026-05-20 12:52:21 +03:00
Danila Poyarkov 82fc5fb7bb fix(fig): propagate cloned component property overrides
- Resolve component-property refs through override keys on cloned children
- Apply instance component-property assignments through clone chains
- Use child shadow shapes for containers without visible fills
- Keep clipped export bounds from leaking hidden descendants
2026-05-20 12:29:51 +03:00
Danila Poyarkov ffa0b9d6f8 perf(canvas): scope backing subtree cache 2026-05-20 03:04:51 +03:00
Danila Poyarkov 9949a1dd8b perf(canvas): cache backing subtree pictures 2026-05-20 03:04:51 +03:00
Danila Poyarkov c67e935c7c refactor(canvas): isolate retained backing renderer 2026-05-20 03:04:50 +03:00
Danila Poyarkov efa2e58269 perf(canvas): build retained backing incrementally 2026-05-20 03:04:50 +03:00
Danila Poyarkov 28f5a442e1 fix(canvas): bypass scene backing for edit overlays 2026-05-20 03:04:50 +03:00
Danila Poyarkov d777fddfe9 perf(canvas): avoid zoom preview backing refreshes 2026-05-20 03:04:50 +03:00
Danila Poyarkov fbc3b8b282 perf(canvas): adapt backing debounce to render cost 2026-05-20 03:04:50 +03:00
Danila Poyarkov 0960aa5198 perf(canvas): debounce crisp backing during zoom 2026-05-20 03:04:50 +03:00
Danila Poyarkov 07173fe0ae perf(canvas): retain overscanned scene backing 2026-05-20 03:04:50 +03:00
Danila Poyarkov a22d39210c fix(fig): populate lazy pages before export 2026-05-19 21:01:17 +03:00
Danila Poyarkov 1d15469c27 perf(fig): populate imported pages lazily 2026-05-19 20:55:43 +03:00
Danila Poyarkov 05c9a7a576 perf(io): defer imported page layout work 2026-05-19 20:50:17 +03:00
Danila Poyarkov 7a433584cc Release v0.12.2 2026-05-19 18:10:25 +03:00
Danila Poyarkov e3d6056bf5 docs: update MCP setup and landing screenshot 2026-05-19 17:58:08 +03:00
Danila Poyarkov 779e0e493f fix(mcp): improve agent-rendered JSX 2026-05-19 17:57:43 +03:00
Danila Poyarkov 6e1cadcaff fix(mcp): simplify disconnected guidance 2026-05-19 15:53:28 +03:00
Danila Poyarkov b188808a74 refactor(mcp): centralize websocket routing 2026-05-19 15:51:59 +03:00
Danila Poyarkov 02bbabaf17 fix(mcp): route stdio bridge requests 2026-05-19 15:47:38 +03:00
Danila Poyarkov 3a85632f38 refactor(ui): localize tooltip labels 2026-05-19 15:41:38 +03:00
Danila Poyarkov 8cb6d008fc fix(ai): allow custom OpenRouter models 2026-05-19 15:10:32 +03:00
Danila Poyarkov 8fa34fb0b8 Release v0.12.1 2026-05-19 13:27:24 +03:00
Danila Poyarkov 26fb9b6a0b fix(canvas): render background blur as backdrop 2026-05-19 13:07:46 +03:00
Danila Poyarkov 59550c1c07 fix(fonts): restore font picker selection 2026-05-19 12:52:11 +03:00
Danila Poyarkov e0d76ca72a fix(mcp): support scoped save paths
Co-authored-by: LCbeijing <LCbeijing@users.noreply.github.com>
2026-05-19 11:29:54 +03:00
Danila Poyarkov f4454aeb44 fix(mcp): report version mismatches 2026-05-19 11:12:01 +03:00
Danila Poyarkov c11d65fe55 Revert "Revert "fix(fig): preserve OpenPencil round trips""
This reverts commit 9ce6096fc1.
2026-05-19 00:23:23 +03:00
Danila Poyarkov 9ce6096fc1 Revert "fix(fig): preserve OpenPencil round trips"
This reverts commit 5ef8bbd93d.
2026-05-19 00:20:47 +03:00
Danila Poyarkov 5ef8bbd93d fix(fig): preserve OpenPencil round trips 2026-05-19 00:16:41 +03:00
Danila Poyarkov 3012d0d36b fix(tauri): compile release builds 2026-05-18 22:30:58 +03:00
Danila Poyarkov 682160b75b Release v0.12.0 2026-05-18 21:06:06 +03:00
Danila Poyarkov c7946b9cff chore(scene-graph): clear lint warning 2026-05-18 21:04:07 +03:00
Danila Poyarkov f466946c1c fix(canvas): render derived text underlines 2026-05-18 20:28:15 +03:00
Danila Poyarkov eb7a663c1c fix(fig): preserve scene node defaults during overrides 2026-05-18 19:50:34 +03:00
Danila Poyarkov 955aa4d1e9 refactor(core): use es-toolkit utilities 2026-05-18 19:21:14 +03:00
Danila Poyarkov f3649550f2 chore: enable stricter oxlint rules 2026-05-18 18:58:30 +03:00
Danila Poyarkov 9e2cd356e5 fix(fig): preserve imported instance layout sync 2026-05-18 18:21:27 +03:00
Danila Poyarkov 6d8920a496 fix(canvas): tune derived glyph coverage 2026-05-18 18:21:26 +03:00
Danila Poyarkov cdc4194396 fix(io): supersample premultiplied raster exports 2026-05-18 18:21:26 +03:00
Danila Poyarkov c75125cf2c fix(canvas): prefer imported vector stroke geometry 2026-05-18 18:21:26 +03:00
Danila Poyarkov 70114ef6de fix(io): preserve one-pixel export fringes 2026-05-18 14:00:23 +03:00
Danila Poyarkov 945560b5a9 fix(io): ignore inside stroke geometry bounds 2026-05-18 13:52:45 +03:00
Danila Poyarkov ff85febddb fix(canvas): render derived text without fonts 2026-05-18 13:36:03 +03:00
Danila Poyarkov 51e961fc47 fix(io): ignore component set stroke geometry bounds 2026-05-18 13:26:58 +03:00
Danila Poyarkov 2a4a0ce5a2 fix(canvas): offset component set dash phase 2026-05-18 12:51:28 +03:00
Danila Poyarkov 931e39e011 fix(canvas): render imported component set strokes 2026-05-18 12:26:05 +03:00
Danila Poyarkov 4195f13fad fix(fig): preserve imported hug container bounds 2026-05-18 04:20:22 +03:00
Danila Poyarkov 0232ab17f6 fix(canvas): use mipmapped image fills 2026-05-18 04:02:32 +03:00
Danila Poyarkov 41cc749dd2 fix(io): trim transparent page exports 2026-05-18 03:41:35 +03:00
Danila Poyarkov a0ba8bda3a fix(canvas): orient linear gradients like Figma 2026-05-18 03:21:16 +03:00
Danila Poyarkov f365ccf23b fix(canvas): ellipsize frame labels 2026-05-18 03:11:48 +03:00
Danila Poyarkov 220ad3758e fix(canvas): keep frame titles screen sized 2026-05-18 03:11:47 +03:00
Danila Poyarkov 7b428b58aa fix(canvas): ellipsize component labels 2026-05-18 03:11:47 +03:00
Danila Poyarkov 383e03defa fix(canvas): hide nested component labels 2026-05-18 03:11:47 +03:00
Danila Poyarkov 555b6e40c7 fix(editor): default pages to light canvas 2026-05-18 03:11:47 +03:00
Danila Poyarkov edf28f3659 fix(fig): scale instance stroke weights 2026-05-18 03:11:47 +03:00
Danila Poyarkov 2d011580f0 fix(fig): scale instance stroke weights 2026-05-18 02:47:05 +03:00
Danila Poyarkov 1de4f65767 fix(fig): propagate derived text glyphs 2026-05-18 02:35:33 +03:00
Danila Poyarkov 773b1539d2 fix(fig): prefer shared stroke styles 2026-05-18 02:30:37 +03:00
Danila Poyarkov 2dda4358d3 fix(canvas): render ellipse fill geometry 2026-05-18 02:26:51 +03:00
Danila Poyarkov 37acb25977 fix(canvas): shadow filled geometry shapes 2026-05-18 02:17:03 +03:00
Danila Poyarkov 221e69aaa4 fix(layout): preserve derived text bounds 2026-05-18 02:08:01 +03:00
Danila Poyarkov 1e735434c0 fix(canvas): avoid filled stroke geometry for shapes 2026-05-18 01:53:08 +03:00
Danila Poyarkov 2348966879 fix(fig): snap derived text baselines 2026-05-18 01:47:33 +03:00
Danila Poyarkov 2fd28fbbc5 fix(fig): apply derived glyph override patches 2026-05-18 01:23:35 +03:00
Danila Poyarkov 142a973193 fix(fig): render imported text from derived glyphs 2026-05-18 01:17:34 +03:00
Danila Poyarkov 7e86d57378 fix(fonts): include bundled Arabic fallback asset 2026-05-18 01:04:29 +03:00
Danila Poyarkov f72f445dc5 fix(vector): decode quadratic geometry commands 2026-05-18 01:02:43 +03:00
Danila Poyarkov 1ffc61cf50 fix(text): bundle Inter ExtraBold font 2026-05-18 00:59:05 +03:00
Danila Poyarkov 22991daf77 refactor(fig): split override sync modules 2026-05-18 00:36:37 +03:00
Danila Poyarkov 1fc0b62e9e refactor(fig): route derived data through patches 2026-05-18 00:27:24 +03:00
Danila Poyarkov 7992f8c013 refactor(fig): split component prop assignments 2026-05-18 00:22:30 +03:00
Danila Poyarkov e0f88090b0 refactor(fig): split component prop patching 2026-05-18 00:20:49 +03:00
Danila Poyarkov 4a052c574d refactor(fig): split component prop refs 2026-05-18 00:19:14 +03:00
Danila Poyarkov 54e456a11c refactor(fig): split component prop helpers 2026-05-18 00:17:41 +03:00
Danila Poyarkov 3cc45012e7 refactor(fig): describe copied sync fields 2026-05-18 00:14:44 +03:00
Danila Poyarkov 3c73c34d37 build(lint): catch optional named type shapes 2026-05-18 00:12:46 +03:00
Danila Poyarkov 170db518e9 refactor(fig): simplify override prop application 2026-05-18 00:08:31 +03:00
Danila Poyarkov f3ae564d89 refactor(fig): track override field protection 2026-05-18 00:04:36 +03:00
Danila Poyarkov a1af57c9c4 refactor(fig): apply overrides through patches 2026-05-17 23:56:11 +03:00
Danila Poyarkov 4080c25f6b refactor(fig): share style ref resolution 2026-05-17 23:52:41 +03:00
Danila Poyarkov a441e1778b fix(fig): preserve swapped icon stroke styles 2026-05-17 23:49:24 +03:00
Danila Poyarkov 4234cf3b33 fix(fig): apply shared fill styles 2026-05-17 23:31:28 +03:00
Danila Poyarkov 5e782b2850 fix(fig): propagate nested icon swaps 2026-05-17 23:25:09 +03:00
Danila Poyarkov 4d758f26cb fix(fig): apply shared text styles 2026-05-17 23:02:20 +03:00
Danila Poyarkov ff0f072aef fix(fig): use derived text line metrics 2026-05-17 22:49:12 +03:00
Danila Poyarkov 2072f2e916 fix(fig): apply text component props 2026-05-17 22:40:30 +03:00
Danila Poyarkov c57eba45a3 fix(clipboard): preserve Figma text edit layout 2026-05-17 22:18:47 +03:00
Danila Poyarkov d02b11b75d fix(clipboard): paste text into Figma with fixed bounds 2026-05-17 21:13:00 +03:00
Danila Poyarkov 72766acda5 fix(clipboard): preserve Figma text edit metrics 2026-05-17 21:09:10 +03:00
Danila Poyarkov 2f81a7407a fix(text): preserve auto-height bounds after editing 2026-05-17 21:01:23 +03:00
Danila Poyarkov a4d4cf1bee fix(canvas): switch edited text on click 2026-05-17 20:49:25 +03:00
Danila Poyarkov a535c6be8a fix(canvas): edit nested text on drill double-click 2026-05-17 20:46:13 +03:00
Danila Poyarkov 5d71e810b6 fix(text): preserve requested font weights 2026-05-17 20:40:39 +03:00