import { ref, Ref, h, defineComponent, onMounted, onBeforeUnmount, PropType, computed, watchEffect, } from 'vue'; import { useFormattingToolbar } from './use-formatting-toolbar'; export const SbRichText = defineComponent({ name: 'sb-rich-text', props: { inputRef: { type: (null as unknown) as PropType>, default: ref(null), }, tag: { type: String, default: 'p' }, value: { type: String, default: '' }, onValueChange: { type: (null as unknown) as PropType<(value: string) => void>, default: (_:string) => {}, }, }, setup(props) { const { registerClient, unregisterClient, } = useFormattingToolbar(); const onKeydown = (event: KeyboardEvent) => { if (['Delete', 'Backspace'].indexOf(event.key) < 0) { return; } if (props.inputRef.value?.textContent === '') { props.inputRef.value.innerHTML = ''; } }; onMounted(() => { registerClient(props.inputRef.value!); }); onBeforeUnmount(() => { unregisterClient(props.inputRef.value!); }); return () => h( props.tag, { class: 'sb-contenteditable', contenteditable: 'true', ref: props.inputRef, onKeydown, onInput: () => { props.onValueChange(props.inputRef.value?.innerHTML || ''); }, }, ); }, });