UNPKG

@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
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