@cyberyozh/text-editor 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +102 -0
  2. package/dist/editor.css +2069 -0
  3. package/dist/editor.css.map +1 -0
  4. package/dist/editor.d.mts +45 -0
  5. package/dist/editor.d.ts +45 -0
  6. package/dist/editor.js +6155 -0
  7. package/dist/editor.js.map +1 -0
  8. package/dist/editor.mjs +6118 -0
  9. package/dist/editor.mjs.map +1 -0
  10. package/dist/render/client.d.mts +24 -0
  11. package/dist/render/client.d.ts +24 -0
  12. package/dist/render/client.js +98 -0
  13. package/dist/render/client.js.map +1 -0
  14. package/dist/render/client.mjs +74 -0
  15. package/dist/render/client.mjs.map +1 -0
  16. package/dist/render.d.mts +58 -0
  17. package/dist/render.d.ts +58 -0
  18. package/dist/render.js +2521 -0
  19. package/dist/render.js.map +1 -0
  20. package/dist/render.mjs +2484 -0
  21. package/dist/render.mjs.map +1 -0
  22. package/dist/styles/index.css +2068 -0
  23. package/package.json +92 -0
  24. package/src/editor/commands/items.ts +374 -0
  25. package/src/editor/commands/suggestion.tsx +146 -0
  26. package/src/editor/components/button/button.css +56 -0
  27. package/src/editor/components/button/button.tsx +35 -0
  28. package/src/editor/components/button/index.ts +1 -0
  29. package/src/editor/components/common-modal/common-modal.css +85 -0
  30. package/src/editor/components/common-modal/common-modal.tsx +58 -0
  31. package/src/editor/components/common-modal/index.ts +1 -0
  32. package/src/editor/components/index.ts +3 -0
  33. package/src/editor/components/input/index.ts +1 -0
  34. package/src/editor/components/input/input.css +43 -0
  35. package/src/editor/components/input/input.tsx +22 -0
  36. package/src/editor/context/dialog-command.tsx +47 -0
  37. package/src/editor/context/index.ts +2 -0
  38. package/src/editor/context/translations-context.tsx +28 -0
  39. package/src/editor/controls/bubble-menu-content.tsx +394 -0
  40. package/src/editor/controls/callout-menu.tsx +169 -0
  41. package/src/editor/controls/character-count.tsx +36 -0
  42. package/src/editor/controls/commands-list.tsx +117 -0
  43. package/src/editor/controls/drag-handle.tsx +98 -0
  44. package/src/editor/controls/emoji-picker.tsx +62 -0
  45. package/src/editor/controls/index.ts +5 -0
  46. package/src/editor/controls/table-menu.tsx +322 -0
  47. package/src/editor/dialogs/add-katex-dialog/add-katex-dialog.css +115 -0
  48. package/src/editor/dialogs/add-katex-dialog/add-katex-dialog.tsx +116 -0
  49. package/src/editor/dialogs/add-katex-dialog/index.ts +1 -0
  50. package/src/editor/dialogs/add-link-dialog/add-link-dialog.css +105 -0
  51. package/src/editor/dialogs/add-link-dialog/add-link-dialog.tsx +177 -0
  52. package/src/editor/dialogs/add-link-dialog/index.ts +1 -0
  53. package/src/editor/dialogs/add-video-dialog/add-video-dialog.css +146 -0
  54. package/src/editor/dialogs/add-video-dialog/add-video-dialog.tsx +157 -0
  55. package/src/editor/dialogs/add-video-dialog/index.ts +1 -0
  56. package/src/editor/dialogs/image-dialog/image-dialog.css +101 -0
  57. package/src/editor/dialogs/image-dialog/image-dialog.tsx +276 -0
  58. package/src/editor/dialogs/image-dialog/index.ts +1 -0
  59. package/src/editor/dialogs/index.ts +4 -0
  60. package/src/editor/editor.tsx +247 -0
  61. package/src/editor/handlers/create-image-upload-handler.ts +24 -0
  62. package/src/editor/handlers/dialog-handlers.ts +143 -0
  63. package/src/editor/handlers/index.ts +8 -0
  64. package/src/editor/index.ts +3 -0
  65. package/src/extensions/base/callout.ts +138 -0
  66. package/src/extensions/base/code-block.ts +24 -0
  67. package/src/extensions/base/compatibility.ts +493 -0
  68. package/src/extensions/base/copyable-text.ts +56 -0
  69. package/src/extensions/base/custom-quote.ts +174 -0
  70. package/src/extensions/base/figure.ts +141 -0
  71. package/src/extensions/base/index.ts +19 -0
  72. package/src/extensions/base/link.ts +18 -0
  73. package/src/extensions/base/myth-reality.ts +45 -0
  74. package/src/extensions/base/prompt.ts +109 -0
  75. package/src/extensions/base/video.ts +29 -0
  76. package/src/extensions/editor/callout.ts +43 -0
  77. package/src/extensions/editor/code-block.ts +9 -0
  78. package/src/extensions/editor/commands.ts +43 -0
  79. package/src/extensions/editor/copyable-text.ts +16 -0
  80. package/src/extensions/editor/custom-quote.ts +54 -0
  81. package/src/extensions/editor/figure.ts +20 -0
  82. package/src/extensions/editor/get-editor-extensions.ts +113 -0
  83. package/src/extensions/editor/index.ts +25 -0
  84. package/src/extensions/editor/prompt.ts +43 -0
  85. package/src/extensions/editor/video.ts +23 -0
  86. package/src/extensions/render/get-render-extensions.ts +74 -0
  87. package/src/extensions/render/index.ts +6 -0
  88. package/src/extensions/views/components/callout.tsx +70 -0
  89. package/src/extensions/views/components/code-block.tsx +73 -0
  90. package/src/extensions/views/components/copy-button.tsx +52 -0
  91. package/src/extensions/views/components/copyable-text.tsx +11 -0
  92. package/src/extensions/views/components/custom-quote.tsx +64 -0
  93. package/src/extensions/views/components/figure.tsx +63 -0
  94. package/src/extensions/views/components/index.ts +7 -0
  95. package/src/extensions/views/components/prompt.tsx +43 -0
  96. package/src/extensions/views/components/video.tsx +40 -0
  97. package/src/extensions/views/node-views/callout.tsx +51 -0
  98. package/src/extensions/views/node-views/code-block.tsx +30 -0
  99. package/src/extensions/views/node-views/copyable-text.tsx +10 -0
  100. package/src/extensions/views/node-views/custom-quote.tsx +66 -0
  101. package/src/extensions/views/node-views/figure.tsx +38 -0
  102. package/src/extensions/views/node-views/index.ts +7 -0
  103. package/src/extensions/views/node-views/prompt.tsx +35 -0
  104. package/src/extensions/views/node-views/video.tsx +19 -0
  105. package/src/icons/Check.tsx +12 -0
  106. package/src/icons/Copy.tsx +15 -0
  107. package/src/icons/DragIcon.tsx +10 -0
  108. package/src/icons/Edit.tsx +12 -0
  109. package/src/icons/Quote.tsx +10 -0
  110. package/src/icons/X.tsx +13 -0
  111. package/src/icons/color/TiptapCalloutError.tsx +25 -0
  112. package/src/icons/color/TiptapCalloutInfo.tsx +18 -0
  113. package/src/icons/color/TiptapCalloutSuccess.tsx +49 -0
  114. package/src/icons/color/TiptapCalloutWarning.tsx +28 -0
  115. package/src/icons/color/index.ts +4 -0
  116. package/src/icons/index.ts +60 -0
  117. package/src/icons/menu/AddImage.tsx +10 -0
  118. package/src/icons/menu/AlignCenter.tsx +10 -0
  119. package/src/icons/menu/AlignLeft.tsx +10 -0
  120. package/src/icons/menu/AlignRight.tsx +10 -0
  121. package/src/icons/menu/ArrowDown.tsx +13 -0
  122. package/src/icons/menu/ArrowLeft.tsx +13 -0
  123. package/src/icons/menu/ArrowRight.tsx +13 -0
  124. package/src/icons/menu/ArrowUp.tsx +13 -0
  125. package/src/icons/menu/Blockquote.tsx +7 -0
  126. package/src/icons/menu/Bold.tsx +10 -0
  127. package/src/icons/menu/BulletList.tsx +10 -0
  128. package/src/icons/menu/CalloutError.tsx +10 -0
  129. package/src/icons/menu/CalloutInfo.tsx +12 -0
  130. package/src/icons/menu/CalloutSuccess.tsx +10 -0
  131. package/src/icons/menu/CalloutWarning.tsx +12 -0
  132. package/src/icons/menu/ClearFormatting.tsx +10 -0
  133. package/src/icons/menu/Code.tsx +10 -0
  134. package/src/icons/menu/CodeBlock.tsx +10 -0
  135. package/src/icons/menu/Copyable.tsx +10 -0
  136. package/src/icons/menu/CustomQuote.tsx +17 -0
  137. package/src/icons/menu/DeleteColumn.tsx +17 -0
  138. package/src/icons/menu/DeleteRow.tsx +17 -0
  139. package/src/icons/menu/Details.tsx +10 -0
  140. package/src/icons/menu/H2.tsx +10 -0
  141. package/src/icons/menu/H3.tsx +10 -0
  142. package/src/icons/menu/H4.tsx +10 -0
  143. package/src/icons/menu/H5.tsx +10 -0
  144. package/src/icons/menu/H6.tsx +10 -0
  145. package/src/icons/menu/Highlight.tsx +13 -0
  146. package/src/icons/menu/HorizontalRule.tsx +7 -0
  147. package/src/icons/menu/Italic.tsx +10 -0
  148. package/src/icons/menu/Link.tsx +10 -0
  149. package/src/icons/menu/LinkOff.tsx +10 -0
  150. package/src/icons/menu/Math.tsx +10 -0
  151. package/src/icons/menu/MergeCells.tsx +10 -0
  152. package/src/icons/menu/MythReality.tsx +10 -0
  153. package/src/icons/menu/OrderedList.tsx +10 -0
  154. package/src/icons/menu/Prompt.tsx +18 -0
  155. package/src/icons/menu/Redo.tsx +14 -0
  156. package/src/icons/menu/SplitCells.tsx +7 -0
  157. package/src/icons/menu/Strikethrough.tsx +10 -0
  158. package/src/icons/menu/Subscript.tsx +10 -0
  159. package/src/icons/menu/Superscript.tsx +10 -0
  160. package/src/icons/menu/Table.tsx +14 -0
  161. package/src/icons/menu/TableColumnHeading.tsx +7 -0
  162. package/src/icons/menu/TableRowHeading.tsx +10 -0
  163. package/src/icons/menu/TextColor.tsx +13 -0
  164. package/src/icons/menu/Underline.tsx +10 -0
  165. package/src/icons/menu/Undo.tsx +14 -0
  166. package/src/icons/menu/Video.tsx +14 -0
  167. package/src/icons/menu/index.ts +49 -0
  168. package/src/render/index.ts +22 -0
  169. package/src/render/static-renderer-config.tsx +206 -0
  170. package/src/render/tiptap-interactivity-provider.tsx +78 -0
  171. package/src/render/tiptap-render.tsx +102 -0
  172. package/src/styles/components.css +10 -0
  173. package/src/styles/editor/base.css +39 -0
  174. package/src/styles/editor/callout-menu.css +81 -0
  175. package/src/styles/editor/controls.css +57 -0
  176. package/src/styles/editor/emoji-picker.css +113 -0
  177. package/src/styles/editor/index.css +9 -0
  178. package/src/styles/editor/menus.css +16 -0
  179. package/src/styles/editor/states.css +43 -0
  180. package/src/styles/editor/typography.css +165 -0
  181. package/src/styles/editor/utilities.css +71 -0
  182. package/src/styles/editor/variables.css +70 -0
  183. package/src/styles/extensions/callout.css +155 -0
  184. package/src/styles/extensions/code-block.css +109 -0
  185. package/src/styles/extensions/commands-list.css +83 -0
  186. package/src/styles/extensions/custom-quote.css +103 -0
  187. package/src/styles/extensions/details.css +87 -0
  188. package/src/styles/extensions/figure.css +66 -0
  189. package/src/styles/extensions/index.css +11 -0
  190. package/src/styles/extensions/math.css +32 -0
  191. package/src/styles/extensions/myth-reality.css +59 -0
  192. package/src/styles/extensions/prompt.css +75 -0
  193. package/src/styles/extensions/table.css +253 -0
  194. package/src/styles/extensions/video.css +53 -0
  195. package/src/styles/styles.css +3 -0
  196. package/src/translations/en.json +158 -0
  197. package/src/translations/ru.json +158 -0
  198. package/src/types/image-handler.ts +33 -0
  199. package/src/types/index.ts +1 -0
  200. package/src/utils/copy-to-clipboard.ts +23 -0
  201. package/src/utils/custom-emoji.ts +174 -0
  202. package/src/utils/detect-video-hosting.ts +106 -0
  203. package/src/utils/get-shared-extensions.ts +45 -0
  204. package/src/utils/get-translations.ts +25 -0
  205. package/src/utils/handle-exit-node.ts +61 -0
  206. package/src/utils/image-src-resolver.ts +74 -0
  207. package/src/utils/index.ts +2 -0
  208. package/src/utils/migrate-legacy-callouts.ts +59 -0
  209. package/src/utils/pluralize.ts +38 -0
@@ -0,0 +1,43 @@
1
+ import { ReactNode } from "react";
2
+ import { CopyButton } from "./copy-button";
3
+
4
+ interface PromptHeaderProps {
5
+ children: ReactNode;
6
+ isEmpty?: boolean;
7
+ placeholder?: string;
8
+ }
9
+
10
+ export const PromptHeader = ({ children, isEmpty, placeholder }: PromptHeaderProps) => (
11
+ <div className="prompt-header-wrapper">
12
+ <div
13
+ className={isEmpty ? "is-empty" : ""}
14
+ data-placeholder={placeholder}
15
+ >
16
+ {children}
17
+ </div>
18
+ <span className="prompt-copy-icon-wrapper">
19
+ <CopyButton
20
+ iconSize={16}
21
+ color="prompt"
22
+ />
23
+ </span>
24
+ </div>
25
+ );
26
+
27
+ interface PromptContentProps {
28
+ children: ReactNode;
29
+ isEmpty?: boolean;
30
+ placeholder?: string;
31
+ }
32
+
33
+ export const PromptContent = ({ children, isEmpty, placeholder }: PromptContentProps) => (
34
+ <div className="prompt-content-wrapper">
35
+ <div
36
+ className={isEmpty ? "is-empty" : ""}
37
+ data-placeholder={placeholder}
38
+ data-copy-content
39
+ >
40
+ {children}
41
+ </div>
42
+ </div>
43
+ );
@@ -0,0 +1,40 @@
1
+ import { detectVideoHosting } from "@/utils/detect-video-hosting";
2
+ import { ReactNode } from "react";
3
+
4
+ interface VideoProps {
5
+ src: string;
6
+ children?: ReactNode;
7
+ }
8
+
9
+ export const Video = ({ src, children }: VideoProps) => {
10
+ const videoInfo = detectVideoHosting(src);
11
+
12
+ if (!videoInfo?.embedUrl) {
13
+ return (
14
+ <div className="video-node">
15
+ <div className="video-error">
16
+ <span>Unsupported or invalid video URL</span>
17
+ </div>
18
+ {children}
19
+ </div>
20
+ );
21
+ }
22
+
23
+ return (
24
+ <div
25
+ className="video-node"
26
+ data-video=""
27
+ >
28
+ <div className="video-player-wrapper">
29
+ <iframe
30
+ className="video-iframe"
31
+ src={videoInfo?.embedUrl}
32
+ title="Video Player"
33
+ allow="autoplay; encrypted-media"
34
+ allowFullScreen
35
+ />
36
+ </div>
37
+ {children}
38
+ </div>
39
+ );
40
+ };
@@ -0,0 +1,51 @@
1
+ import { NodeViewContent, NodeViewProps, NodeViewWrapper } from "@tiptap/react";
2
+ import { useState } from "react";
3
+ import type { CalloutType } from "../../base";
4
+ import { Callout } from "../components";
5
+ import { EmojiPickerComponent } from "../../../editor/controls/emoji-picker";
6
+
7
+ export const CalloutView = (props: NodeViewProps) => {
8
+ const type = (props.node.attrs.type as CalloutType) || "info";
9
+ const bgColor = props.node.attrs.bgColor as string | null;
10
+ const emoji = props.node.attrs.emoji as string | null;
11
+ const [showEmojiPicker, setShowEmojiPicker] = useState(false);
12
+
13
+ const handleIconClick = (e: React.MouseEvent) => {
14
+ e.preventDefault();
15
+ e.stopPropagation();
16
+ setShowEmojiPicker(true);
17
+ };
18
+
19
+ const handleEmojiSelect = (newEmoji: string) => {
20
+ props.updateAttributes({ emoji: newEmoji });
21
+ setShowEmojiPicker(false);
22
+ };
23
+
24
+ return (
25
+ <NodeViewWrapper>
26
+ <Callout
27
+ type={type}
28
+ bgColor={bgColor}
29
+ emoji={emoji}
30
+ iconWrapper={(icon) => (
31
+ <div className="callout-icon-wrapper">
32
+ <button
33
+ className="callout-icon-button"
34
+ onClick={handleIconClick}
35
+ type="button"
36
+ >
37
+ <div className="callout-icon">{icon}</div>
38
+ </button>
39
+ <EmojiPickerComponent
40
+ isOpen={showEmojiPicker}
41
+ onClose={() => setShowEmojiPicker(false)}
42
+ onEmojiSelect={handleEmojiSelect}
43
+ />
44
+ </div>
45
+ )}
46
+ >
47
+ <NodeViewContent as="div" />
48
+ </Callout>
49
+ </NodeViewWrapper>
50
+ );
51
+ };
@@ -0,0 +1,30 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { NodeViewContent, NodeViewProps, NodeViewWrapper } from "@tiptap/react";
5
+
6
+ import { CodeBlock } from "../components/code-block";
7
+ import { useTiptapTranslations } from "@/editor/context";
8
+
9
+ export const CodeBlockView = (props: NodeViewProps) => {
10
+ const [selectedLanguage, setSelectedLanguage] = useState(props.node.attrs.language ?? "");
11
+ const translations = useTiptapTranslations();
12
+
13
+ const handleLanguageChange = (language: string) => {
14
+ props.updateAttributes({ language });
15
+ setSelectedLanguage(language);
16
+ };
17
+
18
+ return (
19
+ <NodeViewWrapper>
20
+ <CodeBlock
21
+ language={selectedLanguage}
22
+ isEditable={props.editor.isEditable}
23
+ onLanguageChange={handleLanguageChange}
24
+ translations={translations}
25
+ >
26
+ <NodeViewContent />
27
+ </CodeBlock>
28
+ </NodeViewWrapper>
29
+ );
30
+ };
@@ -0,0 +1,10 @@
1
+ import { MarkViewContent } from "@tiptap/react";
2
+ import { CopyableText } from "../components";
3
+
4
+ export const CopyableTextView = () => {
5
+ return (
6
+ <CopyableText>
7
+ <MarkViewContent />
8
+ </CopyableText>
9
+ );
10
+ };
@@ -0,0 +1,66 @@
1
+ import { NodeViewContent, NodeViewProps, NodeViewWrapper } from "@tiptap/react";
2
+ import {
3
+ CustomQuote,
4
+ CustomQuoteText,
5
+ CustomQuoteAuthor,
6
+ CustomQuoteSign,
7
+ } from "../components/custom-quote";
8
+ import { useTiptapTranslations } from "@/editor/context";
9
+
10
+ export const CustomQuoteView = () => {
11
+ return (
12
+ <NodeViewWrapper>
13
+ <CustomQuote>
14
+ <NodeViewContent />
15
+ </CustomQuote>
16
+ </NodeViewWrapper>
17
+ );
18
+ };
19
+
20
+ export const CustomQuoteTextView = (props: NodeViewProps) => {
21
+ const isEmpty = !props.node.content.size;
22
+ const translations = useTiptapTranslations();
23
+
24
+ return (
25
+ <NodeViewWrapper>
26
+ <CustomQuoteText
27
+ isEmpty={isEmpty}
28
+ placeholder={translations.customQuote.textPlaceholder}
29
+ >
30
+ <NodeViewContent className={isEmpty ? "is-empty" : ""} />
31
+ </CustomQuoteText>
32
+ </NodeViewWrapper>
33
+ );
34
+ };
35
+
36
+ export const CustomQuoteAuthorView = (props: NodeViewProps) => {
37
+ const isEmpty = !props.node.content.size;
38
+ const translations = useTiptapTranslations();
39
+
40
+ return (
41
+ <NodeViewWrapper>
42
+ <CustomQuoteAuthor
43
+ isEmpty={isEmpty}
44
+ placeholder={translations.customQuote.authorPlaceholder}
45
+ >
46
+ <NodeViewContent className={isEmpty ? "is-empty" : ""} />
47
+ </CustomQuoteAuthor>
48
+ </NodeViewWrapper>
49
+ );
50
+ };
51
+
52
+ export const CustomQuoteSignView = (props: NodeViewProps) => {
53
+ const isEmpty = !props.node.content.size;
54
+ const translations = useTiptapTranslations();
55
+
56
+ return (
57
+ <NodeViewWrapper>
58
+ <CustomQuoteSign
59
+ isEmpty={isEmpty}
60
+ placeholder={translations.customQuote.signPlaceholder}
61
+ >
62
+ <NodeViewContent className={isEmpty ? "is-empty" : ""} />
63
+ </CustomQuoteSign>
64
+ </NodeViewWrapper>
65
+ );
66
+ };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+
3
+ import { NodeViewProps, NodeViewWrapper } from "@tiptap/react";
4
+
5
+ import { FigureAttrs } from "../../../types";
6
+ import { Figure } from "../components";
7
+
8
+ export const FigureView = ({ node, getPos, editor }: NodeViewProps) => {
9
+ const { fileId, src, alt, title, caption, width, height } = node.attrs as FigureAttrs;
10
+
11
+ const imageExtension = editor.extensionManager.extensions.find((ext) => ext.name === "image");
12
+ const getImageById = imageExtension?.options.getImageById;
13
+ const onFigureClick = imageExtension?.options.onFigureClick;
14
+
15
+ const handleEditClick = () => {
16
+ onFigureClick?.(node.attrs as FigureAttrs, getPos());
17
+ };
18
+
19
+ return (
20
+ <NodeViewWrapper
21
+ className="figure-node-view"
22
+ data-drag-handle
23
+ >
24
+ <Figure
25
+ fileId={fileId}
26
+ src={src}
27
+ alt={alt}
28
+ title={title}
29
+ caption={caption}
30
+ width={width}
31
+ height={height}
32
+ isEditable={editor.isEditable}
33
+ onEditClick={handleEditClick}
34
+ getImageById={getImageById}
35
+ />
36
+ </NodeViewWrapper>
37
+ );
38
+ };
@@ -0,0 +1,7 @@
1
+ export { CalloutView } from "./callout";
2
+ export { CodeBlockView } from "./code-block";
3
+ export { CopyableTextView } from "./copyable-text";
4
+ export { CustomQuoteView, CustomQuoteTextView, CustomQuoteAuthorView, CustomQuoteSignView } from "./custom-quote";
5
+ export { FigureView } from "./figure";
6
+ export { PromptHeaderView, PromptContentView } from "./prompt";
7
+ export { VideoView } from "./video";
@@ -0,0 +1,35 @@
1
+ import { NodeViewContent, NodeViewProps, NodeViewWrapper } from "@tiptap/react";
2
+ import { PromptHeader, PromptContent } from "../components/prompt";
3
+ import { useTiptapTranslations } from "@/editor/context";
4
+
5
+ export const PromptHeaderView = (props: NodeViewProps) => {
6
+ const isEmpty = !props.node.content.size;
7
+ const translations = useTiptapTranslations();
8
+
9
+ return (
10
+ <NodeViewWrapper>
11
+ <PromptHeader
12
+ isEmpty={isEmpty}
13
+ placeholder={translations.prompt.headerPlaceholder}
14
+ >
15
+ <NodeViewContent className={isEmpty ? "is-empty" : ""} />
16
+ </PromptHeader>
17
+ </NodeViewWrapper>
18
+ );
19
+ };
20
+
21
+ export const PromptContentView = (props: NodeViewProps) => {
22
+ const isEmpty = !props.node.content.size;
23
+ const translations = useTiptapTranslations();
24
+
25
+ return (
26
+ <NodeViewWrapper>
27
+ <PromptContent
28
+ isEmpty={isEmpty}
29
+ placeholder={translations.prompt.contentPlaceholder}
30
+ >
31
+ <NodeViewContent className={isEmpty ? "is-empty" : ""} />
32
+ </PromptContent>
33
+ </NodeViewWrapper>
34
+ );
35
+ };
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ import { NodeViewContent, NodeViewProps, NodeViewWrapper } from "@tiptap/react";
4
+ import { Video } from "../components";
5
+
6
+ export const VideoView = (props: NodeViewProps) => {
7
+ const { src } = props.node.attrs;
8
+
9
+ return (
10
+ <NodeViewWrapper>
11
+ <Video src={src}>
12
+ <NodeViewContent
13
+ as="div"
14
+ className="video-content"
15
+ />
16
+ </Video>
17
+ </NodeViewWrapper>
18
+ );
19
+ };
@@ -0,0 +1,12 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgCheck = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ fillRule="evenodd"
7
+ d="M20.707 5.293a1 1 0 0 1 0 1.414l-11 11a1 1 0 0 1-1.414 0l-5-5a1 1 0 1 1 1.414-1.414L9 15.586 19.293 5.293a1 1 0 0 1 1.414 0"
8
+ clipRule="evenodd"
9
+ />
10
+ </svg>
11
+ );
12
+ export default SvgCheck;
@@ -0,0 +1,15 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgCopy = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" {...props}>
4
+ <g fill="currentColor" fillRule="evenodd" clipPath="url(#copy_svg__a)" clipRule="evenodd">
5
+ <path d="M9.167 8.333a.833.833 0 0 0-.834.833v7.5c0 .46.373.834.833.834h7.5c.46 0 .834-.373.834-.834v-7.5a.833.833 0 0 0-.834-.833zm-2.5.833a2.5 2.5 0 0 1 2.5-2.5h7.5a2.5 2.5 0 0 1 2.5 2.5v7.5a2.5 2.5 0 0 1-2.5 2.5h-7.5a2.5 2.5 0 0 1-2.5-2.5z" />
6
+ <path d="M3.334 2.5a.833.833 0 0 0-.834.833v7.5a.833.833 0 0 0 .833.834h.834a.833.833 0 0 1 0 1.667h-.833a2.5 2.5 0 0 1-2.5-2.5v-7.5a2.5 2.5 0 0 1 2.5-2.5h7.5a2.5 2.5 0 0 1 2.5 2.5v.833a.833.833 0 1 1-1.667 0v-.833a.834.834 0 0 0-.833-.834z" />
7
+ </g>
8
+ <defs>
9
+ <clipPath id="copy_svg__a">
10
+ <path fill="currentColor" d="M0 0h20v20H0z" />
11
+ </clipPath>
12
+ </defs>
13
+ </svg>
14
+ );
15
+ export default SvgCopy;
@@ -0,0 +1,10 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgDragIcon = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ d="M9.167 15c0 .917-.75 1.667-1.667 1.667S5.833 15.917 5.833 15c0-.916.75-1.666 1.667-1.666s1.667.75 1.667 1.666M7.5 8.334c-.917 0-1.667.75-1.667 1.666 0 .917.75 1.667 1.667 1.667s1.667-.75 1.667-1.667c0-.916-.75-1.666-1.667-1.666m0-5c-.917 0-1.667.75-1.667 1.666 0 .917.75 1.667 1.667 1.667S9.167 5.917 9.167 5 8.417 3.334 7.5 3.334m5 3.333c.917 0 1.667-.75 1.667-1.667s-.75-1.666-1.667-1.666-1.667.75-1.667 1.666c0 .917.75 1.667 1.667 1.667m0 1.667c-.917 0-1.667.75-1.667 1.666 0 .917.75 1.667 1.667 1.667s1.667-.75 1.667-1.667c0-.916-.75-1.666-1.667-1.666m0 5c-.917 0-1.667.75-1.667 1.666 0 .917.75 1.667 1.667 1.667s1.667-.75 1.667-1.667c0-.916-.75-1.666-1.667-1.666"
7
+ />
8
+ </svg>
9
+ );
10
+ export default SvgDragIcon;
@@ -0,0 +1,12 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgEdit = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg fill="none" viewBox="0 0 18 18" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ fillRule="evenodd"
7
+ d="M11.745.91a.833.833 0 0 1 1.179 0l4.167 4.167a.833.833 0 0 1 0 1.179L6.257 17.089a.83.83 0 0 1-.589.244H1.501a.833.833 0 0 1-.833-.833v-4.167c0-.22.088-.433.244-.589zM2.335 12.68v2.988h2.988l10-10-2.988-2.988z"
8
+ clipRule="evenodd"
9
+ />
10
+ </svg>
11
+ );
12
+ export default SvgEdit;
@@ -0,0 +1,10 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgQuote = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 48 48" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ d="M19.284 11.242c1.2-.504 1.703-1.937 1.161-3.098l-1.897-3.989c-.542-1.122-1.859-1.626-3.02-1.122-3.292 1.394-6.119 3.214-8.364 5.42-2.75 2.595-4.608 5.577-5.615 8.868C.542 20.65 0 25.18 0 30.95v11.888a2.33 2.33 0 0 0 2.323 2.323h15.218a2.33 2.33 0 0 0 2.323-2.323V27.62a2.33 2.33 0 0 0-2.323-2.323h-7.28c.078-3.912 1.007-7.048 2.71-9.41 1.395-1.897 3.486-3.446 6.313-4.646m27.337 0c1.2-.504 1.703-1.937 1.162-3.098l-1.898-3.95a2.315 2.315 0 0 0-3.02-1.122c-3.253 1.394-6.04 3.214-8.325 5.382-2.75 2.633-4.647 5.615-5.654 8.906q-1.51 4.879-1.51 13.591V42.84a2.33 2.33 0 0 0 2.324 2.323h15.217a2.33 2.33 0 0 0 2.324-2.323V27.62a2.33 2.33 0 0 0-2.324-2.323H37.6c.077-3.911 1.007-7.047 2.71-9.41 1.394-1.897 3.485-3.446 6.312-4.646"
7
+ />
8
+ </svg>
9
+ );
10
+ export default SvgQuote;
@@ -0,0 +1,13 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgX = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" {...props}>
4
+ <path
5
+ stroke="currentColor"
6
+ strokeLinecap="round"
7
+ strokeLinejoin="round"
8
+ strokeWidth={2}
9
+ d="M18 6 6 18M6 6l12 12"
10
+ />
11
+ </svg>
12
+ );
13
+ export default SvgX;
@@ -0,0 +1,25 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgTiptapCalloutError = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" {...props}>
4
+ <g clipPath="url(#tiptap-callout-error_svg__a)">
5
+ <path
6
+ fill="#E03757"
7
+ d="M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0"
8
+ />
9
+ <path
10
+ fill="#F04760"
11
+ d="M4.692 15.603c6.011 0 10.885-4.874 10.885-10.885a10.9 10.9 0 0 0-.525-3.35A9.95 9.95 0 0 0 10 0C4.477 0 0 4.477 0 10a9.95 9.95 0 0 0 1.394 5.094c1.066.338 2.179.51 3.298.509"
12
+ />
13
+ <path
14
+ fill="#fff"
15
+ d="M9.996 16.783a1.626 1.626 0 1 1 0-3.251 1.626 1.626 0 0 1 0 3.251m1.575-5.598c-.027.252-.14.486-.321.663a1.13 1.13 0 0 1-.674.315h-.008q-.239.027-.48.027a6 6 0 0 1-.575-.027h-.007a1.13 1.13 0 0 1-.674-.315 1.1 1.1 0 0 1-.321-.663c-.04-.366-.059-2.914-.059-3.481 0-.568.02-3.122.059-3.488.027-.252.14-.487.32-.665.183-.177.42-.289.675-.315h.007q.287-.029.576-.017.24-.012.479.017h.008c.254.027.492.14.674.319.18.177.294.412.321.664.04.366.059 2.92.059 3.488 0 .567-.02 3.113-.059 3.478"
16
+ />
17
+ </g>
18
+ <defs>
19
+ <clipPath id="tiptap-callout-error_svg__a">
20
+ <path fill="#fff" d="M0 0h20v20H0z" />
21
+ </clipPath>
22
+ </defs>
23
+ </svg>
24
+ );
25
+ export default SvgTiptapCalloutError;
@@ -0,0 +1,18 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgTiptapCalloutInfo = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" {...props}>
4
+ <path
5
+ fill="#FE9738"
6
+ d="m11.654 11.196 3.51-2.75.549-4.789-4.06-2.234-1.647 2.264a2.79 2.79 0 0 1 1.531 2.28 2.8 2.8 0 0 1-1.85 2.84 3.96 3.96 0 0 0-2.624 3.728v.72c0 .937.76 1.697 1.696 1.697h2.482zm-4.895-3.32H4.277c-.937 0-1.697-.76-1.697-1.697q0-.432.06-.86C3.084 2.135 5.954-.196 9.172.015h2.482L9.888 1.797m1.353 14.796H8.759c-.937 0-1.696.76-1.696 1.696v.014c0 .938.76 1.697 1.696 1.697h2.18"
7
+ />
8
+ <path
9
+ fill="#FFD15B"
10
+ d="M11.241 14.951c-.937 0-1.697-.76-1.697-1.697v-.72a3.955 3.955 0 0 1 2.625-3.727 2.8 2.8 0 0 0 1.85-2.84A2.79 2.79 0 0 0 11.432 3.4a2.8 2.8 0 0 0-2.976 2.78 1.697 1.697 0 0 1-3.394 0q0-.434.06-.86C5.566 2.133 8.435-.198 11.654.014c3.055.2 5.527 2.653 5.75 5.706a6.2 6.2 0 0 1-4.104 6.286.56.56 0 0 0-.362.529v.72c0 .936-.76 1.696-1.697 1.696m0 5.05c-.937 0-1.697-.76-1.697-1.698v-.014a1.697 1.697 0 0 1 3.394 0v.014c0 .937-.76 1.697-1.697 1.697"
11
+ />
12
+ <path
13
+ fill="#FFC344"
14
+ d="M6.622 5.32q-.06.427-.06.86c0 .667.386 1.245.947 1.521A1.697 1.697 0 0 1 5.062 6.18q0-.432.06-.86C5.566 2.134 8.436-.197 11.654.014q.173.012.343.033C9.273.382 7.012 2.521 6.622 5.32m7.047 3.486a3.96 3.96 0 0 0-2.625 3.729v.72c0 .667.386 1.245.947 1.521a1.696 1.696 0 0 1-2.447-1.522v-.72a3.955 3.955 0 0 1 2.625-3.728 2.8 2.8 0 0 0 1.85-2.839 2.79 2.79 0 0 0-2.022-2.47 2.786 2.786 0 0 1 3.522 2.47 2.8 2.8 0 0 1-1.85 2.84m-1.678 11.02a1.696 1.696 0 0 1-2.447-1.522v-.015a1.697 1.697 0 0 1 2.448-1.523 1.7 1.7 0 0 0-.948 1.523v.014c0 .668.386 1.246.947 1.522"
15
+ />
16
+ </svg>
17
+ );
18
+ export default SvgTiptapCalloutInfo;
@@ -0,0 +1,49 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgTiptapCalloutSuccess = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" {...props}>
4
+ <g clipPath="url(#tiptap-callout-success_svg__a)">
5
+ <path
6
+ fill="#35495E"
7
+ d="M1.972 18.004.06 7.138a2.4 2.4 0 0 1-.035-.317 2.47 2.47 0 0 1 2.073-2.493l3.693-.652-.1 14.328z"
8
+ />
9
+ <path
10
+ fill="#2C3E50"
11
+ d="M16.186 17.528a.69.69 0 0 1-.548.517l-10.87 1.917a2.42 2.42 0 0 1-2.83-2.276 2.46 2.46 0 0 1 1.934-2.462l3.045.855h-.003l-2.742.487a1.037 1.037 0 0 0-.786 1.396 1.066 1.066 0 0 0 1.186.635l8.307-1.466z"
12
+ />
13
+ <path
14
+ fill="#F9EAB0"
15
+ d="m6.914 16.08-2.742.486a1.035 1.035 0 0 0-.786 1.396 1.066 1.066 0 0 0 1.186.635l8.307-1.466z"
16
+ />
17
+ <path
18
+ fill="#E64C3C"
19
+ d="M4.423 11.438 6.339.571a.695.695 0 0 1 .799-.559l10.785 1.902a2.47 2.47 0 0 1 2.074 2.495 3 3 0 0 1-.034.316l-1.917 10.867z"
20
+ />
21
+ <path
22
+ fill="#3F5C6C"
23
+ d="M15.668 3.612a.4.4 0 0 1-.06-.005l-7.81-1.378a.345.345 0 0 1 .12-.677l7.81 1.375a.345.345 0 0 1-.06.685M14.01 5.069a.3.3 0 0 1-.06-.005l-5.094-.897a.345.345 0 0 1 .12-.68l5.094.897a.345.345 0 0 1-.06.685"
24
+ />
25
+ <path
26
+ fill="#ECF0F1"
27
+ d="m14.727 6.608-7.131-1.26a.345.345 0 0 0-.4.28l-.6 3.395a.345.345 0 0 0 .28.4l7.13 1.26a.345.345 0 0 0 .4-.28l.6-3.396a.345.345 0 0 0-.28-.4"
28
+ />
29
+ <path
30
+ fill="#C03A2B"
31
+ d="M19.997 4.407a2 2 0 0 1-.035.317L18.045 15.59l-2.659-.81 1.542-8.738.365-2.063.373-2.11.258.045a2.47 2.47 0 0 1 2.073 2.493"
32
+ />
33
+ <path
34
+ fill="#802F34"
35
+ d="M16.007 12.78 5.22 10.88a.69.69 0 0 0-.238 1.358l10.865 1.914a1.038 1.038 0 0 1 .783 1.4 1.06 1.06 0 0 1-1.183.63L4.624 14.277a.69.69 0 0 0-.241 1.359l10.869 1.913a2.416 2.416 0 0 0 2.83-2.272 2.474 2.474 0 0 0-2.075-2.496"
36
+ />
37
+ <path
38
+ fill="#F9EAB0"
39
+ d="M16.63 15.552a1.06 1.06 0 0 1-1.182.63L4.624 14.277l.359-2.038 10.865 1.914a1.04 1.04 0 0 1 .783 1.4"
40
+ />
41
+ </g>
42
+ <defs>
43
+ <clipPath id="tiptap-callout-success_svg__a">
44
+ <path fill="#fff" d="M0 0h20v20H0z" />
45
+ </clipPath>
46
+ </defs>
47
+ </svg>
48
+ );
49
+ export default SvgTiptapCalloutSuccess;
@@ -0,0 +1,28 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgTiptapCalloutWarning = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" {...props}>
4
+ <path
5
+ fill="#FFF59D"
6
+ fillOpacity={0.6}
7
+ d="M1.667 9.167a8.333 8.333 0 1 0 16.666 0 8.333 8.333 0 0 0-16.666 0"
8
+ />
9
+ <path
10
+ fill="#FBC02D"
11
+ d="M15.417 9.167c0-3.209-2.75-5.75-6.042-5.375-2.5.291-4.5 2.291-4.75 4.791a5.27 5.27 0 0 0 1.917 4.709c.583.5.958 1.208.958 2v.125h5v-.042c0-.75.333-1.5.917-2 1.208-1 2-2.5 2-4.208"
12
+ />
13
+ <path
14
+ fill="#FFF59D"
15
+ d="m12.75 8.417-1.25-.834a.45.45 0 0 0-.458 0L10 8.25l-1-.667a.45.45 0 0 0-.458 0l-1.25.834c-.084.083-.167.166-.167.291s0 .25.083.334L8.792 11v4.417h.833v-4.584c0-.083-.042-.166-.083-.25L8.167 8.875l.625-.417 1 .667a.45.45 0 0 0 .458 0l1-.667.625.417-1.375 1.708a.6.6 0 0 0-.083.25v4.584h.833V11l1.583-1.958a.32.32 0 0 0 .084-.334c-.042-.125-.084-.25-.167-.291"
16
+ />
17
+ <path fill="#5C6BC0" d="M8.75 18.334a1.25 1.25 0 1 0 2.5 0 1.25 1.25 0 0 0-2.5 0" />
18
+ <path
19
+ fill="#9FA8DA"
20
+ d="M10.833 18.75H9.167C8.25 18.75 7.5 18 7.5 17.083V15h5v2.083c0 .917-.75 1.667-1.667 1.667"
21
+ />
22
+ <path
23
+ fill="#5C6BC0"
24
+ d="m12.5 17.083-4.833.667c.125.291.375.583.666.75l3.917-.542q.25-.375.25-.875m-5-.958v.833l5-.708v-.834z"
25
+ />
26
+ </svg>
27
+ );
28
+ export default SvgTiptapCalloutWarning;
@@ -0,0 +1,4 @@
1
+ export { default as TiptapCalloutError } from './TiptapCalloutError';
2
+ export { default as TiptapCalloutInfo } from './TiptapCalloutInfo';
3
+ export { default as TiptapCalloutSuccess } from './TiptapCalloutSuccess';
4
+ export { default as TiptapCalloutWarning } from './TiptapCalloutWarning';
@@ -0,0 +1,60 @@
1
+ // Root icons
2
+ export { default as TiptapCheck } from './Check';
3
+ export { default as TiptapCopy } from './Copy';
4
+ export { default as TiptapDragIcon } from './DragIcon';
5
+ export { default as TiptapEdit } from './Edit';
6
+ export { default as TiptapQuote } from './Quote';
7
+ export { default as TiptapX } from './X';
8
+
9
+ // Menu icons - re-exported for convenience
10
+ export {
11
+ AddImage as TiptapMenuAddImage,
12
+ AlignCenter as TiptapMenuAlignCenter,
13
+ AlignLeft as TiptapMenuAlignLeft,
14
+ AlignRight as TiptapMenuAlignRight,
15
+ ArrowDown as TiptapMenuArrowDown,
16
+ ArrowLeft as TiptapMenuArrowLeft,
17
+ ArrowRight as TiptapMenuArrowRight,
18
+ ArrowUp as TiptapMenuArrowUp,
19
+ Blockquote as TiptapMenuBlockquote,
20
+ Bold as TiptapMenuBold,
21
+ BulletList as TiptapMenuBulletList,
22
+ CalloutError as TiptapMenuCalloutError,
23
+ CalloutInfo as TiptapMenuCalloutInfo,
24
+ CalloutSuccess as TiptapMenuCalloutSuccess,
25
+ CalloutWarning as TiptapMenuCalloutWarning,
26
+ ClearFormatting as TiptapMenuClearFormatting,
27
+ CodeBlock as TiptapMenuCodeBlock,
28
+ Copyable as TiptapMenuCopyable,
29
+ CustomQuote as TiptapMenuCustomQuote,
30
+ DeleteColumn as TiptapMenuDeleteColumn,
31
+ DeleteRow as TiptapMenuDeleteRow,
32
+ Details as TiptapMenuDetails,
33
+ H2 as TiptapMenuH2,
34
+ H3 as TiptapMenuH3,
35
+ H4 as TiptapMenuH4,
36
+ H5 as TiptapMenuH5,
37
+ H6 as TiptapMenuH6,
38
+ Highlight as TiptapMenuHighlight,
39
+ HorizontalRule as TiptapMenuHorizontalRule,
40
+ Italic as TiptapMenuItalic,
41
+ Link as TiptapMenuLink,
42
+ LinkOff as TiptapMenuLinkOff,
43
+ Math as TiptapMenuMath,
44
+ MergeCells as TiptapMenuMergeCells,
45
+ MythReality as TiptapMenuMythReality,
46
+ OrderedList as TiptapMenuOrderedList,
47
+ Prompt as TiptapMenuPrompt,
48
+ Redo as TiptapMenuRedo,
49
+ SplitCells as TiptapMenuSplitCells,
50
+ Strikethrough as TiptapMenuStrikethrough,
51
+ Subscript as TiptapMenuSubscript,
52
+ Superscript as TiptapMenuSuperscript,
53
+ Table as TiptapMenuTable,
54
+ TableColumnHeading as TiptapMenuTableColumnHeading,
55
+ TableRowHeading as TiptapMenuTableRowHeading,
56
+ TextColor as TiptapMenuTextColor,
57
+ Underline as TiptapMenuUnderline,
58
+ Undo as TiptapMenuUndo,
59
+ Video as TiptapMenuVideo,
60
+ } from './menu';
@@ -0,0 +1,10 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgAddImage = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ d="M19 5v14H5V5zm0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-4.86 8.86-3 3.87L9 13.14 6 17h12z"
7
+ />
8
+ </svg>
9
+ );
10
+ export default SvgAddImage;
@@ -0,0 +1,10 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgAlignCenter = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ d="M4.667 10v1.333h6.666V10zM2 14h12v-1.333H2zm0-5.333h12V7.333H2zm2.667-4V6h6.666V4.667zM2 2v1.333h12V2z"
7
+ />
8
+ </svg>
9
+ );
10
+ export default SvgAlignCenter;
@@ -0,0 +1,10 @@
1
+ import type { SVGProps } from 'react';
2
+ const SvgAlignLeft = (props: SVGProps<SVGSVGElement>) => (
3
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16" {...props}>
4
+ <path
5
+ fill="currentColor"
6
+ d="M10 10H2v1.333h8zm0-5.333H2V6h8zm-8 4h12V7.333H2zM2 14h12v-1.333H2zM2 2v1.333h12V2z"
7
+ />
8
+ </svg>
9
+ );
10
+ export default SvgAlignLeft;