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 { resolvePath } from "../utils/path"; 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 showBounds = () => props.store.state.isEditing; const selectedLayer = () => props.store.state.selectedLayer; const draggingState = () => props.store.state.draggingState; function renderLayerContent(content: string) { const iconPath = resolvePath(props.store.state.cards.sourcePath, props.cardData.iconPath ?? "./assets"); return parseMarkdown(processVariables(content, props.cardData, props.store.state.cards), iconPath) as string; } const getAlignStyle = (align?: 'l' | 'c' | 'r') => { if (align === 'l') return 'left'; if (align === 'r') return 'right'; return 'center'; }; const isLayerSelected = (layer: LayerConfig) => selectedLayer() === layer.prop; 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 = (layerProp: string, e: MouseEvent) => { if (props.interaction) { props.interaction.onLayerClick(layerProp, 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) => { const bounds = () => getFrameBounds(layer); const isSelected = () => isLayerSelected(layer); return ( <>
handleLayerClick(layer.prop, 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)} /> ); }} ); }