Commit graph

666 commits

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