import * as React from "react"; import { layersModule } from "../../modules/built-ins/layers/layers-module"; import { mediaSourceModule } from "../../modules/built-ins/media-source/media-source-module"; import { timelineModule } from "../../modules/built-ins/timeline/timeline-module"; import { defineToolcraft } from "../../schema/define-toolcraft"; import { useToolcraft } from "./use-toolcraft"; export function installToolcraftAppTestWindow(): void { Object.defineProperty(window, "matchMedia", { value: (query: string) => ({ addEventListener: () => undefined, addListener: () => undefined, dispatchEvent: () => false, matches: query === "(prefers-reduced-motion: reduce)", media: query, onchange: null, removeEventListener: () => undefined, removeListener: () => undefined, }), writable: true, }); window.requestAnimationFrame ??= ((callback: FrameRequestCallback) => window.setTimeout( () => callback(performance.now()), 16, )) as typeof window.requestAnimationFrame; window.cancelAnimationFrame ??= ((handle: number) => window.clearTimeout(handle)) as typeof window.cancelAnimationFrame; } export function createToolcraftAppTestSchema() { return defineToolcraft({ base: { identity: { id: "runtime-test", title: "Toolcraft App" }, canvas: { enabled: true, size: { height: 180, unit: "px", width: 320 }, upload: true, }, panels: { controls: { sections: [ { id: "test-section-1", controls: { prompt: { applicability: { mode: "always" as const }, defaultValue: "Initial prompt", label: "Prompt", target: "generation.prompt", type: "text", }, }, title: "Basic", }, ], title: "Controls", }, }, }, modules: [ layersModule(), mediaSourceModule(), timelineModule({ mode: "keyframes" }), ], }); } export function PanelWorkspaceProbe(): React.JSX.Element { const { state } = useToolcraft(); return ( <> {JSON.stringify(state.panels)} {state.history.undo.length} ); }