Skip to content
Open
Show file tree
Hide file tree
Changes from 32 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
5b8bcbc
KTNB-1205: Support Jupyter Widgets - platform and 5 kinds of widgets
ileasile Dec 16, 2025
70494cb
KTNB-1205: Extract widget factory management into `WidgetFactoryRegis…
ileasile Dec 17, 2025
bdce718
KTNB-1205: Refactor widget initialization to use WidgetFactoryRegistr…
ileasile Dec 18, 2025
2168f29
KTNB-1205: Pass `WidgetManager` as a constructor parameter to WidgetM…
ileasile Dec 19, 2025
5260224
KTNB-1205: Extract WidgetManager interface
ileasile Dec 19, 2025
1a48b5d
KTNB-1205: Add separate integration module and README
ileasile Dec 19, 2025
05f6492
KTNB-1205: Fix bugs according to codex review
ileasile Dec 22, 2025
3dcdcd9
KTNB-1205: Fix bugs according to codex review
ileasile Dec 22, 2025
a59a70f
KTNB-1205: Add generator module and schema
ileasile Dec 22, 2025
8d1952d
KTNB-1205: Replace handwritten widget definitions with generated widg…
ileasile Dec 24, 2025
160bd40
KTNB-1205: Refactor widget generation to improve clarity, consistency…
ileasile Dec 25, 2025
e44a392
KTNB-1205: Replace widget-specific enums with generated reusable enum…
ileasile Dec 25, 2025
39f3627
KTNB-1205: Add detailed property descriptions to widget definitions a…
ileasile Dec 25, 2025
6c50e95
KTNB-1205: Refactor widget generator to modularize property type hand…
ileasile Dec 26, 2025
5592116
KTNB-1205: Remove unused widget specs and related functions, clean up…
ileasile Dec 26, 2025
61cea02
KTNB-1205: Add widgets-tests module with tests for widget comm messag…
ileasile Dec 26, 2025
9da020d
KTNB-1205: Add tests for widget state updates, buffer handling, and c…
ileasile Dec 26, 2025
5c0f7e2
KTNB-1205: Add tests for widget display serialization and validation …
ileasile Dec 27, 2025
85a5ccc
KTNB-1205: Import enum package by default
ileasile Dec 27, 2025
9539119
KTNB-1205: Add tests for primitive type serialization/deserialization…
ileasile Dec 27, 2025
be4d6d9
KTNB-1205: Handle missing widget ID during serialization in WidgetRef…
ileasile Dec 27, 2025
8b2c734
KTNB-1205: Refactor widget state synchronization to distinguish front…
ileasile Dec 27, 2025
efae388
KTNB-1205: Update widgets to distinguish frontend-initialized and bac…
ileasile Dec 27, 2025
a4cde0f
KTNB-1205: Make layout and style properties nullable, update widget p…
ileasile Dec 27, 2025
4d3620b
KTNB-1205: Transition to nullable property initialization for primiti…
ileasile Dec 27, 2025
da7cf38
KTNB-1205: Update dependencies for widgets modules to use `api` where…
ileasile Dec 27, 2025
3c3734c
KTNB-1205: Add `echoUpdate` support for selective property updates; i…
ileasile Dec 27, 2025
06ae94d
KTNB-1205: Refactor widget tests to use helper methods for event asse…
ileasile Dec 27, 2025
b6c6e4c
KTNB-1205: Support `Number` type for `step` property in `TimeWidget` …
ileasile Dec 27, 2025
4dd9c4a
KTNB-1205: Refactor widget property handling to use specialized nulla…
ileasile Dec 27, 2025
7366b2b
KTNB-1205: Update widgets README to include new modules, add developm…
ileasile Dec 27, 2025
663d774
KTNB-1205: Remove widget references on comm close to prevent memory l…
ileasile Dec 27, 2025
458ccf5
KTNB-1205: Introduce union types for widget properties, refactor prop…
ileasile Dec 27, 2025
c49593c
KTNB-1205: Add support for sending and receiving custom messages in w…
ileasile Dec 27, 2025
dade110
KTNB-1205: Update widget version handling to include patch version, u…
ileasile Dec 27, 2025
99d7451
KTNB-1205: Fix widget version inconsistency by using `viewModuleVersi…
ileasile Dec 27, 2025
09ca3e2
KTNB-1205: Replace `error` with `throw NotImplementedError` for excep…
ileasile Jan 15, 2026
2cd3f98
added widgets.ipynb example notebook similar to the ipwidgets example…
Jolanrensen Jan 8, 2026
0df0c77
KTNB-1205: Refactor `BufferPathsSerializer` to handle only `Int` for …
ileasile Jan 15, 2026
55722a5
KTNB-1205: Reformat `NotebookTests` and `.editorconfig` for consisten…
ileasile Jan 15, 2026
7c99586
Update misc.xml with Project JDK settings
ileasile Jan 15, 2026
061c15e
KTNB-1205: Remove unused `byMap` and `stopAfter` functions in `Notebo…
ileasile Jan 15, 2026
98adede
Add suppression for EditorConfig key correctness inspections in `.edi…
ileasile Jan 15, 2026
6d6ad5b
Remove reference to the deleted widget
ileasile Jan 16, 2026
92f522b
KTNB-1205: Add more possibilities for manual amending of generated en…
ileasile Jan 16, 2026
7b39095
KTNB-1205: Add `IntRange` and `ClosedRange<Double>` and `PairType` su…
ileasile Jan 17, 2026
c582a9a
Add `setup` lambda to widget creation methods for customization
ileasile Jan 17, 2026
762d797
KTNB-1205: Non-nullable types by default for array elements, base for…
ileasile Jan 17, 2026
d813b1f
KTNB-1205: Move options package
ileasile Jan 17, 2026
0752dc1
KTNB-1205: Add docs
ileasile Jan 17, 2026
973b1a6
KTNB-1205: Add more docs
ileasile Jan 17, 2026
08c402c
KTNB-1205: Add test for outputs
ileasile Jan 17, 2026
6bddf03
KTNB-1205: Structure tests
ileasile Jan 18, 2026
35d4db7
KTNB-1205: Refactor widget naming, improve case conversion, and add r…
ileasile Jan 18, 2026
daf6350
KTNB-1205: Add missing newlines to auto-generated widget properties f…
ileasile Jan 18, 2026
d4930e7
KTNB-1205: Expand widget usage documentation with examples
ileasile Jan 18, 2026
8bc4e6d
KTNB-1205: Add `linkProperties` & `getProperty` utilities with tests
ileasile Jan 19, 2026
a1cd4ef
KTNB-1205: Extend `linkProperties` API with overloads
ileasile Jan 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Each integration lives in the `integrations/` directory and has its own README.
- [IntelliJ Platform](integrations/intellij-platform/README.md) — interactive access to IntelliJ Platform APIs from a running IDE process.
- [HTTP Utilities](integrations/http-util/README.md) — JSON/serialization helpers and Ktor HTTP client wrappers for notebooks.
- [Database](integrations/database/README.md) — helpers for configuring JDBC DataSources and working with Databases.
- [Widgets](integrations/widgets/README.md) — ipywidgets API for Kotlin notebooks.

## Contributing

Expand Down
9 changes: 8 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ plugins {
alias(libs.plugins.publisher)
alias(libs.plugins.buildconfig)
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.ktlint) apply false
alias(libs.plugins.ktlint)
}

version =
Expand All @@ -16,6 +16,13 @@ allprojects {
version = rootProject.version

plugins.apply("org.jlleitschuh.gradle.ktlint")
ktlint {
filter {
exclude { entry ->
entry.file.toString().contains("generated")
}
}
}

repositories {
mavenCentral()
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-Selecting-the-JDK-version-the-IDE-will-run-under
jvmTarget = "17"
kotlin = "2.2.20"
kotlin-jupyter = "0.15.1-668"
kotlin-jupyter = "0.15.1-768-1"
publishPlugin = "2.2.0-dev-71"
intellijPlatformGradlePlugin = "2.10.3"
intellijPlatform = "253-EAP-SNAPSHOT" # TODO: lower to 2025.1.3 GA whenever released with required changes
Expand Down
4 changes: 0 additions & 4 deletions integrations/intellij-platform/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@ plugins {
val spaceUsername: String by properties
val spaceToken: String by properties

allprojects {
version = rootProject.version
}

tasks.processJupyterApiResources {
libraryProducers = listOf("org.jetbrains.kotlinx.jupyter.intellij.IntelliJPlatformJupyterIntegration")
}
Expand Down
46 changes: 46 additions & 0 deletions integrations/widgets/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
[![JetBrains official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
[![Kotlin experimental stability](https://img.shields.io/badge/project-experimental-kotlin.svg?colorA=555555&colorB=AC29EC&label=&logo=kotlin&logoColor=ffffff&logoWidth=10)](https://kotlinlang.org/docs/components-stability.html)

# Kotlin Notebook Widgets Integration

This integration provides a collection of interactive widgets for Kotlin Notebooks, such as sliders, labels, and more. It allows you to create a richer, more interactive experience within your notebooks.

## Usage

Use this API through the `%use widgets` magic command in a Kotlin Notebook.

```kotlin
%use widgets

val slider = intSliderWidget().apply {
min = 0
max = 100
value = 50
description = "Select a value:"
}

val label = labelWidget().apply {
value = "Current value: ${slider.value}"
}

// Display the slider
slider
```

## Module structure

This project consists of the following modules:

- `widgets-api`: Contains the core widget implementations, protocols, and model definitions.
- `widgets-jupyter`: Provides the integration logic and useful helpers for Kotlin Jupyter notebooks.
- `widgets-generator`: Generates widget models from `schema.json`.
- `widgets-tests`: Contains integration tests for widgets.

## Development

Most widgets are automatically generated from a schema.
To regenerate widgets after changing `schema.json` or the generator itself, run:

```bash
./gradlew :integrations:widgets:widgets-generator:generateWidgets
```
24 changes: 24 additions & 0 deletions integrations/widgets/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import org.jetbrains.kotlinx.publisher.apache2
import org.jetbrains.kotlinx.publisher.githubRepo

plugins {
alias(libs.plugins.publisher)
}

kotlinPublications {
pom {
githubRepo("Kotlin", "kotlin-notebook-integrations")
inceptionYear = "2025"
licenses {
apache2()
}
developers {
developer {
id.set("kotlin-jupyter-team")
name.set("Kotlin Jupyter Team")
organization.set("JetBrains")
organizationUrl.set("https://www.jetbrains.com")
}
}
}
}
40 changes: 40 additions & 0 deletions integrations/widgets/widgets-api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
plugins {
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.publisher)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.kotlin.jupyter.api)
}

dependencies {
api(libs.kotlinx.serialization.json)
implementation(libs.kotlin.reflect)
Comment on lines +8 to +10

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add Kotlin Jupyter API dependency to widgets-api

The new widgets-api module imports Jupyter API types such as DisplayResult and CommManager (see WidgetManagerImpl.kt), but its build file never adds the Kotlin Jupyter API dependency or calls kotlinJupyter { addApiDependency() } the way other integrations do (e.g., http-util/ktor-client). With only serialization and reflect on the classpath, these imports will be unresolved and the module will not compile. Please add the kotlin-jupyter API dependency to this module (and transitively for widgets-jupyter/tests) so the code can build.

Useful? React with 👍 / 👎.


testImplementation(libs.kotlin.test)
testImplementation(libs.test.kotlintest.assertions)
testImplementation(libs.kotlinx.serialization.json)
}

tasks.test {
useJUnitPlatform()
}

kotlin {
jvmToolchain(
libs.versions.jvm.toolchain
.get()
.toInt(),
)
explicitApi()
}

sourceSets {
main {
kotlin.srcDir("src/generated/kotlin")
}
}

kotlinPublications {
publication {
description.set("Kotlin APIs for IPython Widgets")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Generated by widgets-generator. Do not edit manually.
package org.jetbrains.kotlinx.jupyter.widget.library

import org.jetbrains.kotlinx.jupyter.widget.WidgetManager
import org.jetbrains.kotlinx.jupyter.widget.library.enums.BoxStyle
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetFactory
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetModel
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetModel
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetSpec
import org.jetbrains.kotlinx.jupyter.widget.model.createAndRegisterWidget
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.ArrayType
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.NullableType
import org.jetbrains.kotlinx.jupyter.widget.model.types.enums.WidgetEnumEntry
import org.jetbrains.kotlinx.jupyter.widget.model.types.enums.WidgetEnumType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.BooleanType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.IntType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.StringType
import org.jetbrains.kotlinx.jupyter.widget.model.types.widget.WidgetReferenceType

private val accordionSpec = WidgetSpec(
modelName = "AccordionModel",
modelModule = "@jupyter-widgets/controls",
modelModuleVersion = "2.0.0",
viewName = "AccordionView",
viewModule = "@jupyter-widgets/controls",
viewModuleVersion = "2.0.0",
)

public fun WidgetManager.accordion(): AccordionWidget = createAndRegisterWidget(AccordionWidget.Factory)

public class AccordionWidget internal constructor(
widgetManager: WidgetManager,
fromFrontend: Boolean,
) : DefaultWidgetModel(accordionSpec, widgetManager) {
internal object Factory : DefaultWidgetFactory<AccordionWidget>(accordionSpec, ::AccordionWidget)

/** CSS classes applied to widget DOM element */
public var domClasses: List<String?> by prop("_dom_classes", ArrayType(NullableType(StringType)), emptyList())
/** Use a predefined styling for the box. */
public var boxStyle: WidgetEnumEntry<BoxStyle> by prop("box_style", WidgetEnumType(BoxStyle, BoxStyle.Default), BoxStyle.Default)
/** List of widget children */
public var children: List<WidgetModel?> by prop("children", ArrayType(NullableType(WidgetReferenceType<WidgetModel>())), emptyList())
public var layout: LayoutWidget? by nullableWidgetProp("layout", if (fromFrontend) null else widgetManager.layout())
/** The index of the selected page. This is either an integer selecting a particular sub-widget, or None to have no widgets selected. */
public var selectedIndex: Int? by nullableIntProp("selected_index", null)
/** Is widget tabbable? */
public var tabbable: Boolean? by nullableBoolProp("tabbable", null)
/** Titles of the pages */
public var titles: List<String?> by prop("titles", ArrayType(NullableType(StringType)), emptyList())
/** A tooltip caption. */
public var tooltip: String? by nullableStringProp("tooltip", null)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Generated by widgets-generator. Do not edit manually.
package org.jetbrains.kotlinx.jupyter.widget.library

import org.jetbrains.kotlinx.jupyter.widget.WidgetManager
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetFactory
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetModel
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetSpec
import org.jetbrains.kotlinx.jupyter.widget.model.createAndRegisterWidget
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.ArrayType
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.NullableType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.BooleanType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.BytesType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.StringType
import org.jetbrains.kotlinx.jupyter.widget.model.types.widget.WidgetReferenceType

private val audioSpec = WidgetSpec(
modelName = "AudioModel",
modelModule = "@jupyter-widgets/controls",
modelModuleVersion = "2.0.0",
viewName = "AudioView",
viewModule = "@jupyter-widgets/controls",
viewModuleVersion = "2.0.0",
)

public fun WidgetManager.audio(): AudioWidget = createAndRegisterWidget(AudioWidget.Factory)

public class AudioWidget internal constructor(
widgetManager: WidgetManager,
fromFrontend: Boolean,
) : DefaultWidgetModel(audioSpec, widgetManager) {
internal object Factory : DefaultWidgetFactory<AudioWidget>(audioSpec, ::AudioWidget)

/** CSS classes applied to widget DOM element */
public var domClasses: List<String?> by prop("_dom_classes", ArrayType(NullableType(StringType)), emptyList())
/** When true, the audio starts when it's displayed */
public var autoplay: Boolean by boolProp("autoplay", true)
/** Specifies that audio controls should be displayed (such as a play/pause button etc) */
public var controls: Boolean by boolProp("controls", true)
/** The format of the audio. */
public var format: String by stringProp("format", "mp3")
public var layout: LayoutWidget? by nullableWidgetProp("layout", if (fromFrontend) null else widgetManager.layout())
/** When true, the audio will start from the beginning after finishing */
public var loop: Boolean by boolProp("loop", true)
/** Is widget tabbable? */
public var tabbable: Boolean? by nullableBoolProp("tabbable", null)
/** A tooltip caption. */
public var tooltip: String? by nullableStringProp("tooltip", null)
/** The media data as a memory view of bytes. */
public var value: ByteArray by bytesProp("value", byteArrayOf())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Generated by widgets-generator. Do not edit manually.
package org.jetbrains.kotlinx.jupyter.widget.library

import org.jetbrains.kotlinx.jupyter.widget.WidgetManager
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetFactory
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetModel
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetSpec
import org.jetbrains.kotlinx.jupyter.widget.model.createAndRegisterWidget
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.ArrayType
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.NullableType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.BooleanType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.FloatType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.StringType
import org.jetbrains.kotlinx.jupyter.widget.model.types.widget.WidgetReferenceType

private val boundedFloatTextSpec = WidgetSpec(
modelName = "BoundedFloatTextModel",
modelModule = "@jupyter-widgets/controls",
modelModuleVersion = "2.0.0",
viewName = "FloatTextView",
viewModule = "@jupyter-widgets/controls",
viewModuleVersion = "2.0.0",
)

public fun WidgetManager.boundedFloatText(): BoundedFloatTextWidget = createAndRegisterWidget(BoundedFloatTextWidget.Factory)

public class BoundedFloatTextWidget internal constructor(
widgetManager: WidgetManager,
fromFrontend: Boolean,
) : DefaultWidgetModel(boundedFloatTextSpec, widgetManager) {
internal object Factory : DefaultWidgetFactory<BoundedFloatTextWidget>(boundedFloatTextSpec, ::BoundedFloatTextWidget)

/** CSS classes applied to widget DOM element */
public var domClasses: List<String?> by prop("_dom_classes", ArrayType(NullableType(StringType)), emptyList())
/** Update the value as the user types. If False, update on submission, e.g., pressing Enter or navigating away. */
public var continuousUpdate: Boolean by boolProp("continuous_update", false)
/** Description of the control. */
public var description: String by stringProp("description", "")
/** Accept HTML in the description. */
public var descriptionAllowHtml: Boolean by boolProp("description_allow_html", false)
/** Enable or disable user changes */
public var disabled: Boolean by boolProp("disabled", false)
public var layout: LayoutWidget? by nullableWidgetProp("layout", if (fromFrontend) null else widgetManager.layout())
/** Max value */
public var max: Double by doubleProp("max", 100.0)
/** Min value */
public var min: Double by doubleProp("min", 0.0)
/** Minimum step to increment the value */
public var step: Double? by nullableDoubleProp("step", null)
/** Styling customizations */
public var style: DescriptionStyleWidget? by nullableWidgetProp("style", if (fromFrontend) null else widgetManager.descriptionStyle())
/** Is widget tabbable? */
public var tabbable: Boolean? by nullableBoolProp("tabbable", null)
/** A tooltip caption. */
public var tooltip: String? by nullableStringProp("tooltip", null)
/** Float value */
public var value: Double by doubleProp("value", 0.0)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Generated by widgets-generator. Do not edit manually.
package org.jetbrains.kotlinx.jupyter.widget.library

import org.jetbrains.kotlinx.jupyter.widget.WidgetManager
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetFactory
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetModel
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetSpec
import org.jetbrains.kotlinx.jupyter.widget.model.createAndRegisterWidget
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.ArrayType
import org.jetbrains.kotlinx.jupyter.widget.model.types.compound.NullableType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.BooleanType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.IntType
import org.jetbrains.kotlinx.jupyter.widget.model.types.primitive.StringType
import org.jetbrains.kotlinx.jupyter.widget.model.types.widget.WidgetReferenceType

private val boundedIntTextSpec = WidgetSpec(
modelName = "BoundedIntTextModel",
modelModule = "@jupyter-widgets/controls",
modelModuleVersion = "2.0.0",
viewName = "IntTextView",
viewModule = "@jupyter-widgets/controls",
viewModuleVersion = "2.0.0",
)

public fun WidgetManager.boundedIntText(): BoundedIntTextWidget = createAndRegisterWidget(BoundedIntTextWidget.Factory)

public class BoundedIntTextWidget internal constructor(
widgetManager: WidgetManager,
fromFrontend: Boolean,
) : DefaultWidgetModel(boundedIntTextSpec, widgetManager) {
internal object Factory : DefaultWidgetFactory<BoundedIntTextWidget>(boundedIntTextSpec, ::BoundedIntTextWidget)

/** CSS classes applied to widget DOM element */
public var domClasses: List<String?> by prop("_dom_classes", ArrayType(NullableType(StringType)), emptyList())
/** Update the value as the user types. If False, update on submission, e.g., pressing Enter or navigating away. */
public var continuousUpdate: Boolean by boolProp("continuous_update", false)
/** Description of the control. */
public var description: String by stringProp("description", "")
/** Accept HTML in the description. */
public var descriptionAllowHtml: Boolean by boolProp("description_allow_html", false)
/** Enable or disable user changes */
public var disabled: Boolean by boolProp("disabled", false)
public var layout: LayoutWidget? by nullableWidgetProp("layout", if (fromFrontend) null else widgetManager.layout())
/** Max value */
public var max: Int by intProp("max", 100)
/** Min value */
public var min: Int by intProp("min", 0)
/** Minimum step to increment the value */
public var step: Int by intProp("step", 1)
/** Styling customizations */
public var style: DescriptionStyleWidget? by nullableWidgetProp("style", if (fromFrontend) null else widgetManager.descriptionStyle())
/** Is widget tabbable? */
public var tabbable: Boolean? by nullableBoolProp("tabbable", null)
/** A tooltip caption. */
public var tooltip: String? by nullableStringProp("tooltip", null)
/** Int value */
public var value: Int by intProp("value", 0)
}
Loading