Commit graph

639 commits

Author SHA1 Message Date
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