Commit graph

2276 commits

Author SHA1 Message Date
Danila Poyarkov fece63b5b5
Merge pull request #498 from open-pencil/issue-102-multifixture-audit
fix(fig): preserve nested text overrides
2026-08-12 20:58:22 +03:00
Danila Poyarkov a8cf8eb412
fix(tauri): prevent Windows font loading crashes (#497)
* fix(tauri): prevent Windows font loading crashes

- Return native font files over binary Tauri IPC instead of JSON byte arrays

- Resolve desktop script fallbacks without parsing large system fonts in JavaScript

* fix(core): restore quality checks

- Use the shared Vector primitive for render-bound offsets

- Remove unsupported SLICE handling from SceneGraph rescaling

- Drop an unused generated-text test binding

* chore: address font fix review

- Place the release note under the Fixed heading

- Name fallback resolution options and use the shared Tauri constant
2026-08-12 20:09:04 +03:00
Danila Poyarkov cf72b8d1c4 fix(clipboard): preserve pasted instance links
- Share exported GUID assignments across clipboard roots

- Preserve source metadata while applying pasted instance overrides
2026-08-12 20:08:06 +03:00
Danila Poyarkov 38e98095b2 chore(fig): format instance override test 2026-08-12 19:44:32 +03:00
Danila Poyarkov 7d0f9746ee fix(fig): preserve nested text overrides
- Propagate effective text through structurally protected clone chains

- Preserve explicit text overrides and add focused regression coverage
2026-08-12 19:36:37 +03:00
Danila Poyarkov 3102a60f91
fix(vector): preserve open segments with regions (#496)
- Render segments not referenced by any region loop alongside filled paths\n- Add focused path construction coverage and a canvas visual snapshot\n- Resolve Plugin API type-aware lint findings exposed by the full quality gate
2026-08-12 19:28:37 +03:00
Danila Poyarkov 71bb3b20a6 fix(figma-api): implement layout compatibility gaps
- Match Figma rescale behavior across geometry, typography, effects, and descendants\n- Expose page backgrounds through preserved FIG metadata\n- Return nullable visual render bounds with stroke, effect, and clipping support\n- Cover the Plugin API behavior against live Figma probes
2026-08-12 18:50:25 +03:00
Danila Poyarkov 3c016e9573
fix(mcp): close orphaned servers after app disconnects (#494)
* fix(mcp): close orphaned servers that no app ever claims

- Add ServerOptions.appAttachTimeoutMs: if no app registers within this
  window after startup, the server closes itself and removes its
  discovery file, instead of squatting the port indefinitely.
- Wire it through the openpencil-mcp-http CLI as
  OPENPENCIL_MCP_APP_TIMEOUT_MS (opt-in, unset/0 disables it — a bare
  CLI invocation for manual testing should not self-terminate).
- The desktop app opts in with a 30s timeout when it spawns the server.

Without this, a server that outlives its spawning app (renderer crash,
forced reload) keeps holding its port with a stale discovery file. The
app's liveness check only asks whether something answers /health, not
whether an app has ever registered (see /health's no_app status) — so
every later launch finds the orphan already listening and defers to
it, and MCP tool calls fail with "app is not connected" until someone
manually kills the orphaned process. Closing self-caused orphans at
the source means the next launch finds no discovery file and takes
the normal fresh-spawn path.

Fixes #488

* fix(mcp): clean up servers after app disconnects

- Re-arm the orphan watchdog when the registered app disconnects

- Cancel pending shutdown when the app reconnects within the grace period

- Reject timeout values that overflow the runtime timer range

* test(mcp): make watchdog reconnect coverage deterministic

- Wait for the disconnected health state before reconnecting

- Report distinct safe-integer and timer-range validation errors

---------

Co-authored-by: swe-sanad <sanad.arousi@export119.com>
2026-08-12 18:44:31 +03:00
Danila Poyarkov d4fedcb6ed
fix(storage): polish workspace and connection feedback (#492)
* fix(storage): polish workspace and connection feedback

- Move Refresh into the Storage Workspace header and keep shell theme actions available outside the editor route
- Split native shell and editor menu listeners behind the app shell
- Replace permanent CORS controls and inline connection results with standard toasts and clearer browser guidance

* fix(app): harden native menu routing

- Dispose menu listeners that finish registering after their Vue scope closes
- Mark shell-owned actions in the shared menu schema instead of duplicating IDs
- Cover route-neutral shell action classification
2026-08-12 16:06:10 +03:00
Danila Poyarkov 0ed6697946
docs: refresh product roadmap after v0.14.0 (#493)
* docs: refresh product roadmap after v0.14.0

- Record delivered editor, storage, automation, and reusable package foundations
- Add Cloud, self-hosting, BYOK, reliability, international text, and design verification priorities
- Incorporate durable feature-request themes for IDE integration, multimodal agents, import and code workflows, fonts, motion, tables, and inspection
- Track Figma Slides as a lower-priority interoperability exploration and correct stale compatibility entries

* docs: keep roadmap commitments outcome-focused

- Describe Cloud and self-hosting through supported user capabilities rather than implementation choices
- Keep BYOK and workspace portability as explicit product promises
- Track Figma Slides without coupling the published roadmap to an active PR
2026-08-12 16:05:17 +03:00
Danila Poyarkov 6f73b28f3d
fix(core): preserve inline SVG primitives (#485)
* fix(core): preserve inline SVG primitives

- Convert parsed circle, ellipse, rect, line, polyline, and polygon children through the shared SVG path pipeline
- Preserve nested presentation attributes, transforms, and JSX-style SVG attribute names
- Cover mixed and primitive-only inline SVG renders

* chore: format merged mobile navigation

* fix(core): disambiguate xmldom document types

- Alias the xmldom Document type so clean CI does not resolve it as the browser DOM type
- Guard the generated SVG document root before collecting paths

* fix(core): preserve inline SVG root styles

- Carry root presentation properties into parsed SVG child conversion
- Apply nested SVG transforms before creating vector networks
- Cover inherited root fills and transformed primitive geometry

* fix(core): scale transformed SVG strokes
2026-08-12 16:02:45 +03:00
Danila Poyarkov 78e2c7f4c3
Merge pull request #483 from open-pencil/fix-issue-385-instance-index
fix(fig): preserve imported instance links
2026-08-12 15:46:31 +03:00
Danila Poyarkov 8bba716db0 Merge origin/master into fix-issue-385-instance-index 2026-08-12 14:57:42 +03:00
Danila Poyarkov 1cde4a5b5d
Merge pull request #490 from open-pencil/fix-macos-native-input-paste
fix(tauri): restore native text clipboard actions
2026-08-12 14:53:39 +03:00
Danila Poyarkov 74fdfa877a test(tauri): cover textarea clipboard routing 2026-08-12 13:12:51 +03:00
Danila Poyarkov 00f0d3902a fix(app): destructure font picker props 2026-08-12 12:39:38 +03:00
Danila Poyarkov 97bfedda1d chore: format mobile drawer navigation 2026-08-12 12:27:47 +03:00
Danila Poyarkov 0de5685074 fix(tauri): restore native text clipboard actions
- Use macOS predefined copy, cut, and paste menu items so WebKit routes accelerators to focused editing controls\n- Keep canvas clipboard events handled by OpenPencil and recognize composed contenteditable targets\n- Cover editable input and nested contenteditable event paths
2026-08-12 07:37:11 +03:00
Danila Poyarkov 51ab21571a fix(i18n): translate remaining app surfaces
- Localize import, collaboration, settings, color, font, and accessibility text across supported locales

- Synchronize the document language through reactive Unhead attributes

- Translate connection failures, browser fallbacks, notifications, and save prompts
2026-08-11 22:19:40 +03:00
Danila Poyarkov 05a36e9672 fix(fig): preserve imported instance links
- Remap component IDs through SceneGraph updates so the instance index stays consistent
- Cover imported instances resolving through the remapped source ID
- Restore source component synchronization for the reporter's .fig file
2026-08-11 18:54:29 +03:00
Danila Poyarkov 9ceb7a7bea
Merge pull request #482 from open-pencil/fix-v014-docs-twoslash
ci(docs): build packages before VitePress
2026-08-11 15:45:25 +03:00
Danila Poyarkov ecb1effcf1 ci(docs): build packages before VitePress
- Resolve workspace package exports during Twoslash and demo builds\n- Keep release and manual docs deploys reproducible from a clean checkout
2026-08-11 15:36:49 +03:00
Danila Poyarkov c29654cd07
Merge pull request #481 from open-pencil/release-v014-smoke
fix(app): keep desktop startup console clean
2026-08-11 14:56:55 +03:00
Danila Poyarkov 8f35746060 fix(app): keep desktop startup console clean
- Load Prism JSX only after exposing the Prism runtime

- Treat unavailable MCP automation as optional during startup

- Connect the desktop automation bridge only after MCP is ready
2026-08-11 13:56:04 +03:00
Danila Poyarkov b6bf9e9d6b
Merge pull request #480 from open-pencil/storage-workspace-previews
feat(storage): show workspace document previews
2026-08-10 23:09:59 +03:00
Danila Poyarkov a6842fde47 fix(vue): discard stale workspace results 2026-08-10 22:47:00 +03:00
Danila Poyarkov b21509cc8d fix(storage): isolate workspace refresh state
- Discard stale provider refreshes and queued previews

- Guard malformed deflate data and listener failures

- Start periodic refresh without an immediate callback
2026-08-10 22:30:54 +03:00
Danila Poyarkov c2bcb21fcf fix(vue): preserve workspace item types 2026-08-10 21:18:36 +03:00
Danila Poyarkov 6d9aeea28b refactor(vue): split workspace preview lifecycle 2026-08-10 20:42:56 +03:00
Danila Poyarkov 4fe27dd1e6 fix(storage): harden workspace previews
- Validate ranged thumbnail payloads and S3 bounds

- Invalidate stale previews and expose loading errors

- Document the public document workspace composable
2026-08-10 20:02:58 +03:00
Danila Poyarkov dde7376bd3 feat(storage): show workspace document previews
- Load embedded Figma thumbnails through bounded S3 byte-range requests

- Add a headless Vue workspace composable with lazy previews and refresh lifecycle

- Cache local previews and refresh the workspace after saves and synchronization
2026-08-10 17:21:36 +03:00
Danila Poyarkov d6ec858243
Merge pull request #479 from open-pencil/chore/acronym-casing
refactor: standardize acronym casing
2026-08-10 16:56:40 +03:00
Danila Poyarkov 55b368dc4a fix: complete acronym casing follow-ups
- Cover UI identifiers in the acronym guardrail
- Preserve FIG thumbnail and metadata values through archive parsing
- Use Vue-compatible acronym prop attributes
2026-08-10 16:38:17 +03:00
Danila Poyarkov 7f91594d0c refactor: standardize acronym casing
- Rename first-party API, RPC, JSON, CORS, SVG, JSX, and related identifiers to preserve acronym casing
- Keep upstream and serialized boundary names unchanged
- Add a lint guardrail and migration notes for exported APIs
2026-08-10 15:48:16 +03:00
Danila Poyarkov 4d6ddd3f84
Merge pull request #477 from victorwads/codex/fix-fig-component-instances
fix(fig): preserve component instance rendering
2026-08-10 13:41:38 +03:00
Danila Poyarkov c1ef116968 Merge remote-tracking branch 'origin/master' into review-pr-477-current 2026-08-10 13:40:22 +03:00
Danila Poyarkov 4986fb8b54 fix(ai): simplify model configuration
- Separate model, connection, and advanced settings

- Resolve capabilities and output limits from provider catalogs

- Keep custom model compatibility declarations explicit
2026-08-10 12:55:35 +03:00
Danila Poyarkov c493bd0872 fix(fig): preserve vector network origin when resizing
- Scale imported vector vertices around their own geometry origin\n- Cover offset geometry and tangent scaling
2026-08-10 12:52:43 +03:00
Danila Poyarkov c7c505ccc9
Merge pull request #478 from open-pencil/release/v0.14.0
Release v0.14.0
2026-08-10 11:53:00 +03:00
Danila Poyarkov 751195891f Release v0.14.0 2026-08-10 11:40:44 +03:00
Victor Wads 54abfca334
fix(fig): address instance rendering review 2026-08-10 05:09:03 -03:00
Victor Wads 0208d79375 test(fig): update roundtrip export size 2026-08-10 04:49:28 -03:00
Victor Wads bc79d16ac4
fix(fig): preserve instance text edits on save 2026-08-10 04:30:28 -03:00
Victor Wads e159893ec4
fix(fig): preserve component instance rendering 2026-08-10 04:30:06 -03:00
Danila Poyarkov f972efe229
Merge pull request #435 from open-pencil/fig-population-worker
feat(fig): prototype lazy population worker
2026-08-07 15:02:38 +03:00
Danila Poyarkov 02400a84b9 fix(fig): finalize worker cleanup semantics
- Retain worker graphs only for lazy first-page imports\n- Make termination idempotent\n- Wait on deterministic population telemetry in E2E coverage
2026-08-07 14:43:59 +03:00
Danila Poyarkov a5a744843f fix(fig): harden population worker lifecycle
- Register invalidation immediately and release subscriptions on every failure path\n- Bound worker requests and settle parse and population errors consistently\n- Clear stale page loading state and retain current instance override imports
2026-08-07 09:36:46 +03:00
Danila Poyarkov 854e1642d8 feat(fig): prototype lazy population worker
- Populate subsequent lazy pages in a development-only persistent worker
- Journal created, updated, and deleted graph state as field deltas
- Invalidate stale worker replicas after authoritative graph mutations
- Fall back to synchronous population when the worker is unavailable
2026-08-07 09:27:54 +03:00
Danila Poyarkov 4a5e7d5570
Merge pull request #470 from open-pencil/gold-preview-current-audit
fix(fig): preserve imported text and clone geometry
2026-08-07 09:27:26 +03:00
Danila Poyarkov 9829669f85 refactor(fig): name divider position result 2026-08-07 09:14:48 +03:00