in html/core/src/jsMain/kotlin/org/jetbrains/compose/web/dom/Base.kt [107:149]
fun <TElement : Element> TagElement(
elementBuilder: ElementBuilder<TElement>,
applyAttrs: (AttrsScope<TElement>.() -> Unit)?,
content: (@Composable ElementScope<TElement>.() -> Unit)?
) {
val scope = remember { ElementScopeImpl<TElement>() }
var refEffect: (DisposableEffectScope.(TElement) -> DisposableEffectResult)? = null
ComposeDomNode<ElementScope<TElement>, DomElementWrapper>(
factory = {
val node = elementBuilder.create()
scope.element = node
DomElementWrapper(node)
},
attrsSkippableUpdate = {
val attrsScope = AttrsScopeBuilder<TElement>()
applyAttrs?.invoke(attrsScope)
refEffect = attrsScope.refEffect
update {
set(attrsScope.classes, DomElementWrapper::updateClasses)
set(attrsScope.styleScope, DomElementWrapper::updateStyleDeclarations)
set(attrsScope.collect(), DomElementWrapper::updateAttrs)
set(
attrsScope.eventsListenerScopeBuilder.collectListeners(),
DomElementWrapper::updateEventListeners
)
set(attrsScope.propertyUpdates, DomElementWrapper::updateProperties)
}
},
elementScope = scope,
content = {
content?.invoke(this)
}
)
refEffect?.let { effect ->
DisposableEffect(null) {
effect.invoke(this, scope.element)
}
}
}