Mirror of espurna firmware for wireless switches and more
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

637 lines
12 KiB

6 years ago
6 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
6 years ago
6 years ago
6 years ago
5 years ago
6 years ago
6 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
5 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
webui: remove jquery dependencies and clean-up websocket API Refactor WebUI: - remove jquery dependency from the base custom.js and use vanilla JS - remove jquery + jquery-datatables dependency from the RFM69 module - replace jquery-datatables handlers with pure-css table + some basic cell filtering (may be incomplete, but tbh it is not worth additional 50Kb to the .bin size) - introduce a common way to notify about the app errors, show small text notification at the top of the page instead of relying on user to find out about errors by using the Web Developer Tools - replace <span name=...> with <span data-settings-key=...> - replace <div> templates with <template>, disallowing modification without an explicit DOM clone - run `eslint` on html/custom.js and `html-validate` on html/index.html, and fix issues detected by both tools Streamline settings group handling in custom.js & index.html - drop module-specific button-add-... in favour of button-add-settings-group - only enforce data-settings-max requirement when the property actually exists - re-create label for=... and input id=... when settings group is modified, so checkboxes refer to the correct element - introduce additional data-... properties to generalize settings group additions - introduce Enumerable object to track some common list elements for <select>, allow to re-create <option> list when messages come in different order Minor fixes that also came with this: - fix relay code incorrectly parsing the payload, causing no relay names to be displayed in the SWITCHES panel - fix scheduler code accidentally combining keys b/c of the way C parses string literals on separate lines, without any commas in-between - thermostat should not reference tmpUnit directly in the webui, replace with module-specific thermostatUnit that is handled on the device itself - fix index.html initial setup invalid adminPass ids - fix index.html layout when removing specific schedules
2 years ago
  1. /* -----------------------------------------------------------------------------
  2. General
  3. -------------------------------------------------------------------------- */
  4. #menu .pure-menu-heading {
  5. font-size: 100%;
  6. padding: .5em .5em;
  7. white-space: normal;
  8. text-transform: initial;
  9. }
  10. .pure-g {
  11. margin-bottom: 0;
  12. }
  13. .pure-form legend {
  14. font-weight: bold;
  15. letter-spacing: 0;
  16. margin: 10px 0 1em 0;
  17. }
  18. .pure-form .pure-g > label {
  19. margin: .4em 0 .2em;
  20. }
  21. .pure-form input {
  22. margin-bottom: 10px;
  23. }
  24. .pure-form input[type=text][disabled] {
  25. color: #777777;
  26. }
  27. @media screen and (max-width: 32em) {
  28. .header > h1 {
  29. line-height: 100%;
  30. font-size: 2em;
  31. }
  32. }
  33. .header strong {
  34. font-weight: bold;
  35. }
  36. h2 {
  37. font-size: 1em;
  38. }
  39. .panel {
  40. display: none;
  41. }
  42. .block {
  43. display: block;
  44. }
  45. .page {
  46. margin-top: 10px;
  47. }
  48. .pure-form-message,
  49. .pure-form-message-inline {
  50. color: #9e9e9e;
  51. font-size: 80%;
  52. }
  53. .pure-form-message a,
  54. .pure-form-message-inline a {
  55. color:inherit;
  56. }
  57. .module {
  58. display: none;
  59. }
  60. .maybe-hidden {
  61. display: none;
  62. }
  63. input[name=upgrade] {
  64. display: none;
  65. }
  66. select {
  67. margin-bottom: 10px;
  68. width: 100%;
  69. }
  70. input.center {
  71. margin-bottom: 0;
  72. }
  73. div.center {
  74. margin: .5em 0 1em;
  75. }
  76. .webmode {
  77. display: none;
  78. }
  79. #password .content {
  80. margin: 0 auto;
  81. }
  82. #layout .content {
  83. margin: 0;
  84. }
  85. .state {
  86. border-top: 1px solid #eee;
  87. margin-top: 20px;
  88. padding-top: 30px;
  89. font-size: 80%;
  90. line-height: 28px;
  91. }
  92. .state label {
  93. width: 33%;
  94. }
  95. .state span {
  96. font-weight: bold;
  97. display: block;
  98. }
  99. .right {
  100. text-align: right;
  101. }
  102. .terminal {
  103. font-family: 'Courier New', monospace;
  104. font-size: 80%;
  105. background-color: #121212;
  106. margin-top: 10px;
  107. margin-bottom: 10px;
  108. }
  109. #cmd-input,
  110. #cmd-output {
  111. border-style: none;
  112. border-color: #121212;
  113. color: #0f0;
  114. background-color: rgba(0, 0, 0, 0);
  115. line-height: 100%;
  116. }
  117. #cmd-output {
  118. -webkit-box-shadow: none;
  119. box-shadow: none;
  120. }
  121. #cmd-input {
  122. -webkit-box-shadow: inset 0 1px 1px #555;
  123. box-shadow: inset 0 1px 1px #555;
  124. }
  125. /* -----------------------------------------------------------------------------
  126. Sensors
  127. -------------------------------------------------------------------------- */
  128. .pure-form-aligned
  129. .pure-control-group
  130. label {
  131. text-align: left;
  132. }
  133. .emon-expected-pwrP,
  134. .emon-expected-volt,
  135. .emon-expected-curr,
  136. .emon-expected-ene {
  137. content-visibility: hidden;
  138. }
  139. /* -----------------------------------------------------------------------------
  140. Curtains
  141. -------------------------------------------------------------------------- */
  142. /* removeIf(!curtain) */
  143. .curtain-roller {
  144. width: 300px;
  145. height: 200px;
  146. display: inline-block;
  147. }
  148. .curtain-button {
  149. margin-left: 10px;
  150. margin-right: 10px;
  151. text-align: center;
  152. }
  153. .reverse-range {
  154. direction: rtl;
  155. }
  156. /* endRemoveIf(!curtain) */
  157. /* -----------------------------------------------------------------------------
  158. Buttons
  159. -------------------------------------------------------------------------- */
  160. .pure-button {
  161. border-radius: 4px;
  162. color: white;
  163. letter-spacing: 0;
  164. margin-bottom: 10px;
  165. text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  166. padding: 8px 8px;
  167. }
  168. .main-buttons {
  169. margin: 20px auto;
  170. text-align: center;
  171. }
  172. .main-buttons button {
  173. width: 100px;
  174. }
  175. .button-reboot,
  176. .button-reconnect,
  177. .button-ha-clear,
  178. .button-rfb-forget,
  179. .button-lightfox-clear,
  180. .button-del-parent,
  181. .button-dbg-clear,
  182. .button-upgrade,
  183. .button-clear-filters,
  184. .button-clear-messages,
  185. .button-clear-counts,
  186. .button-settings-factory {
  187. background: rgb(192, 0, 0); /* redish */
  188. }
  189. .button-setup-password,
  190. .button-add-settings-group,
  191. .button-upgrade-browse,
  192. .button-rfb-learn,
  193. .button-lightfox-learn,
  194. .button-ha-publish,
  195. .button-settings-backup,
  196. .button-settings-restore,
  197. .button-garland-set-default,
  198. .button-cmd,
  199. .button-apikey,
  200. .button-emon-expected-calculate {
  201. background: rgb(0, 192, 0); /* green */
  202. }
  203. .button-save {
  204. --save-background: grey;
  205. background: var(--save-background);
  206. }
  207. .button-wifi-scan,
  208. .button-more-parent,
  209. .button-simple-action,
  210. .button-rfb-save {
  211. background: rgb(255, 128, 0); /* orange */
  212. }
  213. .button-curtain-open,
  214. .button-curtain-pause,
  215. .button-curtain-close,
  216. .button-emon-expected,
  217. .button-emon-expected-apply,
  218. .button-generate-password {
  219. background: rgb(66, 184, 221); /* blue */
  220. }
  221. .button-upgrade-browse,
  222. .button-clear-filters,
  223. .button-clear-messages,
  224. .button-clear-counts,
  225. .button-ha-add,
  226. .button-apikey,
  227. .button-upgrade {
  228. margin-left: 5px;
  229. }
  230. .button-thermostat-reset-counters {
  231. background: rgb(204, 139, 41);
  232. }
  233. /* -----------------------------------------------------------------------------
  234. Sliders
  235. -------------------------------------------------------------------------- */
  236. input.slider {
  237. margin-top: 10px;
  238. }
  239. span.slider {
  240. font-size: 70%;
  241. letter-spacing: 0;
  242. margin-left: 10px;
  243. margin-top: 7px;
  244. }
  245. /* -----------------------------------------------------------------------------
  246. Checkboxes
  247. -------------------------------------------------------------------------- */
  248. .pure-form .toggleWrapper {
  249. display: inline-block;
  250. vertical-align: middle;
  251. overflow: hidden;
  252. width: max-content;
  253. height: 30px;
  254. margin: 0px 0px 10px 0px;
  255. padding: 0px;
  256. border-radius: 4px;
  257. box-shadow: inset 1px 1px #CCC;
  258. }
  259. .toggleWrapper input {
  260. position: absolute;
  261. left: -99em;
  262. }
  263. label[for].toggle {
  264. margin: 0px;
  265. padding: 0px;
  266. }
  267. .toggleWrapper label.toggle {
  268. width: 130px;
  269. }
  270. .toggle {
  271. letter-spacing:normal;
  272. cursor: pointer;
  273. display: inline-block;
  274. position: relative;
  275. height: 100%;
  276. background: #e9e9e9;
  277. color: #a9a9a9;
  278. border-radius: 4px;
  279. transition: all 200ms cubic-bezier(0.445, 0.05, 0.55, 0.95);
  280. }
  281. .toggle:before,
  282. .toggle:after {
  283. position: absolute;
  284. line-height: 30px;
  285. font-size: .7em;
  286. z-index: 2;
  287. transition: all 200ms cubic-bezier(0.445, 0.05, 0.55, 0.95);
  288. }
  289. .toggle:before {
  290. content: "NO";
  291. left: 20px;
  292. }
  293. input[name="relay"] + .toggle:before {
  294. content: "OFF";
  295. }
  296. input[name="thermostatMode"] + .toggle:before {
  297. content: "Heater";
  298. }
  299. .toggle:after{
  300. content: "YES";
  301. right: 20px;
  302. }
  303. input[name="relay"] + .toggle:after {
  304. content: "ON";
  305. }
  306. input[name="thermostatMode"] + .toggle:after {
  307. content: "Cooler";
  308. }
  309. .toggle__handler {
  310. display: inline-block;
  311. position: relative;
  312. z-index: 1;
  313. background: #c00000;
  314. width: 50%;
  315. height: 100%;
  316. border-radius: 4px;
  317. border-top-right-radius: 0px;
  318. border-bottom-right-radius: 0px;
  319. top: 0px;
  320. left: 0px;
  321. transition: all 200ms cubic-bezier(0.445, 0.05, 0.55, 0.95);
  322. transform: translateX(0px);
  323. }
  324. input:checked + .toggle:after {
  325. color: #fff;
  326. }
  327. input:checked + .toggle:before {
  328. color: #a9a9a9;
  329. }
  330. input + .toggle:before {
  331. color: #fff;
  332. }
  333. input:checked + .toggle .toggle__handler {
  334. width: 50%;
  335. background: #00c000;
  336. transform: translateX(65px);
  337. border-color: #000;
  338. border-top-left-radius: 0px;
  339. border-bottom-left-radius: 0px;
  340. border-top-right-radius: 4px;
  341. border-bottom-right-radius: 4px;
  342. }
  343. input[name="thermostatMode"]:checked + .toggle .toggle__handler {
  344. background: #00c0c0;
  345. }
  346. input[disabled] + .toggle .toggle__handler {
  347. background: #ccc;
  348. }
  349. /* -----------------------------------------------------------------------------
  350. RF Bridge panel
  351. -------------------------------------------------------------------------- */
  352. #rfbNodes label {
  353. width: 2em;
  354. margin: 0 0 0 0;
  355. }
  356. @media (min-width: 48em) {
  357. #rfbNodes input {
  358. width: 70%;
  359. margin: 0 1em 10px 1em;
  360. }
  361. #rfbNodes .pure-button-group {
  362. letter-spacing: 0.15em;
  363. }
  364. }
  365. @media (max-width: 48em) {
  366. #rfbNodes input {
  367. width: 100%;
  368. }
  369. #rfbNodes button {
  370. width: 50%;
  371. }
  372. }
  373. /* -----------------------------------------------------------------------------
  374. Loading
  375. -------------------------------------------------------------------------- */
  376. .loading {
  377. display: none;
  378. height: 20px;
  379. margin: 8px 0 0 10px;
  380. width: 20px;
  381. }
  382. /* -----------------------------------------------------------------------------
  383. Menu
  384. -------------------------------------------------------------------------- */
  385. #menu .small {
  386. font-size: 60%;
  387. padding-left: 9px;
  388. }
  389. #menu div.footer {
  390. color: #999;
  391. font-size: 80%;
  392. padding: 10px;
  393. }
  394. #menu div.footer a {
  395. padding: 0;
  396. text-decoration: none;
  397. }
  398. /* -----------------------------------------------------------------------------
  399. Admin panel
  400. -------------------------------------------------------------------------- */
  401. #upgrade-progress {
  402. display: none;
  403. height: 20px;
  404. margin-top: 10px;
  405. width: 100%;
  406. }
  407. #error-notification,
  408. #uploader,
  409. #downloader {
  410. display: none;
  411. }
  412. /* -----------------------------------------------------------------------------
  413. Wifi panel
  414. -------------------------------------------------------------------------- */
  415. #networks .pure-g,
  416. #schedules .pure-g {
  417. border-bottom: 1px solid #eee;
  418. margin-bottom: 10px;
  419. padding: 10px 0 10px 0;
  420. }
  421. .schedule {
  422. margin-bottom: 10px;
  423. }
  424. .schedule .button-del-parent {
  425. margin-left: auto;
  426. }
  427. #networks .more {
  428. display: none;
  429. }
  430. #haConfig,
  431. #scanResult {
  432. margin-top: 10px;
  433. display: none;
  434. padding: 10px;
  435. }
  436. /* -----------------------------------------------------------------------------
  437. Table
  438. -------------------------------------------------------------------------- */
  439. #rfm69-messages {
  440. margin-bottom: 1em;
  441. }
  442. summary {
  443. font-weight: bold;
  444. }
  445. .right {
  446. text-align: right;
  447. }
  448. .center {
  449. text-align: center;
  450. }
  451. .filtered {
  452. color: rgb(202, 60, 60);
  453. font-weight: bold;
  454. }
  455. /* -----------------------------------------------------------------------------
  456. Logs
  457. -------------------------------------------------------------------------- */
  458. #cmd-output {
  459. height: 400px;
  460. margin-bottom: 10px;
  461. }
  462. #cmd-input {
  463. display: inline-block;
  464. }
  465. /* -----------------------------------------------------------------------------
  466. Password input controls
  467. -------------------------------------------------------------------------- */
  468. .password-reveal {
  469. font-family: EmojiSymbols,Segoe UI Symbol;
  470. background: rgba(0,0,0,0);
  471. position: absolute;
  472. display: inline-block;
  473. float: right;
  474. z-index: 50;
  475. margin-top: 0.3em;
  476. margin-left: -1.4em;
  477. vertical-align: middle;
  478. font-size: 1.2em;
  479. }
  480. .password-reveal:after {
  481. content: "👁";
  482. }
  483. input[type="password"] + .password-reveal {
  484. color: rgba(205, 205, 205, 0.3);
  485. }
  486. input[type="text"] + .password-reveal {
  487. color: rgba(66, 184, 221, 0.8);
  488. }
  489. .no-select {
  490. -webkit-user-select: none;
  491. -moz-user-select: none;
  492. -ms-user-select: none;
  493. user-select: none;
  494. }
  495. input::-ms-clear,
  496. input::-ms-reveal {
  497. display: none;
  498. }
  499. /* css minifier must not combine these.
  500. * style will not apply otherwise */
  501. input::-ms-input-placeholder {
  502. color: #ccd;
  503. }
  504. input::placeholder {
  505. color: #ccc;
  506. }
  507. #error-notification {
  508. width: 100%;
  509. box-shadow: 0 1px 2px 1px rgb(192 0 0 / 25%)
  510. }
  511. /* -----------------------------------------------------------------------------
  512. Lights
  513. -------------------------------------------------------------------------- */
  514. #light-brightness,
  515. #light-cct,
  516. #light-channels,
  517. #light-picker,
  518. #light-state {
  519. padding-top: 1em;
  520. }
  521. #light.light-cct #light-channel-c,
  522. #light.light-cct #light-channel-w,
  523. #light.light-color #light-channel-b,
  524. #light.light-color #light-channel-g,
  525. #light.light-color #light-channel-r,
  526. #light.light-color.light-white #light-channel-w {
  527. display: none;
  528. }
  529. #light-cct,
  530. #light-picker {
  531. display: none;
  532. }
  533. #light.light-cct #light-cct,
  534. #light.light-cct:not(.light-white) #light-channel-c,
  535. #light.light-cct:not(.light-white) #light-channel-w,
  536. #light.light-color.light-on:not(.light-cct) #light-picker {
  537. display: block;
  538. }