diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 9c4a40b..e87de36 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -15,7 +15,7 @@ android { minSdk = 21 targetSdk = 33 versionCode = 2 - versionName = "0.2.4" + versionName = "0.3.0" } buildTypes { getByName("release") { diff --git a/androidApp/src/main/java/org/kobjects/konsole/android/DemoViewModel.kt b/androidApp/src/main/java/org/kobjects/konsole/android/DemoViewModel.kt index f54cfd4..5365a7f 100644 --- a/androidApp/src/main/java/org/kobjects/konsole/android/DemoViewModel.kt +++ b/androidApp/src/main/java/org/kobjects/konsole/android/DemoViewModel.kt @@ -13,11 +13,11 @@ class DemoViewModel : ViewModel() { val title = mutableStateOf("") val konsole = mutableStateOf(ComposeKonsole()) - fun show(title: String, demo: suspend (read: suspend () -> String, write: (String) -> Unit) -> Unit) { + fun show(title: String, demo: suspend (read: suspend (String?) -> String, write: (String) -> Unit) -> Unit) { this.title.value = title konsole.value = ComposeKonsole() viewModelScope.launch { - demo( {konsole.value.read()}, {konsole.value.write(it)} ) + demo( {konsole.value.read(it)}, {konsole.value.write(it)} ) this@DemoViewModel.title.value = "" } } diff --git a/build.gradle.kts b/build.gradle.kts index 161df48..1fd6772 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20") - classpath("com.android.tools.build:gradle:7.3.1") + classpath("com.android.tools.build:gradle:7.4.0") } } diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 63a9eb2..b078f12 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "org.kobjects.konsole" -version = "0.2.4" +version = "0.3.0" dependencies { @@ -59,7 +59,7 @@ publishing { register("release") { groupId = "org.kobjects.konsole" artifactId = "compose" - version = "0.2.4" + version = "0.3.0" afterEvaluate { from(components["release"]) diff --git a/compose/src/androidTest/java/org/kobjects/konsole/ExampleInstrumentedTest.kt b/compose/src/androidTest/java/org/kobjects/konsole/ExampleInstrumentedTest.kt deleted file mode 100644 index 80b1977..0000000 --- a/compose/src/androidTest/java/org/kobjects/konsole/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.kobjects.konsole - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("org.kobjects.myapplication.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/compose/src/main/java/org/kobjects/konsole/compose/ComposeKonsole.kt b/compose/src/main/java/org/kobjects/konsole/compose/ComposeKonsole.kt index 5606f01..cdaa8ad 100644 --- a/compose/src/main/java/org/kobjects/konsole/compose/ComposeKonsole.kt +++ b/compose/src/main/java/org/kobjects/konsole/compose/ComposeKonsole.kt @@ -20,8 +20,8 @@ class ComposeKonsole : Konsole, ViewModel() { entries.add(Entry(s, input = false)) } - override suspend fun read() = suspendCancellableCoroutine { continuation -> - val request = Request { continuation.resume(it) } + override suspend fun read(label: String?) = suspendCancellableCoroutine { continuation -> + val request = Request(label) { continuation.resume(it) } requests.add(request) continuation.invokeOnCancellation { requests.remove(request) @@ -31,5 +31,7 @@ class ComposeKonsole : Konsole, ViewModel() { data class Entry(val value: String, val input: Boolean) - data class Request(val consumer: (String) -> Unit) + data class Request( + val label: String?, + val consumer: (String) -> Unit) } diff --git a/compose/src/main/java/org/kobjects/konsole/compose/KonsoleRenderer.kt b/compose/src/main/java/org/kobjects/konsole/compose/KonsoleRenderer.kt index f73860e..5db8e91 100644 --- a/compose/src/main/java/org/kobjects/konsole/compose/KonsoleRenderer.kt +++ b/compose/src/main/java/org/kobjects/konsole/compose/KonsoleRenderer.kt @@ -9,6 +9,11 @@ import androidx.compose.foundation.shape.CornerSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Done +import androidx.compose.material.icons.filled.DoubleArrow +import androidx.compose.material.icons.filled.KeyboardDoubleArrowRight +import androidx.compose.material.icons.filled.Send import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf @@ -74,6 +79,7 @@ fun RenderKonsole( Modifier.background(Color(0x77ffffff)), verticalAlignment = Alignment.CenterVertically, ) { + val topRequest = konsole.requests.lastOrNull() TextField( modifier = Modifier.weight(1f), colors = TextFieldDefaults.textFieldColors( @@ -88,15 +94,17 @@ fun RenderKonsole( onSend = { submit() }), onValueChange = { textState.value = it - } + }, + label = { if (topRequest != null && topRequest.label != null) Text(topRequest.label) } ) - Button( + IconButton( modifier = Modifier.padding(4.dp), enabled = konsole.requests.isNotEmpty(), onClick = { submit() }) { - Text("Enter") + // Text("Enter") + Icon(Icons.Default.Done, "Enter") } } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index fcbed87..e1cab6a 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "org.kobjects.konsole" -version = "0.2.4" +version = "0.3.0" kotlin { android { diff --git a/core/core.podspec b/core/core.podspec index f040847..dab6f2e 100644 --- a/core/core.podspec +++ b/core/core.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'core' - spec.version = '0.2.3' + spec.version = '0.3.0' spec.homepage = 'Link to the Shared Module homepage' spec.source = { :http=> ''} spec.authors = '' diff --git a/core/src/commonMain/kotlin/org/kobjects/konsole/Konsole.kt b/core/src/commonMain/kotlin/org/kobjects/konsole/Konsole.kt index 57f1bc3..1f12599 100644 --- a/core/src/commonMain/kotlin/org/kobjects/konsole/Konsole.kt +++ b/core/src/commonMain/kotlin/org/kobjects/konsole/Konsole.kt @@ -7,5 +7,5 @@ interface Konsole { fun write(s: String) - suspend fun read(): String + suspend fun read(label: String? = null): String } \ No newline at end of file diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 70d2ccc..92e09c5 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "org.kobjects.konsole.demo" -version = "0.2.4" +version = "0.3.0" kotlin { android { diff --git a/demo/demo.podspec b/demo/demo.podspec index f4d106e..c0d2432 100644 --- a/demo/demo.podspec +++ b/demo/demo.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'demo' - spec.version = '0.2.2' + spec.version = '0.3.0' spec.homepage = 'Link to the Demo Module homepage' spec.source = { :http=> ''} spec.authors = '' diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/Demo.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/Demo.kt index 178563a..6023d06 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/Demo.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/Demo.kt @@ -11,7 +11,7 @@ import org.kobjects.konsole.demo.rockpaperscissors.rockPaperScissors class Demo( val number: Int, val name: String, - val code: suspend (read: suspend () -> String, write: (String) -> Unit) -> Unit + val code: suspend (read: suspend (String?) -> String, write: (String) -> Unit) -> Unit ) { companion object { val ALL = listOf( @@ -28,7 +28,7 @@ class Demo( run (konsole::read, konsole::write) } - suspend fun run(read: suspend () -> String, write: (String) -> Unit) { + suspend fun run(read: suspend (String?) -> String, write: (String) -> Unit) { println("run $this") code(read, write) } diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/KonsoleImpl.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/KonsoleImpl.kt index de7143e..02102c6 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/KonsoleImpl.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/KonsoleImpl.kt @@ -6,14 +6,14 @@ import kotlin.coroutines.suspendCoroutine /** Helper for iOS */ class KonsoleImpl : Konsole { var writeFunction: (String) -> Unit = {} - var readFunction: ((String) -> Unit) -> Unit = {} + var readFunction: (String?, (String) -> Unit) -> Unit = { label, fn -> } override fun write(s: String) { writeFunction(s) } - override suspend fun read() = suspendCoroutine { cont -> - readFunction { cont.resume(it) } + override suspend fun read(label: String?) = suspendCoroutine { cont -> + readFunction(label) { cont.resume(it) } } } \ No newline at end of file diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/banner/Banner.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/banner/Banner.kt index 5d808a2..4384a26 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/banner/Banner.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/banner/Banner.kt @@ -11,10 +11,9 @@ package org.kobjects.konsole.demo.banner * Converted from Java to Kotlin by Stefan Haustein */ -suspend fun banner(read: suspend () -> String, write: (String) -> Unit ) { +suspend fun banner(read: suspend (String?) -> String, write: (String) -> Unit ) { while (true) { - write("Text?") - val statement = read().uppercase() + val statement = read("Text?").uppercase() if (statement.isBlank()) { break diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/checkers/Checkers.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/checkers/Checkers.kt index f2e2b57..e43242a 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/checkers/Checkers.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/checkers/Checkers.kt @@ -2,7 +2,7 @@ package org.kobjects.konsole.demo.checkers import kotlin.math.abs -suspend fun checkers(read: suspend () -> String, write: (String) -> Unit) { +suspend fun checkers(read: suspend (String?) -> String, write: (String) -> Unit) { write("Checkers") write("Creative Computing Morristown, New Jersey") write(""" @@ -18,8 +18,7 @@ suspend fun checkers(read: suspend () -> String, write: (String) -> Unit) { while (true) { Checkers().run(read, write) - write("Another game?") - val answer = read().lowercase() + val answer = read("Another game?").lowercase() if (answer != "y" && answer != "yes") { break } @@ -30,7 +29,7 @@ class Checkers { val board = Array(8, { IntArray(8, {0}) }) val g = -1 - suspend fun run(read: suspend () -> String, write: (String) -> Unit) { + suspend fun run(read: suspend (String?) -> String, write: (String) -> Unit) { var p = 0 for (x in 0..7) { @@ -69,8 +68,7 @@ class Checkers { break; } while (true) { - write("Your move?") - val problem = playerMove(read().trim().lowercase()) + val problem = playerMove(read("Your move?").trim().lowercase()) if (problem.isEmpty()) { break } diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/hangman/Hangman.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/hangman/Hangman.kt index 54bc3dc..72a773e 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/hangman/Hangman.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/hangman/Hangman.kt @@ -9,7 +9,7 @@ import kotlin.random.Random */ class Hangman( - val read: suspend () -> String, + val read: suspend (String?) -> String, val write: (String) -> Unit ) { @@ -75,8 +75,7 @@ class Hangman( while(misses < 10) { write("Misses: $lettersUsed\nDiscovered: $discovered") - write("Your guess?") - val guess = read().trim().uppercase() + val guess = read("Your guess?").trim().uppercase() if (guess.length == 0) { write("Do you want to give up?") @@ -206,7 +205,7 @@ class Hangman( write(sb.toString()) } - suspend fun yesNo() = when (read().lowercase()) { + suspend fun yesNo() = when (read(null).lowercase()) { "yes", "y" -> true else -> false diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/ktxml/KtXmlDemo.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/ktxml/KtXmlDemo.kt index 43dfbda..73fef30 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/ktxml/KtXmlDemo.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/ktxml/KtXmlDemo.kt @@ -3,10 +3,10 @@ package org.kobjects.konsole.demo.ktxml import org.kobjects.ktxml.mini.MiniXmlPullParser import org.kobjects.ktxml.api.EventType -suspend fun ktXmlDemo(read: suspend () -> String, write: (String) -> Unit) { +suspend fun ktXmlDemo(read: suspend (String?) -> String, write: (String) -> Unit) { write("Enter XML an XML snippet see the corresponding KtXml parsing events.") while(true) { - val input = read() + val input = read("XML?") if (input.isBlank()) { break } diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/poker/Poker.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/poker/Poker.kt index 16925b5..10485ca 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/poker/Poker.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/poker/Poker.kt @@ -9,7 +9,7 @@ fun random() = Random.Default.nextDouble() fun random10() = (10 * random()).toInt() class Poker( - val read: suspend () -> String, + val read: suspend (String?) -> String, val write: (String) -> Unit) { val allCards = mutableListOf() @@ -23,7 +23,7 @@ class Poker( suspend fun queryCardNumbers(): List { write("Now we draw -- which cards do you want to replace?") while (true) { - val s = read() + val s = read("Card numbers?") val cards = mutableListOf() var valid = true for (c in s) { @@ -50,7 +50,7 @@ class Poker( suspend fun yesNo(question: String): Boolean { while (true) { write(question) - val text = read().lowercase() + val text = read("y/n").lowercase() when (text) { "yes", "y" -> return true "no", "n" -> return false @@ -122,12 +122,12 @@ class Poker( suspend fun askForAmount(minimum: Int): Int { while (true) { - if (minimum == 0) { - write("Fold, check or rise to ?") - } else { - write("Fold, see or rise to ?") - } - val input = read().trim().lowercase() + val question = if (minimum == 0) + "Fold, check or rise to ?" + else + "Fold, see or rise to ?" + + val input = read(question).trim().lowercase() if (input == "f" || input == "fold") { return -1 } diff --git a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/rockpaperscissors/RockPaperScissors.kt b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/rockpaperscissors/RockPaperScissors.kt index 94796db..833daa3 100644 --- a/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/rockpaperscissors/RockPaperScissors.kt +++ b/demo/src/commonMain/kotlin/org/kobjects/konsole/demo/rockpaperscissors/RockPaperScissors.kt @@ -38,10 +38,9 @@ fun compare(userChoice: Choice, computerChoice: Choice) = } } -suspend fun readUserChoice(read: suspend () -> String, write: (String) -> Unit): Choice { - write("Rock, paper or scissors?") +suspend fun readUserChoice(read: suspend (String?) -> String, write: (String) -> Unit): Choice { while (true) { - val input = read() + val input = read("Rock, paper or scissors?") val errorMessage = validateInput(input) if (errorMessage.isEmpty()) { return processInput(input)!! @@ -50,7 +49,7 @@ suspend fun readUserChoice(read: suspend () -> String, write: (String) -> Unit): } } -suspend fun rockPaperScissors(read: suspend () -> String, write: (String) -> Unit) { +suspend fun rockPaperScissors(read: suspend (String?) -> String, write: (String) -> Unit) { while (true) { val userChoice = readUserChoice(read, write) val computerChoice = Choice.values()[Random.nextInt(0, 3)] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bf48a7c..5d67055 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Jan 04 23:16:14 CET 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/iosApp/Podfile.lock b/iosApp/Podfile.lock index afe20b6..289aa6f 100644 --- a/iosApp/Podfile.lock +++ b/iosApp/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - demo (0.2.2) + - demo (0.3.0) DEPENDENCIES: - demo (from `../demo`) @@ -9,7 +9,7 @@ EXTERNAL SOURCES: :path: "../demo" SPEC CHECKSUMS: - demo: ba2f768e183abec8a4f1e72efa63b3739ff4a798 + demo: f2943f5438f089b8dad2555b77748ee5ba849df2 PODFILE CHECKSUM: 8b9a17ea90421cac540152758feaa63690f5ea11 diff --git a/iosApp/Pods/Local Podspecs/core.podspec.json b/iosApp/Pods/Local Podspecs/core.podspec.json index 6c6f673..df9eba4 100644 --- a/iosApp/Pods/Local Podspecs/core.podspec.json +++ b/iosApp/Pods/Local Podspecs/core.podspec.json @@ -1,6 +1,6 @@ { "name": "core", - "version": "0.2.2", + "version": "0.3.0", "homepage": "Link to the Shared Module homepage", "source": { "http": "" diff --git a/iosApp/Pods/Local Podspecs/demo.podspec.json b/iosApp/Pods/Local Podspecs/demo.podspec.json index 3686118..bac4398 100644 --- a/iosApp/Pods/Local Podspecs/demo.podspec.json +++ b/iosApp/Pods/Local Podspecs/demo.podspec.json @@ -1,6 +1,6 @@ { "name": "demo", - "version": "0.2.2", + "version": "0.3.0", "homepage": "Link to the Demo Module homepage", "source": { "http": "" diff --git a/iosApp/Pods/Manifest.lock b/iosApp/Pods/Manifest.lock index afe20b6..289aa6f 100644 --- a/iosApp/Pods/Manifest.lock +++ b/iosApp/Pods/Manifest.lock @@ -1,5 +1,5 @@ PODS: - - demo (0.2.2) + - demo (0.3.0) DEPENDENCIES: - demo (from `../demo`) @@ -9,7 +9,7 @@ EXTERNAL SOURCES: :path: "../demo" SPEC CHECKSUMS: - demo: ba2f768e183abec8a4f1e72efa63b3739ff4a798 + demo: f2943f5438f089b8dad2555b77748ee5ba849df2 PODFILE CHECKSUM: 8b9a17ea90421cac540152758feaa63690f5ea11 diff --git a/iosApp/iosApp/DemoView.swift b/iosApp/iosApp/DemoView.swift index 868a262..53b6b47 100644 --- a/iosApp/iosApp/DemoView.swift +++ b/iosApp/iosApp/DemoView.swift @@ -13,8 +13,8 @@ struct DemoView: View { output.append(Output(text: text, right: false)) } - func read(consumer: @escaping (String) -> KotlinUnit) { - requests.append(InputRequest(consumer: consumer)) + func read(label: String?, consumer: @escaping (String) -> KotlinUnit) { + requests.append(InputRequest(label: label, consumer: consumer)) } var body: some View { @@ -31,7 +31,7 @@ struct DemoView: View { HStack { let disabled = requests.isEmpty let request = disabled ? nil : requests[0] - TextField("", text: $input) + TextField(request?.label ?? "", text: $input) .disabled(disabled) Button("Enter", action: { if (request != nil) { @@ -64,6 +64,7 @@ struct DemoView: View { } struct InputRequest { + let label: String? let consumer: (String) -> KotlinUnit } diff --git a/jsApp/src/main/kotlin/org/kobjects/konsole/demo/js/main.kt b/jsApp/src/main/kotlin/org/kobjects/konsole/demo/js/main.kt index 219b3b7..947d001 100644 --- a/jsApp/src/main/kotlin/org/kobjects/konsole/demo/js/main.kt +++ b/jsApp/src/main/kotlin/org/kobjects/konsole/demo/js/main.kt @@ -48,7 +48,7 @@ fun main() { konsoleContainer.innerText = "" konsoleContainer.appendChild(konsole.root) GlobalScope.launch { - demo.run( { konsole.read() }, { konsole.write(it) } ) + demo.run( { konsole.read(it) }, { konsole.write(it) } ) window.location.hash = "#" } } diff --git a/jsApp/src/main/kotlin/org/kobjects/konsole/js/HtmlKonsole.kt b/jsApp/src/main/kotlin/org/kobjects/konsole/js/HtmlKonsole.kt index 9dacf85..1a52dd7 100644 --- a/jsApp/src/main/kotlin/org/kobjects/konsole/js/HtmlKonsole.kt +++ b/jsApp/src/main/kotlin/org/kobjects/konsole/js/HtmlKonsole.kt @@ -20,12 +20,13 @@ fun element(name: String, vararg children: Any): HTMLElement { return element } +fun br(vararg children: Any) = element("br", *children) as HTMLBRElement fun textArea(vararg children: Any) = element("textarea", *children) as HTMLTextAreaElement fun div(vararg children: Any) = element("div", *children) as HTMLDivElement class HtmlKonsole : Konsole { - private val input = textArea("disabled" to "disabled", "class" to "konsole-input") as HTMLTextAreaElement - private val enter = div("disabled" to "disabled", "class" to "konsole-button", "Enter") + private val input = textArea("disabled" to "disabled", "class" to "konsole-input", "id" to "konsole-input") as HTMLTextAreaElement + private val enter = div("disabled" to "disabled", "class" to "konsole-button", "ยป") private val inputContainer = div("class" to "konsole-input-container", input, enter) private val contentContainer = div("class" to "konsole-content-container") val root = div("class" to "konsole-root", contentContainer, inputContainer) @@ -73,11 +74,12 @@ class HtmlKonsole : Konsole { append(text, "konsole-bubble-output") } - override suspend fun read() = suspendCoroutine { continuation -> + override suspend fun read(label: String?) = suspendCoroutine { continuation -> if (request != null) { throw IllegalStateException("Request pending!") } input.disabled = false + input.placeholder = label ?: "" input.focus() request = Request { continuation.resume(it) } } diff --git a/jsApp/src/main/resources/konsole.css b/jsApp/src/main/resources/konsole.css index 460c261..e984e65 100644 --- a/jsApp/src/main/resources/konsole.css +++ b/jsApp/src/main/resources/konsole.css @@ -52,4 +52,4 @@ color: rgb(128, 128, 128); padding: 10px 20px; border-radius: 24px; - } \ No newline at end of file + }