Commit graph

602 commits

Author SHA1 Message Date
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
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
Danila Poyarkov 866cabd623 feat(kiwi): preserve component library metadata
- Import Figma component keys, library keys, publish/version IDs, descriptions, links, and variant specs
- Export verified component metadata back into NodeChange fields
- Use variantPropSpecs to derive component property values after component set imports
- Cover large fixture metadata import as heavy tests
2026-05-12 21:48:42 +03:00
Danila Poyarkov 4bf161b983 fix(components): sync instances when switching variants
- Swap instance contents when changing variants instead of only updating componentId
- Recreate instance redo state without stale child IDs
- Insert assets into entered containers using local coordinates
- Fall back to Windows paths when URL parsing fails
2026-05-12 18:43:11 +03:00
Danila Poyarkov 24d3ea748f fix(components): respect default variants in assets
- Insert component set assets using explicit default variant values
- Report duplicate variant value combinations in the assets panel
- Cover default insertion and conflict warnings in Playwright
2026-05-12 18:16:51 +03:00
Danila Poyarkov 1ceabf7938 feat(components): add local assets panel
- Add a left-sidebar Assets tab for local components and component sets
- Insert component set assets as instances of the default variant
- Showcase local component set insertion in the demo
- Cover search, empty state, standalone insert, and variant switching with Playwright
2026-05-12 17:30:35 +03:00
Danila Poyarkov 23039e0b99 fix(canvas): wait for CJK fallback fonts
- Skip CJK and Arabic text until fallback font families are ready
- Re-render after async fallback font loading completes
- Add Playwright coverage for delayed CJK fallback loading
2026-05-12 16:54:55 +03:00
Tem-man 3fb2cfc7b1
update id and name of deepseek as deepseek-v4-flash and deepseek-v4-pro (#253)
Update DeepSeek model IDs to the new V4 Flash/Pro names, set V4 Flash as the default, and bump @ai-sdk/deepseek.
2026-05-12 15:23:53 +03:00
Danila Poyarkov 5787e45117 refactor(tools): move eval modules into domain folder 2026-05-11 12:19:46 +03:00
Danila Poyarkov a1339e845b refactor(tools): use acorn AST parser for eval wrapping
Replace hand-rolled regex heuristic with proper acorn JS parsing.
The AST correctly identifies ExpressionStatement as the last node
regardless of trailing semicolons, comments, or complex syntax.

Fixes edge cases like '42;' which the regex wrongly treated as a
statement.

Co-authored-by: stiff <v.stiff@gmail.com>
Co-authored-by: Jais Pedersen <jais@pedersens.net>
2026-05-11 12:15:38 +03:00
Danila Poyarkov 9e013e60e7 fix(mcp): fix stdio handshake and eval return values
Stdio handshake:
Server now sends { type: register, token } to WebSocket clients on
connection, so the stdio bridge receives the token immediately instead
of deadlocking while both sides wait to receive.

Eval return values (REPL-style):
Add wrapEvalCode() that detects when the last non-empty line is a value
expression and promotes it to a return statement. Bare expressions like
JSON.stringify(result) now return the value instead of undefined.
Single implementation in packages/core/src/tools/analyze/eval-wrap.ts
used by both the tool and the automation bridge.

Co-authored-by: stiff <v.stiff@gmail.com>
Co-authored-by: Jais Pedersen <jais@pedersens.net>
2026-05-11 12:05:43 +03:00
Danila Poyarkov 74e550adb2 chore(i18n): sync all locale files and add CI check
- Add scripts/check-locales.ts to detect missing/extra locale keys
- Wire as 'check:i18n' in the check pipeline
- Add missing translations for de, es, fr, it, pl, ru, zh-CN:
  layout size limits, gap controls, variable modes, variants
2026-05-07 21:42:34 +03:00
Danila Poyarkov c79c9106fb feat(components): add variant inspector UI
Show variant property dropdowns in the design panel when an instance
of a component set is selected. Switching a dropdown value finds the
matching variant component and updates the instance's componentId.

- VariantSection.vue with property dropdowns using AppSelect
- Bridge variant actions to the editor return object
- i18n for en, ru, zh-CN

Ref #239
2026-05-07 19:48:59 +03:00
Danila Poyarkov fee44ebdb7 feat(components): add variant property data model and core actions
Data model:
- Add ComponentPropertyDefinition and ComponentPropertyType to SceneNode
- Add componentPropertyValues for per-variant property values
- Populate from .fig import via componentPropDefs kiwi field
- Parse variant name=value syntax from component names on import

Core actions (packages/core/src/editor/components/variants.ts):
- Add/remove/rename variant property definitions with undo
- Collect variant options from component set children
- Find variant by property values
- Switch instance variant by changing a property value
- Parse and build variant name strings

Combine as variants:
- Parse slash-naming (Button/Primary/Large) into variant properties
- Auto-detect property columns from consistent slash counts
- Populate componentPropertyValues on each variant component

Ref #239
2026-05-07 16:12:46 +03:00
Danila Poyarkov 72614fac4c fix(editor): paste into selected container
Paste now targets the selected frame/group/component/section instead of
always placing nodes on the page root, matching Figma's behavior:

- Single container selected: paste as child
- Non-container child selected: paste as sibling in its parent
- Entered container (double-click): paste inside it
- Nothing or multiple nodes selected: paste on the page

Also applies to image paste via placeImageFiles.

Fixes #79
2026-05-07 13:56:30 +03:00
Danila Poyarkov 4e702799fc refactor: reuse blurTarget in inline rename 2026-05-07 10:30:27 +03:00
Danila Poyarkov a6da185e54 refactor: eliminate HTMLInputElement template casts
- Add shared DOM event helpers to Vue SDK (inputValue, inputNumberValue,
  blurTarget, selectTarget) in packages/vue/src/shared/dom-events.ts
- Export from @open-pencil/vue for app consumption
- Replace all template `as HTMLInputElement` casts with helper calls:
  ColorPickerPanel fields, PickerSlider, GradientEditor, ColorInput,
  CollabPanel, AppMenu, ScrubInputRoot
- Fix useInlineRename to use instanceof guards instead of casts
- Fix document name rename to accept Event directly
2026-05-07 10:24:46 +03:00
Danila Poyarkov 0a268f0a65 feat(variables): add inspector bindings for typography properties
- Add lineHeight, letterSpacing, fontWeight, paragraphSpacing,
  paragraphIndent to NumberBindingPath
- Wire lineHeight and letterSpacing inputs in TypographySection
  to VariableScrubInput with variable binding support
2026-05-07 09:50:52 +03:00