diff --git a/src/components/custom-object-form/editor-styles.css b/src/components/custom-object-form/editor-styles.css
new file mode 100644
index 0000000..25eae6a
--- /dev/null
+++ b/src/components/custom-object-form/editor-styles.css
@@ -0,0 +1,757 @@
+body {
+ margin: 0;
+ background: #eee;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, ".SFNSText-Regular",
+ sans-serif;
+ font-weight: 500;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.other h2 {
+ font-size: 18px;
+ color: #444;
+ margin-bottom: 7px;
+}
+
+.other a {
+ color: #777;
+ text-decoration: underline;
+ font-size: 14px;
+}
+
+.other ul {
+ padding: 0;
+ margin: 0;
+ list-style-type: none;
+}
+
+.App {
+ font-family: sans-serif;
+ text-align: center;
+}
+
+h1 {
+ font-size: 24px;
+ color: #333;
+}
+
+.ltr {
+ text-align: left;
+}
+
+.rtl {
+ text-align: right;
+}
+
+.editor-container {
+ margin: 20px auto 20px auto;
+ border-radius: 2px;
+ max-width: 100%;
+ width: 100%;
+ color: #000;
+ position: relative;
+ line-height: 20px;
+ font-weight: 400;
+ text-align: left;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+}
+
+.editor-inner {
+ background: #fff;
+ position: relative;
+}
+
+.editor-input {
+ min-height: 150px;
+ resize: none;
+ font-size: 15px;
+ caret-color: rgb(5, 5, 5);
+ position: relative;
+ tab-size: 1;
+ outline: 0;
+ padding: 15px 10px;
+ caret-color: #444;
+}
+
+.editor-placeholder {
+ color: #999;
+ overflow: hidden;
+ position: absolute;
+ text-overflow: ellipsis;
+ top: 15px;
+ left: 10px;
+ font-size: 15px;
+ user-select: none;
+ display: inline-block;
+ pointer-events: none;
+}
+
+.editor-text-bold {
+ font-weight: bold;
+}
+
+.editor-text-italic {
+ font-style: italic;
+}
+
+.editor-text-underline {
+ text-decoration: underline;
+}
+
+.editor-text-strikethrough {
+ text-decoration: line-through;
+}
+
+.editor-text-underlineStrikethrough {
+ text-decoration: underline line-through;
+}
+
+.editor-text-code {
+ background-color: rgb(240, 242, 245);
+ padding: 1px 0.25rem;
+ font-family: Menlo, Consolas, Monaco, monospace;
+ font-size: 94%;
+}
+
+.editor-link {
+ color: rgb(33, 111, 219);
+ text-decoration: none;
+}
+
+.tree-view-output {
+ display: block;
+ background: #222;
+ color: #fff;
+ padding: 5px;
+ font-size: 12px;
+ white-space: pre-wrap;
+ margin: 1px auto 10px auto;
+ max-height: 250px;
+ position: relative;
+ border-bottom-left-radius: 10px;
+ border-bottom-right-radius: 10px;
+ overflow: auto;
+ line-height: 14px;
+}
+
+.editor-code {
+ background-color: rgb(240, 242, 245);
+ font-family: Menlo, Consolas, Monaco, monospace;
+ display: block;
+ padding: 8px 8px 8px 52px;
+ line-height: 1.53;
+ font-size: 13px;
+ margin: 0;
+ margin-top: 8px;
+ margin-bottom: 8px;
+ tab-size: 2;
+ /* white-space: pre; */
+ overflow-x: auto;
+ position: relative;
+}
+
+.editor-code:before {
+ content: attr(data-gutter);
+ position: absolute;
+ background-color: #eee;
+ left: 0;
+ top: 0;
+ border-right: 1px solid #ccc;
+ padding: 8px;
+ color: #777;
+ white-space: pre-wrap;
+ text-align: right;
+ min-width: 25px;
+}
+.editor-code:after {
+ content: attr(data-highlight-language);
+ top: 0;
+ right: 3px;
+ padding: 3px;
+ font-size: 10px;
+ text-transform: uppercase;
+ position: absolute;
+ color: rgba(0, 0, 0, 0.5);
+}
+
+.editor-tokenComment {
+ color: slategray;
+}
+
+.editor-tokenPunctuation {
+ color: #999;
+}
+
+.editor-tokenProperty {
+ color: #905;
+}
+
+.editor-tokenSelector {
+ color: #690;
+}
+
+.editor-tokenOperator {
+ color: #9a6e3a;
+}
+
+.editor-tokenAttr {
+ color: #07a;
+}
+
+.editor-tokenVariable {
+ color: #e90;
+}
+
+.editor-tokenFunction {
+ color: #dd4a68;
+}
+
+.editor-paragraph {
+ margin: 0;
+ margin-bottom: 8px;
+ position: relative;
+}
+
+.editor-paragraph:last-child {
+ margin-bottom: 0;
+}
+
+.editor-heading-h1 {
+ font-size: 24px;
+ color: rgb(5, 5, 5);
+ font-weight: 400;
+ margin: 0;
+ margin-bottom: 12px;
+ padding: 0;
+}
+
+.editor-heading-h2 {
+ font-size: 15px;
+ color: rgb(101, 103, 107);
+ font-weight: 700;
+ margin: 0;
+ margin-top: 10px;
+ padding: 0;
+ text-transform: uppercase;
+}
+
+.editor-quote {
+ margin: 0;
+ margin-left: 20px;
+ font-size: 15px;
+ color: rgb(101, 103, 107);
+ border-left-color: rgb(206, 208, 212);
+ border-left-width: 4px;
+ border-left-style: solid;
+ padding-left: 16px;
+}
+
+.editor-list-ol {
+ padding: 0;
+ margin: 0;
+ margin-left: 16px;
+}
+
+.editor-list-ul {
+ padding: 0;
+ margin: 0;
+ margin-left: 16px;
+}
+
+.editor-listitem {
+ margin: 8px 32px 8px 32px;
+}
+
+.editor-nested-listitem {
+ list-style-type: none;
+}
+
+pre::-webkit-scrollbar {
+ background: transparent;
+ width: 10px;
+}
+
+pre::-webkit-scrollbar-thumb {
+ background: #999;
+}
+
+.debug-timetravel-panel {
+ overflow: hidden;
+ padding: 0 0 10px 0;
+ margin: auto;
+ display: flex;
+}
+
+.debug-timetravel-panel-slider {
+ padding: 0;
+ flex: 8;
+}
+
+.debug-timetravel-panel-button {
+ padding: 0;
+ border: 0;
+ background: none;
+ flex: 1;
+ color: #fff;
+ font-size: 12px;
+}
+
+.debug-timetravel-panel-button:hover {
+ text-decoration: underline;
+}
+
+.debug-timetravel-button {
+ border: 0;
+ padding: 0;
+ font-size: 12px;
+ top: 10px;
+ right: 15px;
+ position: absolute;
+ background: none;
+ color: #fff;
+}
+
+.debug-timetravel-button:hover {
+ text-decoration: underline;
+}
+
+.emoji {
+ color: transparent;
+ background-size: 16px 16px;
+ background-position: center;
+ background-repeat: no-repeat;
+ vertical-align: middle;
+ margin: 0 -1px;
+}
+
+.emoji-inner {
+ padding: 0 0.15em;
+}
+
+.emoji-inner::selection {
+ color: transparent;
+ background-color: rgba(150, 150, 150, 0.4);
+}
+
+.emoji-inner::moz-selection {
+ color: transparent;
+ background-color: rgba(150, 150, 150, 0.4);
+}
+
+.emoji.happysmile {
+ /* background-image: url(./images/emoji/1F642.png); */ /* Path needs adjustment if images are used */
+}
+
+.toolbar {
+ display: flex;
+ margin-bottom: 1px;
+ background: #fff;
+ padding: 4px;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ vertical-align: middle;
+}
+
+.toolbar button.toolbar-item {
+ border: 0;
+ display: flex;
+ background: none;
+ border-radius: 10px;
+ padding: 8px;
+ cursor: pointer;
+ vertical-align: middle;
+}
+
+.toolbar button.toolbar-item:disabled {
+ cursor: not-allowed;
+}
+
+.toolbar button.toolbar-item.spaced {
+ margin-right: 2px;
+}
+
+.toolbar button.toolbar-item i.format {
+ background-size: contain;
+ display: inline-block;
+ height: 18px;
+ width: 18px;
+ margin-top: 2px;
+ vertical-align: -0.25em;
+ display: flex;
+ opacity: 0.6;
+}
+
+.toolbar button.toolbar-item:disabled i.format {
+ opacity: 0.2;
+}
+
+.toolbar button.toolbar-item.active {
+ background-color: rgba(223, 232, 250, 0.3);
+}
+
+.toolbar button.toolbar-item.active i {
+ opacity: 1;
+}
+
+.toolbar .toolbar-item:hover:not([disabled]) {
+ background-color: #eee;
+}
+
+.toolbar .divider {
+ width: 1px;
+ background-color: #eee;
+ margin: 0 4px;
+}
+
+.toolbar select.toolbar-item {
+ border: 0;
+ display: flex;
+ background: none;
+ border-radius: 10px;
+ padding: 8px;
+ vertical-align: middle;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ width: 70px;
+ font-size: 14px;
+ color: #777;
+ text-overflow: ellipsis;
+}
+
+.toolbar select.code-language {
+ text-transform: capitalize;
+ width: 130px;
+}
+
+.toolbar .toolbar-item .text {
+ display: flex;
+ line-height: 20px;
+ width: 200px;
+ vertical-align: middle;
+ font-size: 14px;
+ color: #777;
+ text-overflow: ellipsis;
+ width: 70px;
+ overflow: hidden;
+ height: 20px;
+ text-align: left;
+}
+
+.toolbar .toolbar-item .icon {
+ display: flex;
+ width: 20px;
+ height: 20px;
+ user-select: none;
+ margin-right: 8px;
+ line-height: 16px;
+ background-size: contain;
+}
+
+.toolbar i.chevron-down {
+ margin-top: 3px;
+ width: 16px;
+ height: 16px;
+ display: flex;
+ user-select: none;
+ /* background-image: url(images/icons/chevron-down.svg); */ /* Path needs adjustment - REMOVED */
+}
+
+.toolbar i.chevron-down.inside {
+ width: 16px;
+ height: 16px;
+ display: flex;
+ margin-left: -25px;
+ margin-top: 11px;
+ margin-right: 10px;
+ pointer-events: none;
+}
+
+i.chevron-down {
+ background-color: transparent;
+ background-size: contain;
+ display: inline-block;
+ height: 8px;
+ width: 8px;
+ /* background-image: url(images/icons/chevron-down.svg); */ /* Path needs adjustment - REMOVED */
+}
+
+#block-controls button:hover {
+ background-color: #efefef;
+}
+
+#block-controls button:focus-visible {
+ border-color: blue;
+}
+
+#block-controls span.block-type {
+ background-size: contain;
+ display: block;
+ width: 18px;
+ height: 18px;
+ margin: 2px;
+}
+
+/* Commenting out icon paths, as they are not available in this project */
+/* #block-controls span.block-type.paragraph {
+ background-image: url(images/icons/text-paragraph.svg);
+}
+
+#block-controls span.block-type.h1 {
+ background-image: url(images/icons/type-h1.svg);
+}
+
+#block-controls span.block-type.h2 {
+ background-image: url(images/icons/type-h2.svg);
+}
+
+#block-controls span.block-type.quote {
+ background-image: url(images/icons/chat-square-quote.svg);
+}
+
+#block-controls span.block-type.ul {
+ background-image: url(images/icons/list-ul.svg);
+}
+
+#block-controls span.block-type.ol {
+ background-image: url(images/icons/list-ol.svg);
+}
+
+#block-controls span.block-type.code {
+ background-image: url(images/icons/code.svg);
+} */
+
+.dropdown {
+ z-index: 5;
+ display: block;
+ position: absolute;
+ box-shadow: 0 12px 28px 0 rgba(0, 0, 0, 0.2), 0 2px 4px 0 rgba(0, 0, 0, 0.1),
+ inset 0 0 0 1px rgba(255, 255, 255, 0.5);
+ border-radius: 8px;
+ min-width: 100px;
+ min-height: 40px;
+ background-color: #fff;
+}
+
+.dropdown .item {
+ margin: 0 8px 0 8px;
+ padding: 8px;
+ color: #050505;
+ cursor: pointer;
+ line-height: 16px;
+ font-size: 15px;
+ display: flex;
+ align-content: center;
+ flex-direction: row;
+ flex-shrink: 0;
+ justify-content: space-between;
+ background-color: #fff;
+ border-radius: 8px;
+ border: 0;
+ min-width: 268px;
+}
+
+.dropdown .item .active {
+ display: flex;
+ width: 20px;
+ height: 20px;
+ background-size: contain;
+}
+
+.dropdown .item:first-child {
+ margin-top: 8px;
+}
+
+.dropdown .item:last-child {
+ margin-bottom: 8px;
+}
+
+.dropdown .item:hover {
+ background-color: #eee;
+}
+
+.dropdown .item .text {
+ display: flex;
+ line-height: 20px;
+ flex-grow: 1;
+ width: 200px;
+}
+
+.dropdown .item .icon {
+ display: flex;
+ width: 20px;
+ height: 20px;
+ user-select: none;
+ margin-right: 12px;
+ line-height: 16px;
+ background-size: contain;
+}
+
+.link-editor {
+ position: absolute;
+ z-index: 100;
+ top: -10000px;
+ left: -10000px;
+ margin-top: -6px;
+ max-width: 300px;
+ width: 100%;
+ opacity: 0;
+ background-color: #fff;
+ box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.3);
+ border-radius: 8px;
+ transition: opacity 0.5s;
+}
+
+.link-editor .link-input {
+ display: block;
+ width: calc(100% - 24px);
+ box-sizing: border-box;
+ margin: 8px 12px;
+ padding: 8px 12px;
+ border-radius: 15px;
+ background-color: #eee;
+ font-size: 15px;
+ color: rgb(5, 5, 5);
+ border: 0;
+ outline: 0;
+ position: relative;
+ font-family: inherit;
+}
+
+.link-editor div.link-edit {
+ /* background-image: url(images/icons/pencil-fill.svg); */ /* Path needs adjustment - REMOVED */
+ background-size: 16px;
+ background-position: center;
+ background-repeat: no-repeat;
+ width: 35px;
+ vertical-align: -0.25em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ cursor: pointer;
+}
+
+.link-editor .link-input a {
+ color: rgb(33, 111, 219);
+ text-decoration: none;
+ display: block;
+ white-space: nowrap;
+ overflow: hidden;
+ margin-right: 30px;
+ text-overflow: ellipsis;
+}
+
+.link-editor .link-input a:hover {
+ text-decoration: underline;
+}
+
+.link-editor .button {
+ width: 20px;
+ height: 20px;
+ display: inline-block;
+ padding: 6px;
+ border-radius: 8px;
+ cursor: pointer;
+ margin: 0 2px;
+}
+
+.link-editor .button.hovered {
+ width: 20px;
+ height: 20px;
+ display: inline-block;
+ background-color: #eee;
+}
+
+.link-editor .button i,
+.actions i {
+ background-size: contain;
+ display: inline-block;
+ height: 20px;
+ width: 20px;
+ vertical-align: -0.25em;
+}
+
+/* Icon classes - commenting out as image paths are not available */
+/*
+i.undo {
+ background-image: url(images/icons/arrow-counterclockwise.svg);
+}
+
+i.redo {
+ background-image: url(images/icons/arrow-clockwise.svg);
+}
+
+.icon.paragraph {
+ background-image: url(images/icons/text-paragraph.svg);
+}
+
+.icon.large-heading,
+.icon.h1 {
+ background-image: url(images/icons/type-h1.svg);
+}
+
+.icon.small-heading,
+.icon.h2 {
+ background-image: url(images/icons/type-h2.svg);
+}
+
+.icon.bullet-list,
+.icon.ul {
+ background-image: url(images/icons/list-ul.svg);
+}
+
+.icon.numbered-list,
+.icon.ol {
+ background-image: url(images/icons/list-ol.svg);
+}
+
+.icon.quote {
+ background-image: url(images/icons/chat-square-quote.svg);
+}
+
+.icon.code {
+ background-image: url(images/icons/code.svg);
+}
+
+i.bold {
+ background-image: url(images/icons/type-bold.svg);
+}
+
+i.italic {
+ background-image: url(images/icons/type-italic.svg);
+}
+
+i.underline {
+ background-image: url(images/icons/type-underline.svg);
+}
+
+i.strikethrough {
+ background-image: url(images/icons/type-strikethrough.svg);
+}
+
+i.code {
+ background-image: url(images/icons/code.svg);
+}
+
+i.link {
+ background-image: url(images/icons/link.svg);
+}
+
+i.left-align {
+ background-image: url(images/icons/text-left.svg);
+}
+
+i.center-align {
+ background-image: url(images/icons/text-center.svg);
+}
+
+i.right-align {
+ background-image: url(images/icons/text-right.svg);
+}
+
+i.justify-align {
+ background-image: url(images/icons/justify.svg);
+}
+*/
\ No newline at end of file
diff --git a/src/components/custom-object-form/lexical-editor-field.tsx b/src/components/custom-object-form/lexical-editor-field.tsx
new file mode 100644
index 0000000..e3ad061
--- /dev/null
+++ b/src/components/custom-object-form/lexical-editor-field.tsx
@@ -0,0 +1,119 @@
+import { FC, ReactNode, ReactElement } from 'react';
+import { LexicalComposer } from '@lexical/react/LexicalComposer';
+import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';
+import { ContentEditable } from '@lexical/react/LexicalContentEditable';
+import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';
+import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';
+import { EditorState, LexicalEditor } from 'lexical';
+import { HeadingNode, QuoteNode } from '@lexical/rich-text';
+import { TableCellNode, TableNode, TableRowNode } from "@lexical/table";
+import { ListItemNode, ListNode } from '@lexical/list';
+import { CodeHighlightNode, CodeNode } from '@lexical/code';
+import { AutoLinkNode, LinkNode } from '@lexical/link';
+import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin";
+import { ListPlugin } from '@lexical/react/LexicalListPlugin';
+import { MarkdownShortcutPlugin } from "@lexical/react/LexicalMarkdownShortcutPlugin";
+import { TRANSFORMERS } from "@lexical/markdown";
+import { LexicalErrorBoundary } from "@lexical/react/LexicalErrorBoundary";
+import { AutoFocusPlugin } from "@lexical/react/LexicalAutoFocusPlugin";
+
+import ExampleTheme from "./themes/ExampleTheme";
+import ToolbarPlugin from "./plugins/ToolbarPlugin";
+import TreeViewPlugin from "./plugins/TreeViewPlugin";
+import ListMaxIndentLevelPlugin from "./plugins/ListMaxIndentLevelPlugin";
+import CodeHighlightPlugin from "./plugins/CodeHighlightPlugin";
+import AutoLinkPlugin from "./plugins/AutoLinkPlugin";
+
+import './editor-styles.css'; // Import the new styles
+
+// Simple Loading Component for RichTextPlugin ErrorBoundary
+const LoadingComponent: FC = () => {
+ return
Loading...
;
+};
+
+function Placeholder() {
+ return
Enter some rich text...
;
+}
+
+
+type LexicalEditorFieldProps = {
+ name: string;
+ initialValue?: string;
+ onChange: (fieldName: string, value: string) => void;
+ onBlur?: (fieldName: string, touched: boolean) => void;
+};
+
+const LexicalEditorField: FC
= ({ name, initialValue, onChange, onBlur }) => {
+ const initialEditorConfig = {
+ namespace: `LexicalEditor-${name}`,
+ theme: ExampleTheme,
+ onError: (error: Error) => {
+ console.error("Lexical Error:", error);
+ // Potentially delegate to a global error handler or display a user-facing message
+ throw error;
+ },
+ nodes: [
+ HeadingNode,
+ ListNode,
+ ListItemNode,
+ QuoteNode,
+ CodeNode,
+ CodeHighlightNode,
+ TableNode,
+ TableCellNode,
+ TableRowNode,
+ AutoLinkNode,
+ LinkNode
+ ],
+ editorState: initialValue
+ ? (editor: LexicalEditor) => {
+ try {
+ const parsedEditorState = editor.parseEditorState(initialValue);
+ editor.setEditorState(parsedEditorState);
+ } catch (e) {
+ // If JSON is invalid or not an editor state, Lexical will start with an empty state.
+ console.warn("Invalid initial value for editor", e)
+ }
+ }
+ : undefined,
+ };
+
+ const handleLexicalChange = (editorState: EditorState) => {
+ const jsonString = JSON.stringify(editorState.toJSON());
+ onChange(name, jsonString);
+ };
+
+ const handleLexicalBlur = () => {
+ if (onBlur) {
+ onBlur(name, true);
+ }
+ };
+
+
+ return (
+
+
+
+
+
}
+ placeholder={
}
+ ErrorBoundary={LoadingComponent}
+ />
+ {/*
+
*/}
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default LexicalEditorField;
\ No newline at end of file
diff --git a/src/components/custom-object-form/plugins/AutoLinkPlugin.tsx b/src/components/custom-object-form/plugins/AutoLinkPlugin.tsx
new file mode 100644
index 0000000..cf17b18
--- /dev/null
+++ b/src/components/custom-object-form/plugins/AutoLinkPlugin.tsx
@@ -0,0 +1,44 @@
+import { AutoLinkPlugin as LexicalAutoLinkPlugin } from "@lexical/react/LexicalAutoLinkPlugin";
+import { FC } from "react";
+
+// Define matchers with RegExp literals
+const URL_MATCHER = new RegExp(
+ /((https?:\/\/(www\.)?)|(www\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/
+);
+
+const EMAIL_MATCHER = new RegExp(
+ /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/
+);
+
+const MATCHERS = [
+ (text: string) => {
+ const match = URL_MATCHER.exec(text);
+ if (match === null) {
+ return null;
+ }
+ return {
+ index: match.index,
+ length: match[0].length,
+ text: match[0],
+ url: match[0],
+ };
+ },
+ (text: string) => {
+ const match = EMAIL_MATCHER.exec(text);
+ if (match === null) {
+ return null;
+ }
+ return {
+ index: match.index,
+ length: match[0].length,
+ text: match[0],
+ url: `mailto:${match[0]}`,
+ };
+ },
+];
+
+const AutoLinkPlugin: FC = () => {
+ return ;
+}
+
+export default AutoLinkPlugin;
\ No newline at end of file
diff --git a/src/components/custom-object-form/plugins/CodeHighlightPlugin.tsx b/src/components/custom-object-form/plugins/CodeHighlightPlugin.tsx
new file mode 100644
index 0000000..b9946fe
--- /dev/null
+++ b/src/components/custom-object-form/plugins/CodeHighlightPlugin.tsx
@@ -0,0 +1,13 @@
+import { registerCodeHighlighting } from "@lexical/code";
+import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
+import { FC, useEffect } from "react";
+
+const CodeHighlightPlugin: FC = () => {
+ const [editor] = useLexicalComposerContext();
+ useEffect(() => {
+ return registerCodeHighlighting(editor);
+ }, [editor]);
+ return null;
+}
+
+export default CodeHighlightPlugin;
\ No newline at end of file
diff --git a/src/components/custom-object-form/plugins/ListMaxIndentLevelPlugin.tsx b/src/components/custom-object-form/plugins/ListMaxIndentLevelPlugin.tsx
new file mode 100644
index 0000000..b81b194
--- /dev/null
+++ b/src/components/custom-object-form/plugins/ListMaxIndentLevelPlugin.tsx
@@ -0,0 +1,75 @@
+import { $getListDepth, $isListItemNode, $isListNode } from "@lexical/list";
+import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
+import {
+ $getSelection,
+ $isElementNode,
+ $isRangeSelection,
+ INDENT_CONTENT_COMMAND,
+ COMMAND_PRIORITY_HIGH,
+ LexicalEditor,
+ RangeSelection,
+ ElementNode
+} from "lexical";
+import { FC, useEffect } from "react";
+
+function getElementNodesInSelection(selection: RangeSelection): Set {
+ const nodesInSelection = selection.getNodes();
+
+ if (nodesInSelection.length === 0) {
+ return new Set([
+ selection.anchor.getNode().getParentOrThrow(),
+ selection.focus.getNode().getParentOrThrow()
+ ]);
+ }
+
+ return new Set(
+ nodesInSelection.map((n) => ($isElementNode(n) ? n : n.getParentOrThrow()))
+ );
+}
+
+function isIndentPermitted(maxDepth: number): boolean {
+ const selection = $getSelection();
+
+ if (!$isRangeSelection(selection)) {
+ return false;
+ }
+
+ const elementNodesInSelection = getElementNodesInSelection(selection);
+
+ let totalDepth = 0;
+
+ for (const elementNode of elementNodesInSelection) {
+ if ($isListNode(elementNode)) {
+ totalDepth = Math.max($getListDepth(elementNode) + 1, totalDepth);
+ } else if ($isListItemNode(elementNode)) {
+ const parent = elementNode.getParent();
+ if (!$isListNode(parent)) {
+ throw new Error(
+ "ListMaxIndentLevelPlugin: A ListItemNode must have a ListNode for a parent."
+ );
+ }
+ totalDepth = Math.max($getListDepth(parent) + 1, totalDepth);
+ }
+ }
+ return totalDepth <= maxDepth;
+}
+
+interface ListMaxIndentLevelPluginProps {
+ maxDepth?: number;
+}
+
+const ListMaxIndentLevelPlugin: FC = ({ maxDepth }) => {
+ const [editor] = useLexicalComposerContext();
+
+ useEffect(() => {
+ return editor.registerCommand(
+ INDENT_CONTENT_COMMAND,
+ () => !isIndentPermitted(maxDepth ?? 7),
+ COMMAND_PRIORITY_HIGH
+ );
+ }, [editor, maxDepth]);
+
+ return null;
+}
+
+export default ListMaxIndentLevelPlugin;
\ No newline at end of file
diff --git a/src/components/custom-object-form/plugins/SvgIcon.tsx b/src/components/custom-object-form/plugins/SvgIcon.tsx
new file mode 100644
index 0000000..9b41529
--- /dev/null
+++ b/src/components/custom-object-form/plugins/SvgIcon.tsx
@@ -0,0 +1,26 @@
+import React, { FC } from 'react';
+
+interface SvgIconProps {
+ iconName: string;
+ alt?: string;
+ className?: string;
+ width?: string | number;
+ height?: string | number;
+}
+
+const SvgIcon: FC = ({ iconName, alt, className, width = 20, height = 20 }) => {
+ const iconPath = '/assets/icons/' + iconName + '.svg';
+
+ return (
+
+ );
+};
+
+export default SvgIcon;
\ No newline at end of file
diff --git a/src/components/custom-object-form/plugins/ToolbarPlugin.tsx b/src/components/custom-object-form/plugins/ToolbarPlugin.tsx
new file mode 100644
index 0000000..a82e06b
--- /dev/null
+++ b/src/components/custom-object-form/plugins/ToolbarPlugin.tsx
@@ -0,0 +1,642 @@
+import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
+import { FC, useCallback, useEffect, useMemo, useRef, useState } from "react";
+import {
+ CAN_REDO_COMMAND,
+ CAN_UNDO_COMMAND,
+ REDO_COMMAND,
+ UNDO_COMMAND,
+ SELECTION_CHANGE_COMMAND,
+ FORMAT_TEXT_COMMAND,
+ FORMAT_ELEMENT_COMMAND,
+ $getSelection,
+ $isRangeSelection,
+ $createParagraphNode,
+ $getNodeByKey,
+ LexicalEditor,
+ RangeSelection,
+ NodeKey,
+ EditorState
+} from "lexical";
+import { $isLinkNode, TOGGLE_LINK_COMMAND } from "@lexical/link";
+import {
+ $isParentElementRTL,
+ $wrapNodes,
+ $isAtNodeEnd
+} from "@lexical/selection";
+import { $getNearestNodeOfType, mergeRegister } from "@lexical/utils";
+import {
+ INSERT_ORDERED_LIST_COMMAND,
+ INSERT_UNORDERED_LIST_COMMAND,
+ REMOVE_LIST_COMMAND,
+ $isListNode,
+ ListNode
+} from "@lexical/list";
+import { createPortal } from "react-dom";
+import {
+ $createHeadingNode,
+ $createQuoteNode,
+ $isHeadingNode,
+ HeadingTagType
+} from "@lexical/rich-text";
+import {
+ $createCodeNode,
+ $isCodeNode,
+ getDefaultCodeLanguage,
+ getCodeLanguages
+} from "@lexical/code";
+import DropdownMenu from '@commercetools-uikit/dropdown-menu';
+import SvgIcon from './SvgIcon';
+
+const LowPriority = 1;
+
+const supportedBlockTypes = new Set([
+ "paragraph",
+ "quote",
+ "code",
+ "h1",
+ "h2",
+ "ul",
+ "ol"
+]);
+
+const blockTypeToBlockName: Record = {
+ code: "Code Block",
+ h1: "Large Heading",
+ h2: "Small Heading",
+ h3: "Heading",
+ h4: "Heading",
+ h5: "Heading",
+ ol: "Numbered List",
+ paragraph: "Normal",
+ quote: "Quote",
+ ul: "Bulleted List"
+};
+
+const Divider: FC = () => {
+ return ;
+}
+
+function positionEditorElement(editor: HTMLElement, rect: DOMRect | null) {
+ if (rect === null) {
+ editor.style.opacity = "0";
+ editor.style.top = "-1000px";
+ editor.style.left = "-1000px";
+ } else {
+ editor.style.opacity = "1";
+ editor.style.top = `${rect.top + rect.height + window.pageYOffset + 10}px`;
+ editor.style.left = `${rect.left + window.pageXOffset - editor.offsetWidth / 2 + rect.width / 2
+ }px`;
+ }
+}
+
+interface FloatingLinkEditorProps {
+ editor: LexicalEditor;
+}
+
+const FloatingLinkEditor: FC = ({ editor }) => {
+ const editorRef = useRef(null);
+ const inputRef = useRef(null);
+ const mouseDownRef = useRef(false);
+ const [linkUrl, setLinkUrl] = useState("");
+ const [isEditMode, setEditMode] = useState(false);
+ const [lastSelection, setLastSelection] = useState(null);
+
+ const updateLinkEditor = useCallback(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ const node = getSelectedNode(selection);
+ const parent = node.getParent();
+ if ($isLinkNode(parent)) {
+ setLinkUrl(parent.getURL());
+ } else if ($isLinkNode(node)) {
+ setLinkUrl(node.getURL());
+ } else {
+ setLinkUrl("");
+ }
+ }
+ const editorElem = editorRef.current;
+ const nativeSelection = window.getSelection();
+ const activeElement = document.activeElement;
+
+ if (editorElem === null) {
+ return;
+ }
+
+ const rootElement = editor.getRootElement();
+ if (
+ selection !== null &&
+ nativeSelection &&
+ !nativeSelection.isCollapsed &&
+ rootElement !== null &&
+ rootElement.contains(nativeSelection.anchorNode)
+ ) {
+ const domRange = nativeSelection.getRangeAt(0);
+ let rect;
+ if (nativeSelection.anchorNode === rootElement) {
+ let inner = rootElement;
+ while (inner.firstElementChild != null) {
+ inner = inner.firstElementChild as HTMLElement;
+ }
+ rect = inner.getBoundingClientRect();
+ } else {
+ rect = domRange.getBoundingClientRect();
+ }
+
+ if (!mouseDownRef.current) {
+ positionEditorElement(editorElem, rect);
+ }
+ setLastSelection(selection as RangeSelection | null);
+ } else if (!activeElement || activeElement.className !== "link-input") {
+ positionEditorElement(editorElem, null);
+ setLastSelection(null);
+ setEditMode(false);
+ setLinkUrl("");
+ }
+
+ return true;
+ }, [editor]);
+
+ useEffect(() => {
+ return mergeRegister(
+ editor.registerUpdateListener(({ editorState }: { editorState: EditorState }) => {
+ editorState.read(() => {
+ updateLinkEditor();
+ });
+ }),
+
+ editor.registerCommand(
+ SELECTION_CHANGE_COMMAND,
+ () => {
+ updateLinkEditor();
+ return true;
+ },
+ LowPriority
+ )
+ );
+ }, [editor, updateLinkEditor]);
+
+ useEffect(() => {
+ editor.getEditorState().read(() => {
+ updateLinkEditor();
+ });
+ }, [editor, updateLinkEditor]);
+
+ useEffect(() => {
+ if (isEditMode && inputRef.current) {
+ inputRef.current.focus();
+ }
+ }, [isEditMode]);
+
+ return (
+
+ {isEditMode ? (
+
{
+ setLinkUrl(event.target.value);
+ }}
+ onKeyDown={(event) => {
+ if (event.key === "Enter") {
+ event.preventDefault();
+ if (lastSelection !== null) {
+ if (linkUrl !== "") {
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, linkUrl);
+ }
+ setEditMode(false);
+ }
+ } else if (event.key === "Escape") {
+ event.preventDefault();
+ setEditMode(false);
+ }
+ }}
+ />
+ ) : (
+ <>
+
+
+ {linkUrl}
+
+
event.preventDefault()}
+ onClick={() => {
+ setEditMode(true);
+ }}
+ />
+
+ >
+ )}
+
+ );
+}
+
+interface SelectProps {
+ onChange: (event: React.ChangeEvent
) => void;
+ className: string;
+ options: string[];
+ value: string;
+}
+
+const Select: FC = ({ onChange, className, options, value }) => {
+ return (
+
+ );
+}
+
+function getSelectedNode(selection: RangeSelection) {
+ const anchor = selection.anchor;
+ const focus = selection.focus;
+ const anchorNode = selection.anchor.getNode();
+ const focusNode = selection.focus.getNode();
+ if (anchorNode === focusNode) {
+ return anchorNode;
+ }
+ const isBackward = selection.isBackward();
+ if (isBackward) {
+ return $isAtNodeEnd(focus) ? anchorNode : focusNode;
+ } else {
+ return $isAtNodeEnd(anchor) ? focusNode : anchorNode;
+ }
+}
+
+const ToolbarPlugin: FC = () => {
+ const [editor] = useLexicalComposerContext();
+ const toolbarRef = useRef(null);
+ const [canUndo, setCanUndo] = useState(false);
+ const [canRedo, setCanRedo] = useState(false);
+ const [blockType, setBlockType] = useState("paragraph");
+ const [selectedElementKey, setSelectedElementKey] = useState(null);
+ const [codeLanguage, setCodeLanguage] = useState("");
+ const [isRTL, setIsRTL] = useState(false);
+ const [isLink, setIsLink] = useState(false);
+ const [isBold, setIsBold] = useState(false);
+ const [isItalic, setIsItalic] = useState(false);
+ const [isUnderline, setIsUnderline] = useState(false);
+ const [isStrikethrough, setIsStrikethrough] = useState(false);
+ const [isCode, setIsCode] = useState(false);
+
+ const updateToolbar = useCallback(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ const anchorNode = selection.anchor.getNode();
+ const element =
+ anchorNode.getKey() === "root"
+ ? anchorNode
+ : anchorNode.getTopLevelElementOrThrow();
+ const elementKey = element.getKey();
+ const elementDOM = editor.getElementByKey(elementKey);
+ if (elementDOM !== null) {
+ setSelectedElementKey(elementKey);
+ if ($isListNode(element)) {
+ const parentList = $getNearestNodeOfType(anchorNode, ListNode);
+ const type = parentList ? parentList.getTag() : element.getTag();
+ setBlockType(type);
+ } else {
+ const type = $isHeadingNode(element)
+ ? element.getTag()
+ : element.getType();
+ setBlockType(type);
+ if ($isCodeNode(element)) {
+ setCodeLanguage(element.getLanguage() || getDefaultCodeLanguage());
+ }
+ }
+ }
+ // Update text format
+ setIsBold(selection.hasFormat("bold"));
+ setIsItalic(selection.hasFormat("italic"));
+ setIsUnderline(selection.hasFormat("underline"));
+ setIsStrikethrough(selection.hasFormat("strikethrough"));
+ setIsCode(selection.hasFormat("code"));
+ setIsRTL($isParentElementRTL(selection));
+
+ // Update links
+ const node = getSelectedNode(selection);
+ const parent = node.getParent();
+ if ($isLinkNode(parent) || $isLinkNode(node)) {
+ setIsLink(true);
+ } else {
+ setIsLink(false);
+ }
+ }
+ }, [editor]);
+
+ useEffect(() => {
+ return mergeRegister(
+ editor.registerUpdateListener(({ editorState }: { editorState: EditorState }) => {
+ editorState.read(() => {
+ updateToolbar();
+ });
+ }),
+ editor.registerCommand(
+ SELECTION_CHANGE_COMMAND,
+ (_payload, newEditor) => {
+ updateToolbar();
+ return false;
+ },
+ LowPriority
+ ),
+ editor.registerCommand(
+ CAN_UNDO_COMMAND,
+ (payload: boolean) => {
+ setCanUndo(payload);
+ return false;
+ },
+ LowPriority
+ ),
+ editor.registerCommand(
+ CAN_REDO_COMMAND,
+ (payload: boolean) => {
+ setCanRedo(payload);
+ return false;
+ },
+ LowPriority
+ )
+ );
+ }, [editor, updateToolbar]);
+
+ const codeLanguages = useMemo(() => getCodeLanguages(), []);
+ const onCodeLanguageSelect = useCallback(
+ (e: React.ChangeEvent) => {
+ editor.update(() => {
+ if (selectedElementKey !== null) {
+ const node = $getNodeByKey(selectedElementKey);
+ if ($isCodeNode(node)) {
+ node.setLanguage(e.target.value);
+ }
+ }
+ });
+ },
+ [editor, selectedElementKey]
+ );
+
+ const insertLink = useCallback(() => {
+ if (!isLink) {
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, "https://");
+ } else {
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
+ }
+ }, [editor, isLink]);
+
+ const formatParagraph = () => {
+ if (blockType !== "paragraph") {
+ editor.update(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ $wrapNodes(selection, () => $createParagraphNode());
+ }
+ });
+ }
+ };
+
+ const formatLargeHeading = () => {
+ if (blockType !== "h1") {
+ editor.update(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ $wrapNodes(selection, () => $createHeadingNode("h1"));
+ }
+ });
+ }
+ };
+
+ const formatSmallHeading = () => {
+ if (blockType !== "h2") {
+ editor.update(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ $wrapNodes(selection, () => $createHeadingNode("h2"));
+ }
+ });
+ }
+ };
+
+ const formatBulletList = () => {
+ if (blockType !== "ul") {
+ editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);
+ } else {
+ editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);
+ }
+ };
+
+ const formatNumberedList = () => {
+ if (blockType !== "ol") {
+ editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);
+ } else {
+ editor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);
+ }
+ };
+
+ const formatQuote = () => {
+ if (blockType !== "quote") {
+ editor.update(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ $wrapNodes(selection, () => $createQuoteNode());
+ }
+ });
+ }
+ };
+
+ const formatCode = () => {
+ if (blockType !== "code") {
+ editor.update(() => {
+ const selection = $getSelection();
+ if ($isRangeSelection(selection)) {
+ $wrapNodes(selection, () => $createCodeNode());
+ }
+ });
+ }
+ };
+
+ const triggerElement = (
+
+ );
+
+ return (
+
+
+
+
+ {supportedBlockTypes.has(blockType) && (
+ <>
+
+
+ Normal
+
+
+ Large Heading
+
+
+ Small Heading
+
+
+ Bullet List
+
+
+ Numbered List
+
+
+ Quote
+
+
+ Code Block
+
+
+
+ >
+ )}
+ {blockType === "code" ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+
+
+
+
+
+ {isLink &&
+ createPortal(
, document.body)}
+
+
+
+
+
{" "}
+ >
+ )}
+
+ );
+}
+
+export default ToolbarPlugin;
\ No newline at end of file
diff --git a/src/components/custom-object-form/plugins/TreeViewPlugin.tsx b/src/components/custom-object-form/plugins/TreeViewPlugin.tsx
new file mode 100644
index 0000000..900657b
--- /dev/null
+++ b/src/components/custom-object-form/plugins/TreeViewPlugin.tsx
@@ -0,0 +1,19 @@
+import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
+import { TreeView } from "@lexical/react/LexicalTreeView";
+import { FC } from "react";
+
+const TreeViewPlugin: FC = () => {
+ const [editor] = useLexicalComposerContext();
+ return (
+
+ );
+}
+
+export default TreeViewPlugin;
\ No newline at end of file
diff --git a/src/components/custom-object-form/themes/ExampleTheme.ts b/src/components/custom-object-form/themes/ExampleTheme.ts
new file mode 100644
index 0000000..555a2b3
--- /dev/null
+++ b/src/components/custom-object-form/themes/ExampleTheme.ts
@@ -0,0 +1,69 @@
+const exampleTheme = {
+ ltr: "ltr",
+ rtl: "rtl",
+ placeholder: "editor-placeholder",
+ paragraph: "editor-paragraph",
+ quote: "editor-quote",
+ heading: {
+ h1: "editor-heading-h1",
+ h2: "editor-heading-h2",
+ h3: "editor-heading-h3",
+ h4: "editor-heading-h4",
+ h5: "editor-heading-h5"
+ },
+ list: {
+ nested: {
+ listitem: "editor-nested-listitem"
+ },
+ ol: "editor-list-ol",
+ ul: "editor-list-ul",
+ listitem: "editor-listitem"
+ },
+ image: "editor-image",
+ link: "editor-link",
+ text: {
+ bold: "editor-text-bold",
+ italic: "editor-text-italic",
+ overflowed: "editor-text-overflowed",
+ hashtag: "editor-text-hashtag",
+ underline: "editor-text-underline",
+ strikethrough: "editor-text-strikethrough",
+ underlineStrikethrough: "editor-text-underlineStrikethrough",
+ code: "editor-text-code"
+ },
+ code: "editor-code",
+ codeHighlight: {
+ atrule: "editor-tokenAttr",
+ attr: "editor-tokenAttr",
+ boolean: "editor-tokenProperty",
+ builtin: "editor-tokenSelector",
+ cdata: "editor-tokenComment",
+ char: "editor-tokenSelector",
+ class: "editor-tokenFunction",
+ "class-name": "editor-tokenFunction",
+ comment: "editor-tokenComment",
+ constant: "editor-tokenProperty",
+ deleted: "editor-tokenProperty",
+ doctype: "editor-tokenComment",
+ entity: "editor-tokenOperator",
+ function: "editor-tokenFunction",
+ important: "editor-tokenVariable",
+ inserted: "editor-tokenSelector",
+ keyword: "editor-tokenAttr",
+ namespace: "editor-tokenVariable",
+ number: "editor-tokenProperty",
+ operator: "editor-tokenOperator",
+ prolog: "editor-tokenComment",
+ property: "editor-tokenProperty",
+ punctuation: "editor-tokenPunctuation",
+ regex: "editor-tokenVariable",
+ selector: "editor-tokenSelector",
+ string: "editor-tokenSelector",
+ symbol: "editor-tokenProperty",
+ tag: "editor-tokenProperty",
+ url: "editor-tokenOperator",
+ variable: "editor-tokenVariable"
+ }
+};
+
+export default exampleTheme;
\ No newline at end of file
diff --git a/src/constants.ts b/src/constants.ts
index 401f38e..0fd24dd 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -36,6 +36,7 @@ export const TYPES = {
LocalizedEnum: 'LocalizedEnum',
Object: 'Object',
Reference: 'Reference',
+ RichText: 'RichText',
};
export enum TYPES_ENUM {
@@ -51,6 +52,7 @@ export enum TYPES_ENUM {
LocalizedEnum = 'LocalizedEnum',
Object = 'Object',
Reference = 'Reference',
+ RichText = 'RichText',
}
export const REFERENCE_BY = {
diff --git a/src/globals.d.ts b/src/globals.d.ts
index 48ecd2e..108cefb 100644
--- a/src/globals.d.ts
+++ b/src/globals.d.ts
@@ -3,3 +3,11 @@ declare module '*.graphql' {
const content: any;
export default content;
}
+
+declare module '*.module.css' {
+ const classes: { readonly [key: string]: string };
+ export default classes;
+}
+
+declare module '*.png';
+declare module '*.svg';
diff --git a/yarn.lock b/yarn.lock
index ae39eb4..a57b0ad 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1826,6 +1826,21 @@
prop-types "15.8.1"
react-is "17.0.2"
+"@commercetools-uikit/accessible-button@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/accessible-button/-/accessible-button-20.0.0.tgz#43723ce944752024227af4e33b9d57ecd457b1da"
+ integrity sha512-JfqQl4ghj1HKvYL+LsxuLQETkazX1xf+DZYwFPI+8wmd6bVmFhm7VSHm6C84htCJMiltPIT/jb3SEFaP2c1Sgg==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+ "@emotion/styled" "^11.10.5"
+ "@types/react-is" "^19.0.0"
+ lodash "4.17.21"
+ react-is "19.0.0"
+
"@commercetools-uikit/accessible-hidden@^19.9.0":
version "19.10.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/accessible-hidden/-/accessible-hidden-19.10.0.tgz#8b2f0bbd063406f94fe0238fca25c50508bb33a8"
@@ -1976,6 +1991,18 @@
"@emotion/styled" "^11.10.5"
prop-types "15.8.1"
+"@commercetools-uikit/constraints@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/constraints/-/constraints-20.0.0.tgz#5a7c2c4143492eb6ff0a07cd7b58ff62061fadfa"
+ integrity sha512-vFs4oSPRQ3H7/zeyIbDA3/hTJsAwMmVeG5bnyBq2qr3fktIPt6+GXP0ASb9xRYBza2NHNvLk55dcqI4Ph2DLKw==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+ "@emotion/styled" "^11.10.5"
+
"@commercetools-uikit/data-table@^18.4.0":
version "18.5.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/data-table/-/data-table-18.5.0.tgz#48e47c6e7ac41bbe64a5f58454f705c2224773c6"
@@ -2075,6 +2102,37 @@
prop-types "15.8.1"
react "17.0.2"
+"@commercetools-uikit/design-system@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/design-system/-/design-system-20.0.0.tgz#a3cc435a7b236dcded1f7a1e7fffc447b133d15b"
+ integrity sha512-91fEd4jUzoD9hGl7j56W8TtstTnNH4jbjC8kK1NwDqp53CZ6YzT5cIx+Vl7r0AT00rmBmTKnrNuVjnJCpDTKXg==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/hooks" "20.0.0"
+ "@emotion/react" "^11.10.5"
+ lodash "4.17.21"
+ react "19.0.0"
+
+"@commercetools-uikit/dropdown-menu@^20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/dropdown-menu/-/dropdown-menu-20.0.0.tgz#b5d84319edaaef332d7f29996c6622eec9be3aa0"
+ integrity sha512-sJ7i1eKlDTHR1mtUe4GYlYeKxIddFNhh+BxVc2cnf9t25SUI14cLrtNLzTVrUs0dSAXNn4d8D8smlIsVZfXadQ==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/accessible-button" "20.0.0"
+ "@commercetools-uikit/constraints" "20.0.0"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/hooks" "20.0.0"
+ "@commercetools-uikit/secondary-button" "20.0.0"
+ "@commercetools-uikit/spacings-inline" "20.0.0"
+ "@commercetools-uikit/spacings-stack" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+ "@emotion/styled" "^11.10.5"
+ react-intl "^7.1.4"
+
"@commercetools-uikit/field-errors@18.5.0":
version "18.5.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/field-errors/-/field-errors-18.5.0.tgz#91e7e30d64756efea3d2c12fd4fa3e93b6572ca2"
@@ -2191,6 +2249,18 @@
lodash "4.17.21"
raf-schd "^4.0.3"
+"@commercetools-uikit/hooks@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/hooks/-/hooks-20.0.0.tgz#9e543f3c0906d5aed98aedeff28604395e350289"
+ integrity sha512-sqM6I7pP3csT9zsklKUuDc/HYTCH+RDOZ9n25MS0Uii9UwQNV4vo2UKMDzwqYfgDZ6/wPpFWc9s8tQcR7XWUYw==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@types/raf-schd" "^4.0.1"
+ lodash "4.17.21"
+ raf-schd "^4.0.3"
+
"@commercetools-uikit/i18n@^19.9.0":
version "19.10.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/i18n/-/i18n-19.10.0.tgz#222e5a455b688ae4d0ccb966a7bae9d929306644"
@@ -2561,6 +2631,22 @@
prop-types "15.8.1"
react-intl "^6.3.2"
+"@commercetools-uikit/secondary-button@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/secondary-button/-/secondary-button-20.0.0.tgz#e8f4c12d169fe26a3b4f216e0c8fd10843ed13b5"
+ integrity sha512-Vk4kdYM4HjwINS5iKaFkfddhYGi7wk/Z3o+VltFmfd1/4i+UpTy1vNFzB4QkmXWkAcSiZHI+/pB4SOXfRIvX6A==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/accessible-button" "20.0.0"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/spacings-inline" "20.0.0"
+ "@commercetools-uikit/text" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+ "@emotion/styled" "^11.10.5"
+ lodash "4.17.21"
+
"@commercetools-uikit/secondary-button@^19.9.0":
version "19.10.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/secondary-button/-/secondary-button-19.10.0.tgz#339d625e1d0945da070dc9af87cc0e5ec177774e"
@@ -2734,6 +2820,17 @@
"@emotion/react" "^11.10.5"
prop-types "15.8.1"
+"@commercetools-uikit/spacings-inline@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/spacings-inline/-/spacings-inline-20.0.0.tgz#af71fe9e5a8fb31966ff64bd891b6322a2ae3a58"
+ integrity sha512-eNyXp4RyfWHwyEz3I5RlXxZBhvvTqtiHLHnetNo7vqapAdDN+MnvzmOMQuiZnB/IysqC5d0UnDhnvYNlTTKouA==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+
"@commercetools-uikit/spacings-inset-squish@18.5.0":
version "18.5.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/spacings-inset-squish/-/spacings-inset-squish-18.5.0.tgz#b6e32785305a1b2c2db0ecbb6b315afe38c77d0f"
@@ -2806,6 +2903,17 @@
"@emotion/react" "^11.10.5"
prop-types "15.8.1"
+"@commercetools-uikit/spacings-stack@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/spacings-stack/-/spacings-stack-20.0.0.tgz#eb333c40909a910ae336ff2d769430f9d64102e4"
+ integrity sha512-A9Ribl2xafALgYEvwQ9EAFPDaK4L1+pHFm3vGkKiOzHe4QVzfpjHB0Bxe//2efw6jD6TcIPWYTDo87htvxIKrw==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+
"@commercetools-uikit/spacings@18.5.0", "@commercetools-uikit/spacings@^18.4.0":
version "18.5.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/spacings/-/spacings-18.5.0.tgz#ed0970fffb67595c94af8f17071ce1461e505dc3"
@@ -2907,6 +3015,19 @@
prop-types "15.8.1"
warning "4.0.3"
+"@commercetools-uikit/text@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/text/-/text-20.0.0.tgz#95906bfdb82a9a47c9683962274b051087dcc1ec"
+ integrity sha512-KR7y4GaI/4+NjX/o5qWQUW8b3Ctl7lv6VVHoW9GaFSNOHF48wn5CKQcMj4/d8Toj+/RPQLqgjmMvnfKwm67Bbg==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@commercetools-uikit/design-system" "20.0.0"
+ "@commercetools-uikit/utils" "20.0.0"
+ "@emotion/react" "^11.10.5"
+ lodash "4.17.21"
+ warning "4.0.3"
+
"@commercetools-uikit/time-input@^18.4.0":
version "18.5.0"
resolved "https://registry.yarnpkg.com/@commercetools-uikit/time-input/-/time-input-18.5.0.tgz#1bf8e896d200643fb02d9fbbbd6e6548b3697111"
@@ -2981,6 +3102,15 @@
"@babel/runtime-corejs3" "^7.20.13"
"@emotion/is-prop-valid" "1.2.2"
+"@commercetools-uikit/utils@20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@commercetools-uikit/utils/-/utils-20.0.0.tgz#98451a0c5373164d08448d75a679f05b8604fb2e"
+ integrity sha512-qQ9NOmXXROR4Z2rPFYbZvALbMaeTtB5b8r4dTHU35uLAelwvcEqdQ9OKm3w2dD2LteNOw8kHt+qe+uY/SmJtYw==
+ dependencies:
+ "@babel/runtime" "^7.20.13"
+ "@babel/runtime-corejs3" "^7.20.13"
+ "@emotion/is-prop-valid" "1.3.1"
+
"@commercetools/api-request-builder@6.0.0":
version "6.0.0"
resolved "https://registry.yarnpkg.com/@commercetools/api-request-builder/-/api-request-builder-6.0.0.tgz#7c0b8104f4d3655ac8bdb79dee3087d747018c0b"
@@ -3173,6 +3303,13 @@
dependencies:
"@emotion/memoize" "^0.8.1"
+"@emotion/is-prop-valid@1.3.1":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240"
+ integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+
"@emotion/is-prop-valid@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz#bd84ba972195e8a2d42462387581560ef780e4e2"
@@ -3431,6 +3568,21 @@
dependencies:
"@floating-ui/utils" "^0.2.7"
+"@floating-ui/core@^1.7.1":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.1.tgz#1abc6b157d4a936174f9dbd078278c3a81c8bc6b"
+ integrity sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==
+ dependencies:
+ "@floating-ui/utils" "^0.2.9"
+
+"@floating-ui/dom@^1.0.0":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.1.tgz#76a4e3cbf7a08edf40c34711cf64e0cc8053d912"
+ integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==
+ dependencies:
+ "@floating-ui/core" "^1.7.1"
+ "@floating-ui/utils" "^0.2.9"
+
"@floating-ui/dom@^1.0.1":
version "1.6.10"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.10.tgz#b74c32f34a50336c86dcf1f1c845cf3a39e26d6f"
@@ -3439,11 +3591,32 @@
"@floating-ui/core" "^1.6.0"
"@floating-ui/utils" "^0.2.7"
+"@floating-ui/react-dom@^2.1.3":
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.3.tgz#1dea32e59514a67d182f0c89c8975ff959774b61"
+ integrity sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==
+ dependencies:
+ "@floating-ui/dom" "^1.0.0"
+
+"@floating-ui/react@^0.27.8":
+ version "0.27.12"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.27.12.tgz#f1ddb43f50aa354a54de621272c44fff51444b51"
+ integrity sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A==
+ dependencies:
+ "@floating-ui/react-dom" "^2.1.3"
+ "@floating-ui/utils" "^0.2.9"
+ tabbable "^6.0.0"
+
"@floating-ui/utils@^0.2.7":
version "0.2.7"
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.7.tgz#d0ece53ce99ab5a8e37ebdfe5e32452a2bfc073e"
integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==
+"@floating-ui/utils@^0.2.9":
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
+ integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
+
"@flopflip/adapter-utilities@14.0.2":
version "14.0.2"
resolved "https://registry.yarnpkg.com/@flopflip/adapter-utilities/-/adapter-utilities-14.0.2.tgz#0b908e54b445d081c4f61c5bcb45c7d55b5cf08c"
@@ -3604,6 +3777,16 @@
"@formatjs/intl-localematcher" "0.5.4"
tslib "^2.4.0"
+"@formatjs/ecma402-abstract@2.3.4":
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.4.tgz#e90c5a846ba2b33d92bc400fdd709da588280fbc"
+ integrity sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==
+ dependencies:
+ "@formatjs/fast-memoize" "2.2.7"
+ "@formatjs/intl-localematcher" "0.6.1"
+ decimal.js "^10.4.3"
+ tslib "^2.8.0"
+
"@formatjs/fast-memoize@2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b"
@@ -3611,6 +3794,22 @@
dependencies:
tslib "^2.4.0"
+"@formatjs/fast-memoize@2.2.7":
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz#707f9ddaeb522a32f6715bb7950b0831f4cc7b15"
+ integrity sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==
+ dependencies:
+ tslib "^2.8.0"
+
+"@formatjs/icu-messageformat-parser@2.11.2":
+ version "2.11.2"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.2.tgz#85aea211bea40aa81ee1d44ac7accc3cf5500a73"
+ integrity sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.4"
+ "@formatjs/icu-skeleton-parser" "1.8.14"
+ tslib "^2.8.0"
+
"@formatjs/icu-messageformat-parser@2.7.8":
version "2.7.8"
resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz#f6d7643001e9bb5930d812f1f9a9856f30fa0343"
@@ -3620,6 +3819,14 @@
"@formatjs/icu-skeleton-parser" "1.8.2"
tslib "^2.4.0"
+"@formatjs/icu-skeleton-parser@1.8.14":
+ version "1.8.14"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.14.tgz#b9581d00363908efb29817fdffc32b79f41dabe5"
+ integrity sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.4"
+ tslib "^2.8.0"
+
"@formatjs/icu-skeleton-parser@1.8.2":
version "1.8.2"
resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz#2252c949ae84ee66930e726130ea66731a123c9f"
@@ -3677,6 +3884,13 @@
dependencies:
tslib "^2.4.0"
+"@formatjs/intl-localematcher@0.6.1":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.6.1.tgz#25dc30675320bf65a9d7f73876fc1e4064c0e299"
+ integrity sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==
+ dependencies:
+ tslib "^2.8.0"
+
"@formatjs/intl-numberformat@^8.7.1":
version "8.10.3"
resolved "https://registry.yarnpkg.com/@formatjs/intl-numberformat/-/intl-numberformat-8.10.3.tgz#abc97cc6a7b7f1b20da9f07a976b5589c1192ab8"
@@ -3708,6 +3922,17 @@
intl-messageformat "10.5.14"
tslib "^2.4.0"
+"@formatjs/intl@3.1.6":
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-3.1.6.tgz#4c7fec6f082628cfa80871fbe7f9bc2644300e3b"
+ integrity sha512-tDkXnA4qpIFcDWac8CyVJq6oW8DR7W44QDUBsfXWIIJD/FYYen0QoH46W7XsVMFfPOVKkvbufjboZrrWbEfmww==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.4"
+ "@formatjs/fast-memoize" "2.2.7"
+ "@formatjs/icu-messageformat-parser" "2.11.2"
+ intl-messageformat "10.7.16"
+ tslib "^2.8.0"
+
"@formatjs/ts-transformer@3.13.14":
version "3.13.14"
resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-3.13.14.tgz#1c183157cf3a6fbc128c0c492fbf6cd4a2e55a7f"
@@ -4357,6 +4582,208 @@
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1"
integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==
+"@lexical/clipboard@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/clipboard/-/clipboard-0.32.1.tgz#e7b234beb202685e8648a143dd80beb168e08157"
+ integrity sha512-oO7CuMVh3EFEqtE6+7Ccf7jMD5RNUmSdTnFm/X4kYNGqs9lgGt8j5PgSk7oP9OuAjxKNdBTbltSlh54CX3AUIg==
+ dependencies:
+ "@lexical/html" "0.32.1"
+ "@lexical/list" "0.32.1"
+ "@lexical/selection" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/code@0.32.1", "@lexical/code@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/code/-/code-0.32.1.tgz#5bd243f7181b045c811b0f437f141bda3caa83b0"
+ integrity sha512-2rXj8s/CG32XKQ2EpORpACfpzyAxB+/SrQW2cjwczarLs5Fxnx6u6HwahZnxaF0z5UHIPUy90qDiOiRExc74Yg==
+ dependencies:
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+ prismjs "^1.30.0"
+
+"@lexical/devtools-core@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/devtools-core/-/devtools-core-0.32.1.tgz#ba834df1e97f8add9f1e7ac5970755b852e426f9"
+ integrity sha512-3WnZQo6Qig7ccjDu2b8s1Kb5CCXowxnK0i8CCRG9mHAw7i6XpZUYAbk4rmcK/qbhLHrc7LwUrAMFzGtfLEH3XA==
+ dependencies:
+ "@lexical/html" "0.32.1"
+ "@lexical/link" "0.32.1"
+ "@lexical/mark" "0.32.1"
+ "@lexical/table" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/dragon@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/dragon/-/dragon-0.32.1.tgz#fbd9674d8ea192b6b0606dec8e0a866bbc5fa5c5"
+ integrity sha512-Dlx8P2b/O7gZLmXnoanmDkFL5RgA8Vvix4ZuSvT0apblqySzgi8l3NHHwwqXy1g2nfSupvpr7Dsf10Lu3l0Hlw==
+ dependencies:
+ lexical "0.32.1"
+
+"@lexical/hashtag@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/hashtag/-/hashtag-0.32.1.tgz#9abf06a2df6e65f1df426272f146cd4eb3f23ffc"
+ integrity sha512-S63bb7uIB4hO2V0UmzUiKlwAGegQlyFKqrOw9NJwOb8O96gHRxr27FUsEb8ToWLM8TSm2aw1WsZXs7CJQqGtCg==
+ dependencies:
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/history@0.32.1", "@lexical/history@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/history/-/history-0.32.1.tgz#816a4a343aaae2eddb6ff858982fe5aa48fcb118"
+ integrity sha512-IRsKllumYEWxmzR2evN30MFY+JBM723lSyzm2PAQcgHCeBxi8t0Vc3EdyJRay+YdN65JgrohQi1WbktbK923uQ==
+ dependencies:
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/html@0.32.1", "@lexical/html@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/html/-/html-0.32.1.tgz#968928770270d8e5397df6c10498a88c171d124b"
+ integrity sha512-uctCdC9gVzx/Sw9CimT4C2IDfSbfEGYunyIrJBpsfcdqp0rroGNizjIoZNBH3xcgkk9UDboSADo+wimbzEoy8A==
+ dependencies:
+ "@lexical/selection" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/link@0.32.1", "@lexical/link@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/link/-/link-0.32.1.tgz#27d08cb19f9dfba2a9938302964ead9ba5fb56bf"
+ integrity sha512-atdwNpWjZ0U2/kgS0ATTkZ8lJLHiv3TsJgqJL33BuV9Gn7advJokd4faM79Y8XxkhiPi1lVTBSHgI8V4hs+c+Q==
+ dependencies:
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/list@0.32.1", "@lexical/list@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/list/-/list-0.32.1.tgz#b3471011d1c1f0eaa2358daff6414bf06de696a7"
+ integrity sha512-3zShCfEdAvodR6mQ5CNN1gcEwfV341LXJzWCIkZzG1cPwaiBHUlT7TynQtKTPn1sATCEMmxoDG0/T+itsRNZgA==
+ dependencies:
+ "@lexical/selection" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/mark@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/mark/-/mark-0.32.1.tgz#762c7887f09bbe833e21c0c487ae5a5c5ac93610"
+ integrity sha512-AXF2wmUvvSI45y+sgZKnU0pnUdttd9v75DDQgdplqtCkyDqHVGxVCNCrLE+PJtzIrwJxtA2UyC8yFZMBM92HpA==
+ dependencies:
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/markdown@0.32.1", "@lexical/markdown@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/markdown/-/markdown-0.32.1.tgz#e8bba69b1ec5f520e01305ba681623f4165dceb8"
+ integrity sha512-AmUTRRx6Je0AOiQqp48Xn92/71AzhFgi4nO1EtPW5eae1CihrtiEh5UQr48mV6EyjvH9D3OlOLU8XrzS+J9a+w==
+ dependencies:
+ "@lexical/code" "0.32.1"
+ "@lexical/link" "0.32.1"
+ "@lexical/list" "0.32.1"
+ "@lexical/rich-text" "0.32.1"
+ "@lexical/text" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/offset@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/offset/-/offset-0.32.1.tgz#adb4403b8dee5436584d166dd5d3d3d8bfec3620"
+ integrity sha512-zfHqoLlQ0lq1akFHy81xnDaRRE5KkqFa7OovOxKPBpALQCiJIAb2ykqj/Woc2oUeYaEcnkaFU9+kEWMK9yY0fQ==
+ dependencies:
+ lexical "0.32.1"
+
+"@lexical/overflow@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/overflow/-/overflow-0.32.1.tgz#81a9c41a83023f91dafd7e90a9d4bc29e17d3998"
+ integrity sha512-wjcFGjzkbugds2Q5Wag59WrcxJwMUACEXms1FtFdu1/YcBPqNAKJSyfo8Z/5LGfstQEb2nPtSuEQZUb7v+XYyA==
+ dependencies:
+ lexical "0.32.1"
+
+"@lexical/plain-text@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/plain-text/-/plain-text-0.32.1.tgz#aee5bcd3bb8b22bcad12b1bc9039dc5ad3ccc6d2"
+ integrity sha512-uFS3xoETB3phnYHZXfMKvl8gh6YRW7rpokuJmQVMHNNBklORmMpN00rRQ/zsc/jt/nPzaPpE5cLwSHXeJdqJUg==
+ dependencies:
+ "@lexical/clipboard" "0.32.1"
+ "@lexical/selection" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/react@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/react/-/react-0.32.1.tgz#f86f5f782d00e8f8f10b72be0c7a1bf895cb5af1"
+ integrity sha512-PCiAiwGIGfkYb2o9Kx+gGGqXwxqb7/W4cGSnw1nzmNtCerJ3S64WZs87Lgcow0RlDSwqzpH534+eCyIddueSqw==
+ dependencies:
+ "@floating-ui/react" "^0.27.8"
+ "@lexical/devtools-core" "0.32.1"
+ "@lexical/dragon" "0.32.1"
+ "@lexical/hashtag" "0.32.1"
+ "@lexical/history" "0.32.1"
+ "@lexical/link" "0.32.1"
+ "@lexical/list" "0.32.1"
+ "@lexical/mark" "0.32.1"
+ "@lexical/markdown" "0.32.1"
+ "@lexical/overflow" "0.32.1"
+ "@lexical/plain-text" "0.32.1"
+ "@lexical/rich-text" "0.32.1"
+ "@lexical/table" "0.32.1"
+ "@lexical/text" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ "@lexical/yjs" "0.32.1"
+ lexical "0.32.1"
+ react-error-boundary "^3.1.4"
+
+"@lexical/rich-text@0.32.1", "@lexical/rich-text@^0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/rich-text/-/rich-text-0.32.1.tgz#6ff5e5af36f13df8fb4457cf5a29604df774302b"
+ integrity sha512-SnmpZ7boTLxeYfNezNLvchDiJOAALA2nD0Uq/SpkIOJ6R01R7m1aPdLv55LGKoBT9UxCRdo0HWXytwiVZI+ehQ==
+ dependencies:
+ "@lexical/clipboard" "0.32.1"
+ "@lexical/selection" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/selection@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/selection/-/selection-0.32.1.tgz#d3f003c2f989a2a516c9c991abdd72d3a020d1f4"
+ integrity sha512-X1aXJdq/5EOuSuMOqK3t+rEVmpqLf+vc2Kl5YuP8+gGWUbXuxR6iryrQuy1mAViZpF/5qw4HO/Sb+9JjubaZEg==
+ dependencies:
+ lexical "0.32.1"
+
+"@lexical/table@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/table/-/table-0.32.1.tgz#6da90c76403b3f9a4a0e2d14b89e6beec114b890"
+ integrity sha512-sGk2jUbQHj5hatpxRyl6IE2oWsjRnYhmaP94THzn95/uK69o8eSizcnd148WzYsX8Zz+L9PTLS1xjvCbfLTP+A==
+ dependencies:
+ "@lexical/clipboard" "0.32.1"
+ "@lexical/utils" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/text@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/text/-/text-0.32.1.tgz#33d859019851a345101e112ee738a9ca731e4c0f"
+ integrity sha512-0Ek8F3KC4d16b2YaTHdyYFqDSBZ5KRtGrqU3GBog+VOGxucGaEbXEK1/ypX5CTe/wwkQDrH0FKWPQbd3l5t5YQ==
+ dependencies:
+ lexical "0.32.1"
+
+"@lexical/utils@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/utils/-/utils-0.32.1.tgz#feb9466ba1462555dd51448fa79b0363cdaa11bc"
+ integrity sha512-ZaqZZksNIHJd+g8GXc11D1ESi8JzsdLVQZ+9odXVaNxtwDIaGIqMSccFyuZ9VSoJDde4JXZkgp/0PShbAZDkyw==
+ dependencies:
+ "@lexical/list" "0.32.1"
+ "@lexical/selection" "0.32.1"
+ "@lexical/table" "0.32.1"
+ lexical "0.32.1"
+
+"@lexical/yjs@0.32.1":
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/@lexical/yjs/-/yjs-0.32.1.tgz#f8119f508a0dcab352c17f020f216736132bc4e3"
+ integrity sha512-VHGTg5z4wcDkPe8NnhzA5+CoOKJ5tVmTmMvoiZ91rtNUFQPxWRky88Gjt1e3yXldYp4pImNEgtAjlWqvaJBYGA==
+ dependencies:
+ "@lexical/offset" "0.32.1"
+ "@lexical/selection" "0.32.1"
+ lexical "0.32.1"
+
"@manypkg/cli@^0.21.3":
version "0.21.4"
resolved "https://registry.yarnpkg.com/@manypkg/cli/-/cli-0.21.4.tgz#e17d4bd3e1defceec0acf0449b7309d0490b6cd0"
@@ -5291,6 +5718,13 @@
dependencies:
"@types/react" "^17"
+"@types/react-is@^19.0.0":
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-19.0.0.tgz#eccf45556cf1858e9116eed1f9e7b51496501a7a"
+ integrity sha512-71dSZeeJ0t3aoPyY9x6i+JNSvg5m9EF2i2OlSZI5QoJuI8Ocgor610i+4A10TQmURR+0vLwcVCEYFpXdzM1Biw==
+ dependencies:
+ "@types/react" "*"
+
"@types/react-modal@^3.16.0":
version "3.16.3"
resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.16.3.tgz#250f32c07f1de28e2bcf9c3e84b56adaa6897013"
@@ -5332,7 +5766,7 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@<18", "@types/react@^17", "@types/react@^17.0.80":
+"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@16 || 17 || 18 || 19", "@types/react@<18", "@types/react@^17", "@types/react@^17.0.80":
version "17.0.80"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41"
integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==
@@ -9533,6 +9967,16 @@ intl-messageformat@10.5.14:
"@formatjs/icu-messageformat-parser" "2.7.8"
tslib "^2.4.0"
+intl-messageformat@10.7.16:
+ version "10.7.16"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.16.tgz#d909f9f9f4ab857fbe681d559b958dd4dd9f665a"
+ integrity sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.4"
+ "@formatjs/fast-memoize" "2.2.7"
+ "@formatjs/icu-messageformat-parser" "2.11.2"
+ tslib "^2.8.0"
+
intl@1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde"
@@ -10885,6 +11329,11 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
+lexical@0.32.1, lexical@^0.32.1:
+ version "0.32.1"
+ resolved "https://registry.yarnpkg.com/lexical/-/lexical-0.32.1.tgz#6e2b3aac067a45bdafae576326fefca4f2e57a40"
+ integrity sha512-Rvr9p00zUwzjXIqElIjMDyl/24QHw68yaqmXUWIT3lSdSAr8OpjSJK3iWBLZwVZwwpVhwShZRckomc+3vSb/zw==
+
lie@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
@@ -12264,6 +12713,11 @@ pretty-time@^1.1.0:
resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e"
integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==
+prismjs@^1.30.0:
+ version "1.30.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9"
+ integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==
+
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
@@ -12481,7 +12935,7 @@ react-dom@17.0.2:
object-assign "^4.1.1"
scheduler "^0.20.2"
-react-error-boundary@^3.1.0:
+react-error-boundary@^3.1.0, react-error-boundary@^3.1.4:
version "3.1.4"
resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0"
integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==
@@ -12519,6 +12973,20 @@ react-intl@^6.3.2, react-intl@^6.6.2:
intl-messageformat "10.5.14"
tslib "^2.4.0"
+react-intl@^7.1.4:
+ version "7.1.11"
+ resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-7.1.11.tgz#6155602c46621ad9b67dd31750d00908e1e0b516"
+ integrity sha512-tnVoRCWvW5Ie2ikYSdPF7z3+880yCe/9xPmitFeRPw3RYDcCfR4m8ZYa4MBq19W4adt9Z+PQA4FaMBCJ7E+HCQ==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.4"
+ "@formatjs/icu-messageformat-parser" "2.11.2"
+ "@formatjs/intl" "3.1.6"
+ "@types/hoist-non-react-statics" "^3.3.1"
+ "@types/react" "16 || 17 || 18 || 19"
+ hoist-non-react-statics "^3.3.2"
+ intl-messageformat "10.7.16"
+ tslib "^2.8.0"
+
react-is@17.0.2, react-is@^17.0.1, react-is@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
@@ -12529,6 +12997,11 @@ react-is@18.3.1, react-is@^18.0.0:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+react-is@19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0.tgz#d6669fd389ff022a9684f708cf6fa4962d1fea7a"
+ integrity sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==
+
react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.6:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -12651,6 +13124,11 @@ react@17.0.2:
loose-envify "^1.1.0"
object-assign "^4.1.1"
+react@19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd"
+ integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==
+
read-cache@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
@@ -13746,6 +14224,11 @@ sync-fetch@0.3.0:
buffer "^5.7.0"
node-fetch "^2.6.1"
+tabbable@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
+ integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
+
table@^6.0.9:
version "6.8.2"
resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58"
@@ -13963,6 +14446,11 @@ tslib@^2, tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
+tslib@^2.8.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
tslib@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"