Commit graph

841 commits

Author SHA1 Message Date
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
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
Danila Poyarkov bfd89b9ee9 docs: add shader layers to roadmap 2026-05-22 20:18:43 +03: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
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
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
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