You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2020/07/05 14:21:11 UTC

[isis] 01/03: ISIS-2342 GeoMap extended by layers, multiple markers, fitMarkers, drag&drop exampe. Apache CopyRight notice added in touched files.

This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 51b9656c5f721e9b28066561cce09194c40f3de6
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Jul 1 13:40:03 2020 +0200

    ISIS-2342 GeoMap extended by layers, multiple markers, fitMarkers, drag&drop exampe. Apache CopyRight notice added in touched files.
---
 incubator/clients/kroviz/README.md                 |   8 --
 incubator/clients/kroviz/build.gradle.kts          |   2 +-
 incubator/clients/kroviz/docs/DevelopmentGuide.md  |  12 +++
 incubator/clients/kroviz/gradle.properties         |   2 +-
 .../kotlin/org/apache/isis/client/kroviz/App.kt    |   3 +-
 .../kroviz/core/aggregator/DiagramDispatcher.kt    |  22 +++-
 .../client/kroviz/core/event/RoXmlHttpRequest.kt   |  22 +++-
 .../apache/isis/client/kroviz/ui/ExportDialog.kt   |  22 +++-
 .../apache/isis/client/kroviz/ui/ImageDialog.kt    |   8 +-
 .../isis/client/kroviz/ui/builder/ColBuilder.kt    |  18 ++++
 .../isis/client/kroviz/ui/kv/ColumnFactory.kt      |  20 +++-
 .../apache/isis/client/kroviz/ui/kv/Constants.kt   |  23 ++++-
 .../isis/client/kroviz/ui/kv/EventLogTable.kt      |  20 +++-
 .../org/apache/isis/client/kroviz/ui/kv/GeoMap.kt  |  84 +++++++++++++--
 .../apache/isis/client/kroviz/ui/kv/MenuFactory.kt |  24 ++++-
 .../org/apache/isis/client/kroviz/ui/kv/RoApp.kt   |  23 ++++-
 .../apache/isis/client/kroviz/ui/kv/RoDialog.kt    |  10 +-
 .../apache/isis/client/kroviz/ui/kv/RoIconBar.kt   |  26 ++++-
 .../apache/isis/client/kroviz/ui/kv/RoMenuBar.kt   |  31 +++++-
 .../apache/isis/client/kroviz/ui/kv/RoStatusBar.kt |  10 +-
 .../apache/isis/client/kroviz/ui/kv/RoTabPanel.kt  |  22 +++-
 .../org/apache/isis/client/kroviz/ui/kv/RoTable.kt |  18 ++++
 .../org/apache/isis/client/kroviz/ui/kv/RoView.kt  |  26 ++++-
 .../org/apache/isis/client/kroviz/ui/kv/SvgMap.kt  | 113 +++++++++++++++++++++
 .../kroviz/utils/{DomHelper.kt => DomUtil.kt}      |  20 +++-
 .../apache/isis/client/kroviz/utils/IconManager.kt |   1 +
 .../client/kroviz/utils/ScalableVectorGraphic.kt   |   3 +-
 .../kroviz/src/main/resources/css/kroviz.css       |  61 ++++++++---
 28 files changed, 574 insertions(+), 80 deletions(-)

diff --git a/incubator/clients/kroviz/README.md b/incubator/clients/kroviz/README.md
index 5e64e78..0bdf615 100644
--- a/incubator/clients/kroviz/README.md
+++ b/incubator/clients/kroviz/README.md
@@ -2,10 +2,6 @@
 # kroviz 
 (to be pronounced: [krous]) is a viewer for [Restful Objects](http://www.restfulobjects.org) written in [Kotlin/JS](https://github.com/JetBrains/kotlin/tree/master/js), using [KVision](https://rjaros.github.io/kvision) for the UI part. 
 
-
-[![Build Status](https://travis-ci.com/joerg-rade/kroviz.svg?branch=master)](https://travis-ci.com/joerg-rade/kroviz.svg?branch=master)
-[![Coverage Status](https://coveralls.io/repos/github/joerg-rade/kroviz/badge.svg?branch=master)](https://coveralls.io/github/joerg-rade/kroviz?branch=master)
-[![License: Apache 2](https://img.shields.io/badge/license-Apache%202-blue)](https://opensource.org/licenses/Apache-2.0)
 ## About
 
 kroviz is a generic client for applications that implement the Restful Objects Specification, namely:
@@ -58,7 +54,3 @@ Contributions are welcome! Especially:
 * documentation improvements
 * feature requests
 * comments regarding usability
-
-The contribution workflow is analogous to that of Apache Isis (see: [Contributing](https://isis.apache.org/guides/dg/dg.html#_dg_contributing)), 
-except for issues use GitHub instead of JIRA.
-
diff --git a/incubator/clients/kroviz/build.gradle.kts b/incubator/clients/kroviz/build.gradle.kts
index 913f63c..ec68f5a 100644
--- a/incubator/clients/kroviz/build.gradle.kts
+++ b/incubator/clients/kroviz/build.gradle.kts
@@ -18,6 +18,7 @@ group = "org.apache.isis.client"
 
 repositories {
     mavenCentral()
+    mavenLocal()
     jcenter()
     maven { url = uri("https://dl.bintray.com/kotlin/kotlin-eap") }
     maven { url = uri("https://kotlin.bintray.com/kotlinx") }
@@ -30,7 +31,6 @@ repositories {
         }
     }
     maven { url = uri("https://dl.bintray.com/rjaros/kotlin") }
-    mavenLocal()
 }
 
 // Versions
diff --git a/incubator/clients/kroviz/docs/DevelopmentGuide.md b/incubator/clients/kroviz/docs/DevelopmentGuide.md
index 02da234..1919520 100644
--- a/incubator/clients/kroviz/docs/DevelopmentGuide.md
+++ b/incubator/clients/kroviz/docs/DevelopmentGuide.md
@@ -293,3 +293,15 @@ See: elp.kapowsoftware.com/9.4/index.jsp?topic=/doc/rm/JSONTerminology.html
  
  ### Solution 3:
  Incorporate kroviz.js eg. in the WAR containing your Apache Isis backend. 
+ 
+ # Extensions
+ 
+ ## OSM/Leaflet 
+ * 2.5D, buildings see https://osmbuildings.org/documentation/leaflet/
+ * Magnifying Glass
+ * Wikipedia markers
+ * Routing
+ 
+ ## Chart.js
+ 
+ *  SanKey diagarms, see CodePen example
diff --git a/incubator/clients/kroviz/gradle.properties b/incubator/clients/kroviz/gradle.properties
index 09d6f15..86aa7ed 100644
--- a/incubator/clients/kroviz/gradle.properties
+++ b/incubator/clients/kroviz/gradle.properties
@@ -3,4 +3,4 @@ javaVersion=1.8
 systemProp.kotlinVersion=1.3.72
 serializationVersion=0.20.0
 #Dependencies
-systemProp.kvisionVersion=3.10.1
+systemProp.kvisionVersion=3.10.2-SNAPSHOT
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt
index 0cb2ed0..0223ae6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/App.kt
@@ -1,5 +1,6 @@
 package org.apache.isis.client.kroviz
 
+import org.apache.isis.client.kroviz.ui.kv.RoApp
 import pl.treksoft.kvision.Application
 import pl.treksoft.kvision.pace.Pace
 import pl.treksoft.kvision.panel.root
@@ -19,7 +20,7 @@ class App : Application() {
         root("kroviz") {
             vPanel(spacing = 0) {
                 padding = 0.px
-                add(org.apache.isis.client.kroviz.ui.kv.RoApp)
+                add(RoApp)
             }
         }
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt
index 2ce0e7a..b678713 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DiagramDispatcher.kt
@@ -1,13 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.utils.DomHelper
+import org.apache.isis.client.kroviz.utils.DomUtil
 
 class DiagramDispatcher(private val uuid: String) : BaseAggregator() {
 
     override fun update(logEntry: LogEntry, subType: String) {
         val response = logEntry.response
-        DomHelper.appendTo(response, uuid)
+        DomUtil.appendTo(response, uuid)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
index e3e12d2..4430ff1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.core.event
 
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
@@ -77,8 +95,8 @@ class RoXmlHttpRequest {
 
         val xhr = XMLHttpRequest()
         xhr.open(method, url, true)
-        xhr.setRequestHeader("Content-Type", Constants.format)
-        xhr.setRequestHeader("Accept", "image/svg+xml")
+        xhr.setRequestHeader("Content-Type", Constants.stdMimeType)
+        xhr.setRequestHeader("Accept", Constants.svgMimeType)
 
         val reSpec = ResourceSpecification(url, Constants.subTypeXml)
         xhr.onload = { _ -> resultHandler(reSpec, xhr.responseText) }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ExportDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ExportDialog.kt
index 6256e79..bbcacbf 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ExportDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ExportDialog.kt
@@ -1,10 +1,28 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui
 
 import org.apache.isis.client.kroviz.core.event.EventState
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.ReplayEvent
 import org.apache.isis.client.kroviz.ui.kv.RoDialog
-import org.apache.isis.client.kroviz.utils.DomHelper
+import org.apache.isis.client.kroviz.utils.DomUtil
 import org.apache.isis.client.kroviz.utils.Utils
 
 class ExportDialog() :Command() {
@@ -43,7 +61,7 @@ class ExportDialog() :Command() {
     }
 
     override fun execute() {
-        DomHelper.download("ReplayEvents.json", jsonOutput)
+        DomUtil.download("ReplayEvents.json", jsonOutput)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt
index 87c82c5..931201b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/ImageDialog.kt
@@ -21,7 +21,7 @@ package org.apache.isis.client.kroviz.ui
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.ui.kv.RoDialog
 import org.apache.isis.client.kroviz.utils.Direction
-import org.apache.isis.client.kroviz.utils.DomHelper
+import org.apache.isis.client.kroviz.utils.DomUtil
 import org.apache.isis.client.kroviz.utils.ScalableVectorGraphic
 import org.apache.isis.client.kroviz.utils.UmlUtils
 
@@ -29,7 +29,7 @@ class ImageDialog(
         var label: String,
         private var pumlCode: String) : Command() {
 
-    private val uuid: String = DomHelper.uuid()
+    private val uuid: String = DomUtil.uuid()
     private var dialog: RoDialog
     private val formItems = mutableListOf<FormItem>()
 
@@ -50,14 +50,14 @@ class ImageDialog(
     }
 
     fun scale(direction: Direction) {
-        val oldElement = DomHelper.getById(uuid)!!
+        val oldElement = DomUtil.getById(uuid)!!
         val oldStr = oldElement.innerHTML
         val newImage = ScalableVectorGraphic(oldStr)
         when (direction) {
             Direction.UP -> newImage.scaleUp()
             Direction.DOWN -> newImage.scaleDown()
         }
-        DomHelper.replaceWith(uuid, newImage)
+        DomUtil.replaceWith(uuid, newImage)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
index 2334638..d901382 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/builder/ColBuilder.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.builder
 
 import org.apache.isis.client.kroviz.to.TObject
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/ColumnFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/ColumnFactory.kt
index d3e13f0..0718073 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/ColumnFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/ColumnFactory.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.core.event.EventStore
@@ -83,7 +101,7 @@ class ColumnFactory {
             UiManager.displayModel(tObject)
         }
         val logEntry = EventStore.find(tObject)!!
-        b.setDragDropData(Constants.format, logEntry.url)
+        b.setDragDropData(Constants.stdMimeType, logEntry.url)
         return b
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/Constants.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/Constants.kt
index ad898e8..de40b39 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/Constants.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/Constants.kt
@@ -1,9 +1,28 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 object Constants {
 
-    const val format = "text/plain"
-    const val calcHeight = "calc(100vh - 128px)"
+    const val stdMimeType = "text/plain"
+    const val svgMimeType = "image/svg+xml"
+    const val calcHeight = "calc(100vh - 88px)"
     const val actionSeparator = "\n"
     const val subTypeJson = "json"
     const val subTypeXml = "xml"
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt
index 9e5fa0d..e702fb9 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/EventLogTable.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
@@ -66,7 +84,7 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() {
                 style = ButtonStyle.LINK).onClick {
             console.log(data)
         }
-        if (data.obj is TObject) b.setDragDropData(Constants.format, data.url)
+        if (data.obj is TObject) b.setDragDropData(Constants.stdMimeType, data.url)
         return b
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/GeoMap.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/GeoMap.kt
index 933e7db..7b026c2 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/GeoMap.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/GeoMap.kt
@@ -1,18 +1,88 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
+import org.apache.isis.client.kroviz.utils.IconManager
+import pl.treksoft.kvision.core.CssSize
+import pl.treksoft.kvision.core.UNIT
+import pl.treksoft.kvision.html.Button
+import pl.treksoft.kvision.html.ButtonStyle
+import pl.treksoft.kvision.maps.LatLng
 import pl.treksoft.kvision.maps.maps
-import pl.treksoft.kvision.panel.SimplePanel
+import pl.treksoft.kvision.panel.HPanel
 import pl.treksoft.kvision.utils.pc
-import pl.treksoft.kvision.utils.vh
 
-// see -> kvision-kvision-maps.js
-// for 2.5D, buildings see https://osmbuildings.org/documentation/leaflet/
-class GeoMap : SimplePanel() {
+/**
+ * Sample to be called from RoMenuBar
+ */
+class GeoMap : HPanel() {
 
     init {
-        maps(53.65425, 10.1545, 15) {
+        val m = maps(53.65425, 10.1545, 15) {
             width = 100.pc
-            height = 89.vh
+            height = 100.pc
+        }
+
+        val home = LatLng(53.65425, 10.1545)
+        m.addMarker(home, "Home")
+
+        val office = LatLng(53.5403735, 10.0008355)
+        m.addMarker(office, "Work<br><a href='https://en.wikipedia.org/wiki/Kuehne_%2B_Nagel'>KN</a>")
+
+        val reha = LatLng(53.6824359, 10.7661037)
+        m.addMarker(reha)
+
+        RoIconBar.add(createLocationIcon())
+
+        setDropTargetData(Constants.stdMimeType) { id ->
+            val mrk = parseMarker(id!!)
+            if (mrk != null) m.addMarker(mrk.latLng, mrk.title)
         }
     }
+
+    private fun createLocationIcon(): Button {
+        val loc = Button(
+                text = "",
+                icon = IconManager.find("Location"),
+                style = ButtonStyle.LIGHT).apply {
+            padding = CssSize(-16, UNIT.px)
+            margin = CssSize(0, UNIT.px)
+            title = "Drag icon to map"
+        }
+        val location = "52.36393568#4.90446422#Zoku"
+        loc.setDragDropData(Constants.stdMimeType, location)
+        return loc
+    }
+
+
+
+    private fun parseMarker(id: String): Marker? {
+        val raw = id.split("#")
+        if (raw.isNotEmpty()) {
+            val lat = raw[0].toDouble()
+            val lng = raw[1].toDouble()
+            val latLng = LatLng(lat, lng)
+            val title = if (raw.size >= 2) raw[2] else "no title set"
+            return Marker(latLng, title)
+        } else return null
+    }
+
+    class Marker(val latLng: LatLng, val title: String)
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/MenuFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/MenuFactory.kt
index 806eb9f..9c5c16c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/MenuFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/MenuFactory.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.core.aggregator.ActionDispatcher
@@ -54,7 +72,7 @@ object MenuFactory {
                 style = style,
                 classes = classes,
                 forNavbar = false)
-        //dd.setDragDropData(Constants.format, menuTitle)
+        //dd.setDragDropData(Constants.stdMimeType, menuTitle)
         // action.setDragDropData gets always overridden by dd.setDragDropData
         menu.section.forEachIndexed { index, section ->
             section.serviceAction.forEach { sa ->
@@ -62,7 +80,7 @@ object MenuFactory {
                 action.onClick {
                     ActionDispatcher().invoke(sa.link!!)
                 }
-                action.setDragDropData(Constants.format, action.id!!)
+                action.setDragDropData(Constants.stdMimeType, action.id!!)
                 dd.add(action)
             }
             if (index < menu.section.size - 1) {
@@ -121,7 +139,7 @@ object MenuFactory {
                 icon = IconManager.find(label),
                 classes = IconManager.findStyleFor(label))
         val id = "$menuTitle${Constants.actionSeparator}$actionTitle"
-        actionLink.setDragDropData(Constants.format, id)
+        actionLink.setDragDropData(Constants.stdMimeType, id)
         actionLink.id = id
         return actionLink
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoApp.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoApp.kt
index 85fe59c..bb04a8e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoApp.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoApp.kt
@@ -1,13 +1,34 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import pl.treksoft.kvision.panel.HPanel
 import pl.treksoft.kvision.panel.SimplePanel
+import pl.treksoft.kvision.utils.pc
 
 object RoApp : SimplePanel() {
     init {
         this.add(RoMenuBar.navbar)
 
-        val view = HPanel()
+        val view = HPanel(classes = setOf("main")) {
+            width = 100.pc
+        }
         view.add(RoIconBar.panel)
         view.add(RoView.tabPanel)
         this.add(view)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
index 087de98..2210380 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
@@ -36,7 +36,6 @@ import pl.treksoft.kvision.panel.FlexJustify
 import pl.treksoft.kvision.panel.HPanel
 import pl.treksoft.kvision.panel.vPanel
 import pl.treksoft.kvision.utils.perc
-import pl.treksoft.kvision.utils.px
 
 class RoDialog(
         caption: String,
@@ -95,12 +94,9 @@ class RoDialog(
 
             add(formPanel!!, grow = 2)
 
-            val buttonBar = HPanel(spacing = 10) {
-                id = "button-bar"
-                marginTop = 10.px
-                marginLeft = 10.px
-                marginBottom = 12.px
-            }
+            val buttonBar = HPanel(
+                    spacing = 10,
+                    classes = setOf("button-bar"))
             buttonBar.add(okButton)
             buttonBar.add(cancelButton)
             if (items.isNotEmpty() && hasScalableContent()) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoIconBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoIconBar.kt
index 77dbf9e..c626d84 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoIconBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoIconBar.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.core.event.EventStore
@@ -27,7 +45,7 @@ object RoIconBar : SimplePanel() {
         panel.addCssClass("icon-bar")
         panel.title = "Drop objects, factories, or actions here"
         this.add(createDeleteIcon())
-        panel.setDropTargetData(Constants.format) { id ->
+        panel.setDropTargetData(Constants.stdMimeType) { id ->
             when {
                 Utils.isUrl(id!!) ->
                     this.add(createObjectIcon(id)!!)
@@ -40,7 +58,7 @@ object RoIconBar : SimplePanel() {
         hide()
     }
 
-    private fun add(icon: SimplePanel) {
+    fun add(icon: SimplePanel) {
         icons.add(icon)
         panel.add(icon)
     }
@@ -70,7 +88,7 @@ object RoIconBar : SimplePanel() {
             margin = CssSize(0, UNIT.px)
             title = "Drop icon here in order to remove it"
         }
-        del.setDropTargetData(Constants.format) {
+        del.setDropTargetData(Constants.stdMimeType) {
             icons.forEach { ii ->
                 if (ii.id == it) {
                     icons.remove(ii)
@@ -124,7 +142,7 @@ object RoIconBar : SimplePanel() {
                          cssClass: String,
                          btnId: String)
             : SimplePanel {
-        icon.setDragDropData(Constants.format, id)
+        icon.setDragDropData(Constants.stdMimeType, id)
         icon.id = id
         icon.title = title
         icon.addCssClass(cssClass)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoMenuBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoMenuBar.kt
index 33e3e11..ed0201c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoMenuBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoMenuBar.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.core.event.EventStore
@@ -79,11 +97,18 @@ object RoMenuBar : SimplePanel() {
                 UiManager.add(chartTitle, ChartFactory().build())
             }
 
-            val mapTitle = "Sample Map"
-            ddLink(mapTitle,
+            val geoMapTitle = "Geo Map"
+            ddLink(geoMapTitle,
                     icon = IconManager.find("Map")
             ).onClick {
-                UiManager.add(mapTitle, GeoMap())
+                UiManager.add(geoMapTitle, GeoMap())
+            }
+
+            val svgMapTitle = "Sample SVG Map"
+            ddLink(svgMapTitle,
+                    icon = IconManager.find("Diagram")
+            ).onClick {
+                UiManager.add(svgMapTitle, SvgMap())
             }
         }
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoStatusBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoStatusBar.kt
index 908d98c..cc17cb2 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoStatusBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoStatusBar.kt
@@ -4,9 +4,9 @@ import org.apache.isis.client.kroviz.core.event.EventState
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.model.DiagramDM
 import org.apache.isis.client.kroviz.ui.ClassDiagram
-import org.apache.isis.client.kroviz.utils.IconManager
 import org.apache.isis.client.kroviz.ui.ImageDialog
 import org.apache.isis.client.kroviz.ui.NotificationDialog
+import org.apache.isis.client.kroviz.utils.IconManager
 import pl.treksoft.kvision.core.*
 import pl.treksoft.kvision.html.Button
 import pl.treksoft.kvision.html.ButtonStyle
@@ -16,11 +16,9 @@ import pl.treksoft.kvision.navbar.NavbarType
 import pl.treksoft.kvision.panel.SimplePanel
 
 object RoStatusBar {
-    val navbar = Navbar(type = NavbarType.FIXEDBOTTOM) {
-        height = CssSize(8, UNIT.mm)
-        minHeight = CssSize(8, UNIT.mm)
-        width = CssSize(100, UNIT.perc)
-    }
+    val navbar = Navbar(
+            type = NavbarType.FIXEDBOTTOM,
+            classes = setOf("status-bar"))
     private val nav = Nav(rightAlign = true)
     private val userBtn: Button = buildButton("", "Me", ButtonStyle.OUTLINEWARNING)
     private val umlDiagram = buildButton("", "Diagram", ButtonStyle.OUTLINEWARNING)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTabPanel.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTabPanel.kt
index 9f3bfe0..8a7c71e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTabPanel.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTabPanel.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import pl.treksoft.kvision.core.CssSize
@@ -5,11 +23,13 @@ import pl.treksoft.kvision.core.UNIT
 import pl.treksoft.kvision.panel.SimplePanel
 import pl.treksoft.kvision.panel.TabPanel
 import pl.treksoft.kvision.panel.VPanel
+import pl.treksoft.kvision.utils.pc
 
 class RoTabPanel : TabPanel() {
 
     init {
-        this.width = CssSize(100, UNIT.perc)
+        width = 100.pc
+        marginTop = CssSize(40, UNIT.px)
     }
 
     override fun removeTab(index: Int): TabPanel {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTable.kt
index 356f0cb..2af92e3 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTable.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoTable.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.core.model.Exposer
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoView.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoView.kt
index b51b229..cd32a32 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoView.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoView.kt
@@ -1,7 +1,27 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.kv
 
 import org.apache.isis.client.kroviz.utils.IconManager
-import pl.treksoft.kvision.core.*
+import pl.treksoft.kvision.core.BsBorder
+import pl.treksoft.kvision.core.Component
+import pl.treksoft.kvision.core.addBsBorder
 import pl.treksoft.kvision.panel.SimplePanel
 
 /**
@@ -13,10 +33,6 @@ object RoView {
     val tabPanel = RoTabPanel()
     private var tabCount = 0
 
-    init {
-        tabPanel.marginTop = CssSize(40, UNIT.px)
-    }
-
     fun addTab(
             title: String,
             panel: Component) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/SvgMap.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/SvgMap.kt
new file mode 100644
index 0000000..59ddef7
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/SvgMap.kt
@@ -0,0 +1,113 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.client.kroviz.ui.kv
+
+import org.apache.isis.client.kroviz.utils.ScalableVectorGraphic
+import pl.treksoft.kvision.maps.*
+import pl.treksoft.kvision.panel.SimplePanel
+import pl.treksoft.kvision.utils.pc
+
+class SvgMap : SimplePanel() {
+
+    @Deprecated("pass in as arg")
+    val str = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" contentScriptType="application/ecmascript" contentStyleType="text/css"
+     height="203px" preserveAspectRatio="none" style="width:309px;height:203px;" version="1.1" viewBox="0 0 309 203"
+     width="309px" zoomAndPan="magnify">
+    <defs>
+        <filter height="300%" id="f1xj00ih3jrk7f" width="300%" x="-1" y="-1">
+            <feGaussianBlur result="blurOut" stdDeviation="2.0"/>
+            <feColorMatrix in="blurOut" result="blurOut2" type="matrix"
+                           values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/>
+            <feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/>
+            <feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/>
+        </filter>
+    </defs>
+    <g><!--MD5=[f621a9b5735c62a9e50fa7c1e42ea0f4]↵cluster domainapp.modules.simple.dom.impl-->
+        <polygon fill="#FFFFFF" filter="url(#f1xj00ih3jrk7f)"
+                 points="14,16,277,16,284,38.7999,287,38.7999,287,191,14,191,14,16"
+                 style="stroke: #000000; stroke-width: 1.5;"/>
+        <line style="stroke: #000000; stroke-width: 1.5;" x1="14" x2="284" y1="38.7999" y2="38.7999"/>
+        <text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs"
+              textLength="257" x="18" y="31.9999">domainapp.modules.simple.dom.impl
+        </text><!--MD5=[e6e8857f289496579330543e748c2106]↵class SimpleObject-->
+        <rect fill="#FEFECE" filter="url(#f1xj00ih3jrk7f)" height="140.3993" id="SimpleObject"
+              style="stroke: #A80036; stroke-width: 1.5;" width="129" x="85.5" y="43"/>
+        <ellipse cx="112.2" cy="59" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/>
+        <path d="M111.5594,62.7813 Q112.3563,62.7813 112.9266,62.5859 Q113.4969,62.3906 113.7391,62.1641 Q113.9813,61.9375 114.2234,61.7422 Q114.4656,61.5469 114.6844,61.5469 Q115.0281,61.5469 115.2859,61.8047 Q115.5438,62.0625 115.5438,62.3906 Q115.5438,63.125 114.3797,63.8047 Q113.2156,64.4844 111.5125,64.4844 Q109.3563,64.4844 107.9344,63.2188 Q106.5125,61.9531 106.5125,60.0156 L106.5125,58.8906 Q106.5125,56.8594 107.8406,55.4766 Q109.1688,54.0938 111.1375,54.0938 Q112.325,54.0938 113 [...]
+        <text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="71"
+              x="128.8" y="63.8">SimpleObject
+        </text>
+        <line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="213.5" y1="75" y2="75"/>
+        <line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="213.5" y1="83" y2="83"/>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93"
+              x="91.5" y="97.9999">rebuildMetamodel()
+        </text>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="117"
+              x="91.5" y="111.1998">downloadJdoMetadata()
+        </text>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69"
+              x="91.5" y="124.3997">openRestApi()
+        </text>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="104"
+              x="91.5" y="137.5996">downloadLayoutXml()
+        </text>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="37"
+              x="91.5" y="150.7995">delete()
+        </text>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70"
+              x="91.5" y="163.9994">updateName()
+        </text>
+        <text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56"
+              x="91.5" y="177.1993">clearHints()
+        </text><!--MD5=[903507c5920b0ecb2f83cd94e1c42ae5]↵@startuml
+↵package domainapp.modules.simple.dom.impl {
+↵class SimpleObject
+↵SimpleObject : rebuildMetamodel()
+↵SimpleObject : downloadJdoMetadata()
+↵SimpleObject : openRestApi()
+↵SimpleObject : downloadLayoutXml()
+↵SimpleObject : delete()
+↵SimpleObject : updateName()
+↵SimpleObject : clearHints()
+↵}
+↵@enduml
+↵↵PlantUML version 1.2020.04(Thu Mar 19 10:16:49 GMT 2020)↵(GPL source distribution)↵Java Runtime: OpenJDK Runtime Environment↵JVM: OpenJDK 64-Bit Server VM↵Java Version: 1.8.0_191-b12↵Operating System: Linux↵Default Encoding: UTF-8↵Language: en↵Country: US↵-->
+    </g>
+</svg>
+"""
+
+    init {
+        // 0 0 is in the Atlantic Ocean, south of 'towel states' -> blue background
+        val map = maps(0, 0, 11, baseLayerProvider = BaseLayerProvider.EMPTY, crs = CRS.Simple) {
+            width = 100.pc
+            height = 100.pc
+        }
+
+        val svg = ScalableVectorGraphic(str)
+        val svgDoc = svg.document
+        val svgElement = svgDoc.documentElement!!
+
+        val bounds = LatLngBounds(
+                LatLng(0, 0),
+                LatLng(0.1, 0.1))
+        map.svgOverlay(svgElement, bounds)
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomUtil.kt
similarity index 70%
rename from incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt
rename to incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomUtil.kt
index 2aa79ee..a13a190 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomHelper.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/DomUtil.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.utils
 
 import org.w3c.dom.Element
@@ -9,7 +27,7 @@ external fun encodeURIComponent(encodedURI: String): String
 /**
  * Dom ^= Document Object Model
  */
-object DomHelper {
+object DomUtil {
 
     fun appendTo(response: String, elementId: String) {
         val svgDoc = ScalableVectorGraphic(response).document
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
index eb12228..7bb0f74 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
@@ -39,6 +39,7 @@ object IconManager {
             "Isis" to "ankh",
             "JEE/CDI" to "jedi",
             "List" to "list",
+            "Location" to "map-marker",
             "Log" to "history",
             "Manager" to "manager",
             "Map" to "map",
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
index c22ef59..5ea33f8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/ScalableVectorGraphic.kt
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.client.kroviz.utils
 
+import org.apache.isis.client.kroviz.ui.kv.Constants
 import org.w3c.dom.Document
 import org.w3c.dom.parsing.DOMParser
 import org.w3c.dom.svg.SVGSVGElement
@@ -29,7 +30,7 @@ enum class Direction(val id: String) {
 
 class ScalableVectorGraphic(val data: String) {
 
-    var document: Document = DOMParser().parseFromString(data, "image/svg+xml")
+    var document: Document = DOMParser().parseFromString(data, Constants.svgMimeType)
     private var root: SVGSVGElement
     lateinit var viewBox: ViewBox
     private var scale: Double = 1.0
diff --git a/incubator/clients/kroviz/src/main/resources/css/kroviz.css b/incubator/clients/kroviz/src/main/resources/css/kroviz.css
index b2e24ed..0035168 100644
--- a/incubator/clients/kroviz/src/main/resources/css/kroviz.css
+++ b/incubator/clients/kroviz/src/main/resources/css/kroviz.css
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 .navbar {
     min-height: 24px;
     height: 24px;
@@ -36,7 +54,7 @@ div.tabulator-cell {
     height: 35px;
 }
 
-div.tabulator-header {
+div.tabulator-header, label.control-label {
     font-weight: lighter !important;
     font-size: small !important;
 }
@@ -65,11 +83,6 @@ div.tabulator-header {
     padding: 4px 12px !important;
 }
 
-label.control-label {
-    font-weight: lighter !important;
-    font-size: small !important;
-}
-
 pre.highlight {
     margin: 7px 0;
     padding: 14px;
@@ -82,7 +95,7 @@ pre.highlight {
 
 .panel-heading {
     padding: 3px 15px;
-    display: flex;
+    width: 100%;
     align-items: center;
     justify-content: space-between;
     min-height: 3em;
@@ -110,11 +123,14 @@ textarea {
 .button-bar {
     display: flex;
     align-self: baseline !important;
+    margin-top: 10px;
+    margin-left: 10px;
+    margin-bottom: 12px;
 }
 
 @font-face {
     font-family: Chicago;
-    src: url('/fonts/ChicagoFLF.ttf');
+    src: url('../fonts/ChicagoFLF.ttf');
 }
 
 div {
@@ -131,16 +147,10 @@ div {
     background-position: center center;
     background-repeat: no-repeat;
     background-size: contain, cover;
+    /*background-image: url(/img/kroviz-logo.svg);*/
     background-image: url("https://svn.apache.org/repos/asf/comdev/project-logos/originals/isis.svg");
 }
 
-/*background-image: url("https://www.apache.org/img/ASF20thAnniversary.jpg");*/
-/*background-image: url(https://www.apache.org/logos/res/isis/isis.png);*/
-/*background-image: url(/img/kroviz-logo.svg);*/
-/*background-image: url(https://upload.wikimedia.org/wikipedia/commons/b/b9/SVG_animation_using_SMIL.svg)
-https://svn.apache.org/repos/asf/comdev/project-logos/originals/isis.svg
-*/
-
 .kv-window {
     /* background-color: rgba(255,255,255, 0) !important;*/
 }
@@ -162,7 +172,26 @@ https://svn.apache.org/repos/asf/comdev/project-logos/originals/isis.svg
 .icon-bar {
     margin-top: 40px;
     width: 40px;
-    height: calc(100vh - 80px);
+    height: calc(100vh - 88px);
     scroll-behavior: auto;
     background: GHOSTWHITE;
 }
+
+.status-bar {
+    height: 34px;
+    width: 100%;
+    padding-left: 0 !important;
+    padding-right: 0 !important;
+}
+
+html {
+    overflow: hidden;
+}
+
+.leaflet-container {
+    height: calc(100vh - 88px) !important;
+}
+
+.nav .nav-tabs {
+    width: 100% !important;
+}