From d3ca9e7514bdf266415c53211a29cb141f878073 Mon Sep 17 00:00:00 2001 From: Petyo Ivanov Date: Wed, 6 Nov 2024 21:45:07 +0200 Subject: [PATCH] feat: expose lexical theme prop --- src/MDXEditor.tsx | 10 ++++++++-- src/examples/assets/jsx.md | 6 +++++- src/examples/jsx.tsx | 10 ++++++++++ src/index.ts | 2 ++ src/plugins/core/index.ts | 9 +++++++-- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/MDXEditor.tsx b/src/MDXEditor.tsx index d605b9d9..88b4c2fd 100644 --- a/src/MDXEditor.tsx +++ b/src/MDXEditor.tsx @@ -28,7 +28,7 @@ import { lexicalTheme } from './styles/lexicalTheme' import styles from './styles/ui.module.css' import { noop } from './utils/fp' import { createLexicalComposerContext, LexicalComposerContext, LexicalComposerContextType } from '@lexical/react/LexicalComposerContext' -import { LexicalEditor } from 'lexical' +import { EditorThemeClasses, LexicalEditor } from 'lexical' import { IconKey, defaultSvgIcons } from './defaultSvgIcons' const LexicalProvider: React.FC<{ @@ -283,6 +283,11 @@ export interface MDXEditorProps { * Whether to apply trim() to the initial markdown input (default: true) */ trim?: boolean + + /** + * A custom lexical theme to use for the editor. + */ + lexicalTheme?: EditorThemeClasses } /** @@ -306,7 +311,8 @@ export const MDXEditor = React.forwardRef((pro suppressHtmlProcessing: props.suppressHtmlProcessing ?? false, onError: props.onError ?? noop, translation: props.translation ?? defaultTranslation, - trim: props.trim ?? true + trim: props.trim ?? true, + lexicalTheme: props.lexicalTheme }), ...(props.plugins ?? []) ]} diff --git a/src/examples/assets/jsx.md b/src/examples/assets/jsx.md index 627de25c..5f988f9a 100644 --- a/src/examples/assets/jsx.md +++ b/src/examples/assets/jsx.md @@ -5,5 +5,9 @@ A paragraph with inline jsx component Meh more _Leaf_ Content *foo* - more Content +more Content + +something more. + +What diff --git a/src/examples/jsx.tsx b/src/examples/jsx.tsx index 52bc278a..42bfeeb0 100644 --- a/src/examples/jsx.tsx +++ b/src/examples/jsx.tsx @@ -49,6 +49,16 @@ const jsxComponentDescriptors: JsxComponentDescriptor[] = [ props: [], hasChildren: true, Editor: GenericJsxEditor + }, + { + name: '*', + kind: 'flow', + hasChildren: false, + props: [], + Editor: () => { + console.log('Unknown tag') + return
Unknown tag
+ } } ] diff --git a/src/index.ts b/src/index.ts index ad148aad..d12dac35 100644 --- a/src/index.ts +++ b/src/index.ts @@ -118,3 +118,5 @@ export * from './utils/voidEmitter' export * from './RealmWithPlugins' export * from './FormatConstants' + +export * from './styles/lexicalTheme' diff --git a/src/plugins/core/index.ts b/src/plugins/core/index.ts index 7cf2cad2..eb6d0be0 100644 --- a/src/plugins/core/index.ts +++ b/src/plugins/core/index.ts @@ -16,6 +16,7 @@ import { BLUR_COMMAND, COMMAND_PRIORITY_CRITICAL, DecoratorNode, + EditorThemeClasses, ElementNode, FOCUS_COMMAND, FORMAT_TEXT_COMMAND, @@ -836,6 +837,8 @@ export const translation$ = Cell(() => { throw new Error('No translation function provided') }) +export const lexicalTheme$ = Cell(lexicalTheme) + /** @internal */ export const corePlugin = realmPlugin<{ initialMarkdown: string @@ -851,6 +854,7 @@ export const corePlugin = realmPlugin<{ suppressHtmlProcessing?: boolean translation: Translation trim?: boolean + lexicalTheme?: EditorThemeClasses }>({ init(r, params) { const initialMarkdown = params?.initialMarkdown ?? '' @@ -880,7 +884,8 @@ export const corePlugin = realmPlugin<{ [translation$]: params?.translation, [addMdastExtension$]: gfmStrikethroughFromMarkdown(), [addSyntaxExtension$]: gfmStrikethrough(), - [addToMarkdownExtension$]: [mdxJsxToMarkdown(), gfmStrikethroughToMarkdown()] + [addToMarkdownExtension$]: [mdxJsxToMarkdown(), gfmStrikethroughToMarkdown()], + [lexicalTheme$]: params?.lexicalTheme ?? lexicalTheme }) r.singletonSub(markdownErrorSignal$, params?.onError) @@ -905,7 +910,7 @@ export const corePlugin = realmPlugin<{ onError: (error) => { throw error }, - theme: lexicalTheme + theme: r.getValue(lexicalTheme$) }) newEditor.update(() => {