diff --git a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt
index 6e1c1810..2ac25744 100644
--- a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt
+++ b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt
@@ -15,7 +15,7 @@ import space.kscience.plotly.Plot
 import space.kscience.plotly.layout
 import space.kscience.plotly.models.Trace
 import space.kscience.visionforge.Colors
-import space.kscience.visionforge.html.Vision
+import space.kscience.visionforge.html.VisionDiv
 import space.kscience.visionforge.html.zIndex
 import space.kscience.visionforge.markup.VisionOfMarkup
 import space.kscience.visionforge.solid.*
@@ -28,7 +28,7 @@ fun Plot(
     meta: Meta = Meta.EMPTY,
     attrs: AttrBuilderContext<HTMLDivElement>? = null,
     block: Plot.() -> Unit,
-) = Vision(
+) = VisionDiv(
     context = context,
     attrs = attrs,
     meta = meta,
@@ -41,7 +41,7 @@ fun Markup(
     markup: VisionOfMarkup,
     meta: Meta = Meta.EMPTY,
     attrs: AttrBuilderContext<HTMLDivElement>? = null,
-) = Vision(
+) = VisionDiv(
     context = context,
     attrs = attrs,
     meta = meta,
diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts
index 75bf7069..96ed0fce 100644
--- a/demo/muon-monitor/build.gradle.kts
+++ b/demo/muon-monitor/build.gradle.kts
@@ -3,7 +3,6 @@ plugins {
     alias(spclibs.plugins.compose.compiler)
     alias(spclibs.plugins.compose.jb)
 //    alias(spclibs.plugins.ktor)
-    application
 }
 
 group = "ru.mipt.npm"
@@ -12,7 +11,14 @@ group = "ru.mipt.npm"
 kscience {
     fullStack(
         "muon-monitor.js",
-        jvmConfig = {withJava()},
+        development = true,
+        jvmConfig = {
+            binaries {
+                executable {
+                    mainClass.set("ru.mipt.npm.muon.monitor.MMServerKt")
+                }
+            }
+        },
         browserConfig = {
             commonWebpackConfig {
                 cssSupport {
@@ -27,7 +33,6 @@ kscience {
 
     useCoroutines()
     useSerialization()
-    useKtor()
 
     commonMain {
         implementation(projects.visionforgeSolid)
@@ -50,6 +55,6 @@ kotlin {
 }
 
 
-application {
-    mainClass.set("ru.mipt.npm.muon.monitor.MMServerKt")
-}
\ No newline at end of file
+//application {
+//    mainClass.set("ru.mipt.npm.muon.monitor.MMServerKt")
+//}
\ No newline at end of file
diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt
index ef213ec5..5bbb7c1a 100644
--- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt
+++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Event.kt
@@ -1,8 +1,12 @@
+@file:UseSerializers(Float32Space3D.VectorSerializer::class)
 package ru.mipt.npm.muon.monitor
 
 import kotlinx.serialization.Serializable
+import kotlinx.serialization.UseSerializers
+import space.kscience.kmath.geometry.euclidean3d.Float32Space3D
 import space.kscience.kmath.geometry.euclidean3d.Float32Vector3D
 
+
 typealias Track = List<Float32Vector3D>
 
 /**
diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt
index 771e6cfd..6de6f990 100644
--- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt
+++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt
@@ -60,7 +60,7 @@ class Model(val manager: VisionManager) {
             }
         }
 
-        setVision("tracks", tracks)
+        set("tracks", tracks)
     }
 
     private fun highlight(pixel: String) {
diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt
index aa8894cf..5109072c 100644
--- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt
+++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt
@@ -3,9 +3,9 @@ package ru.mipt.npm.muon.monitor
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateListOf
 import androidx.compose.runtime.remember
-import bootstrap.Button
-import bootstrap.ButtonGroup
-import bootstrap.Layout.Width.Full
+import app.softwork.bootstrapcompose.Button
+import app.softwork.bootstrapcompose.ButtonGroup
+import app.softwork.bootstrapcompose.Layout.Width
 import kotlinx.browser.window
 import kotlinx.coroutines.await
 import kotlinx.coroutines.launch
@@ -66,7 +66,7 @@ fun MMApp(context: Context, model: Model, selected: Name? = null) {
             options = mmOptions,
             sidebarTabs = {
                 Tab("Events") {
-                    ButtonGroup({ Layout.width = Full }) {
+                    ButtonGroup({ Layout.width = Width.Full }) {
                         Button("Next") {
                             context.launch {
                                 val event = window.fetch(
@@ -85,7 +85,7 @@ fun MMApp(context: Context, model: Model, selected: Name? = null) {
                                 model.displayEvent(event)
                             }
                         }
-                        Button("Clear", color = bootstrap.Color.Secondary) {
+                        Button("Clear", color = app.softwork.bootstrapcompose.Color.Secondary) {
                             events.clear()
                             model.reset()
                         }
diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt
index bf985b4c..3ef082ed 100644
--- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt
+++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt
@@ -2,34 +2,25 @@ package ru.mipt.npm.muon.monitor
 
 import org.jetbrains.compose.web.css.Style
 import org.jetbrains.compose.web.renderComposable
-import org.w3c.dom.Document
 import space.kscience.dataforge.context.Context
 import space.kscience.dataforge.context.request
 import space.kscience.visionforge.VisionManager
-import space.kscience.visionforge.html.Application
 import space.kscience.visionforge.html.VisionForgeStyles
 import space.kscience.visionforge.html.startApplication
 import space.kscience.visionforge.solid.three.ThreePlugin
 
-private class MMDemoApp : Application {
 
-    override fun start(document: Document, state: Map<String, Any>) {
+fun main(): Unit = startApplication {
+    val context = Context("MM-demo") {
+        plugin(ThreePlugin)
+    }
 
-        val context = Context("MM-demo") {
-            plugin(ThreePlugin)
-        }
+    val visionManager = context.request(VisionManager)
 
-        val visionManager = context.request(VisionManager)
+    val model = Model(visionManager)
 
-        val model = Model(visionManager)
-
-        renderComposable("app") {
-            Style(VisionForgeStyles)
-            MMApp(context, model)
-        }
+    renderComposable("app") {
+        Style(VisionForgeStyles)
+        MMApp(context, model)
     }
 }
-
-fun main() {
-    startApplication(::MMDemoApp)
-}
\ No newline at end of file
diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt
index 183ab1a0..69a9e6fb 100644
--- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt
+++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt
@@ -6,10 +6,10 @@ import space.kscience.dataforge.meta.number
 import space.kscience.dataforge.names.asName
 import space.kscience.dataforge.names.startsWith
 import space.kscience.visionforge.onPropertyChange
-import space.kscience.visionforge.setVision
 import space.kscience.visionforge.solid.SolidGroup
 import space.kscience.visionforge.solid.SolidMaterial.Companion.EDGES_KEY
 import space.kscience.visionforge.solid.layer
+import space.kscience.visionforge.solid.set
 import space.kscience.visionforge.solid.three.*
 import three.core.Object3D
 import three.geometries.BoxGeometry
@@ -21,7 +21,7 @@ internal fun SolidGroup.varBox(
     ySize: Number,
     name: String = "",
     action: VariableBox.() -> Unit = {},
-): VariableBox = VariableBox(xSize, ySize).apply(action).also { setVision(name, it) }
+): VariableBox = VariableBox(xSize, ySize).apply(action).also { set(name, it) }
 
 internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision() {
 
diff --git a/gradle.properties b/gradle.properties
index 54b28840..b8bbdb6a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -7,4 +7,4 @@ org.gradle.jvmargs=-Xmx4G
 org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
 kotlin.native.enableKlibsCrossCompilation=true
 
-toolsVersion=0.16.1-kotlin-2.1.0
+toolsVersion=0.17.0-kotlin-2.1.20-Beta2
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index e1adfb49..81aa1c04 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/plotly/plotlykt-core/build.gradle.kts b/plotly/plotlykt-core/build.gradle.kts
index 68a012a6..121cddbe 100644
--- a/plotly/plotlykt-core/build.gradle.kts
+++ b/plotly/plotlykt-core/build.gradle.kts
@@ -15,7 +15,7 @@ kotlin{
 kscience {
     fullStack(bundleName = "js/plotly-kt.js")
     native()
-    wasm()
+//    wasm()
     useSerialization()
 
     commonMain {
diff --git a/plotly/plotlykt-core/src/commonMain/kotlin/space/kscience/plotly/Plot.kt b/plotly/plotlykt-core/src/commonMain/kotlin/space/kscience/plotly/Plot.kt
index 3b31902a..09684c0e 100644
--- a/plotly/plotlykt-core/src/commonMain/kotlin/space/kscience/plotly/Plot.kt
+++ b/plotly/plotlykt-core/src/commonMain/kotlin/space/kscience/plotly/Plot.kt
@@ -41,7 +41,7 @@ public class Plot : AbstractVision(), VisionGroup<Trace> {
 
     public fun addTrace(trace: Trace) {
         _data.add(trace)
-        emitEvent(VisionGroupCompositionChangedEvent(this, trace.uid))
+        emitEvent(VisionGroupCompositionChangedEvent(trace.uid, trace))
     }
 
     /**
diff --git a/plotly/plotlykt-core/src/jsMain/kotlin/space/kscience/plotly/PlotlyJs.kt b/plotly/plotlykt-core/src/jsMain/kotlin/space/kscience/plotly/PlotlyJs.kt
index b5dc4a4d..17170914 100644
--- a/plotly/plotlykt-core/src/jsMain/kotlin/space/kscience/plotly/PlotlyJs.kt
+++ b/plotly/plotlykt-core/src/jsMain/kotlin/space/kscience/plotly/PlotlyJs.kt
@@ -20,7 +20,6 @@ public external interface DownloadImgOpts {
 
 @JsName("Plotly")
 @JsModule("plotly.js/dist/plotly.js")
-@JsNonModule
 public external object PlotlyJs {
     public fun newPlot(
         graphDiv: Element,
diff --git a/visionforge-compose-html/build.gradle.kts b/visionforge-compose-html/build.gradle.kts
index b05e1387..095a143d 100644
--- a/visionforge-compose-html/build.gradle.kts
+++ b/visionforge-compose-html/build.gradle.kts
@@ -22,9 +22,10 @@ kotlin {
 
         jsMain {
             dependencies {
-                implementation(npm("bootstrap", "5.3.3"))
-                implementation(npm(" bootstrap-icons", "1.11.3"))
-                api("com.benasher44:uuid:0.8.4")
+                api("app.softwork:bootstrap-compose:0.3.0")
+                api("app.softwork:bootstrap-compose-icons:0.3.0")
+//                implementation(npm("bootstrap", "5.3.3"))
+//                implementation(npm(" bootstrap-icons", "1.11.3"))
                 api(compose.html.core)
             }
         }
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Alerts.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Alerts.kt
deleted file mode 100644
index 41a3f5da..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Alerts.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.A
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLAnchorElement
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Alert(
-    color: Color,
-    dismissible: Boolean = true,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: @Composable () -> Unit
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-    Div({
-        classes("alert", "alert-$color")
-        if (dismissible) {
-            needsJS
-            classes("alert-dismissible")
-        }
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attr("role", "alert")
-        attrs?.invoke(this)
-    }) {
-        content()
-    }
-}
-
-@Composable
-public fun Link(
-    href: String?,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLAnchorElement>? = null,
-    content: ContentBuilder<HTMLAnchorElement>
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-    A(href, {
-        classes("alert-link")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Autocomplete.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Autocomplete.kt
deleted file mode 100644
index 1948d2d3..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Autocomplete.kt
+++ /dev/null
@@ -1,204 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.*
-import kotlinx.browser.window
-import org.jetbrains.compose.web.attributes.builders.InputAttrsScope
-import org.jetbrains.compose.web.css.*
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.Element
-import org.w3c.dom.HTMLButtonElement
-import org.w3c.dom.HTMLDivElement
-import org.w3c.dom.events.Event
-import org.w3c.dom.events.EventTarget
-
-private class ReferenceHolder<T>(var ref: T? = null)
-
-/**
- * A TextInput widget with autocomplete/search suggestions that will display below the TextField. This component
- * only supports the "controlled" Input variant. This version provides limited support and expects the user to
- * listen to all input change events and build the suggestions list.
- *
- * @param inputAttrs attributes builder.
- * @param suggestions Composable to build the list of suggestions to display
- */
-@Composable
-public fun Autocomplete(
-    inputAttrs: InputAttrsScope<String>.() -> Unit = {},
-    suggestions: ContentBuilder<HTMLDivElement>? = null
-) {
-    var itemsVisible by remember { mutableStateOf(false) }
-    val parentElement = remember { ReferenceHolder<Element>() }
-
-    DisposableEffect(true) {
-        val effect: (Event) -> Unit = { event ->
-            if (parentElement.ref?.isChild(event.target) != true) {
-                itemsVisible = false
-            }
-        }
-        window.document.addEventListener("mousedown", effect)
-        onDispose {
-            window.document.removeEventListener("mousedown", effect)
-        }
-    }
-
-    Div(
-        attrs = {
-            style {
-                padding(0.px)
-            }
-        }
-    ) {
-        DisposableEffect(true) {
-            parentElement.ref = scopeElement
-            onDispose { parentElement.ref = null }
-        }
-
-        TextInput(attrs = {
-            inputAttrs()
-            onInput {
-                itemsVisible = true
-            }
-        })
-
-        Div(
-            attrs = {
-                Style
-                classes("dropdown-menu")
-                if (itemsVisible) {
-                    classes("d-block")
-                } else {
-                    classes("d-none")
-                }
-                onClick {
-                    itemsVisible = false
-                }
-                style {
-                    padding(0.px)
-                }
-            },
-            content = suggestions
-        )
-    }
-}
-
-/**
- * An AutoComplete that displays Strings as suggestions.
- *
- * @param value The value for the TextInput
- * @param onValueChange callback when the user changes the Input text
- * @param inputId The Id to assign to the TextInput
- * @param suggestions List of suggestions to be presented to the user
- * @param onSelection callback for when the user selects a suggestion. The TextInput value will not be updated until
- * this Composable is recomposed with an updated value.
- */
-@Composable
-public fun Autocomplete(
-    value: String,
-    onValueChange: (String) -> Unit,
-    inputId: String? = null,
-    suggestions: List<String> = listOf(),
-    onSelection: (String) -> Unit
-) {
-    Autocomplete(
-        value = value,
-        onValueChange = onValueChange,
-        inputId = inputId,
-        suggestions = suggestions,
-        content = { _, item ->
-            Text(item)
-        },
-        onSelection = { _, item -> onSelection(item) }
-    )
-}
-
-/**
- * A TextInput widget with autocomplete/search suggestions that will display below the TextField. This component
- * only supports the "controlled" Input variant. It uses a callback for displaying suggestion items.
- *
- * @param value The value for the TextInput
- * @param onValueChange callback when the user changes the Input text
- * @param inputId The Id to assign to the TextInput
- * @param suggestions List of suggestions to be presented to the user
- * @param content Composable for rendering item content. The functions first parameter is the items index and the 2nd
- * parameter is the item to be rendered.
- * @param onSelection callback for when the user selects a suggestion. The TextInput value will not be updated until
- * this Composable is recomposed with an updated value.
- *
- * This function would be better if using a generic type for the List items, content Composable callback parameter,
- * and onSelection callback, except 2 issues may be responsible for compiler failures:
- * https://github.com/JetBrains/compose-jb/issues/774
- * https://github.com/JetBrains/compose-jb/issues/1226
- */
-@Composable
-public fun Autocomplete(
-    value: String,
-    onValueChange: (String) -> Unit,
-    inputId: String? = null,
-    suggestions: List<String> = listOf(),
-    content: @Composable ElementScope<HTMLButtonElement>.(index: Int, item: String) -> Unit,
-    onSelection: (index: Int, item: String) -> Unit
-) {
-    Autocomplete(inputAttrs = {
-        inputId?.let { id(inputId) }
-        value(value)
-        onInput {
-            onValueChange(it.value)
-        }
-    }) {
-        Ul(attrs = {
-            style {
-                padding(0.px)
-                margin(0.px)
-                listStyle("none")
-            }
-        }) {
-            suggestions.forEachIndexed { index, item ->
-                Li(attrs = {
-                    style {
-                        padding(0.cssRem)
-                    }
-                }) {
-                    Button(attrs = {
-                        classes("dropdown-item")
-                        onClick {
-                            onSelection(index, item)
-                        }
-                    }) {
-                        content(index, item)
-                    }
-                    if (index < suggestions.lastIndex) {
-                        Hr(attrs = {
-                            style {
-                                margin(0.px)
-                            }
-                        })
-                    }
-                }
-            }
-        }
-    }
-}
-
-/**
- * Traverses the element tree to see if this Element is a parent of the provided element.
- * @param element Element to check if it is a child of this Element
- */
-private fun Element.isChild(element: Element): Boolean {
-    var nextElement: Element? = element
-    while (nextElement != this && nextElement != null) {
-        nextElement = nextElement.parentElement
-    }
-    return nextElement == this
-}
-
-/**
- * Traverses the element tree to see if this Element is a parent of the provided EventTarget.
- * @param eventTarget EventTarget to check if it is a child of this Element
- */
-private fun Element.isChild(eventTarget: EventTarget?): Boolean {
-    return if (eventTarget is Element) {
-        isChild(eventTarget)
-    } else {
-        false
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Badge.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Badge.kt
deleted file mode 100644
index 987fe61b..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Badge.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Span
-import org.w3c.dom.HTMLSpanElement
-
-@Composable
-public fun Badge(
-    backgroundColor: Color,
-    textColor: Color? = null,
-    round: Boolean = false,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLSpanElement>? = null,
-    content: ContentBuilder<HTMLSpanElement>
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Span(attrs = {
-        classes("badge", backgroundColor.background())
-        if (textColor != null) {
-            classes(textColor.text())
-        }
-        if (round) {
-            classes("rounded-pill")
-        }
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Box.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Box.kt
deleted file mode 100644
index f30fa15b..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Box.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Box(
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div(attrs = {
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-    }, content = content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Brand.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Brand.kt
deleted file mode 100644
index 23850849..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Brand.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Brand(
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div(attrs = {
-        classes("navbar-brand")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Breakpoint.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Breakpoint.kt
deleted file mode 100644
index 9b7eb64c..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Breakpoint.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package bootstrap
-
-import org.jetbrains.compose.web.css.CSSLengthValue
-import org.jetbrains.compose.web.css.px
-
-public enum class Breakpoint(private val classInfix: String) {
-    Small("sm"),
-    Medium("md"),
-    Large("lg"),
-    ExtraLarge("xl"),
-    ExtraExtraLarge("xxl");
-
-    override fun toString(): String = classInfix
-}
-
-/**
- * Breakpoint thresholds that match Bootstrap defaults. If the defaults were overridden in the
- * css (e.g. using sass to generate a custom Bootstrap css), then this variable should be updated with a
- * new map that matches before using classes/functions that create
- * new styles in a media query. If this is not done, the breakpoints won't be consistent with modified
- * bootstrap css classes.
- */
-public var breakpoints: Map<Breakpoint, CSSLengthValue> = mapOf(
-    Breakpoint.Small to 576.px,
-    Breakpoint.Medium to 768.px,
-    Breakpoint.Large to 992.px,
-    Breakpoint.ExtraLarge to 1200.px,
-    Breakpoint.ExtraExtraLarge to 1400.px,
-)
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Button.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Button.kt
deleted file mode 100644
index 96fa855e..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Button.kt
+++ /dev/null
@@ -1,95 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.attributes.ButtonType
-import org.jetbrains.compose.web.attributes.disabled
-import org.jetbrains.compose.web.attributes.type
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.Button
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Text
-import org.w3c.dom.HTMLButtonElement
-
-@Composable
-public fun Button(
-    title: String,
-    color: Color = Color.Primary,
-    size: ButtonSize = ButtonSize.Default,
-    outlined: Boolean = false,
-    type: ButtonType = ButtonType.Submit,
-    disabled: Boolean = false,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLButtonElement>? = null,
-    action: () -> Unit
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Button(attrs = {
-        classes("btn")
-        classes(size.toString())
-        if (outlined) {
-            classes("btn-outline-$color")
-        } else {
-            classes("btn-$color")
-        }
-        if (disabled) {
-            disabled()
-        }
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-        type(type)
-        onClick {
-            action()
-        }
-    }) {
-        Text(title)
-    }
-}
-
-public enum class ButtonSize(private val prefix: String) {
-    Default("btn"), Large("btn-lg"), Small("btn-sm");
-
-    override fun toString(): String = prefix
-}
-
-@Composable
-public fun Button(
-    content: ContentBuilder<HTMLButtonElement>,
-    color: Color = Color.Primary,
-    outlined: Boolean = false,
-    type: ButtonType = ButtonType.Submit,
-    disabled: Boolean = false,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLButtonElement>? = null,
-    action: () -> Unit
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Button(attrs = {
-        classes("btn")
-        if (outlined) {
-            classes("btn-outline-$color")
-        } else {
-            classes("btn-$color")
-        }
-        if (disabled) {
-            disabled()
-        }
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-        type(type)
-        onClick {
-            action()
-        }
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/ButtonGroup.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/ButtonGroup.kt
deleted file mode 100644
index 9ad0d6ee..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/ButtonGroup.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun ButtonGroup(
-    styling: (Styling.() -> Unit)? = null,
-    content: ContentBuilder<HTMLDivElement>
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div({
-        classes("btn-group")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Card.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Card.kt
deleted file mode 100644
index f4d18ed8..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Card.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Card(
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    headerAttrs: AttrBuilderContext<HTMLDivElement>? = null,
-    header: ContentBuilder<HTMLDivElement>? = null,
-    footerAttrs: AttrBuilderContext<HTMLDivElement>? = null,
-    footer: ContentBuilder<HTMLDivElement>? = null,
-    bodyAttrs: AttrBuilderContext<HTMLDivElement>? = null,
-    body: ContentBuilder<HTMLDivElement>
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div({
-        classes("card")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-    }) {
-        header?.let {
-            Div({
-                classes("card-header")
-                headerAttrs?.invoke(this)
-            }, header)
-        }
-        Div({
-            classes("card-body")
-            bodyAttrs?.invoke(this)
-        }, body)
-        footer?.let {
-            Div({
-                classes("card-footer")
-                footerAttrs?.invoke(this)
-            }, footer)
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Checkbox.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Checkbox.kt
deleted file mode 100644
index 6cc345ae..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Checkbox.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.InputType
-import org.jetbrains.compose.web.attributes.builders.InputAttrsScope
-import org.jetbrains.compose.web.attributes.disabled
-import org.jetbrains.compose.web.attributes.forId
-import org.jetbrains.compose.web.dom.Div
-import org.jetbrains.compose.web.dom.Input
-import org.jetbrains.compose.web.dom.Label
-import org.jetbrains.compose.web.dom.Text
-
-@Composable
-public fun Checkbox(
-    checked: Boolean,
-    label: String,
-    id: String = remember { uuid4().toString() },
-    disabled: Boolean = false,
-    inline: Boolean = false,
-    switch: Boolean = false,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: (InputAttrsScope<Boolean>.() -> Unit)? = null,
-    onClick: (Boolean) -> Unit
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div({
-        classes(BSClasses.formCheck)
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        if (inline) {
-            classes(BSClasses.formCheckInline)
-        }
-        if (switch) {
-            classes(BSClasses.formSwitch)
-        }
-    }) {
-        Input(attrs = {
-            classes(BSClasses.formCheckInput)
-            id("_$id")
-            checked(checked)
-            onInput { event ->
-                onClick(event.value)
-            }
-            if (disabled) {
-                disabled()
-            }
-            attrs?.invoke(this)
-        }, type = InputType.Checkbox)
-        Label(attrs = {
-            classes(BSClasses.formCheckLabel)
-            forId("_$id")
-        }) {
-            Text(label)
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Classes.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Classes.kt
deleted file mode 100644
index aed00f3e..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Classes.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-package bootstrap
-
-public object BSClasses {
-    public const val disabled: String = "disabled"
-    public const val active: String = "active"
-
-    public val align: Align = Align
-    public val display: Display = Display
-
-    public const val colFormLabel: String = "col-form-label"
-    public const val collapse: String = "collapse"
-    public const val formCheck: String = "form-check"
-    public const val formCheckInline: String = "form-check-inline"
-    public const val formCheckInput: String = "form-check-input"
-    public const val formCheckLabel: String = "form-check-label"
-    public const val formControl: String = "form-control"
-    public const val formFloating: String = "form-floating"
-    public const val formLabel: String = "form-label"
-    public const val formRange: String = "form-range"
-    public const val formSelect: String = "form-select"
-    public const val formSelectSmall: String = "form-select-sm"
-    public const val formSelectLarge: String = "form-select-lg"
-    public const val formSwitch: String = "form-switch"
-    public const val formText: String = "form-text"
-    public const val inputGroup: String = "input-group"
-    public const val inputGroupLarge: String = "input-group-lg"
-    public const val inputGroupSmall: String = "input-group-sm"
-    public const val inputGroupText: String = "input-group-text"
-    public const val listGroup: String = "list-group"
-    public const val listGroupFlush: String = "list-group-flush"
-    public const val listGroupHorizontal: String = "list-group-horizontal"
-    public const val listGroupItem: String = "list-group-item"
-    public const val listGroupItemAction: String = "list-group-item-action"
-    public const val listGroupNumbered: String = "list-group-numbered"
-    public const val navbar: String = "navbar"
-    public const val navbarBrand: String = "navbar-brand"
-    public const val navbarCollapse: String = "navbar-collapse"
-    public const val navLink: String = "nav-link"
-    public const val navbarNav: String = "navbar-nav"
-    public const val navbarToggler: String = "navbar-toggler"
-    public const val navbarTogglerIcon: String = "navbar-toggler-icon"
-}
-
-public object Align {
-    public const val baseline: String = "align-baseline"
-    public const val top: String = "align-top"
-    public const val middle: String = "align-middle"
-    public const val bottom: String = "align-bottom"
-    public const val textTop: String = "align-text-top"
-    public const val textBottom: String = "align-text-bottom"
-}
-
-public object Display {
-    public val small: DisplayBreakpoint = DisplayBreakpoint(Breakpoint.Small)
-    public val medium: DisplayBreakpoint = DisplayBreakpoint(Breakpoint.Medium)
-    public val extraLarge: DisplayBreakpoint = DisplayBreakpoint(Breakpoint.ExtraLarge)
-    public val extraExtraLarge: DisplayBreakpoint = DisplayBreakpoint(Breakpoint.ExtraExtraLarge)
-
-    public const val none: String = "d-${DisplayValue.none}"
-    public const val inline: String = "d-${DisplayValue.inline}"
-    public const val inlineBlock: String = "d-${DisplayValue.inlineBlock}"
-    public const val block: String = "d-${DisplayValue.block}"
-    public const val grid: String = "d-${DisplayValue.grid}"
-    public const val table: String = "d-${DisplayValue.table}"
-    public const val tableCell: String = "d-${DisplayValue.tableCell}"
-    public const val tableRow: String = "d-${DisplayValue.tableRow}"
-    public const val flex: String = "d-${DisplayValue.flex}"
-    public const val inlineFlex: String = "d-${DisplayValue.inlineFlex}"
-}
-
-public class DisplayBreakpoint(breakpoint: Breakpoint) {
-    public val none: String = makeDisplayClass(breakpoint, DisplayValue.none)
-    public val inline: String = makeDisplayClass(breakpoint, DisplayValue.inline)
-    public val inlineBlock: String = makeDisplayClass(breakpoint, DisplayValue.inlineBlock)
-    public val block: String = makeDisplayClass(breakpoint, DisplayValue.block)
-    public val grid: String = makeDisplayClass(breakpoint, DisplayValue.grid)
-    public val table: String = makeDisplayClass(breakpoint, DisplayValue.table)
-    public val tableCell: String = makeDisplayClass(breakpoint, DisplayValue.tableCell)
-    public val tableRow: String = makeDisplayClass(breakpoint, DisplayValue.tableRow)
-    public val flex: String = makeDisplayClass(breakpoint, DisplayValue.flex)
-    public val inlineFlex: String = makeDisplayClass(breakpoint, DisplayValue.inlineFlex)
-}
-
-private fun makeDisplayClass(breakpoint: Breakpoint, value: String): String {
-    return "d-$breakpoint-$value"
-}
-
-private object DisplayValue {
-    const val none = "none"
-    const val inline = "inline"
-    const val inlineBlock = "inline-block"
-    const val block = "block"
-    const val grid = "grid"
-    const val table = "table"
-    const val tableCell = "table-cell"
-    const val tableRow = "table-row"
-    const val flex = "flex"
-    const val inlineFlex = "inline-flex"
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/CloseButton.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/CloseButton.kt
deleted file mode 100644
index 033befe2..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/CloseButton.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.attributes.ButtonType
-import org.jetbrains.compose.web.attributes.disabled
-import org.jetbrains.compose.web.attributes.type
-import org.jetbrains.compose.web.dom.Button
-
-@Composable
-public fun CloseButton(
-    disabled: Boolean = false,
-    onClose: () -> Unit
-) {
-    Style
-    Button({
-        type(ButtonType.Button)
-        classes("btn-close")
-        attr("aria-label", "Close")
-        if (disabled) {
-            disabled()
-        }
-        onClick {
-            onClose()
-        }
-    })
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Collapse.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Collapse.kt
deleted file mode 100644
index d20b7d09..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Collapse.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.ButtonType
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLButtonElement
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Collapse(
-    title: String,
-    id: String = uuid4().toString(),
-    color: Color = Color.Primary,
-    buttonAttrs: AttrBuilderContext<HTMLButtonElement>? = null,
-    contentAttrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>
-) {
-    Style
-    needsJS
-    Button(attrs = {
-        classes("btn", "btn-$color")
-        attr("data-bs-toggle", "collapse")
-        attr("data-bs-target", "#_$id")
-        attr("aria-expanded", "false")
-        attr("aria-controls", "_$id")
-        buttonAttrs?.invoke(this)
-    }, type = ButtonType.Button, title = title) { }
-    Div({
-        classes("collapse")
-        id("_$id")
-        contentAttrs?.invoke(this)
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Color.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Color.kt
deleted file mode 100644
index a6f22e04..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Color.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package bootstrap
-
-public enum class Color(private val value: String) {
-    Primary("primary"),
-    Secondary("secondary"),
-    Success("success"),
-    Info("info"),
-    Warning("warning"),
-    Danger("danger"),
-    Light("light"),
-    Dark("dark"),
-    Body("body"),
-    Muted("muted"),
-    White("white"),
-    Black50("black-50"),
-    White50("white-50"),
-    Transparent("transparent");
-
-    override fun toString(): String = value
-
-    public fun background(): String = "bg-$value"
-    public fun text(): String = "text-$value"
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Column.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Column.kt
deleted file mode 100644
index d03c5e8b..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Column.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Column(
-    auto: Boolean = false,
-    breakpoint: Breakpoint? = null,
-    size: Int? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div(attrs = {
-        classes("col" + (breakpoint?.let { "-$it" } ?: "") + (size?.let { "-$it" } ?: ""))
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        if (auto) {
-            classes("col-auto")
-        }
-        attrs?.invoke(this)
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Container.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Container.kt
deleted file mode 100644
index 62bc0048..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Container.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Container(
-    fluid: Boolean = false,
-    type: Breakpoint? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>?
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div(attrs = {
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        when {
-            fluid -> {
-                classes("container-fluid")
-            }
-            type != null -> {
-                classes("container-$type")
-            }
-            else -> {
-                classes("container")
-            }
-        }
-
-        attrs?.invoke(this)
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/DropDown.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/DropDown.kt
deleted file mode 100644
index 6d6c68ca..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/DropDown.kt
+++ /dev/null
@@ -1,194 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.AttrsScope
-import org.jetbrains.compose.web.dom.*
-import org.jetbrains.compose.web.dom.Button
-import org.w3c.dom.Element
-import org.w3c.dom.HTMLLIElement
-import org.w3c.dom.HTMLUListElement
-
-public class DropDownBuilder(private val scope: ElementScope<HTMLUListElement>) : ElementScope<HTMLUListElement> by scope {
-    @Composable
-    public fun Button(title: String, styling: (Styling.() -> Unit)? = null, onClick: () -> Unit) {
-        Li {
-            val buttonClasses = styling?.let {
-                Styling().apply(it).generate()
-            }
-            Button({
-                classes("dropdown-item")
-                if (buttonClasses != null) {
-                    classes(classes = buttonClasses)
-                }
-                onClick { onClick() }
-            }) {
-                Text(title)
-            }
-        }
-    }
-
-    @Composable
-    public fun Divider(styling: (Styling.() -> Unit)? = null) {
-        Li {
-            val buttonClasses = styling?.let {
-                Styling().apply(it).generate()
-            }
-            Hr {
-                classes("dropdown-divider")
-                if (buttonClasses != null) {
-                    classes(classes = buttonClasses)
-                }
-            }
-        }
-    }
-
-    @Composable
-    public fun Header(title: String, styling: (Styling.() -> Unit)? = null) {
-        Li {
-            val buttonClasses = styling?.let {
-                Styling().apply(it).generate()
-            }
-            H6({
-                classes("dropdown-header")
-                if (buttonClasses != null) {
-                    classes(buttonClasses)
-                }
-            }) {
-                Text(title)
-            }
-        }
-    }
-
-    @Composable
-    public fun Custom(block: ContentBuilder<HTMLLIElement>) {
-        Li {
-            block()
-        }
-    }
-}
-
-public object DropDown {
-    public enum class Direction(private val classname: String) {
-        Down("dropdown"),
-        Up("dropup"),
-        Right("dropend"),
-        Left("dropstart");
-
-        public override fun toString(): String {
-            return classname
-        }
-    }
-
-    public sealed class MenuAlignment(internal vararg val classes: String) {
-        public object Start : MenuAlignment("dropdown-menu")
-        public object End : MenuAlignment("dropdown-menu", "dropdown-menu-end")
-        public class StartThenEndAtBreakpoint(breakpoint: Breakpoint) :
-            MenuAlignment("dropdown-menu", "dropdown-menu-$breakpoint-end")
-
-        public class EndThenStartAtBreakpoint(breakpoint: Breakpoint) :
-            MenuAlignment("dropdown-menu", "dropdown-menu-end", "dropdown-menu-$breakpoint-start")
-    }
-}
-
-@Composable
-public fun DropDown(
-    title: String,
-    id: String = remember { "dropdownMenu${uuid4()}" },
-    size: ButtonSize = ButtonSize.Default,
-    color: Color = Color.Primary,
-    styling: (Styling.() -> Unit)? = null,
-    direction: DropDown.Direction = DropDown.Direction.Down,
-    menuAlignment: DropDown.MenuAlignment = DropDown.MenuAlignment.Start,
-    block: @Composable DropDownBuilder.() -> Unit,
-) {
-    Style
-    needsJS
-    needsPopper
-    val trigger = @Composable { classes: List<String>? ->
-        Button(attrs = {
-            classes("btn", "btn-$color", "dropdown-toggle")
-            classes(size.toString())
-            if (classes != null) {
-                classes(classes)
-            }
-            id(id)
-            attr("data-bs-toggle", "dropdown")
-            attr("aria-expanded", "false")
-            responsiveAlignmentAttribute(menuAlignment)
-        }) {
-            Text(title)
-        }
-    }
-
-    DropDownBase(trigger, id, styling, direction, menuAlignment, block)
-}
-
-@Composable
-public fun NavbarDropDown(
-    title: String,
-    href: String?,
-    id: String = remember { "dropdownMenu${uuid4()}" },
-    styling: (Styling.() -> Unit)? = null,
-    direction: DropDown.Direction = DropDown.Direction.Down,
-    menuAlignment: DropDown.MenuAlignment = DropDown.MenuAlignment.Start,
-    block: @Composable DropDownBuilder.() -> Unit,
-) {
-    Style
-    needsJS
-    val trigger = @Composable { classes: List<String>? ->
-        A(
-            attrs = {
-                classes("nav-link", "dropdown-toggle")
-                if (classes != null) {
-                    classes(classes)
-                }
-                id(id)
-                attr("data-bs-toggle", "dropdown")
-                attr("aria-expanded", "false")
-                responsiveAlignmentAttribute(menuAlignment)
-            },
-            href = href
-        ) {
-            Text(title)
-        }
-    }
-
-    DropDownBase(trigger, id, styling, direction, menuAlignment, block)
-}
-
-private fun <T : Element> AttrsScope<T>.responsiveAlignmentAttribute(menuAlignment: DropDown.MenuAlignment) {
-    if (menuAlignment is DropDown.MenuAlignment.EndThenStartAtBreakpoint ||
-        menuAlignment is DropDown.MenuAlignment.StartThenEndAtBreakpoint
-    ) {
-        attr("data-bs-display", "static")
-    }
-}
-
-@Composable
-private fun DropDownBase(
-    triggerElement: @Composable (classes: List<String>?) -> Unit,
-    id: String,
-    styling: (Styling.() -> Unit)? = null,
-    direction: DropDown.Direction,
-    menuAlignment: DropDown.MenuAlignment,
-    block: @Composable DropDownBuilder.() -> Unit,
-) {
-    Style
-    needsJS
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div({ classes("btn-group", direction.toString()) }) {
-        triggerElement(classes)
-
-        Ul({
-            classes(classes = menuAlignment.classes)
-            attr("aria-labelledby", id)
-        }) {
-            DropDownBuilder(this).block()
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/FormFloating.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/FormFloating.kt
deleted file mode 100644
index f89d6b9f..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/FormFloating.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.NonRestartableComposable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-@NonRestartableComposable
-public fun FormFloating(
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-    Div(attrs = {
-        classes("form-floating")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        if (attrs != null) {
-            attrs()
-        }
-    }, content)
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/FormLabel.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/FormLabel.kt
deleted file mode 100644
index 800ff4ec..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/FormLabel.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Label
-import org.w3c.dom.HTMLLabelElement
-
-@Composable
-public fun FormLabel(
-    forId: String? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLLabelElement>? = null,
-    content: ContentBuilder<HTMLLabelElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Label(
-        forId = forId,
-        attrs = {
-            classes(BSClasses.formLabel)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-            attrs?.invoke(this)
-        },
-        content = content
-    )
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/GridBox.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/GridBox.kt
deleted file mode 100644
index 77f2b158..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/GridBox.kt
+++ /dev/null
@@ -1,773 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.css.*
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.HTMLDivElement
-import kotlin.reflect.KProperty
-
-@Composable
-public fun GridBox(
-    styling: @Composable GridStyle.() -> Unit,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: (@Composable GridContentBuilder.() -> Unit)? = null
-) {
-    Style
-    val style = GridStyle(styling)
-    val classes = style.generate()
-
-    Div(attrs = {
-        classes("d-grid")
-        classes(classes = classes)
-        attrs?.invoke(this)
-    }) {
-        val scope = remember { GridContentBuilder(this) }
-        content?.invoke(scope)
-    }
-}
-
-public class GridContentBuilder(scope: ElementScope<HTMLDivElement>) : ElementScope<HTMLDivElement> by scope {
-    public fun Styling.GridItem(spec: GridItemLayout.() -> Unit) {
-        val s = GridItemLayout().apply(spec)
-
-        this.registerGenerator {
-            s.generate()
-        }
-    }
-}
-
-@Composable
-public fun GridStyle(styling: @Composable GridStyle.() -> Unit): GridStyle = GridStyle().apply { styling() }
-
-public class GridStyle : Styling() {
-    public val GridLayout: GridLayout = GridLayout()
-
-    @Composable
-    override fun generate(): List<String> {
-        return super.generate() + GridLayout.generate()
-    }
-}
-
-public class GridLayout {
-    private var columns: MutableList<GridTemplateTrack> = mutableListOf()
-    private var rows: MutableList<GridTemplateTrack> = mutableListOf()
-    private var areas: MutableList<GridArea> = mutableListOf()
-    public var gap: CSSLengthOrPercentageValue? = null
-    public var justifyContent: Placement? = null
-    public var alignContent: Placement? = null
-
-    public operator fun invoke(f: GridLayout.() -> Unit) {
-        this.f()
-    }
-
-    public enum class Placement(private val value: String) {
-        Start("start"),
-        End("end"),
-        Center("center"),
-        Stretch("stretch"),
-        SpaceAround("space-around"),
-        SpaceBetween("space-between"),
-        SpaceEvenly("space-evenly");
-
-        public override fun toString(): String {
-            return value
-        }
-    }
-
-    public fun columns(breakpoint: Breakpoint? = null, spec: GridTemplateTrack.() -> Unit) {
-        columns += GridTemplateTrack(GridTemplateTrack.ColumnOrRow.Column, breakpoint).apply(spec)
-    }
-
-    public fun rows(breakpoint: Breakpoint? = null, spec: GridTemplateTrack.() -> Unit) {
-        rows += GridTemplateTrack(GridTemplateTrack.ColumnOrRow.Row, breakpoint).apply(spec)
-    }
-
-    public fun areas(breakpoint: Breakpoint? = null, spec: GridArea.() -> Unit) {
-        areas += GridArea(breakpoint).apply(spec)
-    }
-
-    @Composable
-    internal fun generate(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-
-        Style {
-            val classname = remember { "_${uuid4()}" }
-
-            className(classname) style {
-                gap?.let {
-                    property("gap", gap.toString())
-                }
-                justifyContent?.let {
-                    property("justify-content", it.toString())
-                }
-                alignContent?.let {
-                    property("align-content", it.toString())
-                }
-            }
-
-            columns.forEach {
-                it.apply { classes += generateStyle() }
-            }
-
-            rows.forEach {
-                it.apply { classes += generateStyle() }
-            }
-
-            areas.forEach {
-                it.apply { classes += generateStyle() }
-            }
-            classes += classname
-        }
-
-        return classes
-    }
-}
-
-public class GridTemplateTrack internal constructor(
-    private val type: ColumnOrRow,
-    private val breakpoint: Breakpoint?
-) {
-    private val items: MutableList<Grid.GridTemplateItem> = mutableListOf()
-    public var gap: CSSLengthOrPercentageValue? = null
-    public var alignment: Alignment? = null
-    private var auto = false
-
-    internal enum class ColumnOrRow(val gap: String, val align: String) {
-        Column("column-gap", "align-items"),
-        Row("row-gap", "justify-items"),
-    }
-
-    public enum class Alignment(private val value: String) {
-        Start("start"),
-        End("end"),
-        Center("center"),
-        Stretch("stretch");
-
-        public override fun toString(): String {
-            return value
-        }
-    }
-
-    public fun none() {
-        check(items.isEmpty()) {
-            "Cannot add 'none' to already specified grid-template-columns"
-        }
-        items.add(Grid.GridTemplateNone)
-    }
-
-    /**
-     * This function is used to implement grid-template-columns/rows when the
-     * track list follows the <track-list> syntax.
-     * See https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns
-     */
-    public fun trackList(block: TrackList.() -> Unit) {
-        check(items.isEmpty()) {
-            "Cannot add more tracks"
-        }
-        items += TrackList().apply(block).items
-    }
-
-    /**
-     * This function is used to implement grid-template-columns/rows when the
-     * track list follows the <auto-track-list> syntax.
-     * See https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns
-     */
-    public fun autoTrackList(block: AutoTrackList.() -> Unit) {
-        check(items.isEmpty()) {
-            "Cannot add more tracks"
-        }
-        items += AutoTrackList().apply(block).items
-    }
-
-    /**
-     * This function is used to implement grid-auto-rows and grid-auto-columns properties.
-     * See https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns
-     */
-    public fun auto(block: AutoList.() -> Unit) {
-        check(items.isEmpty()) {
-            "Cannot add more tracks"
-        }
-        items += AutoList().apply(block).items
-        auto = true
-    }
-
-    @Composable
-    internal fun StyleSheetBuilder.generateStyle(): String {
-        val classname = remember { "_${uuid4()}" }
-
-        withBreakpoint(breakpoint) {
-            className(classname) style {
-                val propValue = items.joinToString(separator = " ")
-                val propName = when {
-                    auto && type == ColumnOrRow.Column -> "grid-auto-columns"
-                    auto && type == ColumnOrRow.Row -> "grid-auto-rows"
-                    !auto && type == ColumnOrRow.Column -> "grid-template-columns"
-                    !auto && type == ColumnOrRow.Row -> "grid-template-rows"
-                    else -> error("not possible")
-                }
-
-                property(propName, propValue)
-
-                gap?.let {
-                    property(type.gap, it)
-                }
-
-                alignment?.let {
-                    property(type.align, it.toString())
-                }
-            }
-        }
-
-        return classname
-    }
-}
-
-public open class TrackListUnits {
-    public val Number.ch: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.ch)
-    public val Number.em: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.em)
-    public val Number.ex: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.ex)
-    public val Number.rem: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.rem)
-    public val Number.vh: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.vh)
-    public val Number.vw: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.vw)
-    public val Number.vmin: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.vmin)
-    public val Number.vmax: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.vmax)
-    public val Number.px: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.px)
-    public val Number.cm: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.cm)
-    public val Number.mm: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.mm)
-    public val Number.pc: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.pc)
-    public val Number.pt: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.pt)
-    public val Number.percent: Grid.LengthPercentage by LengthPercentageUnitPropertyDelegate(CSSUnit.percent)
-
-    public val Number.fr: Grid.Flex
-        get(): Grid.Flex {
-            return Grid.Flex(CSSUnitValueTyped(this.toFloat(), CSSUnit.fr))
-        }
-
-    private class LengthPercentageUnitPropertyDelegate<T : CSSUnitLengthOrPercentage>(val unit: T) {
-        operator fun getValue(thisRef: Number, property: KProperty<*>): Grid.LengthPercentage {
-            return Grid.LengthPercentage(CSSUnitValueTyped(thisRef.toFloat(), unit))
-        }
-    }
-}
-
-public class TrackList internal constructor() : TrackListUnits() {
-    internal val items: MutableList<Grid.TrackListItem> = mutableListOf()
-
-    public fun track(names: Array<String>, size: Grid.TrackSizeItem) {
-        if (names.isNotEmpty()) {
-            items += Grid.LineNames(names = names)
-        }
-        items += size
-    }
-
-    public fun track(size: Grid.TrackSizeItem) {
-        items += size
-    }
-
-    public fun track(names: Array<String>, repeat: TrackRepeat) {
-        if (names.isNotEmpty()) {
-            items += Grid.LineNames(names = names)
-        }
-        items += repeat
-    }
-
-    public fun track(repeat: TrackRepeat) {
-        items += repeat
-    }
-
-    public class TrackRepeat(private val count: Int, private vararg val items: Grid.TrackRepeatItem) :
-        Grid.TrackListItem {
-        override fun toString(): String {
-            return "repeat($count, ${items.joinToString(separator = " ")})"
-        }
-    }
-
-    public fun lineNames(vararg names: String) {
-        items += Grid.LineNames(names = names)
-    }
-}
-
-public class AutoList internal constructor() : TrackListUnits() {
-    internal val items: MutableList<Grid.TrackSizeItem> = mutableListOf()
-
-    public fun track(size: Grid.TrackSizeItem) {
-        items += size
-    }
-}
-
-public data class MinMax(private val min: Grid.InflexibleBreadthItem, private val max: Grid.TrackBreadthItem) :
-    Grid.TrackSizeItem {
-
-    override fun toString(): String {
-        return "minmax($min,$max)"
-    }
-}
-
-public class AutoTrackList internal constructor() : TrackListUnits() {
-    internal val items: MutableList<Grid.AutoTrackListItem> = mutableListOf()
-    private var autoRepeat = false
-
-    public fun track(names: List<String>, size: Grid.FixedSizeItem) {
-        if (names.isNotEmpty()) {
-            lineNames(names)
-        }
-        items += size
-    }
-
-    public fun track(size: Grid.FixedSizeItem) {
-        items += size
-    }
-
-    public fun track(names: List<String>, repeat: FixedRepeat) {
-        if (names.isNotEmpty()) {
-            lineNames(names)
-        }
-        items += repeat
-    }
-
-    public fun track(repeat: FixedRepeat) {
-        items += repeat
-    }
-
-    public fun lineNames(names: List<String>) {
-        items += Grid.LineNames(names = names.toTypedArray())
-    }
-
-    public fun lineNames(vararg names: String) {
-        items += Grid.LineNames(*names)
-    }
-
-    public fun autoRepeat(type: RepeatType, vararg repeatItems: Grid.FixedRepeatItem) {
-        if (type == RepeatType.AutoFill || type == RepeatType.AutoFit) {
-            require(!autoRepeat) {
-                "auto-repeat already specified, can only be specified once per grid-template-columns"
-            }
-            autoRepeat = true
-        }
-
-        items += AutoRepeat(type, *repeatItems)
-    }
-
-    public class MinMax private constructor(private val min: Any, private val max: Any) : Grid.FixedSizeItem {
-        public constructor(minimum: Grid.FixedBreadthItem, maximum: Grid.TrackBreadthItem) : this(
-            min = minimum,
-            max = maximum
-        )
-
-        public constructor(minimum: Grid.InflexibleBreadthItem, maximum: Grid.FixedBreadthItem) : this(
-            min = minimum,
-            max = maximum
-        )
-
-        override fun toString(): String {
-            return "minmax($min,$max)"
-        }
-    }
-
-    public class AutoRepeat(private val type: RepeatType, private vararg val items: Grid.FixedRepeatItem) :
-        Grid.AutoTrackListItem {
-        override fun toString(): String {
-            return "repeat($type, ${items.joinToString(separator = " ")})"
-        }
-    }
-
-    public enum class RepeatType(private val value: String) {
-        AutoFill("auto-fill"),
-        AutoFit("auto-fit");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public class FixedRepeat(private val count: Int, private vararg val items: Grid.FixedRepeatItem) :
-        Grid.AutoTrackListItem {
-        override fun toString(): String {
-            return "repeat($count, ${items.joinToString(separator = " ")})"
-        }
-    }
-}
-
-public object Grid {
-    /**
-     * Marker interface for items that can be included in a Grid-Template-Columns or
-     * Grid-Template-Rows propery.
-     */
-    public interface GridTemplateItem
-
-    /**
-     * Marker interface for items that can be included in a <track-list>.
-     * see https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns
-     */
-    public interface TrackListItem : GridTemplateItem
-
-    /**
-     * Marker interface for items that can be included in an <auto-track-list>.
-     * see https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns
-     */
-    public interface AutoTrackListItem : GridTemplateItem
-
-    // Marker interfaces for items that can be used as a <track-size>
-    public interface TrackSizeItem : TrackListItem, TrackRepeatItem
-    public interface TrackBreadthItem : TrackSizeItem
-    public interface TrackRepeatItem
-
-    // Marker interfaces for items that can be used as a <fixed-size>
-    public interface FixedSizeItem : AutoTrackListItem, FixedRepeatItem
-    public interface FixedBreadthItem : FixedSizeItem
-    public interface FixedRepeatItem
-
-    public interface InflexibleBreadthItem
-
-    internal object GridTemplateNone : GridTemplateItem {
-        override fun toString(): String {
-            return "none"
-        }
-    }
-
-    public class LineNames(private vararg val names: String) :
-        TrackListItem, AutoTrackListItem, TrackRepeatItem, FixedRepeatItem {
-        override fun toString(): String {
-            return names.joinToString(prefix = "[", postfix = "]", separator = " ")
-        }
-    }
-
-    public data class FitContent(val value: LengthPercentage) : TrackSizeItem {
-        override fun toString(): String {
-            return "fit-content($value)"
-        }
-    }
-
-    public class LengthPercentage(private val v: CSSLengthOrPercentageValue) :
-        InflexibleBreadthItem, TrackBreadthItem, FixedBreadthItem {
-        override fun toString(): String {
-            return v.toString()
-        }
-    }
-
-    public object MinContent : InflexibleBreadthItem, TrackBreadthItem {
-        override fun toString(): String {
-            return "min-content"
-        }
-    }
-
-    public object MaxContent : InflexibleBreadthItem, TrackBreadthItem {
-        override fun toString(): String {
-            return "max-content"
-        }
-    }
-
-    public object Auto : InflexibleBreadthItem, TrackBreadthItem {
-        override fun toString(): String {
-            return "auto"
-        }
-    }
-
-    public class Flex(private val v: CSSSizeValue<CSSUnit.fr>) : TrackBreadthItem {
-        override fun toString(): String {
-            return v.toString()
-        }
-    }
-}
-
-public class GridArea internal constructor(private val breakpoint: Breakpoint?) {
-    private val rows: MutableList<List<String>> = mutableListOf()
-
-    public fun row(vararg cells: String) {
-        rows += listOf(*cells)
-    }
-
-    @Composable
-    internal fun StyleSheetBuilder.generateStyle(): String {
-        val classname = remember { "_${uuid4()}" }
-
-        withBreakpoint(breakpoint) {
-            className(classname) style {
-                property(
-                    "grid-template-areas",
-                    rows.joinToString(separator = " ") {
-                        it.joinToString(separator = " ", prefix = "\"", postfix = "\"")
-                    }
-                )
-            }
-        }
-
-        return classname
-    }
-}
-
-public class GridItemLayout {
-    private val areaSpecs: MutableList<GridItemArea> = mutableListOf()
-    private val placements: MutableList<PlacementSpec> = mutableListOf()
-
-    public fun area(breakpoint: Breakpoint? = null, name: String) {
-        areaSpecs += GridItemArea(breakpoint, name)
-    }
-
-    public fun area(name: String) {
-        areaSpecs += GridItemArea(null, name)
-    }
-
-    public fun area(breakpoint: Breakpoint, name: String) {
-        areaSpecs += GridItemArea(breakpoint, name)
-    }
-
-    public fun area(spec: GridItemArea.() -> Unit) {
-        areaSpecs += GridItemArea().apply(spec)
-    }
-
-    public fun area(breakpoint: Breakpoint, spec: GridItemArea.() -> Unit) {
-        areaSpecs += GridItemArea(breakpoint).apply(spec)
-    }
-
-    public fun placement(spec: PlacementSpec.() -> Unit) {
-        placements += PlacementSpec().apply(spec)
-    }
-
-    public fun placement(breakpoint: Breakpoint, spec: PlacementSpec.() -> Unit) {
-        placements += PlacementSpec(breakpoint).apply(spec)
-    }
-
-    @Composable
-    internal fun generate(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-
-        Style {
-            areaSpecs.forEach {
-                it.apply { classes += generateStyle() }
-            }
-            placements.forEach {
-                it.apply { classes += generateStyle() }
-            }
-        }
-
-        return classes
-    }
-}
-
-public class GridItemArea(private val breakpoint: Breakpoint? = null, private val name: String? = null) {
-    private var column: GridItemAreaSpec? = null
-    private var row: GridItemAreaSpec? = null
-
-    public fun row(f: GridItemAreaSpec.() -> Unit) {
-        row = GridItemAreaSpec().apply(f)
-    }
-
-    public fun row(start: Int, end: Int? = null) {
-        row = GridItemAreaSpec().apply {
-            start(start)
-            end?.let { end(it) }
-        }
-    }
-
-    public fun row(start: Int, end: GridLine? = null) {
-        row = GridItemAreaSpec().apply {
-            start(start)
-            end(end)
-        }
-    }
-
-    public fun row(start: GridLine, end: Int? = null) {
-        row = GridItemAreaSpec().apply {
-            start(start)
-            end?.let {
-                end(end)
-            }
-        }
-    }
-
-    public fun row(start: GridLine, end: GridLine?) {
-        row = GridItemAreaSpec().apply {
-            start(start)
-            end(end)
-        }
-    }
-
-    public fun column(f: GridItemAreaSpec.() -> Unit) {
-        column = GridItemAreaSpec().apply(f)
-    }
-
-    public fun column(start: Int, end: Int?) {
-        column = GridItemAreaSpec().apply {
-            start(start)
-            end?.let {
-                end(it)
-            }
-        }
-    }
-
-    public fun column(start: Int, end: GridLine?) {
-        column = GridItemAreaSpec().apply {
-            start(start)
-            end(end)
-        }
-    }
-
-    public fun column(start: GridLine, end: Int?) {
-        column = GridItemAreaSpec().apply {
-            start(start)
-            end?.let { end(it) }
-        }
-    }
-
-    public fun column(start: GridLine, end: GridLine) {
-        column = GridItemAreaSpec().apply {
-            start(start)
-            end(end)
-        }
-    }
-
-    @Composable
-    internal fun StyleSheetBuilder.generateStyle(): String {
-        val classname = remember { "_${uuid4()}" }
-
-        withBreakpoint(breakpoint) {
-            className(classname) style {
-                if (name != null) {
-                    property("grid-area", name)
-                } else {
-                    column?.let {
-                        property("grid-column", it.toString())
-                    }
-                    row?.let {
-                        property("grid-row", it.toString())
-                    }
-                }
-            }
-        }
-
-        return classname
-    }
-}
-
-public class GridItemAreaSpec {
-    private var startPlacement: GridLine = GridLine.Auto
-    private var endPlacement: GridLine? = null
-
-    public fun start(ident: String) {
-        startPlacement = GridLine.CustomIdent(ident)
-    }
-
-    public fun start(line: Int, ident: String? = null) {
-        startPlacement = GridLine.Line(line, ident)
-    }
-
-    public fun end(ident: String) {
-        endPlacement = GridLine.CustomIdent(ident)
-    }
-
-    public fun end(line: Int, ident: String? = null) {
-        endPlacement = GridLine.Line(line, ident)
-    }
-
-    internal fun start(start: GridLine) {
-        startPlacement = start
-    }
-
-    internal fun end(end: GridLine?) {
-        end?.let {
-            endPlacement = it
-        }
-    }
-
-    public infix fun Int.to(end: Int) {
-        startPlacement = GridLine.Line(this)
-        endPlacement = GridLine.Line(end)
-    }
-
-    public infix fun Int.to(end: GridLine) {
-        startPlacement = GridLine.Line(this)
-        endPlacement = end
-    }
-
-    public infix fun GridLine.to(end: GridLine) {
-        startPlacement = this
-        endPlacement = end
-    }
-
-    public infix fun GridLine.to(end: Int) {
-        startPlacement = this
-        endPlacement = GridLine.Line(end)
-    }
-
-    public override fun toString(): String {
-        return startPlacement.toString() + (endPlacement?.let { " / $endPlacement" } ?: "")
-    }
-}
-
-public sealed class GridLine {
-    public object Auto : GridLine() {
-        override fun toString(): String {
-            return "auto"
-        }
-    }
-
-    internal data class CustomIdent(private val ident: String) : GridLine() {
-        override fun toString(): String {
-            return ident
-        }
-    }
-
-    internal data class Line(private val number: Int, private val ident: String? = null) : GridLine() {
-        override fun toString(): String {
-            return number.toString() + (ident ?: "")
-        }
-    }
-
-    public class Span private constructor(private val number: Int?, private val ident: String?) :
-        GridLine() {
-
-        public constructor(n: Int) : this(n, null)
-        public constructor(id: String) : this(null, id)
-
-        override fun toString(): String {
-            return "span " + (number?.toString() ?: ident)
-        }
-    }
-}
-
-public class PlacementSpec(private val breakpoint: Breakpoint? = null) {
-    public var block: PlacementType = PlacementType.Auto
-    public var inline: PlacementType? = null
-
-    public enum class PlacementType(private val value: String) {
-        Auto("auto"),
-        Start("start"),
-        End("end"),
-        Center("center"),
-        Stretch("stretch");
-
-        public override fun toString(): String {
-            return value
-        }
-    }
-
-    @Composable
-    internal fun StyleSheetBuilder.generateStyle(): String {
-        val classname = remember { "_${uuid4()}" }
-
-        withBreakpoint(breakpoint) {
-            className(classname) style {
-                property("place-self", block.toString() + (inline?.let { " $it" } ?: ""))
-            }
-        }
-
-        return classname
-    }
-}
-
-private fun StyleSheetBuilder.withBreakpoint(
-    breakpoint: Breakpoint?,
-    block: GenericStyleSheetBuilder<CSSStyleRuleBuilder>.() -> Unit
-) {
-    val bp = breakpoints[breakpoint]
-    if (bp != null) {
-        media(mediaMinWidth(bp)) {
-            block()
-        }
-    } else {
-        block()
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Icon.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Icon.kt
deleted file mode 100644
index ae7b5db6..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Icon.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.I
-import org.w3c.dom.HTMLElement
-
-/**
- * Bootstrap Icon shortcut when using with already embedded icons.
- * Alternative use `bootstrap-compose-icons`.
- */
-@Composable
-public fun Icon(
-    iconName: String,
-    styling: (Styling.() -> Unit)? = null,
-    attrsBuilder: AttrBuilderContext<HTMLElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    I({
-        classes("bi", "bi-$iconName")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrsBuilder?.invoke(this)
-    })
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Input.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Input.kt
deleted file mode 100644
index 82c66111..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Input.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.attributes.AutoComplete
-import org.jetbrains.compose.web.attributes.InputType
-import org.jetbrains.compose.web.attributes.autoComplete
-import org.jetbrains.compose.web.attributes.builders.InputAttrsScope
-import org.jetbrains.compose.web.attributes.placeholder
-import org.jetbrains.compose.web.dom.Input
-import org.jetbrains.compose.web.dom.Label
-import org.jetbrains.compose.web.events.SyntheticInputEvent
-import org.w3c.dom.HTMLInputElement
-import org.w3c.dom.Text
-
-@Composable
-public fun <T> Input(
-    label: String,
-    value: String,
-    type: InputType<T>,
-    placeholder: String? = null,
-    autocomplete: AutoComplete = AutoComplete.off,
-    labelClasses: String = "form-label",
-    inputClasses: String = "form-control",
-    attrs: (InputAttrsScope<T>.() -> Unit)? = null,
-    onInput: (SyntheticInputEvent<T, HTMLInputElement>) -> Unit
-) {
-    Style
-    Label(forId = null, attrs = {
-        classes(labelClasses)
-    }) {
-        Text(label)
-        Input(type = type, attrs = {
-            autoComplete(autocomplete)
-            attrs?.invoke(this)
-            classes(inputClasses)
-            value(value)
-            if (placeholder != null) {
-                placeholder(placeholder)
-            }
-            onInput {
-                onInput(it)
-            }
-        })
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/InputGroup.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/InputGroup.kt
deleted file mode 100644
index 983f4d7e..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/InputGroup.kt
+++ /dev/null
@@ -1,561 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.NonRestartableComposable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.*
-import org.jetbrains.compose.web.attributes.builders.InputAttrsScope
-import org.jetbrains.compose.web.dom.*
-import org.jetbrains.compose.web.dom.Text
-import org.jetbrains.compose.web.events.SyntheticInputEvent
-import org.w3c.dom.*
-
-@Composable
-public fun InputGroup(
-    inputId: String = remember { "_${uuid4()}" },
-    size: InputGroupSize = InputGroupSize.Default,
-    content: @Composable InputGroupContext.() -> Unit,
-) {
-    Style
-    val scope = InputGroupContext(inputId)
-
-    Div(
-        attrs = {
-            classes(BSClasses.inputGroup)
-            when (size) {
-                InputGroupSize.Small -> classes(BSClasses.inputGroupSmall)
-                InputGroupSize.Large -> classes(BSClasses.inputGroupLarge)
-                else -> {
-                }
-            }
-        }
-    ) {
-        scope.content()
-    }
-}
-
-public class InputGroupContext(private val inputId: String) {
-    private fun <K> InputAttrsScope<K>.buildInputAttrs(
-        disabled: Boolean = false,
-        autocomplete: AutoComplete = AutoComplete.off,
-        classes: List<String>?,
-        attrs: (InputAttrsScope<K>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<K, HTMLInputElement>) -> Unit,
-    ) {
-        classes(BSClasses.formControl)
-        if (classes != null) {
-            classes(classes)
-        }
-        id(inputId)
-        if (disabled) {
-            disabled()
-        }
-        autoComplete(autocomplete)
-        attrs?.invoke(this)
-        onInput { event ->
-            onInput(event)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun <K> Input(
-        type: InputType<K>,
-        autocomplete: AutoComplete = AutoComplete.off,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: (InputAttrsScope<K>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<K, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        Input(
-            type = type,
-            attrs = {
-                buildInputAttrs(false, autocomplete, classes, attrs, onInput)
-            }
-        )
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun DateInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.DateInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun DateTimeLocalInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.DateTimeLocalInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun EmailInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.EmailInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun FileInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.FileInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun HiddenInput(
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.HiddenInput {
-            buildInputAttrs(disabled, autocomplete = AutoComplete.off, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun MonthInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.MonthInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun NumberInput(
-        value: Number?,
-        autocomplete: AutoComplete = AutoComplete.off,
-        min: Number? = null,
-        max: Number? = null,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<Number?>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<Number?, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        NumberInput(value, min, max) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun PasswordInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.PasswordInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun SearchInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.SearchInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun TelInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrsBuilder: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.TelInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrsBuilder, onInput)
-        }
-    }
-
-    @Composable
-    public fun TextInput(
-        value: String,
-        placeholder: String? = null,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.TextInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrs, onInput)
-            placeholder?.let {
-                placeholder(it)
-            }
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun TextAreaInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLTextAreaElement>? = null,
-        onInput: (SyntheticInputEvent<String, HTMLTextAreaElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        TextArea(attrs = {
-            classes(BSClasses.formControl)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-            autoComplete(autocomplete)
-            id(inputId)
-            if (disabled) {
-                disabled()
-            }
-            attrs?.invoke(this)
-            onInput { event ->
-                onInput(event)
-            }
-        }, value = value)
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun TimeInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.TimeInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrs, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun UrlInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.UrlInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrs, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun WeekInput(
-        value: String,
-        autocomplete: AutoComplete = AutoComplete.off,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: (InputAttrsScope<String>.() -> Unit)? = null,
-        onInput: (SyntheticInputEvent<String, HTMLInputElement>) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.WeekInput(value) {
-            buildInputAttrs(disabled, autocomplete, classes, attrs, onInput)
-        }
-    }
-
-    @Composable
-    @NonRestartableComposable
-    public fun SelectInput(
-        disabled: Boolean,
-        autocomplete: AutoComplete = AutoComplete.off,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLSelectElement>? = null,
-        onChange: (List<String>) -> Unit,
-        content: @Composable SelectContext.() -> Unit,
-    ) {
-        Style
-        Select(
-            disabled = disabled,
-            id = inputId,
-            autocomplete = autocomplete,
-            styling = styling,
-            attrs = attrs,
-            onChange = onChange,
-            content = content
-        )
-    }
-
-    /**
-     * Implements the Input group add on as text in a Span element.
-     */
-    @Composable
-    public fun TextAddOn(
-        text: String,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLSpanElement>? = null,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        Span(attrs = {
-            classes(BSClasses.inputGroupText)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-            attrs?.invoke(this)
-        }) {
-            Text(text)
-        }
-    }
-
-    /**
-     * Implements the Input group add on as text in a Label element. The label element's forId is set equal to the
-     * Input's id. An example of this usage is in the Custom select Bootstrap documentation
-     * at https://getbootstrap.com/docs/5.0/forms/input-group/#custom-select.
-     */
-    @Composable
-    public fun LabelAddOn(
-        text: String,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLLabelElement>? = null,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        Label(attrs = {
-            classes(BSClasses.inputGroupText)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-            forId(inputId)
-            attrs?.invoke(this)
-        }) {
-            Text(text)
-        }
-    }
-
-    @Composable
-    public fun ButtonAddOn(
-        title: String,
-        color: Color = Color.Primary,
-        type: ButtonType = ButtonType.Submit,
-        size: ButtonSize = ButtonSize.Default,
-        disabled: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLButtonElement>? = null,
-        action: () -> Unit,
-    ) {
-        Style
-        Button(title, color, size, false, type, disabled, styling, attrs, action)
-    }
-
-    @Composable
-    public fun DropDownAddOn(
-        title: String,
-        color: Color = Color.Primary,
-        size: ButtonSize = ButtonSize.Default,
-        styling: (Styling.() -> Unit)? = null,
-        block: @Composable DropDownBuilder.() -> Unit,
-    ) {
-        Style
-        DropDown(title, inputId, size, color, styling, block = block)
-    }
-
-    @Composable
-    public fun CheckboxAddOn(
-        checked: Boolean,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLDivElement>? = null,
-        onClick: (Boolean) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        Div(attrs = {
-            classes(BSClasses.inputGroupText)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-            attrs?.invoke(this)
-        }) {
-            CheckboxInput(checked, attrs = {
-                onInput { event ->
-                    onClick(event.value)
-                }
-                classes(BSClasses.formCheckInput, "mt-0")
-            })
-        }
-    }
-
-    @Composable
-    public fun RadioAddOn(
-        checked: Boolean,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLDivElement>? = null,
-        onClick: (Boolean) -> Unit,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        Div(attrs = {
-            classes(BSClasses.inputGroupText)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-            attrs?.invoke(this)
-        }) {
-            RadioInput(checked, attrs = {
-                onInput { event ->
-                    onClick(event.value)
-                }
-                classes(BSClasses.formCheckInput, "mt-0")
-            })
-        }
-    }
-}
-
-public enum class InputGroupSize {
-    Small,
-    Default,
-    Large
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/ListGroup.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/ListGroup.kt
deleted file mode 100644
index bdeff31d..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/ListGroup.kt
+++ /dev/null
@@ -1,182 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.attributes.AttrsScope
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.*
-
-@Composable
-public fun ListGroup(
-    flush: Boolean = false,
-    listGroupDirection: ListGroupDirection = ListGroupDirection.Vertical,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLUListElement>? = null,
-    content: ContentBuilder<HTMLUListElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Ul(
-        attrs = {
-            ListGroupAttrs(flush, false, listGroupDirection, attrs)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-        },
-        content = content
-    )
-}
-
-@Composable
-public fun NumberedListGroup(
-    flush: Boolean = false,
-    listGroupDirection: ListGroupDirection = ListGroupDirection.Vertical,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLOListElement>? = null,
-    content: ContentBuilder<HTMLOListElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Ol(
-        attrs = {
-            ListGroupAttrs(flush, true, listGroupDirection, attrs)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-        },
-        content = content
-    )
-}
-
-private fun <T : HTMLElement> AttrsScope<T>.ListGroupAttrs(
-    flush: Boolean = false,
-    numbered: Boolean = false,
-    listGroupDirection: ListGroupDirection = ListGroupDirection.Vertical,
-    attrs: AttrBuilderContext<T>? = null,
-) {
-    classes(BSClasses.listGroup)
-    if (flush) {
-        classes(BSClasses.listGroupFlush)
-    }
-    if (numbered) {
-        classes(BSClasses.listGroupNumbered)
-    }
-
-    if (listGroupDirection is ListGroupDirection.Horizontal) {
-        classes(listGroupDirection.classname())
-    }
-    attrs?.invoke(this)
-}
-
-@Composable
-public fun ListItem(
-    active: Boolean = false,
-    disabled: Boolean = false,
-    background: Color? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLLIElement>? = null,
-    content: ContentBuilder<HTMLLIElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Li(attrs = {
-        ListItemAttrs(active, disabled, false, background, attrs)
-        if (classes != null) {
-            classes(classes = classes)
-        }
-    }, content = content)
-}
-
-@Composable
-public fun AnchorListItem(
-    href: String? = null,
-    active: Boolean = false,
-    disabled: Boolean = false,
-    background: Color? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLAnchorElement>? = null,
-    content: ContentBuilder<HTMLAnchorElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    A(
-        href = href,
-        attrs = {
-            ListItemAttrs(active, disabled, true, background, attrs)
-            if (classes != null) {
-                classes(classes = classes)
-            }
-        },
-        content = content
-    )
-}
-
-@Composable
-public fun ButtonListItem(
-    active: Boolean = false,
-    disabled: Boolean = false,
-    background: Color? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLButtonElement>? = null,
-    content: ContentBuilder<HTMLButtonElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Button(attrs = {
-        ListItemAttrs(active, disabled, true, background, attrs)
-        if (classes != null) {
-            classes(classes = classes)
-        }
-    }, content = content)
-}
-
-private fun <T : HTMLElement> AttrsScope<T>.ListItemAttrs(
-    active: Boolean = false,
-    disabled: Boolean = false,
-    actionable: Boolean = false,
-    background: Color? = null,
-    attrs: AttrBuilderContext<T>? = null,
-) {
-    classes(BSClasses.listGroupItem)
-    if (active) {
-        classes(BSClasses.active)
-        attr("aria-current", "true")
-    }
-    if (disabled) {
-        classes(BSClasses.disabled)
-        attr("aria-disabled", "true")
-    }
-    if (actionable) {
-        classes(BSClasses.listGroupItemAction)
-    }
-    background?.let {
-        classes("${BSClasses.listGroupItem}-$it")
-    }
-    attrs?.invoke(this)
-}
-
-/**
- * Specifies a ListGroup's direction, and optionally for the Horizontal variant a breakpoint.
- */
-public sealed class ListGroupDirection {
-    public object Vertical : ListGroupDirection()
-    public data class Horizontal(val breakpoint: Breakpoint? = null) : ListGroupDirection() {
-        internal fun classname(): String {
-            return "${BSClasses.listGroupHorizontal}${breakpoint?.let { "-$it" } ?: ""}"
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Modal.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Modal.kt
deleted file mode 100644
index 7f009ff7..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Modal.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Modal(
-    header: String,
-    size: Breakpoint? = null,
-    scrollable: Boolean = false,
-    id: String = uuid4().toString(),
-    styling: (Styling.() -> Unit)? = null,
-    onDismissRequest: () -> Unit,
-    footer: ContentBuilder<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>,
-) {
-    Style
-    needsJS
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Div({
-        classes("modal")
-        id("_$id")
-        tabIndex(-1)
-        attr("aria-labelledby", "label$id")
-        attr("aria-hidden", "true")
-        attr("data-bs-backdrop", "static")
-        attr("data-bs-keyboard", "false")
-    }) {
-        DisposableEffect(true) {
-            val htmlDivElement: HTMLDivElement = scopeElement
-            val bsModal = Modal(htmlDivElement)
-            htmlDivElement.addEventListener("hidePrevented.bs.modal", callback = { _ ->
-                onDismissRequest()
-            })
-            bsModal.show()
-            onDispose {
-                bsModal.hide()
-                bsModal.dispose()
-            }
-        }
-
-        Div({
-            classes("modal-dialog")
-            if (size != null) {
-                classes("modal-$size")
-            }
-            if (scrollable) {
-                classes("modal-dialog-scrollable")
-            }
-        }) {
-            Div({
-                classes("modal-content")
-                if (classes != null) {
-                    classes(classes = classes)
-                }
-            }) {
-                Div({ classes("modal-header") }) {
-                    H5({
-                        classes("modal-title")
-                        id("label$id")
-                    }) {
-                        Text(header)
-                    }
-                    Button({
-                        classes("btn-close")
-                        // attr("data-bs-dismiss", "modal")
-                        attr("aria-label", "Close")
-                        onClick {
-                            onDismissRequest()
-                        }
-                    })
-                }
-                Div({ classes("modal-body") }, content)
-                Div({ classes("modal-footer") }, footer)
-            }
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Navbar.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Navbar.kt
deleted file mode 100644
index 190f6454..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Navbar.kt
+++ /dev/null
@@ -1,221 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.*
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.*
-
-/**
- * Bootstrap Navbar component. This version provides more flexibility than the alternative but is more complex
- * to use. For a simpler implementation use the version that takes a brand and navItems as parameters.
- *
- * @param collapseBehavior Specifies the Navbar's Responsive behavior with use of the .navbar-expand class.
- * @param fluid Specifies if the inner container is fluid (container-fluid) or not.
- * @param placement Specifies the placement of the navbar
- * @param containerBreakpoint Breakpoint for the inner container.
- * @param colorScheme Valid values are Color.Light or Color.Dark to set the navbar-dark/light class.
- * @param backgroundColor Background color to use, with the bg-* classes.
- * @param content Navbar content, placed within the inner container.
- */
-@Composable
-public fun Navbar(
-    collapseBehavior: NavbarCollapseBehavior = NavbarCollapseBehavior.Always,
-    fluid: Boolean = false,
-    placement: NavbarPlacement = NavbarPlacement.Default,
-    containerBreakpoint: Breakpoint? = null,
-    colorScheme: Color = Color.Light,
-    backgroundColor: Color = Color.Primary,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLElement>? = null,
-    content: ContentBuilder<HTMLDivElement>? = null,
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Nav(attrs = {
-        classes(
-            BSClasses.navbar,
-            "navbar-$colorScheme",
-            "bg-$backgroundColor"
-        )
-        when (placement) {
-            NavbarPlacement.Default -> {
-            }
-
-            else -> {
-                classes(placement.toString())
-            }
-        }
-
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        when (collapseBehavior) {
-            is NavbarCollapseBehavior.Never -> classes("navbar-expand")
-            is NavbarCollapseBehavior.AtBreakpoint -> classes("navbar-expand-${collapseBehavior.breakpoint}")
-            is NavbarCollapseBehavior.Always -> {
-            } // No class needed for "Always" behavior
-        }
-        attr("role", "navigation")
-        attrs?.invoke(this)
-    }) {
-        Container(fluid, containerBreakpoint, content = content)
-    }
-}
-
-/**
- * Bootstrap Navbar component that can optionally enable a Toggler and Brand.
- *
- * @param collapseBehavior Specifies the Navbar's Responsive behavior with use of the .navbar-expand class.
- * @param fluid Specifies if the inner container is fluid (container-fluid) or not.
- * @param stickyTop if true, shows the navbar at top
- * @param containerBreakpoint Breakpoint for the inner container.
- * @param colorScheme Valid values are Color.Light or Color.Dark to set the navbar-dark/light class.
- * @param backgroundColor Background color to use, with the bg-* classes.
- * @param toggler Whether a toggler button should be provided when falling below the breakpoint.
- * @param togglerPosition Specifies if the toggler should be placed on the left or right side of the Navbar.
- * @param togglerAttrs Additional attributes to set on the toggler button
- * @param togglerTargetId Optional id of the toggler, using a random UUID by default
- * @param attrs Additional attributes to set on the Navbar
- * @param navAttrs Additional attributes to set on the navItems section of the Navbar
- * @param brand Composable implementing the brand elements
- * @param navItems navigation items, normally comprised of NavbarLink and NavbarDropDown menu items.
- */
-@Composable
-public fun Navbar(
-    collapseBehavior: NavbarCollapseBehavior = NavbarCollapseBehavior.Always,
-    fluid: Boolean = false,
-    placement: NavbarPlacement = NavbarPlacement.Default,
-    containerBreakpoint: Breakpoint? = null,
-    colorScheme: Color = Color.Light,
-    backgroundColor: Color = Color.Primary,
-    toggler: Boolean = true,
-    togglerPosition: TogglerPosition = TogglerPosition.Right,
-    togglerTargetId: String = remember { "toggler${uuid4()}" },
-    togglerAttrs: AttrBuilderContext<HTMLButtonElement>? = null,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLElement>? = null,
-    navAttrs: AttrBuilderContext<HTMLDivElement>? = null,
-    additionalNavContent: ContentBuilder<HTMLDivElement>? = null,
-    brand: ContentBuilder<HTMLDivElement>,
-    navItems: ContentBuilder<HTMLDivElement>,
-) {
-    Navbar(
-        collapseBehavior,
-        fluid,
-        placement,
-        containerBreakpoint,
-        colorScheme,
-        backgroundColor,
-        styling,
-        attrs
-    ) {
-        if (togglerPosition == TogglerPosition.Right) {
-            brand()
-        }
-
-        if (toggler) {
-            Toggler(
-                target = togglerTargetId,
-                controls = togglerTargetId,
-                styling = styling,
-                attrs = togglerAttrs
-            )
-            NavbarCollapse(togglerTargetId) {
-                NavbarNav(attrs = { navAttrs?.invoke(this) }) {
-                    navItems()
-                }
-                if (additionalNavContent != null) {
-                    additionalNavContent()
-                }
-            }
-        } else {
-            NavbarNav(attrs = { navAttrs?.invoke(this) }) {
-                navItems()
-            }
-            if (additionalNavContent != null) {
-                additionalNavContent()
-            }
-        }
-
-        if (togglerPosition == TogglerPosition.Left) {
-            brand()
-        }
-    }
-}
-
-/**
- * Bootstrap navbar-collapse component to be used with the NavbarToggler.
- * @param id The element id. This value should also be used as the target parameter with a NavbarToggler.
- */
-@Composable
-public fun NavbarCollapse(
-    id: String,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>? = null,
-) {
-    Style
-    Div(attrs = {
-        classes(BSClasses.collapse, BSClasses.navbarCollapse)
-        id(id)
-        attrs?.invoke(this)
-    }, content = content)
-}
-
-/**
- * Bootstrap navbar-nav component to be used within a Navbar.
- */
-@Composable
-public fun NavbarNav(
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    links: ContentBuilder<HTMLDivElement>? = null,
-) {
-    Style
-    Div(attrs = {
-        classes(BSClasses.navbarNav)
-        attrs?.invoke(this)
-    }, content = links)
-}
-
-/**
- * Bootstrap nav-link component.
- */
-@Composable
-public fun NavbarLink(
-    active: Boolean,
-    attrs: AttrBuilderContext<HTMLAnchorElement>? = null,
-    disabled: Boolean = false,
-    link: String? = null,
-    content: ContentBuilder<HTMLAnchorElement>? = null,
-) {
-    Style
-    A(attrs = {
-        classes(BSClasses.navLink)
-        if (active) {
-            classes(BSClasses.active)
-            attr("aria-current", "page")
-        }
-        if (disabled) {
-            classes(BSClasses.disabled)
-        }
-        attrs?.invoke(this)
-    }, href = link, content = content)
-}
-
-public enum class TogglerPosition {
-    Left, Right
-}
-
-public sealed class NavbarCollapseBehavior {
-    public object Never : NavbarCollapseBehavior()
-    public object Always : NavbarCollapseBehavior()
-    public data class AtBreakpoint(val breakpoint: Breakpoint) : NavbarCollapseBehavior()
-}
-
-public enum class NavbarPlacement(private val prefix: String) {
-    Default(""), FixedTop("fixed-top"), FixedBottom("fixed-bottom"), StickyTop("sticky-top");
-
-    override fun toString(): String = prefix
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/OffCanvas.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/OffCanvas.kt
deleted file mode 100644
index 68de4df2..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/OffCanvas.kt
+++ /dev/null
@@ -1,137 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.*
-import org.jetbrains.compose.web.attributes.ButtonType
-import org.jetbrains.compose.web.attributes.type
-import org.jetbrains.compose.web.dom.Button
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-/**
- * State for [Offcanvas] composable component. Provides functions to call
- * into Bootstrap's Javascript to show/hide the Offcanvas element.
- *
- * @param confirmStateChange Optional callback invoked to signal a state change.
- */
-public class OffcanvasState(public val confirmStateChange: (Boolean) -> Unit = {}) {
-    internal var bsOffcanvas: Offcanvas? = null
-    private var _visible by mutableStateOf(false)
-
-    /**
-     * The current visibility state.
-     */
-    public val visible: Boolean
-        get() {
-            return _visible
-        }
-
-    /**
-     * Shows the Offcanvas component.
-     */
-    public fun show() {
-        _visible = true
-        confirmStateChange(_visible)
-        bsOffcanvas?.apply { show() }
-    }
-
-    /**
-     * Hides the Offcanvas component.
-     */
-    public fun hide() {
-        _visible = false
-        confirmStateChange(_visible)
-        bsOffcanvas?.apply { hide() }
-    }
-}
-
-/**
- * Creates an Offcanvas component.
- *
- * @param placement The location for the Offcanvas component.
- * @param offcanvasState Control for showing/hiding the Offcanvas component.
- * @param headerContent Composable to render content for the header. A close button will always
- * be provided on the right.
- * @param showHeaderCloseButton If true the default Bootstrap close button will be shown on the right side of the
- * header. If false, the user should provide their own control for closing the Offcanvas component.
- * @param bodyContent Composable to render content for the body of the Offcanvas component.
- */
-@Composable
-public fun Offcanvas(
-    placement: OffcanvasPlacement,
-    breakpoint: Breakpoint? = null,
-    offcanvasState: OffcanvasState = remember { OffcanvasState() },
-    headerContent: ContentBuilder<HTMLDivElement>? = null,
-    showHeaderCloseButton: Boolean = true,
-    bodyContent: ContentBuilder<HTMLDivElement>? = null
-) {
-    Style
-    needsJS
-    Div(attrs = {
-        if (breakpoint == null) {
-            classes("offcanvas")
-        } else {
-            classes("offcanvas-$breakpoint")
-        }
-        classes(placement.toString())
-        tabIndex(-1)
-    }) {
-        DisposableEffect(true) {
-            val htmlDivElement = scopeElement
-            offcanvasState.bsOffcanvas = Offcanvas(htmlDivElement)
-
-            // synchronize state with the offcanvas visibility
-            htmlDivElement.addEventListener("hidden.bs.offcanvas", callback = {
-                offcanvasState.hide()
-            })
-            htmlDivElement.addEventListener("shown.bs.offcanvas", callback = {
-                offcanvasState.show()
-            })
-
-            // Set initial state
-            offcanvasState.bsOffcanvas?.apply {
-                if (offcanvasState.visible) {
-                    show()
-                } else {
-                    hide()
-                }
-            }
-
-            onDispose {
-                offcanvasState.bsOffcanvas?.hide()
-                offcanvasState.bsOffcanvas = null
-            }
-        }
-
-        Div(attrs = {
-            classes("offcanvas-header")
-        }) {
-            headerContent?.invoke(this)
-            if (showHeaderCloseButton) {
-                Button(attrs = {
-                    type(ButtonType.Button)
-                    classes("btn-close", "text-reset")
-                    attr("aria-label", "Close")
-                    onClick {
-                        offcanvasState.bsOffcanvas?.hide()
-                    }
-                })
-            }
-        }
-        Div(attrs = { classes("offcanvas-body") }, content = bodyContent)
-    }
-}
-
-/**
- * Used to specify the location of the Offcanvas component.
- */
-public enum class OffcanvasPlacement(private val value: String) {
-    START("start"),
-    END("end"),
-    TOP("top"),
-    BOTTOM("bottom");
-
-    public override fun toString(): String {
-        return "offcanvas-$value"
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Pagination.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Pagination.kt
deleted file mode 100644
index 97d4c2bc..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Pagination.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.HTMLLIElement
-import org.w3c.dom.HTMLUListElement
-
-@Composable
-public fun Pagination(
-    size: PaginationSize = PaginationSize.Normal,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLUListElement>? = null,
-    content: @Composable PaginationScope.() -> Unit
-) {
-    Style
-    val style = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Ul(attrs = {
-        classes("pagination")
-        classes(size.toString())
-        if (style != null) {
-            classes(classes = style)
-        }
-        attrs?.invoke(this)
-    }) {
-        PaginationScope().content()
-    }
-}
-
-public enum class PaginationSize(private val classes: String) {
-    Normal(""), Small("pagination-sm"), Large("pagination-lg");
-
-    override fun toString(): String = classes
-}
-
-public class PaginationScope {
-    @Composable
-    public fun PageItem(active: Boolean = false, disabled: Boolean = false, content: ContentBuilder<HTMLLIElement>) {
-        Style
-        Li(attrs = {
-            classes("page-item")
-            if (active) {
-                classes(BSClasses.active)
-            }
-            if (disabled) {
-                classes(BSClasses.disabled)
-            }
-        }) {
-            content()
-        }
-    }
-
-    @Composable
-    public fun PageLink(title: String, onClick: () -> Unit) {
-        Style
-        A(attrs = {
-            classes("page-link")
-            onClick {
-                onClick()
-            }
-        }) {
-            Text(title)
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/README.md b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/README.md
deleted file mode 100644
index fac81254..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This implementation is based on https://github.com/hfhbd/bootstrap-compose, which is distributed under Apache 2.0 license.
\ No newline at end of file
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Radio.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Radio.kt
deleted file mode 100644
index 423211bd..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Radio.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.InputType
-import org.jetbrains.compose.web.attributes.disabled
-import org.jetbrains.compose.web.attributes.forId
-import org.jetbrains.compose.web.attributes.name
-import org.jetbrains.compose.web.dom.Div
-import org.jetbrains.compose.web.dom.Input
-import org.jetbrains.compose.web.dom.Label
-import org.jetbrains.compose.web.dom.Text
-
-@Composable
-public fun RadioGroup(content: @Composable RadioGroupScope.() -> Unit) {
-    val groupName = remember { "_${uuid4()}" }
-    val context = RadioGroupScope(groupName)
-    context.content()
-}
-
-public class RadioGroupScope(private val name: String) {
-    @Composable
-    public fun Radio(
-        label: String,
-        checked: Boolean = false,
-        disabled: Boolean = false,
-        inline: Boolean = false,
-        styling: (Styling.() -> Unit)? = null,
-        onClick: (Boolean) -> Unit,
-    ) {
-        val id = remember { "_${uuid4()}" }
-
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        Div(attrs = {
-            classes(BSClasses.formCheck)
-            if (inline) {
-                classes(BSClasses.formCheckInline)
-            }
-            if (classes != null) {
-                classes(classes = classes)
-            }
-        }) {
-            Input(attrs = {
-                classes(BSClasses.formCheckInput)
-                id(id)
-                checked(checked)
-
-                onInput { event ->
-                    onClick(event.value)
-                }
-                if (disabled) {
-                    disabled()
-                }
-                name(name)
-            }, type = InputType.Radio)
-            Label(attrs = {
-                classes(BSClasses.formCheckLabel)
-                forId(id)
-            }) {
-                Text(label)
-            }
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Range.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Range.kt
deleted file mode 100644
index b0173227..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Range.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.disabled
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.RangeInput
-import org.jetbrains.compose.web.events.SyntheticInputEvent
-import org.w3c.dom.HTMLInputElement
-
-@Composable
-public fun Range(
-    value: Number,
-    min: Number? = null,
-    max: Number? = null,
-    step: Number = 1,
-    disabled: Boolean = false,
-    id: String = remember { "_${uuid4()}" },
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLInputElement>? = null,
-    onInput: (SyntheticInputEvent<Number?, HTMLInputElement>) -> Unit,
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    RangeInput(value, min, max, step) {
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        onInput {
-            onInput(it)
-        }
-        if (disabled) {
-            disabled()
-        }
-        id(id)
-        classes(BSClasses.formRange)
-        attrs?.invoke(this)
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Row.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Row.kt
deleted file mode 100644
index f2f8b7d1..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Row.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.w3c.dom.HTMLDivElement
-
-@Composable
-public fun Row(
-    styling: (@Composable RowStyling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLDivElement>? = null,
-    content: ContentBuilder<HTMLDivElement>
-) {
-    Style
-    val classes = styling?.let {
-        RowStyling(it).generate()
-    }
-
-    Div(attrs = {
-        classes("row")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attrs?.invoke(this)
-    }, content = content)
-}
-
-@Composable
-public fun RowStyling(styling: @Composable RowStyling.() -> Unit): RowStyling = RowStyling().apply { styling() }
-
-public class RowStyling : Styling() {
-    public val Gutters: Gutters = Gutters()
-
-    @Composable
-    override fun generate(): List<String> {
-        return super.generate() + Gutters.generate()
-    }
-}
-
-public class Gutters {
-    public operator fun invoke(f: Gutters.() -> Unit) {
-        this.f()
-    }
-
-    @Composable
-    internal fun generate(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-
-        _spec?.let {
-            classes += it.generateClassStrings()
-        }
-
-        return classes
-    }
-
-    public enum class GutterSize(private val value: String) {
-        None("0"),
-        ExtraSmall("1"),
-        Small("2"),
-        Medium("3"),
-        Large("4"),
-        ExtraLarge("5");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Direction(private val value: String) {
-        Horizontal("x"),
-        Vertical("y"),
-        HorizontalAndVertical("");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public class GutterSpec(private val direction: Direction) {
-        public var size: GutterSize = GutterSize.Small
-        public var breakpoint: Breakpoint? = null
-
-        internal fun generateClassStrings(): String {
-            return "g$direction-" + (breakpoint?.let { "$it-" } ?: "") + size.toString()
-        }
-    }
-
-    private var _spec: GutterSpec? = null
-
-    public operator fun Direction.invoke(spec: GutterSpec.() -> Unit) {
-        _spec = GutterSpec(this).apply(spec)
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Select.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Select.kt
deleted file mode 100644
index 658fe65e..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Select.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.*
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Select
-import org.w3c.dom.HTMLOptionElement
-import org.w3c.dom.HTMLSelectElement
-
-@Composable
-public fun Select(
-    multiple: Boolean = false,
-    size: SelectSize = SelectSize.Default,
-    rows: Int? = null,
-    disabled: Boolean = false,
-    autocomplete: AutoComplete = AutoComplete.off,
-    id: String = remember { "_${uuid4()}" },
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLSelectElement>? = null,
-    onChange: (List<String>) -> Unit,
-    content: @Composable SelectContext.() -> Unit,
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-
-    Select(attrs = {
-        id(id)
-        classes(BSClasses.formSelect)
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        if (multiple) {
-            multiple()
-        }
-        when (size) {
-            SelectSize.Small -> classes(BSClasses.formSelectSmall)
-            SelectSize.Large -> classes(BSClasses.formSelectLarge)
-            else -> {
-            }
-        }
-        rows?.let {
-            size(it)
-        }
-        if (disabled) {
-            disabled()
-        }
-        autoComplete(autocomplete)
-        attrs?.invoke(this)
-        onChange { event ->
-            val selectElement = event.nativeEvent.target as HTMLSelectElement
-            val options = selectElement.selectedOptions
-            val results: MutableList<String> = mutableListOf()
-            for (i in 0..options.length) {
-                options.item(i)?.let {
-                    results += (it as HTMLOptionElement).value
-                }
-            }
-            onChange(results)
-        }
-    }) {
-        val scope = SelectContext()
-        scope.content()
-    }
-}
-
-public class SelectContext {
-    @Composable
-    public fun Option(
-        value: String,
-        selected: Boolean? = null,
-        styling: (Styling.() -> Unit)? = null,
-        attrs: AttrBuilderContext<HTMLOptionElement>? = null,
-        content: ContentBuilder<HTMLOptionElement>? = null,
-    ) {
-        Style
-        val classes = styling?.let {
-            Styling().apply(it).generate()
-        }
-
-        org.jetbrains.compose.web.dom.Option(
-            value = value,
-            attrs = {
-                if (selected == true) {
-                    selected()
-                }
-                if (classes != null) {
-                    classes(classes = classes)
-                }
-                attrs?.invoke(this)
-            },
-            content = content
-        )
-    }
-}
-
-public enum class SelectSize {
-    Small,
-    Default,
-    Large
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Styling.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Styling.kt
deleted file mode 100644
index 24bf55a1..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Styling.kt
+++ /dev/null
@@ -1,557 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-
-@DslMarker
-public annotation class StylingMarker
-
-/**
- * Primary entrypoint for the Styling DSL. Component authors may create a subclass to add additional styling
- * capabilities to their component, including the dynamic generation of classes by using Compose-web style sheet
- * builders.
- */
-@StylingMarker
-public open class Styling {
-    private val generators: MutableList<@Composable () -> List<String>> = mutableListOf()
-    public val Margins: SpacingSpecs = SpacingSpecs("m")
-    public val Padding: SpacingSpecs = SpacingSpecs("p")
-    public val Borders: BorderSpec = BorderSpec()
-    public val Background: Background = Background()
-    public val Text: Text = Text()
-    public val Layout: Layout = Layout()
-
-    /**
-     * This function will generate a list of css class names that should be applied to a component in order
-     * to implement the styling features specified by the dsl. Subclasses should invoke this method and add
-     * any additional class names to the returned list. This method is Composable so additional style tags can
-     * be composed if new css class definitions are required.
-     *
-     * @return An array of css class names that are to be applied to the target component.
-     */
-    @Composable
-    public open fun generate(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-        for (gen in generators) {
-            classes += gen()
-        }
-
-        classes += Margins.generateClassStrings() +
-            Padding.generateClassStrings() +
-            Borders.generateClassStrings() +
-            Background.generateClassStrings() +
-            Text.generateClassStrings() +
-            Layout.generateClassStrings()
-
-        return classes
-    }
-
-    /**
-     * Register a styling generator. The provided function is a Composable that may create new styles and classes,
-     * and returns an array of classnames that are to be applied to the target component.
-     */
-    public fun registerGenerator(block: @Composable () -> List<String>) {
-        generators += block
-    }
-}
-
-@Composable
-public fun Styling(styling: @Composable Styling.() -> Unit): Styling = Styling().apply { styling() }
-
-@StylingMarker
-public class SpacingSpecs(private val property: String) {
-    public operator fun invoke(f: SpacingSpecs.() -> Unit) {
-        this.f()
-    }
-
-    public enum class Sides(private val value: String) {
-        All(""),
-        Top("t"),
-        Bottom("b"),
-        Start("s"),
-        End("e"),
-        Vertical("y"),
-        Horizontal("x");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class SpacingSize(private val value: String) {
-        None("0"),
-        ExtraSmall("1"),
-        Small("2"),
-        Medium("3"),
-        Large("4"),
-        ExtraLarge("5"),
-        Auto("auto");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public class SideSpec(private val sides: List<Sides>) {
-        public var size: SpacingSize = SpacingSize.Small
-        public var breakpoint: Breakpoint? = null
-
-        internal fun generateClassStrings(property: String): List<String> {
-            return sides.map { side ->
-                "$property$side-" + (breakpoint?.let { "$it-" } ?: "") + "$size"
-            }
-        }
-    }
-
-    private val _specs: MutableList<SideSpec> = mutableListOf()
-
-    public operator fun Sides.plus(side: Sides): List<Sides> {
-        return listOf(this, side)
-    }
-
-    public operator fun Sides.invoke(spec: SideSpec.() -> Unit) {
-        _specs += SideSpec(listOf(this)).apply(spec)
-    }
-
-    public operator fun List<Sides>.invoke(spec: SideSpec.() -> Unit) {
-        _specs += SideSpec(this).apply(spec)
-    }
-
-    internal fun generateClassStrings(): List<String> {
-        return _specs.flatMap { spec ->
-            spec.generateClassStrings(property)
-        }
-    }
-
-    public val All: Sides = Sides.All
-    public val Top: Sides = Sides.Top
-    public val Bottom: Sides = Sides.Bottom
-    public val Start: Sides = Sides.Start
-    public val End: Sides = Sides.End
-    public val Vertical: Sides = Sides.Vertical
-    public val Horizontal: Sides = Sides.Horizontal
-}
-
-@StylingMarker
-public class BorderSpec {
-    public operator fun invoke(f: BorderSpec.() -> Unit) {
-        this.f()
-    }
-
-    public enum class Sides(private val value: String) {
-        All("border"),
-        Top("border-top"),
-        End("border-end"),
-        Bottom("border-bottom"),
-        Start("border-start");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class BorderWidth(private val value: String) {
-        Thinner("border-1"),
-        Thin("border-2"),
-        Medium("border-3"),
-        Thick("border-4"),
-        Thicker("border-5");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public val All: Sides = Sides.All
-    public val Top: Sides = Sides.Top
-    public val End: Sides = Sides.End
-    public val Bottom: Sides = Sides.Bottom
-    public val Start: Sides = Sides.Start
-
-    public operator fun Sides.plus(side: Sides): List<Sides> {
-        return listOf(this, side)
-    }
-
-    public class SideSpec(private val sides: List<Sides>) {
-        public var width: BorderWidth? = null
-        public var color: Color? = null
-
-        internal fun generateClassString(): List<String> {
-            val classList: MutableList<String> = mutableListOf()
-            sides.map {
-                classList += it.toString()
-            }
-
-            return classList
-        }
-    }
-
-    public enum class BorderRadius(private val value: String) {
-        All("rounded"),
-        Top("rounded-top"),
-        End("rounded-end"),
-        Bottom("rounded-bottom"),
-        Start("rounded-start"),
-        Circle("rounded-circle"),
-        Pill("rounded-pill");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class RadiusSize(private val value: String) {
-        Small("rounded-1"),
-        Medium("rounded-2"),
-        Large("rounded-3");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    private var sideSpecs: SideSpec? = null
-
-    public operator fun Sides.invoke(spec: SideSpec.() -> Unit) {
-        sideSpecs = SideSpec(listOf(this)).apply(spec)
-    }
-
-    public operator fun List<Sides>.invoke(spec: SideSpec.() -> Unit) {
-        sideSpecs = SideSpec(this).apply(spec)
-    }
-
-    private var radiusType: BorderRadius? = null
-    private var radiusSize: RadiusSize? = null
-
-    public fun radius(type: BorderRadius, size: RadiusSize? = null) {
-        radiusType = type
-        radiusSize = size
-    }
-
-    internal fun generateClassStrings(): List<String> {
-        val classList: MutableList<String> = mutableListOf()
-
-        sideSpecs?.let { sideSpecs ->
-            classList += sideSpecs.generateClassString()
-
-            sideSpecs.color?.let { color ->
-                classList += "border-$color"
-            }
-
-            sideSpecs.width?.let { width ->
-                classList += width.toString()
-            }
-        }
-
-        classList += listOfNotNull(radiusType, radiusSize).map {
-            it.toString()
-        }
-
-        return classList
-    }
-}
-
-@StylingMarker
-public class Background {
-    public var color: Color? = null
-    public var gradient: Boolean = false
-
-    public operator fun invoke(f: Background.() -> Unit) {
-        this.f()
-    }
-
-    internal fun generateClassStrings(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-
-        color?.let { color ->
-            classes += color.background()
-            if (gradient) {
-                classes += "bg-gradient"
-            }
-        }
-
-        return classes
-    }
-}
-
-@StylingMarker
-public class Text {
-    public var color: Color? = null
-    private val alignments: MutableList<AlignSpec> = mutableListOf()
-    public var wrap: Wraps? = null
-    public var wordBreak: Boolean = false
-    public var transform: Transform? = null
-    public var size: Int? = null
-    public var weight: Weight? = null
-    public var style: Style? = null
-    public var lineHeight: LineHeight? = null
-    public var monospace: Boolean = false
-    public var reset: Boolean = false
-    public var muted: Boolean = false
-    public var decoration: Decoration? = null
-
-    public operator fun invoke(f: Text.() -> Unit) {
-        this.f()
-    }
-
-    public enum class Alignment(private val value: String) {
-        Start("start"),
-        Center("center"),
-        End("end");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Wraps(private val value: String) {
-        Wrap("text-wrap"),
-        NoWrap("text-nowrap"),
-        Truncate("text-truncate");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Transform(private val value: String) {
-        Lowercase("text-lowercase"),
-        Uppercase("text-uppercase"),
-        Capitalized("text-capitalize");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Weight(private val value: String) {
-        Bold("fw-bold"),
-        Bolder("fw-bolder"),
-        Normal("fw-normal"),
-        Light("fw-light"),
-        Lighter("fw-lighter");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Style(private val value: String) {
-        Italic("fst-italic"),
-        Normal("fst-normal");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class LineHeight(private val value: String) {
-        Smallest("lh-1"),
-        Small("lh-sm"),
-        Base("lh-base"),
-        Large("lh-large");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Decoration(private val value: String) {
-        Underline("text-decoration-underline"),
-        LineThrough("text-decoration-line-through"),
-        None("text-decoration-none");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public data class AlignSpec(private val alignment: Alignment, private var breakpoint: Breakpoint? = null) {
-        internal fun className(): String {
-            return breakpoint?.let {
-                "text-$it-$alignment"
-            } ?: "text-$alignment"
-        }
-    }
-
-    public fun align(alignment: Alignment, breakpoint: Breakpoint? = null) {
-        alignments += AlignSpec(alignment, breakpoint)
-    }
-
-    internal fun generateClassStrings(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-
-        color?.let { color ->
-            classes += color.text()
-        }
-
-        alignments.forEach { spec ->
-            classes += spec.className()
-        }
-
-        if (wordBreak) {
-            classes += "text-break"
-        }
-
-        size?.let {
-            classes += "fs-${it.coerceIn(1, 6)}"
-        }
-
-        if (monospace) {
-            classes += "font-monospace"
-        }
-
-        if (reset) {
-            classes += "text-reset"
-        }
-
-        if (muted) {
-            classes += "text-muted"
-        }
-
-        decoration?.let {
-            classes += it.toString()
-        }
-
-        classes += listOfNotNull(wrap, transform, weight, style, lineHeight).map {
-            it.toString()
-        }
-
-        return classes
-    }
-}
-
-@StylingMarker
-public class Layout {
-    private val displaySpecs: MutableList<DisplaySpec> = mutableListOf()
-    private val floatSpecs: MutableList<FloatSpec> = mutableListOf()
-    public var overflow: Overflow? = null
-    public var width: Width? = null
-    public var height: Height? = null
-    public var verticalAlignment: VerticalAlignment? = null
-    public var horizontalAlignment: HorizontalAlignment? = null
-    public var visible: Boolean? = null
-
-    public operator fun invoke(f: Layout.() -> Unit) {
-        this.f()
-    }
-
-    public enum class Display(private val value: String) {
-        None("none"),
-        Inline("inline"),
-        InlineBlock("inline-block"),
-        Block("block"),
-        Grid("grid"),
-        Flex("flex"),
-        InlineFlex("inline-flex");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Float(private val value: String) {
-        Start("start"),
-        End("end"),
-        None("none");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Overflow(private val value: String) {
-        Auto("overflow-auto"),
-        Hidden("overflow-hidden"),
-        Visible("overflow-visible"),
-        Scroll("overflow-scroll");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Width(private val value: String) {
-        Quarter("w-25"),
-        Half("w-50"),
-        ThreeQuarters("w-75"),
-        Full("w-100"),
-        Auto("w-auto"),
-        View("vw-100");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class Height(private val value: String) {
-        Quarter("h-25"),
-        Half("h-50"),
-        ThreeQuarters("h-75"),
-        Full("h-100"),
-        Auto("h-auto"),
-        View("vh-100");
-
-        override fun toString(): String {
-            return value
-        }
-    }
-
-    public enum class HorizontalAlignment(private val classInfix: String) {
-        Start("start"),
-        Center("center"),
-        End("end"),
-        Around("around"),
-        Between("between"),
-        Evenly("evenly");
-
-        override fun toString(): String = "justify-content-$classInfix"
-    }
-
-    public enum class VerticalAlignment(private val value: String) {
-        Baseline("align-baseline"),
-        Top("align-top"),
-        Middle("align-middle"),
-        Bottom("align-bottom"),
-        TextTop("align-text-top"),
-        TextBottom("align-text-bottom");
-
-        override fun toString(): String = value
-    }
-
-    private data class DisplaySpec(val display: Display, val breakpoint: Breakpoint?)
-    private data class FloatSpec(val float: Float, val breakpoint: Breakpoint?)
-
-    public fun display(display: Display, breakpoint: Breakpoint? = null) {
-        displaySpecs += DisplaySpec(display, breakpoint)
-    }
-
-    public fun float(float: Float, breakpoint: Breakpoint? = null) {
-        floatSpecs += FloatSpec(float, breakpoint)
-    }
-
-    internal fun generateClassStrings(): List<String> {
-        val classes: MutableList<String> = mutableListOf()
-
-        displaySpecs.forEach { displaySpec ->
-            classes += "d-" + (displaySpec.breakpoint?.let { "$it-" } ?: "") + "${displaySpec.display}"
-        }
-
-        floatSpecs.forEach { floatSpec ->
-            classes += "float-" + (floatSpec.breakpoint?.let { "$it-" } ?: "") + "${floatSpec.float}"
-        }
-
-        visible?.let { visible ->
-            classes += if (visible) {
-                "visible"
-            } else {
-                "invisible"
-            }
-        }
-
-        classes += listOfNotNull(overflow, width, height, verticalAlignment, horizontalAlignment).map {
-            it.toString()
-        }
-
-        return classes
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Table.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Table.kt
deleted file mode 100644
index d1d35c6c..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Table.kt
+++ /dev/null
@@ -1,438 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.*
-import org.jetbrains.compose.web.attributes.Scope
-import org.jetbrains.compose.web.attributes.scope
-import org.jetbrains.compose.web.css.CSSLengthOrPercentageValue
-import org.jetbrains.compose.web.css.StyleScope
-import org.jetbrains.compose.web.css.top
-import org.jetbrains.compose.web.dom.*
-import org.w3c.dom.HTMLDivElement
-import org.w3c.dom.HTMLTableCaptionElement
-import org.w3c.dom.HTMLTableCellElement
-import org.w3c.dom.HTMLTableElement
-import kotlin.math.max
-import kotlin.math.min
-
-public typealias CurrentPage<T> = Table.Pagination.Page<T>
-public typealias PageControl<T> = @Composable ElementScope<HTMLDivElement>.(
-    List<Table.Pagination.Page<T>>,
-    CurrentPage<T>,
-    (Int) -> Unit
-) -> Unit
-
-public object Table {
-    public data class Column(
-        val title: String,
-        val scope: Scope?,
-        val header: Header,
-        val cell: Cell,
-        val footer: Footer?
-    )
-
-    public class Cell internal constructor(
-        public val color: Color? = null,
-        public val scope: Scope?,
-        public val verticalAlignment: Layout.VerticalAlignment?,
-        public val content: ContentBuilder<HTMLTableCellElement>
-    )
-
-    public class Footer internal constructor(
-        public val color: Color? = null,
-        public val content: @Composable ElementScope<HTMLTableCellElement>.(List<Cell>) -> Unit
-    )
-
-    public data class Header(
-        val attrs: AttrBuilderContext<HTMLTableCellElement>? = null,
-        var content: ContentBuilder<HTMLTableCellElement>? = null
-    ) {
-        public constructor(
-            color: Color,
-        ) : this(attrs = { classes("table-$color") })
-
-        public constructor(
-            color: Color,
-            content: ContentBuilder<HTMLTableCellElement>? = null
-        ) : this(attrs = { classes("table-$color") }, content)
-    }
-
-    public data class Row(val cells: List<Cell>, public val key: Any?, val color: Color? = null)
-
-    public class Builder internal constructor() {
-
-        private val values = mutableListOf<Column>()
-
-        public var rowColor: Color? = null
-
-        internal fun build(): Pair<List<Column>, Color?> = values to rowColor
-
-        public fun column(
-            title: String,
-            scope: Scope? = null,
-            header: Header? = null,
-            footer: Footer? = null,
-            cellColor: Color? = null,
-            verticalAlignment: Layout.VerticalAlignment? = null,
-            cell: ContentBuilder<HTMLTableCellElement>
-        ) {
-            val titledHeader = when {
-                header != null && header.content == null -> {
-                    header.content = { Text(title) }
-                    header
-                }
-                header == null -> {
-                    Header(attrs = null) { Text(title) }
-                }
-                else -> header
-            }
-
-            values.add(
-                Column(
-                    title = title,
-                    scope = scope,
-                    header = titledHeader,
-                    footer = footer,
-                    cell = Cell(cellColor, scope, verticalAlignment, cell)
-                )
-            )
-        }
-    }
-
-    public class FixedHeaderProperty(public val style: StyleScope.() -> Unit) {
-        public constructor(topSize: CSSLengthOrPercentageValue, zIndex: String) : this({
-            top(topSize)
-            property("z-index", zIndex)
-        })
-    }
-
-    public interface Pagination<T> {
-        public enum class Position {
-            Top, Bottom
-        }
-
-        public val position: Position?
-        public val pages: State<List<Page<T>>>
-
-        public val numberOfButtons: Int
-        public val entriesPerPageLimit: State<Int>?
-        public val actionNavigateBack: ((CurrentPage<T>, Page<T>) -> Unit)?
-        public val actionNavigateForward: ((CurrentPage<T>, Page<T>) -> Unit)?
-
-        public val startPageIndex: Int
-
-        public data class Page<T>(val index: Int, val items: List<T>, val numberOfPages: Int)
-
-        public val control: PageControl<T>
-
-        public fun defaultControl(): PageControl<T> = { pages, currentPage, goTo ->
-            Column {
-                Pagination(size = PaginationSize.Small) {
-                    PageItem(disabled = currentPage.index == 0) {
-                        PageLink("<") {
-                            val previousIndex = currentPage.index - 1
-                            actionNavigateBack?.invoke(currentPage, pages[previousIndex])
-                            goTo(previousIndex)
-                        }
-                    }
-
-                    val buttons = tableCalcButtons(
-                        index = currentPage.index,
-                        pages = pages.size,
-                        numberOfButtons = numberOfButtons
-                    )
-
-                    for (index in buttons) {
-                        if (index == currentPage.index) {
-                            PageItem(active = true, disabled = false) {
-                                PageLink("${index + 1}") { }
-                            }
-                        } else {
-                            PageItem {
-                                PageLink("${index + 1}") {
-                                    if (index < currentPage.index) {
-                                        actionNavigateBack?.invoke(currentPage, pages[index])
-                                        goTo(index)
-                                    } else {
-                                        actionNavigateForward?.invoke(currentPage, pages[index])
-                                        goTo(index)
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    PageItem(disabled = currentPage.index == pages.lastIndex) {
-                        PageLink(">") {
-                            val nextIndex = currentPage.index + 1
-                            actionNavigateForward?.invoke(currentPage, pages[nextIndex])
-                            goTo(nextIndex)
-                        }
-                    }
-                }
-            }
-            if (entriesPerPageLimit is MutableState<Int>) {
-                val initLimit = remember { entriesPerPageLimit!!.value }
-                Column(styling = {
-                    Margins {
-                        End {
-                            size = SpacingSpecs.SpacingSize.Auto
-                        }
-                    }
-                }, auto = true) {
-                    DropDown("# ${entriesPerPageLimit!!.value}", size = ButtonSize.Small) {
-                        List(4) {
-                            initLimit * (it + 1)
-                        }.forEach {
-                            this.Button("$it") {
-                                (entriesPerPageLimit as MutableState<Int>).value = it
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    public class OffsetPagination<T>(
-        data: List<T>,
-        public override val entriesPerPageLimit: State<Int>?,
-        public override val startPageIndex: Int = 0,
-        public override val position: Pagination.Position? = Pagination.Position.Bottom,
-        public override val numberOfButtons: Int = 5,
-        public override val actionNavigateBack: ((CurrentPage<T>, Pagination.Page<T>) -> Unit)? = null,
-        public override val actionNavigateForward: ((CurrentPage<T>, Pagination.Page<T>) -> Unit)? = null,
-    ) : Pagination<T> {
-
-        override val pages: State<List<Pagination.Page<T>>> =
-            data.chunked(entriesPerPageLimit?.value ?: data.size).let {
-                mutableStateOf(
-                    it.mapIndexed { index, data ->
-                        Pagination.Page(index, data, it.size)
-                    }
-                )
-            }
-
-        override var control: PageControl<T> = defaultControl()
-
-        public constructor(
-            data: List<T>,
-            entriesPerPageLimit: State<Int>,
-            startPageIndex: Int = 0,
-            position: Pagination.Position = Pagination.Position.Bottom,
-            numberOfButtons: Int = 5,
-            actionNavigateBack: ((CurrentPage<T>, Pagination.Page<T>) -> Unit)? = null,
-            actionNavigateForward: ((CurrentPage<T>, Pagination.Page<T>) -> Unit)? = null,
-            control: PageControl<T>
-        ) : this(
-            data,
-            entriesPerPageLimit,
-            startPageIndex,
-            position,
-            numberOfButtons,
-            actionNavigateBack,
-            actionNavigateForward
-        ) {
-            this.control = control
-        }
-    }
-}
-
-internal fun tableCalcButtons(index: Int, pages: Int, numberOfButtons: Int): IntRange {
-    if (pages <= numberOfButtons) {
-        return 0 until pages
-    }
-    val nr = min(pages, numberOfButtons)
-    val max = pages - 1
-    return when (index) {
-        0 -> 0 until nr
-        (pages - 1) -> (max((pages - nr), 0)) until pages
-        else -> {
-            val half = nr / 2
-            val lower = max(index - half, 0)
-            val upper = (min(index + half, max))
-            if (lower == 0) {
-                0 until nr
-            } else if (upper == max) {
-                val newLower = pages - numberOfButtons
-                newLower until pages
-            } else {
-                lower..upper
-            }
-        }
-    }
-}
-
-@Composable
-@NonRestartableComposable
-public fun <T> Table(
-    data: List<T>,
-    key: ((T) -> Any)? = null,
-    color: Color? = null,
-    stripedRows: Boolean = false,
-    stripedColumns: Boolean = false,
-    hover: Boolean = false,
-    borderless: Boolean = false,
-    small: Boolean = false,
-    fixedHeader: Table.FixedHeaderProperty? = null,
-    caption: ContentBuilder<HTMLTableCaptionElement>? = null,
-    captionTop: Boolean = false,
-    attrs: AttrBuilderContext<HTMLTableElement>? = null,
-    map: Table.Builder.(Int, T) -> Unit
-) {
-    Table(
-        pagination = Table.OffsetPagination(data, null, position = null),
-        key,
-        color,
-        stripedRows = stripedRows,
-        stripedColumns = stripedColumns,
-        hover,
-        borderless,
-        small,
-        fixedHeader,
-        caption,
-        captionTop,
-        attrs,
-        map
-    )
-}
-
-@Composable
-public fun <T> Table(
-    pagination: Table.Pagination<T>,
-    key: ((T) -> Any)? = null,
-    color: Color? = null,
-    stripedRows: Boolean = false,
-    stripedColumns: Boolean = false,
-    hover: Boolean = false,
-    borderless: Boolean = false,
-    small: Boolean = false,
-    fixedHeader: Table.FixedHeaderProperty? = null,
-    caption: ContentBuilder<HTMLTableCaptionElement>? = null,
-    captionTop: Boolean = false,
-    attrs: AttrBuilderContext<HTMLTableElement>? = null,
-    map: Table.Builder.(Int, T) -> Unit
-) {
-    Style
-    val headers = mutableMapOf<String, Table.Header>()
-    val _footers = mutableListOf<Table.Footer>()
-
-    val pages by pagination.pages
-
-    var currentIndex by remember { mutableStateOf(pagination.startPageIndex) }
-    val currentPage = pages[min(currentIndex, pages.lastIndex)]
-    val baseIndex = currentPage.index * (pagination.entriesPerPageLimit?.value ?: 0)
-
-    val rows = currentPage.items.mapIndexed { itemIndexOfPage, item ->
-        val (columns, rowColor) = Table.Builder().apply {
-            val index = baseIndex + itemIndexOfPage
-            map(index, item)
-        }.build()
-        val cells = columns.map {
-            headers[it.title] = it.header
-            if (it.footer != null) {
-                _footers.add(it.footer)
-            }
-            it.cell
-        }
-        Table.Row(color = rowColor, cells = cells, key = key?.invoke(item))
-    }
-    check(rows.all { it.cells.size == headers.size })
-    val footers = _footers.takeUnless { it.isEmpty() }
-    if (footers != null) {
-        check(rows.all { it.cells.size == footers.size })
-    }
-
-    if (pagination.position == Table.Pagination.Position.Top) {
-        Row {
-            val control = pagination.control
-            control(pages, currentPage) {
-                currentIndex = it
-            }
-        }
-    }
-
-    Table(attrs = {
-        classes("table")
-        if (captionTop) {
-            classes("caption-top")
-        }
-        if (small) {
-            classes("table-sm")
-        }
-        color?.let { classes("table-$it") }
-        if (hover) {
-            classes("table-hover")
-        }
-        if (stripedRows) {
-            classes("table-striped")
-        }
-        if (stripedColumns) {
-            classes("table-striped-columns")
-        }
-        if (borderless) {
-            classes("table-borderless")
-        }
-        attrs?.invoke(this)
-    }) {
-        if (caption != null) {
-            Caption(content = caption)
-        }
-        Thead {
-            Tr {
-                headers.forEach { (_, header) ->
-                    Th(attrs = {
-                        scope(Scope.Col)
-                        header.attrs?.invoke(this)
-                        if (fixedHeader != null) {
-                            classes("sticky-top")
-                            style {
-                                fixedHeader.style(this)
-                            }
-                        }
-                    }) {
-                        header.content?.invoke(this)
-                    }
-                }
-            }
-        }
-        Tbody {
-            for (row in rows) {
-                key(row.key) {
-                    Tr(attrs = {
-                        row.color?.let { classes("table-$it") }
-                    }) {
-                        for (cell in row.cells) {
-                            Td(attrs = {
-                                cell.color?.let { classes("table-$it") }
-                                cell.scope?.let { scope(it) }
-                                cell.verticalAlignment?.let { classes(it.toString()) }
-                            }) {
-                                cell.content(this)
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        if (footers != null) {
-            Tfoot {
-                Tr {
-                    footers.forEachIndexed { index, cell ->
-                        Td(attrs = {
-                            cell.color?.let { classes("table-$it") }
-                        }) {
-                            cell.content(this, rows[index].cells)
-                        }
-                    }
-                }
-            }
-        }
-    }
-    if (pagination.position == Table.Pagination.Position.Bottom) {
-        Row {
-            val control = pagination.control
-            control(pages, currentPage) {
-                currentIndex = it
-            }
-        }
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Toasts.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Toasts.kt
deleted file mode 100644
index ef320208..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Toasts.kt
+++ /dev/null
@@ -1,184 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.key
-import androidx.compose.runtime.mutableStateListOf
-import com.benasher44.uuid.Uuid
-import com.benasher44.uuid.uuid4
-import org.jetbrains.compose.web.attributes.AttrsScope
-import org.jetbrains.compose.web.attributes.ButtonType
-import org.jetbrains.compose.web.attributes.type
-import org.jetbrains.compose.web.dom.Button
-import org.jetbrains.compose.web.dom.ContentBuilder
-import org.jetbrains.compose.web.dom.Div
-import org.jetbrains.compose.web.dom.Text
-import org.w3c.dom.HTMLButtonElement
-import org.w3c.dom.HTMLDivElement
-import kotlin.time.Duration
-import kotlin.time.Duration.Companion.seconds
-
-@Composable
-public fun ToastContainer(
-    toastContainerState: ToastContainerState,
-    attrs: (AttrsScope<HTMLDivElement>.() -> Unit)? = null,
-) {
-    Div(attrs = {
-        classes("toast-container")
-        attrs?.invoke(this)
-    }) {
-        toastContainerState.toasts.forEach { toastItem ->
-            key(toastItem) {
-                Toast(toastItem)
-            }
-        }
-    }
-}
-
-@Composable
-private fun Toast(message: ToastContainerState.ToastItem) {
-    Style
-    needsJS
-    Div(
-        attrs = {
-            classes("toast")
-            attr("role", "alert")
-            attr("data-bs-delay", message.delay.inWholeMilliseconds.toString())
-            attr("aria-live", "assertive")
-            attr("aria-atomic", "true")
-            message.toastAttrs?.invoke(this)
-        }
-    ) {
-        DisposableEffect(message) {
-            val htmlDivElement = scopeElement
-            val bsToast = Toast(htmlDivElement)
-            htmlDivElement.addEventListener("shown.bs.toast", callback = {
-            })
-            htmlDivElement.addEventListener("hidden.bs.toast", callback = {
-                message.remove()
-            })
-            bsToast.show()
-            onDispose {
-                bsToast.dispose()
-                message.remove()
-                htmlDivElement.removeEventListener("shown.bs.toast", callback = {
-                })
-                htmlDivElement.removeEventListener("hidden.bs.toast", callback = {
-                    message.remove()
-                })
-            }
-        }
-        message.header?.let { header ->
-            Div(attrs = {
-                classes("toast-header")
-            }) {
-                header()
-                if (message.withDismissButton) {
-                    DismissButton(attrs = message.dismissButtonAttrs)
-                }
-            }
-        }
-
-        if (message.header == null && message.withDismissButton) {
-            Div(attrs = { classes("d-flex") }) {
-                Div(attrs = { classes("toast-body") }, content = message.body)
-                DismissButton(styling = {
-                    Margins {
-                        End {
-                            size = SpacingSpecs.SpacingSize.Small
-                        }
-                        All {
-                            size = SpacingSpecs.SpacingSize.Auto
-                        }
-                    }
-                }) {
-                    message.dismissButtonAttrs?.invoke(this)
-                }
-            }
-        } else {
-            Div(attrs = { classes("toast-body") }, content = message.body)
-        }
-    }
-}
-
-@Composable
-private fun DismissButton(
-    styling: (Styling.() -> Unit)? = null,
-    attrs: (AttrsScope<HTMLButtonElement>.() -> Unit)? = null,
-) {
-    val style = styling?.let {
-        Styling().apply(it).generate()
-    }
-    Button(attrs = {
-        type(ButtonType.Button)
-        classes("btn-close")
-        attr("data-bs-dismiss", "toast")
-        attr("aria-label", "close")
-        if (style != null) {
-            classes(classes = style)
-        }
-        attrs?.invoke(this)
-    })
-}
-
-public class ToastContainerState {
-    internal val toasts = mutableStateListOf<ToastItem>()
-
-    public fun showToast(toastMessage: String) {
-        showToast(body = {
-            Text(toastMessage)
-        })
-    }
-
-    /**
-     * Shows a new Toast.
-     * @param header Composable to generate the header content
-     * @param body Composable to generate the body content
-     * @param withDismissButton Set to True to show a default dismiss button icon, and false to not.
-     * You can also choose to include your own dismiss button in the [header] or [body] content
-     * instead of in addition to the default.
-     *
-     * @return A function the caller can invoke to dismiss the toast, for example, if you provide your own
-     * dismiss button in the header or body.
-     */
-    public fun showToast(
-        withDismissButton: Boolean = true,
-        delay: Duration = 5.seconds,
-        toastAttrs: (AttrsScope<HTMLDivElement>.() -> Unit)? = null,
-        dismissButtonAttrs: (AttrsScope<HTMLButtonElement>.() -> Unit)? = null,
-        header: ContentBuilder<HTMLDivElement>? = null,
-        body: ContentBuilder<HTMLDivElement>,
-    ): () -> Unit {
-        val uuid = uuid4()
-        val toastItem = ToastItem(
-            uuid,
-            delay = delay,
-            withDismissButton,
-            toastAttrs,
-            dismissButtonAttrs,
-            header = header,
-            body = body
-        ) {
-            removeToast(uuid)
-        }
-        toasts.add(toastItem)
-        return { removeToast(uuid) }
-    }
-
-    private fun removeToast(uuid: Uuid) {
-        toasts.removeAll {
-            it.uuid == uuid
-        }
-    }
-
-    internal data class ToastItem(
-        val uuid: Uuid,
-        val delay: Duration,
-        val withDismissButton: Boolean,
-        val toastAttrs: (AttrsScope<HTMLDivElement>.() -> Unit)?,
-        val dismissButtonAttrs: (AttrsScope<HTMLButtonElement>.() -> Unit)?,
-        val header: ContentBuilder<HTMLDivElement>?,
-        val body: ContentBuilder<HTMLDivElement>?,
-        val remove: () -> Unit,
-    )
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Toggler.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Toggler.kt
deleted file mode 100644
index dbbfb0b0..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/Toggler.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package bootstrap
-
-import androidx.compose.runtime.Composable
-import org.jetbrains.compose.web.dom.AttrBuilderContext
-import org.jetbrains.compose.web.dom.Button
-import org.jetbrains.compose.web.dom.Span
-import org.w3c.dom.HTMLButtonElement
-
-@Composable
-public fun Toggler(
-    target: String,
-    controls: String,
-    styling: (Styling.() -> Unit)? = null,
-    attrs: AttrBuilderContext<HTMLButtonElement>? = null
-) {
-    Style
-    val classes = styling?.let {
-        Styling().apply(it).generate()
-    }
-    Button(attrs = {
-        classes("navbar-toggler")
-        if (classes != null) {
-            classes(classes = classes)
-        }
-        attr("data-bs-toggle", "collapse")
-        attr("data-bs-target", "#$target")
-        attr("aria-controls", controls)
-        attr("aria-expanded", "false")
-        attr("aria-label", "Toggle navigation")
-        attrs?.invoke(this)
-    }) {
-        Span(attrs = { classes("navbar-toggler-icon") })
-    }
-}
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/bootstrap.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/bootstrap.kt
deleted file mode 100644
index 4f329be8..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/bootstrap.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-@file:JsModule("bootstrap")
-@file:JsNonModule
-
-package bootstrap
-
-import org.w3c.dom.HTMLDivElement
-
-internal external class Modal(element: HTMLDivElement) {
-    internal fun show()
-    internal fun hide()
-    internal fun dispose()
-}
-
-internal external class Toast(element: HTMLDivElement) {
-    internal fun show()
-    internal fun dispose()
-}
-
-internal external class Offcanvas(element: HTMLDivElement) {
-    internal fun show()
-    internal fun hide()
-}
-
-internal external val needsJS: dynamic
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/popper.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/popper.kt
deleted file mode 100644
index 27c6c937..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/popper.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-@file:JsModule("@popperjs/core")
-@file:JsNonModule
-
-package bootstrap
-
-internal external val needsPopper: dynamic
diff --git a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/scss.kt b/visionforge-compose-html/src/jsMain/kotlin/bootstrap/scss.kt
deleted file mode 100644
index bd661ef6..00000000
--- a/visionforge-compose-html/src/jsMain/kotlin/bootstrap/scss.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package bootstrap
-
-@JsModule("bootstrap/scss/bootstrap.scss")
-@JsNonModule
-internal external val Style: dynamic
diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt
index 0c9b537b..36504cf4 100644
--- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt
+++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt
@@ -1,9 +1,9 @@
 package space.kscience.visionforge.html
 
 import androidx.compose.runtime.*
-import bootstrap.Card
-import bootstrap.NavbarLink
-import bootstrap.Styling
+import app.softwork.bootstrapcompose.Card
+import app.softwork.bootstrapcompose.NavbarLink
+import app.softwork.bootstrapcompose.Styling
 import org.jetbrains.compose.web.css.overflowY
 import org.jetbrains.compose.web.dom.*
 import org.w3c.dom.HTMLAnchorElement
diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt
index 9c8b6c8c..69679f89 100644
--- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt
+++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt
@@ -14,14 +14,16 @@ import space.kscience.dataforge.context.request
 import space.kscience.dataforge.meta.Meta
 import space.kscience.dataforge.names.Name
 import space.kscience.dataforge.names.asName
-import space.kscience.visionforge.*
+import space.kscience.visionforge.Vision
+import space.kscience.visionforge.VisionClient
+import space.kscience.visionforge.setAsRoot
 
 
 /**
  * Render an Element vision via injected vision renderer inside compose-html
  */
 @Composable
-public fun Vision(
+public fun VisionDiv(
     context: Context,
     vision: Vision,
     name: Name = "@vision[${vision.hashCode().toString(16)}]".asName(),
diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt
index 96e1ac37..28b87d93 100644
--- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt
+++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt
@@ -3,7 +3,6 @@
 package space.kscience.visionforge.html
 
 import androidx.compose.runtime.*
-import com.benasher44.uuid.uuid4
 import org.jetbrains.compose.web.attributes.*
 import org.jetbrains.compose.web.dom.*
 import org.w3c.dom.HTMLOptionElement
@@ -12,6 +11,7 @@ import space.kscience.dataforge.meta.*
 import space.kscience.dataforge.meta.descriptors.MetaDescriptor
 import space.kscience.dataforge.meta.descriptors.allowedValues
 import space.kscience.visionforge.Colors
+import space.kscience.visionforge.Vision
 import space.kscience.visionforge.widgetType
 
 
@@ -44,7 +44,7 @@ public fun BooleanValueChooser(
     value: Value?,
     onValueChange: (Value?) -> Unit,
 ) {
-    val uid = remember { "checkbox[${uuid4()}]" }
+    val uid = remember { "checkbox[${Vision.randomId()}]" }
     var innerValue by remember(value, descriptor) {
         mutableStateOf(
             value?.boolean ?: descriptor?.defaultValue?.boolean
@@ -167,7 +167,7 @@ public fun MultiSelectChooser(
     onValueChange: (Value?) -> Unit,
 ) {
     Select({
-        classes("w-100","form-select")
+        classes("w-100", "form-select")
         onChange { event ->
             val newSelected = event.target.selectedOptions.asList()
                 .map { (it as HTMLOptionElement).value.asValue() }
diff --git a/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt b/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt
index cbd14d9e..32484dd5 100644
--- a/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt
+++ b/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt
@@ -42,7 +42,7 @@ public class ComposeVisionClient : AbstractPlugin(), VisionClient {
     private val mutex = Mutex()
 
 
-    private val rootChangeCollector = VisionChangeBuilder()
+    private val rootChangeCollector = VisionChangeCollector()
 
     /**
      * Communicate vision property changed from rendering engine to model
diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts
index 9794810a..885ef474 100644
--- a/visionforge-core/build.gradle.kts
+++ b/visionforge-core/build.gradle.kts
@@ -12,7 +12,7 @@ kscience {
     useCoroutines()
     commonMain {
         api("space.kscience:dataforge-context:$dataforgeVersion")
-        api("com.benasher44:uuid:0.8.4")
+        api(project.dependencies.platform(spclibs.ktor.bom))
         api(spclibs.kotlinx.html)
     }
     jsMain {
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt
index da07cf74..24ae7f5b 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt
@@ -39,8 +39,8 @@ public abstract class AbstractVision(
     }
 
     init {
-        properties.onChange(_eventFlow) {
-            emitEvent(VisionPropertyChangedEvent(this@AbstractVision, it))
+        properties.onChange(_eventFlow) { name ->
+            emitEvent(VisionPropertyChangedEvent(name, properties[name]))
         }
 
         _eventFlow.onCompletion {
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt
index 52a93141..afac03ea 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt
@@ -16,6 +16,8 @@ import space.kscience.dataforge.provider.Provider
 import space.kscience.visionforge.SimpleVisionGroup.Companion.updateProperties
 import space.kscience.visionforge.Vision.Companion.STYLESHEET_KEY
 import space.kscience.visionforge.Vision.Companion.TYPE
+import kotlin.uuid.ExperimentalUuidApi
+import kotlin.uuid.Uuid
 
 /**
  * A root type for display hierarchy
@@ -84,6 +86,9 @@ public interface Vision : Described, Provider {
         public const val STYLE_TARGET: String = "style"
 
         public val VISIBLE_KEY: Name = "visible".asName()
+
+        @OptIn(ExperimentalUuidApi::class)
+        public fun randomId(): String = Uuid.random().toHexString()
     }
 }
 
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt
index 5c696473..1ee48747 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt
@@ -45,94 +45,111 @@ private fun Vision.deepCopy(manager: VisionManager): Vision {
 }
 
 
-///**
-// * An event that contains changes made to a vision.
-// *
-// * @param vision a new value for vision content. If the Vision is to be removed should be [NullVision]
-// * @param properties updated properties
-// * @param children a map of children changed in ths [VisionChange].
-// */
+/**
+ * An event that contains changes made to a vision.
+ *
+ * @param vision a new value for vision content. If the Vision is to be removed should be [NullVision]
+ * @param properties updated properties
+ * @param children a map of children changed in ths [VisionChange].
+ */
+@Serializable
+@SerialName("change")
+public data class VisionChange(
+    public val vision: Vision? = null,
+    public val properties: Meta? = null,
+    public val children: Map<NameToken, VisionChange>? = null,
+) : VisionEvent
+
+public fun VisionChange.isEmpty(): Boolean = vision == null && properties == null && children == null
+
 //@Serializable
-//@SerialName("change")
-//public data class VisionChange(
-//    public val vision: Vision? = null,
-//    public val properties: Meta? = null,
-//    public val children: Map<NameToken, VisionChange>? = null,
-//) : VisionEvent
-
-@Serializable
-public sealed interface ChangeVisionEvent : VisionEvent
-
-@Serializable
-public data class SetVisionPropertiesEvent(val properties: Meta) : ChangeVisionEvent
-
-@Serializable
-public data class SetVisionChildEvent(val nameToken: NameToken, val vision: Vision?) : ChangeVisionEvent
+//public sealed interface ChangeVisionEvent : VisionEvent
+//
+//@Serializable
+//@SerialName("sepProperties")
+//public data class SetVisionPropertiesEvent(val properties: Meta) : ChangeVisionEvent
+//
+//@Serializable
+//@SerialName("setChild")
+//public data class SetVisionChildEvent(val nameToken: NameToken, val vision: Vision?) : ChangeVisionEvent
+//
+//@Serializable
+//@SerialName("setRoot")
+//public data class SetRootVisionEvent(val vision: Vision) : ChangeVisionEvent
 
 
 /**
  * An update for a [Vision]
  */
-public class VisionChangeBuilder : MutableVisionContainer<Vision> {
+public class VisionChangeCollector : MutableVisionContainer<Vision> {
 
     private var vision: Vision? = null
-    private var propertyChange = MutableMeta()
-    private val children: HashMap<NameToken, VisionChangeBuilder> = HashMap()
+    private var properties = MutableMeta()
+    private val children: HashMap<NameToken, VisionChangeCollector> = HashMap()
 
-    public operator fun get(name: NameToken): VisionChangeBuilder? = children[name]
+    public operator fun get(name: NameToken): VisionChangeCollector? = children[name]
 
-    public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty()
+    public fun isEmpty(): Boolean = properties.isEmpty() && properties.isEmpty() && children.isEmpty()
 
     @JvmSynchronized
-    public fun getOrCreateChange(token: NameToken): VisionChangeBuilder =
-        children.getOrPut(token) { VisionChangeBuilder() }
+    public fun getOrCreateChange(token: NameToken): VisionChangeCollector =
+        children.getOrPut(token) { VisionChangeCollector() }
 
     @JvmSynchronized
     internal fun reset() {
         vision = null
-        propertyChange = MutableMeta()
+        properties = MutableMeta()
         children.clear()
     }
 
+    @JvmSynchronized
     public fun propertyChanged(propertyName: Name, item: Meta?) {
         //Write property removal as [Null]
         if (propertyName.isEmpty()) {
-            propertyChange = item?.toMutableMeta() ?: MutableMeta()
+            properties = item?.toMutableMeta() ?: MutableMeta()
         } else {
-            propertyChange[propertyName] = (item ?: Meta(Null))
+            properties[propertyName] = (item ?: Meta(Null))
         }
     }
 
+    @JvmSynchronized
+    public fun updateProperties(newProperties: Meta) {
+        properties.update(newProperties)
+    }
+
     override fun setVision(token: NameToken, vision: Vision?) {
         getOrCreateChange(token).apply {
             this.vision = vision ?: NullVision
         }
     }
 
-
-//    private fun updateFrom(change: VisionChange) {
-//        change.vision?.let { this.vision = it }
-//        change.properties?.let { this.propertyChange.update(it) }
-//        change.children?.let { it.forEach { (key, change) -> getOrCreateChange(key).updateFrom(change) } }
-//    }
-
     public fun consumeEvent(event: VisionEvent): Unit = when (event) {
         //is VisionChange -> updateFrom(event)
-        is VisionEventCollection -> event.events.forEach { consumeEvent(it) }
+        is VisionEventPack -> event.events.forEach { consumeEvent(it) }
 
-        is VisionChildEvent -> TODO()
+        is VisionEventForChild -> getOrCreateChange(event.childName).consumeEvent(event.event)
 
-        is SetVisionChildEvent -> setVision(event.nameToken, event.vision)
+        is VisionChange -> {
+            event.properties?.let { properties.update(it) }
+            event.children?.forEach { (token, child) ->
+                getOrCreateChange(token).consumeEvent(child)
+            }
+            vision = event.vision
+        }
 
-        is SetVisionPropertiesEvent -> TODO()
+//        is SetVisionChildEvent -> setVision(event.nameToken, event.vision)
+//
+//        is SetVisionPropertiesEvent -> updateProperties(event.properties)
+//
+//        is SetRootVisionEvent -> vision = event.vision
 
         //listen to changed event
         is VisionPropertyChangedEvent -> propertyChanged(
             propertyName = event.propertyName,
-            item = event.source.properties[event.propertyName]
+            item = event.propertyValue
         )
 
-        is VisionGroupCompositionChangedEvent -> setVision(event.childName, event.source.getVision(event.childName))
+        is VisionGroupCompositionChangedEvent -> setVision(event.childName, event.childVision)
 
         is VisionControlEvent, is VisionMetaEvent -> {
             //do nothing
@@ -140,6 +157,12 @@ public class VisionChangeBuilder : MutableVisionContainer<Vision> {
         }
     }
 
+    public fun collect(visionManager: VisionManager): VisionChange = VisionChange(
+        vision = vision?.deepCopy(visionManager),
+        properties = properties,
+        children = children.mapValues { it.value.collect(visionManager) }
+    )
+
 //    private fun build(visionManager: VisionManager): VisionChange = VisionChange(
 //        vision,
 //        if (propertyChange.isEmpty()) null else propertyChange,
@@ -163,23 +186,23 @@ public class VisionChangeBuilder : MutableVisionContainer<Vision> {
 //    )
 }
 
-public operator fun VisionChangeBuilder.get(name: Name): VisionChangeBuilder? = when (name.length) {
+public operator fun VisionChangeCollector.get(name: Name): VisionChangeCollector? = when (name.length) {
     0 -> this
     1 -> get(name.first())
     else -> get(name.first())?.get(name.cutFirst())
 }
 
-public fun VisionChangeBuilder.getOrCreateChange(name: Name): VisionChangeBuilder = when (name.length) {
+public fun VisionChangeCollector.getOrCreateChange(name: Name): VisionChangeCollector = when (name.length) {
     0 -> this
     1 -> getOrCreateChange(name.first())
     else -> getOrCreateChange(name.first()).getOrCreateChange(name.cutFirst())
 }
 
-public inline fun VisionManager.VisionChange(block: VisionChangeBuilder.() -> Unit): VisionEvent =
-    VisionChangeBuilder().apply(block).deepCopy(this)
+public inline fun VisionManager.VisionChange(block: VisionChangeCollector.() -> Unit): VisionChange =
+    VisionChangeCollector().apply(block).collect(this)
 
 /**
- * Generate a flow of changes of this vision and its children
+ * Generate a flow of changes for this vision and its children
  *
  * @param sendInitial if true, send the initial vision state as first change
  */
@@ -189,7 +212,7 @@ public fun Vision.flowChanges(
 ): Flow<VisionEvent> = flow {
     val manager = manager ?: error("Orphan vision could not collect changes")
     coroutineScope {
-        val collector = VisionChangeBuilder()
+        val collector = VisionChangeCollector()
         val mutex = Mutex()
         eventFlow.onEach {
             collector.consumeEvent(it)
@@ -197,8 +220,8 @@ public fun Vision.flowChanges(
 
         if (sendInitial) {
             //Send initial vision state
-            val initialChange = VisionChange(vision = deepCopy(manager))
-            emit(initialChange)
+            val initialEvent = VisionChange(vision = deepCopy(manager))
+            emit(initialEvent)
         }
 
         while (true) {
@@ -208,7 +231,7 @@ public fun Vision.flowChanges(
             if (!collector.isEmpty()) {
                 mutex.withLock {
                     //emit changes
-                    emit(collector.deepCopy(manager))
+                    emit(collector.collect(manager))
                     //Reset the collector
                     collector.reset()
                 }
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt
index 60fb9132..14e222ee 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt
@@ -1,8 +1,9 @@
 package space.kscience.visionforge
 
-import com.benasher44.uuid.uuid4
 import space.kscience.dataforge.names.Name
 import space.kscience.dataforge.names.NameToken
+import kotlin.uuid.ExperimentalUuidApi
+import kotlin.uuid.Uuid
 
 @DslMarker
 public annotation class VisionBuilder
@@ -25,6 +26,7 @@ public interface MutableVisionContainer<in V : Vision> {
     public fun setVision(token: NameToken, vision: V?)
 
     public companion object {
-        public fun generateID(): NameToken = NameToken("@vision",uuid4().leastSignificantBits.toString(16))
+        @OptIn(ExperimentalUuidApi::class)
+        public fun generateID(): NameToken = NameToken("@vision", Uuid.random().toHexString())
     }
 }
\ No newline at end of file
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt
index a9bbafb0..85dc7a7b 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt
@@ -10,9 +10,10 @@ import space.kscience.dataforge.names.NameToken
 /**
  * An event propagated from client to a server or vise versa
  */
+@Serializable
 public sealed interface VisionEvent {
     public companion object {
-        public val CLICK_EVENT_KEY: Name get() = Name.of("events", "click", "payload")
+        //public val CLICK_EVENT_KEY: Name get() = Name.of("events", "click", "payload")
     }
 }
 
@@ -20,32 +21,37 @@ public sealed interface VisionEvent {
  * A list of [VisionEvent] that are delivered at the same time
  */
 @Serializable
-public class VisionEventCollection(public val events: List<VisionEvent>): VisionEvent
+@SerialName("pack")
+public class VisionEventPack(public val events: List<VisionEvent>) : VisionEvent
 
 /**
  * An event that should be forwarded to a [Vision] child
  */
 @Serializable
-public class VisionChildEvent(public val childName: Name, public val event: VisionEvent): VisionEvent
+@SerialName("forChild")
+public class VisionEventForChild(public val childName: Name, public val event: VisionEvent) : VisionEvent
 
 
-
-public sealed interface VisionChangedEvent: VisionEvent
+public sealed interface VisionChangedEvent : VisionEvent
 
 /**
  * An event that designates that property value is invalidated (not necessarily changed)
  */
+@Serializable
+@SerialName("propertyChanged")
 public data class VisionPropertyChangedEvent(
-    public val source: Vision,
-    public val propertyName: Name
-): VisionChangedEvent
+    public val propertyName: Name,
+    public val propertyValue: Meta?
+) : VisionChangedEvent
 
 /**
  * An event that indicates that [VisionGroup] composition is invalidated (not necessarily changed)
  */
+@Serializable
+@SerialName("compositionChanged")
 public data class VisionGroupCompositionChangedEvent(
-    public val source: VisionContainer<*>,
-    public val childName: NameToken
+    public val childName: NameToken,
+    public val childVision: Vision?
 ) : VisionChangedEvent
 
 /**
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt
index b00fa260..3584e269 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt
@@ -94,13 +94,18 @@ public interface MutableVisionGroup<V : Vision> : VisionGroup<V>, MutableVision,
  * A simple vision group that just holds children. Nothing else.
  */
 @Serializable
-@SerialName("vision.group")
+@SerialName("group")
 public class SimpleVisionGroup : AbstractVision(), MutableVisionGroup<Vision> {
 
     @Serializable
     @SerialName("children")
     private val _items = mutableMapOf<NameToken, Vision>()
 
+    // ensure proper children links after deserialization
+    init {
+        _items.forEach { it.value.parent = this }
+    }
+
     override val visions: Map<NameToken, Vision> get() = _items
 
     override fun convertVisionOrNull(vision: Vision): Vision = vision
@@ -112,7 +117,7 @@ public class SimpleVisionGroup : AbstractVision(), MutableVisionGroup<Vision> {
             _items[token] = vision
             vision.parent = this
         }
-        emitEvent(VisionGroupCompositionChangedEvent(this, token))
+        emitEvent(VisionGroupCompositionChangedEvent(token, vision))
     }
 
     public companion object {
diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt
index a20549d5..275f32d4 100644
--- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt
+++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt
@@ -95,10 +95,9 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), Vision {
             }
 
             polymorphic(VisionEvent::class) {
-                subclass(VisionEventCollection.serializer())
-                subclass(VisionChildEvent.serializer())
-                subclass(SetVisionPropertiesEvent.serializer())
-                subclass(SetVisionChildEvent.serializer())
+                subclass(VisionEventPack.serializer())
+                subclass(VisionEventForChild.serializer())
+                subclass(VisionChange.serializer())
                 subclass(VisionMetaEvent.serializer())
                 subclass(ControlSubmitEvent.serializer())
                 subclass(ControlValueChangeEvent.serializer())
@@ -115,7 +114,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), Vision {
             explicitNulls = false
         }
 
-        internal val visionSerializer: PolymorphicSerializer<Vision> = PolymorphicSerializer(Vision::class)
+        private val visionSerializer: PolymorphicSerializer<Vision> = PolymorphicSerializer(Vision::class)
     }
 }
 
diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt
index 1e00d529..86bcdfca 100644
--- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt
+++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt
@@ -1,77 +1,12 @@
 package space.kscience.visionforge.html
 
 import kotlinx.browser.document
-import kotlinx.coroutines.CoroutineScope
 import org.w3c.dom.Document
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.EmptyCoroutineContext
-
-
-public external val module: Module
-
-public external interface Hot {
-    public val data: dynamic
-
-    public fun accept()
-    public fun accept(dependency: String, callback: () -> Unit)
-    public fun accept(dependencies: Array<String>, callback: (updated: Array<String>) -> Unit)
-
-    public fun dispose(callback: (data: dynamic) -> Unit)
-}
-
-public external interface Module {
-    public val hot: Hot?
-}
-
-/**
- * Base interface for applications.
- *
- * Base interface for applications supporting Hot Module Replacement (HMR).
- */
-public interface Application: CoroutineScope {
-
-    override val coroutineContext: CoroutineContext get() = EmptyCoroutineContext
-
-    /**
-     * Starting point for an application.
-     * @param state Initial state between Hot Module Replacement (HMR).
-     */
-    public fun start(document: Document, state: Map<String, Any>)
-
-    /**
-     * Ending point for an application.
-     * @return final state for Hot Module Replacement (HMR).
-     */
-    public fun dispose(): Map<String, Any> = emptyMap()
-}
-
-public fun startApplication(builder: () -> Application) {
-    fun start(document: Document, state: dynamic): Application {
-        val application = builder()
-
-        @Suppress("UnsafeCastFromDynamic")
-        application.start(document, state?.appState ?: emptyMap())
-
-        return application
-    }
-
-    var application: Application? = null
-
-    val state: dynamic = module.hot?.let { hot ->
-        hot.accept()
-
-        hot.dispose { data ->
-            data.appState = application?.dispose()
-            application = null
-        }
-
-        hot.data
-    }
 
+public fun startApplication(start: (Document) -> Unit) {
     if (document.body != null) {
-        application = start(document, state)
+        start(document)
     } else {
-        application = null
-        document.addEventListener("DOMContentLoaded", { application = start(document, state) })
+        document.addEventListener("DOMContentLoaded", { start(document) })
     }
 }
\ No newline at end of file
diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt
index 7b9595c1..3dbb4982 100644
--- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt
+++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt
@@ -70,7 +70,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient {
     private val mutex = Mutex()
 
 
-    private val rootChangeCollector = VisionChangeBuilder()
+    private val rootChangeCollector = VisionChangeCollector()
 
     /**
      * Communicate vision property changed from rendering engine to model
@@ -153,7 +153,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient {
                             val visionChangeCollector = rootChangeCollector[visionName]
                             if (visionChangeCollector?.isEmpty() == false) {
                                 mutex.withLock {
-                                    eventCollector.emit(visionName to visionChangeCollector.deepCopy(visionManager))
+                                    eventCollector.emit(visionName to visionChangeCollector.collect(visionManager))
                                     rootChangeCollector.reset()
                                 }
                             }
@@ -323,24 +323,6 @@ public fun JsVisionClient.renderAllVisions(): Unit = whenDocumentLoaded {
     renderAllVisionsIn(element)
 }
 
-public class VisionClientApplication(public val context: Context) : Application {
-    private val client = context.request(JsVisionClient)
-
-    override fun start(document: Document, state: Map<String, Any>) {
-        context.logger.info {
-            "Starting VisionClient with renderers: ${
-                client.renderers.joinToString(
-                    prefix = "\n\t",
-                    separator = "\n\t"
-                ) { it.toString() }
-            }"
-        }
-        val element = document.body ?: error("Document does not have a body")
-        client.renderAllVisionsIn(element)
-    }
-}
-
-
 /**
  * Create a vision client context and render all visions on the page.
  */
@@ -352,7 +334,18 @@ public fun runVisionClient(contextBuilder: ContextBuilder.() -> Unit) {
         contextBuilder()
     }
 
+    val client = context.request(JsVisionClient)
+
     startApplication {
-        VisionClientApplication(context)
+        context.logger.info {
+            "Starting VisionClient with renderers: ${
+                client.renderers.joinToString(
+                    prefix = "\n\t",
+                    separator = "\n\t"
+                ) { it.toString() }
+            }"
+        }
+        val element = document.body ?: error("Document does not have a body")
+        client.renderAllVisionsIn(element)
     }
 }
\ No newline at end of file
diff --git a/visionforge-jupyter/build.gradle.kts b/visionforge-jupyter/build.gradle.kts
index 49943631..319199d7 100644
--- a/visionforge-jupyter/build.gradle.kts
+++ b/visionforge-jupyter/build.gradle.kts
@@ -5,7 +5,6 @@ plugins {
 description = "Common visionforge jupyter module"
 
 kscience {
-    useKtor()
     jvm()
     js()
     jupyterLibrary()
diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts
index 650b942a..ded38b3c 100644
--- a/visionforge-server/build.gradle.kts
+++ b/visionforge-server/build.gradle.kts
@@ -4,7 +4,6 @@ plugins {
 
 kscience{
     jvm()
-    useKtor()
     jvmMain {
         api(projects.visionforgeCore)
         api("io.ktor:ktor-server-host-common")
diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt
index 3cd01c23..ec5eb243 100644
--- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt
+++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidGroup.kt
@@ -38,9 +38,15 @@ public interface SolidContainer : VisionGroup<Solid>, Solid {
 @SerialName("group.solid")
 public class SolidGroup : AbstractVision(), SolidContainer, PrototypeHolder, MutableVisionGroup<Solid> {
 
-    private val _solids = LinkedHashMap<NameToken, Solid>()
+    private val solids = LinkedHashMap<NameToken, Solid>()
 
-    override val visions: Map<NameToken, Solid> get() = _solids
+    // ensure proper children links after deserialization
+    init {
+        solids.forEach { it.value.parent = this }
+    }
+
+
+    override val visions: Map<NameToken, Solid> get() = solids
 
     private var prototypes: SolidGroup? = null
 
@@ -56,7 +62,8 @@ public class SolidGroup : AbstractVision(), SolidContainer, PrototypeHolder, Mut
      * Get a prototype redirecting the request to the parent if prototype is not found.
      * If a prototype is a ref, then it is unfolded automatically.
      */
-    override fun getPrototype(name: Name): Solid? = prototypes?.getVision(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name)
+    override fun getPrototype(name: Name): Solid? =
+        prototypes?.getVision(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name)
 
     /**
      * Create or edit prototype node as a group
@@ -72,14 +79,14 @@ public class SolidGroup : AbstractVision(), SolidContainer, PrototypeHolder, Mut
 
     override fun setVision(token: NameToken, vision: Solid?) {
         if (vision == null) {
-            _solids.remove(token)?.let {
+            solids.remove(token)?.let {
                 it.parent = null
             }
         } else {
-            _solids[token] = vision
+            solids[token] = vision
             vision.parent = this
         }
-        emitEvent(VisionGroupCompositionChangedEvent(this, token))
+        emitEvent(VisionGroupCompositionChangedEvent(token, vision))
     }
 
     public companion object {
@@ -134,6 +141,8 @@ public operator fun SolidGroup.set(name: Name, vision: Solid?) {
     }
 }
 
+public operator fun SolidGroup.set(name: String, vision: Solid?) = set(name.parseAsName(), vision)
+
 /**
  * Add anonymous (auto-assigned name) child to a SolidGroup
  */
diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt
index fa9fd980..f5964563 100644
--- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt
+++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt
@@ -218,10 +218,9 @@ private class SolidReferenceChild(
         get() = owner.eventFlow.filterIsInstance<VisionPropertyChangedEvent>().filter {
             it.propertyName.startsWith(childToken)
         }.map {
-            VisionPropertyChangedEvent(this@SolidReferenceChild, it.propertyName.cutFirst())
+            VisionPropertyChangedEvent(it.propertyName.cutFirst(), it.propertyValue)
         }
 
-
     override val properties: MutableMeta = MutableMetaProxy(owner.properties, childToken.asName())
 
     override fun readProperty(
diff --git a/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt
index 9bf3b1f1..2d892e1b 100644
--- a/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt
+++ b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt
@@ -1,6 +1,6 @@
 @file:JsModule("tabulator-tables")
 @file:Suppress("NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING")
-@file:JsNonModule
+
 
 package tabulator
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt
index 4905f49f..fbfdb776 100644
--- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt
@@ -1,9 +1,12 @@
 package space.kscience.visionforge.solid.three.compose
 
 import androidx.compose.runtime.Composable
-import bootstrap.Button
-import bootstrap.Color
-import bootstrap.Column
+import app.softwork.bootstrapcompose.Button
+import app.softwork.bootstrapcompose.Color
+import app.softwork.bootstrapcompose.Column
+import app.softwork.bootstrapcompose.Layout
+import app.softwork.bootstrapcompose.Layout.Height
+import app.softwork.bootstrapcompose.Layout.Width
 import io.github.vinceglb.filekit.core.FileKit
 import kotlinx.coroutines.launch
 import org.jetbrains.compose.web.dom.Hr
@@ -23,7 +26,7 @@ internal fun CanvasControls(
 ) {
     Column {
         vision?.let { vision ->
-            Button("Export", color = Color.Info, styling = { Layout.width = bootstrap.Layout.Width.Full }) {
+            Button("Export", color = Color.Info, styling = { Layout.width = Width.Full }) {
                 val json = vision.encodeToString()
 
                 Global.launch {
@@ -62,7 +65,7 @@ public fun ThreeControls(
 ) {
     Tabs(
         styling = {
-            Layout.height = bootstrap.Layout.Height.Full
+            Layout.height = Height.Full
         }
     ) {
         vision?.let { vision ->
diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt
index ef7210cb..94d0b39b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt
@@ -1,9 +1,10 @@
 package space.kscience.visionforge.solid.three.compose
 
 import androidx.compose.runtime.*
-import bootstrap.Card
-import bootstrap.Column
-import bootstrap.Row
+import app.softwork.bootstrapcompose.Card
+import app.softwork.bootstrapcompose.Column
+import app.softwork.bootstrapcompose.Layout
+import app.softwork.bootstrapcompose.Row
 import kotlinx.coroutines.flow.filterIsInstance
 import kotlinx.coroutines.flow.map
 import kotlinx.dom.clear
@@ -84,15 +85,15 @@ public fun ThreeView(
         Row(
             styling = {
                 Layout {
-                    width = bootstrap.Layout.Width.Full
-                    height = bootstrap.Layout.Height.Full
+                    width = Layout.Width.Full
+                    height = Layout.Height.Full
                 }
             }
         ) {
             Column(
                 styling = {
                     Layout {
-                        height = bootstrap.Layout.Height.Full
+                        height = Layout.Height.Full
                     }
                 },
                 attrs = {
@@ -169,7 +170,7 @@ public fun ThreeView(
                 auto = true,
                 styling = {
                     Layout {
-                        height = bootstrap.Layout.Height.Full
+                        height = Layout.Height.Full
                     }
                 },
                 attrs = {
diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/csg.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/csg.kt
index ba4cd216..f99d31c8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/csg.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/csg.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three-csg-ts")
-@file:JsNonModule
+
 
 import three.core.BufferGeometry
 import three.math.Matrix4
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/THREE.kt b/visionforge-threejs/src/jsMain/kotlin/three/THREE.kt
index 4dca1f62..22f3e6e3 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/THREE.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/THREE.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 @file:Suppress("NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING", "unused")
 
 package three
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationAction.kt b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationAction.kt
index 185793ff..71a05141 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationAction.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationAction.kt
@@ -1,6 +1,6 @@
 @file:Suppress("NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING", "unused")
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.animation
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationClip.kt b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationClip.kt
index dfb1df5a..fe933f27 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationClip.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationClip.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.animation
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationMixer.kt b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationMixer.kt
index 45932e59..dfbce703 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationMixer.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationMixer.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.animation
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationUtils.kt b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationUtils.kt
index c0e05b3a..85ebd2f6 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationUtils.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/animation/AnimationUtils.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.animation
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/animation/KeyFrameTrack.kt b/visionforge-threejs/src/jsMain/kotlin/three/animation/KeyFrameTrack.kt
index 2f3f3436..2c4c0a55 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/animation/KeyFrameTrack.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/animation/KeyFrameTrack.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.animation
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/audio/Audio.kt b/visionforge-threejs/src/jsMain/kotlin/three/audio/Audio.kt
index 95918ede..bf3b5e86 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/audio/Audio.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/audio/Audio.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.audio
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioContext.kt b/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioContext.kt
index 3908a548..fd162b26 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioContext.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioContext.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.audio
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioListener.kt b/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioListener.kt
index cbdb06f1..be02d324 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioListener.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/audio/AudioListener.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.audio
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/audio/PositionalAudio.kt b/visionforge-threejs/src/jsMain/kotlin/three/audio/PositionalAudio.kt
index 7c1006f4..3c514d44 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/audio/PositionalAudio.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/audio/PositionalAudio.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.audio
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/cameras/Camera.kt b/visionforge-threejs/src/jsMain/kotlin/three/cameras/Camera.kt
index 5f1ba54f..9709cf9c 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/cameras/Camera.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/cameras/Camera.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.cameras
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/cameras/OrthographicCamera.kt b/visionforge-threejs/src/jsMain/kotlin/three/cameras/OrthographicCamera.kt
index 706c8746..3e57d010 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/cameras/OrthographicCamera.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/cameras/OrthographicCamera.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.cameras
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/cameras/PerspectiveCamera.kt b/visionforge-threejs/src/jsMain/kotlin/three/cameras/PerspectiveCamera.kt
index a5b12de8..ad0a31f0 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/cameras/PerspectiveCamera.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/cameras/PerspectiveCamera.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.cameras
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/BufferAttribute.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/BufferAttribute.kt
index e045b2d6..09c7ebb6 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/BufferAttribute.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/BufferAttribute.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/BufferGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/BufferGeometry.kt
index 5038aee7..3b7004f4 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/BufferGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/BufferGeometry.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/Clock.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/Clock.kt
index e5925f56..cb4b20d5 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/Clock.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/Clock.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/EventDispatcher.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/EventDispatcher.kt
index 1646775e..4d130e7a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/EventDispatcher.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/EventDispatcher.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/Face3.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/Face3.kt
index a7ec7f0b..2ca683ee 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/Face3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/Face3.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/InstancedBufferGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/InstancedBufferGeometry.kt
index 99c4df70..a447727e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/InstancedBufferGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/InstancedBufferGeometry.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/Layers.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/Layers.kt
index 6d29399c..2543a777 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/Layers.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/Layers.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/Object3D.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/Object3D.kt
index 86739f76..53a8e77e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/Object3D.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/Object3D.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 
 package three.core
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/Raycaster.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/Raycaster.kt
index e03844f6..35359ba0 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/Raycaster.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/Raycaster.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/core/Uniform.kt b/visionforge-threejs/src/jsMain/kotlin/three/core/Uniform.kt
index a2bef114..7e7d5ca2 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/core/Uniform.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/core/Uniform.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/Detector.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/Detector.kt
index 3dc1ed28..00d45946 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/Detector.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/Detector.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/ImprovedNoise.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/ImprovedNoise.kt
index 4ee3942d..234da4af 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/ImprovedNoise.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/ImprovedNoise.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/SimplexNoise.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/SimplexNoise.kt
index 6856c354..7d190c49 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/SimplexNoise.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/SimplexNoise.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/FlyControls.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/FlyControls.kt
index 77de67e0..25d846b1 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/FlyControls.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/FlyControls.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/controls/FlyControls.js")
-@file:JsNonModule
+
 
 package three.external.controls
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/OrbitControls.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/OrbitControls.kt
index 94223fc4..8200135e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/OrbitControls.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/OrbitControls.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/controls/OrbitControls.js")
-@file:JsNonModule
+
 
 package three.external.controls
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TrackballControls.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TrackballControls.kt
index 3a1ed13a..6a648eb6 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TrackballControls.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TrackballControls.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three/examples/jsm/controls/TrackballControls.js")
-@file:JsNonModule
+
 
 package three.external.controls
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TransformControls.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TransformControls.kt
index e03da682..f0760f1b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TransformControls.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/controls/TransformControls.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/controls/TransformControls.js")
-@file:JsNonModule
+
 
 package three.external.controls
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/OBJExporter.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/OBJExporter.kt
index 843a9f72..92c719e7 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/OBJExporter.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/OBJExporter.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/exporters/OBJExporter.js")
-@file:JsNonModule
+
 
 package three.external.exporters
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/STLExporter.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/STLExporter.kt
index a89c1179..5550c170 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/STLExporter.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/exporters/STLExporter.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/exporters/STLExporter.js")
-@file:JsNonModule
+
 
 package three.external.exporters
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/geometries/ConvexGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/geometries/ConvexGeometry.kt
index 0d8a7385..cf787029 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/geometries/ConvexGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/geometries/ConvexGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three/examples/jsm/geometries/ConvexGeometry.js")
-@file:JsNonModule
+
 
 package three.external.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/libs/Stats.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/libs/Stats.kt
index fd72886e..e3b36f96 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/libs/Stats.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/libs/Stats.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/libs/stats.module.js")
-@file:JsNonModule
+
 
 package three.external.libs
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/libs/datgui.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/libs/datgui.kt
index 345d0cf5..54feba17 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/libs/datgui.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/libs/datgui.kt
@@ -22,7 +22,7 @@
  * THE SOFTWARE.
  */
 @file:JsModule("three/examples/jsm/libs/dat.gui.module.js")
-@file:JsNonModule
+
 
 package three.external.libs
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/BabylonLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/BabylonLoader.kt
index 437beba6..ba19b32f 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/BabylonLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/BabylonLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/GLTFLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/GLTFLoader.kt
index 40fdd556..5fa81702 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/GLTFLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/GLTFLoader.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/LoaderSupport.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/LoaderSupport.kt
index 5636fdc9..983d8e58 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/LoaderSupport.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/LoaderSupport.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/MTLLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/MTLLoader.kt
index 1eecd588..5bef4995 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/MTLLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/MTLLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader.kt
index 0bddd83a..8ea2c38b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader2.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader2.kt
index e12ad3fe..d8264d03 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader2.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/OBJLoader2.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/STLLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/STLLoader.kt
index e3e6133f..5b9d78c8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/STLLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/loaders/STLLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three/examples/jsm/loaders/STLLoader.js")
-@file:JsNonModule
+
 
 package three.external.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Sky.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Sky.kt
index c7272138..de26105a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Sky.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Sky.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Water.kt b/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Water.kt
index 9a886a95..e6d58c56 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Water.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/external/objects/Water.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.external.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/SceneUtils.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/SceneUtils.kt
index 1ad837d0..665ce1bf 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/SceneUtils.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/SceneUtils.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Curve.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Curve.kt
index 4b688b1a..f4b2c9b7 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Curve.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Curve.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/CurvePath.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/CurvePath.kt
index 5a05ab14..d1db2d73 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/CurvePath.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/CurvePath.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Path.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Path.kt
index bd78a31d..01d5e78d 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Path.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Path.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Shape.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Shape.kt
index d05486b5..6326ae1f 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Shape.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/Shape.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/ShapePath.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/ShapePath.kt
index 5ea28758..1f2fce6c 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/core/ShapePath.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/core/ShapePath.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.core
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/ArcCurve.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/ArcCurve.kt
index c3891ff1..04cf5cc5 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/ArcCurve.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/ArcCurve.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/CatmullRomCurve3.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/CatmullRomCurve3.kt
index e968cfb0..bd4ee2d7 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/CatmullRomCurve3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/CatmullRomCurve3.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/EllipseCurve.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/EllipseCurve.kt
index dbcaec3f..fbbe5220 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/EllipseCurve.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/EllipseCurve.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve.kt
index 74c2d239..4c656e5e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve3.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve3.kt
index 68f14b72..9f3d5279 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/LineCurve3.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve.kt
index 849b41c0..4e0725df 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve3.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve3.kt
index 0da5444f..707d8330 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/QuadricBezierCurve3.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/SplineCurve.kt b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/SplineCurve.kt
index 357cf50f..c3add2be 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/SplineCurve.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/extras/curves/SplineCurve.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.extras.curves
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/BoxGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/BoxGeometry.kt
index d80a96a2..69fdd480 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/BoxGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/BoxGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/ConeGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/ConeGeometry.kt
index 7492d5ec..52cbc5e7 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/ConeGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/ConeGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/CylinderGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/CylinderGeometry.kt
index f2f1160c..f171b767 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/CylinderGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/CylinderGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/EdgesGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/EdgesGeometry.kt
index fe53213e..ee083163 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/EdgesGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/EdgesGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/ExtrudeGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/ExtrudeGeometry.kt
index 28aef766..f58c37f9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/ExtrudeGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/ExtrudeGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/PlaneGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/PlaneGeometry.kt
index aff535a2..49aa7bbb 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/PlaneGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/PlaneGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/SphereGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/SphereGeometry.kt
index 2b9e5279..0d91f54b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/SphereGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/SphereGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/TextGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/TextGeometry.kt
index aab53955..b9cc9026 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/TextGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/TextGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/TorusGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/TorusGeometry.kt
index 493b7984..12acb401 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/TorusGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/TorusGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/geometries/WireframeGeometry.kt b/visionforge-threejs/src/jsMain/kotlin/three/geometries/WireframeGeometry.kt
index 622ef80d..7030e225 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/geometries/WireframeGeometry.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/geometries/WireframeGeometry.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.geometries
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/ArrowHelper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/ArrowHelper.kt
index 18c0d8de..a3ac9eb9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/ArrowHelper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/ArrowHelper.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.helpers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/AxesHelper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/AxesHelper.kt
index 5927991f..be569797 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/AxesHelper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/AxesHelper.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.helpers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/Box3Helper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/Box3Helper.kt
index 1eefb43b..d889ea3a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/Box3Helper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/Box3Helper.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.helpers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/CameraHelper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/CameraHelper.kt
index 716f8234..11306d7d 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/CameraHelper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/CameraHelper.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.helpers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/GridHelper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/GridHelper.kt
index 0c080ead..171bbf04 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/GridHelper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/GridHelper.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.helpers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/HemisphereLightHelper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/HemisphereLightHelper.kt
index 23f21837..ff6447d8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/HemisphereLightHelper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/HemisphereLightHelper.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.helpers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/helpers/PlaneHelper.kt b/visionforge-threejs/src/jsMain/kotlin/three/helpers/PlaneHelper.kt
index 338c9593..3f45a4f6 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/helpers/PlaneHelper.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/helpers/PlaneHelper.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three")
-@file:JsNonModule
+
 package three.helpers
 
 import three.math.Color
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/AmbientLight.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/AmbientLight.kt
index b5ddd88d..fb428bf3 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/AmbientLight.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/AmbientLight.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLight.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLight.kt
index 482fd628..f75b8846 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLight.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLight.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLightShadow.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLightShadow.kt
index 205c46bb..f899ca1d 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLightShadow.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/DirectionalLightShadow.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/HemisphereLight.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/HemisphereLight.kt
index bf761479..1c5aa822 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/HemisphereLight.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/HemisphereLight.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/Light.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/Light.kt
index d0c07d15..97ffefc5 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/Light.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/Light.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/LightShadow.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/LightShadow.kt
index b7fc1f12..95ce3cb8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/LightShadow.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/LightShadow.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/PointLight.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/PointLight.kt
index 9ff6627a..e4266b4d 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/PointLight.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/PointLight.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLight.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLight.kt
index ebd422f7..7f080bb8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLight.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLight.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLightShadow.kt b/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLightShadow.kt
index 14df1315..6c205b7f 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLightShadow.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/lights/SpotLightShadow.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.lights
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/Cache.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/Cache.kt
index 38278cf1..b8a40c6b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/Cache.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/Cache.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/CompressedTextureLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/CompressedTextureLoader.kt
index d827d4a5..a16205d9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/CompressedTextureLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/CompressedTextureLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/ImageLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/ImageLoader.kt
index 555f268b..31420e19 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/ImageLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/ImageLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/JSONLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/JSONLoader.kt
index 8871b540..247cb05e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/JSONLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/JSONLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/Loader.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/Loader.kt
index d094b6d9..83e2acbe 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/Loader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/Loader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/LoadingManager.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/LoadingManager.kt
index e9180dad..efb22248 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/LoadingManager.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/LoadingManager.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/MaterialLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/MaterialLoader.kt
index f294ffd5..048a81c7 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/MaterialLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/MaterialLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/loaders/TextureLoader.kt b/visionforge-threejs/src/jsMain/kotlin/three/loaders/TextureLoader.kt
index 5ddac48b..73712b88 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/loaders/TextureLoader.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/loaders/TextureLoader.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.loaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/LineBasicMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/LineBasicMaterial.kt
index 1445c427..d091da7e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/LineBasicMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/LineBasicMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/LineDashedMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/LineDashedMaterial.kt
index aa2a5d6a..487b2d11 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/LineDashedMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/LineDashedMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/Material.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/Material.kt
index 2edbca90..9058874d 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/Material.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/Material.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshBasicMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshBasicMaterial.kt
index f1ee1f27..dafe9463 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshBasicMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshBasicMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshDepthMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshDepthMaterial.kt
index 584bcab6..a1bdeb8f 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshDepthMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshDepthMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshLambertMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshLambertMaterial.kt
index 089c96c1..46c00bc4 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshLambertMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshLambertMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshNormalMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshNormalMaterial.kt
index 5972a702..ef6b49a2 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshNormalMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshNormalMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhongMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhongMaterial.kt
index eaabf8ca..2513af76 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhongMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhongMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhysicalMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhysicalMaterial.kt
index e6674917..f02781a8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhysicalMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshPhysicalMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshStandardMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshStandardMaterial.kt
index 137ee095..ccd35143 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshStandardMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/MeshStandardMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/PointsMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/PointsMaterial.kt
index a46fb65e..c7fdeaca 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/PointsMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/PointsMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/RawShaderMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/RawShaderMaterial.kt
index d1f53c16..24eec11f 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/RawShaderMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/RawShaderMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/ShaderMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/ShaderMaterial.kt
index 3ca841db..1a6beed0 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/ShaderMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/ShaderMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/materials/SpriteMaterial.kt b/visionforge-threejs/src/jsMain/kotlin/three/materials/SpriteMaterial.kt
index 13587157..30342263 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/materials/SpriteMaterial.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/materials/SpriteMaterial.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.materials
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Box2.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Box2.kt
index 5b446e3c..36ee0610 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Box2.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Box2.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Box3.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Box3.kt
index 25730ad2..47822c7c 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Box3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Box3.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Color.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Color.kt
index 485d04f1..51cf21e2 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Color.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Color.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Cylindrical.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Cylindrical.kt
index bee46185..e28dae2a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Cylindrical.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Cylindrical.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Euler.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Euler.kt
index 5cd2f5cf..f9333b4e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Euler.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Euler.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Frustrum.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Frustrum.kt
index 8d6fe374..158b19b4 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Frustrum.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Frustrum.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Line3.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Line3.kt
index 4596edd9..b1d0a833 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Line3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Line3.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Math.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Math.kt
index 7a340d51..3a4bf9c0 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Math.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Math.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix3.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix3.kt
index f5ea461a..0c6a443c 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix3.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix4.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix4.kt
index 20e03eae..d87fef05 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix4.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Matrix4.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Plane.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Plane.kt
index 41568fc8..2c076c3a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Plane.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Plane.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Quaternion.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Quaternion.kt
index b1916723..1345eb74 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Quaternion.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Quaternion.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Ray.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Ray.kt
index 707985b9..5d9a285b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Ray.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Ray.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Sphere.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Sphere.kt
index abea7add..07ec0df8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Sphere.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Sphere.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Spherical.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Spherical.kt
index 1596bd25..defffaf4 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Spherical.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Spherical.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Triangle.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Triangle.kt
index 890d1f87..6cf0060b 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Triangle.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Triangle.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Vector2.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Vector2.kt
index c508421a..7c42e666 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Vector2.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Vector2.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Vector3.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Vector3.kt
index 881bc586..eb4e23b9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Vector3.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Vector3.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/math/Vector4.kt b/visionforge-threejs/src/jsMain/kotlin/three/math/Vector4.kt
index 5bd672d5..a991ace9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/math/Vector4.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/math/Vector4.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.math
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt b/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt
index 21e0ce34..b6bb04bc 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three.meshline")
-@file:JsNonModule
+
 
 package three.meshline
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/Group.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/Group.kt
index a280a11f..dff02213 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/Group.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/Group.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/LOD.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/LOD.kt
index 4eec3195..868fd917 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/LOD.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/LOD.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/Line.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/Line.kt
index 799884f8..0f5d27d6 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/Line.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/Line.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/LineLoop.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/LineLoop.kt
index e3e8cbc3..25aa69e4 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/LineLoop.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/LineLoop.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/LineSegments.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/LineSegments.kt
index 2ffd85ee..d410ad2e 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/LineSegments.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/LineSegments.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/Mesh.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/Mesh.kt
index 867b8000..514323c3 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/Mesh.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/Mesh.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/Points.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/Points.kt
index 7fede72c..753e719a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/Points.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/Points.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/objects/Sprite.kt b/visionforge-threejs/src/jsMain/kotlin/three/objects/Sprite.kt
index c9e06bac..e3e85fb7 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/objects/Sprite.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/objects/Sprite.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.objects
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGL2Renderer.kt b/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGL2Renderer.kt
index 7ca6120f..232faaec 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGL2Renderer.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGL2Renderer.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.renderers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderTarget.kt b/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderTarget.kt
index 2cbd272b..866523df 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderTarget.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderTarget.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.renderers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderer.kt b/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderer.kt
index 45fc212e..c4a5dcf4 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderer.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/renderers/WebGLRenderer.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.renderers
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderChunk.kt b/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderChunk.kt
index ccf4d37f..8f6d1095 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderChunk.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderChunk.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.renderers.shaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderLib.kt b/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderLib.kt
index 67ed1215..153f4499 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderLib.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/ShaderLib.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.renderers.shaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/UniformsUtil.kt b/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/UniformsUtil.kt
index 3d68f177..9ede6e98 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/UniformsUtil.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/renderers/shaders/UniformsUtil.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.renderers.shaders
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/scenes/Fog.kt b/visionforge-threejs/src/jsMain/kotlin/three/scenes/Fog.kt
index 87b67fb0..0df97cfc 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/scenes/Fog.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/scenes/Fog.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.scenes
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/scenes/FogExp2.kt b/visionforge-threejs/src/jsMain/kotlin/three/scenes/FogExp2.kt
index fed2c580..d5f540e9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/scenes/FogExp2.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/scenes/FogExp2.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.scenes
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/scenes/Scene.kt b/visionforge-threejs/src/jsMain/kotlin/three/scenes/Scene.kt
index 41fc011c..5b23c9eb 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/scenes/Scene.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/scenes/Scene.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.scenes
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/textures/CompressedTexture.kt b/visionforge-threejs/src/jsMain/kotlin/three/textures/CompressedTexture.kt
index 10b72f45..a83af1e9 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/textures/CompressedTexture.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/textures/CompressedTexture.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.textures
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/textures/CubeTexture.kt b/visionforge-threejs/src/jsMain/kotlin/three/textures/CubeTexture.kt
index b386f264..f0f503a8 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/textures/CubeTexture.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/textures/CubeTexture.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.textures
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/textures/DepthTexture.kt b/visionforge-threejs/src/jsMain/kotlin/three/textures/DepthTexture.kt
index eabc7d9c..958c9f9a 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/textures/DepthTexture.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/textures/DepthTexture.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.textures
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/textures/Texture.kt b/visionforge-threejs/src/jsMain/kotlin/three/textures/Texture.kt
index 853ae54e..6ed9e636 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/textures/Texture.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/textures/Texture.kt
@@ -23,7 +23,7 @@
  */
 
 @file:JsModule("three")
-@file:JsNonModule
+
 
 package three.textures
 
diff --git a/visionforge-threejs/src/jsMain/kotlin/three/utils/BufferGeometryUtils.kt b/visionforge-threejs/src/jsMain/kotlin/three/utils/BufferGeometryUtils.kt
index 9c52f8be..2892b90c 100644
--- a/visionforge-threejs/src/jsMain/kotlin/three/utils/BufferGeometryUtils.kt
+++ b/visionforge-threejs/src/jsMain/kotlin/three/utils/BufferGeometryUtils.kt
@@ -1,5 +1,5 @@
 @file:JsModule("three/examples/jsm/utils/BufferGeometryUtils")
-@file:JsNonModule
+
 package three.utils
 
 import three.core.BufferGeometry