@hyperframes/parsers 0.7.70 → 0.7.72
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.
- package/dist/colorGradingContract.d.ts +17 -0
- package/dist/colorGradingContract.js +269 -0
- package/dist/colorGradingContract.js.map +1 -0
- package/dist/gsapConstants.js +4 -0
- package/dist/gsapConstants.js.map +1 -1
- package/dist/gsapParser.d.ts +3 -4
- package/dist/gsapParser.js +201 -86
- package/dist/gsapParser.js.map +1 -1
- package/dist/gsapParserAcorn.js +41 -29
- package/dist/gsapParserAcorn.js.map +1 -1
- package/dist/gsapParserExports.js +45 -29
- package/dist/gsapParserExports.js.map +1 -1
- package/dist/gsapWriterAcorn.d.ts +3 -4
- package/dist/gsapWriterAcorn.js +167 -69
- package/dist/gsapWriterAcorn.js.map +1 -1
- package/dist/index.js +45 -29
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare const COLOR_GRADING_CONTRACT_VERSION = 1;
|
|
2
|
+
declare const COLOR_GRADING_COLOR_SPACE = "rec709";
|
|
3
|
+
declare const COLOR_GRADING_TOP_LEVEL_KEYS: readonly ["enabled", "preset", "intensity", "adjust", "details", "effects", "palette", "lut", "colorSpace"];
|
|
4
|
+
declare const COLOR_GRADING_ADJUST_KEYS: readonly ["exposure", "contrast", "highlights", "shadows", "whites", "blacks", "temperature", "tint", "vibrance", "saturation"];
|
|
5
|
+
declare const COLOR_GRADING_DETAIL_KEYS: readonly ["vignette", "vignetteMidpoint", "vignetteRoundness", "vignetteFeather", "grain", "grainSize", "grainRoughness"];
|
|
6
|
+
declare const COLOR_GRADING_EFFECT_KEYS: readonly ["blur", "pixelate", "chromaBleed", "tapeDamage", "tapeTracking", "tapeNoise", "tapeSpeed", "filmArtifacts", "halftone", "halftoneSize", "twoInkPrint", "twoInkPrintSize", "ascii", "asciiSize", "asciiInvert", "asciiStyle", "asciiColor", "asciiRotation", "dither", "ditherSize", "bloom", "bloomRadius", "monoScreen", "monoScreenSize", "monoScreenAngle", "monoScreenSpread", "monoScreenShape", "monoScreenInvert", "scanlines", "scanlineCount", "scanlineSoftness", "chromaticAberration", "chromaticAngle", "crtCurvature", "digitalGlitch", "digitalGlitchColorSplit", "digitalGlitchLineTear", "digitalGlitchPixelate", "digitalGlitchBlockAmount", "digitalGlitchBlockDisplacement", "digitalGlitchBlockOpacity", "digitalGlitchSpeed", "engraving", "engravingSpacing", "engravingMinThickness", "engravingMaxThickness", "engravingAngle", "engravingContrast", "engravingSharpness", "engravingWave", "engravingWaveFrequency", "crosshatch", "crosshatchSpacing", "crosshatchThickness", "crosshatchAngle", "crosshatchContrast", "crosshatchEdges", "crosshatchLineWeight", "crosshatchWave", "crosshatchWaveFrequency", "kuwahara", "kuwaharaRadius", "kuwaharaSharpness", "kuwaharaSaturation"];
|
|
7
|
+
declare const COLOR_GRADING_LUT_KEYS: readonly ["src", "intensity"];
|
|
8
|
+
interface ColorGradingContractIssue {
|
|
9
|
+
path: string;
|
|
10
|
+
message: string;
|
|
11
|
+
hint?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function isColorGradingVariableRef(value: unknown): value is string;
|
|
14
|
+
/** Browser-safe structural validation shared by Lint, CLI, and Core consumers. */
|
|
15
|
+
declare function validateColorGradingContract(value: unknown): ColorGradingContractIssue[];
|
|
16
|
+
|
|
17
|
+
export { COLOR_GRADING_ADJUST_KEYS, COLOR_GRADING_COLOR_SPACE, COLOR_GRADING_CONTRACT_VERSION, COLOR_GRADING_DETAIL_KEYS, COLOR_GRADING_EFFECT_KEYS, COLOR_GRADING_LUT_KEYS, COLOR_GRADING_TOP_LEVEL_KEYS, type ColorGradingContractIssue, isColorGradingVariableRef, validateColorGradingContract };
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
// src/colorGradingContract.ts
|
|
2
|
+
var COLOR_GRADING_CONTRACT_VERSION = 1;
|
|
3
|
+
var COLOR_GRADING_COLOR_SPACE = "rec709";
|
|
4
|
+
var COLOR_GRADING_TOP_LEVEL_KEYS = [
|
|
5
|
+
"enabled",
|
|
6
|
+
"preset",
|
|
7
|
+
"intensity",
|
|
8
|
+
"adjust",
|
|
9
|
+
"details",
|
|
10
|
+
"effects",
|
|
11
|
+
"palette",
|
|
12
|
+
"lut",
|
|
13
|
+
"colorSpace"
|
|
14
|
+
];
|
|
15
|
+
var COLOR_GRADING_ADJUST_KEYS = [
|
|
16
|
+
"exposure",
|
|
17
|
+
"contrast",
|
|
18
|
+
"highlights",
|
|
19
|
+
"shadows",
|
|
20
|
+
"whites",
|
|
21
|
+
"blacks",
|
|
22
|
+
"temperature",
|
|
23
|
+
"tint",
|
|
24
|
+
"vibrance",
|
|
25
|
+
"saturation"
|
|
26
|
+
];
|
|
27
|
+
var COLOR_GRADING_DETAIL_KEYS = [
|
|
28
|
+
"vignette",
|
|
29
|
+
"vignetteMidpoint",
|
|
30
|
+
"vignetteRoundness",
|
|
31
|
+
"vignetteFeather",
|
|
32
|
+
"grain",
|
|
33
|
+
"grainSize",
|
|
34
|
+
"grainRoughness"
|
|
35
|
+
];
|
|
36
|
+
var COLOR_GRADING_EFFECT_KEYS = [
|
|
37
|
+
"blur",
|
|
38
|
+
"pixelate",
|
|
39
|
+
"chromaBleed",
|
|
40
|
+
"tapeDamage",
|
|
41
|
+
"tapeTracking",
|
|
42
|
+
"tapeNoise",
|
|
43
|
+
"tapeSpeed",
|
|
44
|
+
"filmArtifacts",
|
|
45
|
+
"halftone",
|
|
46
|
+
"halftoneSize",
|
|
47
|
+
"twoInkPrint",
|
|
48
|
+
"twoInkPrintSize",
|
|
49
|
+
"ascii",
|
|
50
|
+
"asciiSize",
|
|
51
|
+
"asciiInvert",
|
|
52
|
+
"asciiStyle",
|
|
53
|
+
"asciiColor",
|
|
54
|
+
"asciiRotation",
|
|
55
|
+
"dither",
|
|
56
|
+
"ditherSize",
|
|
57
|
+
"bloom",
|
|
58
|
+
"bloomRadius",
|
|
59
|
+
"monoScreen",
|
|
60
|
+
"monoScreenSize",
|
|
61
|
+
"monoScreenAngle",
|
|
62
|
+
"monoScreenSpread",
|
|
63
|
+
"monoScreenShape",
|
|
64
|
+
"monoScreenInvert",
|
|
65
|
+
"scanlines",
|
|
66
|
+
"scanlineCount",
|
|
67
|
+
"scanlineSoftness",
|
|
68
|
+
"chromaticAberration",
|
|
69
|
+
"chromaticAngle",
|
|
70
|
+
"crtCurvature",
|
|
71
|
+
"digitalGlitch",
|
|
72
|
+
"digitalGlitchColorSplit",
|
|
73
|
+
"digitalGlitchLineTear",
|
|
74
|
+
"digitalGlitchPixelate",
|
|
75
|
+
"digitalGlitchBlockAmount",
|
|
76
|
+
"digitalGlitchBlockDisplacement",
|
|
77
|
+
"digitalGlitchBlockOpacity",
|
|
78
|
+
"digitalGlitchSpeed",
|
|
79
|
+
"engraving",
|
|
80
|
+
"engravingSpacing",
|
|
81
|
+
"engravingMinThickness",
|
|
82
|
+
"engravingMaxThickness",
|
|
83
|
+
"engravingAngle",
|
|
84
|
+
"engravingContrast",
|
|
85
|
+
"engravingSharpness",
|
|
86
|
+
"engravingWave",
|
|
87
|
+
"engravingWaveFrequency",
|
|
88
|
+
"crosshatch",
|
|
89
|
+
"crosshatchSpacing",
|
|
90
|
+
"crosshatchThickness",
|
|
91
|
+
"crosshatchAngle",
|
|
92
|
+
"crosshatchContrast",
|
|
93
|
+
"crosshatchEdges",
|
|
94
|
+
"crosshatchLineWeight",
|
|
95
|
+
"crosshatchWave",
|
|
96
|
+
"crosshatchWaveFrequency",
|
|
97
|
+
"kuwahara",
|
|
98
|
+
"kuwaharaRadius",
|
|
99
|
+
"kuwaharaSharpness",
|
|
100
|
+
"kuwaharaSaturation"
|
|
101
|
+
];
|
|
102
|
+
var COLOR_GRADING_LUT_KEYS = ["src", "intensity"];
|
|
103
|
+
var UNIT_LIMIT = { min: 0, max: 1 };
|
|
104
|
+
var SIGNED_UNIT_LIMIT = { min: -1, max: 1 };
|
|
105
|
+
var EFFECT_LIMIT_OVERRIDES = {
|
|
106
|
+
asciiStyle: { min: 0, max: 7 },
|
|
107
|
+
bloom: { min: 0, max: 3 },
|
|
108
|
+
bloomRadius: { min: 1, max: 100 },
|
|
109
|
+
monoScreenShape: { min: 0, max: 4 }
|
|
110
|
+
};
|
|
111
|
+
var VARIABLE_REF = /^\$(?:\{[A-Za-z0-9_.:-]+\}|[A-Za-z0-9_.:-]+)$/;
|
|
112
|
+
var PALETTE_COLOR = /^#[0-9a-f]{6}$/i;
|
|
113
|
+
var OBJECT_SECTIONS = [
|
|
114
|
+
["adjust", COLOR_GRADING_ADJUST_KEYS],
|
|
115
|
+
["details", COLOR_GRADING_DETAIL_KEYS],
|
|
116
|
+
["effects", COLOR_GRADING_EFFECT_KEYS],
|
|
117
|
+
["lut", COLOR_GRADING_LUT_KEYS]
|
|
118
|
+
];
|
|
119
|
+
function isRecord(value) {
|
|
120
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
121
|
+
}
|
|
122
|
+
function isColorGradingVariableRef(value) {
|
|
123
|
+
return typeof value === "string" && VARIABLE_REF.test(value.trim());
|
|
124
|
+
}
|
|
125
|
+
function unknownKeysHint(path, unknown) {
|
|
126
|
+
if (path !== "grading") return `Correct or remove the unsupported "${path}" keys.`;
|
|
127
|
+
const sections = new Set(
|
|
128
|
+
unknown.flatMap(
|
|
129
|
+
(key) => OBJECT_SECTIONS.filter(([, keys]) => keys.includes(key)).map(
|
|
130
|
+
([section]) => section
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
);
|
|
134
|
+
return sections.size === 1 ? `Move those controls under "${[...sections][0]}".` : "Use only the documented media-treatment keys at the top level.";
|
|
135
|
+
}
|
|
136
|
+
function validateObject(value, path, keys, issues) {
|
|
137
|
+
if (isColorGradingVariableRef(value)) return null;
|
|
138
|
+
if (!isRecord(value)) {
|
|
139
|
+
issues.push({ path, message: "must be an object or variable reference" });
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const allowed = new Set(keys);
|
|
143
|
+
const unknown = Object.keys(value).filter((key) => !allowed.has(key));
|
|
144
|
+
if (unknown.length > 0) {
|
|
145
|
+
issues.push({
|
|
146
|
+
path,
|
|
147
|
+
message: `has unsupported key(s): ${unknown.join(", ")}`,
|
|
148
|
+
hint: unknownKeysHint(path, unknown)
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
function validateNumericField(value, key, path, limit, issues) {
|
|
154
|
+
const candidate = value[key];
|
|
155
|
+
if (candidate === void 0 || isColorGradingVariableRef(candidate)) return;
|
|
156
|
+
if (typeof candidate !== "number" || !Number.isFinite(candidate) || candidate < limit.min || candidate > limit.max) {
|
|
157
|
+
issues.push({
|
|
158
|
+
path: path ? `${path}.${key}` : key,
|
|
159
|
+
message: `must be a finite number from ${limit.min} through ${limit.max}`
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function validateNumericSection(value, path, keys, limitFor, issues) {
|
|
164
|
+
for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);
|
|
165
|
+
}
|
|
166
|
+
function validatePalette(value, issues) {
|
|
167
|
+
if (value === void 0 || value === null || isColorGradingVariableRef(value)) return;
|
|
168
|
+
const hint = 'Use 2 to 6 colors in the intended mapping order, each written as exact "#RRGGBB", or use a project variable reference.';
|
|
169
|
+
if (!Array.isArray(value) || value.length < 2 || value.length > 6) {
|
|
170
|
+
issues.push({ path: "palette", message: "must contain 2 to 6 hex colors", hint });
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
value.forEach((color, index) => {
|
|
174
|
+
if (typeof color !== "string" || !PALETTE_COLOR.test(color)) {
|
|
175
|
+
issues.push({
|
|
176
|
+
path: `palette[${index}]`,
|
|
177
|
+
message: "must be a six-digit hex color",
|
|
178
|
+
hint
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
function validateLut(value, object, issues) {
|
|
184
|
+
if (typeof value === "string") {
|
|
185
|
+
if (!value.trim()) issues.push({ path: "lut", message: "must not be empty" });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (!object) return;
|
|
189
|
+
if (!isColorGradingVariableRef(object.src) && (typeof object.src !== "string" || !object.src.trim())) {
|
|
190
|
+
issues.push({
|
|
191
|
+
path: "lut.src",
|
|
192
|
+
message: "must be a non-empty string or variable reference"
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
validateNumericField(object, "intensity", "lut", UNIT_LIMIT, issues);
|
|
196
|
+
}
|
|
197
|
+
function validateEnabled(grading, issues) {
|
|
198
|
+
if (grading.enabled !== void 0 && !isColorGradingVariableRef(grading.enabled) && typeof grading.enabled !== "boolean") {
|
|
199
|
+
issues.push({ path: "enabled", message: "must be a boolean or variable reference" });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function validatePreset(grading, issues) {
|
|
203
|
+
if (grading.preset !== void 0 && grading.preset !== null && !isColorGradingVariableRef(grading.preset) && (typeof grading.preset !== "string" || !grading.preset.trim())) {
|
|
204
|
+
issues.push({
|
|
205
|
+
path: "preset",
|
|
206
|
+
message: "must be a non-empty string, null, or variable reference"
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function validateColorSpace(grading, issues) {
|
|
211
|
+
if (grading.colorSpace !== void 0 && !isColorGradingVariableRef(grading.colorSpace) && grading.colorSpace !== COLOR_GRADING_COLOR_SPACE) {
|
|
212
|
+
issues.push({
|
|
213
|
+
path: "colorSpace",
|
|
214
|
+
message: `must be "${COLOR_GRADING_COLOR_SPACE}" or a variable reference`
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function validateTopLevel(grading, issues) {
|
|
219
|
+
validateEnabled(grading, issues);
|
|
220
|
+
validateNumericField(grading, "intensity", "", UNIT_LIMIT, issues);
|
|
221
|
+
validatePreset(grading, issues);
|
|
222
|
+
validateColorSpace(grading, issues);
|
|
223
|
+
}
|
|
224
|
+
function validateSection(grading, key, keys, issues) {
|
|
225
|
+
const section = grading[key];
|
|
226
|
+
if (section === void 0 || key === "lut" && section === null) return;
|
|
227
|
+
if (key === "lut" && typeof section === "string") {
|
|
228
|
+
validateLut(section, null, issues);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const object = validateObject(section, key, keys, issues);
|
|
232
|
+
if (!object) return;
|
|
233
|
+
if (key === "lut") return validateLut(section, object, issues);
|
|
234
|
+
const limitFor = (control) => {
|
|
235
|
+
if (key === "adjust" && control === "exposure") return { min: -2, max: 2 };
|
|
236
|
+
if (key === "adjust" || key === "details" && control === "vignetteRoundness") {
|
|
237
|
+
return SIGNED_UNIT_LIMIT;
|
|
238
|
+
}
|
|
239
|
+
return key === "effects" ? EFFECT_LIMIT_OVERRIDES[control] ?? UNIT_LIMIT : UNIT_LIMIT;
|
|
240
|
+
};
|
|
241
|
+
validateNumericSection(object, key, keys, limitFor, issues);
|
|
242
|
+
}
|
|
243
|
+
function validateSections(grading, issues) {
|
|
244
|
+
for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);
|
|
245
|
+
}
|
|
246
|
+
function validateColorGradingContract(value) {
|
|
247
|
+
if (typeof value === "string") {
|
|
248
|
+
return value.trim() ? [] : [{ path: "grading", message: "is empty" }];
|
|
249
|
+
}
|
|
250
|
+
const issues = [];
|
|
251
|
+
const grading = validateObject(value, "grading", COLOR_GRADING_TOP_LEVEL_KEYS, issues);
|
|
252
|
+
if (!grading) return issues;
|
|
253
|
+
validateTopLevel(grading, issues);
|
|
254
|
+
validateSections(grading, issues);
|
|
255
|
+
validatePalette(grading.palette, issues);
|
|
256
|
+
return issues;
|
|
257
|
+
}
|
|
258
|
+
export {
|
|
259
|
+
COLOR_GRADING_ADJUST_KEYS,
|
|
260
|
+
COLOR_GRADING_COLOR_SPACE,
|
|
261
|
+
COLOR_GRADING_CONTRACT_VERSION,
|
|
262
|
+
COLOR_GRADING_DETAIL_KEYS,
|
|
263
|
+
COLOR_GRADING_EFFECT_KEYS,
|
|
264
|
+
COLOR_GRADING_LUT_KEYS,
|
|
265
|
+
COLOR_GRADING_TOP_LEVEL_KEYS,
|
|
266
|
+
isColorGradingVariableRef,
|
|
267
|
+
validateColorGradingContract
|
|
268
|
+
};
|
|
269
|
+
//# sourceMappingURL=colorGradingContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/colorGradingContract.ts"],"sourcesContent":["export const COLOR_GRADING_CONTRACT_VERSION = 1;\nexport const COLOR_GRADING_COLOR_SPACE = \"rec709\";\n\nexport const COLOR_GRADING_TOP_LEVEL_KEYS = [\n \"enabled\",\n \"preset\",\n \"intensity\",\n \"adjust\",\n \"details\",\n \"effects\",\n \"palette\",\n \"lut\",\n \"colorSpace\",\n] as const;\n\nexport const COLOR_GRADING_ADJUST_KEYS = [\n \"exposure\",\n \"contrast\",\n \"highlights\",\n \"shadows\",\n \"whites\",\n \"blacks\",\n \"temperature\",\n \"tint\",\n \"vibrance\",\n \"saturation\",\n] as const;\n\nexport const COLOR_GRADING_DETAIL_KEYS = [\n \"vignette\",\n \"vignetteMidpoint\",\n \"vignetteRoundness\",\n \"vignetteFeather\",\n \"grain\",\n \"grainSize\",\n \"grainRoughness\",\n] as const;\n\nexport const COLOR_GRADING_EFFECT_KEYS = [\n \"blur\",\n \"pixelate\",\n \"chromaBleed\",\n \"tapeDamage\",\n \"tapeTracking\",\n \"tapeNoise\",\n \"tapeSpeed\",\n \"filmArtifacts\",\n \"halftone\",\n \"halftoneSize\",\n \"twoInkPrint\",\n \"twoInkPrintSize\",\n \"ascii\",\n \"asciiSize\",\n \"asciiInvert\",\n \"asciiStyle\",\n \"asciiColor\",\n \"asciiRotation\",\n \"dither\",\n \"ditherSize\",\n \"bloom\",\n \"bloomRadius\",\n \"monoScreen\",\n \"monoScreenSize\",\n \"monoScreenAngle\",\n \"monoScreenSpread\",\n \"monoScreenShape\",\n \"monoScreenInvert\",\n \"scanlines\",\n \"scanlineCount\",\n \"scanlineSoftness\",\n \"chromaticAberration\",\n \"chromaticAngle\",\n \"crtCurvature\",\n \"digitalGlitch\",\n \"digitalGlitchColorSplit\",\n \"digitalGlitchLineTear\",\n \"digitalGlitchPixelate\",\n \"digitalGlitchBlockAmount\",\n \"digitalGlitchBlockDisplacement\",\n \"digitalGlitchBlockOpacity\",\n \"digitalGlitchSpeed\",\n \"engraving\",\n \"engravingSpacing\",\n \"engravingMinThickness\",\n \"engravingMaxThickness\",\n \"engravingAngle\",\n \"engravingContrast\",\n \"engravingSharpness\",\n \"engravingWave\",\n \"engravingWaveFrequency\",\n \"crosshatch\",\n \"crosshatchSpacing\",\n \"crosshatchThickness\",\n \"crosshatchAngle\",\n \"crosshatchContrast\",\n \"crosshatchEdges\",\n \"crosshatchLineWeight\",\n \"crosshatchWave\",\n \"crosshatchWaveFrequency\",\n \"kuwahara\",\n \"kuwaharaRadius\",\n \"kuwaharaSharpness\",\n \"kuwaharaSaturation\",\n] as const;\n\nexport const COLOR_GRADING_LUT_KEYS = [\"src\", \"intensity\"] as const;\n\ntype NumericLimit = Readonly<{ min: number; max: number }>;\n\nconst UNIT_LIMIT: NumericLimit = { min: 0, max: 1 };\nconst SIGNED_UNIT_LIMIT: NumericLimit = { min: -1, max: 1 };\nconst EFFECT_LIMIT_OVERRIDES: Readonly<Record<string, NumericLimit>> = {\n asciiStyle: { min: 0, max: 7 },\n bloom: { min: 0, max: 3 },\n bloomRadius: { min: 1, max: 100 },\n monoScreenShape: { min: 0, max: 4 },\n};\nconst VARIABLE_REF = /^\\$(?:\\{[A-Za-z0-9_.:-]+\\}|[A-Za-z0-9_.:-]+)$/;\nconst PALETTE_COLOR = /^#[0-9a-f]{6}$/i;\n\nconst OBJECT_SECTIONS = [\n [\"adjust\", COLOR_GRADING_ADJUST_KEYS],\n [\"details\", COLOR_GRADING_DETAIL_KEYS],\n [\"effects\", COLOR_GRADING_EFFECT_KEYS],\n [\"lut\", COLOR_GRADING_LUT_KEYS],\n] as const;\n\nexport interface ColorGradingContractIssue {\n path: string;\n message: string;\n hint?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isColorGradingVariableRef(value: unknown): value is string {\n return typeof value === \"string\" && VARIABLE_REF.test(value.trim());\n}\n\nfunction unknownKeysHint(path: string, unknown: readonly string[]): string {\n if (path !== \"grading\") return `Correct or remove the unsupported \"${path}\" keys.`;\n const sections = new Set(\n unknown.flatMap((key) =>\n OBJECT_SECTIONS.filter(([, keys]) => (keys as readonly string[]).includes(key)).map(\n ([section]) => section,\n ),\n ),\n );\n return sections.size === 1\n ? `Move those controls under \"${[...sections][0]}\".`\n : \"Use only the documented media-treatment keys at the top level.\";\n}\n\nfunction validateObject(\n value: unknown,\n path: string,\n keys: readonly string[],\n issues: ColorGradingContractIssue[],\n): Record<string, unknown> | null {\n if (isColorGradingVariableRef(value)) return null;\n if (!isRecord(value)) {\n issues.push({ path, message: \"must be an object or variable reference\" });\n return null;\n }\n const allowed = new Set(keys);\n const unknown = Object.keys(value).filter((key) => !allowed.has(key));\n if (unknown.length > 0) {\n issues.push({\n path,\n message: `has unsupported key(s): ${unknown.join(\", \")}`,\n hint: unknownKeysHint(path, unknown),\n });\n }\n return value;\n}\n\nfunction validateNumericField(\n value: Record<string, unknown>,\n key: string,\n path: string,\n limit: NumericLimit,\n issues: ColorGradingContractIssue[],\n): void {\n const candidate = value[key];\n if (candidate === undefined || isColorGradingVariableRef(candidate)) return;\n if (\n typeof candidate !== \"number\" ||\n !Number.isFinite(candidate) ||\n candidate < limit.min ||\n candidate > limit.max\n ) {\n issues.push({\n path: path ? `${path}.${key}` : key,\n message: `must be a finite number from ${limit.min} through ${limit.max}`,\n });\n }\n}\n\nfunction validateNumericSection(\n value: Record<string, unknown>,\n path: string,\n keys: readonly string[],\n limitFor: (key: string) => NumericLimit,\n issues: ColorGradingContractIssue[],\n): void {\n for (const key of keys) validateNumericField(value, key, path, limitFor(key), issues);\n}\n\nfunction validatePalette(value: unknown, issues: ColorGradingContractIssue[]): void {\n if (value === undefined || value === null || isColorGradingVariableRef(value)) return;\n const hint =\n 'Use 2 to 6 colors in the intended mapping order, each written as exact \"#RRGGBB\", or use a project variable reference.';\n if (!Array.isArray(value) || value.length < 2 || value.length > 6) {\n issues.push({ path: \"palette\", message: \"must contain 2 to 6 hex colors\", hint });\n return;\n }\n value.forEach((color, index) => {\n if (typeof color !== \"string\" || !PALETTE_COLOR.test(color)) {\n issues.push({\n path: `palette[${index}]`,\n message: \"must be a six-digit hex color\",\n hint,\n });\n }\n });\n}\n\nfunction validateLut(\n value: unknown,\n object: Record<string, unknown> | null,\n issues: ColorGradingContractIssue[],\n): void {\n if (typeof value === \"string\") {\n if (!value.trim()) issues.push({ path: \"lut\", message: \"must not be empty\" });\n return;\n }\n if (!object) return;\n if (\n !isColorGradingVariableRef(object.src) &&\n (typeof object.src !== \"string\" || !object.src.trim())\n ) {\n issues.push({\n path: \"lut.src\",\n message: \"must be a non-empty string or variable reference\",\n });\n }\n validateNumericField(object, \"intensity\", \"lut\", UNIT_LIMIT, issues);\n}\n\nfunction validateEnabled(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.enabled !== undefined &&\n !isColorGradingVariableRef(grading.enabled) &&\n typeof grading.enabled !== \"boolean\"\n ) {\n issues.push({ path: \"enabled\", message: \"must be a boolean or variable reference\" });\n }\n}\n\nfunction validatePreset(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.preset !== undefined &&\n grading.preset !== null &&\n !isColorGradingVariableRef(grading.preset) &&\n (typeof grading.preset !== \"string\" || !grading.preset.trim())\n ) {\n issues.push({\n path: \"preset\",\n message: \"must be a non-empty string, null, or variable reference\",\n });\n }\n}\n\nfunction validateColorSpace(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n if (\n grading.colorSpace !== undefined &&\n !isColorGradingVariableRef(grading.colorSpace) &&\n grading.colorSpace !== COLOR_GRADING_COLOR_SPACE\n ) {\n issues.push({\n path: \"colorSpace\",\n message: `must be \"${COLOR_GRADING_COLOR_SPACE}\" or a variable reference`,\n });\n }\n}\n\nfunction validateTopLevel(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n validateEnabled(grading, issues);\n validateNumericField(grading, \"intensity\", \"\", UNIT_LIMIT, issues);\n validatePreset(grading, issues);\n validateColorSpace(grading, issues);\n}\n\nfunction validateSection(\n grading: Record<string, unknown>,\n key: (typeof OBJECT_SECTIONS)[number][0],\n keys: readonly string[],\n issues: ColorGradingContractIssue[],\n): void {\n const section = grading[key];\n if (section === undefined || (key === \"lut\" && section === null)) return;\n if (key === \"lut\" && typeof section === \"string\") {\n validateLut(section, null, issues);\n return;\n }\n const object = validateObject(section, key, keys, issues);\n if (!object) return;\n if (key === \"lut\") return validateLut(section, object, issues);\n\n const limitFor = (control: string): NumericLimit => {\n if (key === \"adjust\" && control === \"exposure\") return { min: -2, max: 2 };\n if (key === \"adjust\" || (key === \"details\" && control === \"vignetteRoundness\")) {\n return SIGNED_UNIT_LIMIT;\n }\n return key === \"effects\" ? (EFFECT_LIMIT_OVERRIDES[control] ?? UNIT_LIMIT) : UNIT_LIMIT;\n };\n validateNumericSection(object, key, keys, limitFor, issues);\n}\n\nfunction validateSections(\n grading: Record<string, unknown>,\n issues: ColorGradingContractIssue[],\n): void {\n for (const [key, keys] of OBJECT_SECTIONS) validateSection(grading, key, keys, issues);\n}\n\n/** Browser-safe structural validation shared by Lint, CLI, and Core consumers. */\nexport function validateColorGradingContract(value: unknown): ColorGradingContractIssue[] {\n if (typeof value === \"string\") {\n return value.trim() ? [] : [{ path: \"grading\", message: \"is empty\" }];\n }\n\n const issues: ColorGradingContractIssue[] = [];\n const grading = validateObject(value, \"grading\", COLOR_GRADING_TOP_LEVEL_KEYS, issues);\n if (!grading) return issues;\n\n validateTopLevel(grading, issues);\n validateSections(grading, issues);\n validatePalette(grading.palette, issues);\n return issues;\n}\n"],"mappings":"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","names":[]}
|
package/dist/gsapConstants.js
CHANGED
|
@@ -87,14 +87,18 @@ var SUPPORTED_EASES = [
|
|
|
87
87
|
"bounce.in",
|
|
88
88
|
"bounce.out",
|
|
89
89
|
"bounce.inOut",
|
|
90
|
+
"circ.inOut",
|
|
90
91
|
"expo.in",
|
|
91
92
|
"expo.out",
|
|
92
93
|
"expo.inOut",
|
|
94
|
+
"elastic.out(1,0.3)",
|
|
95
|
+
"elastic.inOut(1,0.3)",
|
|
93
96
|
"spring-gentle",
|
|
94
97
|
"spring-bouncy",
|
|
95
98
|
"spring-stiff",
|
|
96
99
|
"spring-wobbly",
|
|
97
100
|
"spring-heavy",
|
|
101
|
+
"hold",
|
|
98
102
|
"steps(1)"
|
|
99
103
|
];
|
|
100
104
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gsapConstants.ts"],"sourcesContent":["/**\n * GSAP property and ease constants.\n *\n * Extracted into a standalone module so browser code can import them\n * without pulling in gsapParser (which depends on recast / @babel/parser).\n */\n\nexport const SUPPORTED_PROPS = [\n // 2D Transforms\n \"x\",\n \"y\",\n \"scale\",\n \"scaleX\",\n \"scaleY\",\n \"rotation\",\n \"skewX\",\n \"skewY\",\n // 3D Transforms\n \"z\",\n \"rotationX\",\n \"rotationY\",\n \"rotationZ\",\n \"perspective\",\n \"transformPerspective\",\n \"transformOrigin\",\n // Visibility\n \"opacity\",\n \"visibility\",\n \"autoAlpha\",\n // Dimensions\n \"width\",\n \"height\",\n // Colors\n \"color\",\n \"backgroundColor\",\n \"borderColor\",\n // Box model\n \"borderRadius\",\n // Typography\n \"fontSize\",\n \"letterSpacing\",\n // Filter & Clipping\n \"filter\",\n \"clipPath\",\n // DOM content (number counters, text roll-ups)\n \"innerText\",\n];\n\n// ── Property Groups ─────────────────────────────────────────────────────────\n// Each group maps to an independent GSAP tween so editing one property\n// (e.g. drag → x/y) never contaminates another (e.g. scale, rotation).\n\nexport type PropertyGroupName = \"position\" | \"scale\" | \"size\" | \"rotation\" | \"visual\" | \"other\";\n\nexport const PROPERTY_GROUPS: Record<PropertyGroupName, ReadonlySet<string>> = {\n position: new Set([\"x\", \"y\", \"xPercent\", \"yPercent\"]),\n scale: new Set([\"scale\", \"scaleX\", \"scaleY\"]),\n size: new Set([\"width\", \"height\"]),\n rotation: new Set([\"rotation\", \"skewX\", \"skewY\"]),\n visual: new Set([\"opacity\", \"autoAlpha\"]),\n other: new Set<string>(),\n};\n\nconst PROP_TO_GROUP = new Map<string, PropertyGroupName>();\nfor (const [group, props] of Object.entries(PROPERTY_GROUPS) as [\n PropertyGroupName,\n ReadonlySet<string>,\n][]) {\n for (const p of props) PROP_TO_GROUP.set(p, group);\n}\n\nexport function classifyPropertyGroup(prop: string): PropertyGroupName {\n return PROP_TO_GROUP.get(prop) ?? \"other\";\n}\n\nexport function classifyTweenPropertyGroup(\n properties: Record<string, unknown>,\n): PropertyGroupName | undefined {\n const groups = new Set<PropertyGroupName>();\n for (const key of Object.keys(properties)) {\n // transformOrigin is a modifier; `_auto` is Studio's internal endpoint marker;\n // `data` is GSAP-reserved (carries the Studio hold-set tag). None is an animated\n // property, so none should affect the group.\n if (key === \"transformOrigin\" || key === \"_auto\" || key === \"data\") continue;\n const g = classifyPropertyGroup(key);\n groups.add(g);\n }\n if (groups.size === 1) return groups.values().next().value;\n return undefined;\n}\n\nexport const SUPPORTED_EASES = [\n \"none\",\n \"power1.in\",\n \"power1.out\",\n \"power1.inOut\",\n \"power2.in\",\n \"power2.out\",\n \"power2.inOut\",\n \"power3.in\",\n \"power3.out\",\n \"power3.inOut\",\n \"power4.in\",\n \"power4.out\",\n \"power4.inOut\",\n \"back.in\",\n \"back.out\",\n \"back.inOut\",\n \"elastic.in\",\n \"elastic.out\",\n \"elastic.inOut\",\n \"bounce.in\",\n \"bounce.out\",\n \"bounce.inOut\",\n \"expo.in\",\n \"expo.out\",\n \"expo.inOut\",\n \"spring-gentle\",\n \"spring-bouncy\",\n \"spring-stiff\",\n \"spring-wobbly\",\n \"spring-heavy\",\n \"steps(1)\",\n];\n"],"mappings":";AAOO,IAAM,kBAAkB;AAAA;AAAA,EAE7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AACF;AAQO,IAAM,kBAAkE;AAAA,EAC7E,UAAU,oBAAI,IAAI,CAAC,KAAK,KAAK,YAAY,UAAU,CAAC;AAAA,EACpD,OAAO,oBAAI,IAAI,CAAC,SAAS,UAAU,QAAQ,CAAC;AAAA,EAC5C,MAAM,oBAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;AAAA,EACjC,UAAU,oBAAI,IAAI,CAAC,YAAY,SAAS,OAAO,CAAC;AAAA,EAChD,QAAQ,oBAAI,IAAI,CAAC,WAAW,WAAW,CAAC;AAAA,EACxC,OAAO,oBAAI,IAAY;AACzB;AAEA,IAAM,gBAAgB,oBAAI,IAA+B;AACzD,WAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,eAAe,GAGtD;AACH,aAAW,KAAK,MAAO,eAAc,IAAI,GAAG,KAAK;AACnD;AAEO,SAAS,sBAAsB,MAAiC;AACrE,SAAO,cAAc,IAAI,IAAI,KAAK;AACpC;AAEO,SAAS,2BACd,YAC+B;AAC/B,QAAM,SAAS,oBAAI,IAAuB;AAC1C,aAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AAIzC,QAAI,QAAQ,qBAAqB,QAAQ,WAAW,QAAQ,OAAQ;AACpE,UAAM,IAAI,sBAAsB,GAAG;AACnC,WAAO,IAAI,CAAC;AAAA,EACd;AACA,MAAI,OAAO,SAAS,EAAG,QAAO,OAAO,OAAO,EAAE,KAAK,EAAE;AACrD,SAAO;AACT;AAEO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/gsapConstants.ts"],"sourcesContent":["/**\n * GSAP property and ease constants.\n *\n * Extracted into a standalone module so browser code can import them\n * without pulling in gsapParser (which depends on recast / @babel/parser).\n */\n\nexport const SUPPORTED_PROPS = [\n // 2D Transforms\n \"x\",\n \"y\",\n \"scale\",\n \"scaleX\",\n \"scaleY\",\n \"rotation\",\n \"skewX\",\n \"skewY\",\n // 3D Transforms\n \"z\",\n \"rotationX\",\n \"rotationY\",\n \"rotationZ\",\n \"perspective\",\n \"transformPerspective\",\n \"transformOrigin\",\n // Visibility\n \"opacity\",\n \"visibility\",\n \"autoAlpha\",\n // Dimensions\n \"width\",\n \"height\",\n // Colors\n \"color\",\n \"backgroundColor\",\n \"borderColor\",\n // Box model\n \"borderRadius\",\n // Typography\n \"fontSize\",\n \"letterSpacing\",\n // Filter & Clipping\n \"filter\",\n \"clipPath\",\n // DOM content (number counters, text roll-ups)\n \"innerText\",\n];\n\n// ── Property Groups ─────────────────────────────────────────────────────────\n// Each group maps to an independent GSAP tween so editing one property\n// (e.g. drag → x/y) never contaminates another (e.g. scale, rotation).\n\nexport type PropertyGroupName = \"position\" | \"scale\" | \"size\" | \"rotation\" | \"visual\" | \"other\";\n\nexport const PROPERTY_GROUPS: Record<PropertyGroupName, ReadonlySet<string>> = {\n position: new Set([\"x\", \"y\", \"xPercent\", \"yPercent\"]),\n scale: new Set([\"scale\", \"scaleX\", \"scaleY\"]),\n size: new Set([\"width\", \"height\"]),\n rotation: new Set([\"rotation\", \"skewX\", \"skewY\"]),\n visual: new Set([\"opacity\", \"autoAlpha\"]),\n other: new Set<string>(),\n};\n\nconst PROP_TO_GROUP = new Map<string, PropertyGroupName>();\nfor (const [group, props] of Object.entries(PROPERTY_GROUPS) as [\n PropertyGroupName,\n ReadonlySet<string>,\n][]) {\n for (const p of props) PROP_TO_GROUP.set(p, group);\n}\n\nexport function classifyPropertyGroup(prop: string): PropertyGroupName {\n return PROP_TO_GROUP.get(prop) ?? \"other\";\n}\n\nexport function classifyTweenPropertyGroup(\n properties: Record<string, unknown>,\n): PropertyGroupName | undefined {\n const groups = new Set<PropertyGroupName>();\n for (const key of Object.keys(properties)) {\n // transformOrigin is a modifier; `_auto` is Studio's internal endpoint marker;\n // `data` is GSAP-reserved (carries the Studio hold-set tag). None is an animated\n // property, so none should affect the group.\n if (key === \"transformOrigin\" || key === \"_auto\" || key === \"data\") continue;\n const g = classifyPropertyGroup(key);\n groups.add(g);\n }\n if (groups.size === 1) return groups.values().next().value;\n return undefined;\n}\n\nexport const SUPPORTED_EASES = [\n \"none\",\n \"power1.in\",\n \"power1.out\",\n \"power1.inOut\",\n \"power2.in\",\n \"power2.out\",\n \"power2.inOut\",\n \"power3.in\",\n \"power3.out\",\n \"power3.inOut\",\n \"power4.in\",\n \"power4.out\",\n \"power4.inOut\",\n \"back.in\",\n \"back.out\",\n \"back.inOut\",\n \"elastic.in\",\n \"elastic.out\",\n \"elastic.inOut\",\n \"bounce.in\",\n \"bounce.out\",\n \"bounce.inOut\",\n \"circ.inOut\",\n \"expo.in\",\n \"expo.out\",\n \"expo.inOut\",\n \"elastic.out(1,0.3)\",\n \"elastic.inOut(1,0.3)\",\n \"spring-gentle\",\n \"spring-bouncy\",\n \"spring-stiff\",\n \"spring-wobbly\",\n \"spring-heavy\",\n \"hold\",\n \"steps(1)\",\n];\n"],"mappings":";AAOO,IAAM,kBAAkB;AAAA;AAAA,EAE7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AACF;AAQO,IAAM,kBAAkE;AAAA,EAC7E,UAAU,oBAAI,IAAI,CAAC,KAAK,KAAK,YAAY,UAAU,CAAC;AAAA,EACpD,OAAO,oBAAI,IAAI,CAAC,SAAS,UAAU,QAAQ,CAAC;AAAA,EAC5C,MAAM,oBAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;AAAA,EACjC,UAAU,oBAAI,IAAI,CAAC,YAAY,SAAS,OAAO,CAAC;AAAA,EAChD,QAAQ,oBAAI,IAAI,CAAC,WAAW,WAAW,CAAC;AAAA,EACxC,OAAO,oBAAI,IAAY;AACzB;AAEA,IAAM,gBAAgB,oBAAI,IAA+B;AACzD,WAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,eAAe,GAGtD;AACH,aAAW,KAAK,MAAO,eAAc,IAAI,GAAG,KAAK;AACnD;AAEO,SAAS,sBAAsB,MAAiC;AACrE,SAAO,cAAc,IAAI,IAAI,KAAK;AACpC;AAEO,SAAS,2BACd,YAC+B;AAC/B,QAAM,SAAS,oBAAI,IAAuB;AAC1C,aAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AAIzC,QAAI,QAAQ,qBAAqB,QAAQ,WAAW,QAAQ,OAAQ;AACpE,UAAM,IAAI,sBAAsB,GAAG;AACnC,WAAO,IAAI,CAAC;AAAA,EACd;AACA,MAAI,OAAO,SAAS,EAAG,QAAO,OAAO,OAAO,EAAE,KAAK,EAAE;AACrD,SAAO;AACT;AAEO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
|
package/dist/gsapParser.d.ts
CHANGED
|
@@ -77,10 +77,9 @@ declare function removeKeyframeFromScript(script: string, animationId: string, p
|
|
|
77
77
|
/**
|
|
78
78
|
* Retime a keyframe: move the keyframe at `fromPercentage` to `toPercentage`,
|
|
79
79
|
* PRESERVING its properties and per-keyframe ease (the Studio "Move to Playhead"
|
|
80
|
-
* gesture). Re-sorts keyframes by percentage.
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* the move resolves onto the same keyframe. Acorn twin: moveKeyframeInScript.
|
|
80
|
+
* gesture). Re-sorts keyframes by percentage. No-op when the animation/keyframe
|
|
81
|
+
* isn't found, the tween has no object-form keyframes, the move resolves onto the
|
|
82
|
+
* same keyframe, or the destination is occupied. Acorn twin: moveKeyframeInScript.
|
|
84
83
|
*/
|
|
85
84
|
declare function moveKeyframeInScript(script: string, animationId: string, fromPercentage: number, toPercentage: number): string;
|
|
86
85
|
/**
|