@retikz/vanilla 0.3.0-alpha.5 → 0.3.0-beta.1

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.
Files changed (39) hide show
  1. package/dist/es/builder/scope.d.ts +1 -1
  2. package/dist/es/builder/scope.d.ts.map +1 -1
  3. package/dist/es/builder/scope.js +2 -2
  4. package/dist/es/constants.d.ts +3 -0
  5. package/dist/es/constants.d.ts.map +1 -0
  6. package/dist/es/figure.d.ts +5 -3
  7. package/dist/es/figure.d.ts.map +1 -1
  8. package/dist/es/figure.js +6 -2
  9. package/dist/es/index.d.ts +7 -1
  10. package/dist/es/index.d.ts.map +1 -1
  11. package/dist/es/index.js +2 -2
  12. package/dist/es/mountCanvas.d.ts +2 -1
  13. package/dist/es/mountCanvas.d.ts.map +1 -1
  14. package/dist/es/mountCanvas.js +62 -24
  15. package/dist/es/mountSvg.d.ts.map +1 -1
  16. package/dist/es/mountSvg.js +7 -12
  17. package/dist/es/renderToSvgString.d.ts +2 -1
  18. package/dist/es/renderToSvgString.d.ts.map +1 -1
  19. package/dist/es/renderToSvgString.js +8 -13
  20. package/dist/lib/builder/scope.cjs +2 -2
  21. package/dist/lib/builder/scope.d.ts +1 -1
  22. package/dist/lib/builder/scope.d.ts.map +1 -1
  23. package/dist/lib/constants.d.ts +3 -0
  24. package/dist/lib/constants.d.ts.map +1 -0
  25. package/dist/lib/figure.cjs +6 -2
  26. package/dist/lib/figure.d.ts +5 -3
  27. package/dist/lib/figure.d.ts.map +1 -1
  28. package/dist/lib/index.cjs +24 -0
  29. package/dist/lib/index.d.ts +7 -1
  30. package/dist/lib/index.d.ts.map +1 -1
  31. package/dist/lib/mountCanvas.cjs +61 -23
  32. package/dist/lib/mountCanvas.d.ts +2 -1
  33. package/dist/lib/mountCanvas.d.ts.map +1 -1
  34. package/dist/lib/mountSvg.cjs +6 -11
  35. package/dist/lib/mountSvg.d.ts.map +1 -1
  36. package/dist/lib/renderToSvgString.cjs +8 -13
  37. package/dist/lib/renderToSvgString.d.ts +2 -1
  38. package/dist/lib/renderToSvgString.d.ts.map +1 -1
  39. package/package.json +4 -5
@@ -11,7 +11,7 @@ export type ScopeBuilder = {
11
11
  node: (...args: Parameters<typeof node>) => ScopeBuilder;
12
12
  draw: (...args: Parameters<typeof draw>) => ScopeBuilder;
13
13
  coordinate: (...args: Parameters<typeof coordinate>) => ScopeBuilder;
14
- scope: (config: ScopeConfig, build: (s: ScopeBuilder) => void) => ScopeBuilder;
14
+ scope: (config: ScopeConfig, arg: Array<Child> | ((s: ScopeBuilder) => void)) => ScopeBuilder;
15
15
  };
16
16
  /**
17
17
  * 构造一个 scope IR 子节点(分组容器 + 样式默认 + transforms)
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/builder/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,YAAY,CAAC;IACrE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,KAAK,YAAY,CAAC;CAChF,CAAC;AAwBF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,WAAW,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAG,KAS5F,CAAC"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/builder/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,YAAY,CAAC;IACrE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAK,YAAY,CAAC;CAC/F,CAAC;AAwBF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,WAAW,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAG,KAS5F,CAAC"}
@@ -16,8 +16,8 @@ var createScopeBuilder = (sink) => {
16
16
  sink.push(coordinate(...args));
17
17
  return self;
18
18
  },
19
- scope(config, build) {
20
- sink.push(scope(config, build));
19
+ scope(config, arg) {
20
+ sink.push(scope(config, arg));
21
21
  return self;
22
22
  }
23
23
  };
@@ -0,0 +1,3 @@
1
+ /** 默认资源 id 前缀(确定性);多实例同页须经 `options.idPrefix` 显式区分。SSR(`renderToSvgString`) 与 mount(`mountSvg`) 共用同一默认,避免两处漂移导致资源 id 失配。 */
2
+ export declare const DEFAULT_ID_PREFIX = "r";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAC5H,eAAO,MAAM,iBAAiB,MAAM,CAAC"}
@@ -4,22 +4,24 @@ import { FIGURE_BRAND } from './builder/isFigure';
4
4
  import { node } from './builder/node';
5
5
  import { ScopeBuilder } from './builder/scope';
6
6
  import { Child, CoordinateConfig, DrawConfig, FigureConfig, ScopeConfig, Way } from './builder/types';
7
- import { MountOptions, RenderToStringOptions, VanillaView } from './types';
7
+ import { CanvasView, MountCanvasOptions, MountOptions, RenderToStringOptions, VanillaView } from './types';
8
8
  /**
9
9
  * 命令式 builder 的装配产物 —— 唯一返回类型
10
10
  * @description hyperscript(`figure(config, children)`)与 fluent(`figure(config).node(...)`)都产它、可混用、`.ir` 一致。
11
- * `.mount`/`.toSvgString`/`.toCanvas` `this.ir`(IR,非 Figure)交底层 renderer;fluent 方法往内部 children 追加、链式返回 this。
11
+ * `.mount`/`.mountCanvas`(交互式挂载)/`.toSvgString`/`.toCanvas`(一次性产出)把 `this.ir`(IR,非 Figure)交底层
12
+ * renderer;fluent 方法往内部 children 追加、链式返回 this。
12
13
  */
13
14
  export type Figure = {
14
15
  readonly [FIGURE_BRAND]: true;
15
16
  readonly ir: IR;
16
17
  mount: (container: Element, options?: MountOptions) => VanillaView;
18
+ mountCanvas: (container: Element, options?: MountCanvasOptions) => CanvasView;
17
19
  toSvgString: (options?: RenderToStringOptions) => string;
18
20
  toCanvas: (canvas: HTMLCanvasElement, options?: RenderOptions) => void;
19
21
  node: (...args: Parameters<typeof node>) => Figure;
20
22
  draw: (way: Way, config?: DrawConfig) => Figure;
21
23
  coordinate: (id: string, config: CoordinateConfig) => Figure;
22
- scope: (config: ScopeConfig, build: (s: ScopeBuilder) => void) => Figure;
24
+ scope: (config: ScopeConfig, arg: Array<Child> | ((s: ScopeBuilder) => void)) => Figure;
23
25
  };
24
26
  /** figure() 的内部入口:装配 Figure(持 config + children,方法闭包其上) */
25
27
  export declare const createFigure: (config: FigureConfig, children: Array<Child>) => Figure;
@@ -1 +1 @@
1
- {"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/figure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3G,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,WAAW,CAAC;IACnE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,MAAM,CAAC;IACzD,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,KAAK,MAAM,CAAC;CAC1E,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,YAAY,GAAI,QAAQ,YAAY,EAAE,UAAU,KAAK,CAAC,KAAK,CAAC,KAAG,MAoD3E,CAAC"}
1
+ {"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/figure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK3G,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhH;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,WAAW,CAAC;IACnE,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,UAAU,CAAC;IAC9E,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,MAAM,CAAC;IACzD,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC;CACzF,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,YAAY,GAAI,QAAQ,YAAY,EAAE,UAAU,KAAK,CAAC,KAAK,CAAC,KAAG,MAwD3E,CAAC"}
package/dist/es/figure.js CHANGED
@@ -2,6 +2,7 @@ import { FIGURE_BRAND } from "./builder/isFigure.js";
2
2
  import { toScene } from "./toScene.js";
3
3
  import { renderToSvgString } from "./renderToSvgString.js";
4
4
  import { mountSvg } from "./mountSvg.js";
5
+ import { mountCanvas } from "./mountCanvas.js";
5
6
  import { coordinate } from "./builder/coordinate.js";
6
7
  import { draw } from "./builder/draw.js";
7
8
  import { node } from "./builder/node.js";
@@ -32,6 +33,9 @@ var createFigure = (config, children) => {
32
33
  mount(container, options) {
33
34
  return mountSvg(container, fig.ir, renderOptions(options));
34
35
  },
36
+ mountCanvas(container, options) {
37
+ return mountCanvas(container, fig.ir, renderOptions(options));
38
+ },
35
39
  toSvgString(options) {
36
40
  return renderToSvgString(fig.ir, renderOptions(options));
37
41
  },
@@ -55,8 +59,8 @@ var createFigure = (config, children) => {
55
59
  children.push(coordinate(id, coordConfig));
56
60
  return fig;
57
61
  },
58
- scope(scopeConfig, build) {
59
- children.push(scope(scopeConfig, build));
62
+ scope(scopeConfig, arg) {
63
+ children.push(scope(scopeConfig, arg));
60
64
  return fig;
61
65
  }
62
66
  };
@@ -10,9 +10,15 @@ export { renderToSvgString } from './renderToSvgString';
10
10
  export { mountSvg } from './mountSvg';
11
11
  export { hydrate } from './hydrate';
12
12
  export { mountCanvas } from './mountCanvas';
13
- export type { RetikzEventName, HydrationHandlers, HydrationHandler, HydrationContext, HydrationAnimationControls, HydrationGeometry, } from '@retikz/render/hydration';
13
+ export type { RetikzEventValue, HydrationHandlers, HydrationHandler, HydrationContext, HydrationAnimationControls, HydrationGeometry, } from '@retikz/render/hydration';
14
14
  export { fadeIn, drawOn, scaleIn, grow, growUp, slideIn, colorShift, cameraTo, pulse, spin, loop, flash, blink, wiggle, stagger, } from '@retikz/core';
15
15
  export type { AnimationPresetOptions, ScaleInOptions, GrowUpOptions, SlideInOptions, ColorShiftOptions, CameraToOptions, PulseOptions, SpinOptions, LoopOptions, FlashOptions, BlinkOptions, WiggleOptions, } from '@retikz/core';
16
+ export { DrawWay } from '@retikz/core';
17
+ export type { WayItem, WayDSL, WayCycle, WayVia, WayRelativeItem, WayLabel, WayLabelOp, } from '@retikz/core';
18
+ export type { IRNodeTarget, IRAnchorRef } from '@retikz/core';
19
+ export { defineArrow, definePattern, definePathGenerator } from '@retikz/core';
20
+ export type { ArrowDefinition, ArrowEmitContext, PatternDefinition, PatternEmitContext, MarkerPrimitive, MarkerFill, PathGeneratorDefinition, PathGeneratorContext, IRJsonObject, } from '@retikz/core';
21
+ export type { AnimationPropertyDefinition, AnimationPropertyRegistry, CubicBezier, EasingFn, EasingRegistry, } from '@retikz/render/animation';
16
22
  export { figure } from './builder/figure';
17
23
  export { node } from './builder/node';
18
24
  export { draw } from './builder/draw';
@@ -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,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,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,EACV,iBAAiB,GAClB,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;AAE5C,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,eAAe,EACf,QAAQ,EACR,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC/E,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,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,EACV,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
package/dist/es/index.js CHANGED
@@ -7,5 +7,5 @@ import { draw } from "./builder/draw.js";
7
7
  import { node } from "./builder/node.js";
8
8
  import { scope } from "./builder/scope.js";
9
9
  import { figure } from "./builder/figure.js";
10
- import { blink, cameraTo, colorShift, drawOn, fadeIn, flash, grow, growUp, loop, pulse, scaleIn, slideIn, spin, stagger, wiggle } from "@retikz/core";
11
- export { blink, cameraTo, colorShift, coordinate, draw, drawOn, fadeIn, figure, flash, grow, growUp, hydrate, loop, mountCanvas, mountSvg, node, pulse, renderToSvgString, scaleIn, scope, slideIn, spin, stagger, wiggle };
10
+ import { DrawWay, blink, cameraTo, colorShift, defineArrow, definePathGenerator, definePattern, drawOn, fadeIn, flash, grow, growUp, loop, pulse, scaleIn, slideIn, spin, stagger, wiggle } from "@retikz/core";
11
+ export { DrawWay, blink, cameraTo, colorShift, coordinate, defineArrow, definePathGenerator, definePattern, draw, drawOn, fadeIn, figure, flash, grow, growUp, hydrate, loop, mountCanvas, mountSvg, node, pulse, renderToSvgString, scaleIn, scope, slideIn, spin, stagger, wiggle };
@@ -1,7 +1,8 @@
1
1
  import { CanvasView, MountCanvasOptions, RenderInput } from './types';
2
2
  /**
3
3
  * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
4
- * @description 收 IR`toScene` compile、收 Scene 直用、收 Figure `figure.ir`。位图按「名义显示尺寸」
4
+ * @description 收 `Figure`delegate `figure.mountCanvas`(与 mountSvg→`figure.mount` 对称)。收 IR
5
+ * `toScene` compile、收 Scene 直用。位图按「名义显示尺寸」
5
6
  * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
6
7
  * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
7
8
  * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
@@ -1 +1 @@
1
- {"version":3,"file":"mountCanvas.d.ts","sourceRoot":"","sources":["../../src/mountCanvas.ts"],"names":[],"mappings":"AAYA,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,UA6JF,CAAC"}
1
+ {"version":3,"file":"mountCanvas.d.ts","sourceRoot":"","sources":["../../src/mountCanvas.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAkB,kBAAkB,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AASvG;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,OAAO,EAClB,OAAO,WAAW,EAClB,UAAS,kBAAuB,KAC/B,UA2MF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { isFigure } from "./builder/isFigure.js";
2
2
  import { toScene } from "./toScene.js";
3
3
  import { createClock, createIdClockRegistry, prefersReducedMotion, sceneAnimationDurationMs, sceneHasAnimations, sceneHasAutoplayTrigger } from "@retikz/render/animation";
4
- import { createCanvasIdAnimationControls, createHydrationController, geometryOf, metaOf } from "@retikz/render/hydration";
4
+ import { collectCanvasVisibleAnimationIds, createCanvasIdAnimationControls, createContextBuilder, createHydrationController, isCanvasAnimationIdVisible, withCanvasAnimationEventHandlers } from "@retikz/render/hydration";
5
5
  import { hitTest, renderToCanvas } from "@retikz/render/canvas";
6
6
  //#region src/mountCanvas.ts
7
7
  /** 设备像素比:取有限正数、否则回退 1(镜像 react CanvasHost) */
@@ -12,18 +12,22 @@ var resolveDevicePixelRatio = (override) => {
12
12
  };
13
13
  /**
14
14
  * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
15
- * @description 收 IR`toScene` compile、收 Scene 直用、收 Figure `figure.ir`。位图按「名义显示尺寸」
15
+ * @description 收 `Figure`delegate `figure.mountCanvas`(与 mountSvg→`figure.mount` 对称)。收 IR
16
+ * `toScene` compile、收 Scene 直用。位图按「名义显示尺寸」
16
17
  * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
17
18
  * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
18
19
  * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
19
20
  */
20
21
  var mountCanvas = (container, input, options = {}) => {
22
+ if (isFigure(input)) return input.mountCanvas(container, options);
21
23
  if (typeof Element === "undefined" || !(container instanceof Element)) throw new Error("mountCanvas: container must be a DOM Element.");
22
24
  const canvas = document.createElement("canvas");
23
25
  const ratio = resolveDevicePixelRatio(options.devicePixelRatio);
24
26
  const animate = options.animate !== false && !prefersReducedMotion();
25
27
  let clock;
26
28
  const registry = createIdClockRegistry();
29
+ let visibleActivated = /* @__PURE__ */ new Set();
30
+ let visibleTeardown;
27
31
  let currentScene;
28
32
  /** 把全局帧时刻折算成单个 prim 的动画解析(per-id):stop→渲染 base;否则按有效时刻 + 是否含非自动播 track */
29
33
  const resolvePrim = (id, globalTime) => id !== void 0 && registry.isStopped(id) ? { mode: "skip" } : {
@@ -42,6 +46,41 @@ var mountCanvas = (container, input, options = {}) => {
42
46
  resolvePrimAnimation: (id) => resolvePrim(id, time)
43
47
  });
44
48
  };
49
+ const ensureClockPlaying = () => {
50
+ clock?.play();
51
+ };
52
+ /** Canvas visible trigger:按 canvas client rect 与 id 聚合 bbox 相交激活一次 */
53
+ const activateVisibleTracks = () => {
54
+ const ids = collectCanvasVisibleAnimationIds(currentScene);
55
+ if (ids.size === 0) return;
56
+ let changed = false;
57
+ for (const id of ids) {
58
+ if (visibleActivated.has(id)) continue;
59
+ if (!isCanvasAnimationIdVisible(canvas, currentScene, id)) continue;
60
+ registry.restart(id, clock?.time ?? 0);
61
+ visibleActivated.add(id);
62
+ changed = true;
63
+ }
64
+ if (!changed) return;
65
+ ensureClockPlaying();
66
+ renderFrame();
67
+ };
68
+ const resetVisibleBridge = () => {
69
+ visibleActivated = /* @__PURE__ */ new Set();
70
+ visibleTeardown?.();
71
+ visibleTeardown = void 0;
72
+ if (!animate || !sceneHasAnimations(currentScene)) return;
73
+ if (collectCanvasVisibleAnimationIds(currentScene).size === 0 || typeof window === "undefined") return;
74
+ const schedule = () => activateVisibleTracks();
75
+ window.addEventListener("scroll", schedule, true);
76
+ window.addEventListener("resize", schedule);
77
+ const raf = window.requestAnimationFrame(schedule);
78
+ visibleTeardown = () => {
79
+ window.removeEventListener("scroll", schedule, true);
80
+ window.removeEventListener("resize", schedule);
81
+ window.cancelAnimationFrame(raf);
82
+ };
83
+ };
45
84
  const renderInto = (next) => {
46
85
  if (isFigure(next)) throw new Error("mountCanvas: view.update does not accept a Figure; pass figure.ir instead.");
47
86
  const scene = toScene(next, options);
@@ -70,8 +109,9 @@ var mountCanvas = (container, input, options = {}) => {
70
109
  });
71
110
  if (sceneHasAutoplayTrigger(scene)) clock.play();
72
111
  }
112
+ resetVisibleBridge();
73
113
  };
74
- renderInto(isFigure(input) ? input.ir : input);
114
+ renderInto(input);
75
115
  container.appendChild(canvas);
76
116
  /**
77
117
  * 把指针的 client 像素坐标逆 meet-fit 映射成 Scene user units
@@ -109,27 +149,24 @@ var mountCanvas = (container, input, options = {}) => {
109
149
  context2d?.setTransform(1, 0, 0, 1, 0, 0);
110
150
  return hitTest(currentScene, scenePoint, { context2d });
111
151
  };
112
- const buildContext = (event, id) => {
113
- const mouse = event;
114
- return {
115
- id,
116
- meta: metaOf(currentScene, id),
117
- renderer: "canvas",
118
- element: null,
119
- root: canvas,
120
- point: typeof mouse.clientX === "number" ? clientToScene(mouse.clientX, mouse.clientY) : null,
121
- geometry: geometryOf(currentScene, id),
122
- animation: createCanvasIdAnimationControls({
123
- registry,
124
- clockTime: () => clock?.time ?? 0,
125
- ensurePlaying: () => clock?.play(),
126
- renderFrame,
127
- defaultId: id
128
- }),
129
- scene: currentScene
130
- };
131
- };
132
- return { dispose: createHydrationController(canvas, hydrateOptions.handlers, locate, buildContext).dispose };
152
+ const buildContext = createContextBuilder({
153
+ renderer: "canvas",
154
+ root: canvas,
155
+ scene: () => currentScene,
156
+ resolveElement: () => null,
157
+ resolvePoint: (event) => {
158
+ const mouse = event;
159
+ return typeof mouse.clientX === "number" ? clientToScene(mouse.clientX, mouse.clientY) : null;
160
+ },
161
+ makeAnimation: (id) => createCanvasIdAnimationControls({
162
+ registry,
163
+ clockTime: () => clock?.time ?? 0,
164
+ ensurePlaying: () => clock?.play(),
165
+ renderFrame,
166
+ defaultId: id
167
+ })
168
+ });
169
+ return { dispose: createHydrationController(canvas, withCanvasAnimationEventHandlers(currentScene, hydrateOptions.handlers), locate, buildContext).dispose };
133
170
  };
134
171
  return {
135
172
  root: canvas,
@@ -140,6 +177,7 @@ var mountCanvas = (container, input, options = {}) => {
140
177
  dispose() {
141
178
  if (disposed) return;
142
179
  disposed = true;
180
+ visibleTeardown?.();
143
181
  clock?.dispose();
144
182
  canvas.remove();
145
183
  },
@@ -1 +1 @@
1
- {"version":3,"file":"mountSvg.d.ts","sourceRoot":"","sources":["../../src/mountSvg.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAmC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAMvG;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,OAAO,EAAE,OAAO,WAAW,EAAE,UAAS,YAAiB,KAAG,WA4E7F,CAAC"}
1
+ {"version":3,"file":"mountSvg.d.ts","sourceRoot":"","sources":["../../src/mountSvg.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAmC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIvG;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,OAAO,EAAE,OAAO,WAAW,EAAE,UAAS,YAAiB,KAAG,WAyE7F,CAAC"}
@@ -3,11 +3,9 @@ import { toScene } from "./toScene.js";
3
3
  import { applyAttrs, svgNodeToDom } from "./svgNodeToDom.js";
4
4
  import { buildSvgDocument } from "@retikz/render/svg";
5
5
  import { bindWaapiDescriptors, prefersReducedMotion, sceneHasAnimations } from "@retikz/render/animation";
6
- import { createHydrationController, createSvgAnimationControls, geometryOf, locateSvg, metaOf, resolvePointViaLayout, resolveSvgElement } from "@retikz/render/hydration";
6
+ import { createContextBuilder, createHydrationController, createSvgAnimationControls, locateSvg, resolvePointViaLayout, resolveSvgElement } from "@retikz/render/hydration";
7
7
  //#region src/mountSvg.ts
8
8
  var SVG_NS = "http://www.w3.org/2000/svg";
9
- /** 默认资源 id 前缀(确定性);多实例同页须经 `options.idPrefix` 显式区分 */
10
- var DEFAULT_ID_PREFIX = "r";
11
9
  /**
12
10
  * 把 IR / Scene / Figure 挂成真实 SVG DOM(无框架浏览器 runtime)
13
11
  * @description 收 `Figure` 时 delegate 给 `figure.mount`(Figure 自持 config,call-site options 覆盖)。收
@@ -18,7 +16,7 @@ var DEFAULT_ID_PREFIX = "r";
18
16
  var mountSvg = (container, input, options = {}) => {
19
17
  if (isFigure(input)) return input.mount(container, options);
20
18
  if (typeof Element === "undefined" || !(container instanceof Element)) throw new Error("mountSvg: container must be a DOM Element.");
21
- const idPrefix = options.idPrefix ?? DEFAULT_ID_PREFIX;
19
+ const idPrefix = options.idPrefix ?? "r";
22
20
  const root = document.createElementNS(SVG_NS, "svg");
23
21
  const animate = options.animate !== false && !prefersReducedMotion();
24
22
  let animationControls;
@@ -51,16 +49,13 @@ var mountSvg = (container, input, options = {}) => {
51
49
  * `data-retikz-animation-owner` 双查 `getAnimations()` per-id 控制。
52
50
  */
53
51
  const hydrate = (hydrateOptions) => {
54
- const buildContext = (event, id) => ({
55
- id,
56
- meta: metaOf(currentScene, id),
52
+ const buildContext = createContextBuilder({
57
53
  renderer: "svg",
58
- element: resolveSvgElement(event),
59
54
  root,
60
- point: resolvePointViaLayout(root, currentScene.layout)(event),
61
- geometry: geometryOf(currentScene, id),
62
- animation: createSvgAnimationControls(root, id),
63
- scene: currentScene
55
+ scene: () => currentScene,
56
+ resolveElement: resolveSvgElement,
57
+ resolvePoint: (event) => resolvePointViaLayout(root, currentScene.layout)(event),
58
+ makeAnimation: (id) => createSvgAnimationControls(root, id)
64
59
  });
65
60
  return { dispose: createHydrationController(root, hydrateOptions.handlers, locateSvg, buildContext).dispose };
66
61
  };
@@ -2,7 +2,8 @@ import { RenderInput, RenderToStringOptions } from './types';
2
2
  /**
3
3
  * 把 IR / Scene / Figure 渲染成 SVG 字符串(SSR / 构建期)
4
4
  * @description 收 `Figure` 时 delegate 给 `figure.toSvgString`。收 IR/Scene 时薄包 `@retikz/render/svg`:`toScene`
5
- * (ir 缺省走 core fallback measurer、确定性)→ 序列化 → 若给 `width`/`height` 注入根 `<svg>`。零 DOM。
5
+ * (ir 缺省走 core fallback measurer、确定性)→ 序列化。`width`/`height` 直接透传给 render,由其结构化写进根
6
+ * `<svg>` attrs(不在本层对字符串做正则后处理)。零 DOM。
6
7
  */
7
8
  export declare const renderToSvgString: (input: RenderInput, options?: RenderToStringOptions) => string;
8
9
  //# sourceMappingURL=renderToSvgString.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderToSvgString.d.ts","sourceRoot":"","sources":["../../src/renderToSvgString.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAYlE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,EAAE,UAAS,qBAA0B,KAAG,MAS3F,CAAC"}
1
+ {"version":3,"file":"renderToSvgString.d.ts","sourceRoot":"","sources":["../../src/renderToSvgString.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,EAAE,UAAS,qBAA0B,KAAG,MAU3F,CAAC"}
@@ -2,27 +2,22 @@ import { isFigure } from "./builder/isFigure.js";
2
2
  import { toScene } from "./toScene.js";
3
3
  import { renderToSvgString } from "@retikz/render/svg";
4
4
  //#region src/renderToSvgString.ts
5
- /** 默认资源 id 前缀(确定性);多实例同页须经 `options.idPrefix` 显式区分 */
6
- var DEFAULT_ID_PREFIX = "r";
7
- /** 把 `width`/`height` 注入到开头的 `<svg` 标签(@retikz/render/svg 只产 viewBox) */
8
- var injectSize = (svg, width, height) => {
9
- if (width === void 0 && height === void 0) return svg;
10
- const attrs = [width !== void 0 ? ` width="${width}"` : "", height !== void 0 ? ` height="${height}"` : ""].join("");
11
- return svg.replace(/^<svg/, `<svg${attrs}`);
12
- };
13
5
  /**
14
6
  * 把 IR / Scene / Figure 渲染成 SVG 字符串(SSR / 构建期)
15
7
  * @description 收 `Figure` 时 delegate 给 `figure.toSvgString`。收 IR/Scene 时薄包 `@retikz/render/svg`:`toScene`
16
- * (ir 缺省走 core fallback measurer、确定性)→ 序列化 → 若给 `width`/`height` 注入根 `<svg>`。零 DOM。
8
+ * (ir 缺省走 core fallback measurer、确定性)→ 序列化。`width`/`height` 直接透传给 render,由其结构化写进根
9
+ * `<svg>` attrs(不在本层对字符串做正则后处理)。零 DOM。
17
10
  */
18
11
  var renderToSvgString$1 = (input, options = {}) => {
19
12
  if (isFigure(input)) return input.toSvgString(options);
20
- return injectSize(renderToSvgString(toScene(input, options), {
21
- idPrefix: options.idPrefix ?? DEFAULT_ID_PREFIX,
13
+ return renderToSvgString(toScene(input, options), {
14
+ idPrefix: options.idPrefix ?? "r",
22
15
  animate: options.animate,
23
16
  snapshotAt: options.snapshotAt,
24
- easings: options.easings
25
- }), options.width, options.height);
17
+ easings: options.easings,
18
+ width: options.width,
19
+ height: options.height
20
+ });
26
21
  };
27
22
  //#endregion
28
23
  export { renderToSvgString$1 as renderToSvgString };
@@ -16,8 +16,8 @@ var createScopeBuilder = (sink) => {
16
16
  sink.push(require_coordinate.coordinate(...args));
17
17
  return self;
18
18
  },
19
- scope(config, build) {
20
- sink.push(scope(config, build));
19
+ scope(config, arg) {
20
+ sink.push(scope(config, arg));
21
21
  return self;
22
22
  }
23
23
  };
@@ -11,7 +11,7 @@ export type ScopeBuilder = {
11
11
  node: (...args: Parameters<typeof node>) => ScopeBuilder;
12
12
  draw: (...args: Parameters<typeof draw>) => ScopeBuilder;
13
13
  coordinate: (...args: Parameters<typeof coordinate>) => ScopeBuilder;
14
- scope: (config: ScopeConfig, build: (s: ScopeBuilder) => void) => ScopeBuilder;
14
+ scope: (config: ScopeConfig, arg: Array<Child> | ((s: ScopeBuilder) => void)) => ScopeBuilder;
15
15
  };
16
16
  /**
17
17
  * 构造一个 scope IR 子节点(分组容器 + 样式默认 + transforms)
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/builder/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,YAAY,CAAC;IACrE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,KAAK,YAAY,CAAC;CAChF,CAAC;AAwBF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,WAAW,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAG,KAS5F,CAAC"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/builder/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,YAAY,CAAC;IACzD,UAAU,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,YAAY,CAAC;IACrE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAK,YAAY,CAAC;CAC/F,CAAC;AAwBF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,QAAQ,WAAW,EAAE,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAG,KAS5F,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** 默认资源 id 前缀(确定性);多实例同页须经 `options.idPrefix` 显式区分。SSR(`renderToSvgString`) 与 mount(`mountSvg`) 共用同一默认,避免两处漂移导致资源 id 失配。 */
2
+ export declare const DEFAULT_ID_PREFIX = "r";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAC5H,eAAO,MAAM,iBAAiB,MAAM,CAAC"}
@@ -2,6 +2,7 @@ const require_isFigure = require("./builder/isFigure.cjs");
2
2
  const require_toScene = require("./toScene.cjs");
3
3
  const require_renderToSvgString = require("./renderToSvgString.cjs");
4
4
  const require_mountSvg = require("./mountSvg.cjs");
5
+ const require_mountCanvas = require("./mountCanvas.cjs");
5
6
  const require_coordinate = require("./builder/coordinate.cjs");
6
7
  const require_draw = require("./builder/draw.cjs");
7
8
  const require_node = require("./builder/node.cjs");
@@ -32,6 +33,9 @@ var createFigure = (config, children) => {
32
33
  mount(container, options) {
33
34
  return require_mountSvg.mountSvg(container, fig.ir, renderOptions(options));
34
35
  },
36
+ mountCanvas(container, options) {
37
+ return require_mountCanvas.mountCanvas(container, fig.ir, renderOptions(options));
38
+ },
35
39
  toSvgString(options) {
36
40
  return require_renderToSvgString.renderToSvgString(fig.ir, renderOptions(options));
37
41
  },
@@ -55,8 +59,8 @@ var createFigure = (config, children) => {
55
59
  children.push(require_coordinate.coordinate(id, coordConfig));
56
60
  return fig;
57
61
  },
58
- scope(scopeConfig, build) {
59
- children.push(require_scope.scope(scopeConfig, build));
62
+ scope(scopeConfig, arg) {
63
+ children.push(require_scope.scope(scopeConfig, arg));
60
64
  return fig;
61
65
  }
62
66
  };
@@ -4,22 +4,24 @@ import { FIGURE_BRAND } from './builder/isFigure';
4
4
  import { node } from './builder/node';
5
5
  import { ScopeBuilder } from './builder/scope';
6
6
  import { Child, CoordinateConfig, DrawConfig, FigureConfig, ScopeConfig, Way } from './builder/types';
7
- import { MountOptions, RenderToStringOptions, VanillaView } from './types';
7
+ import { CanvasView, MountCanvasOptions, MountOptions, RenderToStringOptions, VanillaView } from './types';
8
8
  /**
9
9
  * 命令式 builder 的装配产物 —— 唯一返回类型
10
10
  * @description hyperscript(`figure(config, children)`)与 fluent(`figure(config).node(...)`)都产它、可混用、`.ir` 一致。
11
- * `.mount`/`.toSvgString`/`.toCanvas` `this.ir`(IR,非 Figure)交底层 renderer;fluent 方法往内部 children 追加、链式返回 this。
11
+ * `.mount`/`.mountCanvas`(交互式挂载)/`.toSvgString`/`.toCanvas`(一次性产出)把 `this.ir`(IR,非 Figure)交底层
12
+ * renderer;fluent 方法往内部 children 追加、链式返回 this。
12
13
  */
13
14
  export type Figure = {
14
15
  readonly [FIGURE_BRAND]: true;
15
16
  readonly ir: IR;
16
17
  mount: (container: Element, options?: MountOptions) => VanillaView;
18
+ mountCanvas: (container: Element, options?: MountCanvasOptions) => CanvasView;
17
19
  toSvgString: (options?: RenderToStringOptions) => string;
18
20
  toCanvas: (canvas: HTMLCanvasElement, options?: RenderOptions) => void;
19
21
  node: (...args: Parameters<typeof node>) => Figure;
20
22
  draw: (way: Way, config?: DrawConfig) => Figure;
21
23
  coordinate: (id: string, config: CoordinateConfig) => Figure;
22
- scope: (config: ScopeConfig, build: (s: ScopeBuilder) => void) => Figure;
24
+ scope: (config: ScopeConfig, arg: Array<Child> | ((s: ScopeBuilder) => void)) => Figure;
23
25
  };
24
26
  /** figure() 的内部入口:装配 Figure(持 config + children,方法闭包其上) */
25
27
  export declare const createFigure: (config: FigureConfig, children: Array<Child>) => Figure;
@@ -1 +1 @@
1
- {"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/figure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3G,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,WAAW,CAAC;IACnE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,MAAM,CAAC;IACzD,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,KAAK,MAAM,CAAC;CAC1E,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,YAAY,GAAI,QAAQ,YAAY,EAAE,UAAU,KAAK,CAAC,KAAK,CAAC,KAAG,MAoD3E,CAAC"}
1
+ {"version":3,"file":"figure.d.ts","sourceRoot":"","sources":["../../src/figure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK3G,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhH;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,KAAK,WAAW,CAAC;IACnE,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,UAAU,CAAC;IAC9E,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,qBAAqB,KAAK,MAAM,CAAC;IACzD,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAC7D,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC;CACzF,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,YAAY,GAAI,QAAQ,YAAY,EAAE,UAAU,KAAK,CAAC,KAAK,CAAC,KAAG,MAwD3E,CAAC"}
@@ -9,6 +9,12 @@ const require_node = require("./builder/node.cjs");
9
9
  const require_scope = require("./builder/scope.cjs");
10
10
  const require_figure = require("./builder/figure.cjs");
11
11
  let _retikz_core = require("@retikz/core");
12
+ Object.defineProperty(exports, "DrawWay", {
13
+ enumerable: true,
14
+ get: function() {
15
+ return _retikz_core.DrawWay;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "blink", {
13
19
  enumerable: true,
14
20
  get: function() {
@@ -28,6 +34,24 @@ Object.defineProperty(exports, "colorShift", {
28
34
  }
29
35
  });
30
36
  exports.coordinate = require_coordinate.coordinate;
37
+ Object.defineProperty(exports, "defineArrow", {
38
+ enumerable: true,
39
+ get: function() {
40
+ return _retikz_core.defineArrow;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "definePathGenerator", {
44
+ enumerable: true,
45
+ get: function() {
46
+ return _retikz_core.definePathGenerator;
47
+ }
48
+ });
49
+ Object.defineProperty(exports, "definePattern", {
50
+ enumerable: true,
51
+ get: function() {
52
+ return _retikz_core.definePattern;
53
+ }
54
+ });
31
55
  exports.draw = require_draw.draw;
32
56
  Object.defineProperty(exports, "drawOn", {
33
57
  enumerable: true,
@@ -10,9 +10,15 @@ export { renderToSvgString } from './renderToSvgString';
10
10
  export { mountSvg } from './mountSvg';
11
11
  export { hydrate } from './hydrate';
12
12
  export { mountCanvas } from './mountCanvas';
13
- export type { RetikzEventName, HydrationHandlers, HydrationHandler, HydrationContext, HydrationAnimationControls, HydrationGeometry, } from '@retikz/render/hydration';
13
+ export type { RetikzEventValue, HydrationHandlers, HydrationHandler, HydrationContext, HydrationAnimationControls, HydrationGeometry, } from '@retikz/render/hydration';
14
14
  export { fadeIn, drawOn, scaleIn, grow, growUp, slideIn, colorShift, cameraTo, pulse, spin, loop, flash, blink, wiggle, stagger, } from '@retikz/core';
15
15
  export type { AnimationPresetOptions, ScaleInOptions, GrowUpOptions, SlideInOptions, ColorShiftOptions, CameraToOptions, PulseOptions, SpinOptions, LoopOptions, FlashOptions, BlinkOptions, WiggleOptions, } from '@retikz/core';
16
+ export { DrawWay } from '@retikz/core';
17
+ export type { WayItem, WayDSL, WayCycle, WayVia, WayRelativeItem, WayLabel, WayLabelOp, } from '@retikz/core';
18
+ export type { IRNodeTarget, IRAnchorRef } from '@retikz/core';
19
+ export { defineArrow, definePattern, definePathGenerator } from '@retikz/core';
20
+ export type { ArrowDefinition, ArrowEmitContext, PatternDefinition, PatternEmitContext, MarkerPrimitive, MarkerFill, PathGeneratorDefinition, PathGeneratorContext, IRJsonObject, } from '@retikz/core';
21
+ export type { AnimationPropertyDefinition, AnimationPropertyRegistry, CubicBezier, EasingFn, EasingRegistry, } from '@retikz/render/animation';
16
22
  export { figure } from './builder/figure';
17
23
  export { node } from './builder/node';
18
24
  export { draw } from './builder/draw';
@@ -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,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,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,EACV,iBAAiB,GAClB,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;AAE5C,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,eAAe,EACf,QAAQ,EACR,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC/E,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,WAAW,EACX,QAAQ,EACR,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,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,EACV,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
@@ -12,18 +12,22 @@ var resolveDevicePixelRatio = (override) => {
12
12
  };
13
13
  /**
14
14
  * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
15
- * @description 收 IR`toScene` compile、收 Scene 直用、收 Figure `figure.ir`。位图按「名义显示尺寸」
15
+ * @description 收 `Figure`delegate `figure.mountCanvas`(与 mountSvg→`figure.mount` 对称)。收 IR
16
+ * `toScene` compile、收 Scene 直用。位图按「名义显示尺寸」
16
17
  * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
17
18
  * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
18
19
  * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
19
20
  */
20
21
  var mountCanvas = (container, input, options = {}) => {
22
+ if (require_isFigure.isFigure(input)) return input.mountCanvas(container, options);
21
23
  if (typeof Element === "undefined" || !(container instanceof Element)) throw new Error("mountCanvas: container must be a DOM Element.");
22
24
  const canvas = document.createElement("canvas");
23
25
  const ratio = resolveDevicePixelRatio(options.devicePixelRatio);
24
26
  const animate = options.animate !== false && !(0, _retikz_render_animation.prefersReducedMotion)();
25
27
  let clock;
26
28
  const registry = (0, _retikz_render_animation.createIdClockRegistry)();
29
+ let visibleActivated = /* @__PURE__ */ new Set();
30
+ let visibleTeardown;
27
31
  let currentScene;
28
32
  /** 把全局帧时刻折算成单个 prim 的动画解析(per-id):stop→渲染 base;否则按有效时刻 + 是否含非自动播 track */
29
33
  const resolvePrim = (id, globalTime) => id !== void 0 && registry.isStopped(id) ? { mode: "skip" } : {
@@ -42,6 +46,41 @@ var mountCanvas = (container, input, options = {}) => {
42
46
  resolvePrimAnimation: (id) => resolvePrim(id, time)
43
47
  });
44
48
  };
49
+ const ensureClockPlaying = () => {
50
+ clock?.play();
51
+ };
52
+ /** Canvas visible trigger:按 canvas client rect 与 id 聚合 bbox 相交激活一次 */
53
+ const activateVisibleTracks = () => {
54
+ const ids = (0, _retikz_render_hydration.collectCanvasVisibleAnimationIds)(currentScene);
55
+ if (ids.size === 0) return;
56
+ let changed = false;
57
+ for (const id of ids) {
58
+ if (visibleActivated.has(id)) continue;
59
+ if (!(0, _retikz_render_hydration.isCanvasAnimationIdVisible)(canvas, currentScene, id)) continue;
60
+ registry.restart(id, clock?.time ?? 0);
61
+ visibleActivated.add(id);
62
+ changed = true;
63
+ }
64
+ if (!changed) return;
65
+ ensureClockPlaying();
66
+ renderFrame();
67
+ };
68
+ const resetVisibleBridge = () => {
69
+ visibleActivated = /* @__PURE__ */ new Set();
70
+ visibleTeardown?.();
71
+ visibleTeardown = void 0;
72
+ if (!animate || !(0, _retikz_render_animation.sceneHasAnimations)(currentScene)) return;
73
+ if ((0, _retikz_render_hydration.collectCanvasVisibleAnimationIds)(currentScene).size === 0 || typeof window === "undefined") return;
74
+ const schedule = () => activateVisibleTracks();
75
+ window.addEventListener("scroll", schedule, true);
76
+ window.addEventListener("resize", schedule);
77
+ const raf = window.requestAnimationFrame(schedule);
78
+ visibleTeardown = () => {
79
+ window.removeEventListener("scroll", schedule, true);
80
+ window.removeEventListener("resize", schedule);
81
+ window.cancelAnimationFrame(raf);
82
+ };
83
+ };
45
84
  const renderInto = (next) => {
46
85
  if (require_isFigure.isFigure(next)) throw new Error("mountCanvas: view.update does not accept a Figure; pass figure.ir instead.");
47
86
  const scene = require_toScene.toScene(next, options);
@@ -70,8 +109,9 @@ var mountCanvas = (container, input, options = {}) => {
70
109
  });
71
110
  if ((0, _retikz_render_animation.sceneHasAutoplayTrigger)(scene)) clock.play();
72
111
  }
112
+ resetVisibleBridge();
73
113
  };
74
- renderInto(require_isFigure.isFigure(input) ? input.ir : input);
114
+ renderInto(input);
75
115
  container.appendChild(canvas);
76
116
  /**
77
117
  * 把指针的 client 像素坐标逆 meet-fit 映射成 Scene user units
@@ -109,27 +149,24 @@ var mountCanvas = (container, input, options = {}) => {
109
149
  context2d?.setTransform(1, 0, 0, 1, 0, 0);
110
150
  return (0, _retikz_render_canvas.hitTest)(currentScene, scenePoint, { context2d });
111
151
  };
112
- const buildContext = (event, id) => {
113
- const mouse = event;
114
- return {
115
- id,
116
- meta: (0, _retikz_render_hydration.metaOf)(currentScene, id),
117
- renderer: "canvas",
118
- element: null,
119
- root: canvas,
120
- point: typeof mouse.clientX === "number" ? clientToScene(mouse.clientX, mouse.clientY) : null,
121
- geometry: (0, _retikz_render_hydration.geometryOf)(currentScene, id),
122
- animation: (0, _retikz_render_hydration.createCanvasIdAnimationControls)({
123
- registry,
124
- clockTime: () => clock?.time ?? 0,
125
- ensurePlaying: () => clock?.play(),
126
- renderFrame,
127
- defaultId: id
128
- }),
129
- scene: currentScene
130
- };
131
- };
132
- return { dispose: (0, _retikz_render_hydration.createHydrationController)(canvas, hydrateOptions.handlers, locate, buildContext).dispose };
152
+ const buildContext = (0, _retikz_render_hydration.createContextBuilder)({
153
+ renderer: "canvas",
154
+ root: canvas,
155
+ scene: () => currentScene,
156
+ resolveElement: () => null,
157
+ resolvePoint: (event) => {
158
+ const mouse = event;
159
+ return typeof mouse.clientX === "number" ? clientToScene(mouse.clientX, mouse.clientY) : null;
160
+ },
161
+ makeAnimation: (id) => (0, _retikz_render_hydration.createCanvasIdAnimationControls)({
162
+ registry,
163
+ clockTime: () => clock?.time ?? 0,
164
+ ensurePlaying: () => clock?.play(),
165
+ renderFrame,
166
+ defaultId: id
167
+ })
168
+ });
169
+ return { dispose: (0, _retikz_render_hydration.createHydrationController)(canvas, (0, _retikz_render_hydration.withCanvasAnimationEventHandlers)(currentScene, hydrateOptions.handlers), locate, buildContext).dispose };
133
170
  };
134
171
  return {
135
172
  root: canvas,
@@ -140,6 +177,7 @@ var mountCanvas = (container, input, options = {}) => {
140
177
  dispose() {
141
178
  if (disposed) return;
142
179
  disposed = true;
180
+ visibleTeardown?.();
143
181
  clock?.dispose();
144
182
  canvas.remove();
145
183
  },
@@ -1,7 +1,8 @@
1
1
  import { CanvasView, MountCanvasOptions, RenderInput } from './types';
2
2
  /**
3
3
  * 把 IR / Scene / Figure 挂成真实 `<canvas>` DOM(无框架浏览器 runtime,对齐 `mountSvg`)
4
- * @description 收 IR`toScene` compile、收 Scene 直用、收 Figure `figure.ir`。位图按「名义显示尺寸」
4
+ * @description 收 `Figure`delegate `figure.mountCanvas`(与 mountSvg→`figure.mount` 对称)。收 IR
5
+ * `toScene` compile、收 Scene 直用。位图按「名义显示尺寸」
5
6
  * `width`/`height`(均为有限数值时)× dpr 开、否则回退内容边界;`renderToCanvas` 再把 Scene 内容 meet-fit
6
7
  * 进去(镜像 SVG `preserveAspectRatio=meet` + CanvasHost)。返回的 `CanvasView` 暴露 `hydrate`(hitTest 定位)
7
8
  * 与 `clientToScene`(逆 meet-fit 坐标映射)。DOM 仅在调用时惰性触碰,`import` 本模块不碰 DOM——守 SSR 导入安全。
@@ -1 +1 @@
1
- {"version":3,"file":"mountCanvas.d.ts","sourceRoot":"","sources":["../../src/mountCanvas.ts"],"names":[],"mappings":"AAYA,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,UA6JF,CAAC"}
1
+ {"version":3,"file":"mountCanvas.d.ts","sourceRoot":"","sources":["../../src/mountCanvas.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAkB,kBAAkB,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AASvG;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,OAAO,EAClB,OAAO,WAAW,EAClB,UAAS,kBAAuB,KAC/B,UA2MF,CAAC"}
@@ -6,8 +6,6 @@ let _retikz_render_animation = require("@retikz/render/animation");
6
6
  let _retikz_render_hydration = require("@retikz/render/hydration");
7
7
  //#region src/mountSvg.ts
8
8
  var SVG_NS = "http://www.w3.org/2000/svg";
9
- /** 默认资源 id 前缀(确定性);多实例同页须经 `options.idPrefix` 显式区分 */
10
- var DEFAULT_ID_PREFIX = "r";
11
9
  /**
12
10
  * 把 IR / Scene / Figure 挂成真实 SVG DOM(无框架浏览器 runtime)
13
11
  * @description 收 `Figure` 时 delegate 给 `figure.mount`(Figure 自持 config,call-site options 覆盖)。收
@@ -18,7 +16,7 @@ var DEFAULT_ID_PREFIX = "r";
18
16
  var mountSvg = (container, input, options = {}) => {
19
17
  if (require_isFigure.isFigure(input)) return input.mount(container, options);
20
18
  if (typeof Element === "undefined" || !(container instanceof Element)) throw new Error("mountSvg: container must be a DOM Element.");
21
- const idPrefix = options.idPrefix ?? DEFAULT_ID_PREFIX;
19
+ const idPrefix = options.idPrefix ?? "r";
22
20
  const root = document.createElementNS(SVG_NS, "svg");
23
21
  const animate = options.animate !== false && !(0, _retikz_render_animation.prefersReducedMotion)();
24
22
  let animationControls;
@@ -51,16 +49,13 @@ var mountSvg = (container, input, options = {}) => {
51
49
  * `data-retikz-animation-owner` 双查 `getAnimations()` per-id 控制。
52
50
  */
53
51
  const hydrate = (hydrateOptions) => {
54
- const buildContext = (event, id) => ({
55
- id,
56
- meta: (0, _retikz_render_hydration.metaOf)(currentScene, id),
52
+ const buildContext = (0, _retikz_render_hydration.createContextBuilder)({
57
53
  renderer: "svg",
58
- element: (0, _retikz_render_hydration.resolveSvgElement)(event),
59
54
  root,
60
- point: (0, _retikz_render_hydration.resolvePointViaLayout)(root, currentScene.layout)(event),
61
- geometry: (0, _retikz_render_hydration.geometryOf)(currentScene, id),
62
- animation: (0, _retikz_render_hydration.createSvgAnimationControls)(root, id),
63
- scene: currentScene
55
+ scene: () => currentScene,
56
+ resolveElement: _retikz_render_hydration.resolveSvgElement,
57
+ resolvePoint: (event) => (0, _retikz_render_hydration.resolvePointViaLayout)(root, currentScene.layout)(event),
58
+ makeAnimation: (id) => (0, _retikz_render_hydration.createSvgAnimationControls)(root, id)
64
59
  });
65
60
  return { dispose: (0, _retikz_render_hydration.createHydrationController)(root, hydrateOptions.handlers, _retikz_render_hydration.locateSvg, buildContext).dispose };
66
61
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mountSvg.d.ts","sourceRoot":"","sources":["../../src/mountSvg.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAmC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAMvG;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,OAAO,EAAE,OAAO,WAAW,EAAE,UAAS,YAAiB,KAAG,WA4E7F,CAAC"}
1
+ {"version":3,"file":"mountSvg.d.ts","sourceRoot":"","sources":["../../src/mountSvg.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAmC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIvG;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,OAAO,EAAE,OAAO,WAAW,EAAE,UAAS,YAAiB,KAAG,WAyE7F,CAAC"}
@@ -2,27 +2,22 @@ const require_isFigure = require("./builder/isFigure.cjs");
2
2
  const require_toScene = require("./toScene.cjs");
3
3
  let _retikz_render_svg = require("@retikz/render/svg");
4
4
  //#region src/renderToSvgString.ts
5
- /** 默认资源 id 前缀(确定性);多实例同页须经 `options.idPrefix` 显式区分 */
6
- var DEFAULT_ID_PREFIX = "r";
7
- /** 把 `width`/`height` 注入到开头的 `<svg` 标签(@retikz/render/svg 只产 viewBox) */
8
- var injectSize = (svg, width, height) => {
9
- if (width === void 0 && height === void 0) return svg;
10
- const attrs = [width !== void 0 ? ` width="${width}"` : "", height !== void 0 ? ` height="${height}"` : ""].join("");
11
- return svg.replace(/^<svg/, `<svg${attrs}`);
12
- };
13
5
  /**
14
6
  * 把 IR / Scene / Figure 渲染成 SVG 字符串(SSR / 构建期)
15
7
  * @description 收 `Figure` 时 delegate 给 `figure.toSvgString`。收 IR/Scene 时薄包 `@retikz/render/svg`:`toScene`
16
- * (ir 缺省走 core fallback measurer、确定性)→ 序列化 → 若给 `width`/`height` 注入根 `<svg>`。零 DOM。
8
+ * (ir 缺省走 core fallback measurer、确定性)→ 序列化。`width`/`height` 直接透传给 render,由其结构化写进根
9
+ * `<svg>` attrs(不在本层对字符串做正则后处理)。零 DOM。
17
10
  */
18
11
  var renderToSvgString = (input, options = {}) => {
19
12
  if (require_isFigure.isFigure(input)) return input.toSvgString(options);
20
- return injectSize((0, _retikz_render_svg.renderToSvgString)(require_toScene.toScene(input, options), {
21
- idPrefix: options.idPrefix ?? DEFAULT_ID_PREFIX,
13
+ return (0, _retikz_render_svg.renderToSvgString)(require_toScene.toScene(input, options), {
14
+ idPrefix: options.idPrefix ?? "r",
22
15
  animate: options.animate,
23
16
  snapshotAt: options.snapshotAt,
24
- easings: options.easings
25
- }), options.width, options.height);
17
+ easings: options.easings,
18
+ width: options.width,
19
+ height: options.height
20
+ });
26
21
  };
27
22
  //#endregion
28
23
  exports.renderToSvgString = renderToSvgString;
@@ -2,7 +2,8 @@ import { RenderInput, RenderToStringOptions } from './types';
2
2
  /**
3
3
  * 把 IR / Scene / Figure 渲染成 SVG 字符串(SSR / 构建期)
4
4
  * @description 收 `Figure` 时 delegate 给 `figure.toSvgString`。收 IR/Scene 时薄包 `@retikz/render/svg`:`toScene`
5
- * (ir 缺省走 core fallback measurer、确定性)→ 序列化 → 若给 `width`/`height` 注入根 `<svg>`。零 DOM。
5
+ * (ir 缺省走 core fallback measurer、确定性)→ 序列化。`width`/`height` 直接透传给 render,由其结构化写进根
6
+ * `<svg>` attrs(不在本层对字符串做正则后处理)。零 DOM。
6
7
  */
7
8
  export declare const renderToSvgString: (input: RenderInput, options?: RenderToStringOptions) => string;
8
9
  //# sourceMappingURL=renderToSvgString.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderToSvgString.d.ts","sourceRoot":"","sources":["../../src/renderToSvgString.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAYlE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,EAAE,UAAS,qBAA0B,KAAG,MAS3F,CAAC"}
1
+ {"version":3,"file":"renderToSvgString.d.ts","sourceRoot":"","sources":["../../src/renderToSvgString.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,EAAE,UAAS,qBAA0B,KAAG,MAU3F,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@retikz/vanilla",
3
- "version": "0.3.0-alpha.5",
4
- "description": "Framework-free runtime for retikz: mount Scene/IR to SVG DOM, or render to SVG string for SSR.",
3
+ "version": "0.3.0-beta.1",
4
+ "description": "Framework-free retikz runtime: mount SVG/Canvas, hydrate interactions, control animations, or render SVG strings for SSR.",
5
5
  "type": "module",
6
6
  "author": "Pionpill",
7
7
  "homepage": "https://pionpill.github.io/retikz/",
@@ -39,15 +39,14 @@
39
39
  "dist/**/*"
40
40
  ],
41
41
  "dependencies": {
42
- "@retikz/core": "0.3.0-alpha.5",
43
- "@retikz/render": "0.3.0-alpha.5"
42
+ "@retikz/core": "0.3.0-beta.1",
43
+ "@retikz/render": "0.3.0-beta.1"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^25.6.0",
47
47
  "typescript": "^6.0.3",
48
48
  "vite": "^8.0.10",
49
49
  "vite-plugin-dts": "^4.5.4",
50
- "vite-tsconfig-paths": "^6.1.1",
51
50
  "vitest": "^4.1.5",
52
51
  "zod": "^3.23.8"
53
52
  },