@motion-script/web 0.1.0

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 (262) hide show
  1. package/README.md +47 -0
  2. package/dist/audio/player.d.ts +43 -0
  3. package/dist/audio/player.d.ts.map +1 -0
  4. package/dist/audio/player.js +165 -0
  5. package/dist/audio/player.js.map +1 -0
  6. package/dist/effects/bloom.d.ts +19 -0
  7. package/dist/effects/bloom.d.ts.map +1 -0
  8. package/dist/effects/bloom.js +64 -0
  9. package/dist/effects/bloom.js.map +1 -0
  10. package/dist/effects/blur.d.ts +8 -0
  11. package/dist/effects/blur.d.ts.map +1 -0
  12. package/dist/effects/blur.js +12 -0
  13. package/dist/effects/blur.js.map +1 -0
  14. package/dist/effects/bulge-pinch.d.ts +20 -0
  15. package/dist/effects/bulge-pinch.d.ts.map +1 -0
  16. package/dist/effects/bulge-pinch.js +86 -0
  17. package/dist/effects/bulge-pinch.js.map +1 -0
  18. package/dist/effects/chromatic-aberration.d.ts +19 -0
  19. package/dist/effects/chromatic-aberration.d.ts.map +1 -0
  20. package/dist/effects/chromatic-aberration.js +59 -0
  21. package/dist/effects/chromatic-aberration.js.map +1 -0
  22. package/dist/effects/effect.d.ts +32 -0
  23. package/dist/effects/effect.d.ts.map +1 -0
  24. package/dist/effects/effect.js +22 -0
  25. package/dist/effects/effect.js.map +1 -0
  26. package/dist/effects/grayscale.d.ts +12 -0
  27. package/dist/effects/grayscale.d.ts.map +1 -0
  28. package/dist/effects/grayscale.js +31 -0
  29. package/dist/effects/grayscale.js.map +1 -0
  30. package/dist/effects/index.d.ts +13 -0
  31. package/dist/effects/index.d.ts.map +1 -0
  32. package/dist/effects/index.js +13 -0
  33. package/dist/effects/index.js.map +1 -0
  34. package/dist/effects/pixelate.d.ts +23 -0
  35. package/dist/effects/pixelate.d.ts.map +1 -0
  36. package/dist/effects/pixelate.js +37 -0
  37. package/dist/effects/pixelate.js.map +1 -0
  38. package/dist/effects/registry.d.ts +17 -0
  39. package/dist/effects/registry.d.ts.map +1 -0
  40. package/dist/effects/registry.js +56 -0
  41. package/dist/effects/registry.js.map +1 -0
  42. package/dist/effects/sksl-cache.d.ts +6 -0
  43. package/dist/effects/sksl-cache.d.ts.map +1 -0
  44. package/dist/effects/sksl-cache.js +21 -0
  45. package/dist/effects/sksl-cache.js.map +1 -0
  46. package/dist/effects/sksl-layer.d.ts +30 -0
  47. package/dist/effects/sksl-layer.d.ts.map +1 -0
  48. package/dist/effects/sksl-layer.js +82 -0
  49. package/dist/effects/sksl-layer.js.map +1 -0
  50. package/dist/effects/texture.d.ts +31 -0
  51. package/dist/effects/texture.d.ts.map +1 -0
  52. package/dist/effects/texture.js +66 -0
  53. package/dist/effects/texture.js.map +1 -0
  54. package/dist/effects/vintage.d.ts +20 -0
  55. package/dist/effects/vintage.d.ts.map +1 -0
  56. package/dist/effects/vintage.js +47 -0
  57. package/dist/effects/vintage.js.map +1 -0
  58. package/dist/effects/zoom.d.ts +20 -0
  59. package/dist/effects/zoom.d.ts.map +1 -0
  60. package/dist/effects/zoom.js +65 -0
  61. package/dist/effects/zoom.js.map +1 -0
  62. package/dist/exporter.d.ts +24 -0
  63. package/dist/exporter.d.ts.map +1 -0
  64. package/dist/exporter.js +177 -0
  65. package/dist/exporter.js.map +1 -0
  66. package/dist/fills/conic-gradient.d.ts +12 -0
  67. package/dist/fills/conic-gradient.d.ts.map +1 -0
  68. package/dist/fills/conic-gradient.js +44 -0
  69. package/dist/fills/conic-gradient.js.map +1 -0
  70. package/dist/fills/filters/alpha.d.ts +9 -0
  71. package/dist/fills/filters/alpha.d.ts.map +1 -0
  72. package/dist/fills/filters/alpha.js +21 -0
  73. package/dist/fills/filters/alpha.js.map +1 -0
  74. package/dist/fills/filters/blur.d.ts +9 -0
  75. package/dist/fills/filters/blur.d.ts.map +1 -0
  76. package/dist/fills/filters/blur.js +12 -0
  77. package/dist/fills/filters/blur.js.map +1 -0
  78. package/dist/fills/filters/color-adjustment.d.ts +14 -0
  79. package/dist/fills/filters/color-adjustment.d.ts.map +1 -0
  80. package/dist/fills/filters/color-adjustment.js +147 -0
  81. package/dist/fills/filters/color-adjustment.js.map +1 -0
  82. package/dist/fills/filters/color-matrix.d.ts +9 -0
  83. package/dist/fills/filters/color-matrix.d.ts.map +1 -0
  84. package/dist/fills/filters/color-matrix.js +14 -0
  85. package/dist/fills/filters/color-matrix.js.map +1 -0
  86. package/dist/fills/filters/curves.d.ts +9 -0
  87. package/dist/fills/filters/curves.d.ts.map +1 -0
  88. package/dist/fills/filters/curves.js +89 -0
  89. package/dist/fills/filters/curves.js.map +1 -0
  90. package/dist/fills/filters/exposure.d.ts +9 -0
  91. package/dist/fills/filters/exposure.d.ts.map +1 -0
  92. package/dist/fills/filters/exposure.js +22 -0
  93. package/dist/fills/filters/exposure.js.map +1 -0
  94. package/dist/fills/filters/filter.d.ts +17 -0
  95. package/dist/fills/filters/filter.d.ts.map +1 -0
  96. package/dist/fills/filters/filter.js +16 -0
  97. package/dist/fills/filters/filter.js.map +1 -0
  98. package/dist/fills/filters/grayscale.d.ts +9 -0
  99. package/dist/fills/filters/grayscale.d.ts.map +1 -0
  100. package/dist/fills/filters/grayscale.js +25 -0
  101. package/dist/fills/filters/grayscale.js.map +1 -0
  102. package/dist/fills/filters/registry.d.ts +16 -0
  103. package/dist/fills/filters/registry.d.ts.map +1 -0
  104. package/dist/fills/filters/registry.js +50 -0
  105. package/dist/fills/filters/registry.js.map +1 -0
  106. package/dist/fills/gradient-cache.d.ts +29 -0
  107. package/dist/fills/gradient-cache.d.ts.map +1 -0
  108. package/dist/fills/gradient-cache.js +57 -0
  109. package/dist/fills/gradient-cache.js.map +1 -0
  110. package/dist/fills/handler.d.ts +49 -0
  111. package/dist/fills/handler.d.ts.map +1 -0
  112. package/dist/fills/handler.js +172 -0
  113. package/dist/fills/handler.js.map +1 -0
  114. package/dist/fills/image.d.ts +34 -0
  115. package/dist/fills/image.d.ts.map +1 -0
  116. package/dist/fills/image.js +91 -0
  117. package/dist/fills/image.js.map +1 -0
  118. package/dist/fills/linear-gradient.d.ts +12 -0
  119. package/dist/fills/linear-gradient.d.ts.map +1 -0
  120. package/dist/fills/linear-gradient.js +48 -0
  121. package/dist/fills/linear-gradient.js.map +1 -0
  122. package/dist/fills/noise.d.ts +11 -0
  123. package/dist/fills/noise.d.ts.map +1 -0
  124. package/dist/fills/noise.js +82 -0
  125. package/dist/fills/noise.js.map +1 -0
  126. package/dist/fills/radial-gradient.d.ts +9 -0
  127. package/dist/fills/radial-gradient.d.ts.map +1 -0
  128. package/dist/fills/radial-gradient.js +43 -0
  129. package/dist/fills/radial-gradient.js.map +1 -0
  130. package/dist/fills/registry.d.ts +10 -0
  131. package/dist/fills/registry.d.ts.map +1 -0
  132. package/dist/fills/registry.js +34 -0
  133. package/dist/fills/registry.js.map +1 -0
  134. package/dist/fills/renderer.d.ts +24 -0
  135. package/dist/fills/renderer.d.ts.map +1 -0
  136. package/dist/fills/renderer.js +5 -0
  137. package/dist/fills/renderer.js.map +1 -0
  138. package/dist/fills/solid.d.ts +7 -0
  139. package/dist/fills/solid.d.ts.map +1 -0
  140. package/dist/fills/solid.js +13 -0
  141. package/dist/fills/solid.js.map +1 -0
  142. package/dist/fills/stripe.d.ts +7 -0
  143. package/dist/fills/stripe.d.ts.map +1 -0
  144. package/dist/fills/stripe.js +85 -0
  145. package/dist/fills/stripe.js.map +1 -0
  146. package/dist/fills/video.d.ts +6 -0
  147. package/dist/fills/video.d.ts.map +1 -0
  148. package/dist/fills/video.js +14 -0
  149. package/dist/fills/video.js.map +1 -0
  150. package/dist/font-style.d.ts +23 -0
  151. package/dist/font-style.d.ts.map +1 -0
  152. package/dist/font-style.js +34 -0
  153. package/dist/font-style.js.map +1 -0
  154. package/dist/getter.d.ts +9 -0
  155. package/dist/getter.d.ts.map +1 -0
  156. package/dist/getter.js +26 -0
  157. package/dist/getter.js.map +1 -0
  158. package/dist/index.d.ts +9 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +11 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/master-clock.d.ts +42 -0
  163. package/dist/master-clock.d.ts.map +1 -0
  164. package/dist/master-clock.js +134 -0
  165. package/dist/master-clock.js.map +1 -0
  166. package/dist/measure-scope.d.ts +14 -0
  167. package/dist/measure-scope.d.ts.map +1 -0
  168. package/dist/measure-scope.js +29 -0
  169. package/dist/measure-scope.js.map +1 -0
  170. package/dist/render-context.d.ts +107 -0
  171. package/dist/render-context.d.ts.map +1 -0
  172. package/dist/render-context.js +940 -0
  173. package/dist/render-context.js.map +1 -0
  174. package/dist/shapes/alpha-contour.d.ts +27 -0
  175. package/dist/shapes/alpha-contour.d.ts.map +1 -0
  176. package/dist/shapes/alpha-contour.js +330 -0
  177. package/dist/shapes/alpha-contour.js.map +1 -0
  178. package/dist/shapes/base.d.ts +46 -0
  179. package/dist/shapes/base.d.ts.map +1 -0
  180. package/dist/shapes/base.js +95 -0
  181. package/dist/shapes/base.js.map +1 -0
  182. package/dist/shapes/boolean.d.ts +28 -0
  183. package/dist/shapes/boolean.d.ts.map +1 -0
  184. package/dist/shapes/boolean.js +90 -0
  185. package/dist/shapes/boolean.js.map +1 -0
  186. package/dist/shapes/ellipse.d.ts +32 -0
  187. package/dist/shapes/ellipse.d.ts.map +1 -0
  188. package/dist/shapes/ellipse.js +50 -0
  189. package/dist/shapes/ellipse.js.map +1 -0
  190. package/dist/shapes/image.d.ts +66 -0
  191. package/dist/shapes/image.d.ts.map +1 -0
  192. package/dist/shapes/image.js +214 -0
  193. package/dist/shapes/image.js.map +1 -0
  194. package/dist/shapes/index.d.ts +67 -0
  195. package/dist/shapes/index.d.ts.map +1 -0
  196. package/dist/shapes/index.js +297 -0
  197. package/dist/shapes/index.js.map +1 -0
  198. package/dist/shapes/line.d.ts +25 -0
  199. package/dist/shapes/line.d.ts.map +1 -0
  200. package/dist/shapes/line.js +87 -0
  201. package/dist/shapes/line.js.map +1 -0
  202. package/dist/shapes/mask.d.ts +28 -0
  203. package/dist/shapes/mask.d.ts.map +1 -0
  204. package/dist/shapes/mask.js +106 -0
  205. package/dist/shapes/mask.js.map +1 -0
  206. package/dist/shapes/paragraph-layout.d.ts +64 -0
  207. package/dist/shapes/paragraph-layout.d.ts.map +1 -0
  208. package/dist/shapes/paragraph-layout.js +156 -0
  209. package/dist/shapes/paragraph-layout.js.map +1 -0
  210. package/dist/shapes/path.d.ts +29 -0
  211. package/dist/shapes/path.d.ts.map +1 -0
  212. package/dist/shapes/path.js +71 -0
  213. package/dist/shapes/path.js.map +1 -0
  214. package/dist/shapes/polygon.d.ts +33 -0
  215. package/dist/shapes/polygon.d.ts.map +1 -0
  216. package/dist/shapes/polygon.js +86 -0
  217. package/dist/shapes/polygon.js.map +1 -0
  218. package/dist/shapes/polygram.d.ts +34 -0
  219. package/dist/shapes/polygram.d.ts.map +1 -0
  220. package/dist/shapes/polygram.js +90 -0
  221. package/dist/shapes/polygram.js.map +1 -0
  222. package/dist/shapes/rect.d.ts +41 -0
  223. package/dist/shapes/rect.d.ts.map +1 -0
  224. package/dist/shapes/rect.js +111 -0
  225. package/dist/shapes/rect.js.map +1 -0
  226. package/dist/shapes/richtext.d.ts +28 -0
  227. package/dist/shapes/richtext.d.ts.map +1 -0
  228. package/dist/shapes/richtext.js +32 -0
  229. package/dist/shapes/richtext.js.map +1 -0
  230. package/dist/shapes/shape-handler.d.ts +79 -0
  231. package/dist/shapes/shape-handler.d.ts.map +1 -0
  232. package/dist/shapes/shape-handler.js +304 -0
  233. package/dist/shapes/shape-handler.js.map +1 -0
  234. package/dist/shapes/text.d.ts +13 -0
  235. package/dist/shapes/text.d.ts.map +1 -0
  236. package/dist/shapes/text.js +67 -0
  237. package/dist/shapes/text.js.map +1 -0
  238. package/dist/shapes/trim.d.ts +10 -0
  239. package/dist/shapes/trim.d.ts.map +1 -0
  240. package/dist/shapes/trim.js +49 -0
  241. package/dist/shapes/trim.js.map +1 -0
  242. package/dist/storage-adapter.d.ts +56 -0
  243. package/dist/storage-adapter.d.ts.map +1 -0
  244. package/dist/storage-adapter.js +188 -0
  245. package/dist/storage-adapter.js.map +1 -0
  246. package/dist/stroke/index.d.ts +34 -0
  247. package/dist/stroke/index.d.ts.map +1 -0
  248. package/dist/stroke/index.js +360 -0
  249. package/dist/stroke/index.js.map +1 -0
  250. package/dist/stroke/stroke-handler.d.ts +45 -0
  251. package/dist/stroke/stroke-handler.d.ts.map +1 -0
  252. package/dist/stroke/stroke-handler.js +371 -0
  253. package/dist/stroke/stroke-handler.js.map +1 -0
  254. package/dist/video/extract.d.ts +54 -0
  255. package/dist/video/extract.d.ts.map +1 -0
  256. package/dist/video/extract.js +192 -0
  257. package/dist/video/extract.js.map +1 -0
  258. package/dist/video/extract.worker.d.ts +50 -0
  259. package/dist/video/extract.worker.d.ts.map +1 -0
  260. package/dist/video/extract.worker.js +224 -0
  261. package/dist/video/extract.worker.js.map +1 -0
  262. package/package.json +57 -0
@@ -0,0 +1,111 @@
1
+ import { isUniformBorderRadius, isZeroBorderRadius, resolveBorderRadius, withRectDescriptor, } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ function roundedRectToSvg(l, t, r, b, tl, tr, br, bl) {
4
+ return [
5
+ `M ${l + tl} ${t}`,
6
+ `L ${r - tr} ${t}`,
7
+ tr > 0 ? `A ${tr} ${tr} 0 0 1 ${r} ${t + tr}` : "",
8
+ `L ${r} ${b - br}`,
9
+ br > 0 ? `A ${br} ${br} 0 0 1 ${r - br} ${b}` : "",
10
+ `L ${l + bl} ${b}`,
11
+ bl > 0 ? `A ${bl} ${bl} 0 0 1 ${l} ${b - bl}` : "",
12
+ `L ${l} ${t + tl}`,
13
+ tl > 0 ? `A ${tl} ${tl} 0 0 1 ${l + tl} ${t}` : "",
14
+ "Z",
15
+ ].filter(Boolean).join(" ");
16
+ }
17
+ /**
18
+ * Rect with optional per-corner radii. Radii are scaled down uniformly when
19
+ * they'd overlap (sum exceeds the side length) to avoid self-intersecting
20
+ * geometry. Isolated, untrimmed rects skip the SVG-path route entirely and
21
+ * draw/clip via `drawRect`/`drawRRect` for cheaper rendering and crisper edges.
22
+ */
23
+ export class RectShape extends BaseShape {
24
+ resolveState(state) {
25
+ return withRectDescriptor(state);
26
+ }
27
+ computeGeometry() {
28
+ const s = this.fullState;
29
+ const halfWidth = s.width / 2;
30
+ const halfHeight = s.height / 2;
31
+ const left = s.x - halfWidth;
32
+ const top = s.y - halfHeight;
33
+ const right = s.x + halfWidth;
34
+ const bottom = s.y + halfHeight;
35
+ const rawBr = resolveBorderRadius(s.borderRadius);
36
+ let tl = Math.max(0, rawBr.topLeft);
37
+ let tr = Math.max(0, rawBr.topRight);
38
+ let br = Math.max(0, rawBr.bottomRight);
39
+ let bl = Math.max(0, rawBr.bottomLeft);
40
+ const w = s.width;
41
+ const h = s.height;
42
+ const scaleTop = tl + tr > 0 ? Math.min(1, w / (tl + tr)) : 1;
43
+ const scaleBottom = bl + br > 0 ? Math.min(1, w / (bl + br)) : 1;
44
+ const scaleLeft = tl + bl > 0 ? Math.min(1, h / (tl + bl)) : 1;
45
+ const scaleRight = tr + br > 0 ? Math.min(1, h / (tr + br)) : 1;
46
+ const scale = Math.min(scaleTop, scaleBottom, scaleLeft, scaleRight);
47
+ tl *= scale;
48
+ tr *= scale;
49
+ br *= scale;
50
+ bl *= scale;
51
+ const resolved = { topLeft: tl, topRight: tr, bottomRight: br, bottomLeft: bl };
52
+ return {
53
+ left, top, right, bottom,
54
+ tl, tr, br, bl,
55
+ isZero: isZeroBorderRadius(resolved),
56
+ isUniform: isUniformBorderRadius(resolved),
57
+ };
58
+ }
59
+ buildSVGPath(geo) {
60
+ const { left, top, right, bottom, tl, tr, br, bl, isZero, isUniform } = geo;
61
+ if (isZero) {
62
+ return `M ${left} ${top} L ${right} ${top} L ${right} ${bottom} L ${left} ${bottom} Z`;
63
+ }
64
+ if (isUniform) {
65
+ return roundedRectToSvg(left, top, right, bottom, tl, tl, tl, tl);
66
+ }
67
+ return roundedRectToSvg(left, top, right, bottom, tl, tr, br, bl);
68
+ }
69
+ needsTrim() {
70
+ return this.fullState.start !== 0 || this.fullState.end !== 1;
71
+ }
72
+ getTrimRange() {
73
+ return { start: this.fullState.start, end: this.fullState.end };
74
+ }
75
+ computeBounds(geo) {
76
+ return { left: geo.left, top: geo.top, right: geo.right, bottom: geo.bottom };
77
+ }
78
+ draw(paint, isolated) {
79
+ const geo = this.geometry;
80
+ if (isolated && !this.needsTrim()) {
81
+ const ck = this.canvasKit;
82
+ const ltrb = ck.LTRBRect(geo.left, geo.top, geo.right, geo.bottom);
83
+ if (geo.isZero) {
84
+ this.canvas.drawRect(ltrb, paint);
85
+ return;
86
+ }
87
+ if (geo.isUniform) {
88
+ this.canvas.drawRRect(ck.RRectXY(ltrb, geo.tl, geo.tl), paint);
89
+ return;
90
+ }
91
+ }
92
+ super.draw(paint, isolated);
93
+ }
94
+ clip(isolated) {
95
+ const geo = this.geometry;
96
+ const ck = this.canvasKit;
97
+ if (isolated && !this.needsTrim()) {
98
+ const ltrb = ck.LTRBRect(geo.left, geo.top, geo.right, geo.bottom);
99
+ if (geo.isZero) {
100
+ this.canvas.clipRect(ltrb, ck.ClipOp.Intersect, true);
101
+ return;
102
+ }
103
+ if (geo.isUniform) {
104
+ this.canvas.clipRRect(ck.RRectXY(ltrb, geo.tl, geo.tl), ck.ClipOp.Intersect, true);
105
+ return;
106
+ }
107
+ }
108
+ super.clip(isolated);
109
+ }
110
+ }
111
+ //# sourceMappingURL=rect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rect.js","sourceRoot":"","sources":["../../src/shapes/rect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { CanvasKit, Font, TypefaceFontProvider } from "@motion-script/canvaskit";
2
+ import { RichTextState, ResolvedTextSpan } from "@motion-script/core";
3
+ import { type ShapedRun } from "./paragraph-layout";
4
+ /**
5
+ * A shaped run ready to draw, paired with the span that styled it so the
6
+ * caller can apply that span's resolved fills/strokes.
7
+ */
8
+ export interface LaidOutRun extends ShapedRun {
9
+ span: ResolvedTextSpan;
10
+ }
11
+ export interface RichTextLayout {
12
+ runs: LaidOutRun[];
13
+ bounds: {
14
+ left: number;
15
+ top: number;
16
+ right: number;
17
+ bottom: number;
18
+ };
19
+ /** Fonts created during layout. Caller must delete() each after drawing. */
20
+ fonts: Font[];
21
+ }
22
+ /**
23
+ * Lay out rich text via ParagraphBuilder (line-breaking, alignment, per-span
24
+ * sizing/spacing) and return shaped glyph runs we draw with our own paints, so
25
+ * per-span gradient/image fills and glyph strokes keep working.
26
+ */
27
+ export declare function layoutRichText(canvasKit: CanvasKit, fontMgr: TypefaceFontProvider, state: RichTextState): RichTextLayout;
28
+ //# sourceMappingURL=richtext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richtext.d.ts","sourceRoot":"","sources":["../../src/shapes/richtext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE5F;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,SAAS;IACzC,IAAI,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,4EAA4E;IAC5E,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,aAAa,GACrB,cAAc,CA4BhB"}
@@ -0,0 +1,32 @@
1
+ import { layoutParagraph } from "./paragraph-layout";
2
+ /**
3
+ * Lay out rich text via ParagraphBuilder (line-breaking, alignment, per-span
4
+ * sizing/spacing) and return shaped glyph runs we draw with our own paints, so
5
+ * per-span gradient/image fills and glyph strokes keep working.
6
+ */
7
+ export function layoutRichText(canvasKit, fontMgr, state) {
8
+ const { spans, lineHeight, align, width } = state;
9
+ const segments = spans.map(s => ({
10
+ text: s.text,
11
+ fontFamily: s.fontFamily,
12
+ fontSize: s.fontSize,
13
+ fontWeight: s.fontWeight,
14
+ fontStyle: s.fontStyle,
15
+ letterSpacing: s.letterSpacing,
16
+ }));
17
+ const layout = layoutParagraph(canvasKit, fontMgr, segments, {
18
+ align,
19
+ lineHeight,
20
+ // RichText boxes are hug/explicit; wrap only when a finite width exists.
21
+ maxWidth: width > 0 ? width : Infinity,
22
+ // RichText draws in the node's centered local space (origin 0,0).
23
+ originX: 0,
24
+ originY: 0,
25
+ });
26
+ const runs = layout.runs.map(run => ({
27
+ ...run,
28
+ span: spans[run.segmentIndex],
29
+ }));
30
+ return { runs, bounds: layout.bounds, fonts: layout.fonts };
31
+ }
32
+ //# sourceMappingURL=richtext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"richtext.js","sourceRoot":"","sources":["../../src/shapes/richtext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAyC,MAAM,oBAAoB,CAAC;AAiB5F;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC1B,SAAoB,EACpB,OAA6B,EAC7B,KAAoB;IAEpB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAElD,MAAM,QAAQ,GAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,aAAa,EAAE,CAAC,CAAC,aAAa;KACjC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;QACzD,KAAK;QACL,UAAU;QACV,yEAAyE;QACzE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;QACtC,kEAAkE;QAClE,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACb,CAAC,CAAC;IAEH,MAAM,IAAI,GAAiB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,GAAG,GAAG;QACN,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;KAChC,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { CanvasKit, Canvas, Paint, Path as CKPath, TypefaceFontProvider } from "@motion-script/canvaskit";
2
+ import { BooleanOperation, EllipseState, LineState, MaskApplyLayer, MaskOptions, PathState, PolygonState, PolygramState, RectState, ShadowResolved, TextState } from "@motion-script/core";
3
+ /**
4
+ * A drawable produced by any shape kind (path-backed or text). `ckPath` is
5
+ * absent for text (canvaskit-wasm exposes no glyph paths) and optional
6
+ * `bounds`/`isText` let fills/strokes/bounds logic special-case those shapes.
7
+ */
8
+ export interface CurrentShape {
9
+ draw: (paint: Paint) => void;
10
+ ckPath?: CKPath;
11
+ bounds?: {
12
+ left: number;
13
+ top: number;
14
+ right: number;
15
+ bottom: number;
16
+ };
17
+ isText?: boolean;
18
+ }
19
+ /**
20
+ * Per-frame collector and compositor for a node's shapes. Accumulates path
21
+ * primitives and text, resolves bounds for fill/stroke shaders, supports
22
+ * cut/boolean/mask compositing that collapse `shapes` into a single drawable,
23
+ * and caches `BaseShape` instances across frames (keyed by node id + index)
24
+ * so `ckPath`s survive when input state is unchanged or only trim moved.
25
+ */
26
+ export declare class ShapeHandler {
27
+ private canvasKit;
28
+ private getCanvas;
29
+ private getPaint;
30
+ private fontMgr;
31
+ shapes: CurrentShape[];
32
+ paintApplied: boolean;
33
+ private pendingShadows;
34
+ private boolean;
35
+ private mask;
36
+ private boundsOverride;
37
+ private shapeCache;
38
+ private currentNodeId;
39
+ private shapeIndex;
40
+ private _cachedBounds;
41
+ private _boundsDirty;
42
+ constructor(canvasKit: CanvasKit, getCanvas: () => Canvas, getPaint: () => Paint, fontMgr: TypefaceFontProvider);
43
+ beginNode(nodeId: string): void;
44
+ reset(): void;
45
+ storePendingShadows(shadows: ShadowResolved[]): void;
46
+ takePendingShadows(): ShadowResolved[] | null;
47
+ dispose(): void;
48
+ isCollectingPaths(): boolean;
49
+ pushBounds(b: {
50
+ left: number;
51
+ top: number;
52
+ right: number;
53
+ bottom: number;
54
+ }): void;
55
+ popBounds(): void;
56
+ getShapeBounds(): {
57
+ left: number;
58
+ top: number;
59
+ right: number;
60
+ bottom: number;
61
+ } | null;
62
+ private addShape;
63
+ rect(state: Partial<RectState>): void;
64
+ ellipse(state: Partial<EllipseState>): void;
65
+ path(state: Partial<PathState>): void;
66
+ line(state: Partial<LineState>): void;
67
+ polygon(state: Partial<PolygonState>): void;
68
+ polygram(state: Partial<PolygramState>): void;
69
+ text(state: Partial<TextState>): void;
70
+ cut(): void;
71
+ unionStrokeShape(): CurrentShape | null;
72
+ beginBoolean(op: BooleanOperation): void;
73
+ endBoolean(): void;
74
+ beginMask(options?: MaskOptions): void;
75
+ applyMask(): void;
76
+ endMask(): void;
77
+ getMaskApply(): Set<MaskApplyLayer> | null;
78
+ }
79
+ //# sourceMappingURL=shape-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-handler.d.ts","sourceRoot":"","sources":["../../src/shapes/shape-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,304 @@
1
+ import { RectShape } from "./rect";
2
+ import { EllipseShape } from "./ellipse";
3
+ import { PathShape } from "./path";
4
+ import { LineShape } from "./line";
5
+ import { buildText } from "./text";
6
+ import { PolygonShape } from "./polygon";
7
+ import { PolygramShape } from "./polygram";
8
+ import { BooleanHandler } from "./boolean";
9
+ import { MaskHandler } from "./mask";
10
+ // Shallow equality check for plain state objects. Handles the common case where
11
+ // all values are primitives or the same object reference (e.g. arrays held stable).
12
+ function shallowEqual(a, b) {
13
+ const keysA = Object.keys(a);
14
+ if (keysA.length !== Object.keys(b).length)
15
+ return false;
16
+ for (const k of keysA) {
17
+ if (a[k] !== b[k])
18
+ return false;
19
+ }
20
+ return true;
21
+ }
22
+ function shallowEqualExcluding(a, b, ...exclude) {
23
+ const excSet = new Set(exclude);
24
+ const keysA = Object.keys(a).filter(k => !excSet.has(k));
25
+ const keysB = Object.keys(b).filter(k => !excSet.has(k));
26
+ if (keysA.length !== keysB.length)
27
+ return false;
28
+ for (const k of keysA) {
29
+ if (a[k] !== b[k])
30
+ return false;
31
+ }
32
+ return true;
33
+ }
34
+ /**
35
+ * Per-frame collector and compositor for a node's shapes. Accumulates path
36
+ * primitives and text, resolves bounds for fill/stroke shaders, supports
37
+ * cut/boolean/mask compositing that collapse `shapes` into a single drawable,
38
+ * and caches `BaseShape` instances across frames (keyed by node id + index)
39
+ * so `ckPath`s survive when input state is unchanged or only trim moved.
40
+ */
41
+ export class ShapeHandler {
42
+ canvasKit;
43
+ getCanvas;
44
+ getPaint;
45
+ fontMgr;
46
+ shapes = [];
47
+ paintApplied = false;
48
+ pendingShadows = null;
49
+ boolean;
50
+ mask;
51
+ // Bounds override stack. Callers like the image-node renderer push their
52
+ // own rect so fills that depend on shape bounds (gradients, image-shaders)
53
+ // resolve correctly even though no path lives in `shapes`.
54
+ boundsOverride = [];
55
+ // Shape instance cache: survives reset() so ckPaths persist across frames.
56
+ // Key format: "<nodeId>:<shapeIndex>"
57
+ shapeCache = new Map();
58
+ currentNodeId = "";
59
+ shapeIndex = 0;
60
+ // Cached union bounds for the current shape set, cleared when shapes change.
61
+ _cachedBounds = null;
62
+ _boundsDirty = true;
63
+ constructor(canvasKit, getCanvas, getPaint, fontMgr) {
64
+ this.canvasKit = canvasKit;
65
+ this.getCanvas = getCanvas;
66
+ this.getPaint = getPaint;
67
+ this.fontMgr = fontMgr;
68
+ this.boolean = new BooleanHandler(canvasKit, getCanvas);
69
+ this.mask = new MaskHandler(canvasKit, getCanvas, this.boolean);
70
+ }
71
+ beginNode(nodeId) {
72
+ this.currentNodeId = nodeId;
73
+ this.shapeIndex = 0;
74
+ }
75
+ reset() {
76
+ this.shapes = [];
77
+ this.paintApplied = false;
78
+ this.pendingShadows = null;
79
+ this._boundsDirty = true;
80
+ this._cachedBounds = null;
81
+ }
82
+ storePendingShadows(shadows) {
83
+ this.pendingShadows = shadows.length > 0 ? shadows : null;
84
+ }
85
+ takePendingShadows() {
86
+ const s = this.pendingShadows;
87
+ this.pendingShadows = null;
88
+ return s;
89
+ }
90
+ dispose() {
91
+ this.shapes = [];
92
+ for (const entry of this.shapeCache.values()) {
93
+ entry.shape.deletePaths();
94
+ }
95
+ this.shapeCache.clear();
96
+ this.boolean.dispose();
97
+ this.mask.dispose();
98
+ }
99
+ isCollectingPaths() {
100
+ return this.boolean.isCollecting();
101
+ }
102
+ pushBounds(b) {
103
+ this.boundsOverride.push(b);
104
+ }
105
+ popBounds() {
106
+ this.boundsOverride.pop();
107
+ }
108
+ getShapeBounds() {
109
+ if (this.boundsOverride.length > 0) {
110
+ return this.boundsOverride[this.boundsOverride.length - 1];
111
+ }
112
+ if (!this._boundsDirty && this._cachedBounds !== null) {
113
+ return this._cachedBounds;
114
+ }
115
+ let left = Infinity, top = Infinity, right = -Infinity, bottom = -Infinity;
116
+ for (const shape of this.shapes) {
117
+ if (shape.ckPath) {
118
+ const b = shape.ckPath.getBounds();
119
+ if (b[0] < left)
120
+ left = b[0];
121
+ if (b[1] < top)
122
+ top = b[1];
123
+ if (b[2] > right)
124
+ right = b[2];
125
+ if (b[3] > bottom)
126
+ bottom = b[3];
127
+ }
128
+ else if (shape.bounds) {
129
+ if (shape.bounds.left < left)
130
+ left = shape.bounds.left;
131
+ if (shape.bounds.top < top)
132
+ top = shape.bounds.top;
133
+ if (shape.bounds.right > right)
134
+ right = shape.bounds.right;
135
+ if (shape.bounds.bottom > bottom)
136
+ bottom = shape.bounds.bottom;
137
+ }
138
+ }
139
+ this._boundsDirty = false;
140
+ this._cachedBounds = isFinite(left) ? { left, top, right, bottom } : null;
141
+ return this._cachedBounds;
142
+ }
143
+ addShape(newShape) {
144
+ this._boundsDirty = true;
145
+ const isolated = !this.boolean.isCollecting();
146
+ // Try to reuse a cached shape if we have a stable node ID.
147
+ let shape = newShape;
148
+ if (this.currentNodeId) {
149
+ const key = `${this.currentNodeId}:${this.shapeIndex++}`;
150
+ const entry = this.shapeCache.get(key);
151
+ if (entry) {
152
+ const cached = entry.shape;
153
+ const newState = newShape.inputState;
154
+ const oldState = cached.inputState;
155
+ if (shallowEqual(newState, oldState)) {
156
+ // Exact match — reuse the cached shape (with its ckPath intact).
157
+ shape = cached;
158
+ }
159
+ else if (cached.hasTrim() && newShape.hasTrim()
160
+ && shallowEqualExcluding(newState, oldState, 'start', 'end')) {
161
+ // Only trim range changed — re-trim from the cached base path.
162
+ const { start, end } = newShape.trimRange();
163
+ if (entry.trimStart !== start || entry.trimEnd !== end) {
164
+ cached.retrim(start, end);
165
+ entry.trimStart = start;
166
+ entry.trimEnd = end;
167
+ }
168
+ cached.inputState = newShape.inputState;
169
+ shape = cached;
170
+ }
171
+ else {
172
+ // State mismatch — evict old entry and use new shape.
173
+ cached.deletePaths();
174
+ const tr = newShape.hasTrim() ? newShape.trimRange() : { start: 0, end: 1 };
175
+ this.shapeCache.set(key, { shape: newShape, trimStart: tr.start, trimEnd: tr.end });
176
+ shape = newShape;
177
+ }
178
+ }
179
+ else {
180
+ const tr = newShape.hasTrim() ? newShape.trimRange() : { start: 0, end: 1 };
181
+ this.shapeCache.set(key, { shape: newShape, trimStart: tr.start, trimEnd: tr.end });
182
+ }
183
+ }
184
+ if (!isolated) {
185
+ shape.ensurePath();
186
+ if (shape.ckPath)
187
+ this.boolean.contributeToPathCollection(shape.ckPath);
188
+ }
189
+ this.shapes.push(shape.toCurrentShape(isolated));
190
+ }
191
+ rect(state) {
192
+ this.addShape(new RectShape(this.canvasKit, this.getCanvas(), state));
193
+ }
194
+ ellipse(state) {
195
+ this.addShape(new EllipseShape(this.canvasKit, this.getCanvas(), state));
196
+ }
197
+ path(state) {
198
+ this.addShape(new PathShape(this.canvasKit, this.getCanvas(), state));
199
+ }
200
+ line(state) {
201
+ this.addShape(new LineShape(this.canvasKit, this.getCanvas(), state));
202
+ }
203
+ polygon(state) {
204
+ this.addShape(new PolygonShape(this.canvasKit, this.getCanvas(), state));
205
+ }
206
+ polygram(state) {
207
+ this.addShape(new PolygramShape(this.canvasKit, this.getCanvas(), state));
208
+ }
209
+ text(state) {
210
+ this._boundsDirty = true;
211
+ const shape = buildText(this.canvasKit, this.getCanvas(), this.fontMgr, state);
212
+ this.shapes.push(shape);
213
+ }
214
+ // ─── Cut ───────────────────────────────────────────────────────────────────
215
+ // Use the most-recently drawn shape as a cutter: union all the shapes before
216
+ // it, then subtract that last shape, so only it punches a hole. The combined
217
+ // path replaces `shapes`, so anything drawn afterward stacks onto it and the
218
+ // whole thing paints as one surface — a single gradient resolves across all
219
+ // of it. Shapes without a ckPath (text) are skipped.
220
+ cut() {
221
+ const withPaths = this.shapes.filter(s => s.ckPath);
222
+ if (withPaths.length === 0)
223
+ return;
224
+ // The last shape is the cutter; everything before it is the base.
225
+ const cutter = withPaths[withPaths.length - 1].ckPath.copy();
226
+ const baseShapes = withPaths.slice(0, -1);
227
+ let combined;
228
+ if (baseShapes.length === 0) {
229
+ // Nothing to cut from — the lone shape stays as-is.
230
+ cutter.delete();
231
+ combined = withPaths[0].ckPath.copy();
232
+ }
233
+ else {
234
+ const base = this.boolean.combinePaths(baseShapes.map(s => s.ckPath.copy()), "union");
235
+ if (!base) {
236
+ cutter.delete();
237
+ combined = null;
238
+ }
239
+ else {
240
+ combined = this.boolean.combinePaths([base, cutter], "subtract");
241
+ }
242
+ }
243
+ // combinePaths consumed/deleted the copies; now drop the originals.
244
+ for (const shape of this.shapes)
245
+ shape.ckPath?.delete();
246
+ this.shapes = [];
247
+ this.paintApplied = false;
248
+ if (!combined)
249
+ return;
250
+ const canvas = this.getCanvas();
251
+ this.shapes.push({
252
+ draw: (paint) => { canvas.drawPath(combined, paint); },
253
+ ckPath: combined,
254
+ });
255
+ }
256
+ // Build a single shape from the union of all accumulated path shapes, so a
257
+ // stroke follows only the outer boundary with no seams where shapes overlap.
258
+ // Returns null when there are fewer than two path shapes (caller strokes the
259
+ // shapes directly) or text is involved (no path to union). The caller owns
260
+ // the returned shape's ckPath and must delete() it. Does not mutate `shapes`.
261
+ unionStrokeShape() {
262
+ if (this.shapes.some(s => s.isText))
263
+ return null;
264
+ const withPaths = this.shapes.filter(s => s.ckPath);
265
+ if (withPaths.length < 2)
266
+ return null;
267
+ const combined = this.boolean.combinePaths(withPaths.map(s => s.ckPath.copy()), "union");
268
+ if (!combined)
269
+ return null;
270
+ const canvas = this.getCanvas();
271
+ return {
272
+ draw: (paint) => { canvas.drawPath(combined, paint); },
273
+ ckPath: combined,
274
+ };
275
+ }
276
+ // ─── Boolean ─────────────────────────────────────────────────────────────
277
+ beginBoolean(op) {
278
+ this.boolean.beginBoolean(op);
279
+ }
280
+ endBoolean() {
281
+ const shape = this.boolean.endBoolean(this.getCanvas);
282
+ this.shapes = [];
283
+ this.paintApplied = false;
284
+ if (shape)
285
+ this.shapes.push(shape);
286
+ }
287
+ // ─── Mask ─────────────────────────────────────────────────────────────────
288
+ beginMask(options) {
289
+ this.mask.beginMask(options);
290
+ }
291
+ applyMask() {
292
+ this.mask.applyMask(() => {
293
+ this.shapes = [];
294
+ this.paintApplied = false;
295
+ });
296
+ }
297
+ endMask() {
298
+ this.mask.endMask();
299
+ }
300
+ getMaskApply() {
301
+ return this.mask.getApply();
302
+ }
303
+ }
304
+ //# sourceMappingURL=shape-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-handler.js","sourceRoot":"","sources":["../../src/shapes/shape-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CanvasKit, Canvas, TypefaceFontProvider } from "@motion-script/canvaskit";
2
+ import { TextState } from "@motion-script/core";
3
+ import type { CurrentShape } from "./shape-handler";
4
+ /**
5
+ * Lay out a Text node into a drawable `CurrentShape`. When `fontSize` is
6
+ * "autofit", first probes an unwrapped single-line layout to derive a scale
7
+ * that fits the box; with wrap enabled, shrinking stops at `minFontSize` and
8
+ * wrapping takes over instead. Returned shape has no `ckPath` (`isText: true`)
9
+ * since glyph paths aren't available — strokes/fills fall back to glyph-union
10
+ * handling elsewhere.
11
+ */
12
+ export declare function buildText(canvasKit: CanvasKit, canvas: Canvas, fontMgr: TypefaceFontProvider, state: Partial<TextState>): CurrentShape;
13
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/shapes/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAS,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACrB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,YAAY,CA2Dd"}