diff --git a/src/components/card-preview.tsx b/src/components/card-preview.tsx
index 31280fd..5db8861 100644
--- a/src/components/card-preview.tsx
+++ b/src/components/card-preview.tsx
@@ -1,56 +1,48 @@
import { Show, For } from 'solid-js';
import { marked } from '../markdown';
-import type { CardData, LayerConfig, Dimensions } from './types';
import { getLayerStyle } from './utils/dimensions';
-import { getSelectionBoxStyle } from './hooks/use-selection';
+import {getSelectionBoxStyle, useSelection} from './hooks/use-selection';
+import {DeckStore} from "./stores/deckStore";
export interface CardPreviewProps {
- cards: CardData[];
- activeTab: number;
- layerConfigs: LayerConfig[];
- dimensions: Dimensions;
- isEditing: boolean;
- isFixed: boolean;
- editingLayer: string | null;
- isSelecting: boolean;
- selectStart: { x: number; y: number } | null;
- selectEnd: { x: number; y: number } | null;
- onMouseDown: (e: MouseEvent) => void;
- onMouseMove: (e: MouseEvent) => void;
- onMouseUp: () => void;
- onMouseLeave: () => void;
+ store: DeckStore;
}
/**
* 渲染 layer 内容
*/
-function renderLayer(layer: { prop: string }, cardData: CardData): string {
+function renderLayer(layer: { prop: string }, cardData: DeckStore['cards'][number]): string {
const content = cardData[layer.prop] || '';
return marked.parse(content) as string;
}
export function CardPreview(props: CardPreviewProps) {
- const currentCard = () => props.cards[props.activeTab];
- const visibleLayers = () => props.layerConfigs.filter(l => l.visible);
+ const currentCard = () => props.store.cards[props.store.activeTab];
+ const visibleLayers = () => props.store.layerConfigs.filter((l) => l.visible);
const selectionStyle = () =>
- getSelectionBoxStyle(props.selectStart, props.selectEnd, props.dimensions);
+ getSelectionBoxStyle(props.store.selectStart, props.store.selectEnd, props.store.dimensions);
+
+ const selection = useSelection(props.store);
+
+ let cardRef: HTMLDivElement | undefined;
return (
-
+
selection.onMouseDown(e, cardRef!)}
+ onMouseMove={(e) => selection.onMouseMove(e, cardRef!)}
+ onMouseUp={selection.onMouseUp}
+ onMouseLeave={selection.onMouseLeave}
>
{/* 框选遮罩 */}
-
+
{/* 编辑模式下的网格线 */}
-
+
-
+
{(_, i) => (
)}
-
+
{(_, i) => (
)}
@@ -92,12 +84,12 @@ export function CardPreview(props: CardPreviewProps) {
{/* 渲染每个 layer */}
{(layer) => {
- const style = getLayerStyle(layer, props.dimensions);
+ const style = getLayerStyle(layer, props.store.dimensions!);
return (
void;
+ cards: DeckStore['cards'];
+ updateCardData: DeckStore['updateCardData'];
}
export interface PropertiesEditorPanelProps {
- localSize: string;
- localGrid: string;
- localBleed: string;
- localPadding: string;
- layerConfigs: LayerConfig[];
- editingLayer: string | null;
- onSizeChange: (value: string) => void;
- onGridChange: (value: string) => void;
- onBleedChange: (value: string) => void;
- onPaddingChange: (value: string) => void;
- onToggleLayerVisible: (prop: string) => void;
- onStartEditingLayer: (prop: string) => void;
- onCopyCode: () => void;
+ store: DeckStore;
}
/**
@@ -39,7 +27,7 @@ export function DataEditorPanel(props: DataEditorPanelProps) {
class="w-full border border-gray-300 rounded px-2 py-1 text-sm"
rows={3}
value={props.cards[props.activeTab]?.[key] || ''}
- onInput={(e) => props.updateCardData(key, e.target.value)}
+ onInput={(e) => props.updateCardData(props.activeTab, key, e.target.value)}
/>
)}
@@ -53,6 +41,8 @@ export function DataEditorPanel(props: DataEditorPanelProps) {
* 右侧:卡牌属性编辑面板
*/
export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
+ const { store } = props;
+
return (
卡牌属性
@@ -63,8 +53,8 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
props.onSizeChange(e.target.value)}
+ value={store.size}
+ onInput={(e) => store.setSize(e.target.value)}
/>
@@ -73,8 +63,8 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
props.onGridChange(e.target.value)}
+ value={store.grid}
+ onInput={(e) => store.setGrid(e.target.value)}
/>
@@ -83,8 +73,8 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
props.onBleedChange(e.target.value)}
+ value={store.bleed}
+ onInput={(e) => store.setBleed(e.target.value)}
/>
@@ -93,33 +83,33 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
props.onPaddingChange(e.target.value)}
+ value={store.padding}
+ onInput={(e) => store.setPadding(e.target.value)}
/>
图层
-
+
{(layer) => (
props.onToggleLayerVisible(layer.prop)}
+ onChange={() => store.toggleLayerVisible(layer.prop)}
class="cursor-pointer"
/>
{layer.prop}
)}
@@ -128,7 +118,7 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {