@@ -68,9 +68,9 @@ naturally appears inline after the deepest trailing text node.
6868
6969<script lang =" ts" >
7070 import type { ComarkNode as ComarkNodeType , ComponentManifest , NodeRenderData } from ' comark'
71- import type { Snippet } from ' svelte'
7271 import type { ComponentResolver } from ' ../types.js'
7372 import ComarkNode from ' ./ComarkNode.svelte'
73+ import ComarkComponent from ' ./ComarkComponent.svelte'
7474 import Resolve from ' ./Resolve.svelte'
7575 import { resolveAttributes } from ' comark/utils'
7676
@@ -106,6 +106,12 @@ naturally appears inline after the deepest trailing text node.
106106 caretClass: string | null
107107 }
108108
109+ interface NamedSlot {
110+ name: string
111+ children: ComarkNodeType []
112+ caretClass: string | null
113+ }
114+
109115 function getSlotName(node : ComarkNodeType ): string | null {
110116 if (typeof node === ' string' || ! Array .isArray (node ) || node [0 ] !== ' template' ) {
111117 return null
@@ -125,26 +131,6 @@ naturally appears inline after the deepest trailing text node.
125131 return null
126132 }
127133
128- function createChildrenSnippet(
129- snippetChildren : ComarkNodeType [],
130- snippetRenderData : NodeRenderData ,
131- snippetCaretClass : string | null ,
132- ): Snippet {
133- return ((anchor : unknown ) => {
134- const renderNode = ComarkNode as unknown as (anchor : unknown , props : Record <string , unknown >) => void
135- for (let i = 0 ; i < snippetChildren .length ; i ++ ) {
136- renderNode (anchor , {
137- node: snippetChildren [i ],
138- components ,
139- componentsManifest ,
140- resolver: Resolver ,
141- caretClass: i === snippetChildren .length - 1 ? snippetCaretClass : null ,
142- renderData: snippetRenderData ,
143- })
144- }
145- }) as unknown as Snippet
146- }
147-
148134 function toRenderChildren(
149135 sourceChildren : ComarkNodeType [],
150136 sourceIndex : number ,
@@ -217,9 +203,9 @@ naturally appears inline after the deepest trailing text node.
217203 : renderData ,
218204 )
219205
220- let { defaultChildren, namedSlotProps } = $derived .by (() => {
206+ let { defaultChildren, namedSlots } = $derived .by (() => {
221207 const defaultChildren: RenderChild [] = []
222- const slotProps : Record < string , Snippet > = {}
208+ const slots : NamedSlot [] = []
223209
224210 for (let i = 0 ; i < children .length ; i ++ ) {
225211 const child = children [i ]
@@ -230,26 +216,20 @@ naturally appears inline after the deepest trailing text node.
230216 defaultChildren .push (... toRenderChildren (slotChildren , i , children .length , caretClass ))
231217 }
232218 else {
233- slotProps [ slotName ] = createChildrenSnippet (
234- slotChildren ,
235- childrenRenderData ,
236- i === children .length - 1 ? caretClass : null ,
237- )
219+ slots . push ({
220+ name: slotName ,
221+ children: slotChildren ,
222+ caretClass: i === children .length - 1 ? caretClass : null ,
223+ } )
238224 }
239225 }
240226 else {
241227 defaultChildren .push ({ node: child , caretClass: i === children .length - 1 ? caretClass : null })
242228 }
243229 }
244230
245- return { defaultChildren , namedSlotProps: slotProps }
231+ return { defaultChildren , namedSlots: slots }
246232 })
247-
248- let componentProps = $derived (
249- Object .keys (namedSlotProps ).length > 0
250- ? { ... mappedProps , ... namedSlotProps }
251- : mappedProps ,
252- )
253233 </script >
254234
255235{#snippet renderChildren ()}
@@ -270,12 +250,36 @@ naturally appears inline after the deepest trailing text node.
270250 class ={caretClass || undefined }
271251 style ={CARET_STYLE }>{CARET_TEXT }</span
272252 >{/if }
253+ {:else if Component && namedSlots .length > 0 }
254+ <ComarkComponent
255+ {Component }
256+ props ={mappedProps }
257+ {namedSlots }
258+ {components }
259+ {componentsManifest }
260+ resolver ={Resolver }
261+ renderData ={childrenRenderData }
262+ >
263+ {@render renderChildren ()}
264+ </ComarkComponent >
273265{:else if Component }
274- <Component {...componentProps }>
266+ <Component {...mappedProps }>
275267 {@render renderChildren ()}
276268 </Component >
269+ {:else if componentPromise && namedSlots .length > 0 }
270+ <ComarkComponent
271+ {componentPromise }
272+ props ={mappedProps }
273+ {namedSlots }
274+ {components }
275+ {componentsManifest }
276+ resolver ={Resolver }
277+ renderData ={childrenRenderData }
278+ >
279+ {@render renderChildren ()}
280+ </ComarkComponent >
277281{:else if componentPromise }
278- <Resolver promise ={componentPromise } props ={componentProps }>
282+ <Resolver promise ={componentPromise } props ={mappedProps }>
279283 {@render renderChildren ()}
280284 </Resolver >
281285{:else if isVoid }
0 commit comments