| <template> | |
| <div class="remark"> | |
| <div | |
| class="resize-handler" | |
| @mousedown="$event => resize($event)" | |
| ></div> | |
| <Editor | |
| :value="remark" | |
| ref="editorRef" | |
| @update="value => handleInput(value)" | |
| /> | |
| </div> | |
| </template> | |
| <script lang="ts" setup> | |
| import { computed, nextTick, ref, watch } from 'vue' | |
| import { storeToRefs } from 'pinia' | |
| import { useSlidesStore } from '@/store' | |
| import Editor from './Editor.vue' | |
| const props = defineProps<{ | |
| height: number | |
| }>() | |
| const emit = defineEmits<{ | |
| (event: 'update:height', payload: number): void | |
| }>() | |
| const slidesStore = useSlidesStore() | |
| const { currentSlide } = storeToRefs(slidesStore) | |
| const editorRef = ref<InstanceType<typeof Editor>>() | |
| watch(() => currentSlide.value.id, () => { | |
| nextTick(() => { | |
| editorRef.value!.updateTextContent() | |
| }) | |
| }, { | |
| immediate: true, | |
| }) | |
| const remark = computed(() => currentSlide.value?.remark || '') | |
| const handleInput = (content: string) => { | |
| slidesStore.updateSlide({ remark: content }) | |
| } | |
| const resize = (e: MouseEvent) => { | |
| let isMouseDown = true | |
| const startPageY = e.pageY | |
| const originHeight = props.height | |
| document.onmousemove = e => { | |
| if (!isMouseDown) return | |
| const currentPageY = e.pageY | |
| const moveY = currentPageY - startPageY | |
| let newHeight = -moveY + originHeight | |
| if (newHeight < 40) newHeight = 40 | |
| if (newHeight > 360) newHeight = 360 | |
| emit('update:height', newHeight) | |
| } | |
| document.onmouseup = () => { | |
| isMouseDown = false | |
| document.onmousemove = null | |
| document.onmouseup = null | |
| } | |
| } | |
| </script> | |
| <style lang="scss" scoped> | |
| .remark { | |
| position: relative; | |
| border-top: 1px solid $borderColor; | |
| } | |
| .resize-handler { | |
| height: 7px; | |
| position: absolute; | |
| top: -3px; | |
| left: 0; | |
| right: 0; | |
| cursor: n-resize; | |
| z-index: 2; | |
| } | |
| </style> |