import '@tiptap/extension-text-style' import { Extension } from '@tiptap/core' export type BackgroundColorOptions = { types: string[], } declare module '@tiptap/core' { interface Commands { backgroundColor: { /** * Set the text background color */ setBackgroundColor: (backgroundColor: string) => ReturnType, /** * Unset the text background color */ unsetBackgroundColor: () => ReturnType, } } } export const BackgroundColor = Extension.create({ name: 'backgroundColor', addOptions() { return { types: ['textStyle'], } }, addGlobalAttributes() { return [ { types: this.options.types, attributes: { backgroundColor: { default: null, parseHTML: element => element.style.backgroundColor?.replace(/['"]+/g, ''), renderHTML: attributes => { if (!attributes.backgroundColor) { return {} } return { style: `background-color: ${attributes.backgroundColor}`, } }, }, }, }, ] }, addCommands() { return { setBackgroundColor: backgroundColor => ({ chain }) => { return chain() .setMark('textStyle', { backgroundColor }) .run() }, unsetBackgroundColor: () => ({ chain }) => { return chain() .setMark('textStyle', { backgroundColor: null }) .removeEmptyTextStyle() .run() }, } }, })