Upgrade to OPENRNDR 0.4 snapshot

This commit is contained in:
Edwin Jakobs
2021-06-22 11:08:07 +02:00
parent 579ddf9bb5
commit 9435907ef9
339 changed files with 460 additions and 497 deletions

1
orx-jvm/orx-rabbit-control/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.DS_Store

View File

@@ -0,0 +1,19 @@
# orx-rabbit-control
Automatically creates a remote UI to control your OPENRNDR program from a mobile device or a different computer. Alternative to `orx-gui`.
`orx-rabbit-control` uses `orx-parameters` annotations to generate a control interface, just like `orx-gui`.
<a href="http://rabbitcontrol.cc">
<img src="http://rabbitcontrol.cc/carrot-sketch-c-trans.png" width="50px">
</a>
For examples, check out the [demo](./src/demo/kotlin) folder.
### Using the web client
Go to [client.rabbitcontrol.cc](http://client.rabbitcontrol.cc) and enter your IP-address and port.
More Info about the web client: [rabbitcontrol.cc/apps/webclient/](http://rabbitcontrol.cc/apps/webclient/)

View File

@@ -0,0 +1,25 @@
sourceSets {
demo {
java {
srcDirs = ["src/demo/kotlin"]
compileClasspath += main.getCompileClasspath()
runtimeClasspath += main.getRuntimeClasspath()
}
}
}
dependencies {
api project(":orx-parameters")
api project(":orx-compositor")
api project(":orx-image-fit")
implementation "cc.rabbitcontrol:rcp:0.3.26"
implementation "com.google.zxing:core:3.4.0"
implementation "com.google.zxing:javase:3.4.0"
implementation "io.ktor:ktor-server-netty:1.3.2"
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output)
}

View File

@@ -0,0 +1,69 @@
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.loadFont
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.parameters.*
import org.openrndr.math.Vector2
import org.openrndr.math.Vector3
import org.openrndr.math.Vector4
suspend fun main() = application {
configure {
width = 800
height = 800
}
program {
// -- this block is for automation purposes only
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
val rabbit = RabbitControlServer()
val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0)
val settings = object {
@TextParameter("A string")
var s: String = "Hello"
@DoubleParameter("A double", 0.0, 10.0)
var d: Double = 10.0
@BooleanParameter("A bool")
var b: Boolean = true
@ColorParameter("A fill color")
var fill = ColorRGBa.PINK
@ColorParameter("A stroke color")
var stroke = ColorRGBa.WHITE
@Vector2Parameter("A vector2")
var v2 = Vector2(200.0,200.0)
@Vector3Parameter("A vector3")
var v3 = Vector3(200.0, 200.0, 200.0)
@Vector4Parameter("A vector4")
var v4 = Vector4(200.0, 200.0, 200.0, 200.0)
@ActionParameter("Action test")
fun clicked() {
println("Clicked from RabbitControl")
}
}
rabbit.add(settings)
extend(rabbit)
extend {
drawer.clear(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK)
drawer.fontMap = font
drawer.fill = settings.fill
drawer.stroke = settings.stroke
drawer.circle(settings.v2, settings.d)
drawer.text(settings.s, 10.0, 20.0)
}
}
}

View File

@@ -0,0 +1,53 @@
import org.openrndr.KEY_HOME
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.parameters.*
suspend fun main() = application {
configure {
width = 800
height = 800
}
program {
// -- this block is for automation purposes only
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
val rabbit = RabbitControlServer(showQRUntilClientConnects = false)
val settings = object {
@BooleanParameter("White on black")
var whiteOnBlack: Boolean = true
}
rabbit.add(settings)
extend(rabbit)
/**
* Example: only show the QR code when the [KEY_HOME] button is pressed
*/
keyboard.keyDown.listen {
when (it.key) {
KEY_HOME -> rabbit.showQRCode = true
}
}
keyboard.keyUp.listen {
when (it.key) {
KEY_HOME -> rabbit.showQRCode = false
}
}
extend {
drawer.clear(if (settings.whiteOnBlack) ColorRGBa.BLACK else ColorRGBa.WHITE)
drawer.fill = if (settings.whiteOnBlack) ColorRGBa.WHITE else ColorRGBa.BLACK
drawer.circle(drawer.bounds.center, 250.0)
}
}
}

View File

@@ -0,0 +1,76 @@
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.loadFont
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.parameters.*
import org.openrndr.math.Vector2
import org.openrndr.math.Vector3
import org.openrndr.math.Vector4
suspend fun main() = application {
configure {
width = 800
height = 800
}
program {
// -- this block is for automation purposes only
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
/**
* Start RabbitControlServer with a Rabbithole with key 'orxtest'
* Please visit https://rabbithole.rabbitcontrol.cc for more information.
*
* Rabbithole allows you to access your exposed parameter from the internet.
* To use it with this example just use 'orxtest' as tunnel-name on the main page.
*/
val rabbit = RabbitControlServer(false, 10000, 8080, "wss://rabbithole.rabbitcontrol.cc/public/rcpserver/connect?key=orxtest")
val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0)
val settings = object {
@TextParameter("A string")
var s: String = "Hello"
@DoubleParameter("A double", 0.0, 10.0)
var d: Double = 10.0
@BooleanParameter("A bool")
var b: Boolean = true
@ColorParameter("A fill color")
var fill = ColorRGBa.PINK
@ColorParameter("A stroke color")
var stroke = ColorRGBa.WHITE
@Vector2Parameter("A vector2")
var v2 = Vector2(200.0,200.0)
@Vector3Parameter("A vector3")
var v3 = Vector3(200.0, 200.0, 200.0)
@Vector4Parameter("A vector4")
var v4 = Vector4(200.0, 200.0, 200.0, 200.0)
@ActionParameter("Action test")
fun clicked() {
println("Clicked from RabbitControl")
}
}
rabbit.add(settings)
extend(rabbit)
extend {
drawer.clear(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK)
drawer.fontMap = font
drawer.fill = settings.fill
drawer.stroke = settings.stroke
drawer.circle(settings.v2, settings.d)
drawer.text(settings.s, 10.0, 20.0)
}
}
}

View File

@@ -0,0 +1,291 @@
import com.google.zxing.BarcodeFormat
import com.google.zxing.qrcode.QRCodeWriter
import io.ktor.http.content.resources
import io.ktor.http.content.static
import io.ktor.routing.routing
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import org.openrndr.Extension
import org.openrndr.Program
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.*
import org.openrndr.extra.compositor.*
import org.openrndr.extra.fx.blend.Darken
import org.openrndr.extra.parameters.Parameter
import org.openrndr.extra.parameters.ParameterType
import org.openrndr.extra.parameters.listParameters
import org.openrndr.extras.imageFit.FitMethod
import org.openrndr.extras.imageFit.imageFit
import org.openrndr.math.Vector2
import org.openrndr.math.Vector3
import org.openrndr.math.Vector4
import org.openrndr.math.mix
import org.rabbitcontrol.rcp.RCPServer
import org.rabbitcontrol.rcp.model.interfaces.IParameter
import org.rabbitcontrol.rcp.model.parameter.*
import org.rabbitcontrol.rcp.transport.websocket.server.RabbitHoleWsServerTransporterNetty
import org.rabbitcontrol.rcp.transport.websocket.server.WebsocketServerTransporterNetty
import java.awt.Color
import java.net.InetSocketAddress
import java.net.Socket
import java.net.URI
import java.net.URISyntaxException
import kotlin.reflect.KMutableProperty1
class RabbitControlServer(private val showQRUntilClientConnects: Boolean = true, rcpPort: Int =
10000, staticFilesPort: Int = 8080, rabbithole: String = "") : Extension {
private val rabbitServer = RCPServer()
private val transporter = WebsocketServerTransporterNetty()
private var rabbitholeTransporter: RabbitHoleWsServerTransporterNetty? = null
private var webServer: NettyApplicationEngine? = null
private var parameterMap = mutableMapOf<IParameter, Pair<Any, Parameter>>()
private var qrCodeImage: ColorBuffer? = null
private var qrOverlayComposition: Composite? = null
/**
* Animate the opacity to make it look smooooth
*/
private var currentOpacity = 0.0
private val targetOpacity: Double
get() = if (shouldShowQR) 0.8 else 0.0
private val shouldShowQR
get() = (rabbitServer.connectionCount == 0 && showQRUntilClientConnects) || showQRCode
/**
* Used to manually show and hide the QR code and override the default
* behaviour of (only) showing the code when no clients are connected
*/
var showQRCode = false
init {
rabbitServer.addTransporter(transporter)
transporter.bind(rcpPort)
/**
* add rabbithole transporter
*/
if (rabbithole.isNotEmpty()) {
try {
val rhlTransporter = RabbitHoleWsServerTransporterNetty(URI(rabbithole))
rabbitServer.addTransporter(rhlTransporter)
rhlTransporter.bind(0)
rabbitholeTransporter = rhlTransporter
} catch (e: URISyntaxException) {
//
println("invalid URI for rabbithole: $rabbithole")
}
}
/**
* Start KTOR to serve the static files of the RabbitControl client
*/
val server = embeddedServer(Netty, port = staticFilesPort) {
routing {
static("/rabbit-client") {
resources("rabbit-client")
}
}
}
server.start()
webServer = server
/**
* Print the address
*/
val socket = Socket()
socket.connect(InetSocketAddress("google.com", 80))
val ip = socket.localAddress.toString().replace("/", "")
val clientUrlWithHash = "http://$ip:$staticFilesPort/rabbit-client/index.html/#$ip:$rcpPort"
qrCodeImage = getQRCodeImage(barcodeText = clientUrlWithHash)
println("RabbitControl Web Client: $clientUrlWithHash")
/**
* Update the object when it has been updated in RabbitControl
*/
rabbitServer.setUpdateListener {
val (obj, orxParameter) = parameterMap[it]!!
when(it) {
is Int32Parameter -> {
val v = it.value
orxParameter.property.qset(obj, v)
}
is Float64Parameter -> {
val v = it.value
orxParameter.property.qset(obj, v)
}
is BooleanParameter -> {
val v = it.value
orxParameter.property.qset(obj, v)
}
is StringParameter -> {
val v = it.value
orxParameter.property.qset(obj, v)
}
is RGBAParameter -> {
val c = it.value
val cc = ColorRGBa(c.red.toDouble() / 255.0, c.green.toDouble() / 255.0, c.blue.toDouble() / 255.0, c.alpha.toDouble() / 255.0)
orxParameter.property.qset(obj, cc)
}
is Vector2Float32Parameter -> {
val v = it.value
orxParameter.property.qset(obj, Vector2(v.x.toDouble(), v.y.toDouble()))
}
is Vector3Float32Parameter -> {
val v = it.value
orxParameter.property.qset(obj, Vector3(v.x.toDouble(), v.y.toDouble(), v.z.toDouble()))
}
is Vector4Float32Parameter -> {
val v = it.value
orxParameter.property.qset(obj, Vector4(v.x.toDouble(), v.y.toDouble(), v.z.toDouble(), v.t.toDouble()))
}
}
}
}
override fun setup(program: Program) {
/**
* Creating the Composite for the overlay needs to happen in setup(),
* as we need access to [Program.drawer]
*/
qrOverlayComposition = compose {
layer {
draw {
program.drawer.isolated {
fill = ColorRGBa.WHITE.opacify(currentOpacity)
stroke = null
rectangle(0.0,0.0, width.toDouble(), height.toDouble())
}
}
layer {
blend(Darken()) {
clip = true
}
draw {
qrCodeImage?.let {
program.drawer.imageFit(it, program.width / 4.0,program.height / 4.0, program.width * .5, program.height * .5, 0.0,0.0, FitMethod.Contain)
}
}
}
}
}
}
@Suppress("UNCHECKED_CAST")
fun add(objectWithParameters: Any) {
val parameters = objectWithParameters.listParameters()
parameters.forEach {
val rabbitParam = when (it.parameterType) {
ParameterType.Int -> {
val param = rabbitServer.createInt32Parameter(it.label)
param.value = (it.property as KMutableProperty1<Any, Int>).get(objectWithParameters)
param
}
ParameterType.Double -> {
val param = rabbitServer.createFloat64Parameter(it.label)
param.value = (it.property as KMutableProperty1<Any, Double>).get(objectWithParameters)
param
}
ParameterType.Action -> {
val param = rabbitServer.createBangParameter(it.label)
param.setFunction {
it.function!!.call(objectWithParameters)
}
param
}
ParameterType.Boolean -> {
val param = rabbitServer.createBooleanParameter(it.label)
param.value = (it.property as KMutableProperty1<Any, Boolean>).get(objectWithParameters)
param
}
ParameterType.Text -> {
val param =rabbitServer.createStringParameter(it.label)
param.value = (it.property as KMutableProperty1<Any, String>).get(objectWithParameters)
param
}
ParameterType.Color -> {
val param = rabbitServer.createRGBAParameter(it.label)
val c = (it.property as KMutableProperty1<Any, ColorRGBa>).get(objectWithParameters)
param.value = Color(c.r.toFloat(), c.g.toFloat(), c.b.toFloat(), c.a.toFloat())
param
}
ParameterType.Vector2 -> {
val param = rabbitServer.createVector2Float32Parameter(it.label)
val v2 = (it.property as KMutableProperty1<Any, Vector2>).get(objectWithParameters)
param.value = org.rabbitcontrol.rcp.model.types.Vector2(v2.x.toFloat(), v2.y.toFloat())
param
}
ParameterType.Vector3 -> {
val param = rabbitServer.createVector3Float32Parameter(it.label)
val v3 = (it.property as KMutableProperty1<Any, Vector3>).get(objectWithParameters)
param.value = org.rabbitcontrol.rcp.model.types.Vector3(v3.x.toFloat(), v3.y.toFloat(), v3.z.toFloat())
param
}
ParameterType.Vector4 -> {
val param = rabbitServer.createVector4Float32Parameter(it.label)
val v4 = (it.property as KMutableProperty1<Any, Vector4>).get(objectWithParameters)
param.value = org.rabbitcontrol.rcp.model.types.Vector4(v4.x.toFloat(), v4.y.toFloat(), v4.z.toFloat(), v4.w.toFloat())
param
}
else -> rabbitServer.createBangParameter(it.label)
}
// We need to store a mapping from Rabbit parameter to target object + orx parameter
// so we can update the object later
parameterMap[rabbitParam] = Pair(objectWithParameters, it)
}
rabbitServer.update()
}
override var enabled = true
override fun shutdown(program: Program) {
transporter.dispose()
rabbitholeTransporter?.dispose()
webServer?.stop(0, 0)
}
private fun getQRCodeImage(barcodeText: String): ColorBuffer {
val qrCodeWriter = QRCodeWriter()
val bitMatrix = qrCodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 30, 30)
val cb = colorBuffer(bitMatrix.width, bitMatrix.height)
cb.filterMag = MagnifyingFilter.NEAREST
val shad = cb.shadow
for (y in 0 until bitMatrix.width) {
for (x in 0 until bitMatrix.height) {
shad[x, y] = if (bitMatrix[x, y]) ColorRGBa.BLACK else ColorRGBa.WHITE
}
}
shad.upload()
return cb
}
override fun afterDraw(drawer: Drawer, program: Program) {
currentOpacity = mix(targetOpacity, currentOpacity, 0.8)
// Don't draw if it isn't necessary
if (currentOpacity > 0.0) {
qrOverlayComposition?.draw(drawer)
}
}
}
fun <T> KMutableProperty1<out Any, Any?>?.qset(obj: Any, value: T) {
@Suppress("UNCHECKED_CAST")
return (this as KMutableProperty1<Any, T>).set(obj, value)
}

View File

@@ -0,0 +1,16 @@
{
"main.css": "./static/css/main.6b57d6a6.chunk.css",
"main.js": "./static/js/main.3c08e7ef.chunk.js",
"main.js.map": "./static/js/main.3c08e7ef.chunk.js.map",
"static/css/1.a970d4a6.chunk.css": "./static/css/1.a970d4a6.chunk.css",
"static/js/1.ab137fd1.chunk.js": "./static/js/1.ab137fd1.chunk.js",
"static/js/1.ab137fd1.chunk.js.map": "./static/js/1.ab137fd1.chunk.js.map",
"runtime~main.js": "./static/js/runtime~main.4a686d48.js",
"runtime~main.js.map": "./static/js/runtime~main.4a686d48.js.map",
"static/media/blueprint-icons.css": "./static/media/icons-20.cef8cdbb.woff",
"static/css/main.6b57d6a6.chunk.css.map": "./static/css/main.6b57d6a6.chunk.css.map",
"static/css/1.a970d4a6.chunk.css.map": "./static/css/1.a970d4a6.chunk.css.map",
"index.html": "./index.html",
"precache-manifest.8b50f7152eba97a8a3a748d36319a411.js": "./precache-manifest.8b50f7152eba97a8a3a748d36319a411.js",
"service-worker.js": "./service-worker.js"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><link rel="shortcut icon" href="./favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><link rel="manifest" href="./manifest.json"><title>RabbitControl Web Carrot</title><link href="./static/css/1.a970d4a6.chunk.css" rel="stylesheet"><link href="./static/css/main.6b57d6a6.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(l){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],f=0,i=[];f<n.length;f++)t=n[f],p[t]&&i.push(p[t][0]),p[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(l[r]=o[r]);for(s&&s(e);i.length;)i.shift()();return c.push.apply(c,u||[]),a()}function a(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==p[u]&&(n=!1)}n&&(c.splice(r--,1),e=f(f.s=t[0]))}return e}var t={},p={2:0},c=[];function f(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return l[e].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=l,f.c=t,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(r,e){if(1&e&&(r=f(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)f.d(t,n,function(e){return r[e]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="./";var r=window.webpackJsonp=window.webpackJsonp||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;a()}([])</script><script src="./static/js/1.ab137fd1.chunk.js"></script><script src="./static/js/main.3c08e7ef.chunk.js"></script></body></html>

View File

@@ -0,0 +1,15 @@
{
"short_name": "RCP Web Client",
"name": "RabbitControl Web Client",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View File

@@ -0,0 +1,50 @@
self.__precacheManifest = [
{
"revision": "3c08e7ef80fee0668771",
"url": "./static/css/main.6b57d6a6.chunk.css"
},
{
"revision": "3c08e7ef80fee0668771",
"url": "./static/js/main.3c08e7ef.chunk.js"
},
{
"revision": "ab137fd189140783fea3",
"url": "./static/css/1.a970d4a6.chunk.css"
},
{
"revision": "ab137fd189140783fea3",
"url": "./static/js/1.ab137fd1.chunk.js"
},
{
"revision": "4a686d48d5a089750c49",
"url": "./static/js/runtime~main.4a686d48.js"
},
{
"revision": "3cde8748332d1de6b1ae1c2dc5850754",
"url": "./static/media/icons-16.3cde8748.ttf"
},
{
"revision": "05f1cdadfe476395f60e233b15c22155",
"url": "./static/media/icons-16.05f1cdad.eot"
},
{
"revision": "3c1c220e7a18286503fb431c7a7fe183",
"url": "./static/media/icons-16.3c1c220e.woff"
},
{
"revision": "0a5c76518a68c185baa2c6744456918c",
"url": "./static/media/icons-20.0a5c7651.eot"
},
{
"revision": "51ec31f302d0072808e1f83f85fea4cd",
"url": "./static/media/icons-20.51ec31f3.ttf"
},
{
"revision": "cef8cdbb9d0ba82e6e19fb0eeba2ac3d",
"url": "./static/media/icons-20.cef8cdbb.woff"
},
{
"revision": "a84699318edf0b28678797d32740ca67",
"url": "./index.html"
}
];

View File

@@ -0,0 +1,34 @@
/**
* Welcome to your Workbox-powered service worker!
*
* You'll need to register this file in your web app and you should
* disable HTTP caching for this file too.
* See https://goo.gl/nhQhGp
*
* The rest of the code is auto-generated. Please don't update this file
* directly; instead, make changes to your Workbox build configuration
* and re-run your build process.
* See https://goo.gl/2aRDsh
*/
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");
importScripts(
"./precache-manifest.8b50f7152eba97a8a3a748d36319a411.js"
);
workbox.clientsClaim();
/**
* The workboxSW.precacheAndRoute() method efficiently caches and responds to
* requests for URLs in the manifest.
* See https://goo.gl/S9QRab
*/
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
workbox.routing.registerNavigationRoute("./index.html", {
blacklist: [/^\/_/,/\/[^/]+\.[^/]+$/],
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
body{margin:0;padding:0;font-family:sans-serif;background-color:#232a2f}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}.bp3-slider-handle:focus{outline:0}.App{text-align:left;margin:4px 4px -30px;display:flex;flex-direction:column;justify-content:center}.bp3-slider-label{transform:translateY(20px)}.bp3-slider-axis :nth-child(2),.bp3-slider-axis :nth-child(3){transform:translate(-100%,20px)}.bp3-slider-axis :nth-child(3){right:0 px}.bp3-slider-handle .bp3-slider-label{transform:translate(-50%,-20px)}.bp3-tab-list{flex-flow:row wrap}.bp3-overlay{pointer-events:none}.parameter-label{white-space:nowrap;color:grey;font-size:16;margin-bottom:4px}.parameter-wrapper{padding-top:4px;padding-bottom:0}.parameter-wrapper .inner{padding:5px;border-radius:4px}.rootgroup-wrapper{padding:0 5px 4px;border-radius:4px;border:1px solid #454545}.serverid{font-size:.8em;margin-top:5px;margin-left:2px}.credits{margin-top:20;margin-bottom:5;width:100%;text-align:center;font-size:.8em}
/*# sourceMappingURL=main.6b57d6a6.chunk.css.map */

View File

@@ -0,0 +1 @@
{"version":3,"sources":["/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/src/index.css","main.6b57d6a6.chunk.css","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/src/App.css"],"names":[],"mappings":"AAAA,KACE,SAAU,AACV,UAAW,AACX,uBAAwB,AAMxB,wBAAkC,CACnC,AAED,KACE,uEACY,CACb,AAED,GACE,cAAe,AACf,WAAY,AACZ,SAAU,AACV,0BAA2B,AAC3B,aAAc,AACd,SAAW,CACZ,AAED,yBACE,SAAW,CCCZ,AC5BD,KACE,gBAAiB,AAEjB,qBAAqB,AACrB,aAAc,AACd,sBAAuB,AACvB,sBAAwB,CACzB,AAGD,kBAEU,0BAA8B,CACvC,AAOD,8DAHU,+BAAiC,CAQ1C,AALD,+BAIE,UAAY,CACb,AAED,qCAEU,+BAAiC,CAC1C,AAED,cACE,kBAAoB,CACrB,AAED,aACE,mBAAqB,CACtB,AAGD,iBACE,mBAAoB,AACpB,WAAY,AACZ,aAAc,AACd,iBAAmB,CACpB,AAED,mBACE,gBAAiB,AACjB,gBAAoB,CACrB,AAED,0BACE,YAAa,AACb,iBAAmB,CACpB,AAED,mBAGE,kBAAoB,AACpB,kBAAmB,AACnB,wBAA0B,CAC3B,AAED,UACE,eAAiB,AACjB,eAAgB,AAChB,eAAiB,CAClB,AAED,SAEE,cAAe,AACf,gBAAiB,AACjB,WAAY,AACZ,kBAAmB,AACnB,cAAiB,CD0BlB","file":"main.6b57d6a6.chunk.css","sourcesContent":["body {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif; */\n /* -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; */\n background-color: rgb(35, 42, 47);\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\nhr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n padding: 0; \n}\n\n.bp3-slider-handle:focus {\n outline: 0;\n}","body {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif; */\n /* -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; */\n background-color: rgb(35, 42, 47);\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\nhr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n padding: 0; \n}\n\n.bp3-slider-handle:focus {\n outline: 0;\n}\n.App {\n text-align: left;\n margin: 4px;\n margin-bottom: -30px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n/* bluepring style overwrites*/\n.bp3-slider-label{\n transform:translate(0%, 20px);\n}\n\n.bp3-slider-axis :nth-child(2){\n transform:translate(-100%, 20px);\n}\n\n.bp3-slider-axis :nth-child(3){\n transform:translate(-100%, 20px);\n\n right: 0 px;\n}\n\n.bp3-slider-handle .bp3-slider-label{\n transform:translate(-50%, -20px);\n}\n\n.bp3-tab-list {\n flex-flow: row wrap;\n}\n\n.bp3-overlay {\n pointer-events: none;\n}\n\n/* gui styles */\n.parameter-label {\n white-space: nowrap;\n color: gray;\n font-size: 16; \n margin-bottom: 4px;\n}\n\n.parameter-wrapper {\n padding-top: 4px;\n padding-bottom: 0px; \n}\n\n.parameter-wrapper .inner{\n padding: 5px;\n border-radius: 4px;\n}\n\n.rootgroup-wrapper {\n padding: 5px;\n padding-top: 0px;\n padding-bottom: 4px;\n border-radius: 4px;\n border: 1px solid #454545;\n}\n\n.serverid {\n font-size: 0.8em;\n margin-top: 5px;\n margin-left: 2px;\n}\n\n.credits {\n font-size: 0.8em;\n margin-top: 20;\n margin-bottom: 5;\n width: 100%;\n text-align: center;\n font-size: 0.8em;\n}\n",".App {\n text-align: left;\n margin: 4px;\n margin-bottom: -30px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n/* bluepring style overwrites*/\n.bp3-slider-label{\n -webkit-transform:translate(0%, 20px);\n transform:translate(0%, 20px);\n}\n\n.bp3-slider-axis :nth-child(2){\n -webkit-transform:translate(-100%, 20px);\n transform:translate(-100%, 20px);\n}\n\n.bp3-slider-axis :nth-child(3){\n -webkit-transform:translate(-100%, 20px);\n transform:translate(-100%, 20px);\n\n right: 0 px;\n}\n\n.bp3-slider-handle .bp3-slider-label{\n -webkit-transform:translate(-50%, -20px);\n transform:translate(-50%, -20px);\n}\n\n.bp3-tab-list {\n flex-flow: row wrap;\n}\n\n.bp3-overlay {\n pointer-events: none;\n}\n\n/* gui styles */\n.parameter-label {\n white-space: nowrap;\n color: gray;\n font-size: 16; \n margin-bottom: 4px;\n}\n\n.parameter-wrapper {\n padding-top: 4px;\n padding-bottom: 0px; \n}\n\n.parameter-wrapper .inner{\n padding: 5px;\n border-radius: 4px;\n}\n\n.rootgroup-wrapper {\n padding: 5px;\n padding-top: 0px;\n padding-bottom: 4px;\n border-radius: 4px;\n border: 1px solid #454545;\n}\n\n.serverid {\n font-size: 0.8em;\n margin-top: 5px;\n margin-left: 2px;\n}\n\n.credits {\n font-size: 0.8em;\n margin-top: 20;\n margin-bottom: 5;\n width: 100%;\n text-align: center;\n font-size: 0.8em;\n}"]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
!function(e){function r(r){for(var n,f,i=r[0],l=r[1],a=r[2],c=0,s=[];c<i.length;c++)f=i[c],o[f]&&s.push(o[f][0]),o[f]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var l=t[i];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=f(f.s=t[0]))}return e}var n={},o={2:0},u=[];function f(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,f),t.l=!0,t.exports}f.m=e,f.c=n,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,r){if(1&r&&(e=f(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)f.d(t,n,function(r){return e[r]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="./";var i=window.webpackJsonp=window.webpackJsonp||[],l=i.push.bind(i);i.push=r,i=i.slice();for(var a=0;a<i.length;a++)r(i[a]);var p=l;t()}([]);
//# sourceMappingURL=runtime~main.4a686d48.js.map

File diff suppressed because one or more lines are too long