refactor: panel reorg

This commit is contained in:
hypercross 2026-02-27 15:33:23 +08:00
parent ce01044c41
commit 23d6d81532
4 changed files with 64 additions and 41 deletions

View File

@ -0,0 +1,54 @@
import { For } from 'solid-js';
import type { DeckStore } from '../hooks/deckStore';
export interface LayerEditorPanelProps {
store: DeckStore;
}
/**
*
*/
export function LayerEditorPanel(props: LayerEditorPanelProps) {
const { store } = props;
return (
<div class="w-64 flex-shrink-0">
<h3 class="font-bold mb-2"></h3>
<div class="space-y-2">
<For each={store.state.layerConfigs}>
{(layer) => (
<div class="flex items-center gap-2">
<input
type="checkbox"
checked={layer.visible}
onChange={() => store.actions.toggleLayerVisible(layer.prop)}
class="cursor-pointer"
/>
<span class="text-sm flex-1">{layer.prop}</span>
<button
onClick={() => store.actions.setEditingLayer(store.state.editingLayer === layer.prop ? null : layer.prop)}
class={`text-xs px-2 py-0.5 rounded cursor-pointer ${
store.state.editingLayer === layer.prop
? 'bg-blue-500 text-white'
: 'bg-gray-200 text-gray-700 hover:bg-gray-300'
}`}
>
{store.state.editingLayer === layer.prop ? '✓ 框选' : '编辑'}
</button>
</div>
)}
</For>
</div>
<hr class="my-4" />
<button
onClick={store.actions.copyCode}
class="w-full bg-blue-600 hover:bg-blue-700 text-white px-3 py-2 rounded text-sm font-medium cursor-pointer"
>
📋
</button>
</div>
);
}

View File

@ -1,4 +1,3 @@
import { For } from 'solid-js';
import type { DeckStore } from '../hooks/deckStore'; import type { DeckStore } from '../hooks/deckStore';
export interface PropertiesEditorPanelProps { export interface PropertiesEditorPanelProps {
@ -6,7 +5,7 @@ export interface PropertiesEditorPanelProps {
} }
/** /**
* *
*/ */
export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) { export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
const { store } = props; const { store } = props;
@ -85,42 +84,6 @@ export function PropertiesEditorPanel(props: PropertiesEditorPanelProps) {
onInput={(e) => store.actions.setPadding(e.target.value)} onInput={(e) => store.actions.setPadding(e.target.value)}
/> />
</div> </div>
<hr class="my-4" />
<h4 class="font-medium text-sm text-gray-700"></h4>
<For each={store.state.layerConfigs}>
{(layer) => (
<div class="flex items-center gap-2">
<input
type="checkbox"
checked={layer.visible}
onChange={() => store.actions.toggleLayerVisible(layer.prop)}
class="cursor-pointer"
/>
<span class="text-sm flex-1">{layer.prop}</span>
<button
onClick={() => store.actions.setEditingLayer(store.state.editingLayer === layer.prop ? null : layer.prop)}
class={`text-xs px-2 py-0.5 rounded cursor-pointer ${
store.state.editingLayer === layer.prop
? 'bg-blue-500 text-white'
: 'bg-gray-200 text-gray-700 hover:bg-gray-300'
}`}
>
{store.state.editingLayer === layer.prop ? '✓ 框选' : '编辑位置'}
</button>
</div>
)}
</For>
<hr class="my-4" />
<button
onClick={store.actions.copyCode}
class="w-full bg-blue-600 hover:bg-blue-700 text-white px-3 py-2 rounded text-sm font-medium cursor-pointer"
>
📋
</button>
</div> </div>
</div> </div>
); );

View File

@ -1,3 +1,6 @@
export { DataEditorPanel } from './DataEditorPanel'; export { DataEditorPanel } from './DataEditorPanel';
export { PropertiesEditorPanel } from './PropertiesEditorPanel'; export { PropertiesEditorPanel } from './PropertiesEditorPanel';
export { LayerEditorPanel } from './LayerEditorPanel';
export type { DataEditorPanelProps } from './DataEditorPanel'; export type { DataEditorPanelProps } from './DataEditorPanel';
export type { PropertiesEditorPanelProps } from './PropertiesEditorPanel';
export type { LayerEditorPanelProps } from './LayerEditorPanel';

View File

@ -4,7 +4,7 @@ import { resolvePath } from '../utils/path';
import { createDeckStore } from './hooks/deckStore'; import { createDeckStore } from './hooks/deckStore';
import { DeckHeader } from './DeckHeader'; import { DeckHeader } from './DeckHeader';
import { DeckContent } from './DeckContent'; import { DeckContent } from './DeckContent';
import { DataEditorPanel, PropertiesEditorPanel } from './editor-panel'; import {DataEditorPanel, LayerEditorPanel, PropertiesEditorPanel} from './editor-panel';
interface DeckProps { interface DeckProps {
size?: string; size?: string;
@ -107,9 +107,12 @@ customElement<DeckProps>('md-deck', {
<DeckContent store={store} isLoading={store.state.isLoading} /> <DeckContent store={store} isLoading={store.state.isLoading} />
</div> </div>
{/* 右侧:属性编辑表单 */} {/* 右侧:属性/图层编辑面板 */}
<Show when={store.state.isEditing && !store.state.fixed}> <Show when={store.state.isEditing && !store.state.fixed}>
<PropertiesEditorPanel store={store} /> <div class="flex gap-4">
<PropertiesEditorPanel store={store} />
<LayerEditorPanel store={store} />
</div>
</Show> </Show>
</div> </div>
); );