@pixerate/editor 0.75.0 → 0.77.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +28 -28
- package/dist/agent/index.js +3 -3
- package/dist/animation-editor/index.cjs +148 -218
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.js +8 -78
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/{chunk-OK7T2LHK.js → chunk-GNO5PEMH.js} +2 -2
- package/dist/{chunk-EIXXBKUB.js → chunk-IMSX4IVG.js} +7 -7
- package/dist/chunk-INZJALPY.js +87 -0
- package/dist/chunk-INZJALPY.js.map +1 -0
- package/dist/{chunk-PL3MPFPA.cjs → chunk-MXF4DP2C.cjs} +77 -77
- package/dist/{chunk-PL3MPFPA.cjs.map → chunk-MXF4DP2C.cjs.map} +1 -1
- package/dist/{chunk-T4XWVPJK.cjs → chunk-RKJDBXTY.cjs} +3 -3
- package/dist/{chunk-T4XWVPJK.cjs.map → chunk-RKJDBXTY.cjs.map} +1 -1
- package/dist/{chunk-HNDSPZ5T.cjs → chunk-ROXFP2LQ.cjs} +4 -4
- package/dist/{chunk-HNDSPZ5T.cjs.map → chunk-ROXFP2LQ.cjs.map} +1 -1
- package/dist/{chunk-WON34HKM.js → chunk-SVW2UNUC.js} +2 -2
- package/dist/{chunk-66IMF6OD.cjs → chunk-TYOAJDFD.cjs} +3 -3
- package/dist/{chunk-66IMF6OD.cjs.map → chunk-TYOAJDFD.cjs.map} +1 -1
- package/dist/chunk-WAJQKWQU.cjs +87 -0
- package/dist/chunk-WAJQKWQU.cjs.map +1 -0
- package/dist/{chunk-UKI64KUD.js → chunk-ZQNDSUZO.js} +6 -6
- package/dist/extensions/index.cjs +7 -7
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +6 -6
- package/dist/index.cjs +35 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -17
- package/dist/serializers/index.cjs +4 -4
- package/dist/serializers/index.cjs.map +1 -1
- package/dist/serializers/index.js +3 -3
- package/dist/video-editor/index.cjs +2234 -0
- package/dist/video-editor/index.cjs.map +1 -0
- package/dist/video-editor/index.d.cts +1003 -0
- package/dist/video-editor/index.d.ts +1003 -0
- package/dist/video-editor/index.js +2234 -0
- package/dist/video-editor/index.js.map +1 -0
- package/package.json +6 -1
- /package/dist/{chunk-OK7T2LHK.js.map → chunk-GNO5PEMH.js.map} +0 -0
- /package/dist/{chunk-EIXXBKUB.js.map → chunk-IMSX4IVG.js.map} +0 -0
- /package/dist/{chunk-WON34HKM.js.map → chunk-SVW2UNUC.js.map} +0 -0
- /package/dist/{chunk-UKI64KUD.js.map → chunk-ZQNDSUZO.js.map} +0 -0
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./chunk-633QC34G.js";
|
|
16
16
|
import {
|
|
17
17
|
plainTextToSlice
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-ZQNDSUZO.js";
|
|
19
19
|
import {
|
|
20
20
|
TRACK_CHANGES_SKIP_META,
|
|
21
21
|
isTrackChangesEnabled
|
|
@@ -2286,4 +2286,4 @@ export {
|
|
|
2286
2286
|
replaceWithTextTransaction,
|
|
2287
2287
|
typeAgentText
|
|
2288
2288
|
};
|
|
2289
|
-
//# sourceMappingURL=chunk-
|
|
2289
|
+
//# sourceMappingURL=chunk-GNO5PEMH.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
compareDocuments
|
|
3
|
+
} from "./chunk-QJSOZFCZ.js";
|
|
1
4
|
import {
|
|
2
5
|
DEFAULT_STYLES,
|
|
3
6
|
NORMAL_STYLE_ID,
|
|
@@ -31,13 +34,10 @@ import {
|
|
|
31
34
|
searchDocument,
|
|
32
35
|
sliceContainsTable,
|
|
33
36
|
syncInitialContent
|
|
34
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-GNO5PEMH.js";
|
|
35
38
|
import {
|
|
36
39
|
chartDataToTable
|
|
37
40
|
} from "./chunk-633QC34G.js";
|
|
38
|
-
import {
|
|
39
|
-
compareDocuments
|
|
40
|
-
} from "./chunk-QJSOZFCZ.js";
|
|
41
41
|
import {
|
|
42
42
|
INSTRUCTION_REGEX,
|
|
43
43
|
TEMPLATE_REGEX,
|
|
@@ -53,13 +53,13 @@ import {
|
|
|
53
53
|
rtfToPlainText,
|
|
54
54
|
sanitizeImportedHtml,
|
|
55
55
|
serializeRichClipboardPayload
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-SVW2UNUC.js";
|
|
57
57
|
import {
|
|
58
58
|
escapeHtml,
|
|
59
59
|
htmlToPlainText,
|
|
60
60
|
markdownToTipTapHtml,
|
|
61
61
|
plainTextToSlice
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-ZQNDSUZO.js";
|
|
63
63
|
import {
|
|
64
64
|
CommentStore,
|
|
65
65
|
TRACK_CHANGES_SKIP_META,
|
|
@@ -6755,4 +6755,4 @@ export {
|
|
|
6755
6755
|
validateFindPattern,
|
|
6756
6756
|
createTableCommands
|
|
6757
6757
|
};
|
|
6758
|
-
//# sourceMappingURL=chunk-
|
|
6758
|
+
//# sourceMappingURL=chunk-IMSX4IVG.js.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/animation-editor/issues.ts
|
|
2
|
+
var MOTION_ISSUE_CODES = {
|
|
3
|
+
"no-shots": { severity: "note", wording: "The scene has no shots yet." },
|
|
4
|
+
"duplicate-shot-id": { severity: "error", wording: "Two shots share an id." },
|
|
5
|
+
"unknown-target": { severity: "error", wording: "A command names a node the artwork does not have." },
|
|
6
|
+
"unknown-path": { severity: "error", wording: "A follow command names a path the artwork does not have." },
|
|
7
|
+
"not-a-path": { severity: "error", wording: "A follow path must be a path node, not a group." },
|
|
8
|
+
"reveal-no-box": { severity: "warning", wording: "A wipe, iris or split cannot clip a node with no width or height (a lone straight line), so it fades instead." },
|
|
9
|
+
"driver-cycle": { severity: "error", wording: "Drivers follow each other in a loop, so none of them has a value." },
|
|
10
|
+
"split-not-text": { severity: "warning", wording: "A command splits a target into letters, but it is not a group of letter paths, so it animates as a whole." },
|
|
11
|
+
"unknown-clip": { severity: "error", wording: "A play command names a clip the scene does not have." },
|
|
12
|
+
"unknown-shape": { severity: "error", wording: "A morph names a shape the artwork does not have." },
|
|
13
|
+
"match-self": { severity: "error", wording: "A match turns a group into itself or into a group it holds (or that holds it)." },
|
|
14
|
+
"match-unpaired": { severity: "note", wording: `Parts of a match's "into" group have no partner in the target, so they do not appear.` },
|
|
15
|
+
"unknown-effect": { severity: "error", wording: "An effect command names an effect the node does not have." },
|
|
16
|
+
"unknown-effect-param": { severity: "error", wording: "An effect command names a parameter that is not a number of that effect." },
|
|
17
|
+
"unknown-frame": { severity: "error", wording: "A camera frames a node the artwork does not have." },
|
|
18
|
+
"invalid-camera": { severity: "error", wording: "A camera rectangle has no area." },
|
|
19
|
+
"invalid-color": { severity: "error", wording: "A colour cannot be read." },
|
|
20
|
+
"paint-not-color": { severity: "warning", wording: "A style command recolours a gradient or empty paint, which only switches at the end, or a colour pulse has no solid paint to tint." },
|
|
21
|
+
"overlap": { severity: "warning", wording: "Two commands change the same property of a node at the same time; the later one wins." },
|
|
22
|
+
"enter-visible": { severity: "warning", wording: "A node enters while it is already showing, so it blinks out first." },
|
|
23
|
+
"exit-hidden": { severity: "warning", wording: "A node exits or animates while it is hidden." },
|
|
24
|
+
"out-of-frame": { severity: "warning", wording: "A node a command animates ends up outside the camera." },
|
|
25
|
+
"too-fast": { severity: "warning", wording: "A change is too quick to follow." },
|
|
26
|
+
"spring-cut-short": { severity: "warning", wording: "A spring is given a duration shorter than it takes to settle, so it jumps to its end." },
|
|
27
|
+
"unknown-cue": { severity: "error", wording: "A shot is cued to a beat with no beat grid, or to a word the narration does not have." },
|
|
28
|
+
"cue-missed": { severity: "warning", wording: "A shot starts after its cue, because the shot before runs past it." },
|
|
29
|
+
"trigger-loop": { severity: "note", wording: "A scene that plays on a trigger ignores its loop." },
|
|
30
|
+
"click-cue": { severity: "warning", wording: "A shot of a click-triggered scene is cued, but clicks decide when its shots start." },
|
|
31
|
+
"click-one-shot": { severity: "note", wording: "A click-triggered scene has one shot, so every click replays it." },
|
|
32
|
+
"scene-too-long": { severity: "warning", wording: "The scene runs past its target length." },
|
|
33
|
+
"scene-too-short": { severity: "warning", wording: "The scene ends before its target length." },
|
|
34
|
+
"unknown-control-color": { severity: "warning", wording: "A control stands for a colour the scene never uses." },
|
|
35
|
+
"empty-shot": { severity: "note", wording: "A shot neither moves the camera nor runs a command." },
|
|
36
|
+
"camera-aspect": { severity: "note", wording: "A camera rectangle has a different shape from the artwork, so it is letterboxed." }
|
|
37
|
+
};
|
|
38
|
+
function motionIssue(code, message, extra = {}) {
|
|
39
|
+
return { code, severity: MOTION_ISSUE_CODES[code].severity, message, ...extra };
|
|
40
|
+
}
|
|
41
|
+
function motionIssueKey(issue) {
|
|
42
|
+
if (issue.ids?.length) return `${issue.code}:${[...issue.ids].sort().join(",")}`;
|
|
43
|
+
return `${issue.code}@${issue.shot ?? ""}#${issue.command ?? ""}`;
|
|
44
|
+
}
|
|
45
|
+
function motionIssueLine(issue) {
|
|
46
|
+
const where = issue.shot !== void 0 ? `Shot "${issue.shot}"${issue.command !== void 0 ? `, command ${issue.command + 1}` : ""}: ` : "";
|
|
47
|
+
return `${where}${issue.message}`;
|
|
48
|
+
}
|
|
49
|
+
function editDistance(a, b) {
|
|
50
|
+
const d = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);
|
|
51
|
+
for (let j = 1; j <= b.length; j++) d[0][j] = j;
|
|
52
|
+
for (let i = 1; i <= a.length; i++) {
|
|
53
|
+
for (let j = 1; j <= b.length; j++) {
|
|
54
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
55
|
+
d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);
|
|
56
|
+
if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return d[a.length][b.length];
|
|
60
|
+
}
|
|
61
|
+
function suggestName(word, candidates) {
|
|
62
|
+
const w = word.toLowerCase();
|
|
63
|
+
let best;
|
|
64
|
+
let bestDistance = Infinity;
|
|
65
|
+
for (const c of candidates) {
|
|
66
|
+
const distance = editDistance(w, c.toLowerCase());
|
|
67
|
+
if (distance < bestDistance) {
|
|
68
|
+
best = c;
|
|
69
|
+
bestDistance = distance;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return best !== void 0 && bestDistance <= Math.max(1, Math.floor(word.length / 3)) ? best : void 0;
|
|
73
|
+
}
|
|
74
|
+
function namedWithSuggestion(word, candidates) {
|
|
75
|
+
const s = suggestName(word, candidates);
|
|
76
|
+
return s !== void 0 && s !== word ? `"${word}" (did you mean "${s}"?)` : `"${word}"`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
MOTION_ISSUE_CODES,
|
|
81
|
+
motionIssue,
|
|
82
|
+
motionIssueKey,
|
|
83
|
+
motionIssueLine,
|
|
84
|
+
suggestName,
|
|
85
|
+
namedWithSuggestion
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=chunk-INZJALPY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animation-editor/issues.ts"],"sourcesContent":["/**\n * Problems with a scene, as data: every issue has a stable `code`, a severity, the shot and\n * command it is in and the ids it is about, beside its prose `message`, so an agent (or a UI)\n * can act on it without parsing sentences.\n */\n\n/** `error`: the scene does not play as written. `warning`: it plays, but probably not as meant. `note`: may well be intended. */\nexport type MotionIssueSeverity = 'error' | 'warning' | 'note';\n\n/** Every issue code with its severity and what it means. */\nexport const MOTION_ISSUE_CODES = {\n\t'no-shots': { severity: 'note', wording: 'The scene has no shots yet.' },\n\t'duplicate-shot-id': { severity: 'error', wording: 'Two shots share an id.' },\n\t'unknown-target': { severity: 'error', wording: 'A command names a node the artwork does not have.' },\n\t'unknown-path': { severity: 'error', wording: 'A follow command names a path the artwork does not have.' },\n\t'not-a-path': { severity: 'error', wording: 'A follow path must be a path node, not a group.' },\n\t'reveal-no-box': { severity: 'warning', wording: 'A wipe, iris or split cannot clip a node with no width or height (a lone straight line), so it fades instead.' },\n\t'driver-cycle': { severity: 'error', wording: 'Drivers follow each other in a loop, so none of them has a value.' },\n\t'split-not-text': { severity: 'warning', wording: 'A command splits a target into letters, but it is not a group of letter paths, so it animates as a whole.' },\n\t'unknown-clip': { severity: 'error', wording: 'A play command names a clip the scene does not have.' },\n\t'unknown-shape': { severity: 'error', wording: 'A morph names a shape the artwork does not have.' },\n\t'match-self': { severity: 'error', wording: 'A match turns a group into itself or into a group it holds (or that holds it).' },\n\t'match-unpaired': { severity: 'note', wording: 'Parts of a match\\'s \"into\" group have no partner in the target, so they do not appear.' },\n\t'unknown-effect': { severity: 'error', wording: 'An effect command names an effect the node does not have.' },\n\t'unknown-effect-param': { severity: 'error', wording: 'An effect command names a parameter that is not a number of that effect.' },\n\t'unknown-frame': { severity: 'error', wording: 'A camera frames a node the artwork does not have.' },\n\t'invalid-camera': { severity: 'error', wording: 'A camera rectangle has no area.' },\n\t'invalid-color': { severity: 'error', wording: 'A colour cannot be read.' },\n\t'paint-not-color': { severity: 'warning', wording: 'A style command recolours a gradient or empty paint, which only switches at the end, or a colour pulse has no solid paint to tint.' },\n\t'overlap': { severity: 'warning', wording: 'Two commands change the same property of a node at the same time; the later one wins.' },\n\t'enter-visible': { severity: 'warning', wording: 'A node enters while it is already showing, so it blinks out first.' },\n\t'exit-hidden': { severity: 'warning', wording: 'A node exits or animates while it is hidden.' },\n\t'out-of-frame': { severity: 'warning', wording: 'A node a command animates ends up outside the camera.' },\n\t'too-fast': { severity: 'warning', wording: 'A change is too quick to follow.' },\n\t'spring-cut-short': { severity: 'warning', wording: 'A spring is given a duration shorter than it takes to settle, so it jumps to its end.' },\n\t'unknown-cue': { severity: 'error', wording: 'A shot is cued to a beat with no beat grid, or to a word the narration does not have.' },\n\t'cue-missed': { severity: 'warning', wording: 'A shot starts after its cue, because the shot before runs past it.' },\n\t'trigger-loop': { severity: 'note', wording: 'A scene that plays on a trigger ignores its loop.' },\n\t'click-cue': { severity: 'warning', wording: 'A shot of a click-triggered scene is cued, but clicks decide when its shots start.' },\n\t'click-one-shot': { severity: 'note', wording: 'A click-triggered scene has one shot, so every click replays it.' },\n\t'scene-too-long': { severity: 'warning', wording: 'The scene runs past its target length.' },\n\t'scene-too-short': { severity: 'warning', wording: 'The scene ends before its target length.' },\n\t'unknown-control-color': { severity: 'warning', wording: 'A control stands for a colour the scene never uses.' },\n\t'empty-shot': { severity: 'note', wording: 'A shot neither moves the camera nor runs a command.' },\n\t'camera-aspect': { severity: 'note', wording: 'A camera rectangle has a different shape from the artwork, so it is letterboxed.' }\n} as const satisfies Record<string, { severity: MotionIssueSeverity; wording: string }>;\n\nexport type MotionIssueCode = keyof typeof MOTION_ISSUE_CODES;\n\nexport interface MotionIssue {\n\tcode: MotionIssueCode;\n\tseverity: MotionIssueSeverity;\n\tmessage: string;\n\t/** Id of the shot it is in, when it is in one. */\n\tshot?: string;\n\t/** Index of the command in that shot's `run`. */\n\tcommand?: number;\n\t/** Node ids it is about. */\n\tids?: string[];\n\t/** What was measured, what was needed and in what unit (e.g. 80 vs 120 ms). */\n\tmeasured?: number;\n\tneeded?: number;\n\tunit?: 'ms' | 's' | 'units';\n}\n\nexport function motionIssue(code: MotionIssueCode, message: string, extra: Omit<MotionIssue, 'code' | 'severity' | 'message'> = {}): MotionIssue {\n\treturn { code, severity: MOTION_ISSUE_CODES[code].severity, message, ...extra };\n}\n\n/** A stable key for an issue (code and ids, else code and place), to compare two checks. */\nexport function motionIssueKey(issue: MotionIssue): string {\n\tif (issue.ids?.length) return `${issue.code}:${[...issue.ids].sort().join(',')}`;\n\treturn `${issue.code}@${issue.shot ?? ''}#${issue.command ?? ''}`;\n}\n\n/** One line: `Shot \"intro\", command 2: …`. */\nexport function motionIssueLine(issue: MotionIssue): string {\n\tconst where = issue.shot !== undefined ? `Shot \"${issue.shot}\"${issue.command !== undefined ? `, command ${issue.command + 1}` : ''}: ` : '';\n\treturn `${where}${issue.message}`;\n}\n\n/** Optimal string alignment (Damerau–Levenshtein) distance. */\nfunction editDistance(a: string, b: string): number {\n\tconst d: number[][] = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);\n\tfor (let j = 1; j <= b.length; j++) d[0][j] = j;\n\tfor (let i = 1; i <= a.length; i++) {\n\t\tfor (let j = 1; j <= b.length; j++) {\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\t\t\td[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);\n\t\t\tif (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n\t\t}\n\t}\n\treturn d[a.length][b.length];\n}\n\n/** The candidate closest to `word` (case-insensitive), if it is within a third of its length. */\nexport function suggestName(word: string, candidates: Iterable<string>): string | undefined {\n\tconst w = word.toLowerCase();\n\tlet best: string | undefined;\n\tlet bestDistance = Infinity;\n\tfor (const c of candidates) {\n\t\tconst distance = editDistance(w, c.toLowerCase());\n\t\tif (distance < bestDistance) {\n\t\t\tbest = c;\n\t\t\tbestDistance = distance;\n\t\t}\n\t}\n\treturn best !== undefined && bestDistance <= Math.max(1, Math.floor(word.length / 3)) ? best : undefined;\n}\n\n/** `\"sunn\" (did you mean \"sun\"?)`, or just `\"sunn\"`. */\nexport function namedWithSuggestion(word: string, candidates: Iterable<string>): string {\n\tconst s = suggestName(word, candidates);\n\treturn s !== undefined && s !== word ? `\"${word}\" (did you mean \"${s}\"?)` : `\"${word}\"`;\n}\n"],"mappings":"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","names":[]}
|