@revideo/2d 0.1.10 → 0.2.1-alpha.891

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 (195) hide show
  1. package/lib/code/CodeCursor.d.ts +74 -74
  2. package/lib/code/CodeCursor.js +352 -286
  3. package/lib/code/CodeDiffer.d.ts +21 -16
  4. package/lib/code/CodeDiffer.js +39 -41
  5. package/lib/code/CodeFragment.d.ts +16 -8
  6. package/lib/code/CodeFragment.js +36 -36
  7. package/lib/code/CodeHighlighter.d.ts +59 -59
  8. package/lib/code/CodeHighlighter.js +1 -1
  9. package/lib/code/CodeMetrics.d.ts +12 -8
  10. package/lib/code/CodeMetrics.js +26 -24
  11. package/lib/code/CodeRange.d.ts +21 -5
  12. package/lib/code/CodeRange.js +131 -124
  13. package/lib/code/CodeScope.d.ts +18 -8
  14. package/lib/code/CodeScope.js +59 -61
  15. package/lib/code/CodeSelection.d.ts +9 -4
  16. package/lib/code/CodeSelection.js +8 -8
  17. package/lib/code/CodeSignal.d.ts +74 -47
  18. package/lib/code/CodeSignal.js +206 -189
  19. package/lib/code/CodeTokenizer.d.ts +1 -1
  20. package/lib/code/CodeTokenizer.js +41 -41
  21. package/lib/code/DefaultHighlightStyle.d.ts +2 -2
  22. package/lib/code/DefaultHighlightStyle.js +96 -96
  23. package/lib/code/LezerHighlighter.d.ts +21 -19
  24. package/lib/code/LezerHighlighter.js +101 -101
  25. package/lib/code/diff.d.ts +12 -9
  26. package/lib/code/diff.js +218 -205
  27. package/lib/code/extractRange.d.ts +7 -4
  28. package/lib/code/extractRange.js +79 -71
  29. package/lib/code/index.d.ts +1 -1
  30. package/lib/code/index.js +1 -1
  31. package/lib/components/Audio.d.ts +11 -11
  32. package/lib/components/Audio.js +115 -109
  33. package/lib/components/Bezier.d.ts +18 -18
  34. package/lib/components/Bezier.js +86 -75
  35. package/lib/components/Circle.d.ts +95 -90
  36. package/lib/components/Circle.js +85 -74
  37. package/lib/components/Code.d.ts +244 -211
  38. package/lib/components/Code.js +317 -269
  39. package/lib/components/CodeBlock.d.ts +109 -67
  40. package/lib/components/CodeBlock.js +414 -373
  41. package/lib/components/CubicBezier.d.ts +36 -36
  42. package/lib/components/CubicBezier.js +52 -49
  43. package/lib/components/Curve.d.ts +208 -198
  44. package/lib/components/Curve.js +270 -269
  45. package/lib/components/Grid.d.ts +47 -42
  46. package/lib/components/Grid.js +63 -56
  47. package/lib/components/Icon.d.ts +55 -50
  48. package/lib/components/Icon.js +58 -50
  49. package/lib/components/Img.d.ts +86 -79
  50. package/lib/components/Img.js +193 -181
  51. package/lib/components/Knot.d.ts +97 -78
  52. package/lib/components/Knot.js +81 -60
  53. package/lib/components/Latex.d.ts +12 -12
  54. package/lib/components/Latex.js +77 -65
  55. package/lib/components/Layout.d.ts +455 -413
  56. package/lib/components/Layout.js +666 -681
  57. package/lib/components/Line.d.ts +61 -49
  58. package/lib/components/Line.js +216 -193
  59. package/lib/components/Media.d.ts +35 -35
  60. package/lib/components/Media.js +135 -134
  61. package/lib/components/Node.d.ts +875 -830
  62. package/lib/components/Node.js +1383 -1314
  63. package/lib/components/Path.d.ts +35 -14
  64. package/lib/components/Path.js +100 -89
  65. package/lib/components/Polygon.d.ts +60 -55
  66. package/lib/components/Polygon.js +71 -66
  67. package/lib/components/QuadBezier.d.ts +29 -29
  68. package/lib/components/QuadBezier.js +50 -45
  69. package/lib/components/Ray.d.ts +28 -28
  70. package/lib/components/Ray.js +71 -64
  71. package/lib/components/Rect.d.ts +115 -108
  72. package/lib/components/Rect.js +78 -72
  73. package/lib/components/SVG.d.ts +165 -139
  74. package/lib/components/SVG.js +609 -541
  75. package/lib/components/Shape.d.ts +44 -35
  76. package/lib/components/Shape.js +112 -127
  77. package/lib/components/Spline.d.ts +46 -40
  78. package/lib/components/Spline.js +190 -175
  79. package/lib/components/Txt.d.ts +55 -44
  80. package/lib/components/Txt.js +156 -155
  81. package/lib/components/TxtLeaf.d.ts +20 -16
  82. package/lib/components/TxtLeaf.js +177 -158
  83. package/lib/components/Video.d.ts +41 -41
  84. package/lib/components/Video.js +138 -135
  85. package/lib/components/View2D.d.ts +21 -21
  86. package/lib/components/View2D.js +98 -85
  87. package/lib/components/index.d.ts +1 -1
  88. package/lib/components/index.js +1 -1
  89. package/lib/components/types.d.ts +22 -9
  90. package/lib/components/types.js +1 -1
  91. package/lib/curves/ArcSegment.d.ts +36 -24
  92. package/lib/curves/ArcSegment.js +145 -94
  93. package/lib/curves/CircleSegment.d.ts +26 -16
  94. package/lib/curves/CircleSegment.js +56 -49
  95. package/lib/curves/CubicBezierSegment.d.ts +18 -13
  96. package/lib/curves/CubicBezierSegment.js +79 -46
  97. package/lib/curves/CurveDrawingInfo.d.ts +9 -9
  98. package/lib/curves/CurveDrawingInfo.js +1 -1
  99. package/lib/curves/CurvePoint.d.ts +13 -13
  100. package/lib/curves/CurvePoint.js +1 -1
  101. package/lib/curves/CurveProfile.d.ts +5 -5
  102. package/lib/curves/CurveProfile.js +1 -1
  103. package/lib/curves/KnotInfo.d.ts +8 -8
  104. package/lib/curves/KnotInfo.js +1 -1
  105. package/lib/curves/LineSegment.d.ts +19 -14
  106. package/lib/curves/LineSegment.js +42 -42
  107. package/lib/curves/Polynomial.d.ts +110 -110
  108. package/lib/curves/Polynomial.js +249 -239
  109. package/lib/curves/Polynomial2D.d.ts +20 -20
  110. package/lib/curves/Polynomial2D.js +46 -42
  111. package/lib/curves/PolynomialSegment.d.ts +42 -37
  112. package/lib/curves/PolynomialSegment.js +83 -81
  113. package/lib/curves/QuadBezierSegment.d.ts +12 -12
  114. package/lib/curves/QuadBezierSegment.js +71 -41
  115. package/lib/curves/Segment.d.ts +12 -7
  116. package/lib/curves/Segment.js +2 -3
  117. package/lib/curves/UniformPolynomialCurveSampler.d.ts +34 -34
  118. package/lib/curves/UniformPolynomialCurveSampler.js +68 -62
  119. package/lib/curves/createCurveProfileLerp.d.ts +17 -6
  120. package/lib/curves/createCurveProfileLerp.js +211 -208
  121. package/lib/curves/getBezierSplineProfile.d.ts +8 -4
  122. package/lib/curves/getBezierSplineProfile.js +145 -101
  123. package/lib/curves/getCircleProfile.d.ts +10 -4
  124. package/lib/curves/getCircleProfile.js +72 -40
  125. package/lib/curves/getPathProfile.d.ts +2 -2
  126. package/lib/curves/getPathProfile.js +135 -112
  127. package/lib/curves/getPointAtDistance.d.ts +7 -4
  128. package/lib/curves/getPointAtDistance.js +12 -12
  129. package/lib/curves/getPolylineProfile.d.ts +8 -4
  130. package/lib/curves/getPolylineProfile.js +67 -54
  131. package/lib/curves/getRectProfile.d.ts +9 -4
  132. package/lib/curves/getRectProfile.js +117 -52
  133. package/lib/curves/index.d.ts +1 -1
  134. package/lib/curves/index.js +1 -1
  135. package/lib/decorators/canvasStyleSignal.d.ts +3 -3
  136. package/lib/decorators/canvasStyleSignal.js +10 -10
  137. package/lib/decorators/colorSignal.d.ts +1 -1
  138. package/lib/decorators/colorSignal.js +7 -7
  139. package/lib/decorators/compound.d.ts +4 -2
  140. package/lib/decorators/compound.js +43 -23
  141. package/lib/decorators/computed.d.ts +1 -1
  142. package/lib/decorators/computed.js +9 -9
  143. package/lib/decorators/defaultStyle.d.ts +5 -2
  144. package/lib/decorators/defaultStyle.js +11 -11
  145. package/lib/decorators/filtersSignal.d.ts +28 -8
  146. package/lib/decorators/filtersSignal.js +87 -64
  147. package/lib/decorators/index.d.ts +1 -1
  148. package/lib/decorators/index.js +1 -1
  149. package/lib/decorators/initializers.d.ts +5 -2
  150. package/lib/decorators/initializers.js +18 -19
  151. package/lib/decorators/nodeName.d.ts +1 -1
  152. package/lib/decorators/nodeName.js +4 -4
  153. package/lib/decorators/signal.d.ts +40 -20
  154. package/lib/decorators/signal.js +113 -104
  155. package/lib/decorators/spacingSignal.d.ts +1 -1
  156. package/lib/decorators/spacingSignal.js +13 -13
  157. package/lib/decorators/vector2Signal.d.ts +13 -7
  158. package/lib/decorators/vector2Signal.js +15 -13
  159. package/lib/index.d.ts +1 -1
  160. package/lib/index.js +1 -1
  161. package/lib/jsx-dev-runtime.d.ts +3 -3
  162. package/lib/jsx-dev-runtime.js +3 -3
  163. package/lib/jsx-runtime.d.ts +19 -9
  164. package/lib/jsx-runtime.js +18 -18
  165. package/lib/partials/Filter.d.ts +24 -16
  166. package/lib/partials/Filter.js +69 -69
  167. package/lib/partials/Gradient.d.ts +30 -24
  168. package/lib/partials/Gradient.js +69 -58
  169. package/lib/partials/Pattern.d.ts +14 -9
  170. package/lib/partials/Pattern.js +30 -24
  171. package/lib/partials/ShaderConfig.d.ts +81 -74
  172. package/lib/partials/ShaderConfig.js +22 -23
  173. package/lib/partials/index.d.ts +1 -1
  174. package/lib/partials/index.js +1 -1
  175. package/lib/partials/types.d.ts +19 -6
  176. package/lib/partials/types.js +1 -1
  177. package/lib/scenes/Scene2D.d.ts +42 -23
  178. package/lib/scenes/Scene2D.js +161 -151
  179. package/lib/scenes/index.d.ts +1 -1
  180. package/lib/scenes/index.js +1 -1
  181. package/lib/scenes/makeScene2D.d.ts +7 -5
  182. package/lib/scenes/makeScene2D.js +10 -10
  183. package/lib/scenes/useScene2D.d.ts +2 -2
  184. package/lib/scenes/useScene2D.js +3 -3
  185. package/lib/utils/CanvasUtils.d.ts +93 -21
  186. package/lib/utils/CanvasUtils.js +186 -105
  187. package/lib/utils/diff.d.ts +25 -18
  188. package/lib/utils/diff.js +84 -87
  189. package/lib/utils/index.d.ts +1 -1
  190. package/lib/utils/index.js +1 -1
  191. package/lib/utils/is.d.ts +4 -2
  192. package/lib/utils/is.js +2 -2
  193. package/lib/utils/makeSignalExtensions.d.ts +11 -4
  194. package/lib/utils/makeSignalExtensions.js +17 -17
  195. package/package.json +5 -5
@@ -1,21 +1,47 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1
+ var __decorate =
2
+ (this && this.__decorate) ||
3
+ function (decorators, target, key, desc) {
4
+ var c = arguments.length,
5
+ r =
6
+ c < 3
7
+ ? target
8
+ : desc === null
9
+ ? (desc = Object.getOwnPropertyDescriptor(target, key))
10
+ : desc,
11
+ d;
12
+ if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
13
+ r = Reflect.decorate(decorators, target, key, desc);
14
+ else
15
+ for (var i = decorators.length - 1; i >= 0; i--)
16
+ if ((d = decorators[i]))
17
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
18
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { BBox, Matrix2D, Vector2, all, clampRemap, delay, easeInOutSine, isReactive, lazy, threadable, tween, useLogger, } from '@revideo/core';
8
- import { computed, signal } from '../decorators';
9
- import { applyTransformDiff, getTransformDiff } from '../utils/diff';
10
- import { Circle } from './Circle';
11
- import { Img } from './Img';
12
- import { Layout } from './Layout';
13
- import { Line } from './Line';
14
- import { Node } from './Node';
15
- import { Path } from './Path';
16
- import { Rect } from './Rect';
17
- import { Shape } from './Shape';
18
- import { View2D } from './View2D';
19
+ };
20
+ import {
21
+ BBox,
22
+ Matrix2D,
23
+ Vector2,
24
+ all,
25
+ clampRemap,
26
+ delay,
27
+ easeInOutSine,
28
+ isReactive,
29
+ lazy,
30
+ threadable,
31
+ tween,
32
+ useLogger,
33
+ } from '@revideo/core';
34
+ import {computed, signal} from '../decorators';
35
+ import {applyTransformDiff, getTransformDiff} from '../utils/diff';
36
+ import {Circle} from './Circle';
37
+ import {Img} from './Img';
38
+ import {Layout} from './Layout';
39
+ import {Line} from './Line';
40
+ import {Node} from './Node';
41
+ import {Path} from './Path';
42
+ import {Rect} from './Rect';
43
+ import {Shape} from './Shape';
44
+ import {View2D} from './View2D';
19
45
  /**
20
46
  A Node for drawing and animating SVG images.
21
47
 
@@ -23,555 +49,597 @@ A Node for drawing and animating SVG images.
23
49
  If you're not interested in animating SVG, you can use {@link Img} instead.
24
50
  */
25
51
  export class SVG extends Shape {
26
- constructor(props) {
27
- super(props);
28
- this.lastTweenTargetSrc = null;
29
- this.lastTweenTargetDocument = null;
30
- this.wrapper = new Node({});
31
- this.wrapper.children(this.documentNodes);
32
- this.wrapper.scale(this.wrapperScale);
33
- this.add(this.wrapper);
34
- }
35
- /**
36
- * Get all SVG nodes with the given id.
37
- * @param id - An id to query.
38
- */
39
- getChildrenById(id) {
40
- return this.document()
41
- .nodes.filter(node => node.id === id)
42
- .map(({ shape }) => shape);
43
- }
44
- desiredSize() {
45
- const docSize = this.document().size;
46
- const scale = this.calculateWrapperScale(docSize, super.desiredSize());
47
- return docSize.mul(scale);
48
- }
49
- getCurrentSize() {
50
- return {
51
- x: this.width.isInitial() ? null : this.width(),
52
- y: this.height.isInitial() ? null : this.height(),
53
- };
54
- }
55
- calculateWrapperScale(documentSize, parentSize) {
56
- const result = new Vector2(1, 1);
57
- if (parentSize.x && parentSize.y) {
58
- result.x = parentSize.x / documentSize.width;
59
- result.y = parentSize.y / documentSize.height;
60
- }
61
- else if (parentSize.x && !parentSize.y) {
62
- result.x = parentSize.x / documentSize.width;
63
- result.y = result.x;
64
- }
65
- else if (!parentSize.x && parentSize.y) {
66
- result.y = parentSize.y / documentSize.height;
67
- result.x = result.y;
68
- }
69
- return result;
52
+ constructor(props) {
53
+ super(props);
54
+ this.lastTweenTargetSrc = null;
55
+ this.lastTweenTargetDocument = null;
56
+ this.wrapper = new Node({});
57
+ this.wrapper.children(this.documentNodes);
58
+ this.wrapper.scale(this.wrapperScale);
59
+ this.add(this.wrapper);
60
+ }
61
+ /**
62
+ * Get all SVG nodes with the given id.
63
+ * @param id - An id to query.
64
+ */
65
+ getChildrenById(id) {
66
+ return this.document()
67
+ .nodes.filter(node => node.id === id)
68
+ .map(({shape}) => shape);
69
+ }
70
+ desiredSize() {
71
+ const docSize = this.document().size;
72
+ const scale = this.calculateWrapperScale(docSize, super.desiredSize());
73
+ return docSize.mul(scale);
74
+ }
75
+ getCurrentSize() {
76
+ return {
77
+ x: this.width.isInitial() ? null : this.width(),
78
+ y: this.height.isInitial() ? null : this.height(),
79
+ };
80
+ }
81
+ calculateWrapperScale(documentSize, parentSize) {
82
+ const result = new Vector2(1, 1);
83
+ if (parentSize.x && parentSize.y) {
84
+ result.x = parentSize.x / documentSize.width;
85
+ result.y = parentSize.y / documentSize.height;
86
+ } else if (parentSize.x && !parentSize.y) {
87
+ result.x = parentSize.x / documentSize.width;
88
+ result.y = result.x;
89
+ } else if (!parentSize.x && parentSize.y) {
90
+ result.y = parentSize.y / documentSize.height;
91
+ result.x = result.y;
70
92
  }
71
- /**
72
- * Convert `SVGDocumentData` to `SVGDocument`.
73
- * @param data - `SVGDocumentData` to convert.
74
- */
75
- buildDocument(data) {
76
- return {
77
- size: data.size,
78
- nodes: data.nodes.map(ch => this.buildShape(ch)),
79
- };
93
+ return result;
94
+ }
95
+ /**
96
+ * Convert `SVGDocumentData` to `SVGDocument`.
97
+ * @param data - `SVGDocumentData` to convert.
98
+ */
99
+ buildDocument(data) {
100
+ return {
101
+ size: data.size,
102
+ nodes: data.nodes.map(ch => this.buildShape(ch)),
103
+ };
104
+ }
105
+ /**
106
+ * Convert `SVGShapeData` to `SVGShape`.
107
+ * @param data - `SVGShapeData` to convert.
108
+ */
109
+ buildShape({id, type, props, children}) {
110
+ return {
111
+ id,
112
+ shape: new type({
113
+ children: children?.map(ch => this.buildShape(ch).shape),
114
+ ...this.processElementStyle(props),
115
+ }),
116
+ };
117
+ }
118
+ /**
119
+ * Convert an SVG string to `SVGDocument`.
120
+ * @param svg - An SVG string to be parsed.
121
+ */
122
+ parseSVG(svg) {
123
+ return this.buildDocument(SVG.parseSVGData(svg));
124
+ }
125
+ /**
126
+ * Create a tweening list to tween between two SVG nodes.
127
+ * @param from - The initial node,
128
+ * @param to - The final node.
129
+ * @param duration - The duration of the tween.
130
+ * @param timing - The timing function.
131
+ */
132
+ *generateTransformer(from, to, duration, timing) {
133
+ yield from.position(to.position(), duration, timing);
134
+ yield from.scale(to.scale(), duration, timing);
135
+ yield from.rotation(to.rotation(), duration, timing);
136
+ if (
137
+ from instanceof Path &&
138
+ to instanceof Path &&
139
+ from.data() !== to.data()
140
+ ) {
141
+ yield from.data(to.data(), duration, timing);
80
142
  }
81
- /**
82
- * Convert `SVGShapeData` to `SVGShape`.
83
- * @param data - `SVGShapeData` to convert.
84
- */
85
- buildShape({ id, type, props, children }) {
86
- return {
87
- id,
88
- shape: new type({
89
- children: children?.map(ch => this.buildShape(ch).shape),
90
- ...this.processElementStyle(props),
91
- }),
92
- };
143
+ if (from instanceof Layout && to instanceof Layout) {
144
+ yield from.size(to.size(), duration, timing);
93
145
  }
94
- /**
95
- * Convert an SVG string to `SVGDocument`.
96
- * @param svg - An SVG string to be parsed.
97
- */
98
- parseSVG(svg) {
99
- return this.buildDocument(SVG.parseSVGData(svg));
146
+ if (from instanceof Shape && to instanceof Shape) {
147
+ yield from.fill(to.fill(), duration, timing);
148
+ yield from.stroke(to.stroke(), duration, timing);
149
+ yield from.lineWidth(to.lineWidth(), duration, timing);
100
150
  }
101
- /**
102
- * Create a tweening list to tween between two SVG nodes.
103
- * @param from - The initial node,
104
- * @param to - The final node.
105
- * @param duration - The duration of the tween.
106
- * @param timing - The timing function.
107
- */
108
- *generateTransformer(from, to, duration, timing) {
109
- yield from.position(to.position(), duration, timing);
110
- yield from.scale(to.scale(), duration, timing);
111
- yield from.rotation(to.rotation(), duration, timing);
112
- if (from instanceof Path &&
113
- to instanceof Path &&
114
- from.data() !== to.data()) {
115
- yield from.data(to.data(), duration, timing);
116
- }
117
- if (from instanceof Layout && to instanceof Layout) {
118
- yield from.size(to.size(), duration, timing);
119
- }
120
- if (from instanceof Shape && to instanceof Shape) {
121
- yield from.fill(to.fill(), duration, timing);
122
- yield from.stroke(to.stroke(), duration, timing);
123
- yield from.lineWidth(to.lineWidth(), duration, timing);
124
- }
125
- const fromChildren = from.children();
126
- const toChildren = to.children();
127
- for (let i = 0; i < fromChildren.length; i++) {
128
- yield* this.generateTransformer(fromChildren[i], toChildren[i], duration, timing);
129
- }
151
+ const fromChildren = from.children();
152
+ const toChildren = to.children();
153
+ for (let i = 0; i < fromChildren.length; i++) {
154
+ yield* this.generateTransformer(
155
+ fromChildren[i],
156
+ toChildren[i],
157
+ duration,
158
+ timing,
159
+ );
130
160
  }
131
- *tweenSvg(value, time, timingFunction) {
132
- const newValue = isReactive(value) ? value() : value;
133
- const newSVG = this.parseSVG(newValue);
134
- const currentSVG = this.document();
135
- const diff = getTransformDiff(currentSVG.nodes, newSVG.nodes);
136
- this.lastTweenTargetSrc = newValue;
137
- this.lastTweenTargetDocument = newSVG;
138
- applyTransformDiff(currentSVG.nodes, diff, ({ shape, ...rest }) => ({
139
- ...rest,
140
- shape: shape.clone(),
141
- }));
142
- this.wrapper.children(currentSVG.nodes.map(shape => shape.shape));
143
- for (const item of currentSVG.nodes) {
144
- item.shape.parent(this.wrapper);
145
- }
146
- const beginning = 0.2;
147
- const ending = 0.8;
148
- const overlap = 0.15;
149
- const transformator = [];
150
- const transformatorTime = (ending - beginning) * time;
151
- const transformatorDelay = beginning * time;
152
- for (const item of diff.transformed) {
153
- transformator.push(...this.generateTransformer(item.from.current.shape, item.to.current.shape, transformatorTime, timingFunction));
154
- }
155
- const autoWidth = this.width.isInitial();
156
- const autoHeight = this.height.isInitial();
157
- this.wrapper.scale(this.calculateWrapperScale(currentSVG.size, this.getCurrentSize()));
158
- const baseTween = tween(time, value => {
159
- const progress = timingFunction(value);
160
- const remapped = clampRemap(beginning, ending, 0, 1, progress);
161
- const scale = this.wrapper.scale();
162
- if (autoWidth) {
163
- this.width(easeInOutSine(remapped, currentSVG.size.x, newSVG.size.x) * scale.x);
164
- }
165
- if (autoHeight) {
166
- this.height(easeInOutSine(remapped, currentSVG.size.y, newSVG.size.y) * scale.y);
167
- }
168
- const deletedOpacity = clampRemap(0, beginning + overlap, 1, 0, progress);
169
- for (const { current } of diff.deleted) {
170
- current.shape.opacity(deletedOpacity);
171
- }
172
- const insertedOpacity = clampRemap(ending - overlap, 1, 0, 1, progress);
173
- for (const { current } of diff.inserted) {
174
- current.shape.opacity(insertedOpacity);
175
- }
176
- }, () => {
177
- this.wrapper.children(this.documentNodes);
178
- if (autoWidth)
179
- this.width.reset();
180
- if (autoHeight)
181
- this.height.reset();
182
- for (const { current } of diff.deleted)
183
- current.shape.dispose();
184
- for (const { from } of diff.transformed) {
185
- from.current.shape.dispose();
186
- }
187
- this.wrapper.scale(this.wrapperScale);
188
- });
189
- yield* all(this.wrapper.scale(this.calculateWrapperScale(newSVG.size, this.getCurrentSize()), time, timingFunction), baseTween, delay(transformatorDelay, all(...transformator)));
161
+ }
162
+ *tweenSvg(value, time, timingFunction) {
163
+ const newValue = isReactive(value) ? value() : value;
164
+ const newSVG = this.parseSVG(newValue);
165
+ const currentSVG = this.document();
166
+ const diff = getTransformDiff(currentSVG.nodes, newSVG.nodes);
167
+ this.lastTweenTargetSrc = newValue;
168
+ this.lastTweenTargetDocument = newSVG;
169
+ applyTransformDiff(currentSVG.nodes, diff, ({shape, ...rest}) => ({
170
+ ...rest,
171
+ shape: shape.clone(),
172
+ }));
173
+ this.wrapper.children(currentSVG.nodes.map(shape => shape.shape));
174
+ for (const item of currentSVG.nodes) {
175
+ item.shape.parent(this.wrapper);
190
176
  }
191
- wrapperScale() {
192
- return this.calculateWrapperScale(this.document().size, this.getCurrentSize());
177
+ const beginning = 0.2;
178
+ const ending = 0.8;
179
+ const overlap = 0.15;
180
+ const transformator = [];
181
+ const transformatorTime = (ending - beginning) * time;
182
+ const transformatorDelay = beginning * time;
183
+ for (const item of diff.transformed) {
184
+ transformator.push(
185
+ ...this.generateTransformer(
186
+ item.from.current.shape,
187
+ item.to.current.shape,
188
+ transformatorTime,
189
+ timingFunction,
190
+ ),
191
+ );
193
192
  }
194
- /**
195
- * Get the current `SVGDocument`.
196
- */
197
- document() {
198
- try {
199
- const src = this.svg();
200
- if (this.lastTweenTargetDocument && src === this.lastTweenTargetSrc) {
201
- return this.lastTweenTargetDocument;
202
- }
203
- return this.parseSVG(src);
193
+ const autoWidth = this.width.isInitial();
194
+ const autoHeight = this.height.isInitial();
195
+ this.wrapper.scale(
196
+ this.calculateWrapperScale(currentSVG.size, this.getCurrentSize()),
197
+ );
198
+ const baseTween = tween(
199
+ time,
200
+ value => {
201
+ const progress = timingFunction(value);
202
+ const remapped = clampRemap(beginning, ending, 0, 1, progress);
203
+ const scale = this.wrapper.scale();
204
+ if (autoWidth) {
205
+ this.width(
206
+ easeInOutSine(remapped, currentSVG.size.x, newSVG.size.x) * scale.x,
207
+ );
204
208
  }
205
- finally {
206
- this.lastTweenTargetSrc = null;
207
- this.lastTweenTargetDocument = null;
209
+ if (autoHeight) {
210
+ this.height(
211
+ easeInOutSine(remapped, currentSVG.size.y, newSVG.size.y) * scale.y,
212
+ );
208
213
  }
209
- }
210
- /**
211
- * Get current document nodes.
212
- */
213
- documentNodes() {
214
- return this.document().nodes.map(node => node.shape);
215
- }
216
- /**
217
- * Convert SVG colors in Shape properties to Motion Canvas colors.
218
- * @param param - Shape properties.
219
- * @returns Converted Shape properties.
220
- */
221
- processElementStyle({ fill, stroke, ...rest }) {
222
- return {
223
- fill: fill === 'currentColor' ? this.fill : SVG.processSVGColor(fill),
224
- stroke: stroke === 'currentColor' ? this.stroke : SVG.processSVGColor(stroke),
225
- ...rest,
226
- };
227
- }
228
- /**
229
- * Parse an SVG string as `SVGDocumentData`.
230
- * @param svg - And SVG string to be parsed.
231
- * @returns `SVGDocumentData` that can be used to build SVGDocument.
232
- */
233
- static parseSVGData(svg) {
234
- const cached = SVG.svgNodesPool[svg];
235
- if (cached && (cached.size.x > 0 || cached.size.y > 0))
236
- return cached;
237
- SVG.containerElement.innerHTML = svg;
238
- const svgRoot = SVG.containerElement.querySelector('svg');
239
- if (!svgRoot) {
240
- useLogger().error({
241
- message: 'Invalid SVG',
242
- object: svg,
243
- });
244
- return {
245
- size: new Vector2(0, 0),
246
- nodes: [],
247
- };
214
+ const deletedOpacity = clampRemap(
215
+ 0,
216
+ beginning + overlap,
217
+ 1,
218
+ 0,
219
+ progress,
220
+ );
221
+ for (const {current} of diff.deleted) {
222
+ current.shape.opacity(deletedOpacity);
248
223
  }
249
- let viewBox = new BBox();
250
- let size = new Vector2();
251
- const hasViewBox = svgRoot.hasAttribute('viewBox');
252
- const hasSize = svgRoot.hasAttribute('width') || svgRoot.hasAttribute('height');
253
- if (hasViewBox) {
254
- const { x, y, width, height } = svgRoot.viewBox.baseVal;
255
- viewBox = new BBox(x, y, width, height);
256
- if (!hasSize)
257
- size = viewBox.size;
224
+ const insertedOpacity = clampRemap(ending - overlap, 1, 0, 1, progress);
225
+ for (const {current} of diff.inserted) {
226
+ current.shape.opacity(insertedOpacity);
258
227
  }
259
- if (hasSize) {
260
- size = new Vector2(svgRoot.width.baseVal.value, svgRoot.height.baseVal.value);
261
- if (!hasViewBox)
262
- viewBox = new BBox(0, 0, size.width, size.height);
263
- }
264
- if (!hasViewBox && !hasSize) {
265
- viewBox = new BBox(svgRoot.getBBox());
266
- size = viewBox.size;
228
+ },
229
+ () => {
230
+ this.wrapper.children(this.documentNodes);
231
+ if (autoWidth) this.width.reset();
232
+ if (autoHeight) this.height.reset();
233
+ for (const {current} of diff.deleted) current.shape.dispose();
234
+ for (const {from} of diff.transformed) {
235
+ from.current.shape.dispose();
267
236
  }
268
- const scale = size.div(viewBox.size);
269
- const center = viewBox.center;
270
- const rootTransform = new DOMMatrix()
271
- .scaleSelf(scale.x, scale.y)
272
- .translateSelf(-center.x, -center.y);
273
- const nodes = Array.from(SVG.extractGroupNodes(svgRoot, svgRoot, rootTransform, {}));
274
- const builder = {
275
- size,
276
- nodes,
277
- };
278
- SVG.svgNodesPool[svg] = builder;
279
- return builder;
237
+ this.wrapper.scale(this.wrapperScale);
238
+ },
239
+ );
240
+ yield* all(
241
+ this.wrapper.scale(
242
+ this.calculateWrapperScale(newSVG.size, this.getCurrentSize()),
243
+ time,
244
+ timingFunction,
245
+ ),
246
+ baseTween,
247
+ delay(transformatorDelay, all(...transformator)),
248
+ );
249
+ }
250
+ wrapperScale() {
251
+ return this.calculateWrapperScale(
252
+ this.document().size,
253
+ this.getCurrentSize(),
254
+ );
255
+ }
256
+ /**
257
+ * Get the current `SVGDocument`.
258
+ */
259
+ document() {
260
+ try {
261
+ const src = this.svg();
262
+ if (this.lastTweenTargetDocument && src === this.lastTweenTargetSrc) {
263
+ return this.lastTweenTargetDocument;
264
+ }
265
+ return this.parseSVG(src);
266
+ } finally {
267
+ this.lastTweenTargetSrc = null;
268
+ this.lastTweenTargetDocument = null;
280
269
  }
281
- /**
282
- * Get position, rotation and scale from Matrix transformation as Shape properties
283
- * @param transform - Matrix transformation
284
- * @returns MotionCanvas Shape properties
285
- */
286
- static getMatrixTransformation(transform) {
287
- const matrix2 = new Matrix2D(transform);
288
- const position = matrix2.translation;
289
- const rotation = matrix2.rotation;
290
- // matrix.scaling can give incorrect result when matrix contain skew operation
291
- const scale = {
292
- x: matrix2.x.magnitude,
293
- y: matrix2.y.magnitude,
294
- };
295
- if (matrix2.determinant < 0) {
296
- if (matrix2.values[0] < matrix2.values[3])
297
- scale.x = -scale.x;
298
- else
299
- scale.y = -scale.y;
300
- }
301
- return {
302
- position,
303
- rotation,
304
- scale,
305
- };
270
+ }
271
+ /**
272
+ * Get current document nodes.
273
+ */
274
+ documentNodes() {
275
+ return this.document().nodes.map(node => node.shape);
276
+ }
277
+ /**
278
+ * Convert SVG colors in Shape properties to Motion Canvas colors.
279
+ * @param param - Shape properties.
280
+ * @returns Converted Shape properties.
281
+ */
282
+ processElementStyle({fill, stroke, ...rest}) {
283
+ return {
284
+ fill: fill === 'currentColor' ? this.fill : SVG.processSVGColor(fill),
285
+ stroke:
286
+ stroke === 'currentColor' ? this.stroke : SVG.processSVGColor(stroke),
287
+ ...rest,
288
+ };
289
+ }
290
+ /**
291
+ * Parse an SVG string as `SVGDocumentData`.
292
+ * @param svg - And SVG string to be parsed.
293
+ * @returns `SVGDocumentData` that can be used to build SVGDocument.
294
+ */
295
+ static parseSVGData(svg) {
296
+ const cached = SVG.svgNodesPool[svg];
297
+ if (cached && (cached.size.x > 0 || cached.size.y > 0)) return cached;
298
+ SVG.containerElement.innerHTML = svg;
299
+ const svgRoot = SVG.containerElement.querySelector('svg');
300
+ if (!svgRoot) {
301
+ useLogger().error({
302
+ message: 'Invalid SVG',
303
+ object: svg,
304
+ });
305
+ return {
306
+ size: new Vector2(0, 0),
307
+ nodes: [],
308
+ };
306
309
  }
307
- /**
308
- * Convert an SVG color into a Motion Canvas color.
309
- * @param color - SVG color.
310
- * @returns Motion Canvas color.
311
- */
312
- static processSVGColor(color) {
313
- if (color === 'transparent' || color === 'none') {
314
- return null;
315
- }
316
- return color;
310
+ let viewBox = new BBox();
311
+ let size = new Vector2();
312
+ const hasViewBox = svgRoot.hasAttribute('viewBox');
313
+ const hasSize =
314
+ svgRoot.hasAttribute('width') || svgRoot.hasAttribute('height');
315
+ if (hasViewBox) {
316
+ const {x, y, width, height} = svgRoot.viewBox.baseVal;
317
+ viewBox = new BBox(x, y, width, height);
318
+ if (!hasSize) size = viewBox.size;
317
319
  }
318
- /**
319
- * Get the final transformation matrix for the given SVG element.
320
- * @param element - SVG element.
321
- * @param parentTransform - The transformation matrix of the parent.
322
- */
323
- static getElementTransformation(element, parentTransform) {
324
- const transform = element.transform.baseVal.consolidate();
325
- const transformMatrix = (transform ? parentTransform.multiply(transform.matrix) : parentTransform).translate(SVG.parseNumberAttribute(element, 'x'), SVG.parseNumberAttribute(element, 'y'));
326
- return transformMatrix;
320
+ if (hasSize) {
321
+ size = new Vector2(
322
+ svgRoot.width.baseVal.value,
323
+ svgRoot.height.baseVal.value,
324
+ );
325
+ if (!hasViewBox) viewBox = new BBox(0, 0, size.width, size.height);
327
326
  }
328
- static parseLineCap(name) {
329
- if (!name)
330
- return null;
331
- if (name === 'butt' || name === 'round' || name === 'square')
332
- return name;
333
- useLogger().warn(`SVG: invalid line cap "${name}"`);
334
- return null;
327
+ if (!hasViewBox && !hasSize) {
328
+ viewBox = new BBox(svgRoot.getBBox());
329
+ size = viewBox.size;
335
330
  }
336
- static parseLineJoin(name) {
337
- if (!name)
338
- return null;
339
- if (name === 'bevel' || name === 'miter' || name === 'round')
340
- return name;
341
- if (name === 'arcs' || name === 'miter-clip') {
342
- useLogger().warn(`SVG: line join is not supported "${name}"`);
343
- }
344
- else {
345
- useLogger().warn(`SVG: invalid line join "${name}"`);
346
- }
347
- return null;
331
+ const scale = size.div(viewBox.size);
332
+ const center = viewBox.center;
333
+ const rootTransform = new DOMMatrix()
334
+ .scaleSelf(scale.x, scale.y)
335
+ .translateSelf(-center.x, -center.y);
336
+ const nodes = Array.from(
337
+ SVG.extractGroupNodes(svgRoot, svgRoot, rootTransform, {}),
338
+ );
339
+ const builder = {
340
+ size,
341
+ nodes,
342
+ };
343
+ SVG.svgNodesPool[svg] = builder;
344
+ return builder;
345
+ }
346
+ /**
347
+ * Get position, rotation and scale from Matrix transformation as Shape properties
348
+ * @param transform - Matrix transformation
349
+ * @returns MotionCanvas Shape properties
350
+ */
351
+ static getMatrixTransformation(transform) {
352
+ const matrix2 = new Matrix2D(transform);
353
+ const position = matrix2.translation;
354
+ const rotation = matrix2.rotation;
355
+ // matrix.scaling can give incorrect result when matrix contain skew operation
356
+ const scale = {
357
+ x: matrix2.x.magnitude,
358
+ y: matrix2.y.magnitude,
359
+ };
360
+ if (matrix2.determinant < 0) {
361
+ if (matrix2.values[0] < matrix2.values[3]) scale.x = -scale.x;
362
+ else scale.y = -scale.y;
348
363
  }
349
- static parseLineDash(value) {
350
- if (!value)
351
- return null;
352
- const list = value.split(/,|\s+/);
353
- if (list.findIndex(str => str.endsWith('%')) > 0) {
354
- useLogger().warn(`SVG: percentage line dash are ignored`);
355
- return null;
356
- }
357
- return list.map(str => parseFloat(str));
364
+ return {
365
+ position,
366
+ rotation,
367
+ scale,
368
+ };
369
+ }
370
+ /**
371
+ * Convert an SVG color into a Motion Canvas color.
372
+ * @param color - SVG color.
373
+ * @returns Motion Canvas color.
374
+ */
375
+ static processSVGColor(color) {
376
+ if (color === 'transparent' || color === 'none') {
377
+ return null;
358
378
  }
359
- static parseDashOffset(value) {
360
- if (!value)
361
- return null;
362
- const trimmed = value.trim();
363
- if (trimmed.endsWith('%')) {
364
- useLogger().warn(`SVG: percentage line dash offset are ignored`);
365
- }
366
- return parseFloat(trimmed);
379
+ return color;
380
+ }
381
+ /**
382
+ * Get the final transformation matrix for the given SVG element.
383
+ * @param element - SVG element.
384
+ * @param parentTransform - The transformation matrix of the parent.
385
+ */
386
+ static getElementTransformation(element, parentTransform) {
387
+ const transform = element.transform.baseVal.consolidate();
388
+ const transformMatrix = (
389
+ transform ? parentTransform.multiply(transform.matrix) : parentTransform
390
+ ).translate(
391
+ SVG.parseNumberAttribute(element, 'x'),
392
+ SVG.parseNumberAttribute(element, 'y'),
393
+ );
394
+ return transformMatrix;
395
+ }
396
+ static parseLineCap(name) {
397
+ if (!name) return null;
398
+ if (name === 'butt' || name === 'round' || name === 'square') return name;
399
+ useLogger().warn(`SVG: invalid line cap "${name}"`);
400
+ return null;
401
+ }
402
+ static parseLineJoin(name) {
403
+ if (!name) return null;
404
+ if (name === 'bevel' || name === 'miter' || name === 'round') return name;
405
+ if (name === 'arcs' || name === 'miter-clip') {
406
+ useLogger().warn(`SVG: line join is not supported "${name}"`);
407
+ } else {
408
+ useLogger().warn(`SVG: invalid line join "${name}"`);
367
409
  }
368
- static parseOpacity(value) {
369
- if (!value)
370
- return null;
371
- if (value.endsWith('%'))
372
- return parseFloat(value) / 100;
373
- return parseFloat(value);
410
+ return null;
411
+ }
412
+ static parseLineDash(value) {
413
+ if (!value) return null;
414
+ const list = value.split(/,|\s+/);
415
+ if (list.findIndex(str => str.endsWith('%')) > 0) {
416
+ useLogger().warn(`SVG: percentage line dash are ignored`);
417
+ return null;
374
418
  }
375
- /**
376
- * Convert the SVG element's style to a Motion Canvas Shape properties.
377
- * @param element - An SVG element whose style should be converted.
378
- * @param inheritedStyle - The parent style that should be inherited.
379
- */
380
- static getElementStyle(element, inheritedStyle) {
381
- return {
382
- fill: element.getAttribute('fill') ?? inheritedStyle.fill,
383
- stroke: element.getAttribute('stroke') ?? inheritedStyle.stroke,
384
- lineWidth: element.hasAttribute('stroke-width')
385
- ? parseFloat(element.getAttribute('stroke-width'))
386
- : inheritedStyle.lineWidth,
387
- lineCap: this.parseLineCap(element.getAttribute('stroke-linecap')) ??
388
- inheritedStyle.lineCap,
389
- lineJoin: this.parseLineJoin(element.getAttribute('stroke-linejoin')) ??
390
- inheritedStyle.lineJoin,
391
- lineDash: this.parseLineDash(element.getAttribute('stroke-dasharray')) ??
392
- inheritedStyle.lineDash,
393
- lineDashOffset: this.parseDashOffset(element.getAttribute('stroke-dashoffset')) ??
394
- inheritedStyle.lineDashOffset,
395
- opacity: this.parseOpacity(element.getAttribute('opacity')) ??
396
- inheritedStyle.opacity,
397
- layout: false,
398
- };
419
+ return list.map(str => parseFloat(str));
420
+ }
421
+ static parseDashOffset(value) {
422
+ if (!value) return null;
423
+ const trimmed = value.trim();
424
+ if (trimmed.endsWith('%')) {
425
+ useLogger().warn(`SVG: percentage line dash offset are ignored`);
399
426
  }
400
- /**
401
- * Extract `SVGShapeData` list from the SVG element's children.
402
- * This will not extract the current element's shape.
403
- * @param element - An element whose children will be extracted.
404
- * @param svgRoot - The SVG root ("svg" tag) of the element.
405
- * @param parentTransform - The transformation matrix applied to the parent.
406
- * @param inheritedStyle - The style of the current SVG `element` that the children should inherit.
407
- */
408
- static *extractGroupNodes(element, svgRoot, parentTransform, inheritedStyle) {
409
- for (const child of element.children) {
410
- if (!(child instanceof SVGGraphicsElement))
411
- continue;
412
- yield* this.extractElementNodes(child, svgRoot, parentTransform, inheritedStyle);
413
- }
414
- }
415
- /**
416
- * Parse a number from an SVG element attribute.
417
- * @param element - SVG element whose attribute will be parsed.
418
- * @param name - The name of the attribute to parse.
419
- * @returns a parsed number or `0` if the attribute is not defined.
420
- */
421
- static parseNumberAttribute(element, name) {
422
- return parseFloat(element.getAttribute(name) ?? '0');
427
+ return parseFloat(trimmed);
428
+ }
429
+ static parseOpacity(value) {
430
+ if (!value) return null;
431
+ if (value.endsWith('%')) return parseFloat(value) / 100;
432
+ return parseFloat(value);
433
+ }
434
+ /**
435
+ * Convert the SVG element's style to a Motion Canvas Shape properties.
436
+ * @param element - An SVG element whose style should be converted.
437
+ * @param inheritedStyle - The parent style that should be inherited.
438
+ */
439
+ static getElementStyle(element, inheritedStyle) {
440
+ return {
441
+ fill: element.getAttribute('fill') ?? inheritedStyle.fill,
442
+ stroke: element.getAttribute('stroke') ?? inheritedStyle.stroke,
443
+ lineWidth: element.hasAttribute('stroke-width')
444
+ ? parseFloat(element.getAttribute('stroke-width'))
445
+ : inheritedStyle.lineWidth,
446
+ lineCap:
447
+ this.parseLineCap(element.getAttribute('stroke-linecap')) ??
448
+ inheritedStyle.lineCap,
449
+ lineJoin:
450
+ this.parseLineJoin(element.getAttribute('stroke-linejoin')) ??
451
+ inheritedStyle.lineJoin,
452
+ lineDash:
453
+ this.parseLineDash(element.getAttribute('stroke-dasharray')) ??
454
+ inheritedStyle.lineDash,
455
+ lineDashOffset:
456
+ this.parseDashOffset(element.getAttribute('stroke-dashoffset')) ??
457
+ inheritedStyle.lineDashOffset,
458
+ opacity:
459
+ this.parseOpacity(element.getAttribute('opacity')) ??
460
+ inheritedStyle.opacity,
461
+ layout: false,
462
+ };
463
+ }
464
+ /**
465
+ * Extract `SVGShapeData` list from the SVG element's children.
466
+ * This will not extract the current element's shape.
467
+ * @param element - An element whose children will be extracted.
468
+ * @param svgRoot - The SVG root ("svg" tag) of the element.
469
+ * @param parentTransform - The transformation matrix applied to the parent.
470
+ * @param inheritedStyle - The style of the current SVG `element` that the children should inherit.
471
+ */
472
+ static *extractGroupNodes(element, svgRoot, parentTransform, inheritedStyle) {
473
+ for (const child of element.children) {
474
+ if (!(child instanceof SVGGraphicsElement)) continue;
475
+ yield* this.extractElementNodes(
476
+ child,
477
+ svgRoot,
478
+ parentTransform,
479
+ inheritedStyle,
480
+ );
423
481
  }
424
- /**
425
- * Extract `SVGShapeData` list from the SVG element.
426
- * This will also recursively extract shapes from its children.
427
- * @param child - An SVG element to extract.
428
- * @param svgRoot - The SVG root ("svg" tag) of the element.
429
- * @param parentTransform - The transformation matrix applied to the parent.
430
- * @param inheritedStyle - The style of the parent SVG element that the element should inherit.
431
- */
432
- static *extractElementNodes(child, svgRoot, parentTransform, inheritedStyle) {
433
- const transformMatrix = SVG.getElementTransformation(child, parentTransform);
434
- const style = SVG.getElementStyle(child, inheritedStyle);
435
- const id = child.id ?? '';
436
- if (child.tagName === 'g') {
437
- yield* SVG.extractGroupNodes(child, svgRoot, transformMatrix, style);
438
- }
439
- else if (child.tagName === 'use') {
440
- const hrefElement = svgRoot.querySelector(child.href.baseVal);
441
- if (!(hrefElement instanceof SVGGraphicsElement)) {
442
- useLogger().warn(`invalid SVG use tag. element "${child.outerHTML}"`);
443
- return;
444
- }
445
- yield* SVG.extractElementNodes(hrefElement, svgRoot, transformMatrix, inheritedStyle);
446
- }
447
- else if (child.tagName === 'path') {
448
- const data = child.getAttribute('d');
449
- if (!data) {
450
- useLogger().warn('blank path data at ' + child.id);
451
- return;
452
- }
453
- const transformation = transformMatrix;
454
- yield {
455
- id: id || 'path',
456
- type: Path,
457
- props: {
458
- data,
459
- tweenAlignPath: true,
460
- ...SVG.getMatrixTransformation(transformation),
461
- ...style,
462
- },
463
- };
464
- }
465
- else if (child.tagName === 'rect') {
466
- const width = SVG.parseNumberAttribute(child, 'width');
467
- const height = SVG.parseNumberAttribute(child, 'height');
468
- const rx = SVG.parseNumberAttribute(child, 'rx');
469
- const ry = SVG.parseNumberAttribute(child, 'ry');
470
- const bbox = new BBox(0, 0, width, height);
471
- const center = bbox.center;
472
- const transformation = transformMatrix.translate(center.x, center.y);
473
- yield {
474
- id: id || 'rect',
475
- type: Rect,
476
- props: {
477
- width,
478
- height,
479
- radius: [rx, ry],
480
- ...SVG.getMatrixTransformation(transformation),
481
- ...style,
482
- },
483
- };
484
- }
485
- else if (['circle', 'ellipse'].includes(child.tagName)) {
486
- const cx = SVG.parseNumberAttribute(child, 'cx');
487
- const cy = SVG.parseNumberAttribute(child, 'cy');
488
- const size = child.tagName === 'circle'
489
- ? SVG.parseNumberAttribute(child, 'r') * 2
490
- : [
491
- SVG.parseNumberAttribute(child, 'rx') * 2,
492
- SVG.parseNumberAttribute(child, 'ry') * 2,
493
- ];
494
- const transformation = transformMatrix.translate(cx, cy);
495
- yield {
496
- id: id || child.tagName,
497
- type: Circle,
498
- props: {
499
- size,
500
- ...style,
501
- ...SVG.getMatrixTransformation(transformation),
502
- },
503
- };
504
- }
505
- else if (['line', 'polyline', 'polygon'].includes(child.tagName)) {
506
- const numbers = child.tagName === 'line'
507
- ? ['x1', 'y1', 'x2', 'y2'].map(attr => SVG.parseNumberAttribute(child, attr))
508
- : child
509
- .getAttribute('points')
510
- .match(/-?[\d.e+-]+/g)
511
- .map(value => parseFloat(value));
512
- const points = numbers.reduce((accum, current) => {
513
- let last = accum.at(-1);
514
- if (!last || last.length === 2) {
515
- last = [];
516
- accum.push(last);
517
- }
518
- last.push(current);
519
- return accum;
520
- }, []);
521
- if (child.tagName === 'polygon')
522
- points.push(points[0]);
523
- yield {
524
- id: id || child.tagName,
525
- type: Line,
526
- props: {
527
- points,
528
- ...style,
529
- ...SVG.getMatrixTransformation(transformMatrix),
530
- },
531
- };
532
- }
533
- else if (child.tagName === 'image') {
534
- const x = SVG.parseNumberAttribute(child, 'x');
535
- const y = SVG.parseNumberAttribute(child, 'y');
536
- const width = SVG.parseNumberAttribute(child, 'width');
537
- const height = SVG.parseNumberAttribute(child, 'height');
538
- const href = child.getAttribute('href') ?? '';
539
- const bbox = new BBox(x, y, width, height);
540
- const center = bbox.center;
541
- const transformation = transformMatrix.translate(center.x, center.y);
542
- yield {
543
- id: id || child.tagName,
544
- type: Img,
545
- props: {
546
- src: href,
547
- ...style,
548
- ...SVG.getMatrixTransformation(transformation),
549
- },
550
- };
482
+ }
483
+ /**
484
+ * Parse a number from an SVG element attribute.
485
+ * @param element - SVG element whose attribute will be parsed.
486
+ * @param name - The name of the attribute to parse.
487
+ * @returns a parsed number or `0` if the attribute is not defined.
488
+ */
489
+ static parseNumberAttribute(element, name) {
490
+ return parseFloat(element.getAttribute(name) ?? '0');
491
+ }
492
+ /**
493
+ * Extract `SVGShapeData` list from the SVG element.
494
+ * This will also recursively extract shapes from its children.
495
+ * @param child - An SVG element to extract.
496
+ * @param svgRoot - The SVG root ("svg" tag) of the element.
497
+ * @param parentTransform - The transformation matrix applied to the parent.
498
+ * @param inheritedStyle - The style of the parent SVG element that the element should inherit.
499
+ */
500
+ static *extractElementNodes(child, svgRoot, parentTransform, inheritedStyle) {
501
+ const transformMatrix = SVG.getElementTransformation(
502
+ child,
503
+ parentTransform,
504
+ );
505
+ const style = SVG.getElementStyle(child, inheritedStyle);
506
+ const id = child.id ?? '';
507
+ if (child.tagName === 'g') {
508
+ yield* SVG.extractGroupNodes(child, svgRoot, transformMatrix, style);
509
+ } else if (child.tagName === 'use') {
510
+ const hrefElement = svgRoot.querySelector(child.href.baseVal);
511
+ if (!(hrefElement instanceof SVGGraphicsElement)) {
512
+ useLogger().warn(`invalid SVG use tag. element "${child.outerHTML}"`);
513
+ return;
514
+ }
515
+ yield* SVG.extractElementNodes(
516
+ hrefElement,
517
+ svgRoot,
518
+ transformMatrix,
519
+ inheritedStyle,
520
+ );
521
+ } else if (child.tagName === 'path') {
522
+ const data = child.getAttribute('d');
523
+ if (!data) {
524
+ useLogger().warn('blank path data at ' + child.id);
525
+ return;
526
+ }
527
+ const transformation = transformMatrix;
528
+ yield {
529
+ id: id || 'path',
530
+ type: Path,
531
+ props: {
532
+ data,
533
+ tweenAlignPath: true,
534
+ ...SVG.getMatrixTransformation(transformation),
535
+ ...style,
536
+ },
537
+ };
538
+ } else if (child.tagName === 'rect') {
539
+ const width = SVG.parseNumberAttribute(child, 'width');
540
+ const height = SVG.parseNumberAttribute(child, 'height');
541
+ const rx = SVG.parseNumberAttribute(child, 'rx');
542
+ const ry = SVG.parseNumberAttribute(child, 'ry');
543
+ const bbox = new BBox(0, 0, width, height);
544
+ const center = bbox.center;
545
+ const transformation = transformMatrix.translate(center.x, center.y);
546
+ yield {
547
+ id: id || 'rect',
548
+ type: Rect,
549
+ props: {
550
+ width,
551
+ height,
552
+ radius: [rx, ry],
553
+ ...SVG.getMatrixTransformation(transformation),
554
+ ...style,
555
+ },
556
+ };
557
+ } else if (['circle', 'ellipse'].includes(child.tagName)) {
558
+ const cx = SVG.parseNumberAttribute(child, 'cx');
559
+ const cy = SVG.parseNumberAttribute(child, 'cy');
560
+ const size =
561
+ child.tagName === 'circle'
562
+ ? SVG.parseNumberAttribute(child, 'r') * 2
563
+ : [
564
+ SVG.parseNumberAttribute(child, 'rx') * 2,
565
+ SVG.parseNumberAttribute(child, 'ry') * 2,
566
+ ];
567
+ const transformation = transformMatrix.translate(cx, cy);
568
+ yield {
569
+ id: id || child.tagName,
570
+ type: Circle,
571
+ props: {
572
+ size,
573
+ ...style,
574
+ ...SVG.getMatrixTransformation(transformation),
575
+ },
576
+ };
577
+ } else if (['line', 'polyline', 'polygon'].includes(child.tagName)) {
578
+ const numbers =
579
+ child.tagName === 'line'
580
+ ? ['x1', 'y1', 'x2', 'y2'].map(attr =>
581
+ SVG.parseNumberAttribute(child, attr),
582
+ )
583
+ : child
584
+ .getAttribute('points')
585
+ .match(/-?[\d.e+-]+/g)
586
+ .map(value => parseFloat(value));
587
+ const points = numbers.reduce((accum, current) => {
588
+ let last = accum.at(-1);
589
+ if (!last || last.length === 2) {
590
+ last = [];
591
+ accum.push(last);
551
592
  }
593
+ last.push(current);
594
+ return accum;
595
+ }, []);
596
+ if (child.tagName === 'polygon') points.push(points[0]);
597
+ yield {
598
+ id: id || child.tagName,
599
+ type: Line,
600
+ props: {
601
+ points,
602
+ ...style,
603
+ ...SVG.getMatrixTransformation(transformMatrix),
604
+ },
605
+ };
606
+ } else if (child.tagName === 'image') {
607
+ const x = SVG.parseNumberAttribute(child, 'x');
608
+ const y = SVG.parseNumberAttribute(child, 'y');
609
+ const width = SVG.parseNumberAttribute(child, 'width');
610
+ const height = SVG.parseNumberAttribute(child, 'height');
611
+ const href = child.getAttribute('href') ?? '';
612
+ const bbox = new BBox(x, y, width, height);
613
+ const center = bbox.center;
614
+ const transformation = transformMatrix.translate(center.x, center.y);
615
+ yield {
616
+ id: id || child.tagName,
617
+ type: Img,
618
+ props: {
619
+ src: href,
620
+ ...style,
621
+ ...SVG.getMatrixTransformation(transformation),
622
+ },
623
+ };
552
624
  }
625
+ }
553
626
  }
554
627
  SVG.svgNodesPool = {};
555
- __decorate([
556
- signal()
557
- ], SVG.prototype, "svg", void 0);
558
- __decorate([
559
- threadable()
560
- ], SVG.prototype, "tweenSvg", null);
561
- __decorate([
562
- computed()
563
- ], SVG.prototype, "wrapperScale", null);
564
- __decorate([
565
- computed()
566
- ], SVG.prototype, "document", null);
567
- __decorate([
568
- computed()
569
- ], SVG.prototype, "documentNodes", null);
570
- __decorate([
628
+ __decorate([signal()], SVG.prototype, 'svg', void 0);
629
+ __decorate([threadable()], SVG.prototype, 'tweenSvg', null);
630
+ __decorate([computed()], SVG.prototype, 'wrapperScale', null);
631
+ __decorate([computed()], SVG.prototype, 'document', null);
632
+ __decorate([computed()], SVG.prototype, 'documentNodes', null);
633
+ __decorate(
634
+ [
571
635
  lazy(() => {
572
- const element = document.createElement('div');
573
- View2D.shadowRoot.appendChild(element);
574
- return element;
575
- })
576
- ], SVG, "containerElement", void 0);
577
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1ZHLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL1NWRy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsSUFBSSxFQUNKLFFBQVEsRUFPUixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixLQUFLLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixJQUFJLEVBQ0osVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBQyxNQUFNLEVBQWMsTUFBTSxVQUFVLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBVyxNQUFNLE9BQU8sQ0FBQztBQUNwQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLFFBQVEsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFZLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLFNBQVMsQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBOENoQzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxHQUFJLFNBQVEsS0FBSztJQXVCNUIsWUFBbUIsS0FBZTtRQUNoQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFKUCx1QkFBa0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLDRCQUF1QixHQUF1QixJQUFJLENBQUM7UUFJ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
636
+ const element = document.createElement('div');
637
+ View2D.shadowRoot.appendChild(element);
638
+ return element;
639
+ }),
640
+ ],
641
+ SVG,
642
+ 'containerElement',
643
+ void 0,
644
+ );
645
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1ZHLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL1NWRy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsSUFBSSxFQUNKLFFBQVEsRUFPUixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixLQUFLLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixJQUFJLEVBQ0osVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBQyxNQUFNLEVBQWMsTUFBTSxVQUFVLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBVyxNQUFNLE9BQU8sQ0FBQztBQUNwQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLFFBQVEsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFZLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLFNBQVMsQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBOENoQzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxHQUFJLFNBQVEsS0FBSztJQXVCNUIsWUFBbUIsS0FBZTtRQUNoQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFKUCx1QkFBa0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLDRCQUF1QixHQUF1QixJQUFJLENBQUM7UUFJ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