@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.
Files changed (164) hide show
  1. package/dist/App.d.ts +11 -0
  2. package/dist/App.d.ts.map +1 -0
  3. package/dist/MarkdownEditor.d.ts +18 -0
  4. package/dist/MarkdownEditor.d.ts.map +1 -0
  5. package/dist/MarkdownEditor2.js +111 -0
  6. package/dist/MarkdownEditor2.js.map +1 -0
  7. package/dist/MarkdownInput.d.ts +27 -0
  8. package/dist/MarkdownInput.d.ts.map +1 -0
  9. package/dist/MarkdownInput.js +57 -0
  10. package/dist/MarkdownInput.js.map +1 -0
  11. package/dist/callout.js +5 -0
  12. package/dist/context/SharedHistoryContext.d.ts +11 -0
  13. package/dist/context/SharedHistoryContext.d.ts.map +1 -0
  14. package/dist/context/SharedHistoryContext.js +12 -0
  15. package/dist/context/SharedHistoryContext.js.map +1 -0
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/main.d.ts +5 -0
  19. package/dist/main.d.ts.map +1 -0
  20. package/dist/main.js +4 -0
  21. package/dist/nodes/EditorNodes.d.ts +4 -0
  22. package/dist/nodes/EditorNodes.d.ts.map +1 -0
  23. package/dist/nodes/EditorNodes.js +39 -0
  24. package/dist/nodes/EditorNodes.js.map +1 -0
  25. package/dist/nodes/callout/CalloutComponent.d.ts +6 -0
  26. package/dist/nodes/callout/CalloutComponent.d.ts.map +1 -0
  27. package/dist/nodes/callout/CalloutComponent.js +53 -0
  28. package/dist/nodes/callout/CalloutComponent.js.map +1 -0
  29. package/dist/nodes/callout/CalloutNode.d.ts +27 -0
  30. package/dist/nodes/callout/CalloutNode.d.ts.map +1 -0
  31. package/dist/nodes/callout/CalloutNode.js +153 -0
  32. package/dist/nodes/callout/CalloutNode.js.map +1 -0
  33. package/dist/nodes/callout/CalloutTransformer.d.ts +3 -0
  34. package/dist/nodes/callout/CalloutTransformer.d.ts.map +1 -0
  35. package/dist/nodes/callout/CalloutTransformer.js +48 -0
  36. package/dist/nodes/callout/CalloutTransformer.js.map +1 -0
  37. package/dist/nodes/callout/calloutPlugin.d.ts +3 -0
  38. package/dist/nodes/callout/calloutPlugin.d.ts.map +1 -0
  39. package/dist/nodes/callout/calloutPlugin.js +34 -0
  40. package/dist/nodes/callout/calloutPlugin.js.map +1 -0
  41. package/dist/nodes/callout/index.d.ts +6 -0
  42. package/dist/nodes/callout/index.d.ts.map +1 -0
  43. package/dist/nodes/schedule/ScheduleItemComponent.d.ts +9 -0
  44. package/dist/nodes/schedule/ScheduleItemComponent.d.ts.map +1 -0
  45. package/dist/nodes/schedule/ScheduleItemComponent.js +167 -0
  46. package/dist/nodes/schedule/ScheduleItemComponent.js.map +1 -0
  47. package/dist/nodes/schedule/ScheduleItemNode.d.ts +31 -0
  48. package/dist/nodes/schedule/ScheduleItemNode.d.ts.map +1 -0
  49. package/dist/nodes/schedule/ScheduleItemNode.js +94 -0
  50. package/dist/nodes/schedule/ScheduleItemNode.js.map +1 -0
  51. package/dist/nodes/schedule/ScheduleTransformer.d.ts +22 -0
  52. package/dist/nodes/schedule/ScheduleTransformer.d.ts.map +1 -0
  53. package/dist/nodes/schedule/ScheduleTransformer.js +60 -0
  54. package/dist/nodes/schedule/ScheduleTransformer.js.map +1 -0
  55. package/dist/nodes/schedule/index.d.ts +5 -0
  56. package/dist/nodes/schedule/index.d.ts.map +1 -0
  57. package/dist/nodes/schedule/schedulePlugin.d.ts +3 -0
  58. package/dist/nodes/schedule/schedulePlugin.d.ts.map +1 -0
  59. package/dist/nodes/schedule/schedulePlugin.js +33 -0
  60. package/dist/nodes/schedule/schedulePlugin.js.map +1 -0
  61. package/dist/plugins/AutoLinkPlugin.d.ts +3 -0
  62. package/dist/plugins/AutoLinkPlugin.d.ts.map +1 -0
  63. package/dist/plugins/AutoLinkPlugin.js +22 -0
  64. package/dist/plugins/AutoLinkPlugin.js.map +1 -0
  65. package/dist/plugins/FloatingLinkEditorPlugin.d.ts +7 -0
  66. package/dist/plugins/FloatingLinkEditorPlugin.d.ts.map +1 -0
  67. package/dist/plugins/FloatingLinkEditorPlugin2.js +302 -0
  68. package/dist/plugins/FloatingLinkEditorPlugin2.js.map +1 -0
  69. package/dist/plugins/HistoryPlugin.d.ts +26 -0
  70. package/dist/plugins/HistoryPlugin.d.ts.map +1 -0
  71. package/dist/plugins/LinkPlugin.d.ts +3 -0
  72. package/dist/plugins/LinkPlugin.d.ts.map +1 -0
  73. package/dist/plugins/LinkPlugin.js +18 -0
  74. package/dist/plugins/LinkPlugin.js.map +1 -0
  75. package/dist/plugins/ToolbarPlugin.d.ts +7 -0
  76. package/dist/plugins/ToolbarPlugin.d.ts.map +1 -0
  77. package/dist/plugins/ToolbarPlugin.js +372 -0
  78. package/dist/plugins/ToolbarPlugin.js.map +1 -0
  79. package/dist/schedule.js +4 -0
  80. package/dist/scribo.css +1977 -0
  81. package/dist/themes/EditorTheme.d.ts +4 -0
  82. package/dist/themes/EditorTheme.d.ts.map +1 -0
  83. package/dist/themes/EditorTheme2.js +107 -0
  84. package/dist/themes/EditorTheme2.js.map +1 -0
  85. package/dist/types.d.ts +26 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/ui/ContentEditable.d.ts +6 -0
  88. package/dist/ui/ContentEditable.d.ts.map +1 -0
  89. package/dist/ui/ContentEditable2.js +14 -0
  90. package/dist/ui/ContentEditable2.js.map +1 -0
  91. package/dist/ui/DropDown.d.ts +18 -0
  92. package/dist/ui/DropDown.d.ts.map +1 -0
  93. package/dist/ui/DropDown.js +162 -0
  94. package/dist/ui/DropDown.js.map +1 -0
  95. package/dist/ui/Placeholder.d.ts +6 -0
  96. package/dist/ui/Placeholder.d.ts.map +1 -0
  97. package/dist/ui/Placeholder2.js +13 -0
  98. package/dist/ui/Placeholder2.js.map +1 -0
  99. package/dist/utils/environment.d.ts +24 -0
  100. package/dist/utils/environment.d.ts.map +1 -0
  101. package/dist/utils/environment.js +20 -0
  102. package/dist/utils/environment.js.map +1 -0
  103. package/dist/utils/getSelectedNode.d.ts +3 -0
  104. package/dist/utils/getSelectedNode.d.ts.map +1 -0
  105. package/dist/utils/getSelectedNode.js +23 -0
  106. package/dist/utils/getSelectedNode.js.map +1 -0
  107. package/dist/utils/setFloatingElemPosition.d.ts +2 -0
  108. package/dist/utils/setFloatingElemPosition.d.ts.map +1 -0
  109. package/dist/utils/setFloatingElemPositionForLinkEditor.d.ts +2 -0
  110. package/dist/utils/setFloatingElemPositionForLinkEditor.d.ts.map +1 -0
  111. package/dist/utils/setFloatingElemPositionForLinkEditor.js +33 -0
  112. package/dist/utils/setFloatingElemPositionForLinkEditor.js.map +1 -0
  113. package/dist/utils/url.d.ts +11 -0
  114. package/dist/utils/url.d.ts.map +1 -0
  115. package/dist/utils/url.js +33 -0
  116. package/dist/utils/url.js.map +1 -0
  117. package/dist/vite.svg +1 -0
  118. package/package.json +55 -38
  119. package/src/MarkdownEditor.css +61 -47
  120. package/src/MarkdownEditor.tsx +76 -29
  121. package/src/MarkdownInput.tsx +9 -10
  122. package/src/context/SharedHistoryContext.tsx +8 -16
  123. package/src/main.tsx +3 -3
  124. package/src/nodes/EditorNodes.ts +10 -10
  125. package/src/nodes/callout/Callout.css +94 -0
  126. package/src/nodes/callout/CalloutComponent.tsx +61 -0
  127. package/src/nodes/callout/CalloutNode.ts +197 -0
  128. package/src/nodes/callout/CalloutTransformer.ts +87 -0
  129. package/src/nodes/callout/calloutPlugin.ts +37 -0
  130. package/src/nodes/callout/index.ts +5 -0
  131. package/src/nodes/schedule/ScheduleItem.css +140 -0
  132. package/src/nodes/schedule/ScheduleItemComponent.tsx +195 -0
  133. package/src/nodes/schedule/ScheduleItemNode.ts +135 -0
  134. package/src/nodes/schedule/ScheduleTransformer.ts +80 -0
  135. package/src/nodes/schedule/index.ts +4 -0
  136. package/src/nodes/schedule/schedulePlugin.ts +33 -0
  137. package/src/plugins/AutoLinkPlugin.tsx +5 -10
  138. package/src/plugins/FloatingLinkEditorPlugin.tsx +42 -66
  139. package/src/plugins/HistoryPlugin.tsx +20 -30
  140. package/src/plugins/LinkPlugin.tsx +2 -3
  141. package/src/plugins/ToolbarPlugin.tsx +129 -141
  142. package/src/themes/EditorTheme.css +9 -5
  143. package/src/themes/EditorTheme.ts +89 -90
  144. package/src/types.ts +27 -0
  145. package/src/ui/ContentEditable.tsx +5 -5
  146. package/src/ui/DropDown.tsx +23 -41
  147. package/src/ui/Placeholder.tsx +21 -21
  148. package/src/utils/environment.ts +6 -12
  149. package/src/utils/getSelectedNode.ts +3 -5
  150. package/src/utils/setFloatingElemPosition.ts +2 -5
  151. package/src/utils/setFloatingElemPositionForLinkEditor.ts +1 -1
  152. package/src/utils/url.ts +4 -10
  153. package/tsconfig.json +8 -0
  154. package/CHANGELOG.md +0 -65
  155. package/README.md +0 -126
  156. package/RELEASE.md +0 -102
  157. package/eslint.config.js +0 -4
  158. package/src/App.css +0 -35
  159. package/src/App.tsx +0 -42
  160. package/src/index.tsx +0 -13
  161. package/tsconfig.node.json +0 -11
  162. package/vite.config.site.ts +0 -19
  163. package/vite.config.ts +0 -33
  164. /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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"}
@@ -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 };