Files
espurna/code/html/src/index.css
2024-06-24 22:42:00 +03:00

651 lines
13 KiB
CSS

/* -----------------------------------------------------------------------------
General
-------------------------------------------------------------------------- */
#menu .pure-menu-heading {
font-size: 100%;
padding: .5em .5em;
white-space: normal;
text-transform: initial;
}
.pure-g {
margin-bottom: 0;
}
.pure-form legend {
font-weight: bold;
letter-spacing: 0;
margin: 10px 0 1em 0;
}
.pure-form .pure-g > label {
margin: .4em 0 .2em;
}
.pure-form input {
margin-bottom: 10px;
}
.pure-form input[type=text][disabled] {
color: #777777;
}
@media screen and (max-width: 32em) {
.header > h1 {
line-height: 100%;
font-size: 2em;
}
}
.header strong {
font-weight: bold;
}
h2 {
font-size: 1em;
}
.panel {
display: none;
}
.block {
display: block;
}
.page {
margin-top: 10px;
}
.pure-form-message,
.pure-form-message-inline {
color: #9e9e9e;
font-size: 80%;
}
.pure-form-message a,
.pure-form-message-inline a {
color:inherit;
}
.module {
display: none;
}
.maybe-hidden {
display: none;
}
input[name=upgrade] {
display: none;
}
select {
margin-bottom: 10px;
width: 100%;
}
input.center {
margin-bottom: 0;
}
div.center {
margin: .5em 0 1em;
}
.webmode {
display: none;
}
#password .content {
margin: 0 auto;
}
#layout .content {
margin: 0;
}
.state {
border-top: 1px solid #eee;
margin-top: 20px;
padding-top: 30px;
font-size: 80%;
line-height: 28px;
}
.state label {
width: 33%;
}
.state span {
font-weight: bold;
display: block;
}
.right {
text-align: right;
}
.terminal {
font-family: 'Courier New', monospace;
font-size: 80%;
background-color: #121212;
margin-top: 10px;
margin-bottom: 10px;
}
#cmd-input,
#cmd-output {
border-style: none;
border-color: #121212;
color: #0f0;
background-color: rgba(0, 0, 0, 0);
line-height: 100%;
}
#cmd-output {
-webkit-box-shadow: none;
box-shadow: none;
}
#cmd-input {
-webkit-box-shadow: inset 0 1px 1px #555;
box-shadow: inset 0 1px 1px #555;
}
/* -----------------------------------------------------------------------------
Sensors
-------------------------------------------------------------------------- */
.pure-form-aligned
.pure-control-group
label {
text-align: left;
}
.emon-expected-pwrP,
.emon-expected-volt,
.emon-expected-curr,
.emon-expected-ene {
content-visibility: hidden;
}
/* -----------------------------------------------------------------------------
Curtains
-------------------------------------------------------------------------- */
/* removeIf(!curtain) */
.curtain-roller {
width: 300px;
height: 200px;
display: inline-block;
}
.curtain-button {
margin-left: 10px;
margin-right: 10px;
text-align: center;
}
.reverse-range {
direction: rtl;
}
/* endRemoveIf(!curtain) */
/* -----------------------------------------------------------------------------
Buttons
-------------------------------------------------------------------------- */
.pure-button {
border-radius: 4px;
color: white;
letter-spacing: 0;
margin-bottom: 10px;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
padding: 8px 8px;
}
.main-buttons {
margin: 20px auto;
text-align: center;
}
.main-buttons button {
width: 100px;
}
.button-reboot,
.button-reconnect,
.button-ha-clear,
.button-rfb-forget,
.button-lightfox-clear,
.button-del-settings-group,
.button-dbg-clear,
.button-upgrade,
.button-clear-filters,
.button-clear-messages,
.button-clear-counts,
.button-settings-factory {
background: rgb(192, 0, 0); /* redish */
}
.button-setup-password,
.button-add-settings-group,
.button-upgrade-browse,
.button-rfb-learn,
.button-lightfox-learn,
.button-ha-publish,
.button-settings-backup,
.button-settings-restore,
.button-garland-set-default,
.button-cmd,
.button-apikey,
.button-emon-expected-calculate {
background: rgb(0, 192, 0); /* green */
}
.button-save {
--save-background: grey;
background: var(--save-background);
}
.button-wifi-scan,
.button-more-parent,
.button-simple-action,
.button-rfb-save {
background: rgb(255, 128, 0); /* orange */
}
.button-curtain-open,
.button-curtain-pause,
.button-curtain-close,
.button-emon-expected,
.button-emon-expected-apply,
.button-generate-password {
background: rgb(66, 184, 221); /* blue */
}
.button-upgrade-browse,
.button-clear-filters,
.button-clear-messages,
.button-clear-counts,
.button-ha-add,
.button-apikey,
.button-upgrade {
margin-left: 5px;
}
.button-thermostat-reset-counters {
background: rgb(204, 139, 41);
}
/* -----------------------------------------------------------------------------
Sliders
-------------------------------------------------------------------------- */
input.slider {
margin-top: 10px;
}
span.slider {
font-size: 70%;
letter-spacing: 0;
margin-left: 10px;
margin-top: 7px;
}
/* -----------------------------------------------------------------------------
Checkboxes w/ custom toggle-switch appearance
Based on https://gist.github.com/yairEO/f5d36e4c038f986a3f5ddf18b6ca4266
Adjusted to allow for 'content' inside of '::before' and small attr tweaks
-------------------------------------------------------------------------- */
input.checkbox-toggle {
--toggle-text-color: white;
--toggle-border-radius: 100px;
--toggle-handle-size: .6em;
--toggle-elem-size: 2em;
--toggle-bg-size: 3em;
--toggle-handle-gap: .2em;
--toggle-color-off: #c00000; /* redish */
--toggle-color-on: #00c000; /* greenish */
--toggle-fg: var(--toggle-color-off);
--toggle-bg: color-mix(in srgb, var(--toggle-fg) 20%, transparent);
appearance: none;
box-sizing: content-box;
display: inline-flex;
justify-content: center;
padding-inline: 0 var(--toggle-bg-size);
border: none;
height: auto;
width: auto;
margin: 0;
border-radius: var(--toggle-border-radius);
background: var(--toggle-bg);
transition: var(--toggle-duration, .2s) cubic-bezier(.65, 0, .5, 1);
user-select: none;
outline: none;
cursor: pointer;
}
/* only ::before is used for content, adjust padding to move the toggle to a specific position */
input.checkbox-toggle:checked {
padding-inline: var(--toggle-bg-size) 0;
--toggle-fg: var(--toggle-color-on);
}
input.checkbox-toggle::before {
text-align: center;
color: var(--toggle-text-color);
width: var(--toggle-elem-size);
}
/* checkboxes are usually allow DISABLING and ENABLING settings */
input.checkbox-toggle::before {
content: "NO";
}
input.checkbox-toggle:checked::before {
content: "YES";
}
input.checkbox-toggle::before {
padding: var(--toggle-handle-size);
margin: var(--toggle-handle-gap);
background: var(--toggle-fg);
border-radius: var(--toggle-border-radius);
transition: inherit;
}
/* module-light */
input[name=light-state-value].checkbox-toggle {
--toggle-color-off: black;
--toggle-color-on: #fdfd3e;
}
input[name=light-state-value].checkbox-toggle:checked::before {
--toggle-text-color: black;
}
/* module-relay */
input[name=relay].checkbox-toggle::before,
input[name=light-state-value].checkbox-toggle::before {
content: "OFF";
}
input[name=relay].checkbox-toggle:checked::before,
input[name=light-state-value].checkbox-toggle:checked::before {
content: "ON";
}
/* module-thermostat */
input[name=thermostatMode].checkbox-toggle::before {
--toggle-elem-size: 4em;
--toggle-bg-size: 3em;
}
input[name=thermostatMode].checkbox-toggle {
--toggle-color-off: hsl(0, 100%, 50%);
--toggle-color-on: hsl(180, 100%, 50%);
}
input[name=thermostatMode].checkbox-toggle::before {
content: "HEATER";
}
input[name=thermostatMode].checkbox-toggle:checked::before {
--toggle-text-color: black;
content: "COOLER";
}
input[disabled].checkbox-toggle {
filter: grayscale(0.8);
}
/* -----------------------------------------------------------------------------
RF Bridge panel
-------------------------------------------------------------------------- */
#rfbNodes label {
width: 2em;
margin: 0 0 0 0;
}
@media (min-width: 48em) {
#rfbNodes input {
width: 70%;
margin: 0 1em 10px 1em;
}
#rfbNodes .pure-button-group {
letter-spacing: 0.15em;
}
}
@media (max-width: 48em) {
#rfbNodes input {
width: 100%;
}
#rfbNodes button {
width: 50%;
}
}
/* -----------------------------------------------------------------------------
Loading
-------------------------------------------------------------------------- */
.loading {
display: none;
height: 1em;
margin: 8px 0 0 10px;
width: 1em;
animation: 3s linear infinite reverse loading;
}
@keyframes loading {
to {
rotate: 0deg;
}
from {
rotate: 360deg;
}
}
/* -----------------------------------------------------------------------------
Menu
-------------------------------------------------------------------------- */
#menu .small {
font-size: 60%;
padding-left: 9px;
}
#menu div.footer {
color: #999;
font-size: 80%;
padding: 10px;
}
#menu div.footer a {
padding: 0;
text-decoration: none;
}
/* -----------------------------------------------------------------------------
Admin panel
-------------------------------------------------------------------------- */
#upgrade-progress {
display: none;
height: 20px;
margin-top: 10px;
width: 100%;
}
#error-notification,
#uploader,
#downloader {
display: none;
}
/* -----------------------------------------------------------------------------
Wifi panel
-------------------------------------------------------------------------- */
#networks .pure-g,
#schedules .pure-g {
border-bottom: 1px solid #eee;
margin-bottom: 10px;
padding: 10px 0 10px 0;
}
.schedule {
margin-bottom: 10px;
}
.schedule .button-del-settings-group {
margin-left: auto;
}
#networks .more {
display: none;
}
#haConfig,
#scanResult {
margin-top: 10px;
display: none;
padding: 10px;
}
/* -----------------------------------------------------------------------------
Table
-------------------------------------------------------------------------- */
#rfm69-messages {
margin-bottom: 1em;
}
summary {
font-weight: bold;
}
.right {
text-align: right;
}
.center {
text-align: center;
}
.filtered {
color: rgb(202, 60, 60);
font-weight: bold;
}
/* -----------------------------------------------------------------------------
Logs
-------------------------------------------------------------------------- */
#cmd-output {
height: 400px;
margin-bottom: 10px;
}
#cmd-input {
display: inline-block;
}
/* -----------------------------------------------------------------------------
Password input controls
-------------------------------------------------------------------------- */
.password-reveal {
font-family: EmojiSymbols,Segoe UI Symbol;
background: rgba(0,0,0,0);
position: absolute;
display: inline-block;
float: right;
z-index: 50;
margin-top: 0.3em;
margin-left: -1.4em;
vertical-align: middle;
font-size: 1.2em;
}
.password-reveal:after {
content: "👁";
}
input[type="password"] + .password-reveal {
color: rgba(205, 205, 205, 0.3);
}
input[type="text"] + .password-reveal {
color: rgba(66, 184, 221, 0.8);
}
.no-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
input::-ms-clear,
input::-ms-reveal {
display: none;
}
/* css minifier must not combine these.
* style will not apply otherwise */
input::-ms-input-placeholder {
color: #ccd;
}
input::placeholder {
color: #ccc;
}
#error-notification {
width: 100%;
box-shadow: 0 1px 2px 1px rgb(192 0 0 / 25%)
}
/* -----------------------------------------------------------------------------
Lights
-------------------------------------------------------------------------- */
#light-brightness,
#light-cct,
#light-channels,
#light-picker,
#light-state {
padding-top: 1em;
}
#light.light-cct #light-channel-c,
#light.light-cct #light-channel-w,
#light.light-color #light-channel-b,
#light.light-color #light-channel-g,
#light.light-color #light-channel-r,
#light.light-color.light-white #light-channel-w {
display: none;
}
#light-cct,
#light-picker {
display: none;
}
#light.light-cct #light-cct,
#light.light-cct:not(.light-white) #light-channel-c,
#light.light-cct:not(.light-white) #light-channel-w,
#light.light-color.light-on:not(.light-cct) #light-picker {
display: block;
}