diff --git a/docs/src/demos/Marks/TextStyle/index.spec.js b/docs/src/demos/Marks/TextStyle/index.spec.js new file mode 100644 index 00000000..e5e31a5b --- /dev/null +++ b/docs/src/demos/Marks/TextStyle/index.spec.js @@ -0,0 +1,5 @@ +context('/api/marks/text-style', () => { + before(() => { + cy.visit('/api/marks/text-style') + }) +}) diff --git a/docs/src/demos/Marks/TextStyle/index.vue b/docs/src/demos/Marks/TextStyle/index.vue new file mode 100644 index 00000000..5a26fbfb --- /dev/null +++ b/docs/src/demos/Marks/TextStyle/index.vue @@ -0,0 +1,81 @@ + + + diff --git a/docs/src/docPages/api/extensions/font-family.md b/docs/src/docPages/api/extensions/font-family.md new file mode 100644 index 00000000..08c86b2a --- /dev/null +++ b/docs/src/docPages/api/extensions/font-family.md @@ -0,0 +1,26 @@ +# FontFamily +This extension enables you to set the font family in the editor. + +## Installation +::: warning Use with TextStyle +This extension requires the [`TextStyle`](/api/marks/text-style) mark. +::: + +```bash +# with npm +npm install @tiptap/extension-text-style @tiptap/extension-font-family + +# with Yarn +yarn add @tiptap/extension-text-style @tiptap/extension-font-family +``` + +## Settings +| Option | Type | Default | Description | +| ------ | ----- | ------------- | --------------------------------------------------------------------- | +| types | array | ['textStyle'] | A list of marks where the font family attribute should be applied to. | + +## Source code +[packages/extension-font-family/](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-font-family/) + +## Usage + diff --git a/docs/src/docPages/api/marks/text-style.md b/docs/src/docPages/api/marks/text-style.md new file mode 100644 index 00000000..9c1aaac0 --- /dev/null +++ b/docs/src/docPages/api/marks/text-style.md @@ -0,0 +1,17 @@ +# Text Style +This mark renders a `` HTML tag and enables you to add a list of styling related attributes, for example font-family, font-size, or font-color. The extension doesn’t add any styling attribute by default, but other extensions use it as the foundation, for example [`FontFamily`](/api/extensions/font-family). + +## Installation +```bash +# with npm +npm install @tiptap/extension-text-style + +# with Yarn +yarn add @tiptap/extension-text-style +``` + +## Source code +[packages/extension-text-style/](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-text-style/) + +## Usage + diff --git a/docs/src/docPages/api/nodes/bullet-list.md b/docs/src/docPages/api/nodes/bullet-list.md index 6f5fff6c..b6f85546 100644 --- a/docs/src/docPages/api/nodes/bullet-list.md +++ b/docs/src/docPages/api/nodes/bullet-list.md @@ -5,7 +5,7 @@ Type , or at the b ## Installation ::: warning Use with ListItem -This extension requires the [`ListItem`](/api/nodes/list-item) extension. +This extension requires the [`ListItem`](/api/nodes/list-item) node. ::: ```bash diff --git a/docs/src/docPages/api/nodes/list-item.md b/docs/src/docPages/api/nodes/list-item.md index 3fbc1f42..2f6408b2 100644 --- a/docs/src/docPages/api/nodes/list-item.md +++ b/docs/src/docPages/api/nodes/list-item.md @@ -3,7 +3,7 @@ The ListItem extension adds support for the `
  • ` HTML tag. It’s used for bul ## Installation ::: warning Use with BulletList and/or OrderedList -This extension requires the [`BulletList`](/api/nodes/bullet-list) or [`OrderedList`](/api/nodes/ordered-list) extension. +This extension requires the [`BulletList`](/api/nodes/bullet-list) or [`OrderedList`](/api/nodes/ordered-list) node. ::: ```bash diff --git a/docs/src/docPages/api/nodes/ordered-list.md b/docs/src/docPages/api/nodes/ordered-list.md index 38dc26e7..5693ddb0 100644 --- a/docs/src/docPages/api/nodes/ordered-list.md +++ b/docs/src/docPages/api/nodes/ordered-list.md @@ -5,7 +5,7 @@ Type 1.  (or any other number followed by a dot) at the beginn ## Installation ::: warning Use with ListItem -This extension requires the [`ListItem`](/api/nodes/list-item) extension. +This extension requires the [`ListItem`](/api/nodes/list-item) node. ::: ```bash diff --git a/docs/src/docPages/api/nodes/task-item.md b/docs/src/docPages/api/nodes/task-item.md index 97aab620..82209b49 100644 --- a/docs/src/docPages/api/nodes/task-item.md +++ b/docs/src/docPages/api/nodes/task-item.md @@ -5,7 +5,7 @@ This extension doesn’t require any JavaScript framework, it’s based on plain ## Installation ::: warning Use with TaskList -This extension requires the [`TaskList`](/api/nodes/task-list) extension. +This extension requires the [`TaskList`](/api/nodes/task-list) node. ::: ```bash diff --git a/docs/src/links.yaml b/docs/src/links.yaml index 1211a4a4..ed2b93f5 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -112,6 +112,9 @@ link: /api/marks/link - title: Strike link: /api/marks/strike + - title: Text Style + link: /api/marks/text-style + draft: true - title: Underline link: /api/marks/underline - title: Extensions @@ -127,6 +130,9 @@ link: /api/extensions/dropcursor - title: Focus link: /api/extensions/focus + - title: FontFamily + link: /api/extensions/font-family + draft: true - title: Gapcursor link: /api/extensions/gapcursor - title: History diff --git a/packages/extension-font-family/index.ts b/packages/extension-font-family/index.ts new file mode 100644 index 00000000..00c2053a --- /dev/null +++ b/packages/extension-font-family/index.ts @@ -0,0 +1,55 @@ +import { Command, createExtension } from '@tiptap/core' + +type FontFamilyOptions = { + types: string[], +} + +const FontFamily = createExtension({ + defaultOptions: { + types: ['textStyle'], + }, + + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + fontFamily: { + default: null, + renderHTML: attributes => { + if (!attributes.fontFamily) { + return {} + } + + return { + style: `font-family: ${attributes.fontFamily}`, + } + }, + parseHTML: element => ({ + fontFamily: element.style.fontFamily.replace(/['"]+/g, ''), + }), + }, + }, + }, + ] + }, + + addCommands() { + return { + fontFamily: (fontFamily: string | null = null): Command => ({ chain }) => { + return chain() + .updateMarkAttributes('textStyle', { fontFamily }) + .removeEmptyTextStyle() + .run() + }, + } + }, +}) + +export default FontFamily + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + FontFamily: typeof FontFamily, + } +} diff --git a/packages/extension-font-family/package.json b/packages/extension-font-family/package.json new file mode 100644 index 00000000..66cab164 --- /dev/null +++ b/packages/extension-font-family/package.json @@ -0,0 +1,17 @@ +{ + "name": "@tiptap/extension-font-family", + "version": "1.0.0", + "source": "index.ts", + "main": "dist/tiptap-extension-font-family.js", + "umd:main": "dist/tiptap-extension-font-family.umd.js", + "module": "dist/tiptap-extension-font-family.mjs", + "unpkg": "dist/tiptap-extension-font-family.js", + "jsdelivr": "dist/tiptap-extension-font-family.js", + "files": [ + "src", + "dist" + ], + "peerDependencies": { + "@tiptap/core": "2.x" + } +} diff --git a/packages/extension-text-style/index.ts b/packages/extension-text-style/index.ts new file mode 100644 index 00000000..fb23f028 --- /dev/null +++ b/packages/extension-text-style/index.ts @@ -0,0 +1,50 @@ +import { Command, createMark, getMarkAttrs } from '@tiptap/core' + +const TextStyle = createMark({ + name: 'textStyle', + + parseHTML() { + return [ + { + tag: 'span', + getAttrs: element => { + const hasStyles = (element as HTMLElement).hasAttribute('style') + + if (!hasStyles) { + return false + } + + return {} + }, + }, + ] + }, + + renderHTML({ attributes }) { + return ['span', attributes, 0] + }, + + addCommands() { + return { + removeEmptyTextStyle: (): Command => ({ state, commands }) => { + const attributes = getMarkAttrs(state, this.type) + const hasStyles = Object.entries(attributes).every(([, value]) => !!value) + + if (hasStyles) { + return true + } + + return commands.removeMark('textStyle') + }, + } + }, + +}) + +export default TextStyle + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + TextStyle: typeof TextStyle, + } +} diff --git a/packages/extension-text-style/package.json b/packages/extension-text-style/package.json new file mode 100644 index 00000000..4e4d5187 --- /dev/null +++ b/packages/extension-text-style/package.json @@ -0,0 +1,17 @@ +{ + "name": "@tiptap/extension-text-style", + "version": "1.0.0", + "source": "index.ts", + "main": "dist/tiptap-extension-text-style.js", + "umd:main": "dist/tiptap-extension-text-style.umd.js", + "module": "dist/tiptap-extension-text-style.mjs", + "unpkg": "dist/tiptap-extension-text-style.js", + "jsdelivr": "dist/tiptap-extension-text-style.js", + "files": [ + "src", + "dist" + ], + "peerDependencies": { + "@tiptap/core": "2.x" + } +}