diff --git a/src/components/card-preview.tsx b/src/components/card-preview.tsx index 6337d79..ce7dcc4 100644 --- a/src/components/card-preview.tsx +++ b/src/components/card-preview.tsx @@ -1,8 +1,8 @@ import { Show, For } from 'solid-js'; import { marked } from '../markdown'; import { getLayerStyle } from './utils/dimensions'; -import {getSelectionBoxStyle, useSelection} from './stores/use-selection'; -import {DeckStore} from "./stores/deckStore"; +import { getSelectionBoxStyle, useSelection } from './stores/use-selection'; +import type { DeckStore } from "./stores/deckStore"; export interface CardPreviewProps { store: DeckStore; @@ -11,30 +11,30 @@ export interface CardPreviewProps { /** * 渲染 layer 内容 */ -function renderLayer(layer: { prop: string }, cardData: DeckStore['cards'][number]): string { +function renderLayer(layer: { prop: string }, cardData: DeckStore['state']['cards'][number]): string { const content = cardData[layer.prop] || ''; return marked.parse(content) as string; } export function CardPreview(props: CardPreviewProps) { - const currentCard = () => props.store.cards[props.store.activeTab]; - const visibleLayers = () => props.store.layerConfigs.filter((l) => l.visible); + const currentCard = () => props.store.state.cards[props.store.state.activeTab]; + const visibleLayers = () => props.store.state.layerConfigs.filter((l) => l.visible); const selectionStyle = () => - getSelectionBoxStyle(props.store.selectStart, props.store.selectEnd, props.store.dimensions); - + getSelectionBoxStyle(props.store.state.selectStart, props.store.state.selectEnd, props.store.state.dimensions); + const selection = useSelection(props.store); let cardRef: HTMLDivElement | undefined; return (
- +
selection.onMouseDown(e, cardRef!)} onMouseMove={(e) => selection.onMouseMove(e, cardRef!)} @@ -42,7 +42,7 @@ export function CardPreview(props: CardPreviewProps) { onMouseLeave={selection.onMouseLeave} > {/* 框选遮罩 */} - +
{/* 编辑模式下的网格线 */} - +
- + {(_, i) => (
)} - + {(_, i) => (
)} @@ -84,12 +84,12 @@ export function CardPreview(props: CardPreviewProps) { {/* 渲染每个 layer */} {(layer) => { - const style = getLayerStyle(layer, props.store.dimensions!); + const style = getLayerStyle(layer, props.store.state.dimensions!); return (

卡牌属性

@@ -53,8 +53,8 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) { store.setSize(e.target.value)} + value={store.state.size} + onInput={(e) => store.actions.setSize(e.target.value)} />
@@ -63,8 +63,8 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) { store.setGrid(e.target.value)} + value={store.state.grid} + onInput={(e) => store.actions.setGrid(e.target.value)} />
@@ -73,8 +73,8 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) { store.setBleed(e.target.value)} + value={store.state.bleed} + onInput={(e) => store.actions.setBleed(e.target.value)} />
@@ -83,33 +83,33 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) { store.setPadding(e.target.value)} + value={store.state.padding} + onInput={(e) => store.actions.setPadding(e.target.value)} />

图层

- + {(layer) => (
store.toggleLayerVisible(layer.prop)} + onChange={() => store.actions.toggleLayerVisible(layer.prop)} class="cursor-pointer" /> {layer.prop}
)} @@ -118,7 +118,7 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
- + {(card, index) => (
{/* 错误提示 */} - +
- {store.error} + {store.state.error}
@@ -133,12 +133,12 @@ customElement('md-deck', {
{/* 卡牌预览 */} - 0 && !store.error}> + 0 && !store.state.error}> {/* 空状态 */} - +
暂无卡牌数据
@@ -146,7 +146,7 @@ customElement('md-deck', {
{/* 右侧:属性编辑表单 */} - +
diff --git a/src/components/stores/deckStore.ts b/src/components/stores/deckStore.ts index abe7483..3ff9fe9 100644 --- a/src/components/stores/deckStore.ts +++ b/src/components/stores/deckStore.ts @@ -71,7 +71,10 @@ export interface DeckActions { copyCode: () => void; } -export interface DeckStore extends DeckState, DeckActions {} +export interface DeckStore { + state: DeckState; + actions: DeckActions; +} /** * 创建 deck store @@ -187,8 +190,7 @@ export function createDeckStore(): DeckStore { }); }; - return { - ...state, + const actions: DeckActions = { setSize, setGrid, setBleed, @@ -211,4 +213,6 @@ export function createDeckStore(): DeckStore { generateCode, copyCode }; + + return { state, actions }; } diff --git a/src/components/stores/use-selection.ts b/src/components/stores/use-selection.ts index 479faec..5b448c9 100644 --- a/src/components/stores/use-selection.ts +++ b/src/components/stores/use-selection.ts @@ -5,9 +5,9 @@ import type { DeckStore } from './deckStore'; * 此 hook 保留用于向后兼容或提取特定逻辑 */ export function useSelection(store: DeckStore) { - const calculateGridCoords = (e: MouseEvent, cardEl: HTMLElement, dimensions: DeckStore['dimensions']) => { + const calculateGridCoords = (e: MouseEvent, cardEl: HTMLElement, dimensions: DeckStore['state']['dimensions']) => { if (!dimensions) return { gridX: 1, gridY: 1 }; - + const rect = cardEl.getBoundingClientRect(); const offsetX = (e.clientX - rect.left) / rect.width * dimensions.cardWidth; @@ -23,36 +23,36 @@ export function useSelection(store: DeckStore) { }; const handleMouseDown = (e: MouseEvent, cardEl: HTMLElement) => { - if (!store.isEditing || !store.editingLayer) return; + if (!store.state.isEditing || !store.state.editingLayer) return; - const { gridX, gridY } = calculateGridCoords(e, cardEl, store.dimensions); + const { gridX, gridY } = calculateGridCoords(e, cardEl, store.state.dimensions); - store.setSelectStart({ x: gridX, y: gridY }); - store.setSelectEnd({ x: gridX, y: gridY }); - store.setIsSelecting(true); + store.actions.setSelectStart({ x: gridX, y: gridY }); + store.actions.setSelectEnd({ x: gridX, y: gridY }); + store.actions.setIsSelecting(true); }; const handleMouseMove = (e: MouseEvent, cardEl: HTMLElement) => { - if (!store.isSelecting) return; + if (!store.state.isSelecting) return; - const { gridX, gridY } = calculateGridCoords(e, cardEl, store.dimensions); + const { gridX, gridY } = calculateGridCoords(e, cardEl, store.state.dimensions); - store.setSelectEnd({ x: gridX, y: gridY }); + store.actions.setSelectEnd({ x: gridX, y: gridY }); }; const handleMouseUp = () => { - if (!store.isSelecting || !store.editingLayer) return; + if (!store.state.isSelecting || !store.state.editingLayer) return; - const start = store.selectStart!; - const end = store.selectEnd!; + const start = store.state.selectStart!; + const end = store.state.selectEnd!; const x1 = Math.min(start.x, end.x); const y1 = Math.min(start.y, end.y); const x2 = Math.max(start.x, end.x); const y2 = Math.max(start.y, end.y); - store.updateLayerPosition(x1, y1, x2, y2); - store.cancelSelection(); + store.actions.updateLayerPosition(x1, y1, x2, y2); + store.actions.cancelSelection(); }; return {