import { For, createSignal, createMemo, onCleanup, onMount } from "solid-js"; import { DragDropProvider, DragDropSensors, SortableProvider, useDragDropContext, closestCenter, } from "@thisbeyond/solid-dnd"; import type { DeckStore } from "../hooks/deckStore"; import { LayerRow } from "./LayerRow"; export interface LayerEditorPanelProps { store: DeckStore; } function LayerEditorPanel(props: LayerEditorPanelProps) { const { store } = props; const [openDropdown, setOpenDropdown] = createSignal(null); const [hoveredIndex, setHoveredIndex] = createSignal(null); const [addMenuOpen, setAddMenuOpen] = createSignal(false); let addMenuRef: HTMLDivElement | undefined; const side = () => store.state.activeSide; const layers = () => side() === "front" ? store.state.frontLayerConfigs : store.state.backLayerConfigs; // Stable IDs for SortableProvider — simply the indices const ids = createMemo(() => layers().map((_, i) => i)); const updater = () => side() === "front" ? store.actions.updateFrontLayerConfig : store.actions.updateBackLayerConfig; const availableFields = createMemo(() => { const cards = store.state.cards; if (!cards?.length) return []; return Object.keys(cards[0]).filter((k) => k !== "label"); }); const update = ( index: number, patch: Partial, closeDropdown = false, ) => { updater()(index, patch); if (closeDropdown) setOpenDropdown(null); }; onMount(() => { const h = (e: MouseEvent) => { if (addMenuRef && !addMenuRef.contains(e.target as Node)) setAddMenuOpen(false); }; document.addEventListener("click", h); onCleanup(() => document.removeEventListener("click", h)); }); return (

图层 ({side() === "front" ? "正面" : "背面"})

{addMenuOpen() && (
e.stopPropagation()} > {(f) => ( )}
)}
{ if (droppable && draggable.id !== droppable.id) { store.actions.reorderLayers( side(), draggable.id as number, droppable.id as number, ); } }} collisionDetector={closestCenter} > {(layer, index) => ( update(index(), { orientation: o }, true) } onUpdateFontSize={(fs) => update(index(), { fontSize: fs })} onUpdateAlign={(a) => update(index(), { align: a }, true)} onSelect={() => store.actions.setSelectedLayer( store.state.selectedLayer === index() ? null : index(), ) } onRemove={() => store.actions.removeLayer(side(), index())} /> )}
); } export { LayerEditorPanel };