schlechtenburg/packages/paragraph/lib/edit.tsx

68 lines
1.2 KiB
TypeScript
Raw Normal View History

2020-05-20 14:21:08 +00:00
import {
2020-12-30 01:32:46 +00:00
defineComponent,
2020-05-20 14:21:08 +00:00
reactive,
2020-05-24 20:39:14 +00:00
computed,
2020-05-20 14:21:08 +00:00
ref,
2020-05-24 15:33:25 +00:00
Ref,
2020-05-20 14:21:08 +00:00
onMounted,
2020-05-24 20:00:14 +00:00
PropType,
2020-12-27 21:32:43 +00:00
} from 'vue';
2020-05-24 20:00:14 +00:00
import {
getDefaultData,
ParagraphData,
2020-05-24 20:39:14 +00:00
} from './util';
2020-05-24 20:00:14 +00:00
import './style.scss';
2020-05-20 14:21:08 +00:00
2020-12-30 01:32:46 +00:00
export default defineComponent({
2020-05-24 20:00:14 +00:00
name: 'sb-paragraph-edit',
2020-05-20 14:21:08 +00:00
model: {
prop: 'block',
event: 'update',
},
2020-05-20 14:21:08 +00:00
props: {
2021-03-08 15:29:35 +00:00
blockId: { type: String, required: true },
2020-05-24 20:00:14 +00:00
data: {
type: (null as unknown) as PropType<ParagraphData>,
default: getDefaultData,
},
2020-05-20 14:21:08 +00:00
},
2021-03-08 15:29:35 +00:00
setup(props) {
2020-05-25 21:10:21 +00:00
const localData = (reactive({
2020-05-24 15:33:25 +00:00
value: props.data.value,
2020-05-24 20:39:14 +00:00
align: props.data.align,
2020-05-24 15:33:25 +00:00
focused: false,
2020-05-27 15:06:14 +00:00
}) as unknown) as {
2020-05-25 21:10:21 +00:00
value: string;
align: string;
focused: boolean;
};
2020-05-24 20:39:14 +00:00
2020-05-24 15:33:25 +00:00
const inputEl: Ref<null|HTMLElement> = ref(null);
onMounted(() => {
if (inputEl.value) {
inputEl.value.innerHTML = localData.value;
}
});
2020-05-20 14:21:08 +00:00
2020-05-24 20:39:14 +00:00
const classes = computed(() => ({
2020-05-20 14:21:08 +00:00
'sb-paragraph': true,
2020-05-24 15:33:25 +00:00
'sb-paragraph_focused': localData.focused,
2020-05-24 20:39:14 +00:00
[`sb-paragraph_align-${localData.align}`]: true,
}));
2020-05-20 14:21:08 +00:00
2020-05-25 21:10:21 +00:00
return () => (
<div class={classes.value}>
2020-05-20 14:21:08 +00:00
<p
2020-05-25 21:10:21 +00:00
class="sb-paragraph__input"
ref={inputEl}
2020-05-20 14:21:08 +00:00
contenteditable
></p>
2020-05-24 15:33:25 +00:00
</div>
2020-05-20 14:21:08 +00:00
);
},
2020-12-30 01:32:46 +00:00
});