@revideo/2d 0.2.3 → 0.2.4-alpha.894

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 (197) hide show
  1. package/editor/index.css +1 -1
  2. package/editor/index.js +529 -245
  3. package/lib/code/CodeCursor.d.ts +74 -74
  4. package/lib/code/CodeCursor.js +352 -286
  5. package/lib/code/CodeDiffer.d.ts +21 -16
  6. package/lib/code/CodeDiffer.js +39 -41
  7. package/lib/code/CodeFragment.d.ts +16 -8
  8. package/lib/code/CodeFragment.js +36 -36
  9. package/lib/code/CodeHighlighter.d.ts +59 -59
  10. package/lib/code/CodeHighlighter.js +1 -1
  11. package/lib/code/CodeMetrics.d.ts +12 -8
  12. package/lib/code/CodeMetrics.js +26 -24
  13. package/lib/code/CodeRange.d.ts +21 -5
  14. package/lib/code/CodeRange.js +131 -124
  15. package/lib/code/CodeScope.d.ts +18 -8
  16. package/lib/code/CodeScope.js +59 -61
  17. package/lib/code/CodeSelection.d.ts +9 -4
  18. package/lib/code/CodeSelection.js +8 -8
  19. package/lib/code/CodeSignal.d.ts +74 -47
  20. package/lib/code/CodeSignal.js +206 -189
  21. package/lib/code/CodeTokenizer.d.ts +1 -1
  22. package/lib/code/CodeTokenizer.js +41 -41
  23. package/lib/code/DefaultHighlightStyle.d.ts +2 -2
  24. package/lib/code/DefaultHighlightStyle.js +96 -96
  25. package/lib/code/LezerHighlighter.d.ts +21 -19
  26. package/lib/code/LezerHighlighter.js +101 -101
  27. package/lib/code/diff.d.ts +12 -9
  28. package/lib/code/diff.js +218 -205
  29. package/lib/code/extractRange.d.ts +7 -4
  30. package/lib/code/extractRange.js +79 -71
  31. package/lib/code/index.d.ts +1 -1
  32. package/lib/code/index.js +1 -1
  33. package/lib/components/Audio.d.ts +11 -11
  34. package/lib/components/Audio.js +115 -109
  35. package/lib/components/Bezier.d.ts +18 -18
  36. package/lib/components/Bezier.js +86 -75
  37. package/lib/components/Circle.d.ts +95 -90
  38. package/lib/components/Circle.js +85 -74
  39. package/lib/components/Code.d.ts +244 -211
  40. package/lib/components/Code.js +317 -269
  41. package/lib/components/CodeBlock.d.ts +109 -67
  42. package/lib/components/CodeBlock.js +414 -373
  43. package/lib/components/CubicBezier.d.ts +36 -36
  44. package/lib/components/CubicBezier.js +52 -49
  45. package/lib/components/Curve.d.ts +208 -198
  46. package/lib/components/Curve.js +270 -269
  47. package/lib/components/Grid.d.ts +47 -42
  48. package/lib/components/Grid.js +63 -56
  49. package/lib/components/Icon.d.ts +55 -50
  50. package/lib/components/Icon.js +58 -50
  51. package/lib/components/Img.d.ts +86 -79
  52. package/lib/components/Img.js +193 -181
  53. package/lib/components/Knot.d.ts +97 -78
  54. package/lib/components/Knot.js +81 -60
  55. package/lib/components/Latex.d.ts +12 -12
  56. package/lib/components/Latex.js +77 -65
  57. package/lib/components/Layout.d.ts +455 -413
  58. package/lib/components/Layout.js +666 -681
  59. package/lib/components/Line.d.ts +61 -49
  60. package/lib/components/Line.js +216 -193
  61. package/lib/components/Media.d.ts +35 -35
  62. package/lib/components/Media.js +135 -134
  63. package/lib/components/Node.d.ts +875 -830
  64. package/lib/components/Node.js +1383 -1314
  65. package/lib/components/Path.d.ts +35 -14
  66. package/lib/components/Path.js +100 -89
  67. package/lib/components/Polygon.d.ts +60 -55
  68. package/lib/components/Polygon.js +71 -66
  69. package/lib/components/QuadBezier.d.ts +29 -29
  70. package/lib/components/QuadBezier.js +50 -45
  71. package/lib/components/Ray.d.ts +28 -28
  72. package/lib/components/Ray.js +71 -64
  73. package/lib/components/Rect.d.ts +115 -108
  74. package/lib/components/Rect.js +78 -72
  75. package/lib/components/SVG.d.ts +165 -139
  76. package/lib/components/SVG.js +609 -541
  77. package/lib/components/Shape.d.ts +44 -35
  78. package/lib/components/Shape.js +112 -127
  79. package/lib/components/Spline.d.ts +46 -40
  80. package/lib/components/Spline.js +190 -175
  81. package/lib/components/Txt.d.ts +55 -44
  82. package/lib/components/Txt.js +156 -155
  83. package/lib/components/TxtLeaf.d.ts +20 -16
  84. package/lib/components/TxtLeaf.js +177 -158
  85. package/lib/components/Video.d.ts +41 -41
  86. package/lib/components/Video.js +138 -135
  87. package/lib/components/View2D.d.ts +21 -21
  88. package/lib/components/View2D.js +98 -85
  89. package/lib/components/index.d.ts +1 -1
  90. package/lib/components/index.js +1 -1
  91. package/lib/components/types.d.ts +22 -9
  92. package/lib/components/types.js +1 -1
  93. package/lib/curves/ArcSegment.d.ts +36 -24
  94. package/lib/curves/ArcSegment.js +145 -94
  95. package/lib/curves/CircleSegment.d.ts +26 -16
  96. package/lib/curves/CircleSegment.js +56 -49
  97. package/lib/curves/CubicBezierSegment.d.ts +18 -13
  98. package/lib/curves/CubicBezierSegment.js +79 -46
  99. package/lib/curves/CurveDrawingInfo.d.ts +9 -9
  100. package/lib/curves/CurveDrawingInfo.js +1 -1
  101. package/lib/curves/CurvePoint.d.ts +13 -13
  102. package/lib/curves/CurvePoint.js +1 -1
  103. package/lib/curves/CurveProfile.d.ts +5 -5
  104. package/lib/curves/CurveProfile.js +1 -1
  105. package/lib/curves/KnotInfo.d.ts +8 -8
  106. package/lib/curves/KnotInfo.js +1 -1
  107. package/lib/curves/LineSegment.d.ts +19 -14
  108. package/lib/curves/LineSegment.js +42 -42
  109. package/lib/curves/Polynomial.d.ts +110 -110
  110. package/lib/curves/Polynomial.js +249 -239
  111. package/lib/curves/Polynomial2D.d.ts +20 -20
  112. package/lib/curves/Polynomial2D.js +46 -42
  113. package/lib/curves/PolynomialSegment.d.ts +42 -37
  114. package/lib/curves/PolynomialSegment.js +83 -81
  115. package/lib/curves/QuadBezierSegment.d.ts +12 -12
  116. package/lib/curves/QuadBezierSegment.js +71 -41
  117. package/lib/curves/Segment.d.ts +12 -7
  118. package/lib/curves/Segment.js +2 -3
  119. package/lib/curves/UniformPolynomialCurveSampler.d.ts +34 -34
  120. package/lib/curves/UniformPolynomialCurveSampler.js +68 -62
  121. package/lib/curves/createCurveProfileLerp.d.ts +17 -6
  122. package/lib/curves/createCurveProfileLerp.js +211 -208
  123. package/lib/curves/getBezierSplineProfile.d.ts +8 -4
  124. package/lib/curves/getBezierSplineProfile.js +145 -101
  125. package/lib/curves/getCircleProfile.d.ts +10 -4
  126. package/lib/curves/getCircleProfile.js +72 -40
  127. package/lib/curves/getPathProfile.d.ts +2 -2
  128. package/lib/curves/getPathProfile.js +135 -112
  129. package/lib/curves/getPointAtDistance.d.ts +7 -4
  130. package/lib/curves/getPointAtDistance.js +12 -12
  131. package/lib/curves/getPolylineProfile.d.ts +8 -4
  132. package/lib/curves/getPolylineProfile.js +67 -54
  133. package/lib/curves/getRectProfile.d.ts +9 -4
  134. package/lib/curves/getRectProfile.js +117 -52
  135. package/lib/curves/index.d.ts +1 -1
  136. package/lib/curves/index.js +1 -1
  137. package/lib/decorators/canvasStyleSignal.d.ts +3 -3
  138. package/lib/decorators/canvasStyleSignal.js +10 -10
  139. package/lib/decorators/colorSignal.d.ts +1 -1
  140. package/lib/decorators/colorSignal.js +7 -7
  141. package/lib/decorators/compound.d.ts +4 -2
  142. package/lib/decorators/compound.js +43 -23
  143. package/lib/decorators/computed.d.ts +1 -1
  144. package/lib/decorators/computed.js +9 -9
  145. package/lib/decorators/defaultStyle.d.ts +5 -2
  146. package/lib/decorators/defaultStyle.js +11 -11
  147. package/lib/decorators/filtersSignal.d.ts +28 -8
  148. package/lib/decorators/filtersSignal.js +87 -64
  149. package/lib/decorators/index.d.ts +1 -1
  150. package/lib/decorators/index.js +1 -1
  151. package/lib/decorators/initializers.d.ts +5 -2
  152. package/lib/decorators/initializers.js +18 -19
  153. package/lib/decorators/nodeName.d.ts +1 -1
  154. package/lib/decorators/nodeName.js +4 -4
  155. package/lib/decorators/signal.d.ts +40 -20
  156. package/lib/decorators/signal.js +113 -104
  157. package/lib/decorators/spacingSignal.d.ts +1 -1
  158. package/lib/decorators/spacingSignal.js +13 -13
  159. package/lib/decorators/vector2Signal.d.ts +13 -7
  160. package/lib/decorators/vector2Signal.js +15 -13
  161. package/lib/index.d.ts +1 -1
  162. package/lib/index.js +1 -1
  163. package/lib/jsx-dev-runtime.d.ts +3 -3
  164. package/lib/jsx-dev-runtime.js +3 -3
  165. package/lib/jsx-runtime.d.ts +19 -9
  166. package/lib/jsx-runtime.js +18 -18
  167. package/lib/partials/Filter.d.ts +24 -16
  168. package/lib/partials/Filter.js +69 -69
  169. package/lib/partials/Gradient.d.ts +30 -24
  170. package/lib/partials/Gradient.js +69 -58
  171. package/lib/partials/Pattern.d.ts +14 -9
  172. package/lib/partials/Pattern.js +30 -24
  173. package/lib/partials/ShaderConfig.d.ts +81 -74
  174. package/lib/partials/ShaderConfig.js +22 -23
  175. package/lib/partials/index.d.ts +1 -1
  176. package/lib/partials/index.js +1 -1
  177. package/lib/partials/types.d.ts +19 -6
  178. package/lib/partials/types.js +1 -1
  179. package/lib/scenes/Scene2D.d.ts +42 -23
  180. package/lib/scenes/Scene2D.js +161 -151
  181. package/lib/scenes/index.d.ts +1 -1
  182. package/lib/scenes/index.js +1 -1
  183. package/lib/scenes/makeScene2D.d.ts +7 -5
  184. package/lib/scenes/makeScene2D.js +10 -10
  185. package/lib/scenes/useScene2D.d.ts +2 -2
  186. package/lib/scenes/useScene2D.js +3 -3
  187. package/lib/utils/CanvasUtils.d.ts +93 -21
  188. package/lib/utils/CanvasUtils.js +186 -105
  189. package/lib/utils/diff.d.ts +25 -18
  190. package/lib/utils/diff.js +84 -87
  191. package/lib/utils/index.d.ts +1 -1
  192. package/lib/utils/index.js +1 -1
  193. package/lib/utils/is.d.ts +4 -2
  194. package/lib/utils/is.js +2 -2
  195. package/lib/utils/makeSignalExtensions.d.ts +11 -4
  196. package/lib/utils/makeSignalExtensions.js +17 -17
  197. package/package.json +5 -5
@@ -1,306 +1,372 @@
1
- import { clampRemap, Color, map, unwrap, Vector2, } from '@revideo/core';
2
- import { parseCodeFragment } from './CodeFragment';
3
- import { isCodeScope } from './CodeScope';
4
- import { isPointInCodeSelection } from './CodeSelection';
1
+ import {clampRemap, Color, map, unwrap, Vector2} from '@revideo/core';
2
+ import {parseCodeFragment} from './CodeFragment';
3
+ import {isCodeScope} from './CodeScope';
4
+ import {isPointInCodeSelection} from './CodeSelection';
5
5
  /**
6
6
  * A stateful class for recursively traversing a code scope.
7
7
  *
8
8
  * @internal
9
9
  */
10
10
  export class CodeCursor {
11
- constructor(node) {
12
- this.node = node;
13
- this.cursor = new Vector2();
14
- this.beforeCursor = new Vector2();
15
- this.afterCursor = new Vector2();
16
- this.beforeIndex = 0;
17
- this.afterIndex = 0;
18
- this.context = {};
19
- this.monoWidth = 0;
20
- this.maxWidth = 0;
21
- this.lineHeight = 0;
22
- this.fallbackFill = new Color('white');
23
- this.caches = null;
24
- this.highlighter = null;
25
- this.selection = [];
26
- this.selectionProgress = null;
27
- this.globalProgress = [];
28
- this.fragmentDrawingInfo = [];
29
- this.fontHeight = 0;
30
- this.verticalOffset = 0;
11
+ constructor(node) {
12
+ this.node = node;
13
+ this.cursor = new Vector2();
14
+ this.beforeCursor = new Vector2();
15
+ this.afterCursor = new Vector2();
16
+ this.beforeIndex = 0;
17
+ this.afterIndex = 0;
18
+ this.context = {};
19
+ this.monoWidth = 0;
20
+ this.maxWidth = 0;
21
+ this.lineHeight = 0;
22
+ this.fallbackFill = new Color('white');
23
+ this.caches = null;
24
+ this.highlighter = null;
25
+ this.selection = [];
26
+ this.selectionProgress = null;
27
+ this.globalProgress = [];
28
+ this.fragmentDrawingInfo = [];
29
+ this.fontHeight = 0;
30
+ this.verticalOffset = 0;
31
+ }
32
+ /**
33
+ * Prepare the cursor for the next traversal.
34
+ *
35
+ * @param context - The context used to measure and draw the code.
36
+ */
37
+ setupMeasure(context) {
38
+ const metrics = context.measureText('X');
39
+ this.monoWidth = metrics.width;
40
+ this.fontHeight =
41
+ metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;
42
+ this.verticalOffset = metrics.fontBoundingBoxAscent;
43
+ this.context = context;
44
+ this.lineHeight = parseFloat(this.node.styles.lineHeight);
45
+ this.cursor = new Vector2();
46
+ this.beforeCursor = new Vector2();
47
+ this.afterCursor = new Vector2();
48
+ this.beforeIndex = 0;
49
+ this.afterIndex = 0;
50
+ this.maxWidth = 0;
51
+ }
52
+ setupDraw(context) {
53
+ this.setupMeasure(context);
54
+ const fill = this.node.fill();
55
+ this.fallbackFill = fill instanceof Color ? fill : new Color('white');
56
+ this.caches = this.node.highlighterCache();
57
+ this.highlighter = this.node.highlighter();
58
+ this.selection = this.node.selection();
59
+ this.selectionProgress = this.node.selectionProgress();
60
+ this.fragmentDrawingInfo = [];
61
+ this.globalProgress = [];
62
+ }
63
+ /**
64
+ * Measure the desired size of the code scope.
65
+ *
66
+ * @remarks
67
+ * The result can be retrieved with {@link getSize}.
68
+ *
69
+ * @param scope - The code scope to measure.
70
+ */
71
+ measureSize(scope) {
72
+ const progress = unwrap(scope.progress);
73
+ for (const wrapped of scope.fragments) {
74
+ const possibleFragment = unwrap(wrapped);
75
+ if (isCodeScope(possibleFragment)) {
76
+ this.measureSize(possibleFragment);
77
+ continue;
78
+ }
79
+ if (Array.isArray(possibleFragment)) {
80
+ this.measureSize({
81
+ progress: scope.progress,
82
+ fragments: possibleFragment,
83
+ });
84
+ continue;
85
+ }
86
+ const fragment = parseCodeFragment(
87
+ possibleFragment,
88
+ this.context,
89
+ this.monoWidth,
90
+ );
91
+ const beforeMaxWidth = this.calculateMaxWidth(fragment.before);
92
+ const afterMaxWidth = this.calculateMaxWidth(fragment.after);
93
+ const maxWidth = map(beforeMaxWidth, afterMaxWidth, progress);
94
+ if (maxWidth > this.maxWidth) {
95
+ this.maxWidth = maxWidth;
96
+ }
97
+ const beforeEnd = this.calculateWidth(fragment.before);
98
+ const afterEnd = this.calculateWidth(fragment.after);
99
+ this.cursor.x = map(beforeEnd, afterEnd, progress);
100
+ if (this.cursor.y === 0) {
101
+ this.cursor.y = 1;
102
+ }
103
+ this.cursor.y += map(
104
+ fragment.before.newRows,
105
+ fragment.after.newRows,
106
+ progress,
107
+ );
31
108
  }
32
- /**
33
- * Prepare the cursor for the next traversal.
34
- *
35
- * @param context - The context used to measure and draw the code.
36
- */
37
- setupMeasure(context) {
38
- const metrics = context.measureText('X');
39
- this.monoWidth = metrics.width;
40
- this.fontHeight =
41
- metrics.fontBoundingBoxDescent + metrics.fontBoundingBoxAscent;
42
- this.verticalOffset = metrics.fontBoundingBoxAscent;
43
- this.context = context;
44
- this.lineHeight = parseFloat(this.node.styles.lineHeight);
45
- this.cursor = new Vector2();
46
- this.beforeCursor = new Vector2();
47
- this.afterCursor = new Vector2();
48
- this.beforeIndex = 0;
49
- this.afterIndex = 0;
50
- this.maxWidth = 0;
109
+ }
110
+ /**
111
+ * Get the size measured by the cursor.
112
+ */
113
+ getSize() {
114
+ return {
115
+ x: this.maxWidth * this.monoWidth,
116
+ y: this.cursor.y * this.lineHeight + this.verticalOffset,
117
+ };
118
+ }
119
+ /**
120
+ * Get the drawing information created by the cursor.
121
+ */
122
+ getDrawingInfo() {
123
+ return {
124
+ fragments: this.fragmentDrawingInfo,
125
+ verticalOffset: this.verticalOffset,
126
+ fontHeight: this.fontHeight,
127
+ };
128
+ }
129
+ /**
130
+ * Draw the given code scope.
131
+ *
132
+ * @param scope - The code scope to draw.
133
+ */
134
+ drawScope(scope) {
135
+ const progress = unwrap(scope.progress);
136
+ for (const wrappedFragment of scope.fragments) {
137
+ const possibleFragment = unwrap(wrappedFragment);
138
+ if (isCodeScope(possibleFragment)) {
139
+ this.drawScope(possibleFragment);
140
+ continue;
141
+ }
142
+ if (Array.isArray(possibleFragment)) {
143
+ this.drawScope({
144
+ progress: scope.progress,
145
+ fragments: possibleFragment,
146
+ });
147
+ continue;
148
+ }
149
+ const fragment = parseCodeFragment(
150
+ possibleFragment,
151
+ this.context,
152
+ this.monoWidth,
153
+ );
154
+ const timingOffset = 0.8;
155
+ let alpha = 1;
156
+ let offsetY = 0;
157
+ if (fragment.before.content !== fragment.after.content) {
158
+ const mirrored = Math.abs(progress - 0.5) * 2;
159
+ alpha = clampRemap(1, 1 - timingOffset, 1, 0, mirrored);
160
+ const scale = progress < 0.5 ? 4 : -4;
161
+ offsetY = map(
162
+ Math.abs(fragment.after.newRows - fragment.before.newRows) / scale,
163
+ 0,
164
+ mirrored,
165
+ );
166
+ }
167
+ this.drawToken(fragment, scope, this.cursor.addY(offsetY), alpha);
168
+ this.beforeCursor.x = this.calculateWidth(
169
+ fragment.before,
170
+ this.beforeCursor.x,
171
+ );
172
+ this.afterCursor.x = this.calculateWidth(
173
+ fragment.after,
174
+ this.afterCursor.x,
175
+ );
176
+ this.beforeCursor.y += fragment.before.newRows;
177
+ this.afterCursor.y += fragment.after.newRows;
178
+ this.beforeIndex += fragment.before.content.length;
179
+ this.afterIndex += fragment.after.content.length;
180
+ this.cursor.y += map(
181
+ fragment.before.newRows,
182
+ fragment.after.newRows,
183
+ progress,
184
+ );
185
+ const beforeEnd = this.calculateWidth(fragment.before);
186
+ const afterEnd = this.calculateWidth(fragment.after);
187
+ this.cursor.x = map(beforeEnd, afterEnd, progress);
51
188
  }
52
- setupDraw(context) {
53
- this.setupMeasure(context);
54
- const fill = this.node.fill();
55
- this.fallbackFill =
56
- fill instanceof Color ? fill : new Color('white');
57
- this.caches = this.node.highlighterCache();
58
- this.highlighter = this.node.highlighter();
59
- this.selection = this.node.selection();
60
- this.selectionProgress = this.node.selectionProgress();
61
- this.fragmentDrawingInfo = [];
62
- this.globalProgress = [];
189
+ }
190
+ drawToken(fragment, scope, offset, alpha) {
191
+ const progress = unwrap(scope.progress);
192
+ const currentProgress = this.currentProgress();
193
+ if (progress > 0) {
194
+ this.globalProgress.push(progress);
63
195
  }
64
- /**
65
- * Measure the desired size of the code scope.
66
- *
67
- * @remarks
68
- * The result can be retrieved with {@link getSize}.
69
- *
70
- * @param scope - The code scope to measure.
71
- */
72
- measureSize(scope) {
73
- const progress = unwrap(scope.progress);
74
- for (const wrapped of scope.fragments) {
75
- const possibleFragment = unwrap(wrapped);
76
- if (isCodeScope(possibleFragment)) {
77
- this.measureSize(possibleFragment);
78
- continue;
79
- }
80
- if (Array.isArray(possibleFragment)) {
81
- this.measureSize({
82
- progress: scope.progress,
83
- fragments: possibleFragment,
84
- });
85
- continue;
86
- }
87
- const fragment = parseCodeFragment(possibleFragment, this.context, this.monoWidth);
88
- const beforeMaxWidth = this.calculateMaxWidth(fragment.before);
89
- const afterMaxWidth = this.calculateMaxWidth(fragment.after);
90
- const maxWidth = map(beforeMaxWidth, afterMaxWidth, progress);
91
- if (maxWidth > this.maxWidth) {
92
- this.maxWidth = maxWidth;
93
- }
94
- const beforeEnd = this.calculateWidth(fragment.before);
95
- const afterEnd = this.calculateWidth(fragment.after);
96
- this.cursor.x = map(beforeEnd, afterEnd, progress);
97
- if (this.cursor.y === 0) {
98
- this.cursor.y = 1;
99
- }
100
- this.cursor.y += map(fragment.before.newRows, fragment.after.newRows, progress);
196
+ const code = progress < 0.5 ? fragment.before : fragment.after;
197
+ let hasOffset = true;
198
+ let width = 0;
199
+ let stringLength = 0;
200
+ let y = 0;
201
+ for (let i = 0; i < code.content.length; i++) {
202
+ let color = this.fallbackFill.serialize();
203
+ let char = code.content.charAt(i);
204
+ const selection = {
205
+ before: null,
206
+ after: null,
207
+ };
208
+ if (char === '\n') {
209
+ y++;
210
+ hasOffset = false;
211
+ width = 0;
212
+ stringLength = 0;
213
+ selection.before = null;
214
+ selection.after = null;
215
+ continue;
216
+ }
217
+ const beforeHighlight =
218
+ this.caches &&
219
+ this.highlighter?.highlight(this.beforeIndex + i, this.caches.before);
220
+ const afterHighlight =
221
+ this.caches &&
222
+ this.highlighter?.highlight(this.afterIndex + i, this.caches.after);
223
+ const highlight = progress < 0.5 ? beforeHighlight : afterHighlight;
224
+ if (highlight) {
225
+ // Handle edge cases where the highlight style changes despite the
226
+ // content being the same. The code doesn't fade in and out so the color
227
+ // has to be interpolated to avoid jarring changes.
228
+ if (
229
+ fragment.before.content === fragment.after.content &&
230
+ beforeHighlight?.color !== afterHighlight?.color
231
+ ) {
232
+ highlight.color = Color.lerp(
233
+ beforeHighlight?.color ?? this.fallbackFill,
234
+ afterHighlight?.color ?? this.fallbackFill,
235
+ progress,
236
+ ).serialize();
101
237
  }
102
- }
103
- /**
104
- * Get the size measured by the cursor.
105
- */
106
- getSize() {
107
- return {
108
- x: this.maxWidth * this.monoWidth,
109
- y: this.cursor.y * this.lineHeight + this.verticalOffset,
110
- };
111
- }
112
- /**
113
- * Get the drawing information created by the cursor.
114
- */
115
- getDrawingInfo() {
116
- return {
117
- fragments: this.fragmentDrawingInfo,
118
- verticalOffset: this.verticalOffset,
119
- fontHeight: this.fontHeight,
120
- };
121
- }
122
- /**
123
- * Draw the given code scope.
124
- *
125
- * @param scope - The code scope to draw.
126
- */
127
- drawScope(scope) {
128
- const progress = unwrap(scope.progress);
129
- for (const wrappedFragment of scope.fragments) {
130
- const possibleFragment = unwrap(wrappedFragment);
131
- if (isCodeScope(possibleFragment)) {
132
- this.drawScope(possibleFragment);
133
- continue;
134
- }
135
- if (Array.isArray(possibleFragment)) {
136
- this.drawScope({
137
- progress: scope.progress,
138
- fragments: possibleFragment,
139
- });
140
- continue;
141
- }
142
- const fragment = parseCodeFragment(possibleFragment, this.context, this.monoWidth);
143
- const timingOffset = 0.8;
144
- let alpha = 1;
145
- let offsetY = 0;
146
- if (fragment.before.content !== fragment.after.content) {
147
- const mirrored = Math.abs(progress - 0.5) * 2;
148
- alpha = clampRemap(1, 1 - timingOffset, 1, 0, mirrored);
149
- const scale = progress < 0.5 ? 4 : -4;
150
- offsetY = map(Math.abs(fragment.after.newRows - fragment.before.newRows) / scale, 0, mirrored);
151
- }
152
- this.drawToken(fragment, scope, this.cursor.addY(offsetY), alpha);
153
- this.beforeCursor.x = this.calculateWidth(fragment.before, this.beforeCursor.x);
154
- this.afterCursor.x = this.calculateWidth(fragment.after, this.afterCursor.x);
155
- this.beforeCursor.y += fragment.before.newRows;
156
- this.afterCursor.y += fragment.after.newRows;
157
- this.beforeIndex += fragment.before.content.length;
158
- this.afterIndex += fragment.after.content.length;
159
- this.cursor.y += map(fragment.before.newRows, fragment.after.newRows, progress);
160
- const beforeEnd = this.calculateWidth(fragment.before);
161
- const afterEnd = this.calculateWidth(fragment.after);
162
- this.cursor.x = map(beforeEnd, afterEnd, progress);
238
+ if (highlight.color) {
239
+ color = highlight.color;
163
240
  }
164
- }
165
- drawToken(fragment, scope, offset, alpha) {
166
- const progress = unwrap(scope.progress);
167
- const currentProgress = this.currentProgress();
168
- if (progress > 0) {
169
- this.globalProgress.push(progress);
241
+ let skipAhead = 0;
242
+ do {
243
+ if (
244
+ this.processSelection(
245
+ selection,
246
+ skipAhead,
247
+ hasOffset,
248
+ stringLength,
249
+ y,
250
+ )
251
+ ) {
252
+ break;
253
+ }
254
+ skipAhead++;
255
+ } while (skipAhead < highlight.skipAhead);
256
+ if (skipAhead > 1) {
257
+ char = code.content.slice(i, i + skipAhead);
170
258
  }
171
- const code = progress < 0.5 ? fragment.before : fragment.after;
172
- let hasOffset = true;
173
- let width = 0;
174
- let stringLength = 0;
175
- let y = 0;
176
- for (let i = 0; i < code.content.length; i++) {
177
- let color = this.fallbackFill.serialize();
178
- let char = code.content.charAt(i);
179
- const selection = {
180
- before: null,
181
- after: null,
182
- };
183
- if (char === '\n') {
184
- y++;
185
- hasOffset = false;
186
- width = 0;
187
- stringLength = 0;
188
- selection.before = null;
189
- selection.after = null;
190
- continue;
191
- }
192
- const beforeHighlight = this.caches &&
193
- this.highlighter?.highlight(this.beforeIndex + i, this.caches.before);
194
- const afterHighlight = this.caches &&
195
- this.highlighter?.highlight(this.afterIndex + i, this.caches.after);
196
- const highlight = progress < 0.5 ? beforeHighlight : afterHighlight;
197
- if (highlight) {
198
- // Handle edge cases where the highlight style changes despite the
199
- // content being the same. The code doesn't fade in and out so the color
200
- // has to be interpolated to avoid jarring changes.
201
- if (fragment.before.content === fragment.after.content &&
202
- beforeHighlight?.color !== afterHighlight?.color) {
203
- highlight.color = Color.lerp(beforeHighlight?.color ?? this.fallbackFill, afterHighlight?.color ?? this.fallbackFill, progress).serialize();
204
- }
205
- if (highlight.color) {
206
- color = highlight.color;
207
- }
208
- let skipAhead = 0;
209
- do {
210
- if (this.processSelection(selection, skipAhead, hasOffset, stringLength, y)) {
211
- break;
212
- }
213
- skipAhead++;
214
- } while (skipAhead < highlight.skipAhead);
215
- if (skipAhead > 1) {
216
- char = code.content.slice(i, i + skipAhead);
217
- }
218
- i += char.length - 1;
219
- }
220
- else {
221
- this.processSelection(selection, 0, hasOffset, stringLength, y);
222
- let skipAhead = 1;
223
- while (i < code.content.length - 1 &&
224
- code.content.charAt(i + 1) !== '\n') {
225
- if (this.processSelection(selection, skipAhead, hasOffset, stringLength, y)) {
226
- break;
227
- }
228
- skipAhead++;
229
- char += code.content.charAt(++i);
230
- }
231
- }
232
- let time;
233
- const selectionAfter = selection.after ?? 0;
234
- const selectionBefore = selection.before ?? 0;
235
- if (fragment.before.content === '') {
236
- time = selectionAfter;
237
- }
238
- else if (fragment.after.content === '') {
239
- time = selectionBefore;
240
- }
241
- else {
242
- time = map(selectionBefore, selectionAfter, this.selectionProgress ?? currentProgress);
243
- }
244
- const measure = this.context.measureText(char);
245
- this.fragmentDrawingInfo.push({
246
- text: char,
247
- position: new Vector2((hasOffset ? offset.x + width : width) * this.monoWidth, (offset.y + y) * this.lineHeight),
248
- cursor: new Vector2(hasOffset ? this.beforeCursor.x + stringLength : stringLength, this.beforeCursor.y + y),
249
- alpha,
250
- characterSize: new Vector2(measure.width / char.length, this.fontHeight),
251
- fill: color,
252
- time,
253
- });
254
- stringLength += char.length;
255
- width += Math.round(measure.width / this.monoWidth);
259
+ i += char.length - 1;
260
+ } else {
261
+ this.processSelection(selection, 0, hasOffset, stringLength, y);
262
+ let skipAhead = 1;
263
+ while (
264
+ i < code.content.length - 1 &&
265
+ code.content.charAt(i + 1) !== '\n'
266
+ ) {
267
+ if (
268
+ this.processSelection(
269
+ selection,
270
+ skipAhead,
271
+ hasOffset,
272
+ stringLength,
273
+ y,
274
+ )
275
+ ) {
276
+ break;
277
+ }
278
+ skipAhead++;
279
+ char += code.content.charAt(++i);
256
280
  }
281
+ }
282
+ let time;
283
+ const selectionAfter = selection.after ?? 0;
284
+ const selectionBefore = selection.before ?? 0;
285
+ if (fragment.before.content === '') {
286
+ time = selectionAfter;
287
+ } else if (fragment.after.content === '') {
288
+ time = selectionBefore;
289
+ } else {
290
+ time = map(
291
+ selectionBefore,
292
+ selectionAfter,
293
+ this.selectionProgress ?? currentProgress,
294
+ );
295
+ }
296
+ const measure = this.context.measureText(char);
297
+ this.fragmentDrawingInfo.push({
298
+ text: char,
299
+ position: new Vector2(
300
+ (hasOffset ? offset.x + width : width) * this.monoWidth,
301
+ (offset.y + y) * this.lineHeight,
302
+ ),
303
+ cursor: new Vector2(
304
+ hasOffset ? this.beforeCursor.x + stringLength : stringLength,
305
+ this.beforeCursor.y + y,
306
+ ),
307
+ alpha,
308
+ characterSize: new Vector2(
309
+ measure.width / char.length,
310
+ this.fontHeight,
311
+ ),
312
+ fill: color,
313
+ time,
314
+ });
315
+ stringLength += char.length;
316
+ width += Math.round(measure.width / this.monoWidth);
257
317
  }
258
- calculateWidth(metrics, x = this.cursor.x) {
259
- return metrics.newRows === 0 ? x + metrics.lastWidth : metrics.lastWidth;
318
+ }
319
+ calculateWidth(metrics, x = this.cursor.x) {
320
+ return metrics.newRows === 0 ? x + metrics.lastWidth : metrics.lastWidth;
321
+ }
322
+ calculateMaxWidth(metrics, x = this.cursor.x) {
323
+ return Math.max(this.maxWidth, metrics.maxWidth, x + metrics.firstWidth);
324
+ }
325
+ currentProgress() {
326
+ if (this.globalProgress.length === 0) {
327
+ return 0;
260
328
  }
261
- calculateMaxWidth(metrics, x = this.cursor.x) {
262
- return Math.max(this.maxWidth, metrics.maxWidth, x + metrics.firstWidth);
329
+ let sum = 0;
330
+ for (const progress of this.globalProgress) {
331
+ sum += progress;
263
332
  }
264
- currentProgress() {
265
- if (this.globalProgress.length === 0) {
266
- return 0;
267
- }
268
- let sum = 0;
269
- for (const progress of this.globalProgress) {
270
- sum += progress;
271
- }
272
- return sum / this.globalProgress.length;
333
+ return sum / this.globalProgress.length;
334
+ }
335
+ processSelection(selection, skipAhead, hasOffset, stringLength, y) {
336
+ let shouldBreak = false;
337
+ let currentSelected = this.isSelected(
338
+ (hasOffset ? this.beforeCursor.x + stringLength : stringLength) +
339
+ skipAhead,
340
+ this.beforeCursor.y + y,
341
+ );
342
+ if (selection.before !== null && selection.before !== currentSelected) {
343
+ shouldBreak = true;
344
+ } else {
345
+ selection.before = currentSelected;
273
346
  }
274
- processSelection(selection, skipAhead, hasOffset, stringLength, y) {
275
- let shouldBreak = false;
276
- let currentSelected = this.isSelected((hasOffset ? this.beforeCursor.x + stringLength : stringLength) +
277
- skipAhead, this.beforeCursor.y + y);
278
- if (selection.before !== null && selection.before !== currentSelected) {
279
- shouldBreak = true;
280
- }
281
- else {
282
- selection.before = currentSelected;
283
- }
284
- currentSelected = this.isSelected((hasOffset ? this.afterCursor.x + stringLength : stringLength) +
285
- skipAhead, this.afterCursor.y + y, true);
286
- if (selection.after !== null && selection.after !== currentSelected) {
287
- shouldBreak = true;
288
- }
289
- else {
290
- selection.after = currentSelected;
291
- }
292
- return shouldBreak;
347
+ currentSelected = this.isSelected(
348
+ (hasOffset ? this.afterCursor.x + stringLength : stringLength) +
349
+ skipAhead,
350
+ this.afterCursor.y + y,
351
+ true,
352
+ );
353
+ if (selection.after !== null && selection.after !== currentSelected) {
354
+ shouldBreak = true;
355
+ } else {
356
+ selection.after = currentSelected;
293
357
  }
294
- isSelected(x, y, isAfter) {
295
- const point = [y, x];
296
- const maxSelection = isPointInCodeSelection(point, this.selection) ? 1 : 0;
297
- if (this.node.oldSelection === null || this.selectionProgress === null) {
298
- return maxSelection;
299
- }
300
- if (isAfter) {
301
- return maxSelection;
302
- }
303
- return isPointInCodeSelection(point, this.node.oldSelection) ? 1 : 0;
358
+ return shouldBreak;
359
+ }
360
+ isSelected(x, y, isAfter) {
361
+ const point = [y, x];
362
+ const maxSelection = isPointInCodeSelection(point, this.selection) ? 1 : 0;
363
+ if (this.node.oldSelection === null || this.selectionProgress === null) {
364
+ return maxSelection;
365
+ }
366
+ if (isAfter) {
367
+ return maxSelection;
304
368
  }
369
+ return isPointInCodeSelection(point, this.node.oldSelection) ? 1 : 0;
370
+ }
305
371
  }
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUN1cnNvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY29kZS9Db2RlQ3Vyc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsS0FBSyxFQUNMLEdBQUcsRUFFSCxNQUFNLEVBQ04sT0FBTyxHQUNSLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBZSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSS9ELE9BQU8sRUFBWSxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFZdkQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBb0JyQixZQUFvQyxJQUFVO1FBQVYsU0FBSSxHQUFKLElBQUksQ0FBTTtRQW5CdkMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdkIsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsWUFBTyxHQUFHLEVBQThCLENBQUM7UUFDekMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsaUJBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxXQUFNLEdBQTZDLElBQUksQ0FBQztRQUN4RCxnQkFBVyxHQUEyQixJQUFJLENBQUM7UUFDM0MsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFDNUIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN4QyxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5Qix3QkFBbUIsR0FBOEIsRUFBRSxDQUFDO1FBQ3BELGVBQVUs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
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29kZUN1cnNvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY29kZS9Db2RlQ3Vyc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsS0FBSyxFQUNMLEdBQUcsRUFFSCxNQUFNLEVBQ04sT0FBTyxHQUNSLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBZSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBSS9ELE9BQU8sRUFBWSxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFZdkQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBb0JyQixZQUFvQyxJQUFVO1FBQVYsU0FBSSxHQUFKLElBQUksQ0FBTTtRQW5CdkMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdkIsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM1QixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsWUFBTyxHQUFHLEVBQThCLENBQUM7UUFDekMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsaUJBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxXQUFNLEdBQTZDLElBQUksQ0FBQztRQUN4RCxnQkFBVyxHQUEyQixJQUFJLENBQUM7UUFDM0MsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFDNUIsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN4QyxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5Qix3QkFBbUIsR0FBOEIsRUFBRSxDQUFDO1FBQ3BELGVBQVUs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