diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..ccf65b4
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/sdpi.css linguist-vendored
diff --git a/.gitignore b/.gitignore
index 3f3f0e6..8b9b576 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
node_modules
/build
/.svelte-kit
-/src-tauri/target
+**/target
/src-tauri/gen
.env
.env.*
diff --git a/.gitmodules b/.gitmodules
index 749d4fd..e69de29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "plugins/com.amansprojects.starterpack.sdPlugin"]
- path = plugins/com.amansprojects.starterpack.sdPlugin
- url = https://github.com/nekename/opendeck-starterpack.git
diff --git a/deno.json b/deno.json
index 8403c23..b03e811 100644
--- a/deno.json
+++ b/deno.json
@@ -1,6 +1,6 @@
{
"fmt": {
- "exclude": ["src-tauri/", "plugins/", "*.md"],
+ "exclude": ["src-tauri/", "*.md"],
"useTabs": true,
"lineWidth": 200
},
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin b/plugins/com.amansprojects.starterpack.sdPlugin
deleted file mode 160000
index 7bc1110..0000000
--- a/plugins/com.amansprojects.starterpack.sdPlugin
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7bc111010245a4e361eb79bf833ec8e5df2aa25a
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/Cargo.lock b/plugins/com.amansprojects.starterpack.sdPlugin/Cargo.lock
new file mode 100644
index 0000000..c1d00b3
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/Cargo.lock
@@ -0,0 +1,1258 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "addr2line"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler2"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+
+[[package]]
+name = "anyhow"
+version = "1.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
+
+[[package]]
+name = "autocfg"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+[[package]]
+name = "backtrace"
+version = "0.3.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
+dependencies = [
+ "addr2line",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "base64"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+
+[[package]]
+name = "bitflags"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block2"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "bytes"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "core-foundation"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "core-graphics"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "libc",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
+
+[[package]]
+name = "deranged"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
+dependencies = [
+ "powerfmt",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "enigo"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cf6f550bbbdd5fe66f39d429cb2604bcdacbf00dca0f5bbe2e9306a0009b7c6"
+dependencies = [
+ "core-foundation",
+ "core-graphics",
+ "foreign-types-shared",
+ "libc",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "serde",
+ "windows",
+ "x11rb",
+ "xkbcommon",
+ "xkeysym",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18"
+dependencies = [
+ "libc",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
+dependencies = [
+ "foreign-types-macros",
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-macros"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
+
+[[package]]
+name = "futures-core"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
+
+[[package]]
+name = "futures-task"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
+
+[[package]]
+name = "futures-util"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
+dependencies = [
+ "futures-core",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "gethostname"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
+dependencies = [
+ "libc",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+ "wasi 0.14.2+wasi-0.2.4",
+]
+
+[[package]]
+name = "gimli"
+version = "0.31.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
+
+[[package]]
+name = "http"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "httparse"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+[[package]]
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
+name = "libc"
+version = "0.2.172"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
+
+[[package]]
+name = "lock_api"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+
+[[package]]
+name = "memchr"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+[[package]]
+name = "memmap2"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
+dependencies = [
+ "adler2",
+]
+
+[[package]]
+name = "mio"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
+dependencies = [
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num_threads"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "objc-sys"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
+
+[[package]]
+name = "objc2"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
+dependencies = [
+ "objc-sys",
+ "objc2-encode",
+]
+
+[[package]]
+name = "objc2-app-kit"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
+dependencies = [
+ "bitflags",
+ "block2",
+ "libc",
+ "objc2",
+ "objc2-core-data",
+ "objc2-core-image",
+ "objc2-foundation",
+ "objc2-quartz-core",
+]
+
+[[package]]
+name = "objc2-core-data"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
+dependencies = [
+ "bitflags",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-image"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
+dependencies = [
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
+
+[[package]]
+name = "objc2-foundation"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
+dependencies = [
+ "bitflags",
+ "block2",
+ "libc",
+ "objc2",
+]
+
+[[package]]
+name = "objc2-metal"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
+dependencies = [
+ "bitflags",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-quartz-core"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
+dependencies = [
+ "bitflags",
+ "block2",
+ "objc2",
+ "objc2-foundation",
+ "objc2-metal",
+]
+
+[[package]]
+name = "object"
+version = "0.36.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "openaction"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d93a4320238eee9462ddc43c1feb66d41bda984a908e30138fd20ba7460554b5"
+dependencies = [
+ "anyhow",
+ "futures-util",
+ "log",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tokio-tungstenite",
+]
+
+[[package]]
+name = "opendeck-starterpack"
+version = "1.4.1"
+dependencies = [
+ "enigo",
+ "log",
+ "openaction",
+ "os_pipe",
+ "ron",
+ "serde",
+ "serde_json",
+ "simplelog",
+ "tokio",
+ "tungstenite",
+]
+
+[[package]]
+name = "os_pipe"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982"
+dependencies = [
+ "libc",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r-efi"
+version = "5.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+
+[[package]]
+name = "rand"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
+dependencies = [
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "ron"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
+dependencies = [
+ "base64",
+ "bitflags",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+
+[[package]]
+name = "rustix"
+version = "0.38.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+dependencies = [
+ "bitflags",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "serde"
+version = "1.0.219"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.219"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.140"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simplelog"
+version = "0.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0"
+dependencies = [
+ "log",
+ "termcolor",
+ "time",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
+
+[[package]]
+name = "socket2"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.101"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "time"
+version = "0.3.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
+dependencies = [
+ "deranged",
+ "itoa",
+ "libc",
+ "num-conv",
+ "num_threads",
+ "powerfmt",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
+
+[[package]]
+name = "time-macros"
+version = "0.2.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
+dependencies = [
+ "num-conv",
+ "time-core",
+]
+
+[[package]]
+name = "tokio"
+version = "1.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "parking_lot",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite",
+]
+
+[[package]]
+name = "tungstenite"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13"
+dependencies = [
+ "bytes",
+ "data-encoding",
+ "http",
+ "httparse",
+ "log",
+ "rand",
+ "sha1",
+ "thiserror",
+ "utf-8",
+]
+
+[[package]]
+name = "typenum"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasi"
+version = "0.14.2+wasi-0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+dependencies = [
+ "wit-bindgen-rt",
+]
+
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "windows"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
+dependencies = [
+ "windows-core",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-result",
+ "windows-strings",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.58.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "wit-bindgen-rt"
+version = "0.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "x11rb"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12"
+dependencies = [
+ "gethostname",
+ "rustix",
+ "x11rb-protocol",
+]
+
+[[package]]
+name = "x11rb-protocol"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d"
+
+[[package]]
+name = "xkbcommon"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9"
+dependencies = [
+ "libc",
+ "memmap2",
+ "xkeysym",
+]
+
+[[package]]
+name = "xkeysym"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
+
+[[package]]
+name = "zerocopy"
+version = "0.8.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/Cargo.toml b/plugins/com.amansprojects.starterpack.sdPlugin/Cargo.toml
new file mode 100644
index 0000000..690730f
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "opendeck-starterpack"
+version = "1.4.1"
+authors = ["Aman Khanna (nekename)"]
+license = "GPL-3.0-or-later"
+edition = "2021"
+
+[dependencies]
+openaction = "1.1"
+log = "0.4"
+simplelog = "0.12"
+serde = "1.0"
+serde_json = "1.0"
+ron = "0.8"
+enigo = { version = "0.3", features = ["serde", "x11rb"] }
+tokio = { version = "1.42", features = ["full"] }
+tungstenite = "0.26"
+os_pipe = "1.2"
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/build.ts b/plugins/com.amansprojects.starterpack.sdPlugin/build.ts
new file mode 100644
index 0000000..fc9ec7b
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/build.ts
@@ -0,0 +1,18 @@
+import { copy } from "jsr:@std/fs";
+import { join } from "jsr:@std/path";
+
+if (Deno.args.length < 1) Deno.exit(1);
+const outDir = Deno.args[0];
+try {
+ Deno.remove(outDir, { recursive: true });
+} catch (error: any) {
+ if (!(error instanceof Deno.errors.NotFound)) {
+ throw error;
+ }
+}
+copy("files", outDir);
+
+if (!(await new Deno.Command("cargo", { args: ["build", "--release"] }).spawn().status).success) Deno.exit(1);
+const builtExec = Deno.build.os == "windows" ? "opendeck-starterpack.exe" : "opendeck-starterpack";
+const targetExec = Deno.build.os == "windows" ? "opendeck-starterpack.exe" : Deno.build.os == "darwin" ? "opendeck-starterpack-mac" : "opendeck-starterpack";
+copy(join("target", "release", builtExec), join(outDir, targetExec));
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/inputSimulation.png b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/inputSimulation.png
new file mode 100644
index 0000000..04f1f93
Binary files /dev/null and b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/inputSimulation.png differ
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/plugin.png b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/plugin.png
new file mode 100644
index 0000000..09cf955
Binary files /dev/null and b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/plugin.png differ
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/runCommand.png b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/runCommand.png
new file mode 100644
index 0000000..054558c
Binary files /dev/null and b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/runCommand.png differ
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/switchProfile.png b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/switchProfile.png
new file mode 100644
index 0000000..0c56cb1
Binary files /dev/null and b/plugins/com.amansprojects.starterpack.sdPlugin/files/icons/switchProfile.png differ
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/manifest.json b/plugins/com.amansprojects.starterpack.sdPlugin/files/manifest.json
new file mode 100644
index 0000000..6de88a5
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/files/manifest.json
@@ -0,0 +1,56 @@
+{
+ "Name": "OpenDeck Starter Pack",
+ "Description": "OpenDeck starter pack plugin",
+ "Author": "Aman Khanna (nekename)",
+ "Version": "1.4.1",
+ "CodePathWin": "opendeck-starterpack.exe",
+ "CodePathMac": "opendeck-starterpack-mac",
+ "CodePathLin": "opendeck-starterpack",
+ "Icon": "icons/plugin",
+ "Category": "OpenDeck",
+ "OS": [
+ {
+ "Platform": "mac",
+ "MinimumVersion": "10.11"
+ },
+ {
+ "Platform": "windows",
+ "MinimumVersion": "10"
+ },
+ {
+ "Platform": "linux"
+ }
+ ],
+ "Actions": [
+ {
+ "Icon": "icons/runCommand",
+ "Name": "Run Command",
+ "States": [{ "Image": "actionDefaultImage" }],
+ "Controllers": ["Keypad"],
+ "SupportedInMultiActions": true,
+ "Tooltip": "Run a command",
+ "UUID": "com.amansprojects.starterpack.runcommand",
+ "PropertyInspectorPath": "propertyInspector/runCommand.html"
+ },
+ {
+ "Icon": "icons/inputSimulation",
+ "Name": "Input Simulation",
+ "States": [{ "Image": "actionDefaultImage" }],
+ "Controllers": ["Keypad"],
+ "SupportedInMultiActions": true,
+ "Tooltip": "Simulate mouse or keyboard input",
+ "UUID": "com.amansprojects.starterpack.inputsimulation",
+ "PropertyInspectorPath": "propertyInspector/inputSimulation.html"
+ },
+ {
+ "Icon": "icons/switchProfile",
+ "Name": "Switch Profile",
+ "States": [{ "Image": "actionDefaultImage" }],
+ "Controllers": ["Keypad"],
+ "SupportedInMultiActions": true,
+ "Tooltip": "Switch the selected profile",
+ "UUID": "com.amansprojects.starterpack.switchprofile",
+ "PropertyInspectorPath": "propertyInspector/switchProfile.html"
+ }
+ ]
+}
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/check.svg b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/check.svg
new file mode 100644
index 0000000..bbfec96
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/inputSimulation.html b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/inputSimulation.html
new file mode 100644
index 0000000..bf05219
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/inputSimulation.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+ Details
+ [t("hello world!"),m(10,10,r),s(5),b(l),k(ctrl,p),k(uni('a')),k(ctrl,r)]
+ The example above becomes something like this:
+
+ [
+ Text("hello world!"),
+ MoveMouse(10, 10, Relative),
+ Scroll(5, Vertical),
+ Button(Left, Click),
+ Key(Control, Press),
+ Key(Unicode('a'), Click),
+ Key(Control, Release),
+]
+
+ As you can see, Vertical is the default for the Scroll action if an axis is not specified,
+ Click (press followed by release) is the default for the Button and Key actions if a direction is not specified, and so on.
+
+
+
+ You can find a list of all of the keycodes
+ here .
+ Please note that not all keycodes are available on all operating systems, as is marked on each such keycode on the line above it.
+ You can find the possible buttons, directions, axis and coordinate types
+ here .
+
+
+
+
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/runCommand.html b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/runCommand.html
new file mode 100644
index 0000000..9165582
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/runCommand.html
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/sdpi.css b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/sdpi.css
new file mode 100644
index 0000000..2b216bf
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/sdpi.css
@@ -0,0 +1,1747 @@
+html {
+ --sdpi-bgcolor: #2d2d2d;
+ --sdpi-background: #3d3d3d;
+ --sdpi-color: #d8d8d8;
+ --sdpi-bordercolor: #3a3a3a;
+ --sdpi-buttonbordercolor: #969696;
+ --sdpi-borderradius: 0px;
+ --sdpi-width: 224px;
+ --sdpi-fontweight: 600;
+ --sdpi-letterspacing: -0.25pt;
+ --sdpi-tab-color: #969696;
+ --sdpi-tab-left-margin: 1px;
+ --sdpi-tab-top-offset: 1px;
+ --sdpi-tab-selected-color: #333333;
+ --sdpi-tab-selected-top-offset: 0px;
+ --sdpi-tab-font-size: 9pt;
+ --sdpi-tab-container-left-offset: 5px;
+ --sdpi-tab-padding-horizontal: 12px;
+ --sdpi-tab-padding-vertical: 5px;
+ --sdpi-linecolor: #454545;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+ touch-action: none;
+}
+
+html,
+body {
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+ font-size: 9pt;
+ background-color: var(--sdpi-bgcolor);
+ color: #9a9a9a;
+}
+
+body {
+ height: 100%;
+ padding: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ margin: 0;
+ -webkit-overflow-scrolling: touch;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-smoothing: antialiased;
+}
+
+mark {
+ background-color: var(--sdpi-bgcolor);
+ color: var(--sdpi-color);
+}
+
+hr,
+hr2 {
+ -webkit-margin-before: 1em;
+ -webkit-margin-after: 1em;
+ border-style: none;
+ background: var(--sdpi-background);
+ height: 1px;
+}
+
+hr2,
+.sdpi-heading {
+ display: flex;
+ flex-basis: 100%;
+ align-items: center;
+ color: inherit;
+ font-size: 9pt;
+ margin: 8px 0px;
+}
+
+h1 {
+ font-size: 1.3em;
+ font-weight: 500;
+ text-align: center;
+ margin-bottom: 12px;
+}
+
+.sdpi-heading::before,
+.sdpi-heading::after {
+ content: "";
+ flex-grow: 1;
+ background: var(--sdpi-background);
+ height: 1px;
+ font-size: 0px;
+ line-height: 0px;
+ margin: 0px 16px;
+}
+
+hr2 {
+ height: 2px;
+}
+
+hr,
+hr2 {
+ margin-left: 16px;
+ margin-right: 16px;
+}
+
+.sdpi-item-value,
+option,
+input,
+select,
+button {
+ font-size: 10pt;
+ font-weight: var(--sdpi-fontweight);
+ letter-spacing: var(--sdpi-letterspacing);
+}
+
+.sdpi-item-value > :last-of-type,
+.sdpi-item-value:last-child {
+ margin-bottom: 4px;
+}
+
+.win .sdpi-item-value,
+.win option,
+.win input,
+.win select,
+.win button {
+ font-size: 11px;
+ font-style: normal;
+ letter-spacing: inherit;
+ font-weight: 100;
+}
+
+.win button {
+ font-size: 12px;
+}
+
+::-webkit-progress-value,
+meter::-webkit-meter-optimum-value {
+ border-radius: 2px;
+ /* background: linear-gradient(#ccf, #99f 20%, #77f 45%, #77f 55%, #cdf); */
+}
+
+::-webkit-progress-bar,
+meter::-webkit-meter-bar {
+ border-radius: 3px;
+ background: var(--sdpi-background);
+}
+
+::-webkit-progress-bar:active,
+meter::-webkit-meter-bar:active {
+ border-radius: 3px;
+ background: #222222;
+}
+
+::-webkit-progress-value:active,
+meter::-webkit-meter-optimum-value:active {
+ background: #99f;
+}
+
+progress,
+progress.sdpi-item-value {
+ min-height: 5px !important;
+ height: 5px;
+ background-color: #303030;
+}
+
+progress {
+ margin-top: 8px !important;
+ margin-bottom: 8px !important;
+}
+
+.full progress,
+progress.full {
+ margin-top: 3px !important;
+}
+
+::-webkit-progress-inner-element {
+ background-color: transparent;
+}
+
+.sdpi-item[type="progress"] {
+ margin-top: 4px !important;
+ margin-bottom: 12px;
+ min-height: 15px;
+}
+
+.sdpi-item-child.full:last-child {
+ margin-bottom: 4px;
+}
+
+/* TABS */
+
+.tabs {
+ /**
+ * Setting display to flex makes this container lay
+ * out its children using flexbox, the exact same
+ * as in the above "Stepper input" example.
+ */
+ display: flex;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.0);
+ flex-wrap: nowrap;
+ white-space: nowrap;
+ overflow-x: auto;
+ text-transform: capitalize;
+ background-color: transparent;
+ margin-left: var(--sdpi-tab-container-left-offset);
+}
+
+.tabs::-webkit-scrollbar {
+ height: 4px;
+ display: none;
+}
+
+.tabs::-webkit-scrollbar-track {
+ -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+ box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+ border-radius: 8px;
+}
+
+.tabs::-webkit-scrollbar-thumb {
+ background-color: #444;
+ outline: 1px solid #444;
+ border-radius: 8px;
+}
+
+.tab-separator {
+ margin-left: 100px;
+ max-width: 234px;
+ margin-bottom: 20px;
+ margin-top: -4px;
+}
+
+.tab {
+ cursor: pointer;
+ padding: var(--sdpi-tab-padding-vertical) var(--sdpi-tab-padding-horizontal);
+ color: var(--sdpi-tab-color);
+ font-size: var(--sdpi-tab-font-size);
+ font-weight: var(--title-font-weight);
+ background-color: rgba(0, 0, 0, 0.1);
+ margin: 0px;
+ margin-top: var(--sdpi-tab-top-offset);
+ margin-left: var(--sdpi-tab-left-margin);
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-bottom: 1px solid var(--sdpi-linecolor);
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.tab:first-child {
+ margin-left: 0px;
+}
+
+.tab-container {
+ margin-top: -14px;
+}
+
+.tab-container > hr {
+ margin-left: 100px;
+ max-width: 234px;
+}
+
+.tabs + hr {
+ margin-left: 0px;
+ max-width: 234px;
+ margin-top: -6px;
+}
+
+.tab.selected {
+ color: white;
+ background-color: var(--sdpi-tab-selected-color);
+ border-bottom: 2px solid var(--sdpi-tab-selected-color);
+ margin-top: var(--sdpi-tab-selected-top-offset);
+}
+
+.sdpi-item.tabgroup {
+ margin-top: 0px;
+}
+
+.istab {
+ background-color: rgba(0, 0, 0, 0.2);
+ margin-bottom: 20px;
+ padding: 4px;
+}
+
+select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ -o-appearance: none;
+ appearance: none;
+ background: url(../assets/caret.svg) no-repeat 97% center;
+}
+
+label.sdpi-file-label,
+input[type="button"],
+input[type="submit"],
+input[type="reset"],
+input[type="file"],
+input[type="file"]::-webkit-file-upload-button,
+button,
+select {
+ color: var(--sdpi-color);
+ border: 1pt solid #303030;
+ font-size: 8pt;
+ background-color: var(--sdpi-background);
+ border-radius: var(--sdpi-borderradius);
+}
+
+label.sdpi-file-label,
+input[type="button"],
+input[type="submit"],
+input[type="reset"],
+input[type="file"],
+input[type="file"]::-webkit-file-upload-button,
+button {
+ border: 1pt solid var(--sdpi-buttonbordercolor);
+ border-radius: var(--sdpi-borderradius);
+ border-color: var(--sdpi-buttonbordercolor);
+ min-height: 23px !important;
+ height: 23px !important;
+ margin-right: 8px;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+input[type="file"] {
+ border-radius: var(--sdpi-borderradius);
+ max-width: 220px;
+}
+
+option {
+ height: 1.5em;
+ padding: 4px;
+}
+
+/* SDPI */
+
+.sdpi-wrapper {
+ overflow-x: hidden;
+ height: 100%;
+ margin-right: 1px; /* ensure scroller thumb is not clipped */
+}
+
+.sdpi-item {
+ display: flex;
+ flex-direction: row;
+ min-height: 30px;
+ align-items: first baseline;
+ margin-top: 2px;
+ max-width: 344px;
+ -webkit-user-drag: none;
+}
+
+.sdpi-item[type="textarea"],
+.sdpi-item[type="color"],
+.sdpi-item[type="canvas"],
+.sdpi-item .aligncenter {
+ align-items: center;
+}
+
+.sdpi-item[type="color"] > .sdpi-item-label {
+ line-height: 22px;
+}
+
+.sdpi-item:first-child {
+ margin-top: -1px;
+}
+
+.sdpi-item:first-of-type {
+ margin-top: 2px;
+}
+
+.sdpi-item[type="radio"]:first-of-type,
+.sdpi-item[type="checkbox"]:first-of-type {
+ margin-top: -4px;
+}
+
+.sdpi-item:last-child {
+ margin-bottom: 0px;
+}
+
+.sdpi-item > *:not(.sdpi-item-label):not(meter):not(details):not(canvas) {
+ min-height: 26px;
+}
+
+.sdpi-item > *:not(.sdpi-item-label.empty):not(meter) {
+ min-height: 26px;
+}
+
+.sdpi-item > input {
+ padding: 0px 4px;
+}
+
+.sdpi-item-group {
+ padding: 0 !important;
+}
+
+meter.sdpi-item-value {
+ margin-left: 6px;
+}
+
+.sdpi-item[type="group"] {
+ display: block;
+ margin-top: 12px;
+ margin-bottom: 12px;
+ /* border: 1px solid white; */
+ flex-direction: unset;
+ text-align: left;
+}
+
+.sdpi-item[type="group"] > .sdpi-item-label,
+.sdpi-item[type="group"].sdpi-item-label {
+ width: 96%;
+ text-align: left;
+ font-weight: 700;
+ margin-bottom: 4px;
+ padding-left: 4px;
+}
+
+dl,
+ul,
+ol {
+ -webkit-margin-before: 0px;
+ -webkit-margin-after: 4px;
+ -webkit-padding-start: 1em;
+ max-height: 90px;
+ overflow-y: scroll;
+ cursor: pointer;
+ user-select: none;
+}
+
+table.sdpi-item-value,
+dl.sdpi-item-value,
+ul.sdpi-item-value,
+ol.sdpi-item-value {
+ -webkit-margin-before: 4px;
+ -webkit-margin-after: 8px;
+ -webkit-padding-start: 1em;
+ width: var(--sdpi-width);
+ text-align: center;
+}
+
+table > caption {
+ margin: 2px;
+}
+
+.list,
+.sdpi-item[type="list"] {
+ align-items: baseline;
+}
+
+.sdpi-item-label {
+ text-align: right;
+ flex: none;
+ width: 94px;
+ padding-right: 5px;
+ font-weight: 600;
+ -webkit-user-select: none;
+ line-height: normal;
+ margin-left: -1px;
+}
+
+.win .sdpi-item-label,
+.sdpi-item-label > small {
+ font-weight: normal;
+}
+
+.sdpi-item-label:after {
+ content: ": ";
+}
+
+.sdpi-item-label.empty:after {
+ content: "";
+}
+
+.sdpi-test,
+.sdpi-item-value {
+ flex: 1 0 0;
+ /* flex-grow: 1;
+ flex-shrink: 0; */
+ margin-right: 14px;
+ margin-left: 4px;
+ justify-content: space-evenly;
+}
+
+canvas.sdpi-item-value {
+ max-width: 144px;
+ max-height: 144px;
+ width: 144px;
+ height: 144px;
+ margin: 0 auto;
+ cursor: pointer;
+}
+
+input.sdpi-item-value {
+ margin-left: 5px;
+}
+
+.sdpi-item-value button,
+button.sdpi-item-value {
+ margin-left: 6px;
+ margin-right: 14px;
+}
+
+.sdpi-item-value.range {
+ margin-left: 0px;
+}
+
+table,
+dl.sdpi-item-value,
+ul.sdpi-item-value,
+ol.sdpi-item-value,
+.sdpi-item-value > dl,
+.sdpi-item-value > ul,
+.sdpi-item-value > ol {
+ list-style-type: none;
+ list-style-position: outside;
+ margin-left: -4px;
+ margin-right: -4px;
+ padding: 4px;
+ border: 1px solid var(--sdpi-bordercolor);
+}
+
+dl.sdpi-item-value,
+ul.sdpi-item-value,
+ol.sdpi-item-value,
+.sdpi-item-value > ol {
+ list-style-type: none;
+ list-style-position: inside;
+ margin-left: 5px;
+ margin-right: 12px;
+ padding: 4px !important;
+ /* display: flex;
+ flex-direction: column; */
+}
+
+.two-items li {
+ display: flex;
+}
+
+.two-items li > *:first-child {
+ flex: 0 0 50%;
+ text-align: left;
+}
+
+.two-items.thirtyseventy li > *:first-child {
+ flex: 0 0 30%;
+}
+
+ol.sdpi-item-value,
+.sdpi-item-value > ol[listtype="none"] {
+ list-style-type: none;
+}
+
+ol.sdpi-item-value[type="decimal"],
+.sdpi-item-value > ol[type="decimal"] {
+ list-style-type: decimal;
+}
+
+ol.sdpi-item-value[type="decimal-leading-zero"],
+.sdpi-item-value > ol[type="decimal-leading-zero"] {
+ list-style-type: decimal-leading-zero;
+}
+
+ol.sdpi-item-value[type="lower-alpha"],
+.sdpi-item-value > ol[type="lower-alpha"] {
+ list-style-type: lower-alpha;
+}
+
+ol.sdpi-item-value[type="upper-alpha"],
+.sdpi-item-value > ol[type="upper-alpha"] {
+ list-style-type: upper-alpha;
+}
+
+ol.sdpi-item-value[type="upper-roman"],
+.sdpi-item-value > ol[type="upper-roman"] {
+ list-style-type: upper-roman;
+}
+
+ol.sdpi-item-value[type="lower-roman"],
+.sdpi-item-value > ol[type="lower-roman"] {
+ list-style-type: upper-roman;
+}
+
+tr:nth-child(even),
+.sdpi-item-value > ul > li:nth-child(even),
+.sdpi-item-value > ol > li:nth-child(even),
+li:nth-child(even) {
+ background-color: rgba(0, 0, 0, 0.2);
+}
+
+td:hover,
+.sdpi-item-value > ul > li:hover:nth-child(even),
+.sdpi-item-value > ol > li:hover:nth-child(even),
+li:hover:nth-child(even),
+li:hover {
+ background-color: rgba(255, 255, 255, 0.1);
+}
+
+td.selected,
+td.selected:hover,
+li.selected:hover,
+li.selected {
+ color: white;
+ background-color: #77f;
+}
+
+tr {
+ border: 1px solid var(--sdpi-bordercolor);
+}
+
+td {
+ border-right: 1px solid var(--sdpi-bordercolor);
+ -webkit-user-select: none;
+}
+
+tr:last-child,
+td:last-child {
+ border: none;
+}
+
+.sdpi-item-value.select,
+.sdpi-item-value > select {
+ margin-right: 13px;
+ margin-left: 4px;
+ padding: 0px 4px;
+}
+
+.sdpi-item-child,
+.sdpi-item-group > .sdpi-item > input[type="color"] {
+ margin-top: 0.4em;
+ margin-right: 4px;
+ margin-left: 4px;
+}
+
+.full,
+.full *,
+.sdpi-item-value.full,
+.sdpi-item-child > full > *,
+.sdpi-item-child.full,
+.sdpi-item-child.full > *,
+.full > .sdpi-item-child,
+.full > .sdpi-item-child > * {
+ display: flex;
+ flex: 1 1 0;
+ margin-bottom: 4px;
+ margin-left: 0px;
+ width: 100%;
+ justify-content: space-evenly;
+}
+
+.sdpi-item-group > .sdpi-item > input[type="color"] {
+ margin-top: 0px;
+}
+
+::-webkit-calendar-picker-indicator:focus,
+input[type="file"]::-webkit-file-upload-button:focus,
+button:focus,
+textarea:focus,
+input:focus,
+select:focus,
+option:focus,
+details:focus,
+summary:focus,
+.custom-select select {
+ outline: none;
+}
+
+summary {
+ cursor: default;
+ -webkit-user-select: none;
+}
+
+.pointer,
+summary .pointer {
+ cursor: pointer;
+}
+
+.sdpi-item.details {
+ align-items: first baseline;
+}
+
+/* needs Chromium update 2023
+.sdpi-item:has(>details) {
+ align-items: first baseline;
+}
+*/
+
+details * {
+ font-size: 12px;
+ font-weight: normal;
+}
+
+details.message {
+ padding: 4px 18px 4px 12px;
+}
+
+details.message summary {
+ font-size: 10pt;
+ font-weight: 600;
+ min-height: 18px;
+}
+
+details.message:first-child {
+ margin-top: 4px;
+ margin-left: 0;
+ padding-left: 102px !important;
+}
+
+details.message > summary:first-of-type {
+ line-height: 20px;
+}
+
+details.message h1 {
+ text-align: left;
+}
+
+/* details:not(.pointer)>summary {
+ list-style: none;
+}
+
+details > summary::-webkit-details-marker,
+.message > summary::-webkit-details-marker {
+ display: none;
+} */
+
+.info20,
+.question,
+.caution,
+.info {
+ background-repeat: no-repeat;
+ background-position: 72px center;
+}
+
+.info20 {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' d='M10,20 C4.4771525,20 0,15.5228475 0,10 C0,4.4771525 4.4771525,0 10,0 C15.5228475,0 20,4.4771525 20,10 C20,15.5228475 15.5228475,20 10,20 Z M10,8 C8.8954305,8 8,8.84275812 8,9.88235294 L8,16.1176471 C8,17.1572419 8.8954305,18 10,18 C11.1045695,18 12,17.1572419 12,16.1176471 L12,9.88235294 C12,8.84275812 11.1045695,8 10,8 Z M10,3 C8.8954305,3 8,3.88165465 8,4.96923077 L8,5.03076923 C8,6.11834535 8.8954305,7 10,7 C11.1045695,7 12,6.11834535 12,5.03076923 L12,4.96923077 C12,3.88165465 11.1045695,3 10,3 Z'/%3E%3C/svg%3E%0A");
+}
+
+.info {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' d='M10,18 C5.581722,18 2,14.418278 2,10 C2,5.581722 5.581722,2 10,2 C14.418278,2 18,5.581722 18,10 C18,14.418278 14.418278,18 10,18 Z M10,8 C9.44771525,8 9,8.42137906 9,8.94117647 L9,14.0588235 C9,14.5786209 9.44771525,15 10,15 C10.5522847,15 11,14.5786209 11,14.0588235 L11,8.94117647 C11,8.42137906 10.5522847,8 10,8 Z M10,5 C9.44771525,5 9,5.44082732 9,5.98461538 L9,6.01538462 C9,6.55917268 9.44771525,7 10,7 C10.5522847,7 11,6.55917268 11,6.01538462 L11,5.98461538 C11,5.44082732 10.5522847,5 10,5 Z'/%3E%3C/svg%3E%0A");
+}
+
+.info2 {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='15' height='15' viewBox='0 0 15 15'%3E%3Cpath fill='%23999' d='M7.5,15 C3.35786438,15 0,11.6421356 0,7.5 C0,3.35786438 3.35786438,0 7.5,0 C11.6421356,0 15,3.35786438 15,7.5 C15,11.6421356 11.6421356,15 7.5,15 Z M7.5,2 C6.67157287,2 6,2.66124098 6,3.47692307 L6,3.52307693 C6,4.33875902 6.67157287,5 7.5,5 C8.32842705,5 9,4.33875902 9,3.52307693 L9,3.47692307 C9,2.66124098 8.32842705,2 7.5,2 Z M5,6 L5,7.02155172 L6,7 L6,12 L5,12.0076778 L5,13 L10,13 L10,12 L9,12.0076778 L9,6 L5,6 Z'/%3E%3C/svg%3E%0A");
+}
+
+.sdpi-more-info {
+ background-image:
+ linear-gradient(to right, #00000000 0%, #00000040 80%),
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpolygon fill='%23999' points='4 7 8 7 8 5 12 8 8 11 8 9 4 9'/%3E%3C/svg%3E%0A");
+}
+
+.caution {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' fill-rule='evenodd' d='M9.03952676,0.746646542 C9.57068894,-0.245797319 10.4285735,-0.25196227 10.9630352,0.746646542 L19.7705903,17.2030214 C20.3017525,18.1954653 19.8777595,19 18.8371387,19 L1.16542323,19 C0.118729947,19 -0.302490098,18.2016302 0.231971607,17.2030214 L9.03952676,0.746646542 Z M10,2.25584053 L1.9601405,17.3478261 L18.04099,17.3478261 L10,2.25584053 Z M10,5.9375 C10.531043,5.9375 10.9615385,6.37373537 10.9615385,6.91185897 L10.9615385,11.6923077 C10.9615385,12.2304313 10.531043,12.6666667 10,12.6666667 C9.46895697,12.6666667 9.03846154,12.2304313 9.03846154,11.6923077 L9.03846154,6.91185897 C9.03846154,6.37373537 9.46895697,5.9375 10,5.9375 Z M10,13.4583333 C10.6372516,13.4583333 11.1538462,13.9818158 11.1538462,14.6275641 L11.1538462,14.6641026 C11.1538462,15.3098509 10.6372516,15.8333333 10,15.8333333 C9.36274837,15.8333333 8.84615385,15.3098509 8.84615385,14.6641026 L8.84615385,14.6275641 C8.84615385,13.9818158 9.36274837,13.4583333 10,13.4583333 Z'/%3E%3C/svg%3E%0A");
+}
+
+.question {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cpath fill='%23999' d='M10,18 C5.581722,18 2,14.418278 2,10 C2,5.581722 5.581722,2 10,2 C14.418278,2 18,5.581722 18,10 C18,14.418278 14.418278,18 10,18 Z M6.77783203,7.65332031 C6.77783203,7.84798274 6.85929281,8.02888914 7.0222168,8.19604492 C7.18514079,8.36320071 7.38508996,8.44677734 7.62207031,8.44677734 C8.02409055,8.44677734 8.29703704,8.20768468 8.44091797,7.72949219 C8.59326248,7.27245865 8.77945854,6.92651485 8.99951172,6.69165039 C9.2195649,6.45678594 9.56233491,6.33935547 10.027832,6.33935547 C10.4256205,6.33935547 10.7006836,6.37695313 11.0021973,6.68847656 C11.652832,7.53271484 10.942627,8.472229 10.3750916,9.1321106 C9.80755615,9.79199219 8.29492188,11.9897461 10.027832,12.1347656 C10.4498423,12.1700818 10.7027991,11.9147157 10.7832031,11.4746094 C11.0021973,9.59857178 13.1254883,8.82415771 13.1254883,7.53271484 C13.1254883,7.07568131 12.9974785,6.65250846 12.7414551,6.26318359 C12.4854317,5.87385873 12.1225609,5.56600048 11.652832,5.33959961 C11.1831031,5.11319874 10.6414419,5 10.027832,5 C9.36767248,5 8.79004154,5.13541531 8.29492187,5.40625 C7.79980221,5.67708469 7.42317837,6.01879677 7.16503906,6.43139648 C6.90689975,6.8439962 6.77783203,7.25130007 6.77783203,7.65332031 Z M10.0099668,15 C10.2713191,15 10.5016601,14.9108147 10.7009967,14.7324415 C10.9003332,14.5540682 11,14.3088087 11,13.9966555 C11,13.7157177 10.9047629,13.4793767 10.7142857,13.2876254 C10.5238086,13.0958742 10.2890379,13 10.0099668,13 C9.72646591,13 9.48726565,13.0958742 9.2923588,13.2876254 C9.09745196,13.4793767 9,13.7157177 9,13.9966555 C9,14.313268 9.10077419,14.5596424 9.30232558,14.735786 C9.50387698,14.9119295 9.73975502,15 10.0099668,15 Z'/%3E%3C/svg%3E%0A");
+}
+
+.sdpi-more-info {
+ position: fixed;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ min-height: 16px;
+ padding-right: 16px;
+ text-align: right;
+ -webkit-touch-callout: none;
+ cursor: pointer;
+ user-select: none;
+ background-position: right center;
+ background-repeat: no-repeat;
+ border-radius: var(--sdpi-borderradius);
+ text-decoration: none;
+ color: var(--sdpi-color);
+}
+
+.sdpi-more-info-button {
+ display: flex;
+ align-self: right;
+ margin-left: auto;
+ position: fixed;
+ right: 17px;
+ bottom: 0px;
+ user-select: none;
+}
+
+.sdpi-bottom-bar {
+ display: flex;
+ align-self: right;
+ margin-left: auto;
+ position: fixed;
+ right: 17px;
+ bottom: 0px;
+ user-select: none;
+}
+
+.sdpi-bottom-bar.right {
+ right: 0px;
+}
+
+.sdpi-bottom-bar button {
+ min-height: 20px !important;
+ height: 20px !important;
+}
+
+details a {
+ background-position: right !important;
+ min-height: 24px;
+ display: inline-block;
+ line-height: 24px;
+ padding-right: 28px;
+}
+
+input:not([type="range"]),
+textarea {
+ -webkit-appearance: none;
+ background: var(--sdpi-background);
+ color: var(--sdpi-color);
+ font-weight: normal;
+ font-size: 9pt;
+ border: none;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ min-width: 219px;
+}
+
+textarea + label {
+ display: flex;
+ justify-content: flex-end;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ display: none;
+}
+
+input[type="radio"] + label,
+input[type="checkbox"] + label {
+ font-size: 9pt;
+ color: var(--sdpi-color);
+ font-weight: normal;
+ margin-right: 8px;
+ -webkit-user-select: none;
+}
+
+input[type="radio"] + label:after,
+input[type="checkbox"] + label:after {
+ content: " " !important;
+}
+
+.sdpi-item[type="radio"] > .sdpi-item-value,
+.sdpi-item[type="checkbox"] > .sdpi-item-value {
+ padding-top: 2px;
+}
+
+.sdpi-item[type="checkbox"] > .sdpi-item-value > * {
+ margin-top: 4px;
+}
+
+.sdpi-item[type="checkbox"] .sdpi-item-child,
+.sdpi-item[type="radio"] .sdpi-item-child {
+ display: inline-block;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value,
+.sdpi-item[type="meter"] .sdpi-item-child,
+.sdpi-item[type="progress"] .sdpi-item-child {
+ display: flex;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value {
+ min-height: 26px;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value span,
+.sdpi-item[type="meter"] .sdpi-item-child span,
+.sdpi-item[type="progress"] .sdpi-item-child span {
+ margin-top: -2px;
+ min-width: 8px;
+ text-align: right;
+ cursor: pointer;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value span {
+ margin-top: 7px;
+ text-align: right;
+}
+
+span + input[type="range"] {
+ display: flex;
+}
+
+span + .range-container > input[type="range"],
+span + input[type="range"] {
+ max-width: 168px;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value span:first-child,
+.sdpi-item[type="meter"] .sdpi-item-child span:first-child,
+.sdpi-item[type="progress"] .sdpi-item-child span:first-child {
+ margin-right: 4px;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value span:last-child,
+.sdpi-item[type="meter"] .sdpi-item-child span:last-child,
+.sdpi-item[type="progress"] .sdpi-item-child span:last-child {
+ margin-left: 4px;
+}
+
+.reverse {
+ transform: rotate(180deg);
+}
+
+.sdpi-item[type="meter"] .sdpi-item-child meter + span:last-child {
+ margin-left: -10px;
+}
+
+.sdpi-item[type="progress"] .sdpi-item-child meter + span:last-child {
+ margin-left: -14px;
+}
+
+.sdpi-item[type="radio"] > .sdpi-item-value > * {
+ margin-top: 2px;
+}
+
+details {
+ padding: 8px 18px 8px 12px;
+ min-width: 86px;
+}
+
+details > h4 {
+ border-bottom: 1px solid var(--sdpi-bordercolor);
+}
+
+legend {
+ display: none;
+}
+
+.sdpi-item-value > textarea {
+ padding: 0px;
+ width: 219px;
+ margin-left: 1px;
+ margin-top: 3px;
+ padding: 4px;
+}
+
+input[type="radio"] + label span,
+input[type="checkbox"] + label span {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ margin: 2px 4px 2px 0;
+ border-radius: 3px;
+ vertical-align: middle;
+ background: var(--sdpi-background);
+ cursor: pointer;
+ border: 1px solid rgb(0, 0, 0, 0.2);
+}
+
+input[type="radio"] + label span {
+ border-radius: 100%;
+}
+
+input[type="radio"]:checked + label span,
+input[type="checkbox"]:checked + label span {
+ background-color: #77f;
+ background-image: url(./check.svg);
+ background-repeat: no-repeat;
+ background-position: center center;
+ border: 1px solid rgb(0, 0, 0, 0.4);
+}
+
+input[type="radio"]:active:checked + label span,
+input[type="radio"]:active + label span,
+input[type="checkbox"]:active:checked + label span,
+input[type="checkbox"]:active + label span {
+ background-color: #303030;
+}
+
+input[type="radio"]:checked + label span {
+ background-image: url(../assets/rcheck.svg);
+}
+
+input[type="range"] {
+ width: var(--sdpi-width);
+ height: 30px;
+ overflow: hidden;
+ cursor: pointer;
+ background: transparent !important;
+}
+
+.sdpi-item > input[type="range"] {
+ margin-left: 2px;
+ max-width: var(--sdpi-width);
+ width: var(--sdpi-width);
+ padding: 0px;
+ margin-top: 2px;
+}
+
+/*
+input[type="range"],
+input[type="range"]::-webkit-slider-runnable-track,
+input[type="range"]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+}
+*/
+
+input[type="range"]::-webkit-slider-runnable-track {
+ height: 5px;
+ background: #979797;
+ border-radius: 3px;
+ padding: 0px !important;
+ border: 1px solid var(--sdpi-background);
+}
+
+input[type="range"]::-webkit-slider-thumb {
+ position: relative;
+ -webkit-appearance: none;
+ background-color: var(--sdpi-color);
+ width: 12px;
+ height: 12px;
+ border-radius: 20px;
+ margin-top: -5px;
+ border: none;
+}
+
+input[type="range" i] {
+ margin: 0;
+}
+
+input[type="range"]::-webkit-slider-thumb::before {
+ position: absolute;
+ content: "";
+ height: 5px; /* equal to height of runnable track or 1 less */
+ width: 500px; /* make this bigger than the widest range input element */
+ left: -502px; /* this should be -2px - width */
+ top: 8px; /* don't change this */
+ background: #77f;
+}
+
+input[type="color"] {
+ min-width: 32px;
+ min-height: 32px;
+ width: 32px;
+ height: 32px;
+ padding: 0;
+ background-color: var(--sdpi-bgcolor);
+ flex: none;
+}
+
+::-webkit-color-swatch {
+ min-width: 24px;
+}
+
+textarea {
+ height: 3em;
+ word-break: break-word;
+ line-height: 1.5em;
+}
+
+.textarea {
+ padding: 0px !important;
+}
+
+textarea {
+ width: 219px; /*98%;*/
+ height: 96%;
+ min-height: 6em;
+ resize: none;
+ border-radius: var(--sdpi-borderradius);
+}
+
+/* CAROUSEL */
+
+.sdpi-item[type="carousel"] {}
+
+.sdpi-item.card-carousel-wrapper,
+.sdpi-item > .card-carousel-wrapper {
+ padding: 0;
+}
+
+.card-carousel-wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin: 12px auto;
+ color: #666a73;
+}
+
+.card-carousel {
+ display: flex;
+ justify-content: center;
+ width: 278px;
+}
+
+.card-carousel--overflow-container {
+ overflow: hidden;
+}
+
+.card-carousel--nav__left,
+.card-carousel--nav__right {
+ /* display: inline-block; */
+ width: 12px;
+ height: 12px;
+ border-top: 2px solid #42b883;
+ border-right: 2px solid #42b883;
+ cursor: pointer;
+ margin: 0 4px;
+ transition: transform 150ms linear;
+}
+
+.card-carousel--nav__left[disabled],
+.card-carousel--nav__right[disabled] {
+ opacity: 0.2;
+ border-color: black;
+}
+
+.card-carousel--nav__left {
+ transform: rotate(-135deg);
+}
+
+.card-carousel--nav__left:active {
+ transform: rotate(-135deg) scale(0.85);
+}
+
+.card-carousel--nav__right {
+ transform: rotate(45deg);
+}
+
+.card-carousel--nav__right:active {
+ transform: rotate(45deg) scale(0.85);
+}
+
+.card-carousel-cards {
+ display: flex;
+ transition: transform 150ms ease-out;
+ transform: translatex(0px);
+}
+
+.card-carousel-cards .card-carousel--card {
+ margin: 0 5px;
+ cursor: pointer;
+ /* box-shadow: 0 4px 15px 0 rgba(40, 44, 53, 0.06), 0 2px 2px 0 rgba(40, 44, 53, 0.08); */
+ /* background-color: #fff; */
+ text-align: center;
+ border-radius: 4px;
+ z-index: 3;
+}
+
+.xxcard-carousel-cards .card-carousel--card:first-child {
+ margin-left: 0;
+}
+
+.xxcard-carousel-cards .card-carousel--card:last-child {
+ margin-right: 0;
+}
+
+.card-carousel-cards .card-carousel--card img {
+ vertical-align: bottom;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ transition: opacity 150ms linear;
+ width: 60px;
+}
+
+.card-carousel-cards .card-carousel--card img:hover {
+ opacity: 0.5;
+ background-color: rgba(255, 255, 255, 0.1);
+}
+
+.card-carousel-cards .card-carousel--card--footer {
+ border-top: 0;
+ max-width: 80px;
+ overflow: hidden;
+ display: flex;
+ height: 100%;
+ flex-direction: column;
+}
+
+.card-carousel-cards .card-carousel--card--footer p {
+ padding: 3px 0;
+ margin: 0;
+ margin-bottom: 2px;
+ font-size: 15px;
+ font-weight: 500;
+ color: #2c3e50;
+}
+
+.card-carousel-cards .card-carousel--card--footer p:nth-of-type(2) {
+ font-size: 12px;
+ font-weight: 300;
+ padding: 6px;
+ color: #666a73;
+}
+
+::-webkit-calendar-picker-indicator {
+ background: url(../assets/elg_calendar_inv.svg) no-repeat center;
+ font-size: 17px;
+}
+
+::-webkit-calendar-picker-indicator:focus {
+ background-color: rgba(0, 0, 0, 0.2);
+}
+
+input[type="text"]::-webkit-calendar-picker-indicator {
+ background: transparent;
+ font-size: 12px;
+}
+
+input[type="date"] {
+ -webkit-align-items: center;
+ align-items: center;
+ display: -webkit-inline-flex;
+ overflow: hidden;
+ -webkit-padding-start: 1px;
+}
+
+input::-webkit-datetime-edit {
+ flex: 1;
+ -webkit-user-modify: read-only !important;
+ user-modify: read-only !important;
+ display: inline-block;
+ min-width: 0;
+ overflow: hidden;
+ padding: 4px;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+}
+
+input[type="file"] {
+ opacity: 0;
+ display: none;
+}
+
+.sdpi-item > input[type="file"] {
+ opacity: 1;
+ display: flex;
+}
+
+input[type="file"] + span {
+ display: flex;
+ flex: 0 1 auto;
+ background-color: #0000ff50;
+}
+
+label.sdpi-file-label {
+ cursor: pointer;
+ user-select: none;
+ display: inline-block;
+ min-height: 21px !important;
+ height: 21px !important;
+ line-height: 20px;
+ padding: 0px 4px;
+ margin: auto;
+ margin-right: 0px;
+ float: right;
+}
+
+.sdpi-file-label > label:active,
+.sdpi-file-label.file:active,
+label.sdpi-file-label:active,
+label.sdpi-file-info:active,
+input[type="file"]::-webkit-file-upload-button:active,
+button:active {
+ background-color: var(--sdpi-color);
+ color: #303030;
+}
+
+input:required:invalid,
+input:focus:invalid {
+ background: var(--sdpi-background)
+ url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjkiIHZpZXdCb3g9IjAgMCA5IDkiPgogICAgPHBhdGggZmlsbD0iI0Q4RDhEOCIgZD0iTTQuNSwwIEM2Ljk4NTI4MTM3LC00LjU2NTM4NzgyZS0xNiA5LDIuMDE0NzE4NjMgOSw0LjUgQzksNi45ODUyODEzNyA2Ljk4NTI4MTM3LDkgNC41LDkgQzIuMDE0NzE4NjMsOSAzLjA0MzU5MTg4ZS0xNiw2Ljk4NTI4MTM3IDAsNC41IEMtMy4wNDM1OTE4OGUtMTYsMi4wMTQ3MTg2MyAyLjAxNDcxODYzLDQuNTY1Mzg3ODJlLTE2IDQuNSwwIFogTTQsMSBMNCw2IEw1LDYgTDUsMSBMNCwxIFogTTQuNSw4IEM0Ljc3NjE0MjM3LDggNSw3Ljc3NjE0MjM3IDUsNy41IEM1LDcuMjIzODU3NjMgNC43NzYxNDIzNyw3IDQuNSw3IEM0LjIyMzg1NzYzLDcgNCw3LjIyMzg1NzYzIDQsNy41IEM0LDcuNzc2MTQyMzcgNC4yMjM4NTc2Myw4IDQuNSw4IFoiLz4KICA8L3N2Zz4)
+ no-repeat 98% center;
+}
+
+input:required:valid {
+ background: var(--sdpi-background)
+ url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjkiIHZpZXdCb3g9IjAgMCA5IDkiPjxwb2x5Z29uIGZpbGw9IiNEOEQ4RDgiIHBvaW50cz0iNS4yIDEgNi4yIDEgNi4yIDcgMy4yIDcgMy4yIDYgNS4yIDYiIHRyYW5zZm9ybT0icm90YXRlKDQwIDQuNjc3IDQpIi8+PC9zdmc+)
+ no-repeat 98% center;
+}
+
+.tooltip,
+:tooltip,
+:title {
+ color: yellow;
+}
+
+.sdpi-item-group.file {
+ width: 232px;
+ display: flex;
+ align-items: center;
+}
+
+.sdpi-file-info {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+ hyphens: auto;
+ min-width: 132px;
+ max-width: 144px;
+ max-height: 32px;
+ margin-top: 0px;
+ margin-left: 5px;
+ display: inline-block;
+ overflow: hidden;
+ padding: 6px 4px;
+ background-color: var(--sdpi-background);
+}
+
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+ box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+ margin: 4px;
+ border-radius: 8px;
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: #999999;
+ outline: 1px solid slategrey;
+ border-radius: 8px;
+}
+
+a {
+ color: #7397d2;
+}
+
+input[type="week"] {
+ -webkit-appearance: auto !important;
+ appearance: auto !important;
+}
+
+input[type="month"] + datalist,
+input[type="day"] + datalist,
+input[type="week"] + datalist,
+input[type="text"] + datalist {
+ display: none !important;
+}
+
+input[type="range"] {
+ -webkit-appearance: auto;
+ appearance: auto;
+ height: 6px;
+ margin-top: 12px;
+ z-index: 0;
+ overflow: visible;
+}
+
+input[type="range"]::-webkit-slider-runnable-track {
+ border: 0px solid transparent;
+}
+
+.sdpi-item[type="range"] .sdpi-item-value.datalist {
+ flex-direction: column;
+}
+
+datalist {
+ --sdpi-datalist-margin: 7px;
+ display: flex;
+ justify-content: space-between;
+ margin-top: 0px;
+ padding-top: 0px;
+ font-size: 12px;
+ margin-left: var(--sdpi-datalist-margin);
+ width: calc(100% - calc(var(--sdpi-datalist-margin) * 2.5));
+}
+
+datalist > option {
+ display: flex;
+ justify-content: center;
+ align-items: end;
+ /* background-image: url(../assets/tick.svg); */
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1' height='8' viewBox='0 0 1 8'%3E%3Crect width='1' height='6' x='0' y='1' fill='%23555'/%3E%3C/svg%3E%0A");
+ padding: 0;
+ font-weight: 400;
+ font-size: 12px;
+ color: #9a9a99;
+ width: 1px;
+ height: 30px;
+ z-index: 1;
+ margin-top: -6px;
+ background-position: top 6px right 5px;
+ background-repeat: repeat no-repeat; /* fallback */
+ background-repeat-y: no-repeat;
+ user-select: none;
+ -webkit-user-select: none;
+}
+
+[role="spinbutton"] {
+ -webkit-appearance: auto;
+ appearance: auto;
+}
+
+/*
+input[type="range"]::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ background-color: var(--sdpi-color);
+ width: 12px;
+ height: 12px;
+ border-radius: 20px;
+ margin-top: -6px;
+ border: none;
+} */
+
+:-webkit-slider-thumb {
+ -webkit-appearance: none;
+ background-color: var(--sdpi-color);
+ width: 16px;
+ height: 16px;
+ border-radius: 20px;
+ margin-top: -6px;
+ border: 1px solid #999999;
+}
+
+.sdpi-item[type="range"] .sdpi-item-group {
+ display: flex;
+ flex-direction: column;
+}
+
+.xxsdpi-item[type="range"] .sdpi-item-group input {
+ max-width: 204px;
+}
+
+.sdpi-item[type="range"] .sdpi-item-group span {
+ margin-left: 0px !important;
+}
+
+.sdpi-item[type="range"] .sdpi-item-group > .sdpi-item-child {
+ display: flex;
+ flex-direction: row;
+}
+
+.rangeLabel {
+ position: absolute;
+ font-weight: normal;
+ margin-top: 24px;
+}
+
+:disabled {
+ color: #993333;
+}
+
+select,
+select option {
+ color: var(--sdpi-color);
+}
+
+select.disabled,
+select option:disabled {
+ color: #fd9494;
+ font-style: italic;
+}
+
+.runningAppsContainer {
+ display: none;
+}
+
+.one-line {
+ min-height: 1.5em;
+}
+
+.two-lines {
+ min-height: 3em;
+}
+
+.three-lines {
+ min-height: 4.5em;
+}
+
+.four-lines {
+ min-height: 6em;
+}
+
+.min80 > .sdpi-item-child {
+ min-width: 80px;
+}
+
+.min100 > .sdpi-item-child {
+ min-width: 100px;
+}
+
+.min120 > .sdpi-item-child {
+ min-width: 120px;
+}
+
+.min140 > .sdpi-item-child {
+ min-width: 140px;
+}
+
+.min160 > .sdpi-item-child {
+ min-width: 160px;
+}
+
+.min200 > .sdpi-item-child {
+ min-width: 200px;
+}
+
+.max40 {
+ flex-basis: 40%;
+ flex-grow: 0;
+}
+
+.max30 {
+ flex-basis: 30%;
+ flex-grow: 0;
+}
+
+.max20 {
+ flex-basis: 20%;
+ flex-grow: 0;
+}
+
+.up20 {
+ margin-top: -20px;
+}
+
+.alignCenter {
+ align-items: center;
+}
+
+.alignTop {
+ align-items: flex-start;
+}
+
+.alignBaseline {
+ align-items: baseline;
+}
+
+.noMargins,
+.noMargins *,
+.noInnerMargins * {
+ margin: 0;
+ padding: 0;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.icon-help,
+.icon-help-line,
+.icon-help-fill,
+.icon-help-inv,
+.icon-brighter,
+.icon-darker,
+.icon-warmer,
+.icon-cooler {
+ min-width: 20px;
+ width: 20px;
+ background-repeat: no-repeat;
+ opacity: 1;
+}
+
+.icon-help:active,
+.icon-help-line:active,
+.icon-help-fill:active,
+.icon-help-inv:active,
+.icon-brighter:active,
+.icon-darker:active,
+.icon-warmer:active,
+.icon-cooler:active {
+ opacity: 0.5;
+}
+
+.icon-brighter,
+.icon-darker,
+.icon-warmer,
+.icon-cooler {
+ margin-top: 5px !important;
+}
+
+.icon-help,
+.icon-help-line,
+.icon-help-fill,
+.icon-help-inv {
+ cursor: pointer;
+ margin: 0px;
+ margin-left: 4px;
+}
+
+.icon-brighter {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Ccircle cx='10' cy='10' r='4'/%3E%3Cpath d='M14.8532861,7.77530426 C14.7173255,7.4682615 14.5540843,7.17599221 14.3666368,6.90157083 L16.6782032,5.5669873 L17.1782032,6.4330127 L14.8532861,7.77530426 Z M10.5,4.5414007 C10.2777625,4.51407201 10.051423,4.5 9.82179677,4.5 C9.71377555,4.5 9.60648167,4.50311409 9.5,4.50925739 L9.5,2 L10.5,2 L10.5,4.5414007 Z M5.38028092,6.75545367 C5.18389364,7.02383457 5.01124349,7.31068015 4.86542112,7.61289977 L2.82179677,6.4330127 L3.32179677,5.5669873 L5.38028092,6.75545367 Z M4.86542112,12.3871002 C5.01124349,12.6893198 5.18389364,12.9761654 5.38028092,13.2445463 L3.32179677,14.4330127 L2.82179677,13.5669873 L4.86542112,12.3871002 Z M9.5,15.4907426 C9.60648167,15.4968859 9.71377555,15.5 9.82179677,15.5 C10.051423,15.5 10.2777625,15.485928 10.5,15.4585993 L10.5,18 L9.5,18 L9.5,15.4907426 Z M14.3666368,13.0984292 C14.5540843,12.8240078 14.7173255,12.5317385 14.8532861,12.2246957 L17.1782032,13.5669873 L16.6782032,14.4330127 L14.3666368,13.0984292 Z'/%3E%3C/g%3E%3C/svg%3E");
+}
+
+.icon-darker {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M10 14C7.790861 14 6 12.209139 6 10 6 7.790861 7.790861 6 10 6 12.209139 6 14 7.790861 14 10 14 12.209139 12.209139 14 10 14zM10 13C11.6568542 13 13 11.6568542 13 10 13 8.34314575 11.6568542 7 10 7 8.34314575 7 7 8.34314575 7 10 7 11.6568542 8.34314575 13 10 13zM14.8532861 7.77530426C14.7173255 7.4682615 14.5540843 7.17599221 14.3666368 6.90157083L16.6782032 5.5669873 17.1782032 6.4330127 14.8532861 7.77530426zM10.5 4.5414007C10.2777625 4.51407201 10.051423 4.5 9.82179677 4.5 9.71377555 4.5 9.60648167 4.50311409 9.5 4.50925739L9.5 2 10.5 2 10.5 4.5414007zM5.38028092 6.75545367C5.18389364 7.02383457 5.01124349 7.31068015 4.86542112 7.61289977L2.82179677 6.4330127 3.32179677 5.5669873 5.38028092 6.75545367zM4.86542112 12.3871002C5.01124349 12.6893198 5.18389364 12.9761654 5.38028092 13.2445463L3.32179677 14.4330127 2.82179677 13.5669873 4.86542112 12.3871002zM9.5 15.4907426C9.60648167 15.4968859 9.71377555 15.5 9.82179677 15.5 10.051423 15.5 10.2777625 15.485928 10.5 15.4585993L10.5 18 9.5 18 9.5 15.4907426zM14.3666368 13.0984292C14.5540843 12.8240078 14.7173255 12.5317385 14.8532861 12.2246957L17.1782032 13.5669873 16.6782032 14.4330127 14.3666368 13.0984292z'/%3E%3C/g%3E%3C/svg%3E");
+}
+
+.icon-warmer {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M12.3247275 11.4890349C12.0406216 11.0007637 11.6761954 10.5649925 11.2495475 10.1998198 11.0890394 9.83238991 11 9.42659309 11 9 11 7.34314575 12.3431458 6 14 6 15.6568542 6 17 7.34314575 17 9 17 10.6568542 15.6568542 12 14 12 13.3795687 12 12.8031265 11.8116603 12.3247275 11.4890349zM17.6232392 11.6692284C17.8205899 11.4017892 17.9890383 11.1117186 18.123974 10.8036272L20.3121778 12.0669873 19.8121778 12.9330127 17.6232392 11.6692284zM18.123974 7.19637279C17.9890383 6.88828142 17.8205899 6.5982108 17.6232392 6.33077158L19.8121778 5.0669873 20.3121778 5.9330127 18.123974 7.19637279zM14.5 4.52746439C14.3358331 4.50931666 14.1690045 4.5 14 4.5 13.8309955 4.5 13.6641669 4.50931666 13.5 4.52746439L13.5 2 14.5 2 14.5 4.52746439zM13.5 13.4725356C13.6641669 13.4906833 13.8309955 13.5 14 13.5 14.1690045 13.5 14.3358331 13.4906833 14.5 13.4725356L14.5 16 13.5 16 13.5 13.4725356zM14 11C15.1045695 11 16 10.1045695 16 9 16 7.8954305 15.1045695 7 14 7 12.8954305 7 12 7.8954305 12 9 12 10.1045695 12.8954305 11 14 11zM9.5 11C10.6651924 11.4118364 11.5 12.5 11.5 14 11.5 16 10 17.5 8 17.5 6 17.5 4.5 16 4.5 14 4.5 12.6937812 5 11.5 6.5 11L6.5 7 9.5 7 9.5 11z'/%3E%3Cpath d='M12,14 C12,16.209139 10.209139,18 8,18 C5.790861,18 4,16.209139 4,14 C4,12.5194353 4.80439726,11.2267476 6,10.5351288 L6,4 C6,2.8954305 6.8954305,2 8,2 C9.1045695,2 10,2.8954305 10,4 L10,10.5351288 C11.1956027,11.2267476 12,12.5194353 12,14 Z M11,14 C11,12.6937812 10.1651924,11.5825421 9,11.1707057 L9,4 C9,3.44771525 8.55228475,3 8,3 C7.44771525,3 7,3.44771525 7,4 L7,11.1707057 C5.83480763,11.5825421 5,12.6937812 5,14 C5,15.6568542 6.34314575,17 8,17 C9.65685425,17 11,15.6568542 11,14 Z'/%3E%3C/g%3E%3C/svg%3E");
+}
+
+.icon-cooler {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M10.4004569 11.6239517C10.0554735 10.9863849 9.57597206 10.4322632 9 9.99963381L9 9.7450467 9.53471338 9.7450467 10.8155381 8.46422201C10.7766941 8.39376637 10.7419749 8.32071759 10.7117062 8.2454012L9 8.2454012 9 6.96057868 10.6417702 6.96057868C10.6677696 6.86753378 10.7003289 6.77722682 10.7389179 6.69018783L9.44918707 5.40045694 9 5.40045694 9 4.34532219 9.32816127 4.34532219 9.34532219 2.91912025 10.4004569 2.91912025 10.4004569 4.53471338 11.6098599 5.74411634C11.7208059 5.68343597 11.8381332 5.63296451 11.9605787 5.59396526L11.9605787 3.8884898 10.8181818 2.74609294 11.5642748 2 12.5727518 3.00847706 13.5812289 2 14.3273218 2.74609294 13.2454012 3.82801356 13.2454012 5.61756719C13.3449693 5.65339299 13.4408747 5.69689391 13.5324038 5.74735625L14.7450467 4.53471338 14.7450467 2.91912025 15.8001815 2.91912025 15.8001815 4.34532219 17.2263834 4.34532219 17.2263834 5.40045694 15.6963166 5.40045694 14.4002441 6.69652946C14.437611 6.78161093 14.4692249 6.86979146 14.4945934 6.96057868L16.2570138 6.96057868 17.3994107 5.81818182 18.1455036 6.56427476 17.1370266 7.57275182 18.1455036 8.58122888 17.3994107 9.32732182 16.3174901 8.2454012 14.4246574 8.2454012C14.3952328 8.31861737 14.3616024 8.38969062 14.3240655 8.45832192L15.6107903 9.7450467 17.2263834 9.7450467 17.2263834 10.8001815 15.8001815 10.8001815 15.8001815 12.2263834 14.7450467 12.2263834 14.7450467 10.6963166 13.377994 9.32926387C13.3345872 9.34850842 13.2903677 9.36625331 13.2454012 9.38243281L13.2454012 11.3174901 14.3273218 12.3994107 13.5812289 13.1455036 12.5848864 12.1491612 11.5642748 13.1455036 10.8181818 12.3994107 11.9605787 11.2570138 11.9605787 9.40603474C11.8936938 9.38473169 11.828336 9.36000556 11.7647113 9.33206224L10.4004569 10.6963166 10.4004569 11.6239517zM12.75 8.5C13.3022847 8.5 13.75 8.05228475 13.75 7.5 13.75 6.94771525 13.3022847 6.5 12.75 6.5 12.1977153 6.5 11.75 6.94771525 11.75 7.5 11.75 8.05228475 12.1977153 8.5 12.75 8.5zM9.5 14C8.5 16.3333333 7.33333333 17.5 6 17.5 4.66666667 17.5 3.5 16.3333333 2.5 14L9.5 14z'/%3E%3Cpath d='M10,14 C10,16.209139 8.209139,18 6,18 C3.790861,18 2,16.209139 2,14 C2,12.5194353 2.80439726,11.2267476 4,10.5351288 L4,4 C4,2.8954305 4.8954305,2 6,2 C7.1045695,2 8,2.8954305 8,4 L8,10.5351288 C9.19560274,11.2267476 10,12.5194353 10,14 Z M9,14 C9,12.6937812 8.16519237,11.5825421 7,11.1707057 L7,4 C7,3.44771525 6.55228475,3 6,3 C5.44771525,3 5,3.44771525 5,4 L5,11.1707057 C3.83480763,11.5825421 3,12.6937812 3,14 C3,15.6568542 4.34314575,17 6,17 C7.65685425,17 9,15.6568542 9,14 Z'/%3E%3C/g%3E%3C/svg%3E");
+}
+
+.icon-help {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill='%23999' d='M11.292 12.516l.022 1.782H9.07v-1.804c0-1.98 1.276-2.574 2.662-3.278h-.022c.814-.44 1.65-.88 1.694-2.2.044-1.386-1.122-2.728-3.234-2.728-1.518 0-2.662.902-3.366 2.354L5 5.608C5.946 3.584 7.662 2 10.17 2c3.564 0 5.632 2.442 5.588 5.06-.066 2.618-1.716 3.41-3.102 4.158-.704.374-1.364.682-1.364 1.298zm-1.122 2.442c.858 0 1.452.594 1.452 1.452 0 .682-.594 1.408-1.452 1.408-.77 0-1.386-.726-1.386-1.408 0-.858.616-1.452 1.386-1.452z'/%3E%3C/svg%3E");
+}
+
+.icon-help-line {
+ background-image: url("data:image/svg+xml,%3Csvg width='20' height='20' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23999' fill-rule='evenodd'%3E%3Cpath d='M10 20C4.477 20 0 15.523 0 10S4.477 0 10 0s10 4.477 10 10-4.477 10-10 10zm0-1a9 9 0 1 0 0-18 9 9 0 0 0 0 18z'/%3E%3Cpath d='M10.848 12.307l.02 1.578H8.784v-1.597c0-1.753 1.186-2.278 2.474-2.901h-.02c.756-.39 1.533-.78 1.574-1.948.041-1.226-1.043-2.414-3.006-2.414-1.41 0-2.474.798-3.128 2.083L5 6.193C5.88 4.402 7.474 3 9.805 3 13.118 3 15.04 5.161 15 7.478c-.061 2.318-1.595 3.019-2.883 3.68-.654.332-1.268.604-1.268 1.15zM9.805 14.47c.798 0 1.35.525 1.35 1.285 0 .603-.552 1.246-1.35 1.246-.715 0-1.288-.643-1.288-1.246 0-.76.573-1.285 1.288-1.285z' fill-rule='nonzero'/%3E%3C/g%3E%3C/svg%3E");
+}
+
+.icon-help-fill {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle cx='10' cy='10' r='10' fill='%23999'/%3E%3Cpath fill='%23FFF' fill-rule='nonzero' d='M8.368 7.189H5C5 3.5 7.668 2 10.292 2 13.966 2 16 4.076 16 7.012c0 3.754-3.849 3.136-3.849 5.211v1.656H8.455v-1.832c0-2.164 1.4-2.893 2.778-3.6.437-.242 1.006-.574 1.006-1.236 0-2.208-3.871-2.142-3.871-.022zM10.25 18a1.75 1.75 0 1 1 0-3.5 1.75 1.75 0 0 1 0 3.5z'/%3E%3C/g%3E%3C/svg%3E");
+}
+
+.icon-help-inv {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill='%23999' fill-rule='evenodd' d='M10 20C4.477 20 0 15.523 0 10S4.477 0 10 0s10 4.477 10 10-4.477 10-10 10zM8.368 7.189c0-2.12 3.87-2.186 3.87.022 0 .662-.568.994-1.005 1.236-1.378.707-2.778 1.436-2.778 3.6v1.832h3.696v-1.656c0-2.075 3.849-1.457 3.849-5.21C16 4.075 13.966 2 10.292 2 7.668 2 5 3.501 5 7.189h3.368zM10.25 18a1.75 1.75 0 1 0 0-3.5 1.75 1.75 0 0 0 0 3.5z'/%3E%3C/svg%3E");
+}
+
+.kelvin::after {
+ content: "K";
+}
+
+.mired::after {
+ content: " Mired";
+}
+
+.percent::after {
+ content: "%";
+}
+
+.sdpi-item-value + .icon-cooler,
+.sdpi-item-value + .icon-warmer {
+ margin-left: 0px !important;
+ margin-top: 15px !important;
+}
+
+/**
+ CONTROL-CENTER STYLES
+*/
+input[type="range"].colorbrightness::-webkit-slider-runnable-track,
+input[type="range"].colortemperature::-webkit-slider-runnable-track {
+ height: 8px;
+ background: #979797;
+ border-radius: 4px;
+ background-image: linear-gradient(to right, #94d0ec, #ffb165);
+}
+
+input[type="range"].colorbrightness.greyscale::-webkit-slider-runnable-track,
+input[type="range"].colorbrightness.grayscale::-webkit-slider-runnable-track {
+ background-color: #efefef;
+ background-image: linear-gradient(to right, black, rgba(0, 0, 0, 0));
+}
+
+input[type="range"].colorbrightness::-webkit-slider-thumb,
+input[type="range"].colortemperature::-webkit-slider-thumb {
+ width: 16px;
+ height: 16px;
+ border-radius: 20px;
+ margin-top: -5px;
+ background-color: #86c6e8;
+ box-shadow: 0px 0px 1px #000000;
+ border: 1px solid #d8d8d8;
+}
+
+.sdpi-info-label {
+ display: inline-block;
+ user-select: none;
+ position: absolute;
+ height: 15px;
+ width: auto;
+ text-align: center;
+ border-radius: 4px;
+ min-width: 44px;
+ max-width: 80px;
+ background: white;
+ font-size: 11px;
+ color: black;
+ z-index: 1000;
+ box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.8);
+ padding: 2px;
+}
+
+.sdpi-info-label.hidden {
+ opacity: 0;
+ transition: opacity 0.25s linear;
+}
+
+.sdpi-info-label.shown {
+ position: absolute;
+ opacity: 1;
+ transition: opacity 0.25s ease-out;
+}
+
+/* adding some styles here that override sdpi things so we can use this as notes for sdpi updates*/
+select {
+ min-width: 0px;
+
+ /* this is a clunky fix for using background image as select arrow with long text options */
+ -webkit-appearance: media-slider;
+ text-overflow: ellipsis;
+}
+
+/*--------- context menu ----------*/
+
+.context-menu {
+ display: none;
+ position: absolute;
+ z-index: 10;
+ padding: 12px 0;
+ width: 120px;
+ background-color: #3d3d3d;
+ border: solid 1px #dfdfdf;
+ box-shadow: 1px 1px 2px #cfcfcf;
+}
+
+.context-menu--active {
+ display: block;
+}
+
+.context-menu__items {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ overflow-y: auto;
+}
+
+.context-menu__item {
+ display: block;
+ margin-bottom: 4px;
+ background-color: #3d3d3d !important;
+}
+
+.context-menu__item:last-child {
+ margin-bottom: 0;
+}
+
+.context-menu__link {
+ display: block;
+ padding: 4px 12px;
+ color: #ffff;
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.context-menu__link:hover {
+ color: #fff;
+ background-color: #0066aa;
+}
+
+.context-menu_message {
+ cursor: default;
+}
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/switchProfile.html b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/switchProfile.html
new file mode 100644
index 0000000..338764e
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/files/propertyInspector/switchProfile.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/rustfmt.toml b/plugins/com.amansprojects.starterpack.sdPlugin/rustfmt.toml
new file mode 100644
index 0000000..751a0aa
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/rustfmt.toml
@@ -0,0 +1,3 @@
+edition = "2021"
+hard_tabs = true
+newline_style = "Unix"
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/src/input_simulation.rs b/plugins/com.amansprojects.starterpack.sdPlugin/src/input_simulation.rs
new file mode 100644
index 0000000..13abe6f
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/src/input_simulation.rs
@@ -0,0 +1,38 @@
+use openaction::*;
+
+use enigo::{
+ agent::{Agent, Token},
+ Enigo, Settings,
+};
+
+pub fn key_down(event: KeyEvent) -> EventHandlerResult {
+ if let Some(value) = event.payload.settings.as_object().unwrap().get("down") {
+ let value = value.as_str().unwrap();
+ if value.trim().is_empty() {
+ return Ok(());
+ }
+ let mut enigo = Enigo::new(&Settings::default())?;
+ let tokens: Vec = ron::from_str(value)?;
+ for token in tokens {
+ enigo.execute(&token).unwrap();
+ }
+ }
+
+ Ok(())
+}
+
+pub fn key_up(event: KeyEvent) -> EventHandlerResult {
+ if let Some(value) = event.payload.settings.as_object().unwrap().get("up") {
+ let value = value.as_str().unwrap();
+ if value.trim().is_empty() {
+ return Ok(());
+ }
+ let mut enigo = Enigo::new(&Settings::default())?;
+ let tokens: Vec = ron::from_str(value)?;
+ for token in tokens {
+ enigo.execute(&token).unwrap();
+ }
+ }
+
+ Ok(())
+}
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/src/main.rs b/plugins/com.amansprojects.starterpack.sdPlugin/src/main.rs
new file mode 100644
index 0000000..5e8cb22
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/src/main.rs
@@ -0,0 +1,51 @@
+mod input_simulation;
+mod run_command;
+mod switch_profile;
+
+use openaction::*;
+
+struct GlobalEventHandler {}
+impl openaction::GlobalEventHandler for GlobalEventHandler {}
+
+struct ActionEventHandler {}
+impl openaction::ActionEventHandler for ActionEventHandler {
+ async fn key_down(
+ &self,
+ event: KeyEvent,
+ _outbound: &mut openaction::OutboundEventManager,
+ ) -> EventHandlerResult {
+ match &event.action[..] {
+ "com.amansprojects.starterpack.runcommand" => run_command::key_down(event),
+ "com.amansprojects.starterpack.inputsimulation" => input_simulation::key_down(event),
+ _ => Ok(()),
+ }
+ }
+
+ async fn key_up(
+ &self,
+ event: KeyEvent,
+ _outbound: &mut openaction::OutboundEventManager,
+ ) -> EventHandlerResult {
+ match &event.action[..] {
+ "com.amansprojects.starterpack.runcommand" => run_command::key_up(event),
+ "com.amansprojects.starterpack.inputsimulation" => input_simulation::key_up(event),
+ "com.amansprojects.starterpack.switchprofile" => switch_profile::key_up(event),
+ _ => Ok(()),
+ }
+ }
+}
+
+#[tokio::main]
+async fn main() {
+ simplelog::TermLogger::init(
+ simplelog::LevelFilter::Debug,
+ simplelog::Config::default(),
+ simplelog::TerminalMode::Stdout,
+ simplelog::ColorChoice::Never,
+ )
+ .unwrap();
+
+ if let Err(error) = init_plugin(GlobalEventHandler {}, ActionEventHandler {}).await {
+ log::error!("Failed to initialise plugin: {}", error);
+ }
+}
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/src/run_command.rs b/plugins/com.amansprojects.starterpack.sdPlugin/src/run_command.rs
new file mode 100644
index 0000000..cb5e81b
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/src/run_command.rs
@@ -0,0 +1,85 @@
+use std::io::Read;
+use std::process::{Command, Stdio};
+
+use openaction::*;
+
+async fn run_command(event: KeyEvent, action: &str) -> EventHandlerResult {
+ let settings = event.payload.settings.as_object().unwrap();
+ let Some(value) = settings.get(action).map(|v| v.as_str().unwrap()) else {
+ return Ok(());
+ };
+ if value.is_empty() {
+ return Ok(());
+ }
+
+ #[cfg(unix)]
+ let command = if std::env::var("container").is_ok() {
+ "flatpak-spawn"
+ } else {
+ "sh"
+ };
+ #[cfg(unix)]
+ let extra_args = if std::env::var("container").is_ok() {
+ vec!["--host", "sh", "-c"]
+ } else {
+ vec!["-c"]
+ };
+
+ #[cfg(windows)]
+ let command = "cmd";
+ #[cfg(windows)]
+ let extra_args = ["/C"];
+
+ let (mut reader, writer) = os_pipe::pipe()?;
+ let mut command = Command::new(command);
+ command
+ .args(extra_args)
+ .arg(value)
+ .stdout(Stdio::from(writer.try_clone()?))
+ .stderr(Stdio::from(writer));
+ command.spawn()?.wait()?;
+ drop(command);
+ let mut output = String::new();
+ reader.read_to_string(&mut output)?;
+
+ if let Some(path) = settings.get("file").map(|v| v.as_str().unwrap()) {
+ if !path.is_empty() {
+ tokio::fs::write(path, &output).await?;
+ }
+ }
+
+ if settings
+ .get("show")
+ .unwrap_or(&serde_json::Value::Bool(false))
+ .as_bool()
+ .unwrap()
+ {
+ let mut lock = OUTBOUND_EVENT_MANAGER.lock().await;
+ let outbound = lock.as_mut().unwrap();
+ outbound
+ .set_title(event.context, Some(output.trim().to_owned()), None)
+ .await?;
+ }
+
+ Ok(())
+}
+
+pub fn key_down(event: KeyEvent) -> EventHandlerResult {
+ tokio::spawn(async move {
+ if let Err(error) = run_command(event, "down").await {
+ log::warn!("Failed to run command: {error}");
+ }
+ });
+
+ Ok(())
+}
+
+pub fn key_up(event: KeyEvent) -> EventHandlerResult {
+ tokio::spawn(async move {
+ if let Err(error) = run_command(event, "up").await {
+ log::warn!("Failed to run command: {error}");
+ }
+ });
+
+ Ok(())
+}
diff --git a/plugins/com.amansprojects.starterpack.sdPlugin/src/switch_profile.rs b/plugins/com.amansprojects.starterpack.sdPlugin/src/switch_profile.rs
new file mode 100644
index 0000000..e1c90fe
--- /dev/null
+++ b/plugins/com.amansprojects.starterpack.sdPlugin/src/switch_profile.rs
@@ -0,0 +1,39 @@
+use openaction::*;
+
+// Non-spec OpenDeck-specific protocols are used in this file.
+
+#[derive(serde::Serialize)]
+struct SwitchProfileEvent {
+ event: &'static str,
+ device: String,
+ profile: String,
+}
+
+pub fn key_up(event: KeyEvent) -> EventHandlerResult {
+ if let Some(value) = event.payload.settings.as_object().unwrap().get("profile") {
+ let (mut stream, _) = tungstenite::connect(format!(
+ "ws://localhost:{}",
+ std::env::args().nth(2).unwrap()
+ ))?;
+ stream.write(tungstenite::Message::text(serde_json::to_string(
+ &SwitchProfileEvent {
+ event: "switchProfile",
+ device: event
+ .payload
+ .settings
+ .as_object()
+ .unwrap()
+ .get("device")
+ .unwrap()
+ .as_str()
+ .unwrap()
+ .to_owned(),
+ profile: value.as_str().unwrap().to_owned(),
+ },
+ )?))?;
+ stream.close(None)?;
+ stream.flush()?;
+ }
+
+ Ok(())
+}