| <template> |
| <div class="element-style-panel"> |
| <component :is="currentPanelComponent"></component> |
| </div> |
| </template> |
|
|
| <script lang="ts" setup> |
| import { computed } from 'vue' |
| import { storeToRefs } from 'pinia' |
| import { useMainStore } from '@/store' |
| import { ElementTypes } from '@/types/slides' |
|
|
| import TextStylePanel from './TextStylePanel.vue' |
| import ImageStylePanel from './ImageStylePanel.vue' |
| import ShapeStylePanel from './ShapeStylePanel.vue' |
| import LineStylePanel from './LineStylePanel.vue' |
| import ChartStylePanel from './ChartStylePanel/index.vue' |
| import TableStylePanel from './TableStylePanel.vue' |
| import LatexStylePanel from './LatexStylePanel.vue' |
| import VideoStylePanel from './VideoStylePanel.vue' |
| import AudioStylePanel from './AudioStylePanel.vue' |
|
|
| const panelMap = { |
| [ElementTypes.TEXT]: TextStylePanel, |
| [ElementTypes.IMAGE]: ImageStylePanel, |
| [ElementTypes.SHAPE]: ShapeStylePanel, |
| [ElementTypes.LINE]: LineStylePanel, |
| [ElementTypes.CHART]: ChartStylePanel, |
| [ElementTypes.TABLE]: TableStylePanel, |
| [ElementTypes.LATEX]: LatexStylePanel, |
| [ElementTypes.VIDEO]: VideoStylePanel, |
| [ElementTypes.AUDIO]: AudioStylePanel, |
| } |
|
|
| const { handleElement } = storeToRefs(useMainStore()) |
|
|
| const currentPanelComponent = computed<unknown>(() => { |
| return handleElement.value ? (panelMap[handleElement.value.type] || null) : null |
| }) |
| </script> |