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
Danila Poyarkov
b46722a50b
fix(text): prefer matching local font slant
2026-05-17 20:33:13 +03:00
Danila Poyarkov
b1ad6d41e9
fix(editor): enable outlining grouped strokes
2026-05-17 20:27:45 +03:00
Danila Poyarkov
28f7ef165b
feat(text): wrap styled outline text
2026-05-17 20:23:55 +03:00
Danila Poyarkov
1c8fe1ee8b
feat(editor): add outline stroke command
2026-05-17 20:18:14 +03:00
Danila Poyarkov
75c2975fdc
feat(text): outline loaded fallback glyphs
2026-05-17 19:59:30 +03:00
Danila Poyarkov
12787abf85
feat(text): outline loaded style runs
2026-05-17 19:49:44 +03:00
Danila Poyarkov
d927a2b443
feat(text): share outline conversion for paths
2026-05-17 19:45:39 +03:00
Danila Poyarkov
fa3f60d10c
feat(canvas): flatten loaded text outlines
2026-05-17 19:25:43 +03:00
Danila Poyarkov
3151132fd3
fix(editor): reject image boolean sources
2026-05-17 19:15:14 +03:00
Danila Poyarkov
af70b0eeaf
feat(canvas): flatten container and stroke paths
2026-05-17 19:11:22 +03:00
Danila Poyarkov
5ddd0b966f
fix(app): wire renderer into figma api
2026-05-17 18:49:35 +03:00
Danila Poyarkov
becbf4360c
refactor(figma-api): share renderer-backed flatten
2026-05-17 18:37:53 +03:00
Danila Poyarkov
28829a56a9
fix(editor): guard unsupported boolean sources
2026-05-17 18:32:01 +03:00
Danila Poyarkov
dc93ec54c5
feat(editor): add flatten selection command
2026-05-17 18:27:54 +03:00
Danila Poyarkov
92328a21d8
build(lint): enforce shared black color constants
2026-05-17 18:05:07 +03:00
Danila Poyarkov
2eab8f9a50
test(canvas): add boolean shape visual matrix
2026-05-17 18:00:35 +03:00
Danila Poyarkov
40d8a54046
feat(canvas): render boolean operation paths
2026-05-17 17:54:19 +03:00
Danila Poyarkov
15c3ee3f00
fix(vue): remove boolean submenu from canvas menu
2026-05-17 17:42:15 +03:00
Danila Poyarkov
83c24925e8
feat(editor): add boolean operation commands
2026-05-17 17:33:26 +03:00
Danila Poyarkov
bf57a429d9
refactor(figma-api): align grouping API signatures
2026-05-17 17:11:15 +03:00
Danila Poyarkov
7da08789cd
refactor(figma-api): type creation methods against plugin typings
2026-05-17 16:30:35 +03:00
Danila Poyarkov
f9a75b70a3
test(figma-api): type-check plugin compatibility subset
2026-05-17 16:24:47 +03:00
Danila Poyarkov
011ff17c87
refactor(editor): isolate paste replacement logic
2026-05-17 16:11:31 +03:00
Danila Poyarkov
c322f80893
test(editor): harden paste to replace coverage
2026-05-17 16:08:03 +03:00
Danila Poyarkov
bdbb37b092
feat(editor): add paste to replace
2026-05-17 16:05:28 +03:00
Danila Poyarkov
daef4bdde7
fix(editor): use frame defaults for framed selection
2026-05-17 15:54:47 +03:00
Danila Poyarkov
4a37a5e534
feat(editor): add frame selection command
2026-05-17 15:52:20 +03:00
Danila Poyarkov
a23c75531a
refactor(canvas): align overlay file layout
2026-05-17 15:48:20 +03:00
Danila Poyarkov
b790a044e4
refactor(app): model canvas copy submenu
2026-05-17 15:14:55 +03:00
Danila Poyarkov
c922e1d9a4
fix(i18n): localize provider settings
2026-05-17 14:24:24 +03:00
Danila Poyarkov
433d812b9d
refactor(vue): format command shortcuts by platform
2026-05-17 14:19:37 +03:00
Danila Poyarkov
cc90c63952
feat(vue): add flip commands to canvas menu
2026-05-17 14:15:20 +03:00
Danila Poyarkov
29d7ae4817
refactor(vue): centralize canvas menu groups
2026-05-17 14:09:52 +03:00
Danila Poyarkov
5634e0ecb4
refactor(vue): centralize editor command metadata
2026-05-17 13:56:56 +03:00
Danila Poyarkov
2ef07b7049
refactor(text): use explicit font weight aliases
2026-05-17 13:44:58 +03:00
Danila Poyarkov
0f58b3eb37
chore(text): align font face module naming
2026-05-17 13:42:51 +03:00
Danila Poyarkov
3534a4a919
fix(canvas): render exact font faces
2026-05-17 13:40:56 +03:00
Danila Poyarkov
f9034d4492
perf(kiwi): avoid shifting import propagation queues
2026-05-17 13:19:07 +03:00
Danila Poyarkov
bb6c537b8e
Merge master into image fill hash fix
2026-05-17 13:02:00 +03:00
Danila Poyarkov
c044d26431
perf(canvas): cache label hit tests and trace scene renderer
2026-05-17 03:27:19 +03:00
Danila Poyarkov
faaa741911
feat(profiler): expose scene picture and flush timings
2026-05-17 03:09:16 +03:00
Danila Poyarkov
1326aac68d
Revert "perf(canvas): preview mouse panning with CSS transforms"
...
This reverts commit 30191ad11b .
2026-05-17 03:03:51 +03:00
Danila Poyarkov
30191ad11b
perf(canvas): preview mouse panning with CSS transforms
2026-05-17 02:57:35 +03:00
Danila Poyarkov
05b3a870c2
perf(canvas): avoid duplicate scene picture draw on record
2026-05-17 02:50:01 +03:00
Danila Poyarkov
957d822af1
perf(canvas): restore scene cache after position previews
2026-05-17 02:38:23 +03:00
Danila Poyarkov
7f784ef1ec
perf(canvas): fast-path solid render colors
2026-05-17 02:34:41 +03:00
Danila Poyarkov
617f3864ac
perf(canvas): keep scene picture cache warm after edits
2026-05-17 02:27:58 +03:00
Danila Poyarkov
0b3b620b54
perf(canvas): cache vector stroke paths
2026-05-17 02:21:53 +03:00
Danila Poyarkov
6e413ccfa1
fix(canvas): repaint scene during live transforms
2026-05-17 01:59:17 +03:00
Danila Poyarkov
446ab8bc59
fix(canvas): align live text baseline with exports
2026-05-17 01:48:58 +03:00
Danila Poyarkov
6954ff3ce7
refactor(jsx): replace hand-rolled Tailwind mapping with twirlwind
...
- Use twirlwind for CSS-to-Tailwind class conversion instead of
450 lines of manual lookup tables and formatting functions
- Build a CSS style object from scene node properties, pass to twirl()
- Remove design-jsx/tailwind.ts (pxToSpacing, colorToTwClass, etc.)
- Remove unused Tailwind-specific helpers from jsx/helpers.ts
- Update tests for twirlwind's v4-native output format
2026-05-17 00:54:53 +03:00
Danila Poyarkov
6f4e8274d6
fix(canvas): use screen-space handles for multi-selection bounds
...
Single-node selection draws handles inside withNodeBounds() which
applies canvas.scale(zoom), so handle size / zoom is correct there.
Multi-selection drawGroupBounds() computes screen-space coordinates
directly (x * zoom + pan) without a canvas zoom transform, so handles
need fixed screen-space sizes. Added drawHandleScreenSpace() and
drawBoundsHandlesScreenSpace() for the multi-select path.
2026-05-17 00:21:34 +03:00
Danila Poyarkov
8d21d05f25
fix(clipboard): convert quadratic beziers to cubic instead of flattening to lines
2026-05-16 18:43:24 +03:00
Danila Poyarkov
ea323c33f0
fix(clipboard): match shaped glyphs by character index, not array position
2026-05-16 18:38:58 +03:00
Danila Poyarkov
578b93e189
fix(clipboard): use CanvasKit shaping + pretext word wrap for Figma text
...
- shapeTextForClipboard() now processes all lines, not just the first
- buildFigmaClipboardHTML() passes CanvasKit-shaped positions to
derivedTextData when available (browser with CanvasKit loaded)
- Add @chenglou/pretext for proper Unicode-aware word wrapping as
fallback when CanvasKit isn't available (CLI, headless, .fig export)
- Falls back to basic word-boundary wrapping if pretext fails
2026-05-16 18:26:24 +03:00
Danila Poyarkov
7cfa08aec5
fix(clipboard): normalize glyph advance by fontSize
...
Figma expects derivedTextData glyph advance values normalized to
font-size units (advance / fontSize), not absolute pixel values.
This caused pasted text to appear horizontally mirrored because
Figma multiplied the already-absolute advances by fontSize again.
2026-05-16 18:02:10 +03:00
Danila Poyarkov
e94323ee29
refactor: remove duplicated implementation blocks
2026-05-16 14:45:32 +03:00
Danila Poyarkov
21b649e540
test(engine): organize clipboard and vector coverage
2026-05-16 13:18:38 +03:00
Danila Poyarkov
2fc90769b1
fix(kiwi): export variant prop defs as text
2026-05-16 13:09:48 +03:00
Danila Poyarkov
a710841392
test(engine): align io tests with source tree
2026-05-16 11:59:02 +03:00
Danila Poyarkov
9616094766
refactor(text): group derived text helpers
2026-05-16 11:56:35 +03:00
Danila Poyarkov
358ac9ebf7
fix(clipboard): orient text glyph outlines
2026-05-16 11:52:22 +03:00
Danila Poyarkov
91f516ecaa
fix(clipboard): include text glyph blobs
2026-05-16 11:46:14 +03:00
Danila Poyarkov
992be9b713
fix(clipboard): include glyph advances
2026-05-16 11:05:15 +03:00
Danila Poyarkov
e47455d91b
fix(clipboard): export Figma font style names
2026-05-16 10:52:51 +03:00
Danila Poyarkov
698bcde00b
refactor(vue): share generated test id helpers
2026-05-15 13:10:44 +03:00
Danila Poyarkov
744f0a0f42
refactor(vue): use test id directive
2026-05-15 12:37:00 +03:00
Danila Poyarkov
711c7cf5a9
refactor(vue): use shared test id prop types
2026-05-15 12:18:50 +03:00
Danila Poyarkov
0749bfa755
chore(vue): standardize test id helpers
2026-05-15 12:07:58 +03:00
Danila Poyarkov
b46295a7bb
fix(editor): close padding editor on canvas click
2026-05-15 11:49:18 +03:00
Danila Poyarkov
9537f35a27
perf(vue): remove wheel gesture dependency
2026-05-15 11:39:47 +03:00
Danila Poyarkov
eb393db250
perf(vue): simplify canvas wheel handling
2026-05-15 11:35:01 +03:00
Danila Poyarkov
20342d68a2
perf(vue): coalesce canvas surface frames
2026-05-15 11:21:33 +03:00
Danila Poyarkov
743f2b5a16
perf(vue): avoid scene renders for overlay events
2026-05-15 01:51:05 +03:00
Danila Poyarkov
22741a3dc4
perf(canvas): gate draw call instrumentation
2026-05-15 01:41:34 +03:00
Danila Poyarkov
a091ac7284
perf(canvas): cache paragraph font families
2026-05-14 23:32:26 +03:00
Danila Poyarkov
a39db053c0
perf(vue): render canvas on editor events
2026-05-14 23:05:29 +03:00
Danila Poyarkov
031897c73a
test(editor): cover auto-layout padding editor
2026-05-14 22:37:16 +03:00
Danila Poyarkov
c3fd32a516
feat(editor): add auto-layout hover controls
2026-05-14 18:15:53 +03:00
Guilherme Maurer
cefa4331e3
fix: image fills lost after save . hex hash corrupted in Kiwi byte[] encoding
2026-05-13 09:06:51 -03:00
Danila Poyarkov
c00356bc29
fix(demo): make auto-layout text responsive
2026-05-13 06:23:08 +03:00
Danila Poyarkov
9ab6bfa3bf
fix(app): restore left panel scrolling
2026-05-13 05:47:32 +03:00
Danila Poyarkov
8cf51ffefd
perf(editor): use repaint previews while resizing
2026-05-13 05:38:14 +03:00
Danila Poyarkov
1242fa7086
fix(editor): keep drag previews in sync
2026-05-13 05:34:04 +03:00
Danila Poyarkov
4e64644385
perf(editor): use repaint previews while dragging
2026-05-13 05:23:06 +03:00
Danila Poyarkov
3708b4fd1b
perf(editor): avoid layout during drag moves
2026-05-13 05:15:15 +03:00
Danila Poyarkov
49620ef26b
fix(vue): distinguish layer child drops
2026-05-13 05:10:29 +03:00
Danila Poyarkov
1f273f880e
fix(editor): guard drill selection text editing
2026-05-13 05:07:27 +03:00
Danila Poyarkov
aa9f03407a
Revert "fix(editor): delay text editing after drill selection"
...
This reverts commit b23bb9d3e7 .
2026-05-13 04:59:24 +03:00
Danila Poyarkov
b23bb9d3e7
fix(editor): delay text editing after drill selection
2026-05-13 04:58:42 +03:00
Danila Poyarkov
fb01bcb433
fix(editor): hide noop auto-layout drag indicators
2026-05-13 04:52:40 +03:00
Danila Poyarkov
419c77d8de
fix(canvas): wait for exact font styles
2026-05-13 04:47:32 +03:00
Danila Poyarkov
08b9e56a15
fix(editor): restore auto-layout instance dragging
2026-05-13 04:47:28 +03:00
Danila Poyarkov
c38778094d
fix(vue): restore layer tree reordering
2026-05-13 04:47:23 +03:00
Danila Poyarkov
5fd0e60a99
fix(editor): hit test entered containers in world space
2026-05-13 04:11:19 +03:00
Danila Poyarkov
2f39ecaa4d
fix(canvas): cull nested nodes in world space
2026-05-13 03:56:04 +03:00
Danila Poyarkov
66f562b52f
fix(fonts): bundle Inter bold
2026-05-13 03:50:35 +03:00
Danila Poyarkov
ccc2b0a52c
chore(release): polish asset labels and loaders
2026-05-13 03:44:11 +03:00
Danila Poyarkov
f25e5cfe0a
fix(scene-graph): avoid id collisions after import
2026-05-13 03:36:28 +03:00
Danila Poyarkov
bfd364909e
docs: move development notes into docs package
...
- Move variables roadmap into the VitePress development docs
- Replace the stale renderer profiler plan with current usage notes
- Refresh eval scripting docs with the supported API surface
2026-05-13 02:48:09 +03:00