Commit graph

730 commits

Author SHA1 Message Date
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 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 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 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 779e0e493f fix(mcp): improve agent-rendered JSX 2026-05-19 17:57:43 +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 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 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 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