import { For, createSignal, onCleanup, onMount } from 'solid-js'; import type { DeckStore } from '../hooks/deckStore'; export interface LayerEditorPanelProps { store: DeckStore; } const ORIENTATION_OPTIONS = [ { value: 'n', label: '↑ 北' }, { value: 'e', label: '→ 东' }, { value: 's', label: '↓ 南' }, { value: 'w', label: '← 西' } ] as const; const ALIGN_OPTIONS = [ { value: '', label: '默认' }, { value: 'l', label: '← 左' }, { value: 'c', label: '≡ 中' }, { value: 'r', label: '→ 右' } ] as const; const FONT_PRESETS = [3, 5, 8, 12] as const; function OrientationIcon(value: string): string { switch (value) { case 'n': return '↑'; case 'e': return '→'; case 's': return '↓'; case 'w': return '←'; default: return '↑'; } } function AlignIcon(value: string): string { switch (value) { case 'l': return '⫷'; case 'c': return '≡'; case 'r': return '⫸'; default: return '≡'; } } function LayerEditorPanel(props: LayerEditorPanelProps) { const { store } = props; const [openDropdown, setOpenDropdown] = createSignal(null); let dropdownRef: HTMLDivElement | undefined; const currentLayerConfigs = () => store.state.activeSide === 'front' ? store.state.frontLayerConfigs : store.state.backLayerConfigs; const updateLayerOrientation = (layerProp: string, orientation: 'n' | 's' | 'e' | 'w') => { const updateFn = store.state.activeSide === 'front' ? store.actions.updateFrontLayerConfig : store.actions.updateBackLayerConfig; updateFn(layerProp, { orientation }); setOpenDropdown(null); }; const updateLayerFontSize = (layerProp: string, fontSize?: number) => { const updateFn = store.state.activeSide === 'front' ? store.actions.updateFrontLayerConfig : store.actions.updateBackLayerConfig; updateFn(layerProp, { fontSize }); }; const updateLayerAlign = (layerProp: string, align?: 'l' | 'c' | 'r') => { const updateFn = store.state.activeSide === 'front' ? store.actions.updateFrontLayerConfig : store.actions.updateBackLayerConfig; updateFn(layerProp, { align }); setOpenDropdown(null); }; const toggleLayerVisible = (layerProp: string) => { const toggleFn = store.state.activeSide === 'front' ? store.actions.toggleFrontLayerVisible : store.actions.toggleBackLayerVisible; toggleFn(layerProp); }; const selectLayer = (layerProp: string) => { store.actions.setSelectedLayer( store.state.selectedLayer === layerProp ? null : layerProp ); }; const handleDropdownClick = (e: MouseEvent) => { e.stopPropagation(); }; const handleClickOutside = (e: MouseEvent) => { if (dropdownRef && !dropdownRef.contains(e.target as Node)) { setOpenDropdown(null); } }; onMount(() => { document.addEventListener('click', handleClickOutside); }); onCleanup(() => { document.removeEventListener('click', handleClickOutside); }); const layerCount = () => currentLayerConfigs().length; return (

图层 ({store.state.activeSide === 'front' ? '正面' : '背面'})

{(layer, index) => (
toggleLayerVisible(layer.prop)} class="cursor-pointer" /> selectLayer(layer.prop)} > {layer.prop}
{openDropdown() === `orient-${layer.prop}` && (
{(opt) => ( )}
)}
{openDropdown() === `align-${layer.prop}` && (
{(opt) => ( )}
)}
{openDropdown() === `font-${layer.prop}` && (
{ const value = e.target.value; updateLayerFontSize(layer.prop, value ? Number(value) : undefined); }} class="w-14 text-xs px-1.5 py-1 rounded border border-gray-300" step="0.1" min="0.1" /> mm
{(preset) => ( )}
)}
)}

); } export { LayerEditorPanel };