From e942db3cc84365c2f70076e7b227010aae48e7df Mon Sep 17 00:00:00 2001 From: Jaouher Kharrat Date: Wed, 19 May 2021 11:56:48 -0700 Subject: [PATCH] :arrow_up: v2.1.0 - multi provider + city name (#3) --- .gitignore | 3 + CHANGELOG.md | 29 +- README.md | 31 +- Release/com.jk.weather.streamDeckPlugin | Bin 61550 -> 71325 bytes Sources/com.jk.weather.sdPlugin/manifest.json | 77 +- .../com.jk.weather.sdPlugin/pi/main_pi.html | 114 +- Sources/com.jk.weather.sdPlugin/pi/main_pi.js | 174 +-- Sources/com.jk.weather.sdPlugin/pi/sdpi.css | 1162 ++++++++--------- .../com.jk.weather.sdPlugin/plugin/main.html | 12 +- .../com.jk.weather.sdPlugin/plugin/main.js | 329 +++-- 10 files changed, 1045 insertions(+), 886 deletions(-) diff --git a/.gitignore b/.gitignore index f045556..574218a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # IntelliJ project files .idea + +# vscode project files +.vscode diff --git a/CHANGELOG.md b/CHANGELOG.md index b6e5000..ada4d01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,45 +1,67 @@ # Changelog + All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.1.0] - 2020-05-19 + +### Added + +- New provider Open Map API for weather data +- Add weather Icon + city name in same canvas and render from it +- Display city name +- Generic link to "Get API Key" dependant on the selected provider +- Added badge of version + +### Changed + +- Align software and hardware display +- Fix small bugs + ## [2.0.2] - 2020-04-25 ### Changed + - New function to set default value for dropdown - Cleaned javascript code ## [2.0.1] - 2020-04-20 ### Added + - Catch failure in response from weatherAPI to display error alert - Show the city name in the software title - Initial gitignore and Changelog files ### Changed + - Updated manifest file (tooltip, author full name, author website, description, version bump) - Force the city name to be transformed to lowercase - Added a link in plugin to submit a bug report - Screenshot for readme updated ### Removed + - hidden .idea folder has been deleted ## [2.0.0] - 2020-04-18 ### Added + - Possible selection of temperature units (celsius or fahrenheit) - Set frequency of fetching of data (on push, 10 minutes, 30 minutes, 1 hour) ### Changed -- Select provider drop down list -- Rework the whole script for fetching data while implementing setInterval to get relevant data -### Removed +- Select provider drop down list +- Rework the whole script for fetching data while implementing setInterval to get relevant data ## [1.0.0] - 2020-04-16 + ### Added + - Initial structure of plugin - link to weatherAPI to fetch data - Inputs provided are API key and City @@ -48,3 +70,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [2.0.0]: https://github.com/JaouherK/streamDeck-weatherPlugin/releases/tag/v1.0 [2.0.1]: https://github.com/JaouherK/streamDeck-weatherPlugin/releases/tag/v2.0.1 [2.0.2]: https://github.com/JaouherK/streamDeck-weatherPlugin/releases/tag/v2.0.2 +[2.0.2]: https://github.com/JaouherK/streamDeck-weatherPlugin/releases/tag/v2.1.0 diff --git a/README.md b/README.md index 4947163..d341264 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,31 @@ -# Description +# Weather -`Weather` is a plugin that displays the weather condition and the temperature of a given city. It is connected to WeatherApi provider and needs an API Key to connect. +[![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/JaouherK/a489177df4f24946281bdc1b21524b13/raw/2a1aa8de67ca47bf45667a18bd2cdd8bc6ea0e30/weatherMetaData.json)](https://github.com/JaouherK/streamDeck-weatherPlugin/releases/tag/v2.1.0) + +`Weather` is a plugin that displays the weather condition as a picture image, the city name and the temperature of a given location. It is connected to multiple providers and needs an API Key to connect. + +Possible providers: + +- WeatherAPI +- OpenWeather Optionally, you can choose the frequency of fetching updated data and the temperature unit ( Celsius or Fahrenheit). +# Button settings + +The button is configured as follows: + +- Title: Please do not set any value in order to display the temperature correctly +- Image: Please do not update picture in order to display the weather icon correctly +- Provider: the weather information provider: WeatherAPI or OpenWeather +- API key: your provider account key available in your account information on the associated provider website +- City Name: the city for which the information will be displayed on the button +- Temperature: the temperature unit ( Celsius or Fahrenheit) +- Fetch frequency: how often the data is updated (beware for free accounts the limits set by the provider) +- "Get my API key" button: to retrieve the key for your account +- "Report bug" button: to report a bug + # Features - code written in Javascript @@ -13,16 +34,14 @@ Optionally, you can choose the frequency of fetching updated data and the temper - Choose temperature unit - choose fetching frequency of the weather data -![](screenshot.png) - +![screen](screenshot.png) # Installation In the Release folder, you can find the file `com.jk.weather.streamDeckPlugin`. If you double-click this file on your machine, Stream Deck will install the plugin. - # Source code The `Sources` folder contains the source code of the plugin. -
Application main icon made by Smashicons from www.flaticon.com
+Application main icon made by [Smashicons](https://www.flaticon.com/authors/smashicons) from [www.flaticon.com](https://www.flaticon.com/) diff --git a/Release/com.jk.weather.streamDeckPlugin b/Release/com.jk.weather.streamDeckPlugin index acd5bd28071381c56c01c2bb7fb95eab56a3dd3e..e42111509f9bff27dacc55b46061f2b711bbe970 100644 GIT binary patch delta 23508 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 delta 14294 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 - - - + + com.jk.weather.pi - + - + - - - - + diff --git a/Sources/com.jk.weather.sdPlugin/pi/main_pi.js b/Sources/com.jk.weather.sdPlugin/pi/main_pi.js index 707d5d3..26555c8 100644 --- a/Sources/com.jk.weather.sdPlugin/pi/main_pi.js +++ b/Sources/com.jk.weather.sdPlugin/pi/main_pi.js @@ -1,98 +1,118 @@ let websocket = null, - uuid = null, - actionInfo = {}; + uuid = null, + actionInfo = {}; -function connectElgatoStreamDeckSocket(inPort, inPropertyInspectorUUID, inRegisterEvent, inInfo, inActionInfo) { +function connectElgatoStreamDeckSocket( + inPort, + inPropertyInspectorUUID, + inRegisterEvent, + inInfo, + inActionInfo +) { + uuid = inPropertyInspectorUUID; + actionInfo = JSON.parse(inActionInfo); - uuid = inPropertyInspectorUUID; - actionInfo = JSON.parse(inActionInfo); + websocket = new WebSocket("ws://localhost:" + inPort); - websocket = new WebSocket("ws://localhost:" + inPort); - - websocket.onopen = function () { - // WebSocket is connected, register the Property Inspector - let json = { - event: inRegisterEvent, - uuid: inPropertyInspectorUUID - }; - websocket.send(JSON.stringify(json)); - - json = { - event: "getSettings", - context: uuid, - }; - websocket.send(JSON.stringify(json)); + websocket.onopen = function () { + // WebSocket is connected, register the Property Inspector + let json = { + event: inRegisterEvent, + uuid: inPropertyInspectorUUID, + }; + websocket.send(JSON.stringify(json)); - json = { - event: "getGlobalSettings", - context: uuid, - }; - websocket.send(JSON.stringify(json)); + json = { + event: "getSettings", + context: uuid, }; + websocket.send(JSON.stringify(json)); - websocket.onmessage = function (evt) { - // Received message from Stream Deck - const jsonObj = JSON.parse(evt.data); - if (jsonObj.event === "didReceiveSettings") { - const payload = jsonObj.payload.settings; - initiateElement("cityName", payload.cityName); - initiateElement("frequency", payload.frequency, 0); - initiateElement("unit", payload.unit, "celsius"); - } - if (jsonObj.event === "didReceiveGlobalSettings") { - const payload = jsonObj.payload.settings; - initiateElement("apiKey", payload.apiKey); - const el = document.querySelector(".sdpi-wrapper"); - el && el.classList.remove("hidden"); - } + json = { + event: "getGlobalSettings", + context: uuid, }; + websocket.send(JSON.stringify(json)); + }; + websocket.onmessage = function (evt) { + // Received message from Stream Deck + const jsonObj = JSON.parse(evt.data); + if (jsonObj.event === "didReceiveSettings") { + const payload = jsonObj.payload.settings; + initiateElement("cityName", payload.cityName); + initiateElement("frequency", payload.frequency, 0); + initiateElement("unit", payload.unit, "celsius"); + } + if (jsonObj.event === "didReceiveGlobalSettings") { + const payload = jsonObj.payload.settings; + initiateElement("apiKey", payload.apiKey); + initiateElement("provider", payload.provider, "weatherApi"); + const el = document.querySelector(".sdpi-wrapper"); + el && el.classList.remove("hidden"); + } + }; } function initiateElement(element, value, fallback = "") { - if (typeof value === 'undefined') { - document.getElementById(element).value = fallback; - return; - } - document.getElementById(element).value = value; + if (typeof value === "undefined") { + document.getElementById(element).value = fallback; + return; + } + document.getElementById(element).value = value; } function updateSettings() { - if (websocket && (websocket.readyState === 1)) { - let payload = {}; - payload.cityName = document.getElementById("cityName").value; - payload.frequency = document.getElementById("frequency").value; - payload.unit = document.getElementById("unit").value; - const json = { - event: "setSettings", - context: uuid, - payload: payload - }; - websocket.send(JSON.stringify(json)); - } + if (websocket && websocket.readyState === 1) { + let payload = {}; + payload.cityName = document.getElementById("cityName").value; + payload.frequency = document.getElementById("frequency").value; + payload.unit = document.getElementById("unit").value; + const json = { + event: "setSettings", + context: uuid, + payload: payload, + }; + websocket.send(JSON.stringify(json)); + } } -function updateApiKey() { - if (websocket && (websocket.readyState === 1)) { - let payload = {}; - payload.apiKey = document.getElementById("apiKey").value; - const json = { - event: "setGlobalSettings", - context: uuid, - payload - }; - websocket.send(JSON.stringify(json)); - } +function updateGlobal() { + if (websocket && websocket.readyState === 1) { + let payload = {}; + payload.provider = document.getElementById("provider").value; + payload.apiKey = document.getElementById("apiKey").value; + const json = { + event: "setGlobalSettings", + context: uuid, + payload, + }; + websocket.send(JSON.stringify(json)); + } } function openPage(site) { - if (websocket && (websocket.readyState === 1)) { - const json = { - event: "openUrl", - payload: { - url: `https://${site}` - } - }; - websocket.send(JSON.stringify(json)); - } + if (websocket && websocket.readyState === 1) { + const json = { + event: "openUrl", + payload: { + url: `https://${site}`, + }, + }; + websocket.send(JSON.stringify(json)); + } +} + +function getProviderUrl() { + const provider = document.getElementById("provider").value; + let url; + switch (provider) { + case "weatherApi": + url = "weatherapi.com/my/"; + break; + case "openWeatherMap": + url = "home.openweathermap.org/api_keys"; + break; + } + return url; } diff --git a/Sources/com.jk.weather.sdPlugin/pi/sdpi.css b/Sources/com.jk.weather.sdPlugin/pi/sdpi.css index 362f2b1..9ef7647 100644 --- a/Sources/com.jk.weather.sdPlugin/pi/sdpi.css +++ b/Sources/com.jk.weather.sdPlugin/pi/sdpi.css @@ -1,83 +1,85 @@ html { - --sdpi-bgcolor: #2D2D2D; - --sdpi-background: #3D3D3D; - --sdpi-color: #d8d8d8; - --sdpi-bordercolor: #3a3a3a; - --sdpi-borderradius: 0px; - --sdpi-width: 224px; - --sdpi-fontweight: 600; - --sdpi-letterspacing: -0.25pt; - height: 100%; - width: 100%; - overflow: hidden; + --sdpi-bgcolor: #2d2d2d; + --sdpi-background: #3d3d3d; + --sdpi-color: #d8d8d8; + --sdpi-bordercolor: #3a3a3a; + --sdpi-borderradius: 0px; + --sdpi-width: 224px; + --sdpi-fontweight: 600; + --sdpi-letterspacing: -0.25pt; + height: 100%; + width: 100%; + overflow: hidden; } 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; + 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; + 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); + background-color: var(--sdpi-bgcolor); + color: var(--sdpi-color); } .hidden { - display: none; + display: none; } hr, hr2 { - -webkit-margin-before: 1em; - -webkit-margin-after: 1em; - border-style: none; - background: var(--sdpi-background); - height: 1px; + -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; + display: flex; + flex-basis: 100%; + align-items: center; + color: inherit; + font-size: 9pt; + margin: 8px 0px; } .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; + content: ""; + flex-grow: 1; + background: var(--sdpi-background); + height: 1px; + font-size: 0px; + line-height: 0px; + margin: 0px 16px; } hr2 { - height: 2px; + height: 2px; } hr, hr2 { - margin-left: 16px; - margin-right: 16px; + margin-left: 16px; + margin-right: 16px; } .sdpi-item-value, @@ -85,105 +87,103 @@ option, input, select, button { - font-size: 10pt; - font-weight: var(--sdpi-fontweight); - letter-spacing: var(--sdpi-letterspacing); + font-size: 10pt; + font-weight: var(--sdpi-fontweight); + letter-spacing: var(--sdpi-letterspacing); } - .win .sdpi-item-value, .win option, .win input, .win select, .win button { - font-size: 11px; - font-style: normal; - letter-spacing: inherit; - font-weight: 100; + font-size: 11px; + font-style: normal; + letter-spacing: inherit; + font-weight: 100; } .win button { - font-size: 12px; + font-size: 12px; } ::-webkit-progress-value, meter::-webkit-meter-optimum-value { - border-radius: 2px; + border-radius: 2px; } ::-webkit-progress-bar, meter::-webkit-meter-bar { - border-radius: 3px; - background: var(--sdpi-background); + border-radius: 3px; + background: var(--sdpi-background); } ::-webkit-progress-bar:active, meter::-webkit-meter-bar:active { - border-radius: 3px; - background: #222222; + border-radius: 3px; + background: #222222; } ::-webkit-progress-value:active, meter::-webkit-meter-optimum-value:active { - background: #99f; + background: #99f; } progress, progress.sdpi-item-value { - min-height: 5px !important; - height: 5px; - background-color: #303030; + min-height: 5px !important; + height: 5px; + background-color: #303030; } progress { - margin-top: 8px !important; - margin-bottom: 8px !important; + margin-top: 8px !important; + margin-bottom: 8px !important; } .full progress, progress.full { - margin-top: 3px !important; + margin-top: 3px !important; } ::-webkit-progress-inner-element { - background-color: transparent; + background-color: transparent; } - .sdpi-item[type="progress"] { - margin-top: 4px !important; - margin-bottom: 12px; - min-height: 15px; + margin-top: 4px !important; + margin-bottom: 12px; + min-height: 15px; } .sdpi-item-child.full:last-child { - margin-bottom: 4px; + margin-bottom: 4px; } .tabs { - display: flex; + display: flex; - border-bottom: 1px solid #D7DBDD; + border-bottom: 1px solid #d7dbdd; } .tab { - cursor: pointer; - padding: 5px 30px; - color: #16a2d7; - font-size: 9pt; - border-bottom: 2px solid transparent; + cursor: pointer; + padding: 5px 30px; + color: #16a2d7; + font-size: 9pt; + border-bottom: 2px solid transparent; } .tab.is-tab-selected { - border-bottom-color: #4ebbe4; + border-bottom-color: #4ebbe4; } select { - -webkit-appearance: none; - -moz-appearance: none; - -o-appearance: none; - appearance: none; - background: url(caret.svg) no-repeat 97% center; + -webkit-appearance: none; + -moz-appearance: none; + -o-appearance: none; + appearance: none; + background: url(caret.svg) no-repeat 97% center; } label.sdpi-file-label, @@ -191,14 +191,14 @@ input[type="button"], input[type="submit"], input[type="reset"], input[type="file"], -input[type=file]::-webkit-file-upload-button, +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); + 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, @@ -206,176 +206,175 @@ input[type="button"], input[type="submit"], input[type="reset"], input[type="file"], -input[type=file]::-webkit-file-upload-button, +input[type="file"]::-webkit-file-upload-button, button { - border: 1pt solid var(--sdpi-color); - border-radius: var(--sdpi-borderradius); - min-height: 23px !important; - height: 23px !important; - margin-right: 8px; + border: 1pt solid var(--sdpi-color); + border-radius: var(--sdpi-borderradius); + 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="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; + border-radius: var(--sdpi-borderradius); + max-width: 220px; } option { - height: 1.5em; - padding: 4px; + height: 1.5em; + padding: 4px; } /* SDPI */ .sdpi-wrapper { - overflow-x: hidden; + overflow-x: hidden; } .sdpi-item { - display: flex; - flex-direction: row; - min-height: 32px; - align-items: center; - margin-top: 2px; - max-width: 344px; + display: flex; + flex-direction: row; + min-height: 32px; + align-items: center; + margin-top: 2px; + max-width: 344px; } .sdpi-item:first-child { - margin-top: 1px; + margin-top: 1px; } .sdpi-item:last-child { - margin-bottom: 0px; + margin-bottom: 0px; } .sdpi-item > *:not(.sdpi-item-label):not(meter):not(details) { - min-height: 26px; - padding: 0px 4px 0px 4px; + min-height: 26px; + padding: 0px 4px 0px 4px; } .sdpi-item > *:not(.sdpi-item-label.empty):not(meter) { - min-height: 26px; - padding: 0px 4px 0px 4px; + min-height: 26px; + padding: 0px 4px 0px 4px; } - .sdpi-item-group { - padding: 0 !important; + padding: 0 !important; } meter.sdpi-item-value { - margin-left: 6px; + 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; + 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; + 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; + -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; + -webkit-margin-before: 4px; + -webkit-margin-after: 8px; + -webkit-padding-start: 1em; + width: var(--sdpi-width); + text-align: center; } table > caption { - margin: 2px; + margin: 2px; } .list, .sdpi-item[type="list"] { - align-items: baseline; + align-items: baseline; } .sdpi-item-label { - text-align: right; - flex: none; - width: 94px; - padding-right: 4px; - font-weight: 600; - -webkit-user-select: none; + text-align: right; + flex: none; + width: 94px; + padding-right: 4px; + font-weight: 600; + -webkit-user-select: none; } .win .sdpi-item-label, .sdpi-item-label > small { - font-weight: normal; + font-weight: normal; } .sdpi-item-label:after { - content: ": "; + content: ": "; } .sdpi-item-label.empty:after { - content: ""; + content: ""; } .sdpi-test, .sdpi-item-value { - flex: 1 0 0; - /* flex-grow: 1; + flex: 1 0 0; + /* flex-grow: 1; flex-shrink: 0; */ - margin-right: 14px; - margin-left: 4px; - justify-content: space-evenly; + 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; + max-width: 144px; + max-height: 144px; + width: 144px; + height: 144px; + margin: 0 auto; + cursor: pointer; } input.sdpi-item-value { - margin-left: 5px; + margin-left: 5px; } .sdpi-item-value button, button.sdpi-item-value { - margin-left: 7px; - margin-right: 19px; + margin-left: 7px; + margin-right: 19px; } .sdpi-item-value.range { - margin-left: 0px; + margin-left: 0px; } table, @@ -385,65 +384,65 @@ 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); + 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; + list-style-type: none; + list-style-position: inside; + margin-left: 5px; + margin-right: 12px; + padding: 4px !important; } ol.sdpi-item-value, .sdpi-item-value > ol[listtype="none"] { - list-style-type: none; + list-style-type: none; } ol.sdpi-item-value[type="decimal"], .sdpi-item-value > ol[type="decimal"] { - list-style-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; + 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; + list-style-type: lower-alpha; } ol.sdpi-item-value[type="upper-alpha"], .sdpi-item-value > ol[type="upper-alpha"] { - list-style-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; + list-style-type: upper-roman; } ol.sdpi-item-value[type="lower-roman"], .sdpi-item-value > ol[type="lower-roman"] { - list-style-type: upper-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, .2) + background-color: rgba(0, 0, 0, 0.2); } td:hover, @@ -451,41 +450,41 @@ td:hover, .sdpi-item-value > ol > li:hover:nth-child(even), li:hover:nth-child(even), li:hover { - background-color: rgba(255, 255, 255, .1); + background-color: rgba(255, 255, 255, 0.1); } td.selected, td.selected:hover, li.selected:hover, li.selected { - color: white; - background-color: #77f; + color: white; + background-color: #77f; } tr { - border: 1px solid var(--sdpi-bordercolor); + border: 1px solid var(--sdpi-bordercolor); } td { - border-right: 1px solid var(--sdpi-bordercolor); - -webkit-user-select: none; + border-right: 1px solid var(--sdpi-bordercolor); + -webkit-user-select: none; } tr:last-child, td:last-child { - border: none; + border: none; } .sdpi-item-value.select, .sdpi-item-value > select { - margin-right: 13px; - margin-left: 4px; + margin-right: 13px; + margin-left: 4px; } .sdpi-item-child, .sdpi-item-group > .sdpi-item > input[type="color"] { - margin-top: 0.4em; - margin-right: 4px; + margin-top: 0.4em; + margin-right: 4px; } .full, @@ -496,21 +495,21 @@ td:last-child { .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%; + display: flex; + flex: 1 1 0; + margin-bottom: 4px; + margin-left: 0px; + width: 100%; - justify-content: space-evenly; + justify-content: space-evenly; } .sdpi-item-group > .sdpi-item > input[type="color"] { - margin-top: 0px; + margin-top: 0px; } ::-webkit-calendar-picker-indicator:focus, -input[type=file]::-webkit-file-upload-button:focus, +input[type="file"]::-webkit-file-upload-button:focus, button:focus, textarea:focus, input:focus, @@ -519,361 +518,358 @@ option:focus, details:focus, summary:focus, .custom-select select { - outline: none; + outline: none; } summary { - cursor: default; - -webkit-user-select: none; + cursor: default; + -webkit-user-select: none; } .pointer, summary .pointer { - cursor: pointer; + cursor: pointer; } details.message { - padding: 4px 18px 4px 12px; + padding: 4px 18px 4px 12px; } details.message summary { - font-size: 10pt; - font-weight: 600; - min-height: 18px; + font-size: 10pt; + font-weight: 600; + min-height: 18px; } details.message:first-child { - margin-top: 4px; - margin-left: 0; - padding-left: 106px; + margin-top: 4px; + margin-left: 0; + padding-left: 106px; } details.message h1 { - text-align: left; + text-align: left; } .message > summary::-webkit-details-marker { - display: none; + display: none; } .info20, .question, .caution, .info { - background-repeat: no-repeat; - background-position: 70px center; + background-repeat: no-repeat; + background-position: 70px 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"); + 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"); + 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"); + 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"); + 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"); + 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"); + 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); + 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; + display: flex; + align-self: right; + margin-left: auto; + position: fixed; + right: 17px; + bottom: 0px; } details a { - background-position: right !important; - min-height: 24px; - display: inline-block; - line-height: 24px; - padding-right: 28px; + 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; + -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; } textarea + label { - display: flex; - justify-content: flex-end + display: flex; + justify-content: flex-end; } input[type="radio"], input[type="checkbox"] { - display: none; + 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; + 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; + content: " " !important; } .sdpi-item[type="radio"] > .sdpi-item-value, .sdpi-item[type="checkbox"] > .sdpi-item-value { - padding-top: 2px; + padding-top: 2px; } .sdpi-item[type="checkbox"] > .sdpi-item-value > * { - margin-top: 4px; + margin-top: 4px; } .sdpi-item[type="checkbox"] .sdpi-item-child, .sdpi-item[type="radio"] .sdpi-item-child { - display: inline-block; + 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; + display: flex; } .sdpi-item[type="range"] .sdpi-item-value { - min-height: 26px; + 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; - user-select: none; - cursor: pointer; + margin-top: -2px; + min-width: 8px; + text-align: right; + user-select: none; + cursor: pointer; } .sdpi-item[type="range"] .sdpi-item-value span { - margin-top: 7px; - text-align: right; + margin-top: 7px; + text-align: right; } span + input[type="range"] { - display: flex; - max-width: 168px; - + display: flex; + 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; + 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; + margin-left: 4px; } .reverse { - transform: rotate(180deg); + transform: rotate(180deg); } .sdpi-item[type="meter"] .sdpi-item-child meter + span:last-child { - margin-left: -10px; + margin-left: -10px; } .sdpi-item[type="progress"] .sdpi-item-child meter + span:last-child { - margin-left: -14px; + margin-left: -14px; } .sdpi-item[type="radio"] > .sdpi-item-value > * { - margin-top: 2px; + margin-top: 2px; } details { - padding: 8px 18px 8px 12px; - min-width: 86px; + padding: 8px 18px 8px 12px; + min-width: 86px; } details > h4 { - border-bottom: 1px solid var(--sdpi-bordercolor); + border-bottom: 1px solid var(--sdpi-bordercolor); } legend { - display: none; + display: none; } .sdpi-item-value > textarea { - padding: 0px; - width: 227px; - margin-left: 1px; + padding: 0px; + width: 227px; + margin-left: 1px; } 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 rgba(0, 0, 0, .2); + 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 rgba(0, 0, 0, 0.2); } input[type="radio"] + label span { - border-radius: 100%; + 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, .4); + 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; + background-color: #303030; } input[type="radio"]:checked + label span { - background-image: url(rcheck.svg); + background-image: url(rcheck.svg); } - input[type="range"] { - width: var(--sdpi-width); - height: 30px; - overflow: hidden; - cursor: pointer; - background: transparent !important; + width: var(--sdpi-width); + height: 30px; + overflow: hidden; + cursor: pointer; + background: transparent !important; } .sdpi-item > input[type="range"] { - margin-left: 8px; - max-width: var(--sdpi-width); - width: var(--sdpi-width); - padding: 0px; + margin-left: 8px; + max-width: var(--sdpi-width); + width: var(--sdpi-width); + padding: 0px; } input[type="range"]::-webkit-slider-runnable-track { - height: 5px; - background: #979797; - border-radius: 3px; - padding: 0px !important; - border: 1px solid var(--sdpi-background); + 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; - + 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; + 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; + 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; + 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; + min-width: 24px; } textarea { - height: 3em; - word-break: break-word; - line-height: 1.5em; + height: 3em; + word-break: break-word; + line-height: 1.5em; } .textarea { - padding: 0px !important; + padding: 0px !important; } textarea { - width: 221px; - /*98%;*/ - height: 96%; - min-height: 6em; - resize: none; - border-radius: var(--sdpi-borderradius); + width: 221px; + /*98%;*/ + height: 96%; + min-height: 6em; + resize: none; + border-radius: var(--sdpi-borderradius); } /* CAROUSEL */ @@ -883,143 +879,143 @@ textarea { .sdpi-item.card-carousel-wrapper, .sdpi-item > .card-carousel-wrapper { - padding: 0; + padding: 0; } - .card-carousel-wrapper { - display: flex; - align-items: center; - justify-content: center; - margin: 12px auto; - color: #666a73; + display: flex; + align-items: center; + justify-content: center; + margin: 12px auto; + color: #666a73; } .card-carousel { - display: flex; - justify-content: center; - width: 278px; + display: flex; + justify-content: center; + width: 278px; } .card-carousel--overflow-container { - overflow: hidden; + 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; + /* 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; + opacity: 0.2; + border-color: black; } .card-carousel--nav__left { - transform: rotate(-135deg); + transform: rotate(-135deg); } .card-carousel--nav__left:active { - transform: rotate(-135deg) scale(0.85); + transform: rotate(-135deg) scale(0.85); } .card-carousel--nav__right { - transform: rotate(45deg); + transform: rotate(45deg); } .card-carousel--nav__right:active { - transform: rotate(45deg) scale(0.85); + transform: rotate(45deg) scale(0.85); } .card-carousel-cards { - display: flex; - transition: transform 150ms ease-out; - transform: translatex(0px); + 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; - border-radius: 4px; - z-index: 3; + 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; + border-radius: 4px; + z-index: 3; } .xxcard-carousel-cards .card-carousel--card:first-child { - margin-left: 0; + margin-left: 0; } .xxcard-carousel-cards .card-carousel--card:last-child { - margin-right: 0; + 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; + 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; + opacity: 0.5; } .card-carousel-cards .card-carousel--card--footer { - border-top: 0; - max-width: 80px; - overflow: hidden; - display: flex; - height: 100%; - flex-direction: column; + 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; + 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; + font-size: 12px; + font-weight: 300; + padding: 6px; + color: #666a73; } - h1 { - font-size: 1.3em; - font-weight: 500; - text-align: center; - margin-bottom: 12px; + font-size: 1.3em; + font-weight: 500; + text-align: center; + margin-bottom: 12px; } ::-webkit-datetime-edit { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - background: url(elg_calendar_inv.svg) no-repeat left center; - padding-right: 1em; - padding-left: 25px; - background-position: 4px 0px; + font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol"; + background: url(elg_calendar_inv.svg) no-repeat left center; + padding-right: 1em; + padding-left: 25px; + background-position: 4px 0px; } ::-webkit-datetime-edit-fields-wrapper { } ::-webkit-datetime-edit-text { - padding: 0 0.3em; + padding: 0 0.3em; } ::-webkit-datetime-edit-month-field { @@ -1032,63 +1028,62 @@ h1 { } ::-webkit-inner-spin-button { - - /* display: none; */ + /* display: none; */ } ::-webkit-calendar-picker-indicator { - background: transparent; - font-size: 17px; + background: transparent; + font-size: 17px; } ::-webkit-calendar-picker-indicator:focus { - background-color: rgba(0, 0, 0, 0.2); + background-color: rgba(0, 0, 0, 0.2); } input[type="date"] { - -webkit-align-items: center; - display: -webkit-inline-flex; - font-family: monospace; - overflow: hidden; - padding: 0; - -webkit-padding-start: 1px; + -webkit-align-items: center; + display: -webkit-inline-flex; + font-family: monospace; + overflow: hidden; + padding: 0; + -webkit-padding-start: 1px; } input::-webkit-datetime-edit { - -webkit-flex: 1; - -webkit-user-modify: read-only !important; - display: inline-block; - min-width: 0; - overflow: hidden; + -webkit-flex: 1; + -webkit-user-modify: read-only !important; + display: inline-block; + min-width: 0; + overflow: hidden; } input[type="file"] { - opacity: 0; - display: none; + opacity: 0; + display: none; } .sdpi-item > input[type="file"] { - opacity: 1; - display: flex; + opacity: 1; + display: flex; } input[type="file"] + span { - display: flex; - flex: 0 1 auto; - background-color: #0000ff50; + 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; + 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, @@ -1097,170 +1092,171 @@ 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; + 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; + 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; + background: var(--sdpi-background) + url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5IiBoZWlnaHQ9IjkiIHZpZXdCb3g9IjAgMCA5IDkiPjxwb2x5Z29uIGZpbGw9IiNEOEQ4RDgiIHBvaW50cz0iNS4yIDEgNi4yIDEgNi4yIDcgMy4yIDcgMy4yIDYgNS4yIDYiIHRyYW5zZm9ybT0icm90YXRlKDQwIDQuNjc3IDQpIi8+PC9zdmc+) + no-repeat 98% center; } .tooltip, :tooltip, :title { - color: yellow; + color: yellow; } [title]:hover { - display: flex; - align-items: center; - justify-content: center; + display: flex; + align-items: center; + justify-content: center; } [title]:hover::after { - content: ''; - position: absolute; - bottom: -1000px; - left: 8px; - display: none; - color: #fff; - border: 8px solid transparent; - border-bottom: 8px solid #000; + content: ""; + position: absolute; + bottom: -1000px; + left: 8px; + display: none; + color: #fff; + border: 8px solid transparent; + border-bottom: 8px solid #000; } [title]:hover::before { - content: attr(title); - display: flex; - justify-content: center; - align-self: center; - padding: 6px 12px; - border-radius: 5px; - background: rgba(0, 0, 0, 0.8); - color: var(--sdpi-color); - font-size: 9pt; - font-family: sans-serif; - opacity: 1; - position: absolute; - height: auto; - /* width: 50%; + content: attr(title); + display: flex; + justify-content: center; + align-self: center; + padding: 6px 12px; + border-radius: 5px; + background: rgba(0, 0, 0, 0.8); + color: var(--sdpi-color); + font-size: 9pt; + font-family: sans-serif; + opacity: 1; + position: absolute; + height: auto; + /* width: 50%; left: 35%; */ - text-align: center; - bottom: 2px; - z-index: 100; - box-shadow: 0px 3px 6px rgba(0, 0, 0, .5); - /* box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); */ + text-align: center; + bottom: 2px; + z-index: 100; + box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.5); + /* box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); */ } .sdpi-item-group.file { - width: 232px; - display: flex; - align-items: center; + width: 232px; + display: flex; + align-items: center; } .sdpi-file-info { - overflow-wrap: break-word; - word-wrap: break-word; - hyphens: auto; + 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); + 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; + width: 8px; } ::-webkit-scrollbar-track { - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); } ::-webkit-scrollbar-thumb { - background-color: #999999; - outline: 1px solid slategrey; - border-radius: 8px; + background-color: #999999; + outline: 1px solid slategrey; + border-radius: 8px; } a { - color: #7397d2; + color: #7397d2; } .testcontainer { - display: flex; - background-color: #0000ff20; - max-width: 400px; - height: 200px; - align-content: space-evenly; + display: flex; + background-color: #0000ff20; + max-width: 400px; + height: 200px; + align-content: space-evenly; } -input[type=range] { - -webkit-appearance: none; - /* background-color: green; */ - height: 6px; - margin-top: 12px; - z-index: 0; - overflow: visible; +input[type="range"] { + -webkit-appearance: none; + /* background-color: green; */ + height: 6px; + margin-top: 12px; + z-index: 0; + overflow: visible; } - ::-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; + -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; + display: flex; + flex-direction: column; } .xxsdpi-item[type="range"] .sdpi-item-group input { - max-width: 204px; + max-width: 204px; } .sdpi-item[type="range"] .sdpi-item-group span { - margin-left: 0px !important; + margin-left: 0px !important; } .sdpi-item[type="range"] .sdpi-item-group > .sdpi-item-child { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } :disabled { - color: #993333; + color: #993333; } select, select option { - color: var(--sdpi-color); + color: var(--sdpi-color); } select.disabled, select option:disabled { - color: #fd9494; - font-style: italic; + color: #fd9494; + font-style: italic; } .runningAppsContainer { - display: none; + display: none; } /* debug @@ -1270,63 +1266,63 @@ select option:disabled { */ .min80 > .sdpi-item-child { - min-width: 80px; + min-width: 80px; } .min100 > .sdpi-item-child { - min-width: 100px; + min-width: 100px; } .min120 > .sdpi-item-child { - min-width: 120px; + min-width: 120px; } .min140 > .sdpi-item-child { - min-width: 140px; + min-width: 140px; } .min160 > .sdpi-item-child { - min-width: 160px; + min-width: 160px; } .min200 > .sdpi-item-child { - min-width: 200px; + min-width: 200px; } .max40 { - flex-basis: 40%; - flex-grow: 0; + flex-basis: 40%; + flex-grow: 0; } .max30 { - flex-basis: 30%; - flex-grow: 0; + flex-basis: 30%; + flex-grow: 0; } .max20 { - flex-basis: 20%; - flex-grow: 0; + flex-basis: 20%; + flex-grow: 0; } .up20 { - margin-top: -20px; + margin-top: -20px; } .alignCenter { - align-items: center; + align-items: center; } .alignTop { - align-items: flex-start; + align-items: flex-start; } .alignBaseline { - align-items: baseline; + align-items: baseline; } .noMargins, .noMargins *, .noInnerMargins * { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } diff --git a/Sources/com.jk.weather.sdPlugin/plugin/main.html b/Sources/com.jk.weather.sdPlugin/plugin/main.html index 83a3115..91e4e21 100644 --- a/Sources/com.jk.weather.sdPlugin/plugin/main.html +++ b/Sources/com.jk.weather.sdPlugin/plugin/main.html @@ -1,12 +1,12 @@ - + - - + com.jk.weather - - - + + + + diff --git a/Sources/com.jk.weather.sdPlugin/plugin/main.js b/Sources/com.jk.weather.sdPlugin/plugin/main.js index a001144..923b99f 100644 --- a/Sources/com.jk.weather.sdPlugin/plugin/main.js +++ b/Sources/com.jk.weather.sdPlugin/plugin/main.js @@ -1,145 +1,212 @@ let websocket = null, - pluginUUID = null; -apiKey = ""; - -function connectElgatoStreamDeckSocket(inPort, inPluginUUID, inRegisterEvent, inInfo) { - pluginUUID = inPluginUUID; - - // Open the web socket - websocket = new WebSocket("ws://localhost:" + inPort); + pluginUUID = null, + apiKey = "", + provider = ""; + +function connectElgatoStreamDeckSocket( + inPort, + inPluginUUID, + inRegisterEvent, + inInfo +) { + pluginUUID = inPluginUUID; + + // Open the web socket + websocket = new WebSocket("ws://localhost:" + inPort); + + websocket.onopen = function () { + // WebSocket is connected, register the plugin + const json = { + event: inRegisterEvent, + uuid: inPluginUUID, + }; - websocket.onopen = function () { - // WebSocket is connected, register the plugin + websocket.send(JSON.stringify(json)); + }; + + websocket.onmessage = function (evt) { + // Received message from Stream Deck + const jsonObj = JSON.parse(evt.data); + const context = jsonObj["context"]; + + if (jsonObj["event"] === "keyUp") { + let cityName = ""; + let unit = ""; + let frequency = null; + if ( + jsonObj.payload.settings != null && + jsonObj.payload.settings.hasOwnProperty("cityName") && + jsonObj.payload.settings.hasOwnProperty("unit") && + jsonObj.payload.settings.hasOwnProperty("frequency") + ) { + cityName = jsonObj.payload.settings["cityName"].toLowerCase(); + unit = jsonObj.payload.settings["unit"]; + frequency = + jsonObj.payload.settings["frequency"] !== "0" + ? parseInt(jsonObj.payload.settings["frequency"]) + : false; + } + + if (cityName === "" || apiKey === "") { const json = { - event: inRegisterEvent, - uuid: inPluginUUID + event: "showAlert", + context: jsonObj.context, }; - websocket.send(JSON.stringify(json)); - }; - - websocket.onmessage = function (evt) { - // Received message from Stream Deck - const jsonObj = JSON.parse(evt.data); - const context = jsonObj["context"]; - - if (jsonObj["event"] === "keyUp") { - let cityName = ""; - let unit = ""; - let frequency = null; - if ( - jsonObj.payload.settings != null && - jsonObj.payload.settings.hasOwnProperty("cityName") && - jsonObj.payload.settings.hasOwnProperty("unit") && - jsonObj.payload.settings.hasOwnProperty("frequency") - ) { - cityName = jsonObj.payload.settings["cityName"].toLowerCase(); - unit = jsonObj.payload.settings["unit"]; - frequency = (jsonObj.payload.settings["frequency"] !== "0") ? parseInt(jsonObj.payload.settings["frequency"]) : false; - } - - if (cityName === "" || apiKey === "") { - const json = { - event: "showAlert", - context: jsonObj.context, - }; - websocket.send(JSON.stringify(json)); - } else { - requestSending(context, cityName, unit); - if (frequency) { - setInterval(() => requestSending(context, cityName, unit), frequency); - } - } - } else if (jsonObj["event"] === "didReceiveGlobalSettings") { - if (jsonObj.payload.settings != null && jsonObj.payload.settings.hasOwnProperty("apiKey")) { - apiKey = jsonObj.payload.settings["apiKey"]; - } - - } else if (jsonObj["event"] === "keyDown") { - const json = { - event: "getGlobalSettings", - context: pluginUUID - }; - - websocket.send(JSON.stringify(json)); + } else { + sendRequest(context, cityName, unit); + if (frequency) { + setInterval(() => sendRequest(context, cityName, unit), frequency); } + } + } else if (jsonObj["event"] === "didReceiveGlobalSettings") { + if ( + jsonObj.payload.settings != null && + jsonObj.payload.settings.hasOwnProperty("apiKey") + ) { + apiKey = jsonObj.payload.settings["apiKey"]; + provider = jsonObj.payload.settings["provider"]; + } + } else if (jsonObj["event"] === "keyDown") { + const json = { + event: "getGlobalSettings", + context: pluginUUID, + }; + + websocket.send(JSON.stringify(json)); + } + }; +} + +function prepareUrl(cityName, unit) { + let url; + const u = unit === "celsius" ? "metric" : "imperial"; + switch (provider) { + case "weatherApi": + url = `https://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${cityName}&aqi=no`; + break; + case "openWeatherMap": + url = `https://api.openweathermap.org/data/2.5/weather?q=${cityName}&appid=${apiKey}&units=${u}`; + break; + } + return url; +} + +function prepareTemperature(response, unit) { + let temp; + switch (provider) { + case "weatherApi": + if (unit === "celsius") { + temp = response.current.temp_c ? response.current.temp_c + "°C" : "NaN"; + } + if (unit === "fahrenheit") { + temp = response.current.temp_f ? response.current.temp_f + "°F" : "NaN"; + } + break; + case "openWeatherMap": + if (unit === "celsius") { + temp = response.main.temp ? response.main.temp + "°C" : "NaN"; + } + if (unit === "fahrenheit") { + temp = response.main.temp ? response.main.temp + "°F" : "NaN"; + } + break; + } + return temp; +} + +function setImageAndCity(response, context, city) { + let url; + const defaultImg = + "https://raw.githubusercontent.com/JaouherK/streamDeck-weatherPlugin/master/Sources/com.jk.weather.sdPlugin/resources/actionIcon.png"; + switch (provider) { + case "weatherApi": + url = + response.current.condition.icon != null + ? "https:" + response.current.condition.icon + : defaultImg; + break; + case "openWeatherMap": + url = + response.weather[0].icon != null + ? "https://openweathermap.org/img/wn/" + + response.weather[0].icon + + ".png" + : defaultImg; + break; + } + dataFromCanvasDraw(url, city, (dataUrl) => { + let json = { + event: "setImage", + context, + payload: { + image: dataUrl, + }, }; + websocket.send(JSON.stringify(json)); + }); + + return url; } +function sendRequest(context, cityName, unit) { + const request = new XMLHttpRequest(); + const url = prepareUrl(cityName, unit); + request.open("GET", url); + request.send(); + request.onreadystatechange = function () { + if (request.readyState === XMLHttpRequest.DONE) { + if (request.status === 200) { + const response = JSON.parse(request.responseText); + const temperature = prepareTemperature(response, unit); + + let jsonDeck = { + event: "setTitle", + context, + payload: { + title: temperature, + }, + }; -function requestSending(context, cityName, unit) { - const request = new XMLHttpRequest(); - request.open("GET", "https://api.weatherapi.com/v1/current.json?key=" + apiKey + "&q=" + cityName + "&aqi=no"); - request.send(); - request.onreadystatechange = function () { - if (request.readyState === XMLHttpRequest.DONE) { - if (request.status === 200) { - const response = JSON.parse(request.responseText); - let temperature = ""; - if (unit === "celsius") { - temperature = response.current.temp_c ? response.current.temp_c + "°C" : "NaN"; - } - if (unit === "fahrenheit") { - temperature = response.current.temp_f ? response.current.temp_f + "°F" : "NaN"; - } - let jsonDeck = { - event: "setTitle", - context, - payload: { - title: temperature, - target: 1 - } - }; - - websocket.send(JSON.stringify(jsonDeck)); - - let jsonSoftware = { - event: "setTitle", - context: context, - payload: { - title: cityName, - target: 2 - } - }; - - websocket.send(JSON.stringify(jsonSoftware)); - - if (response.current.condition.icon != null) { - toDataURL( - "https:" + response.current.condition.icon, - (dataUrl) => { - let json = { - event: "setImage", - context, - payload: { - image: dataUrl, - target: 1 - } - }; - websocket.send(JSON.stringify(json)); - }) - } - } else { - const json = { - event: "showAlert", - context, - }; - websocket.send(JSON.stringify(json)); - } - } + websocket.send(JSON.stringify(jsonDeck)); + + setImageAndCity(response, context, cityName); + } else { + const json = { + event: "showAlert", + context, + }; + websocket.send(JSON.stringify(json)); + } } + }; } -function toDataURL(url, callback) { - let xhr = new XMLHttpRequest(); - xhr.onload = function () { - let reader = new FileReader(); - reader.onloadend = function () { - callback(reader.result); - } - reader.readAsDataURL(xhr.response); - }; - xhr.open("GET", url); - xhr.responseType = "blob"; - xhr.send(); +function dataFromCanvasDraw(url, city, callback) { + const canvas = document.getElementById("idCanvas"); + const context = canvas.getContext("2d"); + let imageObj = new Image(); + imageObj.setAttribute("crossOrigin", "anonymous"); + + imageObj.onload = ((city) => { + const canvas = document.getElementById("idCanvas"); + context.clearRect(0, 0, canvas.width, canvas.height); + context.drawImage( + imageObj, + 0, + 0, + imageObj.width, + imageObj.height, + 0, + 0, + canvas.width, + canvas.height + ); + context.font = "small-caps bold 13px Arial"; + context.fillStyle = "white"; + context.fillText(city, 65, 13); + const dataURL = canvas.toDataURL(); + callback(dataURL); + }).bind(this, city); + imageObj.src = url; }