openpencil/packages/core/src/figma-api
Danila Poyarkov e532f616ba
refactor!: move shared primitives below dom-css and core (#771)
* refactor!: move shared primitives below dom-css and core

dom-css depended on core for color conversion, base64 helpers, text
direction, and web-font assets, so core could not use dom-css and every
caller special-cased HTML and Tailwind output.

Color conversion and management, base64 helpers, and text/layout
direction now live in scene-graph under `color`, `bytes`, and
`text-direction`. dom-css takes web-font resolution as an injected
`fonts` option and owns the font face types, so it depends only on
scene-graph and core can depend on it.

BREAKING CHANGE: `@open-pencil/core/color` and `@open-pencil/core/bytes`
are removed, and the direction helpers are no longer exported from
`@open-pencil/core/text`; import them from `@open-pencil/scene-graph`
subpaths. `exportHTMLBundle` takes a font resolver in `fonts` instead of
`'assets'`.

* fix(tools): import color parsing from scene-graph in visual bisect

* fix(mcp): declare the scene-graph dependency

MCP imports `@open-pencil/scene-graph/bytes` since base64 helpers moved
there, but only reached scene-graph through core, so isolated installs
and package checks depended on transitive resolution.

* refactor!: use js-base64 directly instead of a base64 wrapper

Base64 helpers had moved into scene-graph only to sit below dom-css,
but they are a thin wrapper over js-base64 and unrelated to the graph;
fig already called js-base64 directly.

Callers use js-base64 and check `isValid` where input comes from outside
(clipboard, imported HTML, tool arguments, the plugin API). A new
`open-pencil/no-hand-rolled-base64` lint rule rejects atob, btoa, and
Buffer Base64 conversions, and AGENTS.md records the convention.

BREAKING CHANGE: `@open-pencil/core/bytes` is removed; use `js-base64`.

* fix(dom-css): keep images with invalid Base64 inline in HTML export

`exportHTMLBundle` accepts documents parsed from outside HTML, and
js-base64 drops characters it cannot decode, so extracting an invalid
image data URL wrote different bytes. Such images now stay inline.
2026-09-26 11:39:11 +04:00
..
accessors refactor!: move shared primitives below dom-css and core (#771) 2026-09-26 11:39:11 +04:00
accessor-utils.ts fix(fig): record applied instance override fields 2026-09-01 01:04:22 +03:00
compatibility.ts test(figma-api): modernize type assertions 2026-08-31 14:54:03 +03:00
components.ts refactor: replace complex conditional object spreads 2026-09-01 19:49:57 +03:00
fonts.ts fix(deps): patch collaboration websocket driver 2026-07-18 02:49:22 +03:00
index.ts refactor!: move shared primitives below dom-css and core (#771) 2026-09-26 11:39:11 +04:00
node-types.ts fix(figma-api): align variant combination behavior 2026-08-19 20:05:54 +03:00
page-backgrounds.ts fix(figma-api): implement layout compatibility gaps 2026-08-12 18:50:25 +03:00
plugin-data.ts feat: split SceneGraph and Pen packages 2026-06-30 10:54:32 +03:00
proxy.ts refactor!: move shared primitives below dom-css and core (#771) 2026-09-26 11:39:11 +04:00
render-bounds.ts feat(canvas): render arrow stroke caps on lines and open vectors 2026-08-31 21:25:38 +03:00
rescale.ts fix(vector): preserve open segments with regions (#496) 2026-08-12 19:28:37 +03:00
serialization.ts feat: split SceneGraph and Pen packages 2026-06-30 10:54:32 +03:00
strokes.ts fix(fig): preserve text and stroke overrides 2026-09-01 04:57:43 +03:00
text.ts fix(fig): preserve text and stroke overrides 2026-09-01 04:57:43 +03:00
traversal.ts feat: split SceneGraph and Pen packages 2026-06-30 10:54:32 +03:00
types.ts fix(layout): refresh effective text flow 2026-08-05 16:07:11 +03:00