| <template> | |
| <div | |
| class="base-element-text" | |
| :style="{ | |
| top: elementInfo.top + 'px', | |
| left: elementInfo.left + 'px', | |
| width: elementInfo.width + 'px', | |
| height: elementInfo.height + 'px', | |
| }" | |
| > | |
| <div | |
| class="rotate-wrapper" | |
| :style="{ transform: `rotate(${elementInfo.rotate}deg)` }" | |
| > | |
| <div | |
| class="element-content" | |
| :style="{ | |
| width: elementInfo.vertical ? 'auto' : elementInfo.width + 'px', | |
| height: elementInfo.vertical ? elementInfo.height + 'px' : 'auto', | |
| backgroundColor: elementInfo.fill, | |
| opacity: elementInfo.opacity, | |
| textShadow: shadowStyle, | |
| lineHeight: elementInfo.lineHeight, | |
| letterSpacing: (elementInfo.wordSpace || 0) + 'px', | |
| color: elementInfo.defaultColor, | |
| fontFamily: elementInfo.defaultFontName, | |
| writingMode: elementInfo.vertical ? 'vertical-rl' : 'horizontal-tb', | |
| }" | |
| > | |
| <ElementOutline | |
| :width="elementInfo.width" | |
| :height="elementInfo.height" | |
| :outline="elementInfo.outline" | |
| /> | |
| <div | |
| class="text ProseMirror-static" | |
| :class="{ 'thumbnail': target === 'thumbnail' }" | |
| :style="{ | |
| '--paragraphSpace': `${elementInfo.paragraphSpace === undefined ? 5 : elementInfo.paragraphSpace}px`, | |
| }" | |
| v-html="elementInfo.content" | |
| ></div> | |
| </div> | |
| </div> | |
| </div> | |
| </template> | |
| <script lang="ts" setup> | |
| import { computed } from 'vue' | |
| import type { PPTTextElement } from '@/types/slides' | |
| import ElementOutline from '@/views/components/element/ElementOutline.vue' | |
| import useElementShadow from '@/views/components/element/hooks/useElementShadow' | |
| const props = defineProps<{ | |
| elementInfo: PPTTextElement | |
| target?: string | |
| }>() | |
| const shadow = computed(() => props.elementInfo.shadow) | |
| const { shadowStyle } = useElementShadow(shadow) | |
| </script> | |
| <style lang="scss" scoped> | |
| .base-element-text { | |
| position: absolute; | |
| } | |
| .rotate-wrapper { | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .element-content { | |
| position: relative; | |
| padding: 10px; | |
| line-height: 1.5; | |
| word-break: break-word; | |
| .text { | |
| position: relative; | |
| &.thumbnail { | |
| pointer-events: none; | |
| } | |
| } | |
| } | |
| </style> | |