Commit graph

137 commits

Author SHA1 Message Date
rcoenen be272dc4dc
feat(fig): support text on path 2026-08-17 12:00:01 +03:00
Danila Poyarkov 54c1373d3e
ci: derive GitHub Release metadata from changelog (#536)
- Extract the release body from the changelog section matching the pushed tag.\n- Keep the GitHub Release title identical to the tag.\n- Document signing, updater, publication, deployment, and Homebrew handoff.
2026-08-17 11:07:13 +03:00
Danila Poyarkov 780221b006
test(tauri): add native WebView interaction harness (#532) 2026-08-15 14:17:05 +03:00
Danila Poyarkov b0ebe91ed6
perf(collab): skip unchanged Yjs node fields (#529)
* perf(collab): skip unchanged Yjs node fields

- Compare encoded node fields before writing to Y.Map
- Cover unchanged sync, repeated drag-like updates, echo behavior, and concurrent convergence
- Reduce 100 unchanged syncs from 13,700 updates to zero

* test(collab): simulate queued Yjs convergence

- Use the official Yjs TestConnector for deterministic queued delivery
- Exercise offline concurrent edits, reconnect, random message flushing, and convergence
2026-08-15 11:40:27 +03:00
Danila Poyarkov 6193b6da7e
feat(code): add live JSX and HTML/CSS editing (#525)
* feat(code): isolate Design JSX execution

- Transform JSX with the existing Sucrase dependency and execute it in a disposable opaque-origin iframe worker

- Block ambient network capabilities and enforce source, timeout, output, depth, and element limits

- Validate that only bounded plain structured data returns to the application

* feat(code): add editable Design JSX

- Add a lazy CodeMirror editor with JSX syntax support, completion, diagnostics, and bounded scrolling

- Convert validated sandbox output into trusted Design JSX helpers before rendering

- Apply or insert JSX as one undoable graph transaction while preserving dirty drafts

* feat(code): localize JSX editor actions

- Add translated-message fallbacks for editing, applying, inserting, and draft state

- Document the editable JSX workflow in the unreleased changelog

* fix(code): satisfy typed sandbox validation

- Keep the sandbox document terminator literal and preserve optional selection handling under type-aware lint

* test(code): resolve sandbox probes through app aliases

* fix(code): bound sandbox results before cloning

- Enforce string, array, object, depth, element, and byte limits inside the disposable worker

- Retain host-side validation as a second structured-data boundary

* fix(code): keep JSX and HTML editing modes separate

- Switch generated Tailwind output back to OpenPencil JSX before editing

- Close the JSX editor when opening HTML/CSS import and avoid stacking both editors

* feat(code): support authored Design JSX programs

- Allow local constants, function components, arrays, conditionals, fragments, and multiple roots

- Preserve replacement positions for multiple selected roots and reject mixed-parent or locked selections

- Cover multi-root undo, redo, and all-or-nothing rollback

* feat(code): add explicit JSX view mode

- Let authors leave CodeMirror without applying a draft

- Keep the editable surface and HTML/CSS importer mutually exclusive

* feat(code): diagnose unknown JSX vocabulary

- Warn on OpenPencil elements and properties that are absent from the canonical schema

- Surface diagnostics inline through CodeMirror lint markers

* test(code): accept WebKit isolation diagnostics

- Cover the sandbox architecture against Playwright WebKit

- Accept engine-specific wording while preserving the same unavailable-window assertion

* refactor(code): consolidate Design JSX vocabulary

- Drive renderer warnings, completion, and diagnostics from one supported-property schema

- Recognize locally declared components and add focused schema and transform tests

- Replace CodeMirror basicSetup with an explicit feature set and remove the umbrella package

* fix(code): support Design JSX variable helpers

* refactor(code): unify JSX sandbox validation

* fix(code): account for complete sandbox output

* fix(code): preserve locked JSX descendants

* fix(code): preserve JSX sibling order

* fix(code): recompute JSX parent layouts

* feat(code): add live code previews

* test(code): centralize graph assertions

* fix(code): harden live preview sessions

* docs: describe live code editing

* fix(code): update editor accessibility labels

* fix(code): use theme-aware error colors

* fix(dev): stop Vite disconnect error loops

* fix(code): clarify live preview status

* fix(ui): avoid tooltip attribute warnings

* test(code): assert semantic preview status

* refactor(code): remove obsolete editor messages

* fix(code): harden preview concurrency and isolation

* fix(code): cancel stale reset previews
2026-08-15 09:48:42 +03:00
Danila Poyarkov 3572eeec5e docs: remove untranslated localized placeholders
- Route copied English MCP, CLI, technical reference, shortcut, and useNumberField pages to their canonical English sources
- Repair remaining mixed-language user-guide and SDK labels
- Detect cross-locale placeholder copies and substantial English content in localized Markdown during documentation integrity checks
2026-08-13 20:40:41 +03:00
Danila Poyarkov 3ef554ab2d docs: reorganize documentation and improve integrity
- Replace the ambiguous Guide section with explicit overview, reference, and development routes while preserving legacy URLs with redirects
- Route missing localized content to maintained canonical pages and emit SEO alternates only for real translations
- Add parser-backed documentation integrity checks and make the optimized local build the default while retaining a complete production build
2026-08-13 14:19:12 +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
tae.virus 679ee9f98f
feat(export): add editable PPTX export (#416)
- Export text and basic shapes as editable PowerPoint elements
- Rasterize unsupported geometry, effects, masks, and clipped content for fidelity
- Support app and CLI exports across multiple pages

Co-authored-by: TKman <102001532+greekr4@users.noreply.github.com>
2026-07-28 10:12:41 +03:00
Danila Poyarkov 1415640718 refactor(core): centralize Base64 encoding
- Add portable byte and Unicode Base64 helpers backed by js-base64

- Replace manual binary-string, Buffer, and unsupported typed-array conversions

- Cover binary, Unicode, URL-safe, malformed, and large inputs
2026-07-28 08:27:22 +03:00
Danila Poyarkov 858e6451de fix(storage): parse S3 responses as XML
- Replace regex-based list and error parsing with xmldom

- Decode entities through the parser and support namespaced pagination responses

- Treat malformed listing documents as empty pages
2026-07-27 19:04:50 +03:00
Danila Poyarkov 7d8d33e1e5 feat(vector): add bitmap vectorization engine
- Preprocess raster input within provider image limits while preserving alpha

- Convert transformed SVG paths and gradients into editable vector networks

- Normalize path geometry into tightly placed vector frames

- Cover real provider fixtures, coordinate mapping, transforms, and gradients

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-27 15:33:15 +03:00
Danila Poyarkov d315547f2b feat(app): register S3-compatible storage
- Adapt the contributed S3 client behind the neutral storage provider contract

- Resolve access credentials lazily for each storage operation

- Preserve namespace isolation, CORS setup, pagination, progress, and metadata fallbacks

Co-authored-by: Rob Coenen <753704+rcoenen@users.noreply.github.com>
2026-07-26 14:26:44 +03:00
Danila Poyarkov 95a920197e feat(app): add cross-platform credential storage
- Store desktop secrets in native OS credential services through a narrow Tauri bridge

- Provide session-only and encrypted remembered browser stores with explicit switching

- Migrate legacy plaintext keys only after verified writes and cover failure recovery
2026-07-26 14:07:26 +03:00
Danila Poyarkov 2b32a8c7d3 feat(mcp): add local transport discovery
- Prefer private Unix sockets with TCP fallback for local MCP clients

- Unify HTTP and WebSocket lifecycle, authentication, and cleanup

- Discover transport details from an owner-only runtime file
2026-07-25 21:29:03 +03:00
Danila Poyarkov 8b9be17a56 perf(fig): remove large fixture bottlenecks
- Index component property definitions and variable asset references once per export or override context\n- Skip converged instance fill and text propagation and use native binary hex encoding\n- Add a non-populating parse mode for raw fixture validation\n- Reduce the Material 3 round trip from minutes to about twenty seconds
2026-07-18 03:37:58 +03:00
Danila Poyarkov 6c9ef9d103 fix(deps): patch collaboration websocket driver
- Pin websocket-driver 0.7.5 across the Trystero Firebase dependency chain\n- Restore a clean critical dependency audit\n- Reuse the shared font family/style shape exposed by scene-graph
2026-07-18 02:49:22 +03:00
Danila Poyarkov a10911c772 refactor(fig): extract NodeChange policy helpers
- Move style references, plugin metadata, text values, and font feature conversion into @open-pencil/fig\n- Add a public node-change subpath with package-local and packed smoke coverage\n- Keep core conversion callers on compatibility exports during the staged migration
2026-07-18 01:32:13 +03:00
Danila Poyarkov f9e2588b84 refactor(fig): own full archive parsing
- Move ZIP canvas and image discovery from Kiwi into @open-pencil/fig\n- Keep Kiwi focused on raw fig-kiwi payload decoding\n- Rewire core and fixture consumers through the public Fig package API
2026-07-18 01:17:21 +03:00
Danila Poyarkov 35af00433f build(text): upgrade opentype.js to v2
- Adapt outline extraction to codepoint glyph lookup instead of incomplete OpenType shaping\n- Key parsed-font entries by source buffer identity so replaced faces cannot reuse stale parses
2026-07-17 13:23:51 +03:00
Danila Poyarkov 29e2172643 Merge branch 'library-opportunities' 2026-07-14 00:38:27 +03:00
Danila Poyarkov 5d9730ae04 feat(vue): finalize NumberField API and docs
- Remove ScrubInput aliases, app wrappers, test hooks, and translated legacy references

- Share a Tailwind NumberField demo between Storybook and VitePress

- Generate component API tables from Vue metadata and type-check examples with Twoslash

- Upgrade the docs stack to VitePress 2
2026-07-13 10:19:24 +03:00
Danila Poyarkov b1e629e95f refactor: adopt shared utility libraries
- Use VueUse for object URLs, timers, and clipboard state

- Replace custom collection and equality helpers with es-toolkit

- Use ofetch and safeDestr at remote API and JSON boundaries
2026-07-10 22:42:24 +03:00
Danila Poyarkov f525c0f4fb feat(ui): add themed panel foundations
- Introduce Nuxt UI-style Tailwind Variants themes and 26px panel primitives\n- Align section and field action rails across labeled property rows\n- Add Storybook with dark/light states, accessibility tooling, and CI build coverage\n- Standardize UI acronym casing across app and Vue SDK types
2026-07-10 18:16:21 +03:00
Danila Poyarkov 7af2dba0ec feat(dom-css): serialize HTML styles as Tailwind 2026-07-04 13:01:59 +03:00
Danila Poyarkov 9498dc203d chore(tools): harden package and dependency checks 2026-07-01 12:56:45 +03:00
Danila Poyarkov b5665afab5 fix(tauri): restore desktop clipboard access 2026-07-01 10:40:29 +03:00
Danila Poyarkov 8cefbedd50 feat(app): add desktop HTTP bridge for online services 2026-06-30 16:52:26 +03:00
Danila Poyarkov 898431e646 feat: split SceneGraph and Pen packages 2026-06-30 10:54:32 +03:00
Danila Poyarkov 1eb227ed02 feat(dom-css): harden package boundaries 2026-06-30 10:51:37 +03:00
Danila Poyarkov 69ad74fd15 feat(fig): scaffold package shell 2026-06-30 10:51:36 +03:00
Danila Poyarkov d068237ee4 refactor(kiwi): move FIG parse helpers 2026-06-30 10:49:29 +03:00
Danila Poyarkov eda61d815d refactor(kiwi): move FIG codec package 2026-06-30 10:49:14 +03:00
Danila Poyarkov 6877516f06 refactor(kiwi): consume standalone Kiwi package 2026-06-30 10:49:14 +03:00
Danila Poyarkov f5bd2425b6 feat(kiwi): scaffold standalone Kiwi package 2026-06-30 10:48:47 +03:00
Danila Poyarkov ef067ab7b1 test(dom-css): add standalone DOM/CSS package checks 2026-06-30 10:48:07 +03:00
Danila Poyarkov 2c880186b0 feat(dom-css): add Tailwind compiler adapter 2026-06-30 10:47:25 +03:00
Danila Poyarkov 107b52d473 feat(dom-css): compute headless CSS styles 2026-06-30 10:47:19 +03:00
Danila Poyarkov 47c1f9fb38 feat(dom-css): parse HTML headlessly 2026-06-30 10:47:04 +03:00
Danila Poyarkov 4d61c002fa feat(dom-css): add DOM/CSS package skeleton 2026-06-30 10:46:25 +03:00
Danila Poyarkov 2dc51375ad Release v0.13.2 2026-05-30 19:14:12 +03:00
Danila Poyarkov b750d1f3dc docs: generate llms files
- Generate llms.txt and llms-full.txt from VitePress content loader

- Advertise the agent-readable docs through alternate links
2026-05-22 16:03:04 +03:00
Danila Poyarkov 3850be9512 build: publish node-compatible packages 2026-05-21 17:03:19 +03:00
Danila Poyarkov f4454aeb44 fix(mcp): report version mismatches 2026-05-19 11:12:01 +03:00
Danila Poyarkov 955aa4d1e9 refactor(core): use es-toolkit utilities 2026-05-18 19:21:14 +03:00
Danila Poyarkov f9a75b70a3 test(figma-api): type-check plugin compatibility subset 2026-05-17 16:24:47 +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 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 9537f35a27 perf(vue): remove wheel gesture dependency 2026-05-15 11:39:47 +03:00
Danila Poyarkov 00110c6c65 chore: add architecture linting 2026-05-14 18:23:25 +03:00