import { cleanup, render } from "@testing-library/react";
import type * as React from "react";
import { vi } from "vitest";
import { defineToolcraft } from "../../schema/define-toolcraft";
import type { ToolcraftLayer, ToolcraftMediaAsset } from "../../state/types";
import { ToolcraftRoot } from "../app-shell/toolcraft-root";
import { useToolcraft } from "../app-shell/use-toolcraft";
import { LayersPanel } from "./layers-panel";
export function installLayersPanelMatchMedia() {
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,
});
}
export function cleanupLayersPanelTestEnv() {
cleanup();
document.documentElement.classList.remove("dark");
document.documentElement.style.colorScheme = "";
window.localStorage.clear();
vi.restoreAllMocks();
Reflect.deleteProperty(document, "elementFromPoint");
}
export function createSchema() {
return defineToolcraft({
canvas: { enabled: true },
panels: {
layers: true,
},
});
}
export const seededLayers: ToolcraftLayer[] = [
{
collapsed: false,
displayName: "Scene Group",
id: "group-1",
kind: "group",
name: "scene-group",
visible: true,
},
{
displayName: "Layer 1",
id: "layer-1",
kind: "layer",
name: "layer-1",
parentGroupId: "group-1",
visible: true,
},
{
displayName: "Layer 2",
id: "layer-2",
kind: "layer",
name: "layer-2",
visible: true,
},
];
function StateProbe() {
const { state } = useToolcraft();
return (
<>
{state.selectedLayerId}
{state.layers.length}
{String(state.layers.find((layer) => layer.id === "layer-1")?.visible)}
{String(state.layers.find((layer) => layer.id === "group-1")?.collapsed)}
{state.layers
.map((layer) => `${layer.id}:${layer.parentGroupId ?? "root"}`)
.join("|")}
>
);
}
export function renderLayersPanel(
props: Partial> = {},
layers = seededLayers,
mediaAssets: ToolcraftMediaAsset[] = [
{
assetKind: "image",
fileName: "layer-1.png",
id: "media-1",
layerId: "layer-1",
mimeType: "image/png",
lifecycle: "ready",
position: { x: 0, y: 0 },
resourceRef: "media:image:layer-1",
size: { height: 768, unit: "px", width: 1024 },
},
],
) {
return render(
,
);
}
export function mockLayerRowRect(row: HTMLElement, top = 0) {
vi.spyOn(row, "getBoundingClientRect").mockReturnValue({
bottom: top + 32,
height: 32,
left: 0,
right: 240,
toJSON: () => ({}),
top,
width: 240,
x: 0,
y: top,
});
}