@retikz/vanilla 0.3.0-alpha.2 → 0.3.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ import { HydrateOptions, HydrationHandle } from './types';
2
+ /**
3
+ * 把用户 handler 水合到容器内已挂的 `<svg>`(无框架 SVG 水合入口)
4
+ * @description SSR / `mountSvg` 先渲染出含 `data-retikz-id` 的图,本入口再把 handler 绑回图元——不重建 DOM、
5
+ * 不接管状态,只做「图元 id ↔ 用户函数」绑定。用 `@retikz/render/hydration` 的 `createHydrationController(root,
6
+ * handlers, locateSvg)` 在 `root` 上挂根级委托:事件经 `closest('[data-retikz-id]')` 反查图元 id,命中即触发
7
+ * 对应 handler;`pointerEnter` / `pointerLeave` 由控制器经 `pointermove` + 命中 id 状态机合成。返回 `{ dispose }` 解绑。
8
+ */
9
+ export declare const hydrate: (root: Element, options: HydrateOptions) => HydrationHandle;
10
+ //# sourceMappingURL=hydrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../../src/hydrate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,OAAO,EAAE,SAAS,cAAc,KAAG,eAGhE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { createHydrationController, locateSvg } from "@retikz/render/hydration";
2
+ //#region src/hydrate.ts
3
+ /**
4
+ * 把用户 handler 水合到容器内已挂的 `<svg>`(无框架 SVG 水合入口)
5
+ * @description SSR / `mountSvg` 先渲染出含 `data-retikz-id` 的图,本入口再把 handler 绑回图元——不重建 DOM、
6
+ * 不接管状态,只做「图元 id ↔ 用户函数」绑定。用 `@retikz/render/hydration` 的 `createHydrationController(root,
7
+ * handlers, locateSvg)` 在 `root` 上挂根级委托:事件经 `closest('[data-retikz-id]')` 反查图元 id,命中即触发
8
+ * 对应 handler;`pointerEnter` / `pointerLeave` 由控制器经 `pointermove` + 命中 id 状态机合成。返回 `{ dispose }` 解绑。
9
+ */
10
+ var hydrate = (root, options) => {
11
+ return { dispose: createHydrationController(root, options.handlers, locateSvg).dispose };
12
+ };
13
+ //#endregion
14
+ export { hydrate };
@@ -8,6 +8,8 @@
8
8
  */
9
9
  export { renderToSvgString } from './renderToSvgString';
10
10
  export { mountSvg } from './mountSvg';
11
+ export { hydrate } from './hydrate';
12
+ export { mountCanvas } from './mountCanvas';
11
13
  export { figure } from './builder/figure';
12
14
  export { node } from './builder/node';
13
15
  export { draw } from './builder/draw';
@@ -16,5 +18,5 @@ export { scope } from './builder/scope';
16
18
  export type { Figure } from './figure';
17
19
  export type { ScopeBuilder } from './builder/scope';
18
20
  export type { Child, NodeConfig, DrawConfig, CoordinateConfig, ScopeConfig, FigureConfig, Way, } from './builder/types';
19
- export type { RenderInput, CommonOptions, MountOptions, RenderToStringOptions, VanillaView } from './types';
21
+ export type { RenderInput, CommonOptions, MountOptions, RenderToStringOptions, VanillaView, CanvasView, MountCanvasOptions, HydrateOptions, HydrationHandle, ScenePoint, } from './types';
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EACV,KAAK,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,GAAG,GACJ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EACV,KAAK,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,GAAG,GACJ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,SAAS,CAAC"}
package/dist/es/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { renderToSvgString } from "./renderToSvgString.js";
2
2
  import { mountSvg } from "./mountSvg.js";
3
+ import { hydrate } from "./hydrate.js";
4
+ import { mountCanvas } from "./mountCanvas.js";
3
5
  import { coordinate } from "./builder/coordinate.js";
4
6
  import { draw } from "./builder/draw.js";
5
7
  import { node } from "./builder/node.js";
6
8
  import { scope } from "./builder/scope.js";
7
9
  import { figure } from "./builder/figure.js";
8
- export { coordinate, draw, figure, mountSvg, node, renderToSvgString, scope };
10
+ export { coordinate, draw, figure, hydrate, mountCanvas, mountSvg, node, renderToSvgString, scope };
@@ -0,0 +1,10 @@
1
+ import { CanvasView, MountCanvasOptions, RenderInput } from './types';
2
+ /**
3
+ * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
4
+ * @description 收 IR 时 `toScene` compile、收 Scene 直用、收 Figure 解 `figure.ir`。位图按「名义显示尺寸」
5
+ * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
6
+ * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
7
+ * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
8
+ */
9
+ export declare const mountCanvas: (container: Element, input: RenderInput, options?: MountCanvasOptions) => CanvasView;
10
+ //# sourceMappingURL=mountCanvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountCanvas.d.ts","sourceRoot":"","sources":["../../src/mountCanvas.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAkB,kBAAkB,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AASvG;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,OAAO,EAClB,OAAO,WAAW,EAClB,UAAS,kBAAuB,KAC/B,UAyFF,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { isFigure } from "./builder/isFigure.js";
2
+ import { toScene } from "./toScene.js";
3
+ import { createHydrationController } from "@retikz/render/hydration";
4
+ import { hitTest, renderToCanvas } from "@retikz/render/canvas";
5
+ //#region src/mountCanvas.ts
6
+ /** 设备像素比:取有限正数、否则回退 1(镜像 react CanvasHost) */
7
+ var resolveDevicePixelRatio = (override) => {
8
+ if (typeof override === "number" && Number.isFinite(override) && override > 0) return override;
9
+ const ratio = globalThis.devicePixelRatio;
10
+ return typeof ratio === "number" && Number.isFinite(ratio) && ratio > 0 ? ratio : 1;
11
+ };
12
+ /**
13
+ * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
14
+ * @description 收 IR 时 `toScene` compile、收 Scene 直用、收 Figure 解 `figure.ir`。位图按「名义显示尺寸」
15
+ * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
16
+ * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
17
+ * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
18
+ */
19
+ var mountCanvas = (container, input, options = {}) => {
20
+ if (typeof Element === "undefined" || !(container instanceof Element)) throw new Error("mountCanvas: container must be a DOM Element.");
21
+ const canvas = document.createElement("canvas");
22
+ const ratio = resolveDevicePixelRatio(options.devicePixelRatio);
23
+ let currentScene;
24
+ const renderInto = (next) => {
25
+ if (isFigure(next)) throw new Error("mountCanvas: view.update does not accept a Figure; pass figure.ir instead.");
26
+ const scene = toScene(next, options);
27
+ currentScene = scene;
28
+ const hasNominalSize = typeof options.width === "number" && Number.isFinite(options.width) && typeof options.height === "number" && Number.isFinite(options.height);
29
+ const bitmapWidth = hasNominalSize ? options.width : scene.layout.width;
30
+ const bitmapHeight = hasNominalSize ? options.height : scene.layout.height;
31
+ canvas.width = Math.max(1, Math.round(bitmapWidth * ratio));
32
+ canvas.height = Math.max(1, Math.round(bitmapHeight * ratio));
33
+ if (options.width !== void 0) canvas.style.width = `${options.width}px`;
34
+ if (options.height !== void 0) canvas.style.height = `${options.height}px`;
35
+ canvas.style.objectFit = "contain";
36
+ renderToCanvas(canvas, scene, { devicePixelRatio: ratio });
37
+ };
38
+ renderInto(isFigure(input) ? input.ir : input);
39
+ container.appendChild(canvas);
40
+ /**
41
+ * 把指针的 client 像素坐标逆 meet-fit 映射成 Scene user units
42
+ * @description meet-fit 正向(CSS 显示盒内,镜像 renderToCanvas / CanvasHost,dpr 在 client→CSS 这步已无关):
43
+ * `scale = min(cssWidth/layout.width, cssHeight/layout.height)`;`offset = (cssSize − layout.size·scale)/2`
44
+ * 居中 letterbox;`cssX = offset.x + (sceneX − layout.x)·scale`。此处求逆——读 `canvas.getBoundingClientRect()`
45
+ * 把 client 坐标降到 canvas 局部 CSS 像素,再去 letterbox offset、除 scale、加 layout origin。落在 letterbox
46
+ * 黑边外的点会得到 layout 区域外坐标,交由 `hitTest` 自然判为无命中(不在此截断)。
47
+ */
48
+ const clientToScene = (clientX, clientY) => {
49
+ const { layout } = currentScene;
50
+ const rect = canvas.getBoundingClientRect();
51
+ const scale = Math.min(rect.width / layout.width, rect.height / layout.height);
52
+ const offsetX = (rect.width - layout.width * scale) / 2;
53
+ const offsetY = (rect.height - layout.height * scale) / 2;
54
+ const contentX = clientX - rect.left - offsetX;
55
+ const contentY = clientY - rect.top - offsetY;
56
+ return {
57
+ x: contentX / scale + layout.x,
58
+ y: contentY / scale + layout.y
59
+ };
60
+ };
61
+ let disposed = false;
62
+ /**
63
+ * canvas 水合:把 handler 经 hitTest 定位绑到 `<canvas>`
64
+ * @description canvas 无逐图元 DOM,`locate(event)` = client 坐标经 `clientToScene` 逆 meet-fit 成 Scene 点
65
+ * (落 letterbox 黑边 → null、不命中),再 `hitTest(currentScene, point, { context2d })` 返回命中图元 id。
66
+ * `context2d` 用 canvas 自己的 2D context(生产真实;测试 spy 的 harness context 经 `getContext('2d')` 返回)
67
+ * 作几何重建 + 原生点测的载体。绑定经 `createHydrationController`(根级委托 + enter/leave 合成 + dispose)。
68
+ */
69
+ const hydrate = (hydrateOptions) => {
70
+ const context2d = canvas.getContext("2d") ?? void 0;
71
+ return { dispose: createHydrationController(canvas, hydrateOptions.handlers, (event) => {
72
+ const scenePoint = clientToScene(event.clientX, event.clientY);
73
+ context2d?.setTransform(1, 0, 0, 1, 0, 0);
74
+ return hitTest(currentScene, scenePoint, { context2d });
75
+ }).dispose };
76
+ };
77
+ return {
78
+ root: canvas,
79
+ update(next) {
80
+ if (disposed) throw new Error("mountCanvas: view already disposed.");
81
+ renderInto(next);
82
+ },
83
+ dispose() {
84
+ if (disposed) return;
85
+ disposed = true;
86
+ canvas.remove();
87
+ },
88
+ hydrate,
89
+ clientToScene
90
+ };
91
+ };
92
+ //#endregion
93
+ export { mountCanvas };
@@ -1,4 +1,5 @@
1
1
  import { CompileOptions, IR, Scene } from '@retikz/core';
2
+ import { HydrationHandlers } from '@retikz/render/hydration';
2
3
  import { Figure } from './figure';
3
4
  /** mountSvg / renderToSvgString 的入参:已编译 `Scene`、待编译 `IR`,或命令式 builder 的 `Figure` */
4
5
  export type RenderInput = Scene | IR | Figure;
@@ -25,4 +26,47 @@ export type VanillaView = {
25
26
  /** 卸载:移除 `root`、置 view 失效(再调 `update` 抛、`dispose` noop) */
26
27
  dispose: () => void;
27
28
  };
29
+ /** `hydrate` / `view.hydrate` 返回的解绑句柄 */
30
+ export type HydrationHandle = {
31
+ /** 解绑本次水合的全部 listener,之后事件不再触发 */
32
+ dispose: () => void;
33
+ };
34
+ /** 水合入参:按 id 提供的 handler 注册表(事件名 → handler) */
35
+ export type HydrateOptions = {
36
+ /** id → 事件名 → handler 的注册表(透传给 `@retikz/render/hydration` 控制器) */
37
+ handlers: HydrationHandlers;
38
+ };
39
+ /** Scene user units 坐标点(hitTest 入参 / 坐标映射出参) */
40
+ export type ScenePoint = {
41
+ /** Scene user units 横坐标 */
42
+ x: number;
43
+ /** Scene user units 纵坐标 */
44
+ y: number;
45
+ };
46
+ /**
47
+ * `mountCanvas` 返回的句柄:在 `VanillaView` 基础上加 canvas 侧水合 + 坐标映射
48
+ * @description `root` 是挂出的 `<canvas>`(非 svg),与 `mountSvg` 的 `<svg>` 对应;`hydrate` 用 `hitTest` +
49
+ * client→Scene 坐标映射做定位;`clientToScene` 把指针的 client 像素逆 meet-fit 映射回 Scene user units(供 hitTest)。
50
+ */
51
+ export type CanvasView = {
52
+ /** 挂载出的 `<canvas>`;跨 `update` 同一元素(不被替换) */
53
+ readonly root: HTMLCanvasElement;
54
+ /** 整图重渲染(原地复用 `root`、重设位图尺寸 + 重绘),不承诺局部 patch */
55
+ update: (next: RenderInput) => void;
56
+ /** 卸载:移除 `root`、解绑水合、置 view 失效(再调 `update` 抛、`dispose` noop) */
57
+ dispose: () => void;
58
+ /** 绑定 handler:以 `hitTest` + `clientToScene` 构造 `locate`,经 `createHydrationController` 委托 */
59
+ hydrate: (options: HydrateOptions) => HydrationHandle;
60
+ /**
61
+ * 把指针的 client 像素坐标逆 meet-fit 映射成 Scene user units(命中映射用)
62
+ * @description 始终返回逆 fit 后的 Scene 点;落在 letterbox 黑边外的点会得到 layout 区域外坐标,
63
+ * 交给 `hitTest` 自然判为无命中(无需在此截断),故无 `null` 返回。
64
+ */
65
+ clientToScene: (clientX: number, clientY: number) => ScenePoint;
66
+ };
67
+ /** `mountCanvas` 选项:继承 SSR / compile 公共项,外加 canvas 显示 / dpr 透传 */
68
+ export type MountCanvasOptions = CommonOptions & {
69
+ /** 设备像素比;缺省读 `globalThis.devicePixelRatio`、再回退 1(镜像 react CanvasHost) */
70
+ devicePixelRatio?: number;
71
+ };
28
72
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAAC;AAEnB,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,gEAAgE;IAChE,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAAC;AAEnB,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,gEAAgE;IAChE,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,eAAe,GAAG;IAC5B,kCAAkC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG;IAC3B,kEAAkE;IAClE,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAEF,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAAG;IACvB,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,iDAAiD;IACjD,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,gEAAgE;IAChE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4FAA4F;IAC5F,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,eAAe,CAAC;IACtD;;;;OAIG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC;CACjE,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC"}
@@ -0,0 +1,14 @@
1
+ let _retikz_render_hydration = require("@retikz/render/hydration");
2
+ //#region src/hydrate.ts
3
+ /**
4
+ * 把用户 handler 水合到容器内已挂的 `<svg>`(无框架 SVG 水合入口)
5
+ * @description SSR / `mountSvg` 先渲染出含 `data-retikz-id` 的图,本入口再把 handler 绑回图元——不重建 DOM、
6
+ * 不接管状态,只做「图元 id ↔ 用户函数」绑定。用 `@retikz/render/hydration` 的 `createHydrationController(root,
7
+ * handlers, locateSvg)` 在 `root` 上挂根级委托:事件经 `closest('[data-retikz-id]')` 反查图元 id,命中即触发
8
+ * 对应 handler;`pointerEnter` / `pointerLeave` 由控制器经 `pointermove` + 命中 id 状态机合成。返回 `{ dispose }` 解绑。
9
+ */
10
+ var hydrate = (root, options) => {
11
+ return { dispose: (0, _retikz_render_hydration.createHydrationController)(root, options.handlers, _retikz_render_hydration.locateSvg).dispose };
12
+ };
13
+ //#endregion
14
+ exports.hydrate = hydrate;
@@ -0,0 +1,10 @@
1
+ import { HydrateOptions, HydrationHandle } from './types';
2
+ /**
3
+ * 把用户 handler 水合到容器内已挂的 `<svg>`(无框架 SVG 水合入口)
4
+ * @description SSR / `mountSvg` 先渲染出含 `data-retikz-id` 的图,本入口再把 handler 绑回图元——不重建 DOM、
5
+ * 不接管状态,只做「图元 id ↔ 用户函数」绑定。用 `@retikz/render/hydration` 的 `createHydrationController(root,
6
+ * handlers, locateSvg)` 在 `root` 上挂根级委托:事件经 `closest('[data-retikz-id]')` 反查图元 id,命中即触发
7
+ * 对应 handler;`pointerEnter` / `pointerLeave` 由控制器经 `pointermove` + 命中 id 状态机合成。返回 `{ dispose }` 解绑。
8
+ */
9
+ export declare const hydrate: (root: Element, options: HydrateOptions) => HydrationHandle;
10
+ //# sourceMappingURL=hydrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydrate.d.ts","sourceRoot":"","sources":["../../src/hydrate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,OAAO,EAAE,SAAS,cAAc,KAAG,eAGhE,CAAC"}
@@ -1,6 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_renderToSvgString = require("./renderToSvgString.cjs");
3
3
  const require_mountSvg = require("./mountSvg.cjs");
4
+ const require_hydrate = require("./hydrate.cjs");
5
+ const require_mountCanvas = require("./mountCanvas.cjs");
4
6
  const require_coordinate = require("./builder/coordinate.cjs");
5
7
  const require_draw = require("./builder/draw.cjs");
6
8
  const require_node = require("./builder/node.cjs");
@@ -9,6 +11,8 @@ const require_figure = require("./builder/figure.cjs");
9
11
  exports.coordinate = require_coordinate.coordinate;
10
12
  exports.draw = require_draw.draw;
11
13
  exports.figure = require_figure.figure;
14
+ exports.hydrate = require_hydrate.hydrate;
15
+ exports.mountCanvas = require_mountCanvas.mountCanvas;
12
16
  exports.mountSvg = require_mountSvg.mountSvg;
13
17
  exports.node = require_node.node;
14
18
  exports.renderToSvgString = require_renderToSvgString.renderToSvgString;
@@ -8,6 +8,8 @@
8
8
  */
9
9
  export { renderToSvgString } from './renderToSvgString';
10
10
  export { mountSvg } from './mountSvg';
11
+ export { hydrate } from './hydrate';
12
+ export { mountCanvas } from './mountCanvas';
11
13
  export { figure } from './builder/figure';
12
14
  export { node } from './builder/node';
13
15
  export { draw } from './builder/draw';
@@ -16,5 +18,5 @@ export { scope } from './builder/scope';
16
18
  export type { Figure } from './figure';
17
19
  export type { ScopeBuilder } from './builder/scope';
18
20
  export type { Child, NodeConfig, DrawConfig, CoordinateConfig, ScopeConfig, FigureConfig, Way, } from './builder/types';
19
- export type { RenderInput, CommonOptions, MountOptions, RenderToStringOptions, VanillaView } from './types';
21
+ export type { RenderInput, CommonOptions, MountOptions, RenderToStringOptions, VanillaView, CanvasView, MountCanvasOptions, HydrateOptions, HydrationHandle, ScenePoint, } from './types';
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EACV,KAAK,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,GAAG,GACJ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EACV,KAAK,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,GAAG,GACJ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,SAAS,CAAC"}
@@ -0,0 +1,93 @@
1
+ const require_isFigure = require("./builder/isFigure.cjs");
2
+ const require_toScene = require("./toScene.cjs");
3
+ let _retikz_render_hydration = require("@retikz/render/hydration");
4
+ let _retikz_render_canvas = require("@retikz/render/canvas");
5
+ //#region src/mountCanvas.ts
6
+ /** 设备像素比:取有限正数、否则回退 1(镜像 react CanvasHost) */
7
+ var resolveDevicePixelRatio = (override) => {
8
+ if (typeof override === "number" && Number.isFinite(override) && override > 0) return override;
9
+ const ratio = globalThis.devicePixelRatio;
10
+ return typeof ratio === "number" && Number.isFinite(ratio) && ratio > 0 ? ratio : 1;
11
+ };
12
+ /**
13
+ * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
14
+ * @description 收 IR 时 `toScene` compile、收 Scene 直用、收 Figure 解 `figure.ir`。位图按「名义显示尺寸」
15
+ * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
16
+ * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
17
+ * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
18
+ */
19
+ var mountCanvas = (container, input, options = {}) => {
20
+ if (typeof Element === "undefined" || !(container instanceof Element)) throw new Error("mountCanvas: container must be a DOM Element.");
21
+ const canvas = document.createElement("canvas");
22
+ const ratio = resolveDevicePixelRatio(options.devicePixelRatio);
23
+ let currentScene;
24
+ const renderInto = (next) => {
25
+ if (require_isFigure.isFigure(next)) throw new Error("mountCanvas: view.update does not accept a Figure; pass figure.ir instead.");
26
+ const scene = require_toScene.toScene(next, options);
27
+ currentScene = scene;
28
+ const hasNominalSize = typeof options.width === "number" && Number.isFinite(options.width) && typeof options.height === "number" && Number.isFinite(options.height);
29
+ const bitmapWidth = hasNominalSize ? options.width : scene.layout.width;
30
+ const bitmapHeight = hasNominalSize ? options.height : scene.layout.height;
31
+ canvas.width = Math.max(1, Math.round(bitmapWidth * ratio));
32
+ canvas.height = Math.max(1, Math.round(bitmapHeight * ratio));
33
+ if (options.width !== void 0) canvas.style.width = `${options.width}px`;
34
+ if (options.height !== void 0) canvas.style.height = `${options.height}px`;
35
+ canvas.style.objectFit = "contain";
36
+ (0, _retikz_render_canvas.renderToCanvas)(canvas, scene, { devicePixelRatio: ratio });
37
+ };
38
+ renderInto(require_isFigure.isFigure(input) ? input.ir : input);
39
+ container.appendChild(canvas);
40
+ /**
41
+ * 把指针的 client 像素坐标逆 meet-fit 映射成 Scene user units
42
+ * @description meet-fit 正向(CSS 显示盒内,镜像 renderToCanvas / CanvasHost,dpr 在 client→CSS 这步已无关):
43
+ * `scale = min(cssWidth/layout.width, cssHeight/layout.height)`;`offset = (cssSize − layout.size·scale)/2`
44
+ * 居中 letterbox;`cssX = offset.x + (sceneX − layout.x)·scale`。此处求逆——读 `canvas.getBoundingClientRect()`
45
+ * 把 client 坐标降到 canvas 局部 CSS 像素,再去 letterbox offset、除 scale、加 layout origin。落在 letterbox
46
+ * 黑边外的点会得到 layout 区域外坐标,交由 `hitTest` 自然判为无命中(不在此截断)。
47
+ */
48
+ const clientToScene = (clientX, clientY) => {
49
+ const { layout } = currentScene;
50
+ const rect = canvas.getBoundingClientRect();
51
+ const scale = Math.min(rect.width / layout.width, rect.height / layout.height);
52
+ const offsetX = (rect.width - layout.width * scale) / 2;
53
+ const offsetY = (rect.height - layout.height * scale) / 2;
54
+ const contentX = clientX - rect.left - offsetX;
55
+ const contentY = clientY - rect.top - offsetY;
56
+ return {
57
+ x: contentX / scale + layout.x,
58
+ y: contentY / scale + layout.y
59
+ };
60
+ };
61
+ let disposed = false;
62
+ /**
63
+ * canvas 水合:把 handler 经 hitTest 定位绑到 `<canvas>`
64
+ * @description canvas 无逐图元 DOM,`locate(event)` = client 坐标经 `clientToScene` 逆 meet-fit 成 Scene 点
65
+ * (落 letterbox 黑边 → null、不命中),再 `hitTest(currentScene, point, { context2d })` 返回命中图元 id。
66
+ * `context2d` 用 canvas 自己的 2D context(生产真实;测试 spy 的 harness context 经 `getContext('2d')` 返回)
67
+ * 作几何重建 + 原生点测的载体。绑定经 `createHydrationController`(根级委托 + enter/leave 合成 + dispose)。
68
+ */
69
+ const hydrate = (hydrateOptions) => {
70
+ const context2d = canvas.getContext("2d") ?? void 0;
71
+ return { dispose: (0, _retikz_render_hydration.createHydrationController)(canvas, hydrateOptions.handlers, (event) => {
72
+ const scenePoint = clientToScene(event.clientX, event.clientY);
73
+ context2d?.setTransform(1, 0, 0, 1, 0, 0);
74
+ return (0, _retikz_render_canvas.hitTest)(currentScene, scenePoint, { context2d });
75
+ }).dispose };
76
+ };
77
+ return {
78
+ root: canvas,
79
+ update(next) {
80
+ if (disposed) throw new Error("mountCanvas: view already disposed.");
81
+ renderInto(next);
82
+ },
83
+ dispose() {
84
+ if (disposed) return;
85
+ disposed = true;
86
+ canvas.remove();
87
+ },
88
+ hydrate,
89
+ clientToScene
90
+ };
91
+ };
92
+ //#endregion
93
+ exports.mountCanvas = mountCanvas;
@@ -0,0 +1,10 @@
1
+ import { CanvasView, MountCanvasOptions, RenderInput } from './types';
2
+ /**
3
+ * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
4
+ * @description 收 IR 时 `toScene` compile、收 Scene 直用、收 Figure 解 `figure.ir`。位图按「名义显示尺寸」
5
+ * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
6
+ * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
7
+ * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
8
+ */
9
+ export declare const mountCanvas: (container: Element, input: RenderInput, options?: MountCanvasOptions) => CanvasView;
10
+ //# sourceMappingURL=mountCanvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountCanvas.d.ts","sourceRoot":"","sources":["../../src/mountCanvas.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAkB,kBAAkB,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AASvG;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,OAAO,EAClB,OAAO,WAAW,EAClB,UAAS,kBAAuB,KAC/B,UAyFF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { CompileOptions, IR, Scene } from '@retikz/core';
2
+ import { HydrationHandlers } from '@retikz/render/hydration';
2
3
  import { Figure } from './figure';
3
4
  /** mountSvg / renderToSvgString 的入参:已编译 `Scene`、待编译 `IR`,或命令式 builder 的 `Figure` */
4
5
  export type RenderInput = Scene | IR | Figure;
@@ -25,4 +26,47 @@ export type VanillaView = {
25
26
  /** 卸载:移除 `root`、置 view 失效(再调 `update` 抛、`dispose` noop) */
26
27
  dispose: () => void;
27
28
  };
29
+ /** `hydrate` / `view.hydrate` 返回的解绑句柄 */
30
+ export type HydrationHandle = {
31
+ /** 解绑本次水合的全部 listener,之后事件不再触发 */
32
+ dispose: () => void;
33
+ };
34
+ /** 水合入参:按 id 提供的 handler 注册表(事件名 → handler) */
35
+ export type HydrateOptions = {
36
+ /** id → 事件名 → handler 的注册表(透传给 `@retikz/render/hydration` 控制器) */
37
+ handlers: HydrationHandlers;
38
+ };
39
+ /** Scene user units 坐标点(hitTest 入参 / 坐标映射出参) */
40
+ export type ScenePoint = {
41
+ /** Scene user units 横坐标 */
42
+ x: number;
43
+ /** Scene user units 纵坐标 */
44
+ y: number;
45
+ };
46
+ /**
47
+ * `mountCanvas` 返回的句柄:在 `VanillaView` 基础上加 canvas 侧水合 + 坐标映射
48
+ * @description `root` 是挂出的 `<canvas>`(非 svg),与 `mountSvg` 的 `<svg>` 对应;`hydrate` 用 `hitTest` +
49
+ * client→Scene 坐标映射做定位;`clientToScene` 把指针的 client 像素逆 meet-fit 映射回 Scene user units(供 hitTest)。
50
+ */
51
+ export type CanvasView = {
52
+ /** 挂载出的 `<canvas>`;跨 `update` 同一元素(不被替换) */
53
+ readonly root: HTMLCanvasElement;
54
+ /** 整图重渲染(原地复用 `root`、重设位图尺寸 + 重绘),不承诺局部 patch */
55
+ update: (next: RenderInput) => void;
56
+ /** 卸载:移除 `root`、解绑水合、置 view 失效(再调 `update` 抛、`dispose` noop) */
57
+ dispose: () => void;
58
+ /** 绑定 handler:以 `hitTest` + `clientToScene` 构造 `locate`,经 `createHydrationController` 委托 */
59
+ hydrate: (options: HydrateOptions) => HydrationHandle;
60
+ /**
61
+ * 把指针的 client 像素坐标逆 meet-fit 映射成 Scene user units(命中映射用)
62
+ * @description 始终返回逆 fit 后的 Scene 点;落在 letterbox 黑边外的点会得到 layout 区域外坐标,
63
+ * 交给 `hitTest` 自然判为无命中(无需在此截断),故无 `null` 返回。
64
+ */
65
+ clientToScene: (clientX: number, clientY: number) => ScenePoint;
66
+ };
67
+ /** `mountCanvas` 选项:继承 SSR / compile 公共项,外加 canvas 显示 / dpr 透传 */
68
+ export type MountCanvasOptions = CommonOptions & {
69
+ /** 设备像素比;缺省读 `globalThis.devicePixelRatio`、再回退 1(镜像 react CanvasHost) */
70
+ devicePixelRatio?: number;
71
+ };
28
72
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAAC;AAEnB,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,gEAAgE;IAChE,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,oFAAoF;AACpF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAAC;AAEnB,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,gEAAgE;IAChE,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,2DAA2D;IAC3D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,eAAe,GAAG;IAC5B,kCAAkC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG;IAC3B,kEAAkE;IAClE,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAEF,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAAG;IACvB,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,2BAA2B;IAC3B,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,iDAAiD;IACjD,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,gEAAgE;IAChE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4FAA4F;IAC5F,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,eAAe,CAAC;IACtD;;;;OAIG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,UAAU,CAAC;CACjE,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retikz/vanilla",
3
- "version": "0.3.0-alpha.2",
3
+ "version": "0.3.0-alpha.3",
4
4
  "description": "Framework-free runtime for retikz: mount Scene/IR to SVG DOM, or render to SVG string for SSR.",
5
5
  "type": "module",
6
6
  "author": "Pionpill",
@@ -39,8 +39,8 @@
39
39
  "dist/**/*"
40
40
  ],
41
41
  "dependencies": {
42
- "@retikz/render": "0.3.0-alpha.2",
43
- "@retikz/core": "0.3.0-alpha.2"
42
+ "@retikz/core": "0.3.0-alpha.3",
43
+ "@retikz/render": "0.3.0-alpha.3"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^25.6.0",