@eventuras/scribo 0.8.3 → 0.10.7
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/App.d.ts +11 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/MarkdownEditor.d.ts +18 -0
- package/dist/MarkdownEditor.d.ts.map +1 -0
- package/dist/MarkdownEditor2.js +111 -0
- package/dist/MarkdownEditor2.js.map +1 -0
- package/dist/MarkdownInput.d.ts +27 -0
- package/dist/MarkdownInput.d.ts.map +1 -0
- package/dist/MarkdownInput.js +57 -0
- package/dist/MarkdownInput.js.map +1 -0
- package/dist/callout.js +5 -0
- package/dist/context/SharedHistoryContext.d.ts +11 -0
- package/dist/context/SharedHistoryContext.d.ts.map +1 -0
- package/dist/context/SharedHistoryContext.js +12 -0
- package/dist/context/SharedHistoryContext.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +4 -0
- package/dist/nodes/EditorNodes.d.ts +4 -0
- package/dist/nodes/EditorNodes.d.ts.map +1 -0
- package/dist/nodes/EditorNodes.js +39 -0
- package/dist/nodes/EditorNodes.js.map +1 -0
- package/dist/nodes/callout/CalloutComponent.d.ts +6 -0
- package/dist/nodes/callout/CalloutComponent.d.ts.map +1 -0
- package/dist/nodes/callout/CalloutComponent.js +53 -0
- package/dist/nodes/callout/CalloutComponent.js.map +1 -0
- package/dist/nodes/callout/CalloutNode.d.ts +27 -0
- package/dist/nodes/callout/CalloutNode.d.ts.map +1 -0
- package/dist/nodes/callout/CalloutNode.js +153 -0
- package/dist/nodes/callout/CalloutNode.js.map +1 -0
- package/dist/nodes/callout/CalloutTransformer.d.ts +3 -0
- package/dist/nodes/callout/CalloutTransformer.d.ts.map +1 -0
- package/dist/nodes/callout/CalloutTransformer.js +48 -0
- package/dist/nodes/callout/CalloutTransformer.js.map +1 -0
- package/dist/nodes/callout/calloutPlugin.d.ts +3 -0
- package/dist/nodes/callout/calloutPlugin.d.ts.map +1 -0
- package/dist/nodes/callout/calloutPlugin.js +34 -0
- package/dist/nodes/callout/calloutPlugin.js.map +1 -0
- package/dist/nodes/callout/index.d.ts +6 -0
- package/dist/nodes/callout/index.d.ts.map +1 -0
- package/dist/nodes/schedule/ScheduleItemComponent.d.ts +9 -0
- package/dist/nodes/schedule/ScheduleItemComponent.d.ts.map +1 -0
- package/dist/nodes/schedule/ScheduleItemComponent.js +167 -0
- package/dist/nodes/schedule/ScheduleItemComponent.js.map +1 -0
- package/dist/nodes/schedule/ScheduleItemNode.d.ts +31 -0
- package/dist/nodes/schedule/ScheduleItemNode.d.ts.map +1 -0
- package/dist/nodes/schedule/ScheduleItemNode.js +94 -0
- package/dist/nodes/schedule/ScheduleItemNode.js.map +1 -0
- package/dist/nodes/schedule/ScheduleTransformer.d.ts +22 -0
- package/dist/nodes/schedule/ScheduleTransformer.d.ts.map +1 -0
- package/dist/nodes/schedule/ScheduleTransformer.js +60 -0
- package/dist/nodes/schedule/ScheduleTransformer.js.map +1 -0
- package/dist/nodes/schedule/index.d.ts +5 -0
- package/dist/nodes/schedule/index.d.ts.map +1 -0
- package/dist/nodes/schedule/schedulePlugin.d.ts +3 -0
- package/dist/nodes/schedule/schedulePlugin.d.ts.map +1 -0
- package/dist/nodes/schedule/schedulePlugin.js +33 -0
- package/dist/nodes/schedule/schedulePlugin.js.map +1 -0
- package/dist/plugins/AutoLinkPlugin.d.ts +3 -0
- package/dist/plugins/AutoLinkPlugin.d.ts.map +1 -0
- package/dist/plugins/AutoLinkPlugin.js +22 -0
- package/dist/plugins/AutoLinkPlugin.js.map +1 -0
- package/dist/plugins/FloatingLinkEditorPlugin.d.ts +7 -0
- package/dist/plugins/FloatingLinkEditorPlugin.d.ts.map +1 -0
- package/dist/plugins/FloatingLinkEditorPlugin2.js +302 -0
- package/dist/plugins/FloatingLinkEditorPlugin2.js.map +1 -0
- package/dist/plugins/HistoryPlugin.d.ts +26 -0
- package/dist/plugins/HistoryPlugin.d.ts.map +1 -0
- package/dist/plugins/LinkPlugin.d.ts +3 -0
- package/dist/plugins/LinkPlugin.d.ts.map +1 -0
- package/dist/plugins/LinkPlugin.js +18 -0
- package/dist/plugins/LinkPlugin.js.map +1 -0
- package/dist/plugins/ToolbarPlugin.d.ts +7 -0
- package/dist/plugins/ToolbarPlugin.d.ts.map +1 -0
- package/dist/plugins/ToolbarPlugin.js +372 -0
- package/dist/plugins/ToolbarPlugin.js.map +1 -0
- package/dist/schedule.js +4 -0
- package/dist/scribo.css +1977 -0
- package/dist/themes/EditorTheme.d.ts +4 -0
- package/dist/themes/EditorTheme.d.ts.map +1 -0
- package/dist/themes/EditorTheme2.js +107 -0
- package/dist/themes/EditorTheme2.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/ui/ContentEditable.d.ts +6 -0
- package/dist/ui/ContentEditable.d.ts.map +1 -0
- package/dist/ui/ContentEditable2.js +14 -0
- package/dist/ui/ContentEditable2.js.map +1 -0
- package/dist/ui/DropDown.d.ts +18 -0
- package/dist/ui/DropDown.d.ts.map +1 -0
- package/dist/ui/DropDown.js +162 -0
- package/dist/ui/DropDown.js.map +1 -0
- package/dist/ui/Placeholder.d.ts +6 -0
- package/dist/ui/Placeholder.d.ts.map +1 -0
- package/dist/ui/Placeholder2.js +13 -0
- package/dist/ui/Placeholder2.js.map +1 -0
- package/dist/utils/environment.d.ts +24 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +20 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/getSelectedNode.d.ts +3 -0
- package/dist/utils/getSelectedNode.d.ts.map +1 -0
- package/dist/utils/getSelectedNode.js +23 -0
- package/dist/utils/getSelectedNode.js.map +1 -0
- package/dist/utils/setFloatingElemPosition.d.ts +2 -0
- package/dist/utils/setFloatingElemPosition.d.ts.map +1 -0
- package/dist/utils/setFloatingElemPositionForLinkEditor.d.ts +2 -0
- package/dist/utils/setFloatingElemPositionForLinkEditor.d.ts.map +1 -0
- package/dist/utils/setFloatingElemPositionForLinkEditor.js +33 -0
- package/dist/utils/setFloatingElemPositionForLinkEditor.js.map +1 -0
- package/dist/utils/url.d.ts +11 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +33 -0
- package/dist/utils/url.js.map +1 -0
- package/dist/vite.svg +1 -0
- package/package.json +55 -38
- package/src/MarkdownEditor.css +61 -47
- package/src/MarkdownEditor.tsx +76 -29
- package/src/MarkdownInput.tsx +9 -10
- package/src/context/SharedHistoryContext.tsx +8 -16
- package/src/main.tsx +3 -3
- package/src/nodes/EditorNodes.ts +10 -10
- package/src/nodes/callout/Callout.css +94 -0
- package/src/nodes/callout/CalloutComponent.tsx +61 -0
- package/src/nodes/callout/CalloutNode.ts +197 -0
- package/src/nodes/callout/CalloutTransformer.ts +87 -0
- package/src/nodes/callout/calloutPlugin.ts +37 -0
- package/src/nodes/callout/index.ts +5 -0
- package/src/nodes/schedule/ScheduleItem.css +140 -0
- package/src/nodes/schedule/ScheduleItemComponent.tsx +195 -0
- package/src/nodes/schedule/ScheduleItemNode.ts +135 -0
- package/src/nodes/schedule/ScheduleTransformer.ts +80 -0
- package/src/nodes/schedule/index.ts +4 -0
- package/src/nodes/schedule/schedulePlugin.ts +33 -0
- package/src/plugins/AutoLinkPlugin.tsx +5 -10
- package/src/plugins/FloatingLinkEditorPlugin.tsx +42 -66
- package/src/plugins/HistoryPlugin.tsx +20 -30
- package/src/plugins/LinkPlugin.tsx +2 -3
- package/src/plugins/ToolbarPlugin.tsx +129 -141
- package/src/themes/EditorTheme.css +9 -5
- package/src/themes/EditorTheme.ts +89 -90
- package/src/types.ts +27 -0
- package/src/ui/ContentEditable.tsx +5 -5
- package/src/ui/DropDown.tsx +23 -41
- package/src/ui/Placeholder.tsx +21 -21
- package/src/utils/environment.ts +6 -12
- package/src/utils/getSelectedNode.ts +3 -5
- package/src/utils/setFloatingElemPosition.ts +2 -5
- package/src/utils/setFloatingElemPositionForLinkEditor.ts +1 -1
- package/src/utils/url.ts +4 -10
- package/tsconfig.json +8 -0
- package/CHANGELOG.md +0 -65
- package/README.md +0 -126
- package/RELEASE.md +0 -102
- package/eslint.config.js +0 -4
- package/src/App.css +0 -35
- package/src/App.tsx +0 -42
- package/src/index.tsx +0 -13
- package/tsconfig.node.json +0 -11
- package/vite.config.site.ts +0 -19
- package/vite.config.ts +0 -33
- /package/{src → dist}/vite-env.d.ts +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { getSelectedNode } from "../utils/getSelectedNode.js";
|
|
2
|
+
import { sanitizeUrl } from "../utils/url.js";
|
|
3
|
+
import DropDown, { DropDownItem } from "../ui/DropDown.js";
|
|
4
|
+
import "../utils/environment.js";
|
|
5
|
+
import { $createParagraphNode, $getNodeByKey, $getSelection, $isRangeSelection, $isRootOrShadowRoot, CAN_REDO_COMMAND, CAN_UNDO_COMMAND, COMMAND_PRIORITY_CRITICAL, COMMAND_PRIORITY_NORMAL, FORMAT_TEXT_COMMAND, KEY_MODIFIER_COMMAND, REDO_COMMAND, SELECTION_CHANGE_COMMAND, UNDO_COMMAND } from "lexical";
|
|
6
|
+
import { useCallback, useEffect, useState } from "react";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { $createCodeNode, $isCodeNode, CODE_LANGUAGE_FRIENDLY_NAME_MAP, CODE_LANGUAGE_MAP, getLanguageFriendlyName } from "@lexical/code";
|
|
9
|
+
import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@lexical/link";
|
|
10
|
+
import { $isListNode, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, ListNode, REMOVE_LIST_COMMAND } from "@lexical/list";
|
|
11
|
+
import { $createHeadingNode, $createQuoteNode, $isHeadingNode } from "@lexical/rich-text";
|
|
12
|
+
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
|
13
|
+
import { $findMatchingParent, $getNearestNodeOfType, mergeRegister } from "@lexical/utils";
|
|
14
|
+
import { $setBlocksType } from "@lexical/selection";
|
|
15
|
+
//#region src/plugins/ToolbarPlugin.tsx
|
|
16
|
+
/**
|
|
17
|
+
* Modified from the the work licensed under the MIT license below:
|
|
18
|
+
*
|
|
19
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
20
|
+
*
|
|
21
|
+
* This source code is licensed under the MIT license found in the
|
|
22
|
+
* LICENSE file in the root directory of this source tree.
|
|
23
|
+
*
|
|
24
|
+
* Source: https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/ToolbarPlugin/index.tsx
|
|
25
|
+
*/
|
|
26
|
+
var blockTypeToBlockName = {
|
|
27
|
+
paragraph: "Normal",
|
|
28
|
+
h1: "Heading 1",
|
|
29
|
+
h2: "Heading 2",
|
|
30
|
+
h3: "Heading 3",
|
|
31
|
+
h4: "Heading 4",
|
|
32
|
+
bullet: "Bulleted List",
|
|
33
|
+
check: "Check List",
|
|
34
|
+
code: "Code Block",
|
|
35
|
+
number: "Numbered List",
|
|
36
|
+
quote: "Quote"
|
|
37
|
+
};
|
|
38
|
+
function getCodeLanguageOptions() {
|
|
39
|
+
const options = [];
|
|
40
|
+
for (const [lang, friendlyName] of Object.entries(CODE_LANGUAGE_FRIENDLY_NAME_MAP)) options.push([lang, friendlyName]);
|
|
41
|
+
return options;
|
|
42
|
+
}
|
|
43
|
+
var CODE_LANGUAGE_OPTIONS = getCodeLanguageOptions();
|
|
44
|
+
function dropDownActiveClass(active) {
|
|
45
|
+
if (active) return "active dropdown-item-active";
|
|
46
|
+
else return "";
|
|
47
|
+
}
|
|
48
|
+
function BlockFormatDropDown({ editor, blockType, disabled = false }) {
|
|
49
|
+
const formatParagraph = () => {
|
|
50
|
+
editor.update(() => {
|
|
51
|
+
const selection = $getSelection();
|
|
52
|
+
if ($isRangeSelection(selection)) $setBlocksType(selection, () => $createParagraphNode());
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const formatHeading = (headingSize) => {
|
|
56
|
+
if (blockType !== headingSize) editor.update(() => {
|
|
57
|
+
const selection = $getSelection();
|
|
58
|
+
if ($isRangeSelection(selection)) $setBlocksType(selection, () => $createHeadingNode(headingSize));
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const formatBulletList = () => {
|
|
62
|
+
if (blockType !== "bullet") editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, void 0);
|
|
63
|
+
else editor.dispatchCommand(REMOVE_LIST_COMMAND, void 0);
|
|
64
|
+
};
|
|
65
|
+
const formatNumberedList = () => {
|
|
66
|
+
if (blockType !== "number") editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, void 0);
|
|
67
|
+
else editor.dispatchCommand(REMOVE_LIST_COMMAND, void 0);
|
|
68
|
+
};
|
|
69
|
+
const formatQuote = () => {
|
|
70
|
+
if (blockType !== "quote") editor.update(() => {
|
|
71
|
+
const selection = $getSelection();
|
|
72
|
+
if ($isRangeSelection(selection)) $setBlocksType(selection, () => $createQuoteNode());
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const formatCode = () => {
|
|
76
|
+
if (blockType !== "code") editor.update(() => {
|
|
77
|
+
let selection = $getSelection();
|
|
78
|
+
if (selection !== null) {
|
|
79
|
+
if (selection.isCollapsed()) $setBlocksType(selection, () => $createCodeNode());
|
|
80
|
+
else {
|
|
81
|
+
const textContent = selection.getTextContent();
|
|
82
|
+
const codeNode = $createCodeNode();
|
|
83
|
+
selection.insertNodes([codeNode]);
|
|
84
|
+
selection = $getSelection();
|
|
85
|
+
if ($isRangeSelection(selection)) selection.insertRawText(textContent);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
return /* @__PURE__ */ jsxs(DropDown, {
|
|
91
|
+
disabled,
|
|
92
|
+
buttonClassName: "toolbar-item block-controls",
|
|
93
|
+
buttonIconClassName: "icon block-type " + blockType,
|
|
94
|
+
buttonLabel: blockTypeToBlockName[blockType],
|
|
95
|
+
buttonAriaLabel: "Formatting options for text style",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
98
|
+
className: "item " + dropDownActiveClass(blockType === "paragraph"),
|
|
99
|
+
onClick: formatParagraph,
|
|
100
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon paragraph" }), /* @__PURE__ */ jsx("span", {
|
|
101
|
+
className: "text",
|
|
102
|
+
children: "Normal"
|
|
103
|
+
})]
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
106
|
+
className: "item " + dropDownActiveClass(blockType === "h1"),
|
|
107
|
+
onClick: () => formatHeading("h1"),
|
|
108
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon h1" }), /* @__PURE__ */ jsx("span", {
|
|
109
|
+
className: "text",
|
|
110
|
+
children: "Heading 1"
|
|
111
|
+
})]
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
114
|
+
className: "item " + dropDownActiveClass(blockType === "h2"),
|
|
115
|
+
onClick: () => formatHeading("h2"),
|
|
116
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon h2" }), /* @__PURE__ */ jsx("span", {
|
|
117
|
+
className: "text",
|
|
118
|
+
children: "Heading 2"
|
|
119
|
+
})]
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
122
|
+
className: "item " + dropDownActiveClass(blockType === "h3"),
|
|
123
|
+
onClick: () => formatHeading("h3"),
|
|
124
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon h3" }), /* @__PURE__ */ jsx("span", {
|
|
125
|
+
className: "text",
|
|
126
|
+
children: "Heading 3"
|
|
127
|
+
})]
|
|
128
|
+
}),
|
|
129
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
130
|
+
className: "item " + dropDownActiveClass(blockType === "h4"),
|
|
131
|
+
onClick: () => formatHeading("h4"),
|
|
132
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon h4" }), /* @__PURE__ */ jsx("span", {
|
|
133
|
+
className: "text",
|
|
134
|
+
children: "Heading 4"
|
|
135
|
+
})]
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
138
|
+
className: "item " + dropDownActiveClass(blockType === "bullet"),
|
|
139
|
+
onClick: formatBulletList,
|
|
140
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon bullet-list" }), /* @__PURE__ */ jsx("span", {
|
|
141
|
+
className: "text",
|
|
142
|
+
children: "Bullet List"
|
|
143
|
+
})]
|
|
144
|
+
}),
|
|
145
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
146
|
+
className: "item " + dropDownActiveClass(blockType === "number"),
|
|
147
|
+
onClick: formatNumberedList,
|
|
148
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon numbered-list" }), /* @__PURE__ */ jsx("span", {
|
|
149
|
+
className: "text",
|
|
150
|
+
children: "Numbered List"
|
|
151
|
+
})]
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
154
|
+
className: "item " + dropDownActiveClass(blockType === "quote"),
|
|
155
|
+
onClick: formatQuote,
|
|
156
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon quote" }), /* @__PURE__ */ jsx("span", {
|
|
157
|
+
className: "text",
|
|
158
|
+
children: "Quote"
|
|
159
|
+
})]
|
|
160
|
+
}),
|
|
161
|
+
/* @__PURE__ */ jsxs(DropDownItem, {
|
|
162
|
+
className: "item " + dropDownActiveClass(blockType === "code"),
|
|
163
|
+
onClick: formatCode,
|
|
164
|
+
children: [/* @__PURE__ */ jsx("i", { className: "icon code" }), /* @__PURE__ */ jsx("span", {
|
|
165
|
+
className: "text",
|
|
166
|
+
children: "Code Block"
|
|
167
|
+
})]
|
|
168
|
+
})
|
|
169
|
+
]
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function Divider() {
|
|
173
|
+
return /* @__PURE__ */ jsx("div", { className: "divider" });
|
|
174
|
+
}
|
|
175
|
+
function ToolbarPlugin({ setIsLinkEditMode, toolbarButtons = [] }) {
|
|
176
|
+
const [editor] = useLexicalComposerContext();
|
|
177
|
+
const [activeEditor, setActiveEditor] = useState(editor);
|
|
178
|
+
const [blockType, setBlockType] = useState("paragraph");
|
|
179
|
+
const [selectedElementKey, setSelectedElementKey] = useState(null);
|
|
180
|
+
const [_isCode, setIsCode] = useState(false);
|
|
181
|
+
const [isLink, setIsLink] = useState(false);
|
|
182
|
+
const [isBold, setIsBold] = useState(false);
|
|
183
|
+
const [isItalic, setIsItalic] = useState(false);
|
|
184
|
+
const [canUndo, setCanUndo] = useState(false);
|
|
185
|
+
const [canRedo, setCanRedo] = useState(false);
|
|
186
|
+
const [codeLanguage, setCodeLanguage] = useState("");
|
|
187
|
+
const [isEditable, setIsEditable] = useState(() => editor.isEditable());
|
|
188
|
+
const $updateToolbar = useCallback(() => {
|
|
189
|
+
const selection = $getSelection();
|
|
190
|
+
if ($isRangeSelection(selection)) {
|
|
191
|
+
const anchorNode = selection.anchor.getNode();
|
|
192
|
+
let element = anchorNode.getKey() === "root" ? anchorNode : $findMatchingParent(anchorNode, (e) => {
|
|
193
|
+
const parent = e.getParent();
|
|
194
|
+
return parent !== null && $isRootOrShadowRoot(parent);
|
|
195
|
+
});
|
|
196
|
+
if (element === null) element = anchorNode.getTopLevelElementOrThrow();
|
|
197
|
+
const elementKey = element.getKey();
|
|
198
|
+
const elementDOM = activeEditor.getElementByKey(elementKey);
|
|
199
|
+
setIsCode(selection.hasFormat("code"));
|
|
200
|
+
setIsBold(selection.hasFormat("bold"));
|
|
201
|
+
setIsItalic(selection.hasFormat("italic"));
|
|
202
|
+
const node = getSelectedNode(selection);
|
|
203
|
+
const parent = node.getParent();
|
|
204
|
+
if ($isLinkNode(parent) || $isLinkNode(node)) setIsLink(true);
|
|
205
|
+
else setIsLink(false);
|
|
206
|
+
if (elementDOM !== null) {
|
|
207
|
+
setSelectedElementKey(elementKey);
|
|
208
|
+
if ($isListNode(element)) {
|
|
209
|
+
const parentList = $getNearestNodeOfType(anchorNode, ListNode);
|
|
210
|
+
const type = parentList ? parentList.getListType() : element.getListType();
|
|
211
|
+
setBlockType(type);
|
|
212
|
+
} else {
|
|
213
|
+
const type = $isHeadingNode(element) ? element.getTag() : element.getType();
|
|
214
|
+
if (type in blockTypeToBlockName) setBlockType(type);
|
|
215
|
+
if ($isCodeNode(element)) {
|
|
216
|
+
const language = element.getLanguage();
|
|
217
|
+
setCodeLanguage(language ? CODE_LANGUAGE_MAP[language] || language : "");
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}, [activeEditor]);
|
|
224
|
+
useEffect(() => {
|
|
225
|
+
return editor.registerCommand(SELECTION_CHANGE_COMMAND, (_payload, newEditor) => {
|
|
226
|
+
$updateToolbar();
|
|
227
|
+
setActiveEditor(newEditor);
|
|
228
|
+
return false;
|
|
229
|
+
}, COMMAND_PRIORITY_CRITICAL);
|
|
230
|
+
}, [editor, $updateToolbar]);
|
|
231
|
+
useEffect(() => {
|
|
232
|
+
return mergeRegister(editor.registerEditableListener((editable) => {
|
|
233
|
+
setIsEditable(editable);
|
|
234
|
+
}), activeEditor.registerUpdateListener(({ editorState }) => {
|
|
235
|
+
editorState.read(() => {
|
|
236
|
+
$updateToolbar();
|
|
237
|
+
});
|
|
238
|
+
}), activeEditor.registerCommand(CAN_UNDO_COMMAND, (payload) => {
|
|
239
|
+
setCanUndo(payload);
|
|
240
|
+
return false;
|
|
241
|
+
}, COMMAND_PRIORITY_CRITICAL), activeEditor.registerCommand(CAN_REDO_COMMAND, (payload) => {
|
|
242
|
+
setCanRedo(payload);
|
|
243
|
+
return false;
|
|
244
|
+
}, COMMAND_PRIORITY_CRITICAL));
|
|
245
|
+
}, [
|
|
246
|
+
$updateToolbar,
|
|
247
|
+
activeEditor,
|
|
248
|
+
editor
|
|
249
|
+
]);
|
|
250
|
+
useEffect(() => {
|
|
251
|
+
return activeEditor.registerCommand(KEY_MODIFIER_COMMAND, (payload) => {
|
|
252
|
+
const event = payload;
|
|
253
|
+
const { code, ctrlKey, metaKey } = event;
|
|
254
|
+
if (code === "KeyK" && (ctrlKey || metaKey)) {
|
|
255
|
+
event.preventDefault();
|
|
256
|
+
if (!isLink) setIsLinkEditMode(true);
|
|
257
|
+
else setIsLinkEditMode(false);
|
|
258
|
+
return activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl("https://"));
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
}, COMMAND_PRIORITY_NORMAL);
|
|
262
|
+
}, [
|
|
263
|
+
activeEditor,
|
|
264
|
+
isLink,
|
|
265
|
+
setIsLinkEditMode
|
|
266
|
+
]);
|
|
267
|
+
const insertLink = useCallback(() => {
|
|
268
|
+
if (!isLink) editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl("https://"));
|
|
269
|
+
else editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
|
|
270
|
+
}, [editor, isLink]);
|
|
271
|
+
const onCodeLanguageSelect = useCallback((value) => {
|
|
272
|
+
activeEditor.update(() => {
|
|
273
|
+
if (selectedElementKey !== null) {
|
|
274
|
+
const node = $getNodeByKey(selectedElementKey);
|
|
275
|
+
if ($isCodeNode(node)) node.setLanguage(value);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}, [activeEditor, selectedElementKey]);
|
|
279
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
280
|
+
className: "toolbar",
|
|
281
|
+
children: [
|
|
282
|
+
/* @__PURE__ */ jsx("button", {
|
|
283
|
+
disabled: !canUndo || !isEditable,
|
|
284
|
+
onClick: () => {
|
|
285
|
+
activeEditor.dispatchCommand(UNDO_COMMAND, void 0);
|
|
286
|
+
},
|
|
287
|
+
title: "Undo (Ctrl+Z)",
|
|
288
|
+
type: "button",
|
|
289
|
+
className: "toolbar-item spaced",
|
|
290
|
+
"aria-label": "Undo",
|
|
291
|
+
children: /* @__PURE__ */ jsx("i", { className: "format undo" })
|
|
292
|
+
}),
|
|
293
|
+
/* @__PURE__ */ jsx("button", {
|
|
294
|
+
disabled: !canRedo || !isEditable,
|
|
295
|
+
onClick: () => {
|
|
296
|
+
activeEditor.dispatchCommand(REDO_COMMAND, void 0);
|
|
297
|
+
},
|
|
298
|
+
title: "Redo (Ctrl+Y)",
|
|
299
|
+
type: "button",
|
|
300
|
+
className: "toolbar-item",
|
|
301
|
+
"aria-label": "Redo",
|
|
302
|
+
children: /* @__PURE__ */ jsx("i", { className: "format redo" })
|
|
303
|
+
}),
|
|
304
|
+
/* @__PURE__ */ jsx(Divider, {}),
|
|
305
|
+
blockType in blockTypeToBlockName && activeEditor === editor && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(BlockFormatDropDown, {
|
|
306
|
+
disabled: !isEditable,
|
|
307
|
+
blockType,
|
|
308
|
+
editor
|
|
309
|
+
}), /* @__PURE__ */ jsx(Divider, {})] }),
|
|
310
|
+
blockType === "code" ? /* @__PURE__ */ jsx(DropDown, {
|
|
311
|
+
disabled: !isEditable,
|
|
312
|
+
buttonClassName: "toolbar-item code-language",
|
|
313
|
+
buttonLabel: getLanguageFriendlyName(codeLanguage),
|
|
314
|
+
buttonAriaLabel: "Select language",
|
|
315
|
+
children: CODE_LANGUAGE_OPTIONS.map(([value, name]) => {
|
|
316
|
+
return /* @__PURE__ */ jsx(DropDownItem, {
|
|
317
|
+
className: `item ${dropDownActiveClass(value === codeLanguage)}`,
|
|
318
|
+
onClick: () => onCodeLanguageSelect(value),
|
|
319
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
320
|
+
className: "text",
|
|
321
|
+
children: name
|
|
322
|
+
})
|
|
323
|
+
}, value);
|
|
324
|
+
})
|
|
325
|
+
}) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
326
|
+
/* @__PURE__ */ jsx("button", {
|
|
327
|
+
disabled: !isEditable,
|
|
328
|
+
onClick: () => {
|
|
329
|
+
activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, "bold");
|
|
330
|
+
},
|
|
331
|
+
className: "toolbar-item spaced " + (isBold ? "active" : ""),
|
|
332
|
+
title: "Bold (Ctrl+B)",
|
|
333
|
+
type: "button",
|
|
334
|
+
"aria-label": `Format text as bold. Shortcut: Ctrl+B`,
|
|
335
|
+
children: /* @__PURE__ */ jsx("i", { className: "format bold" })
|
|
336
|
+
}),
|
|
337
|
+
/* @__PURE__ */ jsx("button", {
|
|
338
|
+
disabled: !isEditable,
|
|
339
|
+
onClick: () => {
|
|
340
|
+
activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, "italic");
|
|
341
|
+
},
|
|
342
|
+
className: "toolbar-item spaced " + (isItalic ? "active" : ""),
|
|
343
|
+
title: "Italic (Ctrl+I)",
|
|
344
|
+
type: "button",
|
|
345
|
+
"aria-label": `Format text as italics. Shortcut: Ctrl+I`,
|
|
346
|
+
children: /* @__PURE__ */ jsx("i", { className: "format italic" })
|
|
347
|
+
}),
|
|
348
|
+
/* @__PURE__ */ jsx("button", {
|
|
349
|
+
disabled: !isEditable,
|
|
350
|
+
onClick: insertLink,
|
|
351
|
+
className: "toolbar-item spaced " + (isLink ? "active" : ""),
|
|
352
|
+
"aria-label": "Insert link",
|
|
353
|
+
title: "Insert link",
|
|
354
|
+
type: "button",
|
|
355
|
+
children: /* @__PURE__ */ jsx("i", { className: "format link" })
|
|
356
|
+
})
|
|
357
|
+
] }),
|
|
358
|
+
toolbarButtons.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Divider, {}), toolbarButtons.map((btn) => /* @__PURE__ */ jsx("button", {
|
|
359
|
+
type: "button",
|
|
360
|
+
onClick: () => btn.onSelect(activeEditor),
|
|
361
|
+
className: "toolbar-item",
|
|
362
|
+
title: btn.label,
|
|
363
|
+
"aria-label": btn.label,
|
|
364
|
+
children: /* @__PURE__ */ jsx("i", { className: `icon ${btn.iconClass ?? "bullet-list"}` })
|
|
365
|
+
}, btn.key))] })
|
|
366
|
+
]
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
//#endregion
|
|
370
|
+
export { ToolbarPlugin as default };
|
|
371
|
+
|
|
372
|
+
//# sourceMappingURL=ToolbarPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarPlugin.js","names":[],"sources":["../../src/plugins/ToolbarPlugin.tsx"],"sourcesContent":["/**\n * Modified from the the work licensed under the MIT license below:\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * Source: https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/ToolbarPlugin/index.tsx\n */\n\nimport {\n $createCodeNode,\n $isCodeNode,\n CODE_LANGUAGE_FRIENDLY_NAME_MAP,\n CODE_LANGUAGE_MAP,\n getLanguageFriendlyName,\n} from '@lexical/code';\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';\nimport {\n $isListNode,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n ListNode,\n REMOVE_LIST_COMMAND,\n} from '@lexical/list';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport {\n $createHeadingNode,\n $createQuoteNode,\n $isHeadingNode,\n type HeadingTagType,\n} from '@lexical/rich-text';\nimport { $setBlocksType } from '@lexical/selection';\nimport { $findMatchingParent, $getNearestNodeOfType, mergeRegister } from '@lexical/utils';\nimport {\n $createParagraphNode,\n $getNodeByKey,\n $getSelection,\n $isRangeSelection,\n $isRootOrShadowRoot,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_NORMAL,\n FORMAT_TEXT_COMMAND,\n KEY_MODIFIER_COMMAND,\n type LexicalEditor,\n type NodeKey,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n UNDO_COMMAND,\n} from 'lexical';\nimport type { JSX } from 'react';\nimport { type Dispatch, useCallback, useEffect, useState } from 'react';\nimport type { ScriboToolbarButton } from '../types';\nimport DropDown, { DropDownItem } from '../ui/DropDown';\nimport { IS_APPLE } from '../utils/environment';\nimport { getSelectedNode } from '../utils/getSelectedNode';\nimport { sanitizeUrl } from '../utils/url';\n\nconst blockTypeToBlockName = {\n paragraph: 'Normal',\n h1: 'Heading 1',\n h2: 'Heading 2',\n h3: 'Heading 3',\n h4: 'Heading 4',\n bullet: 'Bulleted List',\n check: 'Check List',\n code: 'Code Block',\n number: 'Numbered List',\n quote: 'Quote',\n};\n\nfunction getCodeLanguageOptions(): [string, string][] {\n const options: [string, string][] = [];\n\n for (const [lang, friendlyName] of Object.entries(CODE_LANGUAGE_FRIENDLY_NAME_MAP)) {\n options.push([lang, friendlyName]);\n }\n\n return options;\n}\n\nconst CODE_LANGUAGE_OPTIONS = getCodeLanguageOptions();\n\nfunction dropDownActiveClass(active: boolean) {\n if (active) return 'active dropdown-item-active';\n else return '';\n}\n\nfunction BlockFormatDropDown({\n editor,\n blockType,\n disabled = false,\n}: Readonly<{\n blockType: keyof typeof blockTypeToBlockName;\n editor: LexicalEditor;\n disabled?: boolean;\n}>): JSX.Element {\n const formatParagraph = () => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createParagraphNode());\n }\n });\n };\n\n const formatHeading = (headingSize: HeadingTagType) => {\n if (blockType !== headingSize) {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createHeadingNode(headingSize));\n }\n });\n }\n };\n\n const formatBulletList = () => {\n if (blockType !== 'bullet') {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n }\n };\n\n const formatNumberedList = () => {\n if (blockType !== 'number') {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n } else {\n editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n }\n };\n\n const formatQuote = () => {\n if (blockType !== 'quote') {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createQuoteNode());\n }\n });\n }\n };\n\n const formatCode = () => {\n if (blockType !== 'code') {\n editor.update(() => {\n let selection = $getSelection();\n\n if (selection !== null) {\n if (selection.isCollapsed()) {\n $setBlocksType(selection, () => $createCodeNode());\n } else {\n const textContent = selection.getTextContent();\n const codeNode = $createCodeNode();\n selection.insertNodes([codeNode]);\n selection = $getSelection();\n if ($isRangeSelection(selection)) {\n selection.insertRawText(textContent);\n }\n }\n }\n });\n }\n };\n\n return (\n <DropDown\n disabled={disabled}\n buttonClassName=\"toolbar-item block-controls\"\n buttonIconClassName={'icon block-type ' + blockType}\n buttonLabel={blockTypeToBlockName[blockType]}\n buttonAriaLabel=\"Formatting options for text style\"\n >\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'paragraph')}\n onClick={formatParagraph}\n >\n <i className=\"icon paragraph\" />\n <span className=\"text\">Normal</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'h1')}\n onClick={() => formatHeading('h1')}\n >\n <i className=\"icon h1\" />\n <span className=\"text\">Heading 1</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'h2')}\n onClick={() => formatHeading('h2')}\n >\n <i className=\"icon h2\" />\n <span className=\"text\">Heading 2</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'h3')}\n onClick={() => formatHeading('h3')}\n >\n <i className=\"icon h3\" />\n <span className=\"text\">Heading 3</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'h4')}\n onClick={() => formatHeading('h4')}\n >\n <i className=\"icon h4\" />\n <span className=\"text\">Heading 4</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'bullet')}\n onClick={formatBulletList}\n >\n <i className=\"icon bullet-list\" />\n <span className=\"text\">Bullet List</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'number')}\n onClick={formatNumberedList}\n >\n <i className=\"icon numbered-list\" />\n <span className=\"text\">Numbered List</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'quote')}\n onClick={formatQuote}\n >\n <i className=\"icon quote\" />\n <span className=\"text\">Quote</span>\n </DropDownItem>\n <DropDownItem\n className={'item ' + dropDownActiveClass(blockType === 'code')}\n onClick={formatCode}\n >\n <i className=\"icon code\" />\n <span className=\"text\">Code Block</span>\n </DropDownItem>\n </DropDown>\n );\n}\n\nfunction Divider(): JSX.Element {\n return <div className=\"divider\" />;\n}\n\nexport default function ToolbarPlugin({\n setIsLinkEditMode,\n toolbarButtons = [],\n}: Readonly<{\n setIsLinkEditMode: Dispatch<boolean>;\n toolbarButtons?: ScriboToolbarButton[];\n}>): JSX.Element {\n const [editor] = useLexicalComposerContext();\n const [activeEditor, setActiveEditor] = useState(editor);\n const [blockType, setBlockType] = useState<keyof typeof blockTypeToBlockName>('paragraph');\n const [selectedElementKey, setSelectedElementKey] = useState<NodeKey | null>(null);\n const [_isCode, setIsCode] = useState(false);\n const [isLink, setIsLink] = useState(false);\n const [isBold, setIsBold] = useState(false);\n const [isItalic, setIsItalic] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [codeLanguage, setCodeLanguage] = useState<string>('');\n const [isEditable, setIsEditable] = useState(() => editor.isEditable());\n\n const $updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n let element =\n anchorNode.getKey() === 'root'\n ? anchorNode\n : $findMatchingParent(anchorNode, (e) => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n if (element === null) {\n element = anchorNode.getTopLevelElementOrThrow();\n }\n\n const elementKey = element.getKey();\n const elementDOM = activeEditor.getElementByKey(elementKey);\n\n // Update text format\n setIsCode(selection.hasFormat('code'));\n setIsBold(selection.hasFormat('bold'));\n setIsItalic(selection.hasFormat('italic'));\n\n // Update links\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent) || $isLinkNode(node)) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n\n if (elementDOM !== null) {\n setSelectedElementKey(elementKey);\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(anchorNode, ListNode);\n const type = parentList ? parentList.getListType() : element.getListType();\n setBlockType(type);\n } else {\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\n if (type in blockTypeToBlockName) {\n setBlockType(type as keyof typeof blockTypeToBlockName);\n }\n if ($isCodeNode(element)) {\n const language = element.getLanguage() as keyof typeof CODE_LANGUAGE_MAP;\n setCodeLanguage(language ? CODE_LANGUAGE_MAP[language] || language : '');\n return;\n }\n }\n }\n }\n }, [activeEditor]);\n\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n (_payload, newEditor) => {\n $updateToolbar();\n setActiveEditor(newEditor);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n );\n }, [editor, $updateToolbar]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerEditableListener((editable) => {\n setIsEditable(editable);\n }),\n activeEditor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n }),\n activeEditor.registerCommand<boolean>(\n CAN_UNDO_COMMAND,\n (payload) => {\n setCanUndo(payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n activeEditor.registerCommand<boolean>(\n CAN_REDO_COMMAND,\n (payload) => {\n setCanRedo(payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n )\n );\n }, [$updateToolbar, activeEditor, editor]);\n\n useEffect(() => {\n return activeEditor.registerCommand(\n KEY_MODIFIER_COMMAND,\n (payload) => {\n const event: KeyboardEvent = payload;\n const { code, ctrlKey, metaKey } = event;\n\n if (code === 'KeyK' && (ctrlKey || metaKey)) {\n event.preventDefault();\n if (!isLink) {\n setIsLinkEditMode(true);\n } else {\n setIsLinkEditMode(false);\n }\n return activeEditor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl('https://'));\n }\n return false;\n },\n COMMAND_PRIORITY_NORMAL\n );\n }, [activeEditor, isLink, setIsLinkEditMode]);\n\n const insertLink = useCallback(() => {\n if (!isLink) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl('https://'));\n } else {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }, [editor, isLink]);\n\n const onCodeLanguageSelect = useCallback(\n (value: string) => {\n activeEditor.update(() => {\n if (selectedElementKey !== null) {\n const node = $getNodeByKey(selectedElementKey);\n if ($isCodeNode(node)) {\n node.setLanguage(value);\n }\n }\n });\n },\n [activeEditor, selectedElementKey]\n );\n return (\n <div className=\"toolbar\">\n <button\n disabled={!canUndo || !isEditable}\n onClick={() => {\n activeEditor.dispatchCommand(UNDO_COMMAND, undefined);\n }}\n title={IS_APPLE ? 'Undo (⌘Z)' : 'Undo (Ctrl+Z)'}\n type=\"button\"\n className=\"toolbar-item spaced\"\n aria-label=\"Undo\"\n >\n <i className=\"format undo\" />\n </button>\n <button\n disabled={!canRedo || !isEditable}\n onClick={() => {\n activeEditor.dispatchCommand(REDO_COMMAND, undefined);\n }}\n title={IS_APPLE ? 'Redo (⌘Y)' : 'Redo (Ctrl+Y)'}\n type=\"button\"\n className=\"toolbar-item\"\n aria-label=\"Redo\"\n >\n <i className=\"format redo\" />\n </button>\n <Divider />\n {blockType in blockTypeToBlockName && activeEditor === editor && (\n <>\n <BlockFormatDropDown disabled={!isEditable} blockType={blockType} editor={editor} />\n <Divider />\n </>\n )}\n {blockType === 'code' ? (\n <DropDown\n disabled={!isEditable}\n buttonClassName=\"toolbar-item code-language\"\n buttonLabel={getLanguageFriendlyName(codeLanguage)}\n buttonAriaLabel=\"Select language\"\n >\n {CODE_LANGUAGE_OPTIONS.map(([value, name]) => {\n return (\n <DropDownItem\n className={`item ${dropDownActiveClass(value === codeLanguage)}`}\n onClick={() => onCodeLanguageSelect(value)}\n key={value}\n >\n <span className=\"text\">{name}</span>\n </DropDownItem>\n );\n })}\n </DropDown>\n ) : (\n <>\n <button\n disabled={!isEditable}\n onClick={() => {\n activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\n }}\n className={'toolbar-item spaced ' + (isBold ? 'active' : '')}\n title={IS_APPLE ? 'Bold (⌘B)' : 'Bold (Ctrl+B)'}\n type=\"button\"\n aria-label={`Format text as bold. Shortcut: ${IS_APPLE ? '⌘B' : 'Ctrl+B'}`}\n >\n <i className=\"format bold\" />\n </button>\n <button\n disabled={!isEditable}\n onClick={() => {\n activeEditor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\n }}\n className={'toolbar-item spaced ' + (isItalic ? 'active' : '')}\n title={IS_APPLE ? 'Italic (⌘I)' : 'Italic (Ctrl+I)'}\n type=\"button\"\n aria-label={`Format text as italics. Shortcut: ${IS_APPLE ? '⌘I' : 'Ctrl+I'}`}\n >\n <i className=\"format italic\" />\n </button>\n <button\n disabled={!isEditable}\n onClick={insertLink}\n className={'toolbar-item spaced ' + (isLink ? 'active' : '')}\n aria-label=\"Insert link\"\n title=\"Insert link\"\n type=\"button\"\n >\n <i className=\"format link\" />\n </button>\n </>\n )}\n {toolbarButtons.length > 0 && (\n <>\n <Divider />\n {toolbarButtons.map((btn) => (\n <button\n type=\"button\"\n key={btn.key}\n onClick={() => btn.onSelect(activeEditor)}\n className=\"toolbar-item\"\n title={btn.label}\n aria-label={btn.label}\n >\n <i className={`icon ${btn.iconClass ?? 'bullet-list'}`} />\n </button>\n ))}\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
package/dist/schedule.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { $createScheduleItemNode, $isScheduleItemNode, ScheduleItemNode } from "./nodes/schedule/ScheduleItemNode.js";
|
|
2
|
+
import { SCHEDULE_ITEM_TRANSFORMER } from "./nodes/schedule/ScheduleTransformer.js";
|
|
3
|
+
import { schedulePlugin } from "./nodes/schedule/schedulePlugin.js";
|
|
4
|
+
export { $createScheduleItemNode, $isScheduleItemNode, SCHEDULE_ITEM_TRANSFORMER, ScheduleItemNode, schedulePlugin };
|