aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Module.md9
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt23
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/KVManager.kt (renamed from src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt)51
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/core/Component.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/core/Css.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt1
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/core/Types.kt9
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/core/Widget.kt18
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt6
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt6
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt6
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt8
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt6
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt6
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt23
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt (renamed from src/main/kotlin/pl/treksoft/kvision/HMR.kt)7
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/html/Button.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/html/Image.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/html/Link.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/html/List.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/html/Tag.kt4
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt (renamed from src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt)8
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt9
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/panel/Root.kt (renamed from src/main/kotlin/pl/treksoft/kvision/core/Root.kt)6
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt2
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt13
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt (renamed from src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt)7
-rw-r--r--src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/KVManagerSpec.kt (renamed from src/test/kotlin/test/pl/treksoft/kvision/core/KVManagerSpec.kt)11
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/TestUtil.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/core/ContainerSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/core/WidgetSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/core/WidgetWrapperSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/data/DataContainerSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/dropdown/DropDownSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/FieldLabelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/HelpBlockSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckBoxSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioGroupSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptGroupSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptionSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/PasswordSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/TextInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/text/TextSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeInputSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/html/ButtonSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/html/ImageSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/html/LabelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/html/LinkSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/html/ListSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/html/TagSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/modal/AlertSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/modal/CloseIconSpec.kt (renamed from src/test/kotlin/test/pl/treksoft/kvision/helpers/CloseIconSpec.kt)6
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/modal/ConfirmSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/modal/ModalSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/DockPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/FlexPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/GridPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/HPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/ResponsiveGridPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/RootSpec.kt (renamed from src/test/kotlin/test/pl/treksoft/kvision/core/RootSpec.kt)4
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/SplitPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/StackPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/TabPanelSpec.kt2
-rw-r--r--src/test/kotlin/test/pl/treksoft/kvision/panel/VPanelSpec.kt2
93 files changed, 213 insertions, 198 deletions
diff --git a/Module.md b/Module.md
index 753c7fbe..46218b1c 100644
--- a/Module.md
+++ b/Module.md
@@ -2,6 +2,11 @@
KVision - object oriented Web UI framework for Kotlin/JS.
-# Package pl.treksoft.kvision
+# Package pl.treksoft.kvision.core
-Base interfaces, classes and functions declarations necessary to develop KVision applications.
+KVision core classes. This includes base interfaces for all components, basic CSS enums (for colors, borders
+and backgrounds) and the main Widget class.
+
+# Package pl.treksoft.kvision.hmr
+
+Helper interfaces and classes necessary to develop applications supporting Hot Module Replacement (HMR).
diff --git a/src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt b/src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt
deleted file mode 100644
index 83ad69ca..00000000
--- a/src/main/kotlin/pl/treksoft/kvision/ApplicationBase.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * @author Robert Jaros
- */
-package pl.treksoft.kvision
-
-/**
- * Base class for applications.
- *
- * Every application class should inherit from this abstract class.
-*/
-abstract class ApplicationBase {
-/**
- * Starting point for an application.
- * @param state Initial state between Hot Module Replacement (HMR).
-*/
-abstract fun start(state: Map<String, Any>)
-
-/**
- * Ending point for an application.
- * @return final state for Hot Module Replacement (HMR).
-*/
-abstract fun dispose(): Map<String, Any>
-}
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt b/src/main/kotlin/pl/treksoft/kvision/KVManager.kt
index 7ca0ce26..5d5c03fa 100644
--- a/src/main/kotlin/pl/treksoft/kvision/core/KVManager.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/KVManager.kt
@@ -1,4 +1,7 @@
-package pl.treksoft.kvision.core
+/**
+ * @author Robert Jaros
+ */
+package pl.treksoft.kvision
import com.github.snabbdom.Snabbdom
import com.github.snabbdom.VNode
@@ -8,15 +11,19 @@ import com.github.snabbdom.datasetModule
import com.github.snabbdom.eventListenersModule
import com.github.snabbdom.propsModule
import com.github.snabbdom.styleModule
-import pl.treksoft.kvision.require
-import pl.treksoft.kvision.routing.Routing
-import pl.treksoft.kvision.routing.routing
import kotlin.browser.document
import kotlin.dom.clear
-external val kvBootstrap: Boolean?
+/**
+ * @suppress
+ * External function for loading CommonJS modules.
+ */
+external fun require(name: String): dynamic
-object KVManager {
+/**
+ * Internal singleton object which initializes and configures KVision framework.
+ */
+internal object KVManager {
internal const val AJAX_REQUEST_DELAY = 300
internal const val KVNULL = "#kvnull"
@@ -29,19 +36,26 @@ object KVManager {
private val fontAwesomeWebpack = require("font-awesome-webpack")
private val resizable = require("jquery-resizable-dom")
private val awesomeBootstrapCheckbox = require("awesome-bootstrap-checkbox")
- private val bootstrapSelectCss = require("bootstrap-select/dist/css/bootstrap-select.min.css")
+ private val bootstrapSelectCss =
+ require("bootstrap-select/dist/css/bootstrap-select.min.css")
private val bootstrapSelect = require("bootstrap-select")
private val bootstrapSelectI18n = require("./js/bootstrap-select-i18n.min.js")
- private val bootstrapSelectAjaxCss = require("ajax-bootstrap-select/dist/css/ajax-bootstrap-select.min.css")
- private val bootstrapSelectAjax = require("ajax-bootstrap-select/dist/js/ajax-bootstrap-select.min.js")
+ private val bootstrapSelectAjaxCss =
+ require("ajax-bootstrap-select/dist/css/ajax-bootstrap-select.min.css")
+ private val bootstrapSelectAjax =
+ require("ajax-bootstrap-select/dist/js/ajax-bootstrap-select.min.js")
// private val bootstrapSelectAjaxI18n =
// require("ajax-bootstrap-select/dist/js/locale/ajax-bootstrap-select.pl-PL.min.js")
private val trixCss = require("trix/dist/trix.css")
private val trix = require("trix")
- private val bootstrapDateTimePickerCss = require("bootstrap-datetime-picker/css/bootstrap-datetimepicker.min.css")
- private val bootstrapDateTimePicker = require("bootstrap-datetime-picker/js/bootstrap-datetimepicker.min.js")
- private val bootstrapTouchspinCss = require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css")
- private val bootstrapTouchspin = require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js")
+ private val bootstrapDateTimePickerCss =
+ require("bootstrap-datetime-picker/css/bootstrap-datetimepicker.min.css")
+ private val bootstrapDateTimePicker =
+ require("bootstrap-datetime-picker/js/bootstrap-datetimepicker.min.js")
+ private val bootstrapTouchspinCss =
+ require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.css")
+ private val bootstrapTouchspin =
+ require("bootstrap-touchspin/dist/jquery.bootstrap-touchspin.min.js")
internal val fecha = require("fecha")
private val sdPatch = Snabbdom.init(
@@ -67,15 +81,4 @@ object KVManager {
internal fun virtualize(html: String): VNode {
return sdVirtualize(html)
}
-
- fun init() {
- }
-
- fun start() {
- routing = Routing()
- }
-
- fun shutdown() {
- routing.destroy()
- }
}
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Component.kt b/src/main/kotlin/pl/treksoft/kvision/core/Component.kt
index bdd254ba..c322892c 100644
--- a/src/main/kotlin/pl/treksoft/kvision/core/Component.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/core/Component.kt
@@ -3,8 +3,8 @@ package pl.treksoft.kvision.core
import com.github.snabbdom.VNode
import org.w3c.dom.Node
import pl.treksoft.jquery.JQuery
+import pl.treksoft.kvision.panel.Root
-@Suppress("TooManyFunctions")
interface Component {
var parent: Component?
var visible: Boolean
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Css.kt b/src/main/kotlin/pl/treksoft/kvision/core/Css.kt
index a5a85531..80860647 100644
--- a/src/main/kotlin/pl/treksoft/kvision/core/Css.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/core/Css.kt
@@ -3,8 +3,6 @@ package pl.treksoft.kvision.core
import pl.treksoft.kvision.utils.asString
import pl.treksoft.kvision.utils.toHexString
-typealias ResString = String
-
@Suppress("EnumNaming", "EnumEntryName")
enum class UNIT(val unit: String) {
px("px"),
@@ -24,8 +22,6 @@ enum class UNIT(val unit: String) {
auto("auto")
}
-typealias CssSize = Pair<Int, UNIT>
-
enum class BORDERSTYLE(val borderStyle: String) {
NONE("none"),
HIDDEN("hidden"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt b/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt
index b2676929..ed6def5f 100644
--- a/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/core/StyledComponent.kt
@@ -1,6 +1,5 @@
package pl.treksoft.kvision.core
-import pl.treksoft.kvision.snabbdom.StringPair
import pl.treksoft.kvision.utils.asString
abstract class StyledComponent : Component {
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Types.kt b/src/main/kotlin/pl/treksoft/kvision/core/Types.kt
new file mode 100644
index 00000000..05a4bec7
--- /dev/null
+++ b/src/main/kotlin/pl/treksoft/kvision/core/Types.kt
@@ -0,0 +1,9 @@
+package pl.treksoft.kvision.core
+
+typealias ResString = String
+
+typealias StringPair = Pair<String, String>
+
+typealias StringBoolPair = Pair<String, Boolean>
+
+typealias CssSize = Pair<Int, UNIT>
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt b/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt
index 4ff7a640..08e67da0 100644
--- a/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/core/Widget.kt
@@ -7,15 +7,15 @@ import org.w3c.dom.CustomEventInit
import org.w3c.dom.Node
import pl.treksoft.jquery.JQuery
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
-import pl.treksoft.kvision.snabbdom.hooks
-import pl.treksoft.kvision.snabbdom.on
-import pl.treksoft.kvision.snabbdom.snAttrs
-import pl.treksoft.kvision.snabbdom.snClasses
-import pl.treksoft.kvision.snabbdom.snOpt
-import pl.treksoft.kvision.snabbdom.snStyle
+import pl.treksoft.kvision.KVManager
+import pl.treksoft.kvision.panel.Root
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.utils.hooks
+import pl.treksoft.kvision.utils.on
+import pl.treksoft.kvision.utils.snAttrs
+import pl.treksoft.kvision.utils.snClasses
+import pl.treksoft.kvision.utils.snOpt
+import pl.treksoft.kvision.utils.snStyle
@Suppress("TooManyFunctions", "LargeClass")
open class Widget(classes: Set<String> = setOf()) : StyledComponent() {
diff --git a/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt b/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt
index 587b89cd..2e32ff7c 100644
--- a/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/dropdown/DropDown.kt
@@ -11,9 +11,9 @@ import pl.treksoft.kvision.html.ListTag
import pl.treksoft.kvision.html.TAG
import pl.treksoft.kvision.html.Tag
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
+import pl.treksoft.kvision.utils.obj
enum class DD(val type: String) {
HEADER("DD#HEADER"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt b/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt
index a28245d6..81275070 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/FieldLabel.kt
@@ -2,7 +2,7 @@ package pl.treksoft.kvision.form
import pl.treksoft.kvision.html.TAG
import pl.treksoft.kvision.html.Tag
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
open class FieldLabel(
internal val forId: String, text: String? = null, rich: Boolean = false,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt b/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt
index 6c98244d..4ab94df5 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt
@@ -6,7 +6,7 @@ import pl.treksoft.kvision.form.check.Radio
import pl.treksoft.kvision.html.TAG
import pl.treksoft.kvision.html.Tag
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.core.StringBoolPair
import kotlin.js.Json
enum class FORMTYPE(val formType: String) {
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt
index 6776b8eb..ea41c429 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckBox.kt
@@ -6,8 +6,8 @@ import pl.treksoft.kvision.form.BoolFormControl
import pl.treksoft.kvision.form.FieldLabel
import pl.treksoft.kvision.form.HelpBlock
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.core.StringBoolPair
enum class CHECKBOXSTYLE(val className: String) {
DEFAULT("checkbox-default"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt
index 7114b2c2..a7d562a2 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/check/CheckInput.kt
@@ -4,8 +4,8 @@ import com.github.snabbdom.VNode
import org.w3c.dom.events.MouseEvent
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.form.INPUTSIZE
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
enum class CHECKINPUTTYPE(val type: String) {
CHECKBOX("checkbox"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt
index d7fa502f..ac6df5b1 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/check/Radio.kt
@@ -6,8 +6,8 @@ import pl.treksoft.kvision.form.BoolFormControl
import pl.treksoft.kvision.form.FieldLabel
import pl.treksoft.kvision.form.HelpBlock
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.core.StringBoolPair
enum class RADIOSTYLE(val className: String) {
DEFAULT("radio-default"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt b/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt
index fdf0e6a9..5060b6cb 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/check/RadioGroup.kt
@@ -7,8 +7,8 @@ import pl.treksoft.kvision.form.INPUTSIZE
import pl.treksoft.kvision.form.StringFormControl
import pl.treksoft.kvision.form.select.Select
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
open class RadioGroup(
options: List<StringPair>? = null, value: String? = null, inline: Boolean = false,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt
index 9ba13f84..774bb654 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/select/AjaxOptions.kt
@@ -1,9 +1,9 @@
package pl.treksoft.kvision.form.select
import pl.treksoft.jquery.JQueryXHR
-import pl.treksoft.kvision.core.KVManager.AJAX_REQUEST_DELAY
-import pl.treksoft.kvision.core.KVManager.KVNULL
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.KVManager.AJAX_REQUEST_DELAY
+import pl.treksoft.kvision.KVManager.KVNULL
+import pl.treksoft.kvision.utils.obj
enum class HttpType(val type: String) {
GET("GET"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt
index 5f10191f..49259ab1 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/select/Select.kt
@@ -6,9 +6,9 @@ import pl.treksoft.kvision.form.FieldLabel
import pl.treksoft.kvision.form.HelpBlock
import pl.treksoft.kvision.form.StringFormControl
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
@Suppress("TooManyFunctions")
open class Select(
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt
index 6830823d..83eca138 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectInput.kt
@@ -3,13 +3,13 @@ package pl.treksoft.kvision.form.select
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.Component
import pl.treksoft.kvision.core.CssSize
-import pl.treksoft.kvision.core.KVManager.KVNULL
+import pl.treksoft.kvision.KVManager.KVNULL
import pl.treksoft.kvision.form.INPUTSIZE
import pl.treksoft.kvision.html.BUTTONSTYLE
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
+import pl.treksoft.kvision.utils.obj
import pl.treksoft.kvision.utils.asString
enum class SELECTWIDTHTYPE(val value: String) {
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt
index cfd2be19..391ee6a3 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOptGroup.kt
@@ -2,7 +2,7 @@ package pl.treksoft.kvision.form.select
import com.github.snabbdom.VNode
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
open class SelectOptGroup(
label: String, options: List<StringPair>? = null, maxOptions: Int? = null,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt
index 020d8f4b..f5ea25cd 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/select/SelectOption.kt
@@ -2,7 +2,7 @@ package pl.treksoft.kvision.form.select
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.Widget
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
open class SelectOption(
value: String? = null, label: String? = null, subtext: String? = null, icon: String? = null,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt b/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt
index 5e2c460b..c6b49684 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/spinner/Spinner.kt
@@ -5,8 +5,8 @@ import pl.treksoft.kvision.form.FieldLabel
import pl.treksoft.kvision.form.HelpBlock
import pl.treksoft.kvision.form.NumberFormControl
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.core.StringBoolPair
open class Spinner(
value: Number? = null, min: Int = 0, max: Int = DEFAULT_MAX, step: Double = DEFAULT_STEP,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt
index 139a8ba9..ae064cdb 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/spinner/SpinnerInput.kt
@@ -4,9 +4,9 @@ import com.github.snabbdom.VNode
import pl.treksoft.jquery.JQuery
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.form.INPUTSIZE
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
+import pl.treksoft.kvision.utils.obj
enum class BUTTONSTYPE {
NONE,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt
index 48b8d201..a3c89514 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractText.kt
@@ -5,8 +5,8 @@ import pl.treksoft.kvision.form.FieldLabel
import pl.treksoft.kvision.form.HelpBlock
import pl.treksoft.kvision.form.StringFormControl
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.core.StringBoolPair
abstract class AbstractText(label: String? = null, rich: Boolean = false) :
SimplePanel(setOf("form-group")), StringFormControl {
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt
index 85cf6cf7..95a5d98b 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/text/AbstractTextInput.kt
@@ -3,8 +3,8 @@ package pl.treksoft.kvision.form.text
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.form.INPUTSIZE
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
abstract class AbstractTextInput(
value: String? = null,
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt
index c96bc371..9df58266 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/text/RichTextInput.kt
@@ -2,7 +2,7 @@ package pl.treksoft.kvision.form.text
import com.github.snabbdom.VNode
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
import kotlin.browser.document
open class RichTextInput(value: String? = null, classes: Set<String> = setOf()) :
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt
index 01b531fb..8efe0318 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/text/TextAreaInput.kt
@@ -1,7 +1,7 @@
package pl.treksoft.kvision.form.text
import com.github.snabbdom.VNode
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
open class TextAreaInput(cols: Int? = null, rows: Int? = null, value: String? = null, classes: Set<String> = setOf()) :
AbstractTextInput(value, classes + "form-control") {
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt
index d735c82e..bd945590 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/text/TextInput.kt
@@ -1,7 +1,7 @@
package pl.treksoft.kvision.form.text
import com.github.snabbdom.VNode
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
enum class TEXTINPUTTYPE(val type: String) {
TEXT("text"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt
index db9fdeb1..1750c1bd 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTime.kt
@@ -5,8 +5,8 @@ import pl.treksoft.kvision.form.DateFormControl
import pl.treksoft.kvision.form.FieldLabel
import pl.treksoft.kvision.form.HelpBlock
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.SnOn
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.utils.SnOn
+import pl.treksoft.kvision.core.StringBoolPair
import kotlin.js.Date
open class DateTime(
diff --git a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt
index a7aa758b..cac9fbda 100644
--- a/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/form/time/DateTimeInput.kt
@@ -3,9 +3,9 @@ package pl.treksoft.kvision.form.time
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.form.INPUTSIZE
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
+import pl.treksoft.kvision.utils.obj
import pl.treksoft.kvision.utils.toDateF
import pl.treksoft.kvision.utils.toStringF
import kotlin.js.Date
diff --git a/src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt b/src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt
new file mode 100644
index 00000000..ceea0fbc
--- /dev/null
+++ b/src/main/kotlin/pl/treksoft/kvision/hmr/ApplicationBase.kt
@@ -0,0 +1,23 @@
+/**
+ * @author Robert Jaros
+ */
+package pl.treksoft.kvision.hmr
+
+/**
+ * Base class for applications.
+ *
+ * Base class for applications supporting Hot Module Replacement (HMR).
+ */
+abstract class ApplicationBase {
+ /**
+ * Starting point for an application.
+ * @param state Initial state between Hot Module Replacement (HMR).
+ */
+ abstract fun start(state: Map<String, Any>)
+
+ /**
+ * Ending point for an application.
+ * @return final state for Hot Module Replacement (HMR).
+ */
+ abstract fun dispose(): Map<String, Any>
+}
diff --git a/src/main/kotlin/pl/treksoft/kvision/HMR.kt b/src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt
index 6fb9dfed..59b6fe00 100644
--- a/src/main/kotlin/pl/treksoft/kvision/HMR.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/hmr/HMR.kt
@@ -1,7 +1,7 @@
/**
* @author Robert Jaros
*/
-package pl.treksoft.kvision
+package pl.treksoft.kvision.hmr
/**
* Helper variable for Hot Module Replacement (HMR).
@@ -27,8 +27,3 @@ external interface Hot {
fun dispose(callback: (data: dynamic) -> Unit)
}
-
-/**
- * External function for loading CommonJS modules.
- */
-external fun require(name: String): dynamic
diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Button.kt b/src/main/kotlin/pl/treksoft/kvision/html/Button.kt
index 4e8f7b3e..bb48558f 100644
--- a/src/main/kotlin/pl/treksoft/kvision/html/Button.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/html/Button.kt
@@ -4,8 +4,8 @@ import com.github.snabbdom.VNode
import org.w3c.dom.events.MouseEvent
import pl.treksoft.kvision.core.ResString
import pl.treksoft.kvision.core.Widget
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
enum class BUTTONSTYLE(val className: String) {
DEFAULT("btn-default"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Image.kt b/src/main/kotlin/pl/treksoft/kvision/html/Image.kt
index 913735ef..38b8825a 100644
--- a/src/main/kotlin/pl/treksoft/kvision/html/Image.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/html/Image.kt
@@ -3,8 +3,8 @@ package pl.treksoft.kvision.html
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.ResString
import pl.treksoft.kvision.core.Widget
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
enum class IMAGESHAPE(val className: String) {
ROUNDED("img-rounded"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Link.kt b/src/main/kotlin/pl/treksoft/kvision/html/Link.kt
index c61e8a79..83f03676 100644
--- a/src/main/kotlin/pl/treksoft/kvision/html/Link.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/html/Link.kt
@@ -3,7 +3,7 @@ package pl.treksoft.kvision.html
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.ResString
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
open class Link(
label: String, url: String, icon: String? = null, image: ResString? = null,
diff --git a/src/main/kotlin/pl/treksoft/kvision/html/List.kt b/src/main/kotlin/pl/treksoft/kvision/html/List.kt
index eb006a33..c4aed749 100644
--- a/src/main/kotlin/pl/treksoft/kvision/html/List.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/html/List.kt
@@ -2,9 +2,9 @@ package pl.treksoft.kvision.html
import com.github.snabbdom.VNode
import com.github.snabbdom.h
-import pl.treksoft.kvision.core.KVManager
+import pl.treksoft.kvision.KVManager
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.core.StringBoolPair
enum class LIST(val tagName: String) {
UL("ul"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt b/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt
index d94505a8..11c935b2 100644
--- a/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/html/Tag.kt
@@ -1,9 +1,9 @@
package pl.treksoft.kvision.html
import com.github.snabbdom.VNode
-import pl.treksoft.kvision.core.KVManager
+import pl.treksoft.kvision.KVManager
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.core.StringBoolPair
@Suppress("EnumNaming")
enum class TAG(val tagName: String) {
diff --git a/src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt b/src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt
index b5f1a642..8751b03c 100644
--- a/src/main/kotlin/pl/treksoft/kvision/helpers/CloseIcon.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/modal/CloseIcon.kt
@@ -1,10 +1,10 @@
-package pl.treksoft.kvision.helpers
+package pl.treksoft.kvision.modal
import com.github.snabbdom.VNode
-import pl.treksoft.kvision.core.KVManager
+import pl.treksoft.kvision.KVManager
import pl.treksoft.kvision.core.Widget
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
open class CloseIcon(classes: Set<String> = setOf()) : Widget(classes) {
diff --git a/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt b/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt
index 2c83077a..b5c985b7 100644
--- a/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/modal/Modal.kt
@@ -2,16 +2,15 @@ package pl.treksoft.kvision.modal
import com.github.snabbdom.VNode
import pl.treksoft.kvision.core.Component
-import pl.treksoft.kvision.core.Root
import pl.treksoft.kvision.core.Widget
-import pl.treksoft.kvision.helpers.CloseIcon
import pl.treksoft.kvision.html.Button
import pl.treksoft.kvision.html.TAG
import pl.treksoft.kvision.html.Tag
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
-import pl.treksoft.kvision.snabbdom.StringPair
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
+import pl.treksoft.kvision.utils.obj
enum class MODALSIZE(val className: String) {
LARGE("modal-lg"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt
index 66f2d422..ad3522ea 100644
--- a/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt
@@ -3,7 +3,7 @@ package pl.treksoft.kvision.panel
import pl.treksoft.kvision.core.Component
import pl.treksoft.kvision.core.StyledComponent
import pl.treksoft.kvision.core.WidgetWrapper
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
import pl.treksoft.kvision.utils.px
enum class FLEXDIR(val dir: String) {
diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt
index 3b226102..549f7631 100644
--- a/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt
@@ -2,7 +2,7 @@ package pl.treksoft.kvision.panel
import pl.treksoft.kvision.core.Component
import pl.treksoft.kvision.core.WidgetWrapper
-import pl.treksoft.kvision.snabbdom.StringPair
+import pl.treksoft.kvision.core.StringPair
enum class GRIDJUSTIFY(val justify: String) {
START("start"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/core/Root.kt b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt
index 9d968874..88634bea 100644
--- a/src/main/kotlin/pl/treksoft/kvision/core/Root.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt
@@ -1,9 +1,9 @@
-package pl.treksoft.kvision.core
+package pl.treksoft.kvision.panel
import com.github.snabbdom.VNode
+import pl.treksoft.kvision.KVManager
import pl.treksoft.kvision.modal.Modal
-import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.snabbdom.StringBoolPair
+import pl.treksoft.kvision.core.StringBoolPair
class Root(id: String, private val fixed: Boolean = false) : SimplePanel() {
private val modals: MutableList<Modal> = mutableListOf()
diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt
index 722f60e6..10595a37 100644
--- a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt
@@ -7,7 +7,7 @@ import pl.treksoft.kvision.core.StyledComponent
import pl.treksoft.kvision.core.UNIT
import pl.treksoft.kvision.html.TAG
import pl.treksoft.kvision.html.Tag
-import pl.treksoft.kvision.snabbdom.obj
+import pl.treksoft.kvision.utils.obj
enum class DIRECTION(val dir: String) {
HORIZONTAL("horizontal"),
diff --git a/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt b/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt
index fab8643c..4c9aa98d 100644
--- a/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/routing/Routing.kt
@@ -2,6 +2,17 @@ package pl.treksoft.kvision.routing
import pl.treksoft.navigo.Navigo
-open class Routing : Navigo(null, true, "#!")
+open class Routing : Navigo(null, true, "#!") {
+
+ companion object {
+ fun start() {
+ routing = Routing()
+ }
+
+ fun shutdown() {
+ routing.destroy()
+ }
+ }
+}
var routing = Routing()
diff --git a/src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt b/src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt
index 0367633c..269fa6cb 100644
--- a/src/main/kotlin/pl/treksoft/kvision/snabbdom/Types.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/utils/Snabbdom.kt
@@ -1,4 +1,4 @@
-package pl.treksoft.kvision.snabbdom
+package pl.treksoft.kvision.utils
import com.github.snabbdom.Attrs
import com.github.snabbdom.Classes
@@ -10,6 +10,8 @@ import com.github.snabbdom.VNodeStyle
import org.w3c.dom.CustomEvent
import org.w3c.dom.CustomEventInit
import pl.treksoft.jquery.JQueryEventObject
+import pl.treksoft.kvision.core.StringBoolPair
+import pl.treksoft.kvision.core.StringPair
import pl.treksoft.kvision.core.Widget
external class Object
@@ -75,9 +77,6 @@ internal fun hooks(): Hooks {
return js("({})")
}
-typealias StringPair = Pair<String, String>
-typealias StringBoolPair = Pair<String, Boolean>
-
@Suppress("UnsafeCastFromDynamic")
fun snStyle(pairs: List<StringPair>): VNodeStyle {
return obj {
diff --git a/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt b/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt
index 80a7c482..7ba01135 100644
--- a/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt
+++ b/src/main/kotlin/pl/treksoft/kvision/utils/Utils.kt
@@ -2,8 +2,8 @@
package pl.treksoft.kvision.utils
+import pl.treksoft.kvision.KVManager
import pl.treksoft.kvision.core.CssSize
-import pl.treksoft.kvision.core.KVManager
import pl.treksoft.kvision.core.UNIT
import kotlin.js.Date
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/core/KVManagerSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/KVManagerSpec.kt
index 307ebd67..bbf3241f 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/core/KVManagerSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/KVManagerSpec.kt
@@ -1,11 +1,10 @@
-package test.pl.treksoft.kvision.core
+package test.pl.treksoft.kvision
import com.github.snabbdom.h
-import pl.treksoft.kvision.core.KVManager
-import pl.treksoft.kvision.snabbdom.snAttrs
-import pl.treksoft.kvision.snabbdom.snOpt
-import pl.treksoft.kvision.snabbdom.snStyle
-import test.pl.treksoft.kvision.DomSpec
+import pl.treksoft.kvision.KVManager
+import pl.treksoft.kvision.utils.snAttrs
+import pl.treksoft.kvision.utils.snOpt
+import pl.treksoft.kvision.utils.snStyle
import kotlin.browser.document
import kotlin.test.Test
import kotlin.test.assertTrue
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/TestUtil.kt b/src/test/kotlin/test/pl/treksoft/kvision/TestUtil.kt
index 808ca86d..a7e2e872 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/TestUtil.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/TestUtil.kt
@@ -2,7 +2,7 @@ package test.pl.treksoft.kvision
import org.w3c.dom.Element
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.core.Widget
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/core/ContainerSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/core/ContainerSpec.kt
index e0bc16da..923ec98f 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/core/ContainerSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/core/ContainerSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.core
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.panel.SimplePanel
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetSpec.kt
index 4e8c4ea1..8c0ec323 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.core
-import pl.treksoft.kvision.core.Root
import pl.treksoft.kvision.core.Widget
+import pl.treksoft.kvision.panel.Root
import test.pl.treksoft.kvision.WSpec
import kotlin.browser.document
import kotlin.test.Test
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetWrapperSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetWrapperSpec.kt
index 01aee755..0c686de0 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetWrapperSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/core/WidgetWrapperSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.core
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.core.UNIT
import pl.treksoft.kvision.core.Widget
import pl.treksoft.kvision.core.WidgetWrapper
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/data/DataContainerSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/data/DataContainerSpec.kt
index 20a1e484..9eb97115 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/data/DataContainerSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/data/DataContainerSpec.kt
@@ -2,7 +2,7 @@ package test.pl.treksoft.kvision.data
import com.lightningkite.kotlin.observable.list.observableListOf
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.data.BaseDataComponent
import pl.treksoft.kvision.data.DataContainer
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/dropdown/DropDownSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/dropdown/DropDownSpec.kt
index 41931abd..530cb941 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/dropdown/DropDownSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/dropdown/DropDownSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.dropdown
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.dropdown.DD
import pl.treksoft.kvision.dropdown.DropDown
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/FieldLabelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/FieldLabelSpec.kt
index fa206efd..99dd9ebe 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/FieldLabelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/FieldLabelSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.FieldLabel
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/HelpBlockSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/HelpBlockSpec.kt
index 1b8d2a6a..642e5f2b 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/HelpBlockSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/HelpBlockSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.HelpBlock
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckBoxSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckBoxSpec.kt
index e049aa17..04cbbff9 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckBoxSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckBoxSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.check
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.check.CHECKBOXSTYLE
import pl.treksoft.kvision.form.check.CheckBox
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckInputSpec.kt
index 584b1232..84ed59e2 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/check/CheckInputSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.check
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.check.CHECKINPUTTYPE
import pl.treksoft.kvision.form.check.CheckInput
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioGroupSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioGroupSpec.kt
index d301a533..638a887e 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioGroupSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioGroupSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.check
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.check.Radio
import pl.treksoft.kvision.form.check.RadioGroup
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioSpec.kt
index 6eedfd27..3826b3a8 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/check/RadioSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.check
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.check.RADIOSTYLE
import pl.treksoft.kvision.form.check.Radio
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectInputSpec.kt
index 28f9eb03..a191ba5d 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectInputSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.select
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.select.SELECTWIDTHTYPE
import pl.treksoft.kvision.form.select.SelectInput
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptGroupSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptGroupSpec.kt
index 8562d3cc..9de293ad 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptGroupSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptGroupSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.select
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.select.SelectOptGroup
import pl.treksoft.kvision.form.select.SelectOption
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptionSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptionSpec.kt
index 221d46b0..c7b314cd 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptionSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectOptionSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.select
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.select.SelectOption
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectSpec.kt
index 1afb6c79..b265b994 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/select/SelectSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.select
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.select.SELECTWIDTHTYPE
import pl.treksoft.kvision.form.select.Select
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerInputSpec.kt
index 8c90c684..acfce2c4 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerInputSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.spinner
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.spinner.SpinnerInput
import test.pl.treksoft.kvision.DomSpec
import kotlin.test.Test
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerSpec.kt
index 8a7a346b..7882b16c 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/spinner/SpinnerSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.spinner
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.spinner.Spinner
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/PasswordSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/PasswordSpec.kt
index 1cbb29cc..cc86061b 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/PasswordSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/PasswordSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.text
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.Password
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextInputSpec.kt
index 92e0e9ff..511898ee 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextInputSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.form.text
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.RichTextInput
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextSpec.kt
index 28ce2ee7..719453c9 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/RichTextSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.form.text
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.RichText
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaInputSpec.kt
index a27e959d..54eba437 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaInputSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.text
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.TextAreaInput
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaSpec.kt
index 8f9cf639..3207fe9d 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextAreaSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.text
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.TextArea
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextInputSpec.kt
index a3402c45..45861293 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextInputSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.text
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.TEXTINPUTTYPE
import pl.treksoft.kvision.form.text.TextInput
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextSpec.kt
index 77741f26..27e30c8c 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/text/TextSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.text
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.text.Text
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeInputSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeInputSpec.kt
index 909c4928..28916443 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeInputSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeInputSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.time
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.time.DateTimeInput
import pl.treksoft.kvision.utils.toStringF
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeSpec.kt
index 8ac43174..96cbf34e 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/form/time/DateTimeSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.form.time
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.form.time.DateTime
import pl.treksoft.kvision.utils.toStringF
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/html/ButtonSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/html/ButtonSpec.kt
index e81cec7b..39d53881 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/html/ButtonSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/html/ButtonSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.html
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.html.BUTTONSIZE
import pl.treksoft.kvision.html.BUTTONSTYLE
import pl.treksoft.kvision.html.Button
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/html/ImageSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/html/ImageSpec.kt
index 283847e8..f19fcd8a 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/html/ImageSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/html/ImageSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.html
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.html.IMAGESHAPE
import pl.treksoft.kvision.html.Image
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/html/LabelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/html/LabelSpec.kt
index 9c6c4e6e..2d83df63 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/html/LabelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/html/LabelSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.html
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.html.Label
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/html/LinkSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/html/LinkSpec.kt
index 0087f56a..7ab75809 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/html/LinkSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/html/LinkSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.html
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.html.Link
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/html/ListSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/html/ListSpec.kt
index bdf1ca0f..f3f093ed 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/html/ListSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/html/ListSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.html
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.html.LIST
import pl.treksoft.kvision.html.ListTag
import pl.treksoft.kvision.html.TAG
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/html/TagSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/html/TagSpec.kt
index 9840ff3e..88ce062a 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/html/TagSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/html/TagSpec.kt
@@ -1,6 +1,6 @@
package test.pl.treksoft.kvision.html
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.html.ALIGN
import pl.treksoft.kvision.html.Link
import pl.treksoft.kvision.html.TAG
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/modal/AlertSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/modal/AlertSpec.kt
index d34bbb2b..6582e33c 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/modal/AlertSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/modal/AlertSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.modal
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.modal.Alert
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/helpers/CloseIconSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/modal/CloseIconSpec.kt
index eb573d4f..275ceb6b 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/helpers/CloseIconSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/modal/CloseIconSpec.kt
@@ -1,7 +1,7 @@
-package test.pl.treksoft.kvision.helpers
+package test.pl.treksoft.kvision.modal
-import pl.treksoft.kvision.core.Root
-import pl.treksoft.kvision.helpers.CloseIcon
+import pl.treksoft.kvision.modal.CloseIcon
+import pl.treksoft.kvision.panel.Root
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
import kotlin.test.Test
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/modal/ConfirmSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/modal/ConfirmSpec.kt
index 06b71720..479d6418 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/modal/ConfirmSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/modal/ConfirmSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.modal
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.modal.Confirm
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/modal/ModalSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/modal/ModalSpec.kt
index 7bdd3562..efc449c7 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/modal/ModalSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/modal/ModalSpec.kt
@@ -1,8 +1,8 @@
package test.pl.treksoft.kvision.modal
import pl.treksoft.jquery.jQuery
-import pl.treksoft.kvision.core.Root
import pl.treksoft.kvision.modal.Modal
+import pl.treksoft.kvision.panel.Root
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
import kotlin.test.Test
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/DockPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/DockPanelSpec.kt
index c748a45c..2e63821b 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/DockPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/DockPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.DockPanel
import pl.treksoft.kvision.panel.SIDE
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/FlexPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/FlexPanelSpec.kt
index d79b06f9..a662bcbd 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/FlexPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/FlexPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.FLEXDIR
import pl.treksoft.kvision.panel.FLEXJUSTIFY
import pl.treksoft.kvision.panel.FlexPanel
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/GridPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/GridPanelSpec.kt
index 6590e0b0..3bbd0b95 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/GridPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/GridPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.GridPanel
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/HPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/HPanelSpec.kt
index a76c7eb0..f380d8e4 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/HPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/HPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.FLEXJUSTIFY
import pl.treksoft.kvision.panel.HPanel
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/ResponsiveGridPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/ResponsiveGridPanelSpec.kt
index d52fb3d7..c0343395 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/ResponsiveGridPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/ResponsiveGridPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.ResponsiveGridPanel
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/core/RootSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/RootSpec.kt
index 9895c16d..203bba8f 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/core/RootSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/RootSpec.kt
@@ -1,7 +1,7 @@
-package test.pl.treksoft.kvision.core
+package test.pl.treksoft.kvision.panel
-import pl.treksoft.kvision.core.Root
import pl.treksoft.kvision.modal.Modal
+import pl.treksoft.kvision.panel.Root
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
import kotlin.test.Test
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/SplitPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/SplitPanelSpec.kt
index 4be7f441..a6d1c4a3 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/SplitPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/SplitPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.DIRECTION
import pl.treksoft.kvision.panel.SplitPanel
import test.pl.treksoft.kvision.DomSpec
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/StackPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/StackPanelSpec.kt
index 51e4a3f2..3232a419 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/StackPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/StackPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.StackPanel
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/TabPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/TabPanelSpec.kt
index 4d1803b1..527f6297 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/TabPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/TabPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.TabPanel
import test.pl.treksoft.kvision.DomSpec
import kotlin.browser.document
diff --git a/src/test/kotlin/test/pl/treksoft/kvision/panel/VPanelSpec.kt b/src/test/kotlin/test/pl/treksoft/kvision/panel/VPanelSpec.kt
index ad8ceaac..ec52d753 100644
--- a/src/test/kotlin/test/pl/treksoft/kvision/panel/VPanelSpec.kt
+++ b/src/test/kotlin/test/pl/treksoft/kvision/panel/VPanelSpec.kt
@@ -1,7 +1,7 @@
package test.pl.treksoft.kvision.panel
import pl.treksoft.kvision.html.Label
-import pl.treksoft.kvision.core.Root
+import pl.treksoft.kvision.panel.Root
import pl.treksoft.kvision.panel.FLEXJUSTIFY
import pl.treksoft.kvision.panel.VPanel
import test.pl.treksoft.kvision.DomSpec