openpencil/packages/scene-graph/package.json
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

213 lines
6 KiB
JSON

{
"name": "@open-pencil/scene-graph",
"version": "0.15.1",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/open-pencil/open-pencil.git",
"directory": "packages/scene-graph"
},
"files": [
"dist",
"src",
"README.md"
],
"type": "module",
"sideEffects": false,
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"bun": "./src/index.ts",
"import": "./dist/index.js",
"default": "./dist/index.js"
},
"./arrow-caps": {
"types": "./dist/arrow-caps.d.ts",
"bun": "./src/arrow-caps.ts",
"import": "./dist/arrow-caps.js",
"default": "./dist/arrow-caps.js"
},
"./copy": {
"types": "./dist/copy.d.ts",
"bun": "./src/copy.ts",
"import": "./dist/copy.js",
"default": "./dist/copy.js"
},
"./node-defaults": {
"types": "./dist/node-defaults.d.ts",
"bun": "./src/node-defaults.ts",
"import": "./dist/node-defaults.js",
"default": "./dist/node-defaults.js"
},
"./instances": {
"types": "./dist/instances.d.ts",
"bun": "./src/instances.ts",
"import": "./dist/instances.js",
"default": "./dist/instances.js"
},
"./snap": {
"types": "./dist/snap.d.ts",
"bun": "./src/snap.ts",
"import": "./dist/snap.js",
"default": "./dist/snap.js"
},
"./source-metadata": {
"types": "./dist/source-metadata.d.ts",
"bun": "./src/source-metadata.ts",
"import": "./dist/source-metadata.js",
"default": "./dist/source-metadata.js"
},
"./undo": {
"types": "./dist/undo.d.ts",
"bun": "./src/undo.ts",
"import": "./dist/undo.js",
"default": "./dist/undo.js"
},
"./variant-name": {
"types": "./dist/variant-name.d.ts",
"bun": "./src/variant-name.ts",
"import": "./dist/variant-name.js",
"default": "./dist/variant-name.js"
},
"./variant-properties": {
"types": "./dist/variant-properties.d.ts",
"bun": "./src/variant-properties.ts",
"import": "./dist/variant-properties.js",
"default": "./dist/variant-properties.js"
},
"./vector-network": {
"types": "./dist/vector-network.d.ts",
"bun": "./src/vector-network.ts",
"import": "./dist/vector-network.js",
"default": "./dist/vector-network.js"
},
"./guides": {
"types": "./dist/guides.d.ts",
"bun": "./src/guides.ts",
"import": "./dist/guides.js",
"default": "./dist/guides.js"
},
"./layout-guides": {
"types": "./dist/layout-guides.d.ts",
"bun": "./src/layout-guides.ts",
"import": "./dist/layout-guides.js",
"default": "./dist/layout-guides.js"
},
"./types": {
"types": "./dist/types.d.ts",
"bun": "./src/types.ts",
"import": "./dist/types.js",
"default": "./dist/types.js"
},
"./primitives": {
"types": "./dist/primitives.d.ts",
"bun": "./src/primitives.ts",
"import": "./dist/primitives.js",
"default": "./dist/primitives.js"
},
"./constants": {
"types": "./dist/constants.d.ts",
"bun": "./src/constants.ts",
"import": "./dist/constants.js",
"default": "./dist/constants.js"
},
"./hit-test": {
"types": "./dist/hit-test.d.ts",
"bun": "./src/hit-test.ts",
"import": "./dist/hit-test.js",
"default": "./dist/hit-test.js"
},
"./preview": {
"types": "./dist/preview.d.ts",
"bun": "./src/preview.ts",
"import": "./dist/preview.js",
"default": "./dist/preview.js"
},
"./text-picture": {
"types": "./dist/text-picture.d.ts",
"bun": "./src/text-picture.ts",
"import": "./dist/text-picture.js",
"default": "./dist/text-picture.js"
},
"./variables": {
"types": "./dist/variables.d.ts",
"bun": "./src/variables.ts",
"import": "./dist/variables.js",
"default": "./dist/variables.js"
},
"./images": {
"types": "./dist/images.d.ts",
"bun": "./src/images.ts",
"import": "./dist/images.js",
"default": "./dist/images.js"
},
"./coordinate": {
"types": "./dist/coordinate.d.ts",
"bun": "./src/coordinate.ts",
"import": "./dist/coordinate.js",
"default": "./dist/coordinate.js"
},
"./matrix": {
"types": "./dist/matrix.d.ts",
"bun": "./src/matrix.ts",
"import": "./dist/matrix.js",
"default": "./dist/matrix.js"
},
"./geometry": {
"types": "./dist/geometry.d.ts",
"bun": "./src/geometry.ts",
"import": "./dist/geometry.js",
"default": "./dist/geometry.js"
},
"./resize": {
"types": "./dist/resize.d.ts",
"bun": "./src/resize.ts",
"import": "./dist/resize.js",
"default": "./dist/resize.js"
},
"./parse-path": {
"types": "./dist/parse-path.d.ts",
"bun": "./src/parse-path.ts",
"import": "./dist/parse-path.js",
"default": "./dist/parse-path.js"
},
"./color": {
"types": "./dist/color.d.ts",
"bun": "./src/color/index.ts",
"import": "./dist/color.js",
"default": "./dist/color.js"
},
"./text-direction": {
"types": "./dist/text-direction.d.ts",
"bun": "./src/text-direction.ts",
"import": "./dist/text-direction.js",
"default": "./dist/text-direction.js"
}
},
"publishConfig": {
"access": "public",
"provenance": true
},
"scripts": {
"build": "bunx tsdown --config tsdown.config.ts",
"check": "bun run typecheck && bun run build && bun run smoke:dist",
"prepack": "bun run build",
"smoke:dist": "bun scripts/smoke-dist.ts",
"typecheck": "bunx tsc --noEmit -p tsconfig.json"
},
"dependencies": {
"culori": "^4.0.2",
"es-toolkit": "^1.51.0",
"nanoevents": "^9.1.0",
"svgpath": "^2.6.0"
},
"devDependencies": {
"@types/bun": "^1.3.14",
"@types/culori": "^4.0.1",
"tsdown": "^0.22.14",
"typescript": "~5.8.3"
}
}