import { createMemo, For, Show } from "solid-js"; import { parseMarkdown } from "../../markdown"; import { getLayerStyle } from "./hooks/dimensions"; import type { CardData, CardSide, LayerConfig } from "./types"; import { DeckStore } from "./hooks/deckStore"; import { processVariables } from "../utils/csv-loader"; import type { LayerInteractionHandlers } from "./hooks/useLayerInteraction"; export interface CardLayerProps { cardData: CardData; store: DeckStore; side?: CardSide; interaction?: LayerInteractionHandlers; } export function CardLayer(props: CardLayerProps) { const side = () => props.side || "front"; const layers = createMemo(() => side() === "front" ? props.store.state.frontLayerConfigs.filter((l) => l.visible) : props.store.state.backLayerConfigs.filter((l) => l.visible), ); const dimensions = () => props.store.state.dimensions!; const selectedLayer = () => props.store.state.selectedLayer; const draggingState = () => props.store.state.draggingState; function renderLayerContent(content: string) { return parseMarkdown( processVariables(content, props.cardData, props.store.state.cards), props.store.state.cards.sourcePath, ) as string; } const getAlignStyle = (align?: "l" | "c" | "r") => { if (align === "l") return "left"; if (align === "r") return "right"; return "center"; }; const isLayerSelected = (layerIndex: number) => selectedLayer() === layerIndex; const getFrameBounds = (layer: LayerConfig) => { const dims = dimensions(); const left = (layer.x1 - 1) * dims.cellWidth; const top = (layer.y1 - 1) * dims.cellHeight; const width = (layer.x2 - layer.x1 + 1) * dims.cellWidth; const height = (layer.y2 - layer.y1 + 1) * dims.cellHeight; return { left, top, width, height }; }; const handleLayerClick = (layerIndex: number, e: MouseEvent) => { if (props.interaction) { props.interaction.onLayerClick(layerIndex, e); } }; const handleFrameMouseDown = ( action: "drag" | "resize-corner" | "resize-edge", anchor?: "nw" | "ne" | "sw" | "se", edge?: "n" | "s" | "e" | "w", e?: MouseEvent, ) => { if (props.interaction) { props.interaction.onFrameMouseDown(action, anchor, edge, e); } }; return ( {(layer, index) => { const bounds = () => getFrameBounds(layer); const isSelected = () => isLayerSelected(index()); return ( <>
handleLayerClick(index(), e)} />
handleFrameMouseDown("drag", undefined, undefined, e) } />
handleFrameMouseDown("resize-corner", "nw", undefined, e) } />
handleFrameMouseDown("resize-corner", "ne", undefined, e) } />
handleFrameMouseDown("resize-corner", "sw", undefined, e) } />
handleFrameMouseDown("resize-corner", "se", undefined, e) } />
handleFrameMouseDown("resize-edge", undefined, "n", e) } />
handleFrameMouseDown("resize-edge", undefined, "s", e) } />
handleFrameMouseDown("resize-edge", undefined, "w", e) } />
handleFrameMouseDown("resize-edge", undefined, "e", e) } /> ); }} ); }