@sovann72-dev/lynqify-ui 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/NoteEditor/BatchImageGalleryNodeView.d.ts +19 -0
- package/dist/components/RichTextEditor/Extension/Indent/backspace.indent.handlers.d.ts +18 -0
- package/dist/components/RichTextEditor/Extension/Indent/indent.extension.d.ts +26 -0
- package/dist/components/RichTextEditor/Extension/Indent/indent.handlers.d.ts +16 -0
- package/{src/components/RichTextEditor/Extension/Indent/indent.types.ts → dist/components/RichTextEditor/Extension/Indent/indent.types.d.ts} +10 -35
- package/dist/components/RichTextEditor/Extension/Indent/indent.utils.d.ts +8 -0
- package/dist/components/RichTextEditor/Extension/Indent/outdent.handlers.d.ts +6 -0
- package/dist/components/RichTextEditor/Extension/Indent/shifttab.indent.handlers.d.ts +18 -0
- package/dist/components/RichTextEditor/Extension/Indent/tab.indent.handlers.d.ts +21 -0
- package/dist/components/RichTextEditor/Extension/List/custom-list-item.extension.d.ts +17 -0
- package/dist/components/RichTextEditor/Extension/List/dynamic-bullet-styling.extension.d.ts +2 -0
- package/dist/components/RichTextEditor/Extension/batch-segment-images.extension.d.ts +19 -0
- package/dist/components/RichTextEditor/Extension/batch-segment-images.types.d.ts +33 -0
- package/dist/components/RichTextEditor/Extension/custom-image.extension.d.ts +4 -0
- package/dist/components/RichTextEditor/Extension/custom-link.extension.d.ts +3 -0
- package/dist/components/RichTextEditor/Extension/custom-mention.extension.d.ts +3 -0
- package/dist/components/RichTextEditor/Extension/custom-paragraph.extension.d.ts +6 -0
- package/dist/components/RichTextEditor/Extension/extensions.d.ts +4 -0
- package/dist/components/RichTextEditor/Extension/file-filtering.extension.d.ts +1 -0
- package/dist/components/RichTextEditor/Extension/list-indent-integration.extension.d.ts +2 -0
- package/dist/components/RichTextEditor/Extension/mentionstorage.extension.d.ts +9 -0
- package/dist/components/RichTextEditor/Extension/tiptap-extension-fontsize.d.ts +21 -0
- package/dist/components/RichTextEditor/Extension/tiptap-extension-lineheight.d.ts +21 -0
- package/{src/index.ts → dist/index.d.ts} +5 -17
- package/dist/lynqify-ui.js +3264 -0
- package/dist/lynqify-ui.umd.cjs +30 -0
- package/package.json +60 -31
- package/src/components/RichTextEditor/Extension/Indent/backspace.indent.handlers.ts +0 -77
- package/src/components/RichTextEditor/Extension/Indent/indent.extension.ts +0 -285
- package/src/components/RichTextEditor/Extension/Indent/indent.handlers.ts +0 -121
- package/src/components/RichTextEditor/Extension/Indent/indent.utils.ts +0 -8
- package/src/components/RichTextEditor/Extension/Indent/outdent.handlers.ts +0 -71
- package/src/components/RichTextEditor/Extension/Indent/shifttab.indent.handlers.ts +0 -133
- package/src/components/RichTextEditor/Extension/Indent/tab.indent.handlers.ts +0 -103
- package/src/components/RichTextEditor/Extension/List/custom-list-item.extension.ts +0 -107
- package/src/components/RichTextEditor/Extension/List/dynamic-bullet-styling.extension.ts +0 -40
- package/src/components/RichTextEditor/Extension/batch-segment-images.extension.ts +0 -486
- package/src/components/RichTextEditor/Extension/batch-segment-images.types.ts +0 -35
- package/src/components/RichTextEditor/Extension/custom-image.extension.ts +0 -18
- package/src/components/RichTextEditor/Extension/custom-link.extension.ts +0 -58
- package/src/components/RichTextEditor/Extension/custom-mention.extension.ts +0 -29
- package/src/components/RichTextEditor/Extension/custom-paragraph.extension.ts +0 -46
- package/src/components/RichTextEditor/Extension/extensions.ts +0 -118
- package/src/components/RichTextEditor/Extension/file-filtering.extension.ts +0 -0
- package/src/components/RichTextEditor/Extension/list-indent-integration.extension.ts +0 -125
- package/src/components/RichTextEditor/Extension/mentionstorage.extension.ts +0 -10
- package/src/components/RichTextEditor/Extension/tiptap-extension-fontsize.ts +0 -73
- package/src/components/RichTextEditor/Extension/tiptap-extension-lineheight.ts +0 -73
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import Bold from '@tiptap/extension-bold';
|
|
2
|
-
import Color from '@tiptap/extension-color';
|
|
3
|
-
import Document from '@tiptap/extension-document';
|
|
4
|
-
import FileHandler from '@tiptap/extension-file-handler';
|
|
5
|
-
import HardBreak from '@tiptap/extension-hard-break';
|
|
6
|
-
import Heading from '@tiptap/extension-heading';
|
|
7
|
-
import Highlight from '@tiptap/extension-highlight';
|
|
8
|
-
import Image from '@tiptap/extension-image';
|
|
9
|
-
import Italic from '@tiptap/extension-italic';
|
|
10
|
-
import Link from '@tiptap/extension-link';
|
|
11
|
-
import {
|
|
12
|
-
BulletList,
|
|
13
|
-
OrderedList,
|
|
14
|
-
ListItem,
|
|
15
|
-
ListKeymap,
|
|
16
|
-
TaskList,
|
|
17
|
-
TaskItem,
|
|
18
|
-
} from '@tiptap/extension-list';
|
|
19
|
-
import Mention from '@tiptap/extension-mention';
|
|
20
|
-
import Paragraph from '@tiptap/extension-paragraph';
|
|
21
|
-
import { Table, TableCell, TableHeader, TableRow } from '@tiptap/extension-table';
|
|
22
|
-
import Text from '@tiptap/extension-text';
|
|
23
|
-
import TextAlign from '@tiptap/extension-text-align';
|
|
24
|
-
import { TextStyle } from '@tiptap/extension-text-style';
|
|
25
|
-
import Underline from '@tiptap/extension-underline';
|
|
26
|
-
import { CharacterCount, Placeholder, UndoRedo as History } from '@tiptap/extensions';
|
|
27
|
-
import { CustomParagraph } from '@/components/RichTextEditor/Extension/custom-paragraph.extension';
|
|
28
|
-
import { IndentExtension } from '@/components/RichTextEditor/Extension/Indent/indent.extension';
|
|
29
|
-
import {
|
|
30
|
-
CustomListItem,
|
|
31
|
-
CustomBulletList,
|
|
32
|
-
CustomOrderedList,
|
|
33
|
-
} from '@/components/RichTextEditor/Extension/List/custom-list-item.extension';
|
|
34
|
-
import { DynamicBulletStyling } from '@/components/RichTextEditor/Extension/List/dynamic-bullet-styling.extension';
|
|
35
|
-
import { ListIndentIntegration } from '@/components/RichTextEditor/Extension/list-indent-integration.extension';
|
|
36
|
-
import { FontSize } from '@/components/RichTextEditor/Extension/tiptap-extension-fontsize';
|
|
37
|
-
import { LineHeight } from '@/components/RichTextEditor/Extension/tiptap-extension-lineheight';
|
|
38
|
-
|
|
39
|
-
export const ALL_EXTENSIONS = [
|
|
40
|
-
Bold,
|
|
41
|
-
CharacterCount,
|
|
42
|
-
Color,
|
|
43
|
-
Document,
|
|
44
|
-
FileHandler,
|
|
45
|
-
Heading,
|
|
46
|
-
Highlight,
|
|
47
|
-
Image,
|
|
48
|
-
Link,
|
|
49
|
-
ListItem,
|
|
50
|
-
ListKeymap,
|
|
51
|
-
Mention,
|
|
52
|
-
OrderedList,
|
|
53
|
-
Placeholder,
|
|
54
|
-
Table,
|
|
55
|
-
TableCell,
|
|
56
|
-
TableHeader,
|
|
57
|
-
TableRow,
|
|
58
|
-
TaskItem,
|
|
59
|
-
TaskList,
|
|
60
|
-
TextAlign,
|
|
61
|
-
TextStyle,
|
|
62
|
-
Underline,
|
|
63
|
-
|
|
64
|
-
// Missing from BASE_EXTENSIONS
|
|
65
|
-
Paragraph,
|
|
66
|
-
Text,
|
|
67
|
-
Italic,
|
|
68
|
-
// Gapcursor,
|
|
69
|
-
HardBreak,
|
|
70
|
-
History,
|
|
71
|
-
CustomListItem,
|
|
72
|
-
FontSize,
|
|
73
|
-
LineHeight,
|
|
74
|
-
BulletList,
|
|
75
|
-
DynamicBulletStyling,
|
|
76
|
-
];
|
|
77
|
-
|
|
78
|
-
export const BASE_EXTENSIONS = [
|
|
79
|
-
CustomParagraph, // CONVENTION - Replaces Paragraph with selectable indent spacing (T006-T007)
|
|
80
|
-
TextStyle,
|
|
81
|
-
Color,
|
|
82
|
-
History.configure({
|
|
83
|
-
// T012, T091: Pause-based undo/redo granularity (FR-032, FR-033)
|
|
84
|
-
// Verified: Rapid Tab presses within 500ms are grouped as single undo unit
|
|
85
|
-
// This matches Google Docs behavior (spec requirement)
|
|
86
|
-
newGroupDelay: 500, // Group operations within 500ms window
|
|
87
|
-
depth: 100, // Max undo stack depth
|
|
88
|
-
}),
|
|
89
|
-
// COMMENTED OUT TEMPORARILY THE GAPCURSOR FIRST BECAUSE WE DON'T NEED VISUAL EFFECT FROM GAPCUROSR AND WE DO CUSTOM IMAGES CURSOR ANYWAY. UNCOMMENT IT IF NEEDED LATER.
|
|
90
|
-
// Gapcursor,
|
|
91
|
-
HardBreak,
|
|
92
|
-
Underline,
|
|
93
|
-
Bold,
|
|
94
|
-
Italic,
|
|
95
|
-
TaskItem,
|
|
96
|
-
CustomListItem, // T011: ListItem with indent attribute
|
|
97
|
-
Document,
|
|
98
|
-
Text,
|
|
99
|
-
FontSize,
|
|
100
|
-
LineHeight,
|
|
101
|
-
CustomBulletList, // T009: BulletList with indent attribute
|
|
102
|
-
// No custom keymap, just dynamic styling
|
|
103
|
-
DynamicBulletStyling,
|
|
104
|
-
ListIndentIntegration, // T029: Indent attribute transfer (FR-020, FR-021, FR-023)
|
|
105
|
-
|
|
106
|
-
TextAlign.configure({
|
|
107
|
-
types: ['heading', 'paragraph'],
|
|
108
|
-
}),
|
|
109
|
-
CustomOrderedList.configure({
|
|
110
|
-
// T010: OrderedList with indent attribute
|
|
111
|
-
itemTypeName: 'listItem',
|
|
112
|
-
keepMarks: true,
|
|
113
|
-
keepAttributes: true,
|
|
114
|
-
}),
|
|
115
|
-
|
|
116
|
-
// Must be last to have highest keyboard shortcut priority
|
|
117
|
-
IndentExtension,
|
|
118
|
-
];
|
|
File without changes
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* List-Indent Integration Extension
|
|
3
|
-
*
|
|
4
|
-
* Handles indent attribute transfer between paragraphs and lists.
|
|
5
|
-
* Includes paste handling for external content (Google Docs, Word).
|
|
6
|
-
*
|
|
7
|
-
* **Core Behavior (FR-020, FR-021, FR-023):**
|
|
8
|
-
* - When paragraph with indent becomes list → indent transfers to listItem
|
|
9
|
-
* - Paragraph inside list loses indent attribute
|
|
10
|
-
* - List maintains paragraph's indent level
|
|
11
|
-
*
|
|
12
|
-
* **Paste Handling (FR-026, FR-027, FR-028):**
|
|
13
|
-
* - T088: Detects Google Docs nested lists, preserves 1:1 nesting
|
|
14
|
-
* - T089: Parses Word paragraph indents (padding/margin) into indent levels
|
|
15
|
-
* - T090: Normalizes external glyph styles (I, II, III → 1, 2, 3)
|
|
16
|
-
*
|
|
17
|
-
* **Implementation via ProseMirror appendTransaction plugin**
|
|
18
|
-
* - Monitors document changes
|
|
19
|
-
* - Detects indented paragraphs inside lists
|
|
20
|
-
* - Transfers indent from paragraph to parent list
|
|
21
|
-
* - Clears paragraph indent attribute
|
|
22
|
-
*
|
|
23
|
-
* @see specs/001-richtext-indent-lists/research.md (Decision 1, Decision 4)
|
|
24
|
-
* @see specs/001-richtext-indent-lists/data-model.md (State Transition Rules)
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import { Extension } from '@tiptap/core';
|
|
28
|
-
import { Plugin, Transaction } from '@tiptap/pm/state';
|
|
29
|
-
|
|
30
|
-
const isListParent = (name: string) => name === 'bulletList' || name === 'orderedList';
|
|
31
|
-
const isTextNode = (name: string) => name === 'paragraph' || name === 'heading';
|
|
32
|
-
|
|
33
|
-
export const ListIndentIntegration = Extension.create({
|
|
34
|
-
name: 'listIndentIntegration',
|
|
35
|
-
|
|
36
|
-
addProseMirrorPlugins() {
|
|
37
|
-
return [
|
|
38
|
-
// Indent attribute transfer plugin
|
|
39
|
-
new Plugin({
|
|
40
|
-
appendTransaction: (transactions, oldState, newState) => {
|
|
41
|
-
// Only process if document changed
|
|
42
|
-
if (!transactions.find((t) => t.docChanged)) {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let tr: Transaction | null = null;
|
|
47
|
-
|
|
48
|
-
// Scan document for indented paragraphs inside list items
|
|
49
|
-
newState.doc.descendants((node, pos) => {
|
|
50
|
-
// Find indented text nodes (paragraph/heading)
|
|
51
|
-
if (isTextNode(node.type.name) && (node?.attrs?.indent ?? 0) > 0) {
|
|
52
|
-
const resolvedPos = newState.doc.resolve(pos);
|
|
53
|
-
const parent = resolvedPos.parent;
|
|
54
|
-
|
|
55
|
-
// If paragraph is inside a list item, transfer indent
|
|
56
|
-
if (parent.type.name === 'listItem') {
|
|
57
|
-
// Find the bulletList/orderedList ancestor
|
|
58
|
-
let listPos = null;
|
|
59
|
-
for (let d = resolvedPos.depth - 1; d > 0; d--) {
|
|
60
|
-
const ancestorNode = resolvedPos.node(d);
|
|
61
|
-
if (isListParent(ancestorNode.type.name)) {
|
|
62
|
-
// Get position of list node
|
|
63
|
-
listPos = resolvedPos.start(d) - 1;
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (listPos !== null && listPos >= 0) {
|
|
69
|
-
// Create transaction if needed
|
|
70
|
-
if (!tr) {
|
|
71
|
-
tr = newState.tr;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const existingIndent = node.attrs.indent;
|
|
75
|
-
|
|
76
|
-
// FR-021: Remove indent from paragraph inside list
|
|
77
|
-
tr.setNodeAttribute(pos, 'indent', 0);
|
|
78
|
-
|
|
79
|
-
// FR-020: Transfer indent to parent list
|
|
80
|
-
tr.setNodeAttribute(listPos, 'indent', existingIndent);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
return tr;
|
|
87
|
-
},
|
|
88
|
-
}),
|
|
89
|
-
|
|
90
|
-
// T088, T089, T090: Paste transformation plugin
|
|
91
|
-
new Plugin({
|
|
92
|
-
props: {
|
|
93
|
-
transformPastedHTML(html) {
|
|
94
|
-
// T089: FR-027 - Parse Word paragraph indents (padding/margin)
|
|
95
|
-
// Convert padding-left or margin-left to indent attributes
|
|
96
|
-
const wordIndentRegex =
|
|
97
|
-
/<p[^>]*style="[^"]*(?:padding|margin)-left:\s*(\d+)(?:px|pt|em)[^"]*"[^>]*>/gi;
|
|
98
|
-
html = html.replace(wordIndentRegex, (match, pixels) => {
|
|
99
|
-
const indentLevel = Math.floor(parseInt(pixels, 10) / 40); // 40px ≈ 1 indent level
|
|
100
|
-
return `<p data-indent="${indentLevel}">`;
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// T090: FR-028 - Normalize glyph styles (Roman numerals → Arabic)
|
|
104
|
-
// Convert list-style-type attributes to default (1, 2, 3)
|
|
105
|
-
const romanStyleRegex =
|
|
106
|
-
/<ol[^>]*style="[^"]*list-style-type:\s*(upper-roman|lower-roman|upper-alpha|lower-alpha)[^"]*"[^>]*>/gi;
|
|
107
|
-
html = html.replace(romanStyleRegex, () => {
|
|
108
|
-
// Remove the style attribute, defaulting to standard 1, 2, 3
|
|
109
|
-
return '<ol>';
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
// Normalize list-style-type in li elements as well
|
|
113
|
-
const liStyleRegex = /<li[^>]*style="[^"]*list-style-type:\s*[^;"\s]+[^"]*"[^>]*>/gi;
|
|
114
|
-
html = html.replace(liStyleRegex, (match) => {
|
|
115
|
-
// Strip list-style-type from li elements
|
|
116
|
-
return match.replace(/list-style-type:\s*[^;"\s]+;?/gi, '');
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
return html;
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
}),
|
|
123
|
-
];
|
|
124
|
-
},
|
|
125
|
-
});
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { Extension } from '@tiptap/core';
|
|
2
|
-
import '@tiptap/extension-text-style';
|
|
3
|
-
|
|
4
|
-
type FontSizeOptions = {
|
|
5
|
-
types: string[];
|
|
6
|
-
getStyle: (fontSize: string) => string;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
declare module '@tiptap/core' {
|
|
10
|
-
interface Commands<ReturnType> {
|
|
11
|
-
fontSize: {
|
|
12
|
-
/**
|
|
13
|
-
* Set the font size attribute
|
|
14
|
-
*/
|
|
15
|
-
setFontSize: (size: string) => ReturnType;
|
|
16
|
-
/**
|
|
17
|
-
* Unset the font size attribute
|
|
18
|
-
*/
|
|
19
|
-
unsetFontSize: () => ReturnType;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const FontSize = Extension.create<FontSizeOptions>({
|
|
25
|
-
name: 'fontSize',
|
|
26
|
-
|
|
27
|
-
addOptions(): FontSizeOptions {
|
|
28
|
-
return {
|
|
29
|
-
types: ['textStyle'],
|
|
30
|
-
getStyle: (fontSize: string) => {
|
|
31
|
-
return `font-size: ${fontSize}`;
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
addGlobalAttributes() {
|
|
37
|
-
return [
|
|
38
|
-
{
|
|
39
|
-
types: this.options.types,
|
|
40
|
-
attributes: {
|
|
41
|
-
fontSize: {
|
|
42
|
-
default: null,
|
|
43
|
-
parseHTML: (element) => element.style.fontSize.replace(/['"]+/g, ''),
|
|
44
|
-
renderHTML: (attributes) => {
|
|
45
|
-
if (!attributes.fontSize) {
|
|
46
|
-
return {};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
style: this.options.getStyle(attributes.fontSize),
|
|
51
|
-
};
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
];
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
addCommands() {
|
|
60
|
-
return {
|
|
61
|
-
setFontSize:
|
|
62
|
-
(fontSize) =>
|
|
63
|
-
({ chain }) => {
|
|
64
|
-
return chain().setMark('textStyle', { fontSize }).run();
|
|
65
|
-
},
|
|
66
|
-
unsetFontSize:
|
|
67
|
-
() =>
|
|
68
|
-
({ chain }) => {
|
|
69
|
-
return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
},
|
|
73
|
-
});
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { Extension } from '@tiptap/core';
|
|
2
|
-
import '@tiptap/extension-text-style';
|
|
3
|
-
|
|
4
|
-
type LineHeightOptions = {
|
|
5
|
-
types: string[];
|
|
6
|
-
getStyle: (lineHeight: string) => string;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
declare module '@tiptap/core' {
|
|
10
|
-
interface Commands<ReturnType> {
|
|
11
|
-
lineHeight: {
|
|
12
|
-
/**
|
|
13
|
-
* Set the line height attribute
|
|
14
|
-
*/
|
|
15
|
-
setLineHeight: (lineHeight: string) => ReturnType;
|
|
16
|
-
/**
|
|
17
|
-
* Unset the line height attribute
|
|
18
|
-
*/
|
|
19
|
-
unsetLineHeight: () => ReturnType;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const LineHeight = Extension.create<LineHeightOptions>({
|
|
25
|
-
name: 'lineHeight',
|
|
26
|
-
|
|
27
|
-
addOptions(): LineHeightOptions {
|
|
28
|
-
return {
|
|
29
|
-
types: ['textStyle'],
|
|
30
|
-
getStyle: (lineHeight: string) => {
|
|
31
|
-
return `line-height: ${lineHeight};`;
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
addGlobalAttributes() {
|
|
37
|
-
return [
|
|
38
|
-
{
|
|
39
|
-
types: this.options.types,
|
|
40
|
-
attributes: {
|
|
41
|
-
lineHeight: {
|
|
42
|
-
default: null,
|
|
43
|
-
parseHTML: (element) => element.style.lineHeight.replace(/['"]+/g, ''),
|
|
44
|
-
renderHTML: (attributes) => {
|
|
45
|
-
if (!attributes.lineHeight) {
|
|
46
|
-
return {};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
style: this.options.getStyle(attributes.lineHeight),
|
|
51
|
-
};
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
];
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
addCommands() {
|
|
60
|
-
return {
|
|
61
|
-
setLineHeight:
|
|
62
|
-
(lineHeight) =>
|
|
63
|
-
({ chain }) => {
|
|
64
|
-
return chain().setMark('textStyle', { lineHeight }).run();
|
|
65
|
-
},
|
|
66
|
-
unsetLineHeight:
|
|
67
|
-
() =>
|
|
68
|
-
({ chain }) => {
|
|
69
|
-
return chain().setMark('textStyle', { lineHeight: null }).removeEmptyTextStyle().run();
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
},
|
|
73
|
-
});
|