@motion-core/motion-gpu
Version:
Framework-agnostic WebGPU runtime for fullscreen WGSL shaders with explicit Svelte, React, and Vue adapter entrypoints.
76 lines (75 loc) • 2.1 kB
JavaScript
import { useMotionGPU } from "./motiongpu-context.js";
//#region src/lib/svelte/use-motiongpu-user-context.ts
/**
* Checks whether a value is a non-array object suitable for shallow merge.
*/
function isObjectEntry(value) {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
/**
* Read-only user context hook:
* - no args: returns full user context store
* - namespace: returns namespaced store view
*
* @param namespace - Optional namespace key.
*/
function useMotionGPUUserContext(namespace) {
const userStore = useMotionGPU().user;
if (namespace === void 0) return {
get current() {
return userStore.current;
},
subscribe(run) {
return userStore.subscribe((context) => run(context));
}
};
return {
get current() {
return userStore.current[namespace];
},
subscribe(run) {
return userStore.subscribe((context) => run(context[namespace]));
}
};
}
/**
* Sets a namespaced user context value with explicit write semantics.
*
* Returns the effective value stored under the namespace.
*/
function setMotionGPUUserContext(namespace, value, options) {
const userStore = useMotionGPU().user;
const mode = options?.existing ?? "skip";
const functionValueMode = options?.functionValue ?? "factory";
let resolvedValue;
userStore.update((context) => {
const hasExisting = namespace in context;
if (hasExisting && mode === "skip") {
resolvedValue = context[namespace];
return context;
}
const nextValue = typeof value === "function" && functionValueMode === "factory" ? value() : value;
if (hasExisting && mode === "merge") {
const currentValue = context[namespace];
if (isObjectEntry(currentValue) && isObjectEntry(nextValue)) {
resolvedValue = {
...currentValue,
...nextValue
};
return {
...context,
[namespace]: resolvedValue
};
}
}
resolvedValue = nextValue;
return {
...context,
[namespace]: nextValue
};
});
return resolvedValue;
}
//#endregion
export { setMotionGPUUserContext, useMotionGPUUserContext };
//# sourceMappingURL=use-motiongpu-user-context.js.map