@blue-patterns/richtext 0.0.0-stage → 0.7.18
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/CHANGELOG.md +275 -0
- package/LICENSE +22 -0
- package/README.md +88 -2
- package/astryx.integration.mjs +11 -0
- package/blocks/RichTextEditorShowcase.template.mjs +13 -0
- package/blocks/RichTextEditorShowcase.tsx +19 -0
- package/dist/RichTextEditor.d.ts +282 -0
- package/dist/RichTextEditor.d.ts.map +1 -0
- package/dist/RichTextEditor.js +657 -0
- package/dist/RichTextEditorAutoLinkPlugin.d.ts +83 -0
- package/dist/RichTextEditorAutoLinkPlugin.d.ts.map +1 -0
- package/dist/RichTextEditorAutoLinkPlugin.js +99 -0
- package/dist/RichTextEditorToolbar.d.ts +186 -0
- package/dist/RichTextEditorToolbar.d.ts.map +1 -0
- package/dist/RichTextEditorToolbar.js +688 -0
- package/dist/RichTextView.d.ts +92 -0
- package/dist/RichTextView.d.ts.map +1 -0
- package/dist/RichTextView.js +267 -0
- package/dist/codeLanguages.d.ts +14 -0
- package/dist/codeLanguages.d.ts.map +1 -0
- package/dist/codeLanguages.js +34 -0
- package/dist/codeLineTokens.d.ts +53 -0
- package/dist/codeLineTokens.d.ts.map +1 -0
- package/dist/codeLineTokens.js +188 -0
- package/dist/editorNodes.d.ts +8 -0
- package/dist/editorNodes.d.ts.map +1 -0
- package/dist/editorNodes.js +30 -0
- package/dist/editorTheme.d.ts +7 -0
- package/dist/editorTheme.d.ts.map +1 -0
- package/dist/editorTheme.js +328 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/internal/CodeBackspacePlugin.d.ts +2 -0
- package/dist/internal/CodeBackspacePlugin.d.ts.map +1 -0
- package/dist/internal/CodeBackspacePlugin.js +70 -0
- package/dist/internal/CodeBlockHeaderPlugin.d.ts +11 -0
- package/dist/internal/CodeBlockHeaderPlugin.d.ts.map +1 -0
- package/dist/internal/CodeBlockHeaderPlugin.js +204 -0
- package/dist/internal/CodePastePlugin.d.ts +5 -0
- package/dist/internal/CodePastePlugin.d.ts.map +1 -0
- package/dist/internal/CodePastePlugin.js +104 -0
- package/dist/internal/CodeSyntaxPlugin.d.ts +8 -0
- package/dist/internal/CodeSyntaxPlugin.d.ts.map +1 -0
- package/dist/internal/CodeSyntaxPlugin.js +397 -0
- package/dist/internal/CodeTabPlugin.d.ts +2 -0
- package/dist/internal/CodeTabPlugin.d.ts.map +1 -0
- package/dist/internal/CodeTabPlugin.js +256 -0
- package/dist/internal/DisabledLinkGuardPlugin.d.ts +4 -0
- package/dist/internal/DisabledLinkGuardPlugin.d.ts.map +1 -0
- package/dist/internal/DisabledLinkGuardPlugin.js +93 -0
- package/dist/internal/ImageSourceCaretPlugin.d.ts +3 -0
- package/dist/internal/ImageSourceCaretPlugin.d.ts.map +1 -0
- package/dist/internal/ImageSourceCaretPlugin.js +105 -0
- package/dist/internal/ListItemShortcutsPlugin.d.ts +6 -0
- package/dist/internal/ListItemShortcutsPlugin.d.ts.map +1 -0
- package/dist/internal/ListItemShortcutsPlugin.js +314 -0
- package/dist/internal/MarkdownExtensionsPlugin.d.ts +17 -0
- package/dist/internal/MarkdownExtensionsPlugin.d.ts.map +1 -0
- package/dist/internal/MarkdownExtensionsPlugin.js +185 -0
- package/dist/internal/SelectAllScopePlugin.d.ts +2 -0
- package/dist/internal/SelectAllScopePlugin.d.ts.map +1 -0
- package/dist/internal/SelectAllScopePlugin.js +67 -0
- package/dist/internal/TableColumnFloorPlugin.d.ts +12 -0
- package/dist/internal/TableColumnFloorPlugin.d.ts.map +1 -0
- package/dist/internal/TableColumnFloorPlugin.js +84 -0
- package/dist/internal/TablePastePlugin.d.ts +9 -0
- package/dist/internal/TablePastePlugin.d.ts.map +1 -0
- package/dist/internal/TablePastePlugin.js +183 -0
- package/dist/internal/TableScrollRegionPlugin.d.ts +9 -0
- package/dist/internal/TableScrollRegionPlugin.d.ts.map +1 -0
- package/dist/internal/TableScrollRegionPlugin.js +95 -0
- package/dist/internal/TaskCheckboxPlugin.d.ts +7 -0
- package/dist/internal/TaskCheckboxPlugin.d.ts.map +1 -0
- package/dist/internal/TaskCheckboxPlugin.js +193 -0
- package/dist/internal/ToolbarLinkPopover.d.ts +74 -0
- package/dist/internal/ToolbarLinkPopover.d.ts.map +1 -0
- package/dist/internal/ToolbarLinkPopover.js +292 -0
- package/dist/linkEditing.d.ts +6 -0
- package/dist/linkEditing.d.ts.map +1 -0
- package/dist/linkEditing.js +20 -0
- package/dist/linkForm.d.ts +28 -0
- package/dist/linkForm.d.ts.map +1 -0
- package/dist/linkForm.js +137 -0
- package/dist/linkUtils.d.ts +27 -0
- package/dist/linkUtils.d.ts.map +1 -0
- package/dist/linkUtils.js +101 -0
- package/dist/markdown.d.ts +17 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +17 -0
- package/dist/markdownCharacterReferences.d.ts +135 -0
- package/dist/markdownCharacterReferences.d.ts.map +1 -0
- package/dist/markdownCharacterReferences.js +1127 -0
- package/dist/markdownCodeFence.d.ts +4 -0
- package/dist/markdownCodeFence.d.ts.map +1 -0
- package/dist/markdownCodeFence.js +167 -0
- package/dist/markdownExtensionNode.d.ts +88 -0
- package/dist/markdownExtensionNode.d.ts.map +1 -0
- package/dist/markdownExtensionNode.js +248 -0
- package/dist/markdownExtensions.d.ts +115 -0
- package/dist/markdownExtensions.d.ts.map +1 -0
- package/dist/markdownExtensions.js +392 -0
- package/dist/markdownHardLineBreak.d.ts +25 -0
- package/dist/markdownHardLineBreak.d.ts.map +1 -0
- package/dist/markdownHardLineBreak.js +59 -0
- package/dist/markdownHeading.d.ts +20 -0
- package/dist/markdownHeading.d.ts.map +1 -0
- package/dist/markdownHeading.js +30 -0
- package/dist/markdownLink.d.ts +5 -0
- package/dist/markdownLink.d.ts.map +1 -0
- package/dist/markdownLink.js +80 -0
- package/dist/markdownListExport.d.ts +3 -0
- package/dist/markdownListExport.d.ts.map +1 -0
- package/dist/markdownListExport.js +68 -0
- package/dist/markdownListIndentation.d.ts +8 -0
- package/dist/markdownListIndentation.d.ts.map +1 -0
- package/dist/markdownListIndentation.js +101 -0
- package/dist/markdownOrderedList.d.ts +3 -0
- package/dist/markdownOrderedList.d.ts.map +1 -0
- package/dist/markdownOrderedList.js +51 -0
- package/dist/markdownQuote.d.ts +22 -0
- package/dist/markdownQuote.d.ts.map +1 -0
- package/dist/markdownQuote.js +32 -0
- package/dist/markdownSerializers.d.ts +49 -0
- package/dist/markdownSerializers.d.ts.map +1 -0
- package/dist/markdownSerializers.js +83 -0
- package/dist/markdownSource.d.ts +71 -0
- package/dist/markdownSource.d.ts.map +1 -0
- package/dist/markdownSource.js +804 -0
- package/dist/markdownSpaceRuns.d.ts +24 -0
- package/dist/markdownSpaceRuns.d.ts.map +1 -0
- package/dist/markdownSpaceRuns.js +147 -0
- package/dist/markdownTable.d.ts +35 -0
- package/dist/markdownTable.d.ts.map +1 -0
- package/dist/markdownTable.js +227 -0
- package/dist/markdownTaskList.d.ts +48 -0
- package/dist/markdownTaskList.d.ts.map +1 -0
- package/dist/markdownTaskList.js +166 -0
- package/dist/markdownThematicBreak.d.ts +3 -0
- package/dist/markdownThematicBreak.d.ts.map +1 -0
- package/dist/markdownThematicBreak.js +55 -0
- package/dist/privateAttributes/layerPortalBoundary.stylex.d.ts +12 -0
- package/dist/privateAttributes/layerPortalBoundary.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/layerPortalBoundary.stylex.js +16 -0
- package/dist/richtext.css +213 -0
- package/dist/textSemantics.d.ts +3 -0
- package/dist/textSemantics.d.ts.map +1 -0
- package/dist/textSemantics.js +87 -0
- package/package.json +158 -3
- package/src/RichTextEditor.doc.mjs +308 -0
- package/src/RichTextEditor.tsx +1109 -0
- package/src/RichTextEditorAutoLinkPlugin.doc.mjs +43 -0
- package/src/RichTextEditorAutoLinkPlugin.tsx +126 -0
- package/src/RichTextEditorToolbar.doc.mjs +92 -0
- package/src/RichTextEditorToolbar.tsx +871 -0
- package/src/RichTextView.doc.mjs +101 -0
- package/src/RichTextView.tsx +351 -0
- package/src/codeLanguages.ts +42 -0
- package/src/codeLineTokens.ts +241 -0
- package/src/doc-mjs.d.ts +23 -0
- package/src/editorNodes.ts +44 -0
- package/src/editorTheme.ts +550 -0
- package/src/index.ts +59 -0
- package/src/internal/CodeBackspacePlugin.tsx +96 -0
- package/src/internal/CodeBlockHeaderPlugin.tsx +282 -0
- package/src/internal/CodePastePlugin.tsx +144 -0
- package/src/internal/CodeSyntaxPlugin.tsx +493 -0
- package/src/internal/CodeTabPlugin.tsx +298 -0
- package/src/internal/DisabledLinkGuardPlugin.tsx +93 -0
- package/src/internal/ImageSourceCaretPlugin.tsx +159 -0
- package/src/internal/ListItemShortcutsPlugin.tsx +404 -0
- package/src/internal/MarkdownExtensionsPlugin.tsx +289 -0
- package/src/internal/SelectAllScopePlugin.tsx +86 -0
- package/src/internal/TableColumnFloorPlugin.tsx +99 -0
- package/src/internal/TablePastePlugin.tsx +223 -0
- package/src/internal/TableScrollRegionPlugin.tsx +107 -0
- package/src/internal/TaskCheckboxPlugin.tsx +246 -0
- package/src/internal/ToolbarLinkPopover.tsx +392 -0
- package/src/linkEditing.ts +20 -0
- package/src/linkForm.tsx +156 -0
- package/src/linkUtils.ts +106 -0
- package/src/markdown.ts +25 -0
- package/src/markdownCharacterReferences.ts +1137 -0
- package/src/markdownCodeFence.ts +216 -0
- package/src/markdownExtensionNode.ts +339 -0
- package/src/markdownExtensions.ts +496 -0
- package/src/markdownHardLineBreak.ts +73 -0
- package/src/markdownHeading.ts +33 -0
- package/src/markdownLink.ts +86 -0
- package/src/markdownListExport.ts +85 -0
- package/src/markdownListIndentation.ts +105 -0
- package/src/markdownOrderedList.ts +60 -0
- package/src/markdownQuote.ts +35 -0
- package/src/markdownSerializers.ts +108 -0
- package/src/markdownSource.ts +1045 -0
- package/src/markdownSpaceRuns.ts +164 -0
- package/src/markdownTable.ts +309 -0
- package/src/markdownTaskList.ts +222 -0
- package/src/markdownThematicBreak.ts +66 -0
- package/src/privateAttributes/layerPortalBoundary.stylex.ts +18 -0
- package/src/textSemantics.ts +104 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file markdownThematicBreak.ts
|
|
5
|
+
* @input Uses @lexical/extension (HorizontalRuleNode), @lexical/markdown
|
|
6
|
+
* (ElementTransformer), and lexical.
|
|
7
|
+
* @output Exports THEMATIC_BREAK, the Markdown transformer that turns a
|
|
8
|
+
* thematic break line into a horizontal rule and writes a rule back as `---`.
|
|
9
|
+
* @position Part of DEFAULT_TRANSFORMERS (markdownTable.ts), ahead of
|
|
10
|
+
* Lexical's list transformers so `* * *` and `- - -` are rules, as in
|
|
11
|
+
* CommonMark. Matches core Markdown's thematic breaks (spec:AST-061 FR5).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
$createHorizontalRuleNode,
|
|
16
|
+
$isHorizontalRuleNode,
|
|
17
|
+
HorizontalRuleNode,
|
|
18
|
+
} from '@lexical/extension';
|
|
19
|
+
import type {ElementTransformer} from '@lexical/markdown';
|
|
20
|
+
import {$isParagraphNode, $isTextNode} from 'lexical';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Three or more `-`, `*`, or `_` of one kind, optionally spaced, indented at
|
|
24
|
+
* most three spaces (CommonMark 0.31, thematic breaks).
|
|
25
|
+
*/
|
|
26
|
+
const THEMATIC_BREAK_LINE = /^ {0,3}([-*_])(?:[ \t]*\1){2,}[ \t]*$/;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* A setext heading underline made of dashes: no spaces between them, so
|
|
30
|
+
* `- - -` under a paragraph is still a thematic break (CommonMark 0.31).
|
|
31
|
+
*/
|
|
32
|
+
const SETEXT_UNDERLINE = /^ {0,3}-+[ \t]*$/;
|
|
33
|
+
|
|
34
|
+
export const THEMATIC_BREAK: ElementTransformer = {
|
|
35
|
+
dependencies: [HorizontalRuleNode],
|
|
36
|
+
export: node => ($isHorizontalRuleNode(node) ? '---' : null),
|
|
37
|
+
regExp: THEMATIC_BREAK_LINE,
|
|
38
|
+
replace: (parentNode, children, match, isImport) => {
|
|
39
|
+
// A dash line right under a paragraph line underlines it as a heading
|
|
40
|
+
// (setext) rather than breaking. Lexical has already cut the matched text
|
|
41
|
+
// out of the line; put it back and leave the line to the paragraph, which
|
|
42
|
+
// keeps it as literal text.
|
|
43
|
+
const previous = parentNode.getPreviousSibling();
|
|
44
|
+
if (
|
|
45
|
+
isImport &&
|
|
46
|
+
SETEXT_UNDERLINE.test(match[0]) &&
|
|
47
|
+
$isParagraphNode(previous) &&
|
|
48
|
+
previous.getTextContentSize() > 0
|
|
49
|
+
) {
|
|
50
|
+
const [line] = children;
|
|
51
|
+
if ($isTextNode(line)) {
|
|
52
|
+
// The pattern is anchored to the whole line, so its match is the line.
|
|
53
|
+
line.setTextContent(match[0]);
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const rule = $createHorizontalRuleNode();
|
|
58
|
+
if (isImport || parentNode.getNextSibling() != null) {
|
|
59
|
+
parentNode.replace(rule);
|
|
60
|
+
} else {
|
|
61
|
+
parentNode.insertBefore(rule);
|
|
62
|
+
}
|
|
63
|
+
rule.selectNext();
|
|
64
|
+
},
|
|
65
|
+
type: 'element',
|
|
66
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file privateAttributes/layerPortalBoundary.stylex.ts
|
|
5
|
+
* @input The editable root Lexical reconciles
|
|
6
|
+
* @output rendererManagedRootProps, which marks that root
|
|
7
|
+
* @position Owner module of the private layer-portal-boundary attribute in
|
|
8
|
+
* RichText: the only RichText file that writes its name. Core's Layer reads
|
|
9
|
+
* the mark through its own owner module of the same name. No package entry
|
|
10
|
+
* exports it.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Spread on the editable root, whose DOM Lexical reconciles. */
|
|
14
|
+
export const rendererManagedRootProps: Readonly<
|
|
15
|
+
Record<`data-${string}`, string>
|
|
16
|
+
> = {
|
|
17
|
+
'data-astryx-layer-portal-boundary': 'external',
|
|
18
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file textSemantics.ts
|
|
5
|
+
* @input Uses lexical (TextNode, configExtension) and @lexical/html
|
|
6
|
+
* (DOMRenderExtension, domOverride).
|
|
7
|
+
* @output Exports TextSemanticsExtension, which renders struck-through text
|
|
8
|
+
* inside a `<del>` and bold italic text inside an `<em>`, the elements core
|
|
9
|
+
* Markdown renders for them.
|
|
10
|
+
* @position A dependency of the RichTextEditor and RichTextView extensions.
|
|
11
|
+
* Lexical draws struck text as a styled `<span>`, or as the `<strong>`,
|
|
12
|
+
* `<em>`, or `<code>` its other marks call for, and draws bold italic text
|
|
13
|
+
* as a `<strong>` alone, so assistive technology hears no deletion, and no
|
|
14
|
+
* emphasis on bold italic text, where core Markdown exposes them
|
|
15
|
+
* (spec:AST-061 FR7). Giving Lexical's element another role would replace
|
|
16
|
+
* the one it already has; instead each text node's element, exactly as
|
|
17
|
+
* Lexical builds it, sits inside the elements it is missing — a `<del>`,
|
|
18
|
+
* then an `<em>` — so every mark is exposed together. Struck text inside a
|
|
19
|
+
* link is a deletion inside the link. The document, its Markdown, and the
|
|
20
|
+
* selection model are unchanged: the text node's element is still the one
|
|
21
|
+
* Lexical created and updates, and Lexical finds its text by walking down
|
|
22
|
+
* from the outermost element.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import {DOMRenderExtension, domOverride} from '@lexical/html';
|
|
26
|
+
import {
|
|
27
|
+
configExtension,
|
|
28
|
+
TEXT_TYPE_TO_FORMAT,
|
|
29
|
+
TextNode,
|
|
30
|
+
type AnyLexicalExtensionArgument,
|
|
31
|
+
} from 'lexical';
|
|
32
|
+
|
|
33
|
+
const STRIKETHROUGH = TEXT_TYPE_TO_FORMAT.strikethrough;
|
|
34
|
+
const BOLD_ITALIC = TEXT_TYPE_TO_FORMAT.bold | TEXT_TYPE_TO_FORMAT.italic;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The elements this version of `node` sits inside, outermost first. Reads the
|
|
38
|
+
* version's own field: Lexical's getters read the latest version, so
|
|
39
|
+
* `prevNode.hasFormat()` would answer for the next one.
|
|
40
|
+
*/
|
|
41
|
+
function wrappersOf(node: TextNode): ReadonlyArray<'del' | 'em'> {
|
|
42
|
+
const format = node.__format;
|
|
43
|
+
const wrappers: Array<'del' | 'em'> = [];
|
|
44
|
+
if ((format & STRIKETHROUGH) !== 0) {
|
|
45
|
+
wrappers.push('del');
|
|
46
|
+
}
|
|
47
|
+
// Lexical draws bold italic text as a `<strong>` with an italic class.
|
|
48
|
+
if ((format & BOLD_ITALIC) === BOLD_ITALIC) {
|
|
49
|
+
wrappers.push('em');
|
|
50
|
+
}
|
|
51
|
+
return wrappers;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function sameWrappers(
|
|
55
|
+
a: ReadonlyArray<string>,
|
|
56
|
+
b: ReadonlyArray<string>,
|
|
57
|
+
): boolean {
|
|
58
|
+
return a.length === b.length && a.every((tag, index) => tag === b[index]);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Typed as an extension argument: its inferred type names Lexical types the
|
|
62
|
+
// package's declarations cannot (TS4023).
|
|
63
|
+
export const TextSemanticsExtension: AnyLexicalExtensionArgument =
|
|
64
|
+
configExtension(DOMRenderExtension, {
|
|
65
|
+
overrides: [
|
|
66
|
+
domOverride([TextNode], {
|
|
67
|
+
$createDOM(node, $next) {
|
|
68
|
+
let element = $next();
|
|
69
|
+
for (const tag of [...wrappersOf(node)].reverse()) {
|
|
70
|
+
const wrapper = document.createElement(tag);
|
|
71
|
+
wrapper.append(element);
|
|
72
|
+
element = wrapper;
|
|
73
|
+
}
|
|
74
|
+
return element;
|
|
75
|
+
},
|
|
76
|
+
$updateDOM(nextNode, prevNode, dom, $next, editor) {
|
|
77
|
+
const wrappers = wrappersOf(nextNode);
|
|
78
|
+
if (!sameWrappers(wrappers, wrappersOf(prevNode))) {
|
|
79
|
+
// Adding or removing a wrapper recreates the element.
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (wrappers.length === 0) {
|
|
83
|
+
return $next();
|
|
84
|
+
}
|
|
85
|
+
// Lexical updates its own element, inside the wrappers.
|
|
86
|
+
let element: Element | null = dom;
|
|
87
|
+
for (const tag of wrappers) {
|
|
88
|
+
if (element?.tagName.toLowerCase() !== tag) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
element = element.firstElementChild;
|
|
92
|
+
}
|
|
93
|
+
if (element == null) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return nextNode.updateDOM(
|
|
97
|
+
prevNode,
|
|
98
|
+
element as HTMLElement,
|
|
99
|
+
editor._config,
|
|
100
|
+
);
|
|
101
|
+
},
|
|
102
|
+
}),
|
|
103
|
+
],
|
|
104
|
+
});
|