@@ -22,6 +22,7 @@ import type {Converter} from '../converters/converter.types'
2222import { debugWithName } from '../internal-utils/debug'
2323import type { EventPosition } from '../internal-utils/event-position'
2424import { sortByPriority } from '../priority/priority.sort'
25+ import { getRendererKey , type RendererConfig } from '../renderers/renderer.types'
2526import type { NamespaceEvent , OmitFromUnion } from '../type-utils'
2627import type {
2728 EditorSelection ,
@@ -82,6 +83,14 @@ export type InternalEditorEvent =
8283 type : 'remove behavior'
8384 behaviorConfig : BehaviorConfig
8485 }
86+ | {
87+ type : 'add renderer'
88+ rendererConfig : RendererConfig
89+ }
90+ | {
91+ type : 'remove renderer'
92+ rendererConfig : RendererConfig
93+ }
8594 | {
8695 type : 'blur'
8796 editor : PortableTextSlateEditor
@@ -185,6 +194,7 @@ export const editorMachine = setup({
185194 keyGenerator : ( ) => string
186195 pendingEvents : Array < InternalPatchEvent | MutationEvent >
187196 pendingIncomingPatchesEvents : Array < PatchesEvent >
197+ renderers : Map < string , RendererConfig [ ] >
188198 schema : EditorSchema
189199 initialReadOnly : boolean
190200 selection : EditorSelection
@@ -225,6 +235,44 @@ export const editorMachine = setup({
225235 return new Set ( [ ...context . behaviors ] )
226236 } ,
227237 } ) ,
238+ 'add renderer to context' : assign ( {
239+ renderers : ( { context, event} ) => {
240+ assertEvent ( event , 'add renderer' )
241+
242+ const key = getRendererKey (
243+ event . rendererConfig . renderer . type ,
244+ event . rendererConfig . renderer . name ,
245+ )
246+
247+ const newRenderers = new Map ( context . renderers )
248+ const existing = newRenderers . get ( key ) ?? [ ]
249+ // Add to the array - renderers are evaluated in order, first match wins
250+ newRenderers . set ( key , [ ...existing , event . rendererConfig ] )
251+ return newRenderers
252+ } ,
253+ } ) ,
254+ 'remove renderer from context' : assign ( {
255+ renderers : ( { context, event} ) => {
256+ assertEvent ( event , 'remove renderer' )
257+
258+ const key = getRendererKey (
259+ event . rendererConfig . renderer . type ,
260+ event . rendererConfig . renderer . name ,
261+ )
262+
263+ const newRenderers = new Map ( context . renderers )
264+ const existing = newRenderers . get ( key )
265+ if ( existing ) {
266+ const filtered = existing . filter ( ( r ) => r !== event . rendererConfig )
267+ if ( filtered . length === 0 ) {
268+ newRenderers . delete ( key )
269+ } else {
270+ newRenderers . set ( key , filtered )
271+ }
272+ }
273+ return newRenderers
274+ } ,
275+ } ) ,
228276 'add slate editor to context' : assign ( {
229277 slateEditor : ( { context, event} ) => {
230278 return event . type === 'add slate editor'
@@ -388,6 +436,7 @@ export const editorMachine = setup({
388436 keyGenerator : input . keyGenerator ,
389437 pendingEvents : [ ] ,
390438 pendingIncomingPatchesEvents : [ ] ,
439+ renderers : new Map < string , RendererConfig [ ] > ( ) ,
391440 schema : input . schema ,
392441 selection : null ,
393442 initialReadOnly : input . readOnly ?? false ,
@@ -396,6 +445,8 @@ export const editorMachine = setup({
396445 on : {
397446 'add behavior' : { actions : 'add behavior to context' } ,
398447 'remove behavior' : { actions : 'remove behavior from context' } ,
448+ 'add renderer' : { actions : 'add renderer to context' } ,
449+ 'remove renderer' : { actions : 'remove renderer from context' } ,
399450 'add slate editor' : { actions : 'add slate editor to context' } ,
400451 'update selection' : {
401452 actions : [
0 commit comments