@syncedco/motion 0.1.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/CHANGELOG.md +106 -0
- package/CODE_OF_CONDUCT.md +26 -0
- package/CONTRIBUTING.md +100 -0
- package/LICENSE +22 -0
- package/README.md +278 -0
- package/SECURITY.md +36 -0
- package/SUPPORT.md +38 -0
- package/TRADEMARKS.md +14 -0
- package/bin/synced-motion.mjs +5 -0
- package/dist/astro.d.ts +15 -0
- package/dist/astro.js +51 -0
- package/dist/astro.js.map +1 -0
- package/dist/chunk-24KKECMK.js +281 -0
- package/dist/chunk-24KKECMK.js.map +1 -0
- package/dist/chunk-3WUVBPYX.js +162 -0
- package/dist/chunk-3WUVBPYX.js.map +1 -0
- package/dist/chunk-HCWQV65E.js +20 -0
- package/dist/chunk-HCWQV65E.js.map +1 -0
- package/dist/chunk-JET2MYEG.js +2287 -0
- package/dist/chunk-JET2MYEG.js.map +1 -0
- package/dist/chunk-KA3OPI4F.js +40 -0
- package/dist/chunk-KA3OPI4F.js.map +1 -0
- package/dist/chunk-ML7HTCZT.js +642 -0
- package/dist/chunk-ML7HTCZT.js.map +1 -0
- package/dist/chunk-NIXAEIHN.js +23 -0
- package/dist/chunk-NIXAEIHN.js.map +1 -0
- package/dist/chunk-VOIQPPQZ.js +299 -0
- package/dist/chunk-VOIQPPQZ.js.map +1 -0
- package/dist/chunk-WCG7TQSH.js +31 -0
- package/dist/chunk-WCG7TQSH.js.map +1 -0
- package/dist/cli.js +382 -0
- package/dist/cli.js.map +1 -0
- package/dist/full.d.ts +13 -0
- package/dist/full.js +201 -0
- package/dist/full.js.map +1 -0
- package/dist/index.d.ts +249 -0
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -0
- package/dist/lenis.d.ts +19 -0
- package/dist/lenis.js +7 -0
- package/dist/lenis.js.map +1 -0
- package/dist/mcp.d.ts +16 -0
- package/dist/mcp.js +82 -0
- package/dist/mcp.js.map +1 -0
- package/dist/plugins.d.ts +14 -0
- package/dist/plugins.js +17 -0
- package/dist/plugins.js.map +1 -0
- package/dist/react.d.ts +7 -0
- package/dist/react.js +32 -0
- package/dist/react.js.map +1 -0
- package/dist/recipes.d.ts +76 -0
- package/dist/recipes.js +129 -0
- package/dist/recipes.js.map +1 -0
- package/dist/styles.css +57 -0
- package/dist/styles.css.map +1 -0
- package/dist/svelte.d.ts +10 -0
- package/dist/svelte.js +30 -0
- package/dist/svelte.js.map +1 -0
- package/dist/vue.d.ts +13 -0
- package/dist/vue.js +35 -0
- package/dist/vue.js.map +1 -0
- package/dist/wordpress.d.ts +15 -0
- package/dist/wordpress.js +49 -0
- package/dist/wordpress.js.map +1 -0
- package/docs/API.md +176 -0
- package/docs/ATTRIBUTE-API.md +358 -0
- package/docs/CAPABILITIES.md +82 -0
- package/docs/INTEGRATIONS.md +92 -0
- package/docs/PERFORMANCE.md +150 -0
- package/docs/README.md +35 -0
- package/docs/RECIPE-REFERENCE.md +1358 -0
- package/docs/RECIPES.md +115 -0
- package/docs/TOOLING.md +65 -0
- package/docs/WEBFLOW-MIGRATION.md +39 -0
- package/package.json +167 -0
package/dist/astro.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createMotionController,
|
|
3
|
+
resolveMotionRoot
|
|
4
|
+
} from "./chunk-KA3OPI4F.js";
|
|
5
|
+
import "./chunk-VOIQPPQZ.js";
|
|
6
|
+
import "./chunk-24KKECMK.js";
|
|
7
|
+
import "./chunk-JET2MYEG.js";
|
|
8
|
+
|
|
9
|
+
// src/adapters/astro.js
|
|
10
|
+
function createAstroMotion(options = {}) {
|
|
11
|
+
const ownerDocument = options.document ?? globalThis.document;
|
|
12
|
+
if (!ownerDocument) return { runtime: void 0, mount() {
|
|
13
|
+
}, refresh() {
|
|
14
|
+
}, destroy() {
|
|
15
|
+
} };
|
|
16
|
+
const controller = createMotionController();
|
|
17
|
+
let destroyed = false;
|
|
18
|
+
const resolveRoot = () => {
|
|
19
|
+
const requested = typeof options.root === "function" ? options.root() : options.root;
|
|
20
|
+
if (typeof requested === "string") return ownerDocument.querySelector(requested);
|
|
21
|
+
return resolveMotionRoot(requested) ?? ownerDocument;
|
|
22
|
+
};
|
|
23
|
+
const mount = () => {
|
|
24
|
+
if (destroyed) return void 0;
|
|
25
|
+
const { document: _document, root: _root, ...runtimeOptions } = options;
|
|
26
|
+
return controller.mount(resolveRoot(), runtimeOptions);
|
|
27
|
+
};
|
|
28
|
+
const beforeSwap = () => controller.destroy();
|
|
29
|
+
ownerDocument.addEventListener("astro:before-swap", beforeSwap);
|
|
30
|
+
ownerDocument.addEventListener("astro:page-load", mount);
|
|
31
|
+
if (ownerDocument.readyState === "loading") ownerDocument.addEventListener("DOMContentLoaded", mount, { once: true });
|
|
32
|
+
else mount();
|
|
33
|
+
return {
|
|
34
|
+
get runtime() {
|
|
35
|
+
return controller.runtime;
|
|
36
|
+
},
|
|
37
|
+
mount,
|
|
38
|
+
refresh: () => controller.refresh(),
|
|
39
|
+
destroy() {
|
|
40
|
+
destroyed = true;
|
|
41
|
+
ownerDocument.removeEventListener("DOMContentLoaded", mount);
|
|
42
|
+
ownerDocument.removeEventListener("astro:before-swap", beforeSwap);
|
|
43
|
+
ownerDocument.removeEventListener("astro:page-load", mount);
|
|
44
|
+
controller.destroy();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
createAstroMotion
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=astro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/astro.js"],"mappings":";;;;;;;;;AAEO,SAAS,kBAAkB,UAAU,CAAC,GAAG;AAC9C,QAAM,gBAAgB,QAAQ,YAAY,WAAW;AACrD,MAAI,CAAC,cAAe,QAAO,EAAE,SAAS,QAAW,QAAQ;AAAA,EAAC,GAAG,UAAU;AAAA,EAAC,GAAG,UAAU;AAAA,EAAC,EAAE;AACxF,QAAM,aAAa,uBAAuB;AAC1C,MAAI,YAAY;AAEhB,QAAM,cAAc,MAAM;AACxB,UAAM,YAAY,OAAO,QAAQ,SAAS,aAAa,QAAQ,KAAK,IAAI,QAAQ;AAChF,QAAI,OAAO,cAAc,SAAU,QAAO,cAAc,cAAc,SAAS;AAC/E,WAAO,kBAAkB,SAAS,KAAK;AAAA,EACzC;AACA,QAAM,QAAQ,MAAM;AAClB,QAAI,UAAW,QAAO;AACtB,UAAM,EAAE,UAAU,WAAW,MAAM,OAAO,GAAG,eAAe,IAAI;AAChE,WAAO,WAAW,MAAM,YAAY,GAAG,cAAc;AAAA,EACvD;AACA,QAAM,aAAa,MAAM,WAAW,QAAQ;AAC5C,gBAAc,iBAAiB,qBAAqB,UAAU;AAC9D,gBAAc,iBAAiB,mBAAmB,KAAK;AACvD,MAAI,cAAc,eAAe,UAAW,eAAc,iBAAiB,oBAAoB,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,MAC/G,OAAM;AAEX,SAAO;AAAA,IACL,IAAI,UAAU;AAAE,aAAO,WAAW;AAAA,IAAQ;AAAA,IAC1C;AAAA,IACA,SAAS,MAAM,WAAW,QAAQ;AAAA,IAClC,UAAU;AACR,kBAAY;AACZ,oBAAc,oBAAoB,oBAAoB,KAAK;AAC3D,oBAAc,oBAAoB,qBAAqB,UAAU;AACjE,oBAAc,oBAAoB,mBAAmB,KAAK;AAC1D,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
// src/recipes/schema.js
|
|
2
|
+
var MOTION_RECIPE_SCHEMA_VERSION = "1";
|
|
3
|
+
var MOTION_TRIGGER_TYPES = Object.freeze([
|
|
4
|
+
"load",
|
|
5
|
+
"viewport",
|
|
6
|
+
"scroll",
|
|
7
|
+
"hover",
|
|
8
|
+
"focus",
|
|
9
|
+
"pointer",
|
|
10
|
+
"click",
|
|
11
|
+
"route",
|
|
12
|
+
"state"
|
|
13
|
+
]);
|
|
14
|
+
var PERFORMANCE_CLASSES = /* @__PURE__ */ new Set(["low", "medium", "high"]);
|
|
15
|
+
var PARAMETER_TYPES = /* @__PURE__ */ new Set(["boolean", "number", "string", "enum"]);
|
|
16
|
+
var STEP_ACTIONS = /* @__PURE__ */ new Set(["set", "to", "from", "fromTo"]);
|
|
17
|
+
var PREVIEW_VIEWPORTS = /* @__PURE__ */ new Set(["compact", "standard", "wide", "scroll"]);
|
|
18
|
+
var PREVIEW_ACTIVATIONS = /* @__PURE__ */ new Set(["auto", "manual"]);
|
|
19
|
+
var MotionRecipeValidationError = class extends TypeError {
|
|
20
|
+
constructor(issues, recipeId = "unknown") {
|
|
21
|
+
super(`Invalid motion recipe "${recipeId}": ${issues.join("; ")}`);
|
|
22
|
+
this.name = "MotionRecipeValidationError";
|
|
23
|
+
this.issues = issues;
|
|
24
|
+
this.recipeId = recipeId;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
function isRecord(value) {
|
|
28
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
function cloneValue(value) {
|
|
31
|
+
if (Array.isArray(value)) return value.map(cloneValue);
|
|
32
|
+
if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, cloneValue(entry)]));
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function deepFreeze(value) {
|
|
36
|
+
if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
|
|
37
|
+
Object.freeze(value);
|
|
38
|
+
for (const entry of Object.values(value)) deepFreeze(entry);
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function validateSlots(slots, issues) {
|
|
42
|
+
if (!Array.isArray(slots)) {
|
|
43
|
+
issues.push("slots must be an array");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const names = /* @__PURE__ */ new Set();
|
|
47
|
+
for (const slot of slots) {
|
|
48
|
+
if (!isRecord(slot) || typeof slot.name !== "string" || !slot.name.trim()) {
|
|
49
|
+
issues.push("every slot requires a non-empty name");
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (names.has(slot.name)) issues.push(`slot name "${slot.name}" is duplicated`);
|
|
53
|
+
names.add(slot.name);
|
|
54
|
+
if (slot.name !== "root" && typeof slot.selector !== "string") {
|
|
55
|
+
issues.push(`slot "${slot.name}" requires a selector`);
|
|
56
|
+
}
|
|
57
|
+
if (typeof slot.selector === "string" && /(^|,)\s*(html|body|:root)\b/.test(slot.selector)) {
|
|
58
|
+
issues.push(`slot "${slot.name}" may not target outside its recipe root`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function validateParameters(parameters, issues) {
|
|
63
|
+
if (!isRecord(parameters)) {
|
|
64
|
+
issues.push("parameters must be an object");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const [name, parameter] of Object.entries(parameters)) {
|
|
68
|
+
if (!isRecord(parameter) || !PARAMETER_TYPES.has(parameter.type)) {
|
|
69
|
+
issues.push(`parameter "${name}" requires a supported type`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (parameter.default === void 0) issues.push(`parameter "${name}" requires a default`);
|
|
73
|
+
if (parameter.type === "number") {
|
|
74
|
+
if (!Number.isFinite(parameter.min) || !Number.isFinite(parameter.max)) {
|
|
75
|
+
issues.push(`number parameter "${name}" requires finite min and max values`);
|
|
76
|
+
} else if (parameter.min > parameter.max) {
|
|
77
|
+
issues.push(`number parameter "${name}" has min greater than max`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (parameter.type === "enum" && (!Array.isArray(parameter.values) || !parameter.values.length)) {
|
|
81
|
+
issues.push(`enum parameter "${name}" requires values`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function validateTimeline(timeline, issues) {
|
|
86
|
+
if (timeline === void 0) return;
|
|
87
|
+
if (!isRecord(timeline) || !Array.isArray(timeline.steps)) {
|
|
88
|
+
issues.push("timeline requires a steps array");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
for (const [index, step] of timeline.steps.entries()) {
|
|
92
|
+
if (!isRecord(step) || !STEP_ACTIONS.has(step.action)) {
|
|
93
|
+
issues.push(`timeline step ${index} requires a supported action`);
|
|
94
|
+
}
|
|
95
|
+
if (typeof step?.target !== "string") issues.push(`timeline step ${index} requires a target slot`);
|
|
96
|
+
if (step?.action === "fromTo" && (!isRecord(step.from) || !isRecord(step.to))) {
|
|
97
|
+
issues.push(`timeline step ${index} fromTo requires from and to values`);
|
|
98
|
+
} else if (step?.action !== "fromTo" && !isRecord(step?.vars)) {
|
|
99
|
+
issues.push(`timeline step ${index} requires vars`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function validParameterValue(parameter, value) {
|
|
104
|
+
if (parameter.type === "boolean") return typeof value === "boolean";
|
|
105
|
+
if (parameter.type === "string") return typeof value === "string";
|
|
106
|
+
if (parameter.type === "enum") return parameter.values.includes(value);
|
|
107
|
+
return Number.isFinite(value) && value >= parameter.min && value <= parameter.max;
|
|
108
|
+
}
|
|
109
|
+
function validateFixtures(recipe, issues) {
|
|
110
|
+
if (!isRecord(recipe.preview) || typeof recipe.preview.fixture !== "string" || !recipe.preview.fixture.trim()) {
|
|
111
|
+
issues.push("preview.fixture must reference a fixture id");
|
|
112
|
+
}
|
|
113
|
+
if (recipe.preview?.viewport !== void 0 && !PREVIEW_VIEWPORTS.has(recipe.preview.viewport)) {
|
|
114
|
+
issues.push("preview.viewport must be compact, standard, wide, or scroll");
|
|
115
|
+
}
|
|
116
|
+
if (recipe.preview?.activation !== void 0 && !PREVIEW_ACTIVATIONS.has(recipe.preview.activation)) {
|
|
117
|
+
issues.push("preview.activation must be auto or manual");
|
|
118
|
+
}
|
|
119
|
+
if (!Array.isArray(recipe.fixtures) || !recipe.fixtures.length) {
|
|
120
|
+
issues.push("fixtures must contain at least one fixture");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const ids = /* @__PURE__ */ new Set();
|
|
124
|
+
for (const fixture of recipe.fixtures) {
|
|
125
|
+
if (!isRecord(fixture)) {
|
|
126
|
+
issues.push("every fixture must be an object");
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (typeof fixture.id !== "string" || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(fixture.id)) {
|
|
130
|
+
issues.push("every fixture id must use lowercase kebab-case");
|
|
131
|
+
} else if (ids.has(fixture.id)) issues.push(`fixture id "${fixture.id}" is duplicated`);
|
|
132
|
+
else ids.add(fixture.id);
|
|
133
|
+
if (typeof fixture.label !== "string" || !fixture.label.trim()) issues.push(`fixture "${fixture.id ?? "unknown"}" requires a label`);
|
|
134
|
+
if (typeof fixture.markup !== "string" || !fixture.markup.trim()) issues.push(`fixture "${fixture.id ?? "unknown"}" requires markup`);
|
|
135
|
+
if (fixture.parameters !== void 0 && !isRecord(fixture.parameters)) {
|
|
136
|
+
issues.push(`fixture "${fixture.id ?? "unknown"}" parameters must be an object`);
|
|
137
|
+
} else {
|
|
138
|
+
for (const [name, value] of Object.entries(fixture.parameters ?? {})) {
|
|
139
|
+
const parameter = recipe.parameters?.[name];
|
|
140
|
+
if (!parameter) issues.push(`fixture "${fixture.id}" uses unknown parameter "${name}"`);
|
|
141
|
+
else if (!validParameterValue(parameter, value)) issues.push(`fixture "${fixture.id}" has invalid value for parameter "${name}"`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (typeof recipe.preview?.fixture === "string" && !ids.has(recipe.preview.fixture)) {
|
|
146
|
+
issues.push(`preview.fixture "${recipe.preview.fixture}" does not exist`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function validateMotionRecipe(recipe, options = {}) {
|
|
150
|
+
const mode = options.mode ?? "complete";
|
|
151
|
+
if (mode !== "complete" && mode !== "runtime") throw new TypeError(`Unknown motion recipe validation mode "${mode}".`);
|
|
152
|
+
const complete = mode === "complete";
|
|
153
|
+
const issues = [];
|
|
154
|
+
if (!isRecord(recipe)) return { ok: false, issues: ["recipe must be an object"] };
|
|
155
|
+
if (recipe.schemaVersion !== MOTION_RECIPE_SCHEMA_VERSION) issues.push(`schemaVersion must be "${MOTION_RECIPE_SCHEMA_VERSION}"`);
|
|
156
|
+
const requiredStrings = complete ? ["id", "version", "title", "description", "intent", "family"] : ["id", "version"];
|
|
157
|
+
for (const field of requiredStrings) {
|
|
158
|
+
if (typeof recipe[field] !== "string" || !recipe[field].trim()) issues.push(`${field} must be a non-empty string`);
|
|
159
|
+
}
|
|
160
|
+
if (typeof recipe.id === "string" && !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(recipe.id)) {
|
|
161
|
+
issues.push("id must use lowercase kebab-case");
|
|
162
|
+
}
|
|
163
|
+
if (complete && !Array.isArray(recipe.tags)) issues.push("tags must be an array");
|
|
164
|
+
if (!isRecord(recipe.root) || typeof recipe.root.selector !== "string" || !recipe.root.selector.trim()) {
|
|
165
|
+
issues.push("root.selector must be a non-empty string");
|
|
166
|
+
} else if (/(^|,)\s*(html|body|:root)\b/.test(recipe.root.selector)) {
|
|
167
|
+
issues.push("root.selector may not target html, body, or :root");
|
|
168
|
+
}
|
|
169
|
+
validateSlots(recipe.slots, issues);
|
|
170
|
+
validateParameters(recipe.parameters, issues);
|
|
171
|
+
if (!Array.isArray(recipe.triggers) || !recipe.triggers.length) {
|
|
172
|
+
issues.push("triggers must contain at least one trigger");
|
|
173
|
+
} else {
|
|
174
|
+
for (const trigger of recipe.triggers) {
|
|
175
|
+
if (!isRecord(trigger) || !MOTION_TRIGGER_TYPES.includes(trigger.type)) {
|
|
176
|
+
issues.push("every trigger requires a supported type");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!isRecord(recipe.reducedMotion) || !["skip", "final", "custom"].includes(recipe.reducedMotion.strategy)) {
|
|
181
|
+
issues.push("reducedMotion.strategy must be skip, final, or custom");
|
|
182
|
+
}
|
|
183
|
+
if (complete && (!isRecord(recipe.noJs) || typeof recipe.noJs.behavior !== "string")) {
|
|
184
|
+
issues.push("noJs.behavior is required");
|
|
185
|
+
}
|
|
186
|
+
if (complete && (!isRecord(recipe.accessibility) || typeof recipe.accessibility.notes !== "string")) {
|
|
187
|
+
issues.push("accessibility.notes is required");
|
|
188
|
+
}
|
|
189
|
+
if (!isRecord(recipe.performance) || !PERFORMANCE_CLASSES.has(recipe.performance.class)) {
|
|
190
|
+
issues.push("performance.class must be low, medium, or high");
|
|
191
|
+
}
|
|
192
|
+
if (!Array.isArray(recipe.dependencies)) issues.push("dependencies must be an array");
|
|
193
|
+
if (complete) validateFixtures(recipe, issues);
|
|
194
|
+
if (typeof recipe.setup !== "function" && recipe.timeline === void 0) {
|
|
195
|
+
issues.push("recipe requires setup(context) or a declarative timeline");
|
|
196
|
+
}
|
|
197
|
+
if (typeof recipe.setup !== "function" && recipe.reducedMotion?.strategy === "custom" && !recipe.reducedMotion?.timeline) {
|
|
198
|
+
issues.push("declarative custom reduced motion requires reducedMotion.timeline");
|
|
199
|
+
}
|
|
200
|
+
validateTimeline(recipe.timeline, issues);
|
|
201
|
+
if (recipe.reducedMotion?.timeline) validateTimeline(recipe.reducedMotion.timeline, issues);
|
|
202
|
+
return { ok: issues.length === 0, issues };
|
|
203
|
+
}
|
|
204
|
+
function defineMotionRecipe(recipe, options = {}) {
|
|
205
|
+
const result = validateMotionRecipe(recipe, options);
|
|
206
|
+
if (!result.ok) throw new MotionRecipeValidationError(result.issues, recipe?.id);
|
|
207
|
+
const cloned = cloneValue(recipe);
|
|
208
|
+
cloned.slots = cloned.slots.map((slot) => ({ required: true, multiple: false, ...slot }));
|
|
209
|
+
return deepFreeze(cloned);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// src/recipes/registry.js
|
|
213
|
+
function publicRecipe(recipe) {
|
|
214
|
+
const { setup, ...manifest } = recipe;
|
|
215
|
+
return {
|
|
216
|
+
...manifest,
|
|
217
|
+
implementation: typeof setup === "function" ? "custom" : "declarative"
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function createMotionRegistry(initialRecipes = [], options = {}) {
|
|
221
|
+
const mode = options.mode ?? "complete";
|
|
222
|
+
const recipes = /* @__PURE__ */ new Map();
|
|
223
|
+
const register = (input) => {
|
|
224
|
+
const recipe = defineMotionRecipe(input, { mode });
|
|
225
|
+
if (recipes.has(recipe.id)) throw new Error(`Motion recipe "${recipe.id}" is already registered.`);
|
|
226
|
+
recipes.set(recipe.id, recipe);
|
|
227
|
+
return recipe;
|
|
228
|
+
};
|
|
229
|
+
initialRecipes.forEach(register);
|
|
230
|
+
return Object.freeze({
|
|
231
|
+
register,
|
|
232
|
+
has(id) {
|
|
233
|
+
return recipes.has(id);
|
|
234
|
+
},
|
|
235
|
+
get(id) {
|
|
236
|
+
return recipes.get(id);
|
|
237
|
+
},
|
|
238
|
+
list() {
|
|
239
|
+
return [...recipes.values()];
|
|
240
|
+
},
|
|
241
|
+
resolve(ids) {
|
|
242
|
+
const requested = ids ?? [...recipes.keys()];
|
|
243
|
+
return requested.map((id) => {
|
|
244
|
+
const recipe = recipes.get(id);
|
|
245
|
+
if (!recipe) throw new Error(`Unknown motion recipe "${id}".`);
|
|
246
|
+
return recipe;
|
|
247
|
+
});
|
|
248
|
+
},
|
|
249
|
+
mode,
|
|
250
|
+
catalog() {
|
|
251
|
+
return {
|
|
252
|
+
schemaVersion: "1",
|
|
253
|
+
count: recipes.size,
|
|
254
|
+
recipes: [...recipes.values()].map(publicRecipe)
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
validate() {
|
|
258
|
+
const issues = [];
|
|
259
|
+
for (const recipe of recipes.values()) {
|
|
260
|
+
const result = validateMotionRecipe(recipe, { mode });
|
|
261
|
+
if (!result.ok) issues.push({ id: recipe.id, issues: result.issues });
|
|
262
|
+
}
|
|
263
|
+
return { ok: issues.length === 0, issues };
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
function resolveMotionRecipes(registry, ids) {
|
|
268
|
+
if (!registry || typeof registry.resolve !== "function") throw new TypeError("A motion registry is required.");
|
|
269
|
+
return registry.resolve(ids);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export {
|
|
273
|
+
MOTION_RECIPE_SCHEMA_VERSION,
|
|
274
|
+
MOTION_TRIGGER_TYPES,
|
|
275
|
+
MotionRecipeValidationError,
|
|
276
|
+
validateMotionRecipe,
|
|
277
|
+
defineMotionRecipe,
|
|
278
|
+
createMotionRegistry,
|
|
279
|
+
resolveMotionRecipes
|
|
280
|
+
};
|
|
281
|
+
//# sourceMappingURL=chunk-24KKECMK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/recipes/schema.js","../src/recipes/registry.js"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createLenisAdapter
|
|
3
|
+
} from "./chunk-WCG7TQSH.js";
|
|
4
|
+
import {
|
|
5
|
+
createBuiltinMotionRegistry,
|
|
6
|
+
createMotionService
|
|
7
|
+
} from "./chunk-ML7HTCZT.js";
|
|
8
|
+
import {
|
|
9
|
+
createDefaultMotionRuntime
|
|
10
|
+
} from "./chunk-VOIQPPQZ.js";
|
|
11
|
+
import {
|
|
12
|
+
mergeOptions
|
|
13
|
+
} from "./chunk-JET2MYEG.js";
|
|
14
|
+
|
|
15
|
+
// src/runtime.js
|
|
16
|
+
function createSyncedMotion(options = {}) {
|
|
17
|
+
if (typeof document === "undefined") throw new Error("Synced Motion requires a browser document.");
|
|
18
|
+
const settings = mergeOptions(options);
|
|
19
|
+
const root = settings.root || document;
|
|
20
|
+
const ownerDocument = root.nodeType === 9 ? root : root.ownerDocument;
|
|
21
|
+
const view = ownerDocument.defaultView;
|
|
22
|
+
const parameterOverrides = {
|
|
23
|
+
"reveal-rise": { start: settings.revealStart },
|
|
24
|
+
"reveal-stagger-cascade": { start: settings.revealStart },
|
|
25
|
+
"split-lines-rise": { start: settings.revealStart },
|
|
26
|
+
"split-words-cascade": { start: settings.revealStart },
|
|
27
|
+
...settings.parameterOverrides
|
|
28
|
+
};
|
|
29
|
+
const runtime = createDefaultMotionRuntime({
|
|
30
|
+
root,
|
|
31
|
+
debug: settings.debug,
|
|
32
|
+
reducedMotionQuery: settings.reducedMotionQuery,
|
|
33
|
+
reducedMotion: settings.reducedMotion,
|
|
34
|
+
parameterOverrides,
|
|
35
|
+
dependencies: settings.dependencies,
|
|
36
|
+
strict: settings.strict
|
|
37
|
+
});
|
|
38
|
+
const systemReduced = Boolean(view?.matchMedia?.(settings.reducedMotionQuery).matches);
|
|
39
|
+
const smoothScroll = settings.smoothScroll && settings.reducedMotion !== "reduce" && !systemReduced ? createLenisAdapter({
|
|
40
|
+
gsap: runtime.gsap,
|
|
41
|
+
ScrollTrigger: runtime.ScrollTrigger,
|
|
42
|
+
options: typeof settings.smoothScroll === "object" ? settings.smoothScroll : {}
|
|
43
|
+
}) : void 0;
|
|
44
|
+
let destroyed = false;
|
|
45
|
+
const refresh = () => {
|
|
46
|
+
if (destroyed) return;
|
|
47
|
+
runtime.refresh();
|
|
48
|
+
};
|
|
49
|
+
if (ownerDocument.fonts?.ready) ownerDocument.fonts.ready.then(refresh);
|
|
50
|
+
view?.addEventListener("load", refresh, { once: true });
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
gsap: runtime.gsap,
|
|
53
|
+
ScrollTrigger: runtime.ScrollTrigger,
|
|
54
|
+
registry: runtime.registry,
|
|
55
|
+
smoothScroll,
|
|
56
|
+
inspect: runtime.inspect,
|
|
57
|
+
mountRecipe: runtime.mountRecipe,
|
|
58
|
+
refresh,
|
|
59
|
+
destroy() {
|
|
60
|
+
destroyed = true;
|
|
61
|
+
view?.removeEventListener("load", refresh);
|
|
62
|
+
smoothScroll?.destroy();
|
|
63
|
+
runtime.destroy();
|
|
64
|
+
ownerDocument.documentElement.removeAttribute("data-motion-scroll-locked");
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/inspector.js
|
|
70
|
+
function filterMotionCatalog(recipes, filters = {}) {
|
|
71
|
+
const query = String(filters.query ?? "").trim().toLowerCase();
|
|
72
|
+
return recipes.filter((recipe) => {
|
|
73
|
+
if (filters.family && recipe.family !== filters.family) return false;
|
|
74
|
+
if (filters.performance && recipe.performance.class !== filters.performance) return false;
|
|
75
|
+
if (!query) return true;
|
|
76
|
+
return [recipe.id, recipe.title, recipe.intent, recipe.description, recipe.family, ...recipe.tags].join(" ").toLowerCase().includes(query);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function coerceMotionParameter(parameter, value) {
|
|
80
|
+
if (parameter.type === "boolean") return value === true || value === "true" || value === "on";
|
|
81
|
+
if (parameter.type === "number") {
|
|
82
|
+
const number = Number(value);
|
|
83
|
+
if (!Number.isFinite(number)) throw new TypeError("Expected a finite number.");
|
|
84
|
+
return Math.min(parameter.max, Math.max(parameter.min, number));
|
|
85
|
+
}
|
|
86
|
+
if (parameter.type === "enum") {
|
|
87
|
+
if (!parameter.values.includes(value)) throw new TypeError(`Expected one of: ${parameter.values.join(", ")}.`);
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
return String(value);
|
|
91
|
+
}
|
|
92
|
+
function createMotionInspector({ registry = createBuiltinMotionRegistry(), runtime } = {}) {
|
|
93
|
+
const service = createMotionService(registry);
|
|
94
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
95
|
+
let selectedId;
|
|
96
|
+
let selectedFixture;
|
|
97
|
+
let parameters = {};
|
|
98
|
+
let currentRuntime = runtime;
|
|
99
|
+
const notify = () => {
|
|
100
|
+
const value = inspector.snapshot();
|
|
101
|
+
listeners.forEach((listener) => listener(value));
|
|
102
|
+
return value;
|
|
103
|
+
};
|
|
104
|
+
const inspector = Object.freeze({
|
|
105
|
+
catalog: service.catalog(),
|
|
106
|
+
select(id, fixtureId) {
|
|
107
|
+
const recipe = registry.get(id);
|
|
108
|
+
if (!recipe) throw new Error(`Unknown motion recipe "${id}".`);
|
|
109
|
+
const fixture = recipe.fixtures.find((entry) => entry.id === (fixtureId ?? recipe.preview.fixture));
|
|
110
|
+
if (!fixture) throw new Error(`Unknown fixture "${fixtureId}" for recipe "${id}".`);
|
|
111
|
+
selectedId = id;
|
|
112
|
+
selectedFixture = fixture.id;
|
|
113
|
+
parameters = Object.fromEntries(Object.entries(recipe.parameters).map(([name, parameter]) => [name, fixture.parameters?.[name] ?? parameter.default]));
|
|
114
|
+
return notify();
|
|
115
|
+
},
|
|
116
|
+
setParameter(name, value) {
|
|
117
|
+
const recipe = registry.get(selectedId);
|
|
118
|
+
const parameter = recipe?.parameters[name];
|
|
119
|
+
if (!parameter) throw new Error(`Unknown parameter "${name}".`);
|
|
120
|
+
parameters = { ...parameters, [name]: coerceMotionParameter(parameter, value) };
|
|
121
|
+
return notify();
|
|
122
|
+
},
|
|
123
|
+
reset() {
|
|
124
|
+
if (!selectedId) return inspector.snapshot();
|
|
125
|
+
return inspector.select(selectedId, selectedFixture);
|
|
126
|
+
},
|
|
127
|
+
attachRuntime(nextRuntime) {
|
|
128
|
+
currentRuntime = nextRuntime;
|
|
129
|
+
return notify();
|
|
130
|
+
},
|
|
131
|
+
subscribe(listener) {
|
|
132
|
+
if (typeof listener !== "function") throw new TypeError("Inspector listener must be a function.");
|
|
133
|
+
listeners.add(listener);
|
|
134
|
+
listener(inspector.snapshot());
|
|
135
|
+
return () => listeners.delete(listener);
|
|
136
|
+
},
|
|
137
|
+
snapshot() {
|
|
138
|
+
const recipe = selectedId ? service.recipe(selectedId) : void 0;
|
|
139
|
+
const fixture = recipe?.fixtures.find((entry) => entry.id === selectedFixture);
|
|
140
|
+
return {
|
|
141
|
+
selectedId,
|
|
142
|
+
fixture,
|
|
143
|
+
parameters: { ...parameters },
|
|
144
|
+
recipe,
|
|
145
|
+
diagnostics: currentRuntime?.inspect?.() ?? { active: false, mounted: [], skipped: [], errors: [] }
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
destroy() {
|
|
149
|
+
listeners.clear();
|
|
150
|
+
currentRuntime = void 0;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return inspector;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export {
|
|
157
|
+
createSyncedMotion,
|
|
158
|
+
filterMotionCatalog,
|
|
159
|
+
coerceMotionParameter,
|
|
160
|
+
createMotionInspector
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=chunk-3WUVBPYX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime.js","../src/inspector.js"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// src/version.js
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
function readPackageVersion() {
|
|
5
|
+
for (const candidate of ["../package.json", "../../package.json"]) {
|
|
6
|
+
try {
|
|
7
|
+
const path = fileURLToPath(new URL(candidate, import.meta.url));
|
|
8
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
9
|
+
if (parsed.name === "@syncedco/motion" && typeof parsed.version === "string") return parsed.version;
|
|
10
|
+
} catch {
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return "0.0.0-unknown";
|
|
14
|
+
}
|
|
15
|
+
var packageVersion = readPackageVersion();
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
packageVersion
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=chunk-HCWQV65E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.js"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAQ9B,SAAS,qBAAqB;AAE5B,aAAW,aAAa,CAAC,mBAAmB,oBAAoB,GAAG;AACjE,QAAI;AACF,YAAM,OAAO,cAAc,IAAI,IAAI,WAAW,YAAY,GAAG,CAAC;AAC9D,YAAM,SAAS,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AACpD,UAAI,OAAO,SAAS,sBAAsB,OAAO,OAAO,YAAY,SAAU,QAAO,OAAO;AAAA,IAC9F,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,iBAAiB,mBAAmB;","names":[]}
|