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