@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,156 @@
1
+ function fontSlantFor(canvasKit, style) {
2
+ switch (style) {
3
+ case 'italic': return canvasKit.FontSlant.Italic;
4
+ case 'oblique': return canvasKit.FontSlant.Oblique;
5
+ default: return canvasKit.FontSlant.Upright;
6
+ }
7
+ }
8
+ function textAlignFor(canvasKit, align) {
9
+ switch (align) {
10
+ case 'left': return canvasKit.TextAlign.Left;
11
+ case 'right': return canvasKit.TextAlign.Right;
12
+ case 'justify': return canvasKit.TextAlign.Justify;
13
+ case 'start': return canvasKit.TextAlign.Start;
14
+ case 'end': return canvasKit.TextAlign.End;
15
+ default: return canvasKit.TextAlign.Center;
16
+ }
17
+ }
18
+ /**
19
+ * Lay out styled segments through ParagraphBuilder and return shaped glyph runs
20
+ * positioned in a coordinate space centered on (originX, originY). `maxWidth`
21
+ * bounds line wrapping; pass Infinity (mapped to a large value) for no wrap.
22
+ *
23
+ * The fontMgr must already have the families registered (loadFont); a private
24
+ * FontCollection wrapping it is created per call.
25
+ */
26
+ export function layoutParagraph(canvasKit, fontMgr, segments, opts) {
27
+ const fonts = [];
28
+ const empty = segments.every(s => s.text.length === 0);
29
+ if (segments.length === 0 || empty) {
30
+ return { runs: [], bounds: { left: 0, top: 0, right: 0, bottom: 0 }, width: 0, height: 0, fonts };
31
+ }
32
+ const fontCollection = canvasKit.FontCollection.Make();
33
+ fontCollection.setDefaultFontManager(fontMgr);
34
+ const paraStyle = new canvasKit.ParagraphStyle({
35
+ textStyle: { fontFamilies: [segments[0].fontFamily], fontSize: segments[0].fontSize },
36
+ textAlign: textAlignFor(canvasKit, opts.align),
37
+ // heightMultiplier is applied per text style below; keep the paragraph
38
+ // default neutral so per-run line height is honored.
39
+ });
40
+ const builder = canvasKit.ParagraphBuilder.MakeFromFontCollection(paraStyle, fontCollection);
41
+ // Character offset where each segment's text begins, so we can map shaped
42
+ // runs (reported by character range via run order) back to their segment.
43
+ const segmentStartChar = [];
44
+ let charCursor = 0;
45
+ for (const seg of segments) {
46
+ segmentStartChar.push(charCursor);
47
+ builder.pushStyle(new canvasKit.TextStyle({
48
+ fontFamilies: [seg.fontFamily],
49
+ fontSize: seg.fontSize,
50
+ // `fontStyle.weight` selects the nearest file for *static* families
51
+ // (one file per weight). `fontVariations` drives the `wght` axis for
52
+ // *variable* families (one file, continuous weight) — Skia shapes at
53
+ // that axis position and hands the positioned typeface back on the
54
+ // run, which we draw with. Static fonts ignore the variation
55
+ // harmlessly, so sending both makes one code path serve either kind.
56
+ fontStyle: {
57
+ weight: { value: seg.fontWeight },
58
+ slant: fontSlantFor(canvasKit, seg.fontStyle),
59
+ },
60
+ fontVariations: [{ axis: "wght", value: seg.fontWeight }],
61
+ letterSpacing: seg.letterSpacing,
62
+ heightMultiplier: opts.lineHeight,
63
+ }));
64
+ builder.addText(seg.text);
65
+ builder.pop();
66
+ charCursor += seg.text.length;
67
+ }
68
+ const paragraph = builder.build();
69
+ // Two-pass layout: alignment positions glyphs relative to the layout width,
70
+ // so a huge "no-wrap" width would push centered/right text far off-origin.
71
+ // First measure the intrinsic max width, then lay out at the actual box
72
+ // width (the wrap maxWidth, or the intrinsic width when not wrapping) so
73
+ // alignment offsets land correctly.
74
+ const wrapping = isFinite(opts.maxWidth) && opts.maxWidth > 0;
75
+ paragraph.layout(wrapping ? opts.maxWidth : 1e7);
76
+ // +1px guards against the intrinsic width rounding just under the longest
77
+ // line and spuriously wrapping it.
78
+ const layoutWidth = wrapping ? opts.maxWidth : Math.ceil(paragraph.getMaxIntrinsicWidth()) + 1;
79
+ paragraph.layout(layoutWidth);
80
+ const blockWidth = paragraph.getLongestLine();
81
+ const blockHeight = paragraph.getHeight();
82
+ // Paragraph lays out from (0,0) at top-left. Glyphs are already positioned
83
+ // within [0, layoutWidth] according to the chosen alignment (e.g. centered
84
+ // glyphs start at (layoutWidth - lineWidth) / 2, not at 0). So the correct
85
+ // anchor is layoutWidth, not blockWidth (the longest line), which would
86
+ // mis-shift aligned glyphs off-center.
87
+ const shiftX = opts.originX - layoutWidth / 2;
88
+ const shiftY = opts.originY - blockHeight / 2;
89
+ // Build one Font per distinct (family,weight,size) from the run's own
90
+ // typeface, which this CanvasKit build returns already positioned at the
91
+ // run's variation axes (e.g. a variable font at its `wght`). Caching by that
92
+ // key means repeated runs of the same style reuse the Font; the typeface
93
+ // handles for those redundant runs are released immediately (the Font keeps
94
+ // its own ref, so the cached Font stays valid after its handle is deleted).
95
+ const fontCache = new Map();
96
+ const fontForRun = (seg, typeface) => {
97
+ const key = `${seg.fontFamily}@${seg.fontWeight}@${seg.fontStyle}@${seg.fontSize}`;
98
+ const cached = fontCache.get(key);
99
+ if (cached) {
100
+ typeface?.delete();
101
+ return cached;
102
+ }
103
+ const font = new canvasKit.Font(typeface, seg.fontSize);
104
+ typeface?.delete();
105
+ fontCache.set(key, font);
106
+ fonts.push(font);
107
+ return font;
108
+ };
109
+ const runs = [];
110
+ const lines = paragraph.getShapedLines();
111
+ for (const line of lines) {
112
+ for (const run of line.runs) {
113
+ const glyphCount = run.glyphs.length;
114
+ if (glyphCount === 0)
115
+ continue;
116
+ // run.offsets holds the character offset of each glyph (plus a
117
+ // trailing entry); the first pins the run to its style segment.
118
+ const segmentIndex = segmentIndexAt(segmentStartChar, segments, run.offsets[0]);
119
+ const font = fontForRun(segments[segmentIndex], run.typeface);
120
+ // positions hold one extra trailing pair; copy just the glyph pairs
121
+ // and apply the centering shift.
122
+ const positions = new Float32Array(glyphCount * 2);
123
+ for (let i = 0; i < glyphCount; i++) {
124
+ positions[i * 2] = run.positions[i * 2] + shiftX;
125
+ positions[i * 2 + 1] = run.positions[i * 2 + 1] + shiftY;
126
+ }
127
+ runs.push({ segmentIndex, glyphs: run.glyphs.slice(0, glyphCount), positions, font });
128
+ }
129
+ }
130
+ const bounds = blockWidth > 0 && blockHeight > 0
131
+ ? { left: shiftX, top: shiftY, right: shiftX + layoutWidth, bottom: shiftY + blockHeight }
132
+ : { left: 0, top: 0, right: 0, bottom: 0 };
133
+ paragraph.delete();
134
+ builder.delete();
135
+ fontCollection.delete();
136
+ return { runs, bounds, width: blockWidth, height: blockHeight, fonts };
137
+ }
138
+ // Find the segment whose character range [start, start+len) contains charPos.
139
+ function segmentIndexAt(starts, segments, charPos) {
140
+ for (let i = 0; i < segments.length; i++) {
141
+ const len = segments[i].text.length;
142
+ if (len > 0 && charPos >= starts[i] && charPos < starts[i] + len)
143
+ return i;
144
+ }
145
+ // Fallback: last non-empty segment (e.g. charPos at end-of-text).
146
+ for (let i = segments.length - 1; i >= 0; i--) {
147
+ if (segments[i].text.length > 0)
148
+ return i;
149
+ }
150
+ return 0;
151
+ }
152
+ /** Draw a shaped run with the given paint via our own glyph pipeline. */
153
+ export function drawShapedRun(canvas, run, paint) {
154
+ canvas.drawGlyphs(run.glyphs, run.positions, 0, 0, run.font, paint);
155
+ }
156
+ //# sourceMappingURL=paragraph-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph-layout.js","sourceRoot":"","sources":["../../src/shapes/paragraph-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Paint } from "@motion-script/canvaskit";
2
+ import { PathState } from "@motion-script/core";
3
+ import { BaseShape } from "./base";
4
+ export { trimPath } from "./trim";
5
+ type PathGeo = {
6
+ svgString: string;
7
+ offsetX: number;
8
+ offsetY: number;
9
+ };
10
+ /**
11
+ * Renders an arbitrary SVG path `d`. Overrides `ensurePath` to bake a
12
+ * centering translation (so the shape's local origin is its bbox center)
13
+ * directly into the built path, then applies trim — avoiding a save/restore
14
+ * on every draw/clip.
15
+ */
16
+ export declare class PathShape extends BaseShape<PathState, PathGeo> {
17
+ protected resolveState(state: Partial<PathState>): PathState;
18
+ protected computeGeometry(): PathGeo;
19
+ protected buildSVGPath(geo: PathGeo): string;
20
+ protected needsTrim(): boolean;
21
+ protected getTrimRange(): {
22
+ start: number;
23
+ end: number;
24
+ };
25
+ ensurePath(): void;
26
+ draw(paint: Paint, _isolated: boolean): void;
27
+ clip(_isolated: boolean): void;
28
+ }
29
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/shapes/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAoC,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,KAAK,OAAO,GAAG;IACX,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;IACxD,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS;IAI5D,SAAS,CAAC,eAAe,IAAI,OAAO;IAMpC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAI5C,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,SAAS,CAAC,YAAY;;;;IAKb,UAAU,IAAI,IAAI;IA8BlB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAK5C,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;CAM1C"}
@@ -0,0 +1,71 @@
1
+ import { toPathString, withPathDescriptor } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ import { trimPath } from "./trim";
4
+ export { trimPath } from "./trim";
5
+ /**
6
+ * Renders an arbitrary SVG path `d`. Overrides `ensurePath` to bake a
7
+ * centering translation (so the shape's local origin is its bbox center)
8
+ * directly into the built path, then applies trim — avoiding a save/restore
9
+ * on every draw/clip.
10
+ */
11
+ export class PathShape extends BaseShape {
12
+ resolveState(state) {
13
+ return withPathDescriptor(state);
14
+ }
15
+ computeGeometry() {
16
+ // SVG string is known eagerly; centering offset requires the ck path bounds
17
+ // and is filled in by ensurePath() after path construction.
18
+ return { svgString: toPathString(this.fullState.d), offsetX: 0, offsetY: 0 };
19
+ }
20
+ buildSVGPath(geo) {
21
+ return geo.svgString;
22
+ }
23
+ needsTrim() {
24
+ return this.fullState.start !== 0 || this.fullState.end !== 1;
25
+ }
26
+ getTrimRange() {
27
+ return { start: this.fullState.start, end: this.fullState.end };
28
+ }
29
+ // Override ensurePath to bake the centering offset directly into the path.
30
+ ensurePath() {
31
+ if (this.ckPath)
32
+ return;
33
+ const geo = this.geometry;
34
+ const rawPath = this.canvasKit.Path.MakeFromSVGString(geo.svgString);
35
+ if (!rawPath) {
36
+ console.warn("PathShape: failed to parse SVG path string:", geo.svgString);
37
+ return;
38
+ }
39
+ const bounds = rawPath.getBounds();
40
+ const ox = -(bounds[0] + (bounds[2] - bounds[0]) / 2);
41
+ const oy = -(bounds[1] + (bounds[3] - bounds[1]) / 2);
42
+ // Store for computeBounds() usage; no longer needed for draw/clip.
43
+ geo.offsetX = ox;
44
+ geo.offsetY = oy;
45
+ // Bake the centering translation into the path so draw/clip need no save/restore.
46
+ const builder = new this.canvasKit.PathBuilder(rawPath);
47
+ builder.offset(ox, oy);
48
+ const centeredPath = builder.detachAndDelete();
49
+ rawPath.delete();
50
+ if (this.needsTrim()) {
51
+ this._setBasePath(centeredPath);
52
+ const { start, end } = this.getTrimRange();
53
+ this.ckPath = trimPath(this.canvasKit, centeredPath, start, end);
54
+ }
55
+ else {
56
+ this.ckPath = centeredPath;
57
+ }
58
+ }
59
+ draw(paint, _isolated) {
60
+ this.ensurePath();
61
+ if (this.ckPath)
62
+ this.canvas.drawPath(this.ckPath, paint);
63
+ }
64
+ clip(_isolated) {
65
+ this.ensurePath();
66
+ if (this.ckPath) {
67
+ this.canvas.clipPath(this.ckPath, this.canvasKit.ClipOp.Intersect, true);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/shapes/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { PolygonState } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ type PolygonGeo = {
4
+ cx: number;
5
+ cy: number;
6
+ rx: number;
7
+ ry: number;
8
+ sides: number;
9
+ borderRadius: number;
10
+ };
11
+ /**
12
+ * Regular polygon inscribed in an ellipse (rx/ry from width/height), starting
13
+ * at the top vertex. `borderRadius` rounds each vertex by arcing between
14
+ * cut-back points on the adjacent edges, clamped so adjacent arcs never overlap.
15
+ */
16
+ export declare class PolygonShape extends BaseShape<PolygonState, PolygonGeo> {
17
+ protected resolveState(state: Partial<PolygonState>): PolygonState;
18
+ protected computeGeometry(): PolygonGeo;
19
+ protected buildSVGPath(geo: PolygonGeo): string;
20
+ protected needsTrim(): boolean;
21
+ protected getTrimRange(): {
22
+ start: number;
23
+ end: number;
24
+ };
25
+ protected computeBounds(geo: PolygonGeo): {
26
+ left: number;
27
+ top: number;
28
+ right: number;
29
+ bottom: number;
30
+ };
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=polygon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon.d.ts","sourceRoot":"","sources":["../../src/shapes/polygon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,KAAK,UAAU,GAAG;IACd,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAkEF;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC;IACjE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY;IAIlE,SAAS,CAAC,eAAe,IAAI,UAAU;IAWvC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM;IAI/C,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,SAAS,CAAC,YAAY;;;;IAItB,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU;;;;;;CAG1C"}
@@ -0,0 +1,86 @@
1
+ import { withPolygonDescriptor } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ function buildPolygonSvg(cx, cy, rx, ry, sides, borderRadius) {
4
+ const angleStep = (2 * Math.PI) / sides;
5
+ const startAngle = -Math.PI / 2;
6
+ const verts = [];
7
+ for (let i = 0; i < sides; i++) {
8
+ const a = startAngle + i * angleStep;
9
+ verts.push([cx + rx * Math.cos(a), cy + ry * Math.sin(a)]);
10
+ }
11
+ if (borderRadius <= 0) {
12
+ const parts = verts.map(([x, y], i) => `${i === 0 ? "M" : "L"} ${x} ${y}`);
13
+ parts.push("Z");
14
+ return parts.join(" ");
15
+ }
16
+ const parts = [];
17
+ for (let i = 0; i < sides; i++) {
18
+ const prev = verts[(i - 1 + sides) % sides];
19
+ const curr = verts[i];
20
+ const next = verts[(i + 1) % sides];
21
+ const a0x = prev[0] - curr[0];
22
+ const a0y = prev[1] - curr[1];
23
+ const len0 = Math.hypot(a0x, a0y);
24
+ const u0x = a0x / len0;
25
+ const u0y = a0y / len0;
26
+ const a1x = next[0] - curr[0];
27
+ const a1y = next[1] - curr[1];
28
+ const len1 = Math.hypot(a1x, a1y);
29
+ const u1x = a1x / len1;
30
+ const u1y = a1y / len1;
31
+ const cosAngle = Math.max(-1, Math.min(1, u0x * u1x + u0y * u1y));
32
+ const halfAngle = Math.acos(cosAngle) / 2;
33
+ const tanHalf = Math.tan(halfAngle);
34
+ const maxT = Math.min(len0, len1) / 2;
35
+ let t = borderRadius / tanHalf;
36
+ if (t > maxT)
37
+ t = maxT;
38
+ const r = t * tanHalf;
39
+ const arcStartX = curr[0] + u0x * t;
40
+ const arcStartY = curr[1] + u0y * t;
41
+ const arcEndX = curr[0] + u1x * t;
42
+ const arcEndY = curr[1] + u1y * t;
43
+ if (i === 0) {
44
+ parts.push(`M ${arcStartX} ${arcStartY}`);
45
+ }
46
+ else {
47
+ parts.push(`L ${arcStartX} ${arcStartY}`);
48
+ }
49
+ parts.push(`A ${r} ${r} 0 0 1 ${arcEndX} ${arcEndY}`);
50
+ }
51
+ parts.push("Z");
52
+ return parts.join(" ");
53
+ }
54
+ /**
55
+ * Regular polygon inscribed in an ellipse (rx/ry from width/height), starting
56
+ * at the top vertex. `borderRadius` rounds each vertex by arcing between
57
+ * cut-back points on the adjacent edges, clamped so adjacent arcs never overlap.
58
+ */
59
+ export class PolygonShape extends BaseShape {
60
+ resolveState(state) {
61
+ return withPolygonDescriptor(state);
62
+ }
63
+ computeGeometry() {
64
+ const s = this.fullState;
65
+ return {
66
+ cx: s.x, cy: s.y,
67
+ rx: s.width / 2,
68
+ ry: s.height / 2,
69
+ sides: Math.max(3, Math.round(s.sides)),
70
+ borderRadius: s.borderRadius,
71
+ };
72
+ }
73
+ buildSVGPath(geo) {
74
+ return buildPolygonSvg(geo.cx, geo.cy, geo.rx, geo.ry, geo.sides, geo.borderRadius);
75
+ }
76
+ needsTrim() {
77
+ return this.fullState.start !== 0 || this.fullState.end !== 1;
78
+ }
79
+ getTrimRange() {
80
+ return { start: this.fullState.start, end: this.fullState.end };
81
+ }
82
+ computeBounds(geo) {
83
+ return { left: geo.cx - geo.rx, top: geo.cy - geo.ry, right: geo.cx + geo.rx, bottom: geo.cy + geo.ry };
84
+ }
85
+ }
86
+ //# sourceMappingURL=polygon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon.js","sourceRoot":"","sources":["../../src/shapes/polygon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { PolygramState } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ type PolygramGeo = {
4
+ cx: number;
5
+ cy: number;
6
+ rx: number;
7
+ ry: number;
8
+ sides: number;
9
+ ratio: number;
10
+ borderRadius: number;
11
+ };
12
+ /**
13
+ * Star polygon: alternates outer vertices (radius 1) and inner vertices
14
+ * (radius `ratio`). Only outer (convex) vertices are rounded by `borderRadius`;
15
+ * inner vertices stay sharp, matching typical star-shape conventions.
16
+ */
17
+ export declare class PolygramShape extends BaseShape<PolygramState, PolygramGeo> {
18
+ protected resolveState(state: Partial<PolygramState>): PolygramState;
19
+ protected computeGeometry(): PolygramGeo;
20
+ protected buildSVGPath(geo: PolygramGeo): string;
21
+ protected needsTrim(): boolean;
22
+ protected getTrimRange(): {
23
+ start: number;
24
+ end: number;
25
+ };
26
+ protected computeBounds(geo: PolygramGeo): {
27
+ left: number;
28
+ top: number;
29
+ right: number;
30
+ bottom: number;
31
+ };
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=polygram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygram.d.ts","sourceRoot":"","sources":["../../src/shapes/polygram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0B,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,KAAK,WAAW,GAAG;IACf,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAyEF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC;IACpE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa;IAIpE,SAAS,CAAC,eAAe,IAAI,WAAW;IAYxC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM;IAIhD,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,SAAS,CAAC,YAAY;;;;IAItB,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW;;;;;;CAG3C"}
@@ -0,0 +1,90 @@
1
+ import { withPolygramDescriptor } from "@motion-script/core";
2
+ import { BaseShape } from "./base";
3
+ function buildPolygramSvg(cx, cy, rx, ry, sides, ratio, borderRadius) {
4
+ const totalPoints = sides * 2;
5
+ const angleStep = Math.PI / sides;
6
+ const startAngle = -Math.PI / 2;
7
+ const verts = [];
8
+ for (let i = 0; i < totalPoints; i++) {
9
+ const a = startAngle + i * angleStep;
10
+ const isOuter = i % 2 === 0;
11
+ const r = isOuter ? 1 : ratio;
12
+ verts.push([cx + rx * r * Math.cos(a), cy + ry * r * Math.sin(a)]);
13
+ }
14
+ if (borderRadius <= 0) {
15
+ const parts = verts.map(([x, y], i) => `${i === 0 ? "M" : "L"} ${x} ${y}`);
16
+ parts.push("Z");
17
+ return parts.join(" ");
18
+ }
19
+ const parts = [];
20
+ for (let i = 0; i < totalPoints; i++) {
21
+ const curr = verts[i];
22
+ const isOuter = i % 2 === 0;
23
+ if (!isOuter) {
24
+ parts.push(`${parts.length === 0 ? "M" : "L"} ${curr[0]} ${curr[1]}`);
25
+ continue;
26
+ }
27
+ const prev = verts[(i - 1 + totalPoints) % totalPoints];
28
+ const next = verts[(i + 1) % totalPoints];
29
+ const a0x = prev[0] - curr[0];
30
+ const a0y = prev[1] - curr[1];
31
+ const len0 = Math.hypot(a0x, a0y);
32
+ const u0x = a0x / len0;
33
+ const u0y = a0y / len0;
34
+ const a1x = next[0] - curr[0];
35
+ const a1y = next[1] - curr[1];
36
+ const len1 = Math.hypot(a1x, a1y);
37
+ const u1x = a1x / len1;
38
+ const u1y = a1y / len1;
39
+ const cosAngle = Math.max(-1, Math.min(1, u0x * u1x + u0y * u1y));
40
+ const halfAngle = Math.acos(cosAngle) / 2;
41
+ const tanHalf = Math.tan(halfAngle);
42
+ const maxT = Math.min(len0, len1) / 2;
43
+ let t = borderRadius / tanHalf;
44
+ if (t > maxT)
45
+ t = maxT;
46
+ const r = t * tanHalf;
47
+ const arcStartX = curr[0] + u0x * t;
48
+ const arcStartY = curr[1] + u0y * t;
49
+ const arcEndX = curr[0] + u1x * t;
50
+ const arcEndY = curr[1] + u1y * t;
51
+ parts.push(`${parts.length === 0 ? "M" : "L"} ${arcStartX} ${arcStartY}`);
52
+ parts.push(`A ${r} ${r} 0 0 1 ${arcEndX} ${arcEndY}`);
53
+ }
54
+ parts.push("Z");
55
+ return parts.join(" ");
56
+ }
57
+ /**
58
+ * Star polygon: alternates outer vertices (radius 1) and inner vertices
59
+ * (radius `ratio`). Only outer (convex) vertices are rounded by `borderRadius`;
60
+ * inner vertices stay sharp, matching typical star-shape conventions.
61
+ */
62
+ export class PolygramShape extends BaseShape {
63
+ resolveState(state) {
64
+ return withPolygramDescriptor(state);
65
+ }
66
+ computeGeometry() {
67
+ const s = this.fullState;
68
+ return {
69
+ cx: s.x, cy: s.y,
70
+ rx: s.width / 2,
71
+ ry: s.height / 2,
72
+ sides: Math.max(3, Math.round(s.sides)),
73
+ ratio: Math.max(0, Math.min(1, s.ratio)),
74
+ borderRadius: s.borderRadius,
75
+ };
76
+ }
77
+ buildSVGPath(geo) {
78
+ return buildPolygramSvg(geo.cx, geo.cy, geo.rx, geo.ry, geo.sides, geo.ratio, geo.borderRadius);
79
+ }
80
+ needsTrim() {
81
+ return this.fullState.start !== 0 || this.fullState.end !== 1;
82
+ }
83
+ getTrimRange() {
84
+ return { start: this.fullState.start, end: this.fullState.end };
85
+ }
86
+ computeBounds(geo) {
87
+ return { left: geo.cx - geo.rx, top: geo.cy - geo.ry, right: geo.cx + geo.rx, bottom: geo.cy + geo.ry };
88
+ }
89
+ }
90
+ //# sourceMappingURL=polygram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygram.js","sourceRoot":"","sources":["../../src/shapes/polygram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Paint } from "@motion-script/canvaskit";
2
+ import { RectState } from "@motion-script/core";
3
+ import { BaseShape } from "./base";
4
+ type RectGeo = {
5
+ left: number;
6
+ top: number;
7
+ right: number;
8
+ bottom: number;
9
+ tl: number;
10
+ tr: number;
11
+ br: number;
12
+ bl: number;
13
+ isZero: boolean;
14
+ isUniform: boolean;
15
+ };
16
+ /**
17
+ * Rect with optional per-corner radii. Radii are scaled down uniformly when
18
+ * they'd overlap (sum exceeds the side length) to avoid self-intersecting
19
+ * geometry. Isolated, untrimmed rects skip the SVG-path route entirely and
20
+ * draw/clip via `drawRect`/`drawRRect` for cheaper rendering and crisper edges.
21
+ */
22
+ export declare class RectShape extends BaseShape<RectState, RectGeo> {
23
+ protected resolveState(state: Partial<RectState>): RectState;
24
+ protected computeGeometry(): RectGeo;
25
+ protected buildSVGPath(geo: RectGeo): string;
26
+ protected needsTrim(): boolean;
27
+ protected getTrimRange(): {
28
+ start: number;
29
+ end: number;
30
+ };
31
+ protected computeBounds(geo: RectGeo): {
32
+ left: number;
33
+ top: number;
34
+ right: number;
35
+ bottom: number;
36
+ };
37
+ draw(paint: Paint, isolated: boolean): void;
38
+ clip(isolated: boolean): void;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=rect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../src/shapes/rect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAEH,SAAS,EAKZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,KAAK,OAAO,GAAG;IACX,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IACzD,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAC/C,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;CACvC,CAAC;AAoBF;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;IACxD,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS;IAI5D,SAAS,CAAC,eAAe,IAAI,OAAO;IAiCpC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM;IAW5C,SAAS,CAAC,SAAS,IAAI,OAAO;IAI9B,SAAS,CAAC,YAAY;;;;IAItB,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO;;;;;;IAI3B,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAiB3C,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;CAgBzC"}