@anvpx/motion-scenes 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +39 -2
- package/dist/catalog.d.ts +17 -0
- package/dist/catalog.js +51 -0
- package/dist/custom.d.ts +86 -0
- package/dist/custom.js +176 -0
- package/dist/define-scene.d.ts +31 -0
- package/dist/define-scene.js +128 -0
- package/dist/html.d.ts +5 -0
- package/dist/html.js +14 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +11 -0
- package/dist/position.d.ts +21 -0
- package/dist/position.js +16 -0
- package/dist/registry.d.ts +4 -0
- package/dist/registry.js +68 -0
- package/dist/runtime/compose.d.ts +21 -0
- package/dist/runtime/compose.js +43 -0
- package/dist/runtime/easing.d.ts +14 -0
- package/dist/runtime/easing.js +45 -0
- package/dist/runtime/mount.d.ts +50 -0
- package/dist/runtime/mount.js +153 -0
- package/dist/runtime/timeline.d.ts +147 -0
- package/dist/runtime/timeline.js +199 -0
- package/dist/runtime-files.d.ts +4 -0
- package/dist/runtime-files.js +18 -0
- package/dist/scene-contract.d.ts +7 -0
- package/dist/scene-contract.js +104 -0
- package/dist/scene3d/post.d.ts +12 -0
- package/dist/scene3d/post.js +16 -0
- package/dist/scene3d/reflector.d.ts +9 -0
- package/dist/scene3d/reflector.js +17 -0
- package/dist/scene3d/textures.d.ts +9 -0
- package/dist/scene3d/textures.js +11 -0
- package/dist/scene3d/volumetric.d.ts +9 -0
- package/dist/scene3d/volumetric.js +16 -0
- package/dist/scenes/bug/index.d.ts +1 -0
- package/dist/scenes/bug/index.js +45 -0
- package/dist/scenes/bug/scene.d.ts +2 -0
- package/dist/scenes/bug/scene.js +6 -0
- package/dist/scenes/bug/style.css +30 -0
- package/dist/scenes/bullets/index.d.ts +1 -0
- package/dist/scenes/bullets/index.js +128 -0
- package/dist/scenes/bullets/scene.d.ts +2 -0
- package/dist/scenes/bullets/scene.js +6 -0
- package/dist/scenes/bullets/style.css +91 -0
- package/dist/scenes/callout/index.d.ts +9 -0
- package/dist/scenes/callout/index.js +95 -0
- package/dist/scenes/callout/scene.d.ts +2 -0
- package/dist/scenes/callout/scene.js +43 -0
- package/dist/scenes/callout/style.css +97 -0
- package/dist/scenes/caption/index.d.ts +1 -0
- package/dist/scenes/caption/index.js +72 -0
- package/dist/scenes/caption/scene.d.ts +11 -0
- package/dist/scenes/caption/scene.js +33 -0
- package/dist/scenes/caption/style.css +33 -0
- package/dist/scenes/chapter/index.d.ts +1 -0
- package/dist/scenes/chapter/index.js +29 -0
- package/dist/scenes/chapter/scene.d.ts +2 -0
- package/dist/scenes/chapter/scene.js +6 -0
- package/dist/scenes/chapter/style.css +25 -0
- package/dist/scenes/chart/index.d.ts +1 -0
- package/dist/scenes/chart/index.js +24 -0
- package/dist/scenes/chart/render.d.ts +4 -0
- package/dist/scenes/chart/render.js +257 -0
- package/dist/scenes/chart/scale.d.ts +11 -0
- package/dist/scenes/chart/scale.js +53 -0
- package/dist/scenes/chart/scene.d.ts +2 -0
- package/dist/scenes/chart/scene.js +73 -0
- package/dist/scenes/chart/schema.d.ts +36 -0
- package/dist/scenes/chart/schema.js +109 -0
- package/dist/scenes/chart/style.css +425 -0
- package/dist/scenes/code/index.d.ts +1 -0
- package/dist/scenes/code/index.js +109 -0
- package/dist/scenes/code/scene.d.ts +2 -0
- package/dist/scenes/code/scene.js +108 -0
- package/dist/scenes/code/style.css +155 -0
- package/dist/scenes/code/tokenize.d.ts +8 -0
- package/dist/scenes/code/tokenize.js +145 -0
- package/dist/scenes/compare/index.d.ts +1 -0
- package/dist/scenes/compare/index.js +128 -0
- package/dist/scenes/compare/scene.d.ts +2 -0
- package/dist/scenes/compare/scene.js +58 -0
- package/dist/scenes/compare/style.css +187 -0
- package/dist/scenes/countdown/index.d.ts +1 -0
- package/dist/scenes/countdown/index.js +46 -0
- package/dist/scenes/countdown/scene.d.ts +2 -0
- package/dist/scenes/countdown/scene.js +21 -0
- package/dist/scenes/countdown/style.css +32 -0
- package/dist/scenes/flow/index.d.ts +1 -0
- package/dist/scenes/flow/index.js +66 -0
- package/dist/scenes/flow/inspect.d.ts +26 -0
- package/dist/scenes/flow/inspect.js +25 -0
- package/dist/scenes/flow/layout.d.ts +83 -0
- package/dist/scenes/flow/layout.js +222 -0
- package/dist/scenes/flow/measure.d.ts +15 -0
- package/dist/scenes/flow/measure.js +33 -0
- package/dist/scenes/flow/plan.d.ts +42 -0
- package/dist/scenes/flow/plan.js +117 -0
- package/dist/scenes/flow/scene.d.ts +2 -0
- package/dist/scenes/flow/scene.js +6 -0
- package/dist/scenes/flow/schema.d.ts +49 -0
- package/dist/scenes/flow/schema.js +60 -0
- package/dist/scenes/flow/style.css +54 -0
- package/dist/scenes/hero/index.d.ts +3 -0
- package/dist/scenes/hero/index.js +77 -0
- package/dist/scenes/hero/scene.d.ts +2 -0
- package/dist/scenes/hero/scene.js +6 -0
- package/dist/scenes/hero/style.css +143 -0
- package/dist/scenes/icon-grid/index.d.ts +1 -0
- package/dist/scenes/icon-grid/index.js +69 -0
- package/dist/scenes/icon-grid/scene.d.ts +2 -0
- package/dist/scenes/icon-grid/scene.js +6 -0
- package/dist/scenes/icon-grid/style.css +74 -0
- package/dist/scenes/kinetic/index.d.ts +1 -0
- package/dist/scenes/kinetic/index.js +62 -0
- package/dist/scenes/kinetic/scene.d.ts +2 -0
- package/dist/scenes/kinetic/scene.js +98 -0
- package/dist/scenes/kinetic/style.css +94 -0
- package/dist/scenes/kpi-grid/index.d.ts +1 -0
- package/dist/scenes/kpi-grid/index.js +161 -0
- package/dist/scenes/kpi-grid/scene.d.ts +2 -0
- package/dist/scenes/kpi-grid/scene.js +6 -0
- package/dist/scenes/kpi-grid/style.css +141 -0
- package/dist/scenes/lower-third/index.d.ts +1 -0
- package/dist/scenes/lower-third/index.js +33 -0
- package/dist/scenes/lower-third/scene.d.ts +2 -0
- package/dist/scenes/lower-third/scene.js +6 -0
- package/dist/scenes/lower-third/style.css +45 -0
- package/dist/scenes/media-frame/index.d.ts +1 -0
- package/dist/scenes/media-frame/index.js +99 -0
- package/dist/scenes/media-frame/scene.d.ts +2 -0
- package/dist/scenes/media-frame/scene.js +85 -0
- package/dist/scenes/media-frame/style.css +275 -0
- package/dist/scenes/outro/index.d.ts +1 -0
- package/dist/scenes/outro/index.js +54 -0
- package/dist/scenes/outro/scene.d.ts +2 -0
- package/dist/scenes/outro/scene.js +6 -0
- package/dist/scenes/outro/style.css +92 -0
- package/dist/scenes/poster/index.d.ts +3 -0
- package/dist/scenes/poster/index.js +62 -0
- package/dist/scenes/poster/scene.d.ts +2 -0
- package/dist/scenes/poster/scene.js +6 -0
- package/dist/scenes/poster/style.css +102 -0
- package/dist/scenes/progress/index.d.ts +1 -0
- package/dist/scenes/progress/index.js +40 -0
- package/dist/scenes/progress/scene.d.ts +2 -0
- package/dist/scenes/progress/scene.js +17 -0
- package/dist/scenes/progress/style.css +31 -0
- package/dist/scenes/quote/index.d.ts +3 -0
- package/dist/scenes/quote/index.js +69 -0
- package/dist/scenes/quote/scene.d.ts +2 -0
- package/dist/scenes/quote/scene.js +6 -0
- package/dist/scenes/quote/style.css +86 -0
- package/dist/scenes/scene3d/index.d.ts +1 -0
- package/dist/scenes/scene3d/index.js +59 -0
- package/dist/scenes/scene3d/scene.d.ts +2 -0
- package/dist/scenes/scene3d/scene.js +436 -0
- package/dist/scenes/scene3d/style.css +43 -0
- package/dist/scenes/stat/index.d.ts +4 -0
- package/dist/scenes/stat/index.js +72 -0
- package/dist/scenes/stat/scene.d.ts +2 -0
- package/dist/scenes/stat/scene.js +6 -0
- package/dist/scenes/stat/style.css +95 -0
- package/dist/scenes/steps/index.d.ts +1 -0
- package/dist/scenes/steps/index.js +147 -0
- package/dist/scenes/steps/scene.d.ts +2 -0
- package/dist/scenes/steps/scene.js +6 -0
- package/dist/scenes/steps/style.css +190 -0
- package/dist/scenes/sticker/index.d.ts +1 -0
- package/dist/scenes/sticker/index.js +48 -0
- package/dist/scenes/sticker/scene.d.ts +2 -0
- package/dist/scenes/sticker/scene.js +57 -0
- package/dist/scenes/sticker/style.css +88 -0
- package/dist/scenes/table/index.d.ts +1 -0
- package/dist/scenes/table/index.js +131 -0
- package/dist/scenes/table/scene.d.ts +2 -0
- package/dist/scenes/table/scene.js +6 -0
- package/dist/scenes/table/style.css +102 -0
- package/dist/scenes/timeline/index.d.ts +1 -0
- package/dist/scenes/timeline/index.js +68 -0
- package/dist/scenes/timeline/scene.d.ts +2 -0
- package/dist/scenes/timeline/scene.js +6 -0
- package/dist/scenes/timeline/style.css +161 -0
- package/dist/scenes/title/index.d.ts +1 -0
- package/dist/scenes/title/index.js +52 -0
- package/dist/scenes/title/scene.d.ts +2 -0
- package/dist/scenes/title/scene.js +6 -0
- package/dist/scenes/title/style.css +80 -0
- package/dist/scenes/waveform/index.d.ts +1 -0
- package/dist/scenes/waveform/index.js +39 -0
- package/dist/scenes/waveform/scene.d.ts +2 -0
- package/dist/scenes/waveform/scene.js +35 -0
- package/dist/scenes/waveform/style.css +44 -0
- package/dist/shared/fit-text.d.ts +24 -0
- package/dist/shared/fit-text.js +82 -0
- package/dist/shared/format.d.ts +24 -0
- package/dist/shared/format.js +59 -0
- package/dist/shared/frame.d.ts +14 -0
- package/dist/shared/frame.js +21 -0
- package/dist/shared/icon-search.d.ts +9 -0
- package/dist/shared/icon-search.js +26 -0
- package/dist/shared/icon.d.ts +15 -0
- package/dist/shared/icon.js +28 -0
- package/dist/shared/index.d.ts +11 -0
- package/dist/shared/index.js +7 -0
- package/dist/shared/markup.d.ts +12 -0
- package/dist/shared/markup.js +43 -0
- package/dist/shared/measure.d.ts +7 -0
- package/dist/shared/measure.js +34 -0
- package/dist/shared/motion.d.ts +94 -0
- package/dist/shared/motion.js +117 -0
- package/dist/source-hash.d.ts +4 -0
- package/dist/source-hash.js +26 -0
- package/dist/test-fixtures.d.ts +9 -0
- package/dist/test-fixtures.js +22 -0
- package/dist/text-file.d.ts +1 -0
- package/dist/text-file.js +3 -0
- package/dist/words.d.ts +11 -0
- package/dist/words.js +93 -0
- package/package.json +36 -3
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { toJsonPointer } from "@anvpx/motion-schema";
|
|
2
|
+
import { resolveTheme } from "@anvpx/motion-themes";
|
|
3
|
+
export const emitContext = (overrides = {}) => ({
|
|
4
|
+
theme: resolveTheme("default"),
|
|
5
|
+
fps: 30,
|
|
6
|
+
width: 1920,
|
|
7
|
+
height: 1080,
|
|
8
|
+
duration: 6,
|
|
9
|
+
assetResolver: (ref) => ref,
|
|
10
|
+
...overrides,
|
|
11
|
+
});
|
|
12
|
+
export const entryOf = (type, props, extra = {}) => ({ id: `${type}-1`, type, props, ...extra });
|
|
13
|
+
/** Issues as `<json-pointer>: <message>` lines. */
|
|
14
|
+
export const issuesOf = (schema, value) => {
|
|
15
|
+
const result = schema.safeParse(value);
|
|
16
|
+
return result.success
|
|
17
|
+
? []
|
|
18
|
+
: result.error.issues.map((issue) => `${toJsonPointer(issue.path)}: ${issue.message}`);
|
|
19
|
+
};
|
|
20
|
+
export const words = (count) => Array.from({ length: count }, (_, i) => `w${i}`).join(" ");
|
|
21
|
+
/** Markup and quotes that must never reach the fragment unescaped. */
|
|
22
|
+
export const HOSTILE = '<script>alert("x")</script>';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const readText: (relative: string, base: string) => string;
|
package/dist/words.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const MAX_SCENE_WORDS = 40;
|
|
3
|
+
type Props = Record<string, unknown>;
|
|
4
|
+
/** On-screen words of a scene's props (used for reading time and auto duration). */
|
|
5
|
+
export declare const sceneWords: (props: Props, type?: string) => number;
|
|
6
|
+
/** Text fields that count towards the per-scene word budget. */
|
|
7
|
+
export declare const present: (...texts: readonly (string | number | undefined)[]) => string[];
|
|
8
|
+
/** Adds the "<= 40 words per scene" rule (PLAN 5b) to a scene schema. */
|
|
9
|
+
export declare const limitWords: <S extends z.ZodType>(schema: S, textsOf: (value: z.output<S>) => readonly string[]) => S;
|
|
10
|
+
export declare const text: z.ZodString;
|
|
11
|
+
export {};
|
package/dist/words.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CUSTOM_SCENE_TYPE } from "./custom.js";
|
|
3
|
+
export const MAX_SCENE_WORDS = 40;
|
|
4
|
+
const wordsIn = (text) => text.split(/\s+/).filter(Boolean).length;
|
|
5
|
+
const countWords = (texts) => wordsIn(texts.join(" "));
|
|
6
|
+
/** Keys whose values are structure, not on-screen text. */
|
|
7
|
+
const STRUCTURAL_KEYS = new Set([
|
|
8
|
+
"id",
|
|
9
|
+
"from",
|
|
10
|
+
"to",
|
|
11
|
+
"direction",
|
|
12
|
+
// layout and style options (enums and counts), never read by the viewer
|
|
13
|
+
"cols",
|
|
14
|
+
"layout",
|
|
15
|
+
"mode",
|
|
16
|
+
"active",
|
|
17
|
+
"marker",
|
|
18
|
+
"winner",
|
|
19
|
+
"align",
|
|
20
|
+
"scope",
|
|
21
|
+
"color",
|
|
22
|
+
"orient",
|
|
23
|
+
"state",
|
|
24
|
+
"trend",
|
|
25
|
+
"good",
|
|
26
|
+
"lang",
|
|
27
|
+
"reveal",
|
|
28
|
+
"opacity",
|
|
29
|
+
"device",
|
|
30
|
+
"motion",
|
|
31
|
+
"rank",
|
|
32
|
+
"highlight",
|
|
33
|
+
"rating",
|
|
34
|
+
"kind",
|
|
35
|
+
"x",
|
|
36
|
+
"y",
|
|
37
|
+
]);
|
|
38
|
+
const countValue = (value) => {
|
|
39
|
+
if (typeof value === "string")
|
|
40
|
+
return wordsIn(value);
|
|
41
|
+
if (typeof value === "number")
|
|
42
|
+
return 1;
|
|
43
|
+
if (Array.isArray(value))
|
|
44
|
+
return value.reduce((sum, item) => sum + countValue(item), 0);
|
|
45
|
+
if (typeof value === "object" && value !== null)
|
|
46
|
+
return countRecord(value);
|
|
47
|
+
return 0;
|
|
48
|
+
};
|
|
49
|
+
const countRecord = (record) => Object.entries(record)
|
|
50
|
+
.filter(([key]) => !STRUCTURAL_KEYS.has(key))
|
|
51
|
+
.reduce((sum, [, value]) => sum + countValue(value), 0);
|
|
52
|
+
const strings = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
|
|
53
|
+
const field = (value, key) => typeof value === "object" && value !== null ? value[key] : undefined;
|
|
54
|
+
const fieldStrings = (list, key) => (Array.isArray(list) ? list : []).flatMap((item) => strings([field(item, key)]));
|
|
55
|
+
const NUMERIC_CELL = /^[^\p{L}\d]{0,2}\d[\d,.]*\s?(?:%|[KMBkmbx])?$/u;
|
|
56
|
+
/** Data points are looked at, not read: only titles, labels and captions count. */
|
|
57
|
+
const READ_TEXTS = {
|
|
58
|
+
chart: (p) => [
|
|
59
|
+
...strings([p.title, p.unit, p.caption]),
|
|
60
|
+
...fieldStrings(p.data, "label"),
|
|
61
|
+
...strings(p.x),
|
|
62
|
+
...fieldStrings(p.series, "name"),
|
|
63
|
+
],
|
|
64
|
+
table: (p) => [
|
|
65
|
+
...strings([p.title]),
|
|
66
|
+
...strings(p.columns),
|
|
67
|
+
...(Array.isArray(p.rows) ? p.rows : []).flatMap((row) => strings([Array.isArray(row) ? row[0] : undefined]).filter((cell) => !NUMERIC_CELL.test(cell))),
|
|
68
|
+
],
|
|
69
|
+
"kpi-grid": (p) => [...strings([p.title]), ...fieldStrings(p.items, "label")],
|
|
70
|
+
waveform: (p) => strings([p.label]),
|
|
71
|
+
};
|
|
72
|
+
/** Code is skimmed: about 1.5 words per line, whatever the tokens. */
|
|
73
|
+
const CODE_WORDS_PER_LINE = 1.5;
|
|
74
|
+
/** On-screen words of a scene's props (used for reading time and auto duration). */
|
|
75
|
+
export const sceneWords = (props, type) => {
|
|
76
|
+
// An authored scene's props carry a directory, not copy: its text is unknowable here.
|
|
77
|
+
if (type === CUSTOM_SCENE_TYPE)
|
|
78
|
+
return 0;
|
|
79
|
+
if (type === "code")
|
|
80
|
+
return Math.ceil(strings(props.lines).length * CODE_WORDS_PER_LINE);
|
|
81
|
+
const texts = type === undefined ? undefined : READ_TEXTS[type];
|
|
82
|
+
return texts ? countWords(texts(props)) : countRecord(props);
|
|
83
|
+
};
|
|
84
|
+
/** Text fields that count towards the per-scene word budget. */
|
|
85
|
+
export const present = (...texts) => texts.filter((text) => text !== undefined).map(String);
|
|
86
|
+
/** Adds the "<= 40 words per scene" rule (PLAN 5b) to a scene schema. */
|
|
87
|
+
export const limitWords = (schema, textsOf) => schema.superRefine((value, ctx) => {
|
|
88
|
+
const count = countWords(textsOf(value));
|
|
89
|
+
if (count > MAX_SCENE_WORDS) {
|
|
90
|
+
ctx.addIssue({ code: "custom", message: `scene has ${count} words; max ${MAX_SCENE_WORDS}` });
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
export const text = z.string().min(1, "must not be empty");
|
package/package.json
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvpx/motion-scenes",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Scene registry and browser renderer for @anvpx/motion storyboards.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "anvpx",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=22"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"motion-kit",
|
|
13
|
+
"scenes",
|
|
14
|
+
"animation",
|
|
15
|
+
"hyperframes",
|
|
16
|
+
"video"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": "./dist/index.js",
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist/**/*.js",
|
|
27
|
+
"dist/**/*.d.ts",
|
|
28
|
+
"dist/**/*.css"
|
|
29
|
+
],
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@anvpx/motion-assets": "0.1.1",
|
|
32
|
+
"@anvpx/motion-schema": "0.1.1",
|
|
33
|
+
"@anvpx/motion-themes": "0.1.1",
|
|
34
|
+
"postprocessing": "6.39.5",
|
|
35
|
+
"three": "0.186.0",
|
|
36
|
+
"zod": "4.6.7"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {}
|
|
6
39
|
}
|