react-native-reanimated 4.3.0-nightly-20251224-45cf72265 → 4.3.0-nightly-20260107-ce9032c25

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 (32) hide show
  1. package/lib/module/css/svg/native/configs/path.js +8 -3
  2. package/lib/module/css/svg/native/configs/path.js.map +1 -1
  3. package/lib/module/css/svg/native/processors/colors.js +3 -0
  4. package/lib/module/css/svg/native/processors/colors.js.map +1 -1
  5. package/lib/module/css/svg/native/processors/index.js +1 -0
  6. package/lib/module/css/svg/native/processors/index.js.map +1 -1
  7. package/lib/module/css/svg/native/processors/path.js +191 -0
  8. package/lib/module/css/svg/native/processors/path.js.map +1 -0
  9. package/lib/module/css/utils/index.js +1 -0
  10. package/lib/module/css/utils/index.js.map +1 -1
  11. package/lib/module/css/utils/path.js +127 -0
  12. package/lib/module/css/utils/path.js.map +1 -0
  13. package/lib/module/platform-specific/jsVersion.js +1 -1
  14. package/lib/typescript/css/svg/native/configs/path.d.ts.map +1 -1
  15. package/lib/typescript/css/svg/native/processors/colors.d.ts.map +1 -1
  16. package/lib/typescript/css/svg/native/processors/index.d.ts +1 -0
  17. package/lib/typescript/css/svg/native/processors/index.d.ts.map +1 -1
  18. package/lib/typescript/css/svg/native/processors/path.d.ts +7 -0
  19. package/lib/typescript/css/svg/native/processors/path.d.ts.map +1 -0
  20. package/lib/typescript/css/utils/index.d.ts +1 -0
  21. package/lib/typescript/css/utils/index.d.ts.map +1 -1
  22. package/lib/typescript/css/utils/path.d.ts +8 -0
  23. package/lib/typescript/css/utils/path.d.ts.map +1 -0
  24. package/lib/typescript/platform-specific/jsVersion.d.ts +1 -1
  25. package/package.json +2 -2
  26. package/src/css/svg/native/configs/path.ts +3 -2
  27. package/src/css/svg/native/processors/colors.ts +4 -0
  28. package/src/css/svg/native/processors/index.ts +1 -0
  29. package/src/css/svg/native/processors/path.ts +278 -0
  30. package/src/css/utils/index.ts +1 -0
  31. package/src/css/utils/path.ts +252 -0
  32. package/src/platform-specific/jsVersion.ts +1 -1
@@ -2,13 +2,18 @@
2
2
 
3
3
  // TODO: Fix me
4
4
  // @ts-ignore RNSVG doesn't export types for web, see https://github.com/software-mansion/react-native-svg/pull/2801
5
+ import { processOpacity, processSVGPath } from '../processors';
5
6
  import { commonSvgProps } from './common';
6
7
 
7
8
  // TODO: Fix me
8
9
  // @ts-ignore RNSVG doesn't export types for web, see https://github.com/software-mansion/react-native-svg/pull/2801
9
- // @ts-ignore - remove when more properties are added
10
10
  export const SVG_PATH_PROPERTIES_CONFIG = {
11
- ...commonSvgProps
12
- // TODO - add more properties
11
+ ...commonSvgProps,
12
+ d: {
13
+ process: processSVGPath
14
+ },
15
+ opacity: {
16
+ process: processOpacity
17
+ }
13
18
  };
14
19
  //# sourceMappingURL=path.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["commonSvgProps","SVG_PATH_PROPERTIES_CONFIG"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/configs/path.ts"],"mappings":"AAAA,YAAY;;AAEZ;AACA;AAIA,SAASA,cAAc,QAAQ,UAAU;;AAEzC;AACA;AACA;AACA,OAAO,MAAMC,0BAA4D,GAAG;EAC1E,GAAGD;EACH;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["processOpacity","processSVGPath","commonSvgProps","SVG_PATH_PROPERTIES_CONFIG","d","process","opacity"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/configs/path.ts"],"mappings":"AAAA,YAAY;;AAEZ;AACA;AAGA,SAASA,cAAc,EAAEC,cAAc,QAAQ,eAAe;AAE9D,SAASC,cAAc,QAAQ,UAAU;;AAEzC;AACA;AACA,OAAO,MAAMC,0BAA4D,GAAG;EAC1E,GAAGD,cAAc;EACjBE,CAAC,EAAE;IAAEC,OAAO,EAAEJ;EAAe,CAAC;EAC9BK,OAAO,EAAE;IAAED,OAAO,EAAEL;EAAe;AACrC,CAAC","ignoreList":[]}
@@ -6,6 +6,9 @@ export const ERROR_MESSAGES = {
6
6
  };
7
7
  export const processColorSVG = value => {
8
8
  const processed = processColorNumber(value);
9
+ if (value === 'none') {
10
+ return 0;
11
+ }
9
12
  if (processed) {
10
13
  return processed;
11
14
  }
@@ -1 +1 @@
1
- {"version":3,"names":["processColorNumber","ReanimatedError","ERROR_MESSAGES","invalidColor","color","JSON","stringify","processColorSVG","value","processed"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/processors/colors.ts"],"mappings":"AAAA,YAAY;;AAGZ,SACEA,kBAAkB,EAClBC,eAAe,QAEV,oBAAoB;AAE3B,OAAO,MAAMC,cAAc,GAAG;EAC5BC,YAAY,EAAGC,KAAc,IAC3B,wBAAwBC,IAAI,CAACC,SAAS,CAACF,KAAK,CAAC;AACjD,CAAC;AAED,OAAO,MAAMG,eAGZ,GAAIC,KAAK,IAAK;EACb,MAAMC,SAAS,GAAGT,kBAAkB,CAACQ,KAAK,CAAC;EAE3C,IAAIC,SAAS,EAAE;IACb,OAAOA,SAAS;EAClB;EAEA,IAAID,KAAK,KAAK,aAAa,EAAE;IAC3B,OAAO,KAAK;EACd;EACA,IAAIA,KAAK,KAAK,cAAc,EAAE;IAC5B,OAAO,cAAc;EACvB;EAEA,MAAM,IAAIP,eAAe,CAACC,cAAc,CAACC,YAAY,CAACK,KAAK,CAAC,CAAC;AAC/D,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["processColorNumber","ReanimatedError","ERROR_MESSAGES","invalidColor","color","JSON","stringify","processColorSVG","value","processed"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/processors/colors.ts"],"mappings":"AAAA,YAAY;;AAGZ,SACEA,kBAAkB,EAClBC,eAAe,QAEV,oBAAoB;AAE3B,OAAO,MAAMC,cAAc,GAAG;EAC5BC,YAAY,EAAGC,KAAc,IAC3B,wBAAwBC,IAAI,CAACC,SAAS,CAACF,KAAK,CAAC;AACjD,CAAC;AAED,OAAO,MAAMG,eAGZ,GAAIC,KAAK,IAAK;EACb,MAAMC,SAAS,GAAGT,kBAAkB,CAACQ,KAAK,CAAC;EAE3C,IAAIA,KAAK,KAAK,MAAM,EAAE;IACpB,OAAO,CAAC;EACV;EAEA,IAAIC,SAAS,EAAE;IACb,OAAOA,SAAS;EAClB;EAEA,IAAID,KAAK,KAAK,aAAa,EAAE;IAC3B,OAAO,KAAK;EACd;EACA,IAAIA,KAAK,KAAK,cAAc,EAAE;IAC5B,OAAO,cAAc;EACvB;EAEA,MAAM,IAAIP,eAAe,CAACC,cAAc,CAACC,YAAY,CAACK,KAAK,CAAC,CAAC;AAC/D,CAAC","ignoreList":[]}
@@ -3,5 +3,6 @@
3
3
  export * from './colors';
4
4
  export * from './opacity';
5
5
  export * from './others';
6
+ export { processSVGPath } from './path';
6
7
  export { processStrokeDashArray } from './stroke';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["processStrokeDashArray"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/processors/index.ts"],"mappings":"AAAA,YAAY;;AACZ,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB,cAAc,UAAU;AACxB,SAASA,sBAAsB,QAAQ,UAAU","ignoreList":[]}
1
+ {"version":3,"names":["processSVGPath","processStrokeDashArray"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/processors/index.ts"],"mappings":"AAAA,YAAY;;AACZ,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB,cAAc,UAAU;AACxB,SAASA,cAAc,QAAQ,QAAQ;AACvC,SAASC,sBAAsB,QAAQ,UAAU","ignoreList":[]}
@@ -0,0 +1,191 @@
1
+ 'use strict';
2
+
3
+ import { ReanimatedError } from '../../../../common';
4
+ import { arcToCubic, lineToCubic, NUMBER_PATTERN, PATH_COMMAND_LENGTHS, quadraticToCubic, reflectControlPoint, SEGMENT_PATTERN } from '../../../utils';
5
+ export const ERROR_MESSAGES = {
6
+ invalidSVGPathCommand: (command, args) => `Invalid SVG Path command: ${JSON.stringify(command)} ${JSON.stringify(args)}`,
7
+ invalidSVGPathStart: command => `Invalid SVG Path: Path must start with "M" or "m", but found "${command}"`
8
+ };
9
+ export const processSVGPath = d => {
10
+ let pathSegments = parsePathString(d);
11
+ pathSegments = normalizePath(pathSegments);
12
+ return pathSegments.flatMap(subArr => subArr).join(' ');
13
+ };
14
+ function processPathSegment(command, args, pathSegments) {
15
+ let type = command.toLowerCase();
16
+ if (pathSegments.length === 0 && type !== 'm') {
17
+ throw new ReanimatedError(ERROR_MESSAGES.invalidSVGPathStart(command));
18
+ }
19
+ let argsStartIdx = 0;
20
+ if (type === 'm' && args.length > PATH_COMMAND_LENGTHS['m']) {
21
+ pathSegments.push([command, ...args.slice(0, PATH_COMMAND_LENGTHS['m'])]);
22
+ argsStartIdx += PATH_COMMAND_LENGTHS['m'];
23
+ type = 'l'; // If m has more than 2 (length['m']) arguments, use them in implicit l commands
24
+ command = command === 'm' ? 'l' : 'L';
25
+ }
26
+ do {
27
+ if (args.length - argsStartIdx < PATH_COMMAND_LENGTHS[type]) {
28
+ throw new ReanimatedError(ERROR_MESSAGES.invalidSVGPathCommand(command, args.slice(argsStartIdx)));
29
+ }
30
+ pathSegments.push([command, ...args.slice(argsStartIdx, argsStartIdx + PATH_COMMAND_LENGTHS[type])]);
31
+ argsStartIdx += PATH_COMMAND_LENGTHS[type];
32
+ } while (args.length - argsStartIdx !== 0);
33
+ }
34
+ function parsePathString(d) {
35
+ const pathSegments = [];
36
+ d.replace(SEGMENT_PATTERN, (_, command, argsString) => {
37
+ const numbers = argsString.match(NUMBER_PATTERN);
38
+ const args = numbers ? numbers.map(Number) : [];
39
+ processPathSegment(command, args, pathSegments);
40
+ return '';
41
+ });
42
+ return pathSegments;
43
+ }
44
+ function normalizePath(pathSegments) {
45
+ const absoluteSegments = absolutizePath(pathSegments);
46
+ const out = [];
47
+ const state = {
48
+ curX: 0,
49
+ curY: 0,
50
+ startX: 0,
51
+ startY: 0,
52
+ lastCubicCtrlX: 0,
53
+ lastCubicCtrlY: 0,
54
+ lastQuadCtrlX: 0,
55
+ lastQuadCtrlY: 0
56
+ };
57
+ for (const seg of absoluteSegments) {
58
+ let cmd = seg[0];
59
+ let args = [...seg.slice(1)];
60
+ if (cmd === 'S') {
61
+ const [rX, rY] = reflectControlPoint(state.curX, state.curY, state.lastCubicCtrlX, state.lastCubicCtrlY);
62
+ cmd = 'C';
63
+ args = [rX, rY, args[0], args[1], args[2], args[3]];
64
+ } else if (cmd === 'T') {
65
+ const [rX, rY] = reflectControlPoint(state.curX, state.curY, state.lastQuadCtrlX, state.lastQuadCtrlY);
66
+ cmd = 'Q';
67
+ args = [rX, rY, args[0], args[1]];
68
+ }
69
+ if (cmd === 'H') {
70
+ cmd = 'L';
71
+ args = [args[0], state.curY];
72
+ }
73
+ if (cmd === 'V') {
74
+ cmd = 'L';
75
+ args = [state.curX, args[0]];
76
+ }
77
+ const result = handlers[cmd](state, args);
78
+ out.push(...result);
79
+ const isCubic = cmd === 'C';
80
+ const isQuad = cmd === 'Q';
81
+ if (!isCubic) {
82
+ state.lastCubicCtrlX = state.curX;
83
+ state.lastCubicCtrlY = state.curY;
84
+ }
85
+ if (!isQuad) {
86
+ state.lastQuadCtrlX = state.curX;
87
+ state.lastQuadCtrlY = state.curY;
88
+ }
89
+ }
90
+ return out;
91
+ }
92
+ function absolutizePath(pathSegments) {
93
+ let curX = 0,
94
+ curY = 0;
95
+ let startX = 0,
96
+ startY = 0;
97
+ return pathSegments.map(seg => {
98
+ const cmd = seg[0];
99
+ const upperCmd = cmd.toUpperCase();
100
+ const isRelative = cmd != upperCmd;
101
+ const args = seg.slice(1);
102
+ if (isRelative) {
103
+ if (upperCmd === 'A') {
104
+ args[5] += curX;
105
+ args[6] += curY;
106
+ } else if (upperCmd === 'V') {
107
+ args[0] += curY;
108
+ } else if (upperCmd === 'H') {
109
+ args[0] += curX;
110
+ } else {
111
+ for (let i = 0; i < args.length; i += 2) {
112
+ args[i] += curX;
113
+ args[i + 1] += curY;
114
+ }
115
+ }
116
+ }
117
+ switch (upperCmd) {
118
+ case 'Z':
119
+ curX = startX;
120
+ curY = startY;
121
+ break;
122
+ case 'H':
123
+ curX = args[0];
124
+ break;
125
+ case 'V':
126
+ curY = args[0];
127
+ break;
128
+ case 'M':
129
+ curX = args[0];
130
+ curY = args[1];
131
+ startX = curX;
132
+ startY = curY;
133
+ break;
134
+ default:
135
+ // For L, C, S, Q, T, A the last pair is the new cursor
136
+ if (args.length >= 2) {
137
+ curX = args[args.length - 2];
138
+ curY = args[args.length - 1];
139
+ }
140
+ }
141
+ return [upperCmd, ...args];
142
+ });
143
+ }
144
+ const handlers = {
145
+ M: (state, args) => {
146
+ const [x, y] = args;
147
+ state.curX = state.startX = x;
148
+ state.curY = state.startY = y;
149
+ return [['M', x, y]];
150
+ },
151
+ L: (state, args) => {
152
+ const [x, y] = args;
153
+ const cubic = lineToCubic(state.curX, state.curY, x, y);
154
+ state.curX = x;
155
+ state.curY = y;
156
+ return [['C', ...cubic]];
157
+ },
158
+ Q: (state, args) => {
159
+ const [qcx, qcy, x, y] = args;
160
+ const cubic = quadraticToCubic(state.curX, state.curY, qcx, qcy, x, y);
161
+ state.lastQuadCtrlX = qcx;
162
+ state.lastQuadCtrlY = qcy;
163
+ state.curX = x;
164
+ state.curY = y;
165
+ return [['C', ...cubic]];
166
+ },
167
+ C: (state, args) => {
168
+ const [_cp1x, _cp1y, cp2x, cp2y, x, y] = args;
169
+ state.lastCubicCtrlX = cp2x;
170
+ state.lastCubicCtrlY = cp2y;
171
+ state.curX = x;
172
+ state.curY = y;
173
+ return [['C', ...args]];
174
+ },
175
+ A: (state, args) => {
176
+ const cubics = arcToCubic(state.curX, state.curY, args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
177
+ if (cubics.length === 0) return [];
178
+ const last = cubics[cubics.length - 1];
179
+ state.lastCubicCtrlX = last[2];
180
+ state.lastCubicCtrlY = last[3];
181
+ state.curX = last[4];
182
+ state.curY = last[5];
183
+ return cubics.map(c => ['C', ...c]);
184
+ },
185
+ Z: state => {
186
+ state.curX = state.startX;
187
+ state.curY = state.startY;
188
+ return [['Z']];
189
+ }
190
+ };
191
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ReanimatedError","arcToCubic","lineToCubic","NUMBER_PATTERN","PATH_COMMAND_LENGTHS","quadraticToCubic","reflectControlPoint","SEGMENT_PATTERN","ERROR_MESSAGES","invalidSVGPathCommand","command","args","JSON","stringify","invalidSVGPathStart","processSVGPath","d","pathSegments","parsePathString","normalizePath","flatMap","subArr","join","processPathSegment","type","toLowerCase","length","argsStartIdx","push","slice","replace","_","argsString","numbers","match","map","Number","absoluteSegments","absolutizePath","out","state","curX","curY","startX","startY","lastCubicCtrlX","lastCubicCtrlY","lastQuadCtrlX","lastQuadCtrlY","seg","cmd","rX","rY","result","handlers","isCubic","isQuad","upperCmd","toUpperCase","isRelative","i","M","x","y","L","cubic","Q","qcx","qcy","C","_cp1x","_cp1y","cp2x","cp2y","A","cubics","last","c","Z"],"sourceRoot":"../../../../../../src","sources":["css/svg/native/processors/path.ts"],"mappings":"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","ignoreList":[]}
@@ -3,5 +3,6 @@
3
3
  export * from './equality';
4
4
  export * from './guards';
5
5
  export * from './parsers';
6
+ export * from './path';
6
7
  export * from './props';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["css/utils/index.ts"],"mappings":"AAAA,YAAY;;AACZ,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB,cAAc,SAAS","ignoreList":[]}
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["css/utils/index.ts"],"mappings":"AAAA,YAAY;;AACZ,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,SAAS","ignoreList":[]}
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+
3
+ export const PATH_COMMAND_LENGTHS = {
4
+ a: 7,
5
+ c: 6,
6
+ h: 1,
7
+ l: 2,
8
+ m: 2,
9
+ q: 4,
10
+ s: 4,
11
+ t: 2,
12
+ v: 1,
13
+ z: 0
14
+ };
15
+ export const SEGMENT_PATTERN = /([achlmqstvz])([^achlmqstvz]*)/gi;
16
+ export const NUMBER_PATTERN = /-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/gi;
17
+ export function reflectControlPoint(curX, curY, oldX, oldY) {
18
+ return [2 * curX - oldX, 2 * curY - oldY];
19
+ }
20
+ export function lineToCubic(x1, y1, x2, y2) {
21
+ return [x1 + (x2 - x1) / 3, y1 + (y2 - y1) / 3, x1 + 2 * (x2 - x1) / 3, y1 + 2 * (y2 - y1) / 3, x2, y2];
22
+ }
23
+ export function quadraticToCubic(curX, curY, qcx, qcy, x, y) {
24
+ const cp1x = curX + 2 / 3 * (qcx - curX);
25
+ const cp1y = curY + 2 / 3 * (qcy - curY);
26
+ const cp2x = x + 2 / 3 * (qcx - x);
27
+ const cp2y = y + 2 / 3 * (qcy - y);
28
+ return [cp1x, cp1y, cp2x, cp2y, x, y];
29
+ }
30
+ export function arcToCubic(startX, startY, radiusX, radiusY, xAxisRotation, largeArcFlag, sweepFlag, endX, endY) {
31
+ // Identical endpoints -- omit the segment
32
+ if (startX === endX && startY === endY) {
33
+ return [];
34
+ }
35
+ radiusX = Math.abs(radiusX);
36
+ radiusY = Math.abs(radiusY);
37
+
38
+ // Degenerate case:
39
+ if (radiusX === 0 || radiusY === 0) {
40
+ return [lineToCubic(startX, startY, endX, endY)];
41
+ }
42
+ const fA = largeArcFlag !== 0 ? 1 : 0;
43
+ const fS = sweepFlag !== 0 ? 1 : 0;
44
+ const phi = xAxisRotation % 360 * Math.PI / 180;
45
+ const sinPhi = Math.sin(phi);
46
+ const cosPhi = Math.cos(phi);
47
+ const {
48
+ centerX,
49
+ centerY,
50
+ startAngle,
51
+ deltaAngle,
52
+ correctedRadiusX,
53
+ correctedRadiusY
54
+ } = getCenterParameterization(startX, startY, radiusX, radiusY, fA, fS, endX, endY, sinPhi, cosPhi);
55
+ return splitArcIntoSegments(centerX, centerY, startAngle, deltaAngle, correctedRadiusX, correctedRadiusY, sinPhi, cosPhi);
56
+ }
57
+ function getCenterParameterization(startX, startY, radiusX, radiusY, largeArcFlag, sweepFlag, endX, endY, sinRotation, cosRotation) {
58
+ const xPrime = cosRotation * (startX - endX) / 2 + sinRotation * (startY - endY) / 2;
59
+ const yPrime = -sinRotation * (startX - endX) / 2 + cosRotation * (startY - endY) / 2;
60
+ const xPrimeSq = xPrime * xPrime;
61
+ const yPrimeSq = yPrime * yPrime;
62
+ let correctedRadiusX = radiusX;
63
+ let correctedRadiusY = radiusY;
64
+ const radCheck = xPrimeSq / (correctedRadiusX * correctedRadiusX) + yPrimeSq / (correctedRadiusY * correctedRadiusY);
65
+ if (radCheck > 1) {
66
+ const scale = Math.sqrt(radCheck);
67
+ correctedRadiusX *= scale;
68
+ correctedRadiusY *= scale;
69
+ }
70
+ const crxSq = correctedRadiusX * correctedRadiusX;
71
+ const crySq = correctedRadiusY * correctedRadiusY;
72
+ const sign = largeArcFlag === sweepFlag ? -1 : 1;
73
+ const numerator = Math.max(0, crxSq * crySq - crxSq * yPrimeSq - crySq * xPrimeSq);
74
+ const denominator = crxSq * yPrimeSq + crySq * xPrimeSq;
75
+ const coef = sign * Math.sqrt(numerator / denominator);
76
+ const cxp = coef * (correctedRadiusX * yPrime / correctedRadiusY);
77
+ const cyp = coef * (-(correctedRadiusY * xPrime) / correctedRadiusX);
78
+ const centerX = cosRotation * cxp - sinRotation * cyp + (startX + endX) / 2;
79
+ const centerY = sinRotation * cxp + cosRotation * cyp + (startY + endY) / 2;
80
+ const startVectorX = (xPrime - cxp) / correctedRadiusX;
81
+ const startVectorY = (yPrime - cyp) / correctedRadiusY;
82
+ const endVectorX = (-xPrime - cxp) / correctedRadiusX;
83
+ const endVectorY = (-yPrime - cyp) / correctedRadiusY;
84
+ const startAngle = calculateAngle(1, 0, startVectorX, startVectorY);
85
+ let deltaAngle = calculateAngle(startVectorX, startVectorY, endVectorX, endVectorY);
86
+ if (sweepFlag === 0 && deltaAngle > 0) deltaAngle -= 2 * Math.PI;
87
+ if (sweepFlag === 1 && deltaAngle < 0) deltaAngle += 2 * Math.PI;
88
+ return {
89
+ centerX,
90
+ centerY,
91
+ startAngle,
92
+ deltaAngle,
93
+ correctedRadiusX,
94
+ correctedRadiusY
95
+ };
96
+ }
97
+ function calculateAngle(uX, uY, vX, vY) {
98
+ const dot = uX * vX + uY * vY;
99
+ const mag = Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY);
100
+ const sign = uX * vY - uY * vX < 0 ? -1 : 1;
101
+ return sign * Math.acos(Math.max(-1, Math.min(1, dot / mag)));
102
+ }
103
+ function splitArcIntoSegments(centerX, centerY, startAngle, deltaAngle, radiusX, radiusY, sinRotation, cosRotation) {
104
+ const segments = Math.ceil(Math.abs(deltaAngle) / (Math.PI / 2));
105
+ const segmentAngle = deltaAngle / segments;
106
+ const k = 4 / 3 * Math.tan(segmentAngle / 4);
107
+ const cubics = [];
108
+ for (let i = 0; i < segments; i++) {
109
+ const a1 = startAngle + i * segmentAngle;
110
+ const a2 = startAngle + (i + 1) * segmentAngle;
111
+ const cos1 = Math.cos(a1),
112
+ sin1 = Math.sin(a1);
113
+ const cos2 = Math.cos(a2),
114
+ sin2 = Math.sin(a2);
115
+ const unitX1 = cos1 - k * sin1;
116
+ const unitY1 = sin1 + k * cos1;
117
+ const unitX2 = cos2 + k * sin2;
118
+ const unitY2 = sin2 - k * cos2;
119
+ const transformToEllipse = (uX, uY) => [centerX + cosRotation * uX * radiusX - sinRotation * uY * radiusY, centerY + sinRotation * uX * radiusX + cosRotation * uY * radiusY];
120
+ const [cp1x, cp1y] = transformToEllipse(unitX1, unitY1);
121
+ const [cp2x, cp2y] = transformToEllipse(unitX2, unitY2);
122
+ const [dstX, dstY] = transformToEllipse(cos2, sin2);
123
+ cubics.push([cp1x, cp1y, cp2x, cp2y, dstX, dstY]);
124
+ }
125
+ return cubics;
126
+ }
127
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PATH_COMMAND_LENGTHS","a","c","h","l","m","q","s","t","v","z","SEGMENT_PATTERN","NUMBER_PATTERN","reflectControlPoint","curX","curY","oldX","oldY","lineToCubic","x1","y1","x2","y2","quadraticToCubic","qcx","qcy","x","y","cp1x","cp1y","cp2x","cp2y","arcToCubic","startX","startY","radiusX","radiusY","xAxisRotation","largeArcFlag","sweepFlag","endX","endY","Math","abs","fA","fS","phi","PI","sinPhi","sin","cosPhi","cos","centerX","centerY","startAngle","deltaAngle","correctedRadiusX","correctedRadiusY","getCenterParameterization","splitArcIntoSegments","sinRotation","cosRotation","xPrime","yPrime","xPrimeSq","yPrimeSq","radCheck","scale","sqrt","crxSq","crySq","sign","numerator","max","denominator","coef","cxp","cyp","startVectorX","startVectorY","endVectorX","endVectorY","calculateAngle","uX","uY","vX","vY","dot","mag","acos","min","segments","ceil","segmentAngle","k","tan","cubics","i","a1","a2","cos1","sin1","cos2","sin2","unitX1","unitY1","unitX2","unitY2","transformToEllipse","dstX","dstY","push"],"sourceRoot":"../../../../src","sources":["css/utils/path.ts"],"mappings":"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","ignoreList":[]}
@@ -5,5 +5,5 @@
5
5
  * version used to build the native part of the library in runtime. Remember to
6
6
  * keep this in sync with the version declared in `package.json`
7
7
  */
8
- export const jsVersion = '4.3.0-nightly-20251224-45cf72265';
8
+ export const jsVersion = '4.3.0-nightly-20260107-ce9032c25';
9
9
  //# sourceMappingURL=jsVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/configs/path.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAMtD,eAAO,MAAM,0BAA0B,EAAE,qBAAqB,CAAC,SAAS,CAGvE,CAAC"}
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/configs/path.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAKtD,eAAO,MAAM,0BAA0B,EAAE,qBAAqB,CAAC,SAAS,CAIvE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/processors/colors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,cAAc;0BACH,OAAO;CAE9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAC1C,UAAU,GAAG,MAAM,EACnB,MAAM,GAAG,KAAK,GAAG,MAAM,CAgBxB,CAAC"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/processors/colors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,cAAc;0BACH,OAAO;CAE9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAC1C,UAAU,GAAG,MAAM,EACnB,MAAM,GAAG,KAAK,GAAG,MAAM,CAoBxB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export * from './colors';
2
2
  export * from './opacity';
3
3
  export * from './others';
4
+ export { processSVGPath } from './path';
4
5
  export { processStrokeDashArray } from './stroke';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/processors/index.ts"],"names":[],"mappings":"AACA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/processors/index.ts"],"names":[],"mappings":"AACA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type ValueProcessor } from '../../../../common';
2
+ export declare const ERROR_MESSAGES: {
3
+ invalidSVGPathCommand: (command: unknown, args: unknown) => string;
4
+ invalidSVGPathStart: (command: string) => string;
5
+ };
6
+ export declare const processSVGPath: ValueProcessor<string, string>;
7
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../../../src/css/svg/native/processors/path.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAW1E,eAAO,MAAM,cAAc;qCACQ,OAAO,QAAQ,OAAO;mCAExB,MAAM;CAEtC,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,CAKzD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export * from './equality';
2
2
  export * from './guards';
3
3
  export * from './parsers';
4
+ export * from './path';
4
5
  export * from './props';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/css/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/css/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const PATH_COMMAND_LENGTHS: Record<string, number>;
2
+ export declare const SEGMENT_PATTERN: RegExp;
3
+ export declare const NUMBER_PATTERN: RegExp;
4
+ export declare function reflectControlPoint(curX: number, curY: number, oldX: number, oldY: number): [number, number];
5
+ export declare function lineToCubic(x1: number, y1: number, x2: number, y2: number): number[];
6
+ export declare function quadraticToCubic(curX: number, curY: number, qcx: number, qcy: number, x: number, y: number): [number, number, number, number, number, number];
7
+ export declare function arcToCubic(startX: number, startY: number, radiusX: number, radiusY: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, endX: number, endY: number): number[][];
8
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../../src/css/utils/path.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWvD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAqC,CAAC;AAClE,eAAO,MAAM,cAAc,QAAsC,CAAC;AAElE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,CAAC,MAAM,EAAE,MAAM,CAAC,CAElB;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,MAAM,EAAE,CASV;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAMlD;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,EAAE,EAAE,CAmDZ"}
@@ -3,5 +3,5 @@
3
3
  * version used to build the native part of the library in runtime. Remember to
4
4
  * keep this in sync with the version declared in `package.json`
5
5
  */
6
- export declare const jsVersion = "4.3.0-nightly-20251224-45cf72265";
6
+ export declare const jsVersion = "4.3.0-nightly-20260107-ce9032c25";
7
7
  //# sourceMappingURL=jsVersion.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-reanimated",
3
- "version": "4.3.0-nightly-20251224-45cf72265",
3
+ "version": "4.3.0-nightly-20260107-ce9032c25",
4
4
  "description": "More powerful alternative to Animated library for React Native.",
5
5
  "keywords": [
6
6
  "react-native",
@@ -98,7 +98,7 @@
98
98
  "peerDependencies": {
99
99
  "react": "*",
100
100
  "react-native": "*",
101
- "react-native-worklets": "0.8.0-nightly-20251224-45cf72265"
101
+ "react-native-worklets": "0.8.0-nightly-20260107-ce9032c25"
102
102
  },
103
103
  "devDependencies": {
104
104
  "@babel/core": "7.28.4",
@@ -4,13 +4,14 @@
4
4
  // @ts-ignore RNSVG doesn't export types for web, see https://github.com/software-mansion/react-native-svg/pull/2801
5
5
  import type { PathProps } from 'react-native-svg';
6
6
 
7
+ import { processOpacity, processSVGPath } from '../processors';
7
8
  import type { SvgStyleBuilderConfig } from './common';
8
9
  import { commonSvgProps } from './common';
9
10
 
10
11
  // TODO: Fix me
11
12
  // @ts-ignore RNSVG doesn't export types for web, see https://github.com/software-mansion/react-native-svg/pull/2801
12
- // @ts-ignore - remove when more properties are added
13
13
  export const SVG_PATH_PROPERTIES_CONFIG: SvgStyleBuilderConfig<PathProps> = {
14
14
  ...commonSvgProps,
15
- // TODO - add more properties
15
+ d: { process: processSVGPath },
16
+ opacity: { process: processOpacity },
16
17
  };
@@ -18,6 +18,10 @@ export const processColorSVG: ValueProcessor<
18
18
  > = (value) => {
19
19
  const processed = processColorNumber(value);
20
20
 
21
+ if (value === 'none') {
22
+ return 0;
23
+ }
24
+
21
25
  if (processed) {
22
26
  return processed;
23
27
  }
@@ -2,4 +2,5 @@
2
2
  export * from './colors';
3
3
  export * from './opacity';
4
4
  export * from './others';
5
+ export { processSVGPath } from './path';
5
6
  export { processStrokeDashArray } from './stroke';
@@ -0,0 +1,278 @@
1
+ 'use strict';
2
+
3
+ import { ReanimatedError, type ValueProcessor } from '../../../../common';
4
+ import {
5
+ arcToCubic,
6
+ lineToCubic,
7
+ NUMBER_PATTERN,
8
+ PATH_COMMAND_LENGTHS,
9
+ quadraticToCubic,
10
+ reflectControlPoint,
11
+ SEGMENT_PATTERN,
12
+ } from '../../../utils';
13
+
14
+ export const ERROR_MESSAGES = {
15
+ invalidSVGPathCommand: (command: unknown, args: unknown) =>
16
+ `Invalid SVG Path command: ${JSON.stringify(command)} ${JSON.stringify(args)}`,
17
+ invalidSVGPathStart: (command: string) =>
18
+ `Invalid SVG Path: Path must start with "M" or "m", but found "${command}"`,
19
+ };
20
+
21
+ type PathCommand = [string, ...number[]];
22
+
23
+ export const processSVGPath: ValueProcessor<string, string> = (d) => {
24
+ let pathSegments: PathCommand[] = parsePathString(d);
25
+ pathSegments = normalizePath(pathSegments);
26
+
27
+ return pathSegments.flatMap((subArr) => subArr).join(' ');
28
+ };
29
+
30
+ function processPathSegment(
31
+ command: string,
32
+ args: number[],
33
+ pathSegments: PathCommand[]
34
+ ): void {
35
+ let type = command.toLowerCase();
36
+
37
+ if (pathSegments.length === 0 && type !== 'm') {
38
+ throw new ReanimatedError(ERROR_MESSAGES.invalidSVGPathStart(command));
39
+ }
40
+
41
+ let argsStartIdx = 0;
42
+
43
+ if (type === 'm' && args.length > PATH_COMMAND_LENGTHS['m']) {
44
+ pathSegments.push([command, ...args.slice(0, PATH_COMMAND_LENGTHS['m'])]);
45
+ argsStartIdx += PATH_COMMAND_LENGTHS['m'];
46
+ type = 'l'; // If m has more than 2 (length['m']) arguments, use them in implicit l commands
47
+ command = command === 'm' ? 'l' : 'L';
48
+ }
49
+
50
+ do {
51
+ if (args.length - argsStartIdx < PATH_COMMAND_LENGTHS[type]) {
52
+ throw new ReanimatedError(
53
+ ERROR_MESSAGES.invalidSVGPathCommand(command, args.slice(argsStartIdx))
54
+ );
55
+ }
56
+
57
+ pathSegments.push([
58
+ command,
59
+ ...args.slice(argsStartIdx, argsStartIdx + PATH_COMMAND_LENGTHS[type]),
60
+ ]);
61
+ argsStartIdx += PATH_COMMAND_LENGTHS[type];
62
+ } while (args.length - argsStartIdx !== 0);
63
+ }
64
+
65
+ function parsePathString(d: string): PathCommand[] {
66
+ const pathSegments: PathCommand[] = [];
67
+
68
+ d.replace(SEGMENT_PATTERN, (_, command: string, argsString: string) => {
69
+ const numbers = argsString.match(NUMBER_PATTERN);
70
+ const args = numbers ? numbers.map(Number) : [];
71
+
72
+ processPathSegment(command, args, pathSegments);
73
+ return '';
74
+ });
75
+
76
+ return pathSegments;
77
+ }
78
+
79
+ function normalizePath(pathSegments: PathCommand[]): PathCommand[] {
80
+ const absoluteSegments = absolutizePath(pathSegments);
81
+ const out: PathCommand[] = [];
82
+
83
+ const state: PathState = {
84
+ curX: 0,
85
+ curY: 0,
86
+ startX: 0,
87
+ startY: 0,
88
+ lastCubicCtrlX: 0,
89
+ lastCubicCtrlY: 0,
90
+ lastQuadCtrlX: 0,
91
+ lastQuadCtrlY: 0,
92
+ };
93
+
94
+ for (const seg of absoluteSegments) {
95
+ let cmd = seg[0];
96
+ let args = [...seg.slice(1)] as number[];
97
+
98
+ if (cmd === 'S') {
99
+ const [rX, rY] = reflectControlPoint(
100
+ state.curX,
101
+ state.curY,
102
+ state.lastCubicCtrlX,
103
+ state.lastCubicCtrlY
104
+ );
105
+ cmd = 'C';
106
+ args = [rX, rY, args[0], args[1], args[2], args[3]];
107
+ } else if (cmd === 'T') {
108
+ const [rX, rY] = reflectControlPoint(
109
+ state.curX,
110
+ state.curY,
111
+ state.lastQuadCtrlX,
112
+ state.lastQuadCtrlY
113
+ );
114
+ cmd = 'Q';
115
+ args = [rX, rY, args[0], args[1]];
116
+ }
117
+
118
+ if (cmd === 'H') {
119
+ cmd = 'L';
120
+ args = [args[0], state.curY];
121
+ }
122
+ if (cmd === 'V') {
123
+ cmd = 'L';
124
+ args = [state.curX, args[0]];
125
+ }
126
+
127
+ const result = handlers[cmd as keyof typeof handlers](state, args);
128
+ out.push(...result);
129
+
130
+ const isCubic = cmd === 'C';
131
+ const isQuad = cmd === 'Q';
132
+
133
+ if (!isCubic) {
134
+ state.lastCubicCtrlX = state.curX;
135
+ state.lastCubicCtrlY = state.curY;
136
+ }
137
+ if (!isQuad) {
138
+ state.lastQuadCtrlX = state.curX;
139
+ state.lastQuadCtrlY = state.curY;
140
+ }
141
+ }
142
+
143
+ return out;
144
+ }
145
+
146
+ function absolutizePath(pathSegments: PathCommand[]): PathCommand[] {
147
+ let curX = 0,
148
+ curY = 0;
149
+ let startX = 0,
150
+ startY = 0;
151
+
152
+ return pathSegments.map((seg) => {
153
+ const cmd = seg[0];
154
+ const upperCmd = cmd.toUpperCase();
155
+ const isRelative = cmd != upperCmd;
156
+
157
+ const args = seg.slice(1) as number[];
158
+
159
+ if (isRelative) {
160
+ if (upperCmd === 'A') {
161
+ args[5] += curX;
162
+ args[6] += curY;
163
+ } else if (upperCmd === 'V') {
164
+ args[0] += curY;
165
+ } else if (upperCmd === 'H') {
166
+ args[0] += curX;
167
+ } else {
168
+ for (let i = 0; i < args.length; i += 2) {
169
+ args[i] += curX;
170
+ args[i + 1] += curY;
171
+ }
172
+ }
173
+ }
174
+
175
+ switch (upperCmd) {
176
+ case 'Z':
177
+ curX = startX;
178
+ curY = startY;
179
+ break;
180
+ case 'H':
181
+ curX = args[0];
182
+ break;
183
+ case 'V':
184
+ curY = args[0];
185
+ break;
186
+ case 'M':
187
+ curX = args[0];
188
+ curY = args[1];
189
+ startX = curX;
190
+ startY = curY;
191
+ break;
192
+ default:
193
+ // For L, C, S, Q, T, A the last pair is the new cursor
194
+ if (args.length >= 2) {
195
+ curX = args[args.length - 2];
196
+ curY = args[args.length - 1];
197
+ }
198
+ }
199
+
200
+ return [upperCmd, ...args];
201
+ });
202
+ }
203
+
204
+ type PathState = {
205
+ curX: number;
206
+ curY: number;
207
+ startX: number;
208
+ startY: number;
209
+ lastCubicCtrlX: number;
210
+ lastCubicCtrlY: number;
211
+ lastQuadCtrlX: number;
212
+ lastQuadCtrlY: number;
213
+ };
214
+
215
+ const handlers = {
216
+ M: (state: PathState, args: number[]): PathCommand[] => {
217
+ const [x, y] = args;
218
+ state.curX = state.startX = x;
219
+ state.curY = state.startY = y;
220
+ return [['M', x, y]];
221
+ },
222
+
223
+ L: (state: PathState, args: number[]): PathCommand[] => {
224
+ const [x, y] = args;
225
+ const cubic = lineToCubic(state.curX, state.curY, x, y);
226
+ state.curX = x;
227
+ state.curY = y;
228
+ return [['C', ...cubic]];
229
+ },
230
+
231
+ Q: (state: PathState, args: number[]): PathCommand[] => {
232
+ const [qcx, qcy, x, y] = args;
233
+ const cubic = quadraticToCubic(state.curX, state.curY, qcx, qcy, x, y);
234
+ state.lastQuadCtrlX = qcx;
235
+ state.lastQuadCtrlY = qcy;
236
+ state.curX = x;
237
+ state.curY = y;
238
+ return [['C', ...cubic]];
239
+ },
240
+
241
+ C: (state: PathState, args: number[]): PathCommand[] => {
242
+ const [_cp1x, _cp1y, cp2x, cp2y, x, y] = args;
243
+ state.lastCubicCtrlX = cp2x;
244
+ state.lastCubicCtrlY = cp2y;
245
+ state.curX = x;
246
+ state.curY = y;
247
+ return [['C', ...args]];
248
+ },
249
+
250
+ A: (state: PathState, args: number[]): PathCommand[] => {
251
+ const cubics = arcToCubic(
252
+ state.curX,
253
+ state.curY,
254
+ args[0],
255
+ args[1],
256
+ args[2],
257
+ args[3],
258
+ args[4],
259
+ args[5],
260
+ args[6]
261
+ );
262
+ if (cubics.length === 0) return [];
263
+
264
+ const last = cubics[cubics.length - 1];
265
+ state.lastCubicCtrlX = last[2];
266
+ state.lastCubicCtrlY = last[3];
267
+ state.curX = last[4];
268
+ state.curY = last[5];
269
+
270
+ return cubics.map((c) => ['C', ...c]);
271
+ },
272
+
273
+ Z: (state: PathState): PathCommand[] => {
274
+ state.curX = state.startX;
275
+ state.curY = state.startY;
276
+ return [['Z']];
277
+ },
278
+ };
@@ -2,4 +2,5 @@
2
2
  export * from './equality';
3
3
  export * from './guards';
4
4
  export * from './parsers';
5
+ export * from './path';
5
6
  export * from './props';
@@ -0,0 +1,252 @@
1
+ 'use strict';
2
+
3
+ export const PATH_COMMAND_LENGTHS: Record<string, number> = {
4
+ a: 7,
5
+ c: 6,
6
+ h: 1,
7
+ l: 2,
8
+ m: 2,
9
+ q: 4,
10
+ s: 4,
11
+ t: 2,
12
+ v: 1,
13
+ z: 0,
14
+ };
15
+
16
+ export const SEGMENT_PATTERN = /([achlmqstvz])([^achlmqstvz]*)/gi;
17
+ export const NUMBER_PATTERN = /-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/gi;
18
+
19
+ export function reflectControlPoint(
20
+ curX: number,
21
+ curY: number,
22
+ oldX: number,
23
+ oldY: number
24
+ ): [number, number] {
25
+ return [2 * curX - oldX, 2 * curY - oldY];
26
+ }
27
+
28
+ export function lineToCubic(
29
+ x1: number,
30
+ y1: number,
31
+ x2: number,
32
+ y2: number
33
+ ): number[] {
34
+ return [
35
+ x1 + (x2 - x1) / 3,
36
+ y1 + (y2 - y1) / 3,
37
+ x1 + (2 * (x2 - x1)) / 3,
38
+ y1 + (2 * (y2 - y1)) / 3,
39
+ x2,
40
+ y2,
41
+ ];
42
+ }
43
+
44
+ export function quadraticToCubic(
45
+ curX: number,
46
+ curY: number,
47
+ qcx: number,
48
+ qcy: number,
49
+ x: number,
50
+ y: number
51
+ ): [number, number, number, number, number, number] {
52
+ const cp1x = curX + (2 / 3) * (qcx - curX);
53
+ const cp1y = curY + (2 / 3) * (qcy - curY);
54
+ const cp2x = x + (2 / 3) * (qcx - x);
55
+ const cp2y = y + (2 / 3) * (qcy - y);
56
+ return [cp1x, cp1y, cp2x, cp2y, x, y];
57
+ }
58
+
59
+ export function arcToCubic(
60
+ startX: number,
61
+ startY: number,
62
+ radiusX: number,
63
+ radiusY: number,
64
+ xAxisRotation: number,
65
+ largeArcFlag: number,
66
+ sweepFlag: number,
67
+ endX: number,
68
+ endY: number
69
+ ): number[][] {
70
+ // Identical endpoints -- omit the segment
71
+ if (startX === endX && startY === endY) {
72
+ return [];
73
+ }
74
+
75
+ radiusX = Math.abs(radiusX);
76
+ radiusY = Math.abs(radiusY);
77
+
78
+ // Degenerate case:
79
+ if (radiusX === 0 || radiusY === 0) {
80
+ return [lineToCubic(startX, startY, endX, endY)];
81
+ }
82
+
83
+ const fA = largeArcFlag !== 0 ? 1 : 0;
84
+ const fS = sweepFlag !== 0 ? 1 : 0;
85
+
86
+ const phi = ((xAxisRotation % 360) * Math.PI) / 180;
87
+ const sinPhi = Math.sin(phi);
88
+ const cosPhi = Math.cos(phi);
89
+
90
+ const {
91
+ centerX,
92
+ centerY,
93
+ startAngle,
94
+ deltaAngle,
95
+ correctedRadiusX,
96
+ correctedRadiusY,
97
+ } = getCenterParameterization(
98
+ startX,
99
+ startY,
100
+ radiusX,
101
+ radiusY,
102
+ fA,
103
+ fS,
104
+ endX,
105
+ endY,
106
+ sinPhi,
107
+ cosPhi
108
+ );
109
+
110
+ return splitArcIntoSegments(
111
+ centerX,
112
+ centerY,
113
+ startAngle,
114
+ deltaAngle,
115
+ correctedRadiusX,
116
+ correctedRadiusY,
117
+ sinPhi,
118
+ cosPhi
119
+ );
120
+ }
121
+
122
+ function getCenterParameterization(
123
+ startX: number,
124
+ startY: number,
125
+ radiusX: number,
126
+ radiusY: number,
127
+ largeArcFlag: number,
128
+ sweepFlag: number,
129
+ endX: number,
130
+ endY: number,
131
+ sinRotation: number,
132
+ cosRotation: number
133
+ ) {
134
+ const xPrime =
135
+ (cosRotation * (startX - endX)) / 2 + (sinRotation * (startY - endY)) / 2;
136
+ const yPrime =
137
+ (-sinRotation * (startX - endX)) / 2 + (cosRotation * (startY - endY)) / 2;
138
+
139
+ const xPrimeSq = xPrime * xPrime;
140
+ const yPrimeSq = yPrime * yPrime;
141
+
142
+ let correctedRadiusX = radiusX;
143
+ let correctedRadiusY = radiusY;
144
+ const radCheck =
145
+ xPrimeSq / (correctedRadiusX * correctedRadiusX) +
146
+ yPrimeSq / (correctedRadiusY * correctedRadiusY);
147
+
148
+ if (radCheck > 1) {
149
+ const scale = Math.sqrt(radCheck);
150
+ correctedRadiusX *= scale;
151
+ correctedRadiusY *= scale;
152
+ }
153
+
154
+ const crxSq = correctedRadiusX * correctedRadiusX;
155
+ const crySq = correctedRadiusY * correctedRadiusY;
156
+
157
+ const sign = largeArcFlag === sweepFlag ? -1 : 1;
158
+ const numerator = Math.max(
159
+ 0,
160
+ crxSq * crySq - crxSq * yPrimeSq - crySq * xPrimeSq
161
+ );
162
+ const denominator = crxSq * yPrimeSq + crySq * xPrimeSq;
163
+ const coef = sign * Math.sqrt(numerator / denominator);
164
+
165
+ const cxp = coef * ((correctedRadiusX * yPrime) / correctedRadiusY);
166
+ const cyp = coef * (-(correctedRadiusY * xPrime) / correctedRadiusX);
167
+
168
+ const centerX = cosRotation * cxp - sinRotation * cyp + (startX + endX) / 2;
169
+ const centerY = sinRotation * cxp + cosRotation * cyp + (startY + endY) / 2;
170
+
171
+ const startVectorX = (xPrime - cxp) / correctedRadiusX;
172
+ const startVectorY = (yPrime - cyp) / correctedRadiusY;
173
+ const endVectorX = (-xPrime - cxp) / correctedRadiusX;
174
+ const endVectorY = (-yPrime - cyp) / correctedRadiusY;
175
+
176
+ const startAngle = calculateAngle(1, 0, startVectorX, startVectorY);
177
+ let deltaAngle = calculateAngle(
178
+ startVectorX,
179
+ startVectorY,
180
+ endVectorX,
181
+ endVectorY
182
+ );
183
+
184
+ if (sweepFlag === 0 && deltaAngle > 0) deltaAngle -= 2 * Math.PI;
185
+ if (sweepFlag === 1 && deltaAngle < 0) deltaAngle += 2 * Math.PI;
186
+
187
+ return {
188
+ centerX,
189
+ centerY,
190
+ startAngle,
191
+ deltaAngle,
192
+ correctedRadiusX,
193
+ correctedRadiusY,
194
+ };
195
+ }
196
+
197
+ function calculateAngle(
198
+ uX: number,
199
+ uY: number,
200
+ vX: number,
201
+ vY: number
202
+ ): number {
203
+ const dot = uX * vX + uY * vY;
204
+ const mag = Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY);
205
+ const sign = uX * vY - uY * vX < 0 ? -1 : 1;
206
+ return sign * Math.acos(Math.max(-1, Math.min(1, dot / mag)));
207
+ }
208
+
209
+ function splitArcIntoSegments(
210
+ centerX: number,
211
+ centerY: number,
212
+ startAngle: number,
213
+ deltaAngle: number,
214
+ radiusX: number,
215
+ radiusY: number,
216
+ sinRotation: number,
217
+ cosRotation: number
218
+ ): number[][] {
219
+ const segments = Math.ceil(Math.abs(deltaAngle) / (Math.PI / 2));
220
+ const segmentAngle = deltaAngle / segments;
221
+ const k = (4 / 3) * Math.tan(segmentAngle / 4);
222
+
223
+ const cubics: number[][] = [];
224
+
225
+ for (let i = 0; i < segments; i++) {
226
+ const a1 = startAngle + i * segmentAngle;
227
+ const a2 = startAngle + (i + 1) * segmentAngle;
228
+
229
+ const cos1 = Math.cos(a1),
230
+ sin1 = Math.sin(a1);
231
+ const cos2 = Math.cos(a2),
232
+ sin2 = Math.sin(a2);
233
+
234
+ const unitX1 = cos1 - k * sin1;
235
+ const unitY1 = sin1 + k * cos1;
236
+ const unitX2 = cos2 + k * sin2;
237
+ const unitY2 = sin2 - k * cos2;
238
+
239
+ const transformToEllipse = (uX: number, uY: number) => [
240
+ centerX + cosRotation * uX * radiusX - sinRotation * uY * radiusY,
241
+ centerY + sinRotation * uX * radiusX + cosRotation * uY * radiusY,
242
+ ];
243
+
244
+ const [cp1x, cp1y] = transformToEllipse(unitX1, unitY1);
245
+ const [cp2x, cp2y] = transformToEllipse(unitX2, unitY2);
246
+ const [dstX, dstY] = transformToEllipse(cos2, sin2);
247
+
248
+ cubics.push([cp1x, cp1y, cp2x, cp2y, dstX, dstY]);
249
+ }
250
+
251
+ return cubics;
252
+ }
@@ -4,4 +4,4 @@
4
4
  * version used to build the native part of the library in runtime. Remember to
5
5
  * keep this in sync with the version declared in `package.json`
6
6
  */
7
- export const jsVersion = '4.3.0-nightly-20251224-45cf72265';
7
+ export const jsVersion = '4.3.0-nightly-20260107-ce9032c25';