Vendored from https://github.com/gpeter62/ESP_UniClock: the sketch source, the web UI and the libraries the ESP8266 build needs, unpacked from the bundled zips. Adds a PlatformIO project for the ESP-12. The source is unchanged; local changes follow as separate commits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
479 lines
9.3 KiB
CSS
479 lines
9.3 KiB
CSS
*, *:before, *:after{
|
|
box-sizing: border-box;
|
|
}
|
|
.non-selectable{
|
|
-webkit-touch-callout: none; /* iOS Safari */
|
|
-webkit-user-select: none; /* Safari */
|
|
-khtml-user-select: none; /* Konqueror HTML */
|
|
-moz-user-select: none; /* Old versions of Firefox */
|
|
-ms-user-select: none; /* Internet Explorer/Edge */
|
|
user-select: none; /* Non-prefixed version, currently
|
|
supported by Chrome, Edge, Opera and Firefox */
|
|
}
|
|
html {
|
|
-webkit-font-smoothing: antialiased;
|
|
background-image: radial-gradient(#222, #111);
|
|
min-height: 100%;
|
|
background-attachment: fixed;
|
|
color: #c35;
|
|
}
|
|
.hidden{
|
|
display: none !important;
|
|
}
|
|
a, a:visited{
|
|
color: #c35;
|
|
text-decoration: none;
|
|
}
|
|
a:hover{
|
|
text-decoration: underline;
|
|
color: #777;
|
|
}
|
|
body {
|
|
font-family: "Helvetica Neue", Helvetica, Arial, "Liberation Sans", FreeSans, sans-serif;
|
|
margin: 0;
|
|
}
|
|
.form{
|
|
overflow: auto;
|
|
}
|
|
.max-width{
|
|
max-width: 800px;
|
|
margin: auto;
|
|
}
|
|
.row{
|
|
clear: both;
|
|
overflow: auto;
|
|
}
|
|
.row + .row{
|
|
margin-top: 15px;
|
|
}
|
|
.control-holder{
|
|
width: 33.333333%;
|
|
display: block;
|
|
float: left;
|
|
padding: 5px;
|
|
min-height: 80px;
|
|
position: relative;
|
|
}
|
|
.header{
|
|
overflow: auto;
|
|
}
|
|
.form label {
|
|
cursor: help;
|
|
width: 100%;
|
|
display: inline-block;
|
|
font-weight: bold;
|
|
padding-top: 0;
|
|
padding-left: 0;
|
|
letter-spacing: 0.025em;
|
|
font-size: 20px;
|
|
vertical-align: top;
|
|
line-height: 30px;
|
|
position: relative;
|
|
text-shadow: 1px 1px 0 black;
|
|
margin-bottom: 5px;
|
|
}
|
|
input, select, button{
|
|
margin: 0;
|
|
font: inherit;
|
|
line-height: normal;
|
|
width: 100%;
|
|
max-width: 250px;
|
|
background: #222222;
|
|
color: #eee;
|
|
position: relative;
|
|
padding: 5px;
|
|
min-height: 30px;
|
|
outline: none;
|
|
line-height: normal;
|
|
border-radius: 3px;
|
|
border: 1px solid #666;
|
|
transition: 0.15s background;
|
|
}
|
|
input:not([type="text"]):not(:disabled),select:not(:disabled),button:not(:disabled){
|
|
cursor: pointer;
|
|
}
|
|
input:hover, select:hover, button:hover{
|
|
background: #333;
|
|
}
|
|
input:focus, select:focus, button:focus{
|
|
background: #4E4E4E;
|
|
border-color: #888;
|
|
}
|
|
input:active, select:active, button:active{
|
|
background: #5E5E5E;
|
|
border-color: #aaa;
|
|
}
|
|
button{
|
|
border: 2px solid #c35;
|
|
color: #c35;
|
|
text-transform: uppercase;
|
|
font-weight: bold;
|
|
}
|
|
button:hover{
|
|
color: #ddd;
|
|
}
|
|
.multiple-input span{
|
|
color: white;
|
|
font-weight: bold;
|
|
}
|
|
.two-digit, .small{
|
|
max-width: 60px;
|
|
}
|
|
[pagemenu="settings"]:hover{
|
|
cursor: pointer;
|
|
text-decoration: underline;
|
|
}
|
|
[type="checkbox"].switch{
|
|
position: fixed;
|
|
left: -300px;
|
|
top: -300px;
|
|
}
|
|
[type="checkbox"].switch ~ .switcher{
|
|
width: 60px;
|
|
display: inline-block;
|
|
vertical-align: top;
|
|
height: 30px;
|
|
padding: 2px;
|
|
background: #222222;
|
|
border: 1px solid #666;
|
|
transition: 0.15s background;
|
|
border-radius: 30px;
|
|
position: relative;
|
|
cursor: pointer;
|
|
}
|
|
[type="checkbox"].switch:focus ~ .switcher{
|
|
background: #5E5E5E;
|
|
border-color: #aaa;
|
|
}
|
|
[type="checkbox"].switch ~ .switcher:after{
|
|
display: inline-block;
|
|
content: '';
|
|
vertical-align: top;
|
|
width: 20px;
|
|
height: 20px;
|
|
position: absolute;
|
|
top: 4px;
|
|
left: 4px;
|
|
border-radius: 50%;
|
|
background: rgba(255,255,255,0.4);
|
|
transition: 0.3s all;
|
|
}
|
|
[type="checkbox"].switch:checked ~ .switcher:after{
|
|
left: 34px;
|
|
}
|
|
[type="checkbox"].switch:not(.two-side):checked ~ .switcher:after{
|
|
background: rgba(255,255,255,0.7);
|
|
}
|
|
[type="checkbox"].switch:not(.two-side):checked ~ .switcher{
|
|
background: #37bfb9;
|
|
background-color: #c35;
|
|
}
|
|
[page]{
|
|
display: none;
|
|
}
|
|
[page].active{
|
|
display: block;
|
|
}
|
|
#menu-holder{
|
|
padding-bottom: 40px;
|
|
}
|
|
#menu-holder > .floating-menu{
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
z-index: 110;
|
|
background: #161616;
|
|
}
|
|
#menu{
|
|
width: 100%;
|
|
}
|
|
#menu td{
|
|
padding: 0 18px;
|
|
}
|
|
#menu td .menu-item{
|
|
cursor: pointer;
|
|
border-bottom: 2px solid gray;
|
|
text-align: center;
|
|
text-transform: uppercase;
|
|
font-weight: bold;
|
|
line-height: 30px;
|
|
background-color: transparent;
|
|
transition: 0.3s border, 0.3s background, 0.3s color;
|
|
}
|
|
#menu td .menu-item:hover{
|
|
background-color: #4E4E4E;
|
|
border-color: #ddd;
|
|
}
|
|
#menu td .menu-item.active{
|
|
color: #ddd;
|
|
border-color: #c35;
|
|
}
|
|
.switcher-text{
|
|
text-transform: uppercase;
|
|
font-weight: bold;
|
|
line-height: 30px;
|
|
cursor: pointer;
|
|
transition: 0.3s color;
|
|
text-shadow: 1px 1px 0 black;
|
|
}
|
|
.switcher-text:hover{
|
|
color: #c35 !important;
|
|
}
|
|
.switcher-text.left{
|
|
margin-right: 10px;
|
|
}
|
|
.switcher-text.right{
|
|
margin-left: 10px;
|
|
color: #555;
|
|
}
|
|
[type="checkbox"].switch:checked ~ .switcher-text.left{
|
|
color: #555;
|
|
}
|
|
[type="checkbox"].switch:checked ~ .switcher-text.right{
|
|
color: inherit;
|
|
}
|
|
.footer{
|
|
margin: auto;
|
|
display: block;
|
|
text-align: center;
|
|
text-shadow: 1px 1px 0 black;
|
|
}
|
|
.footer span{
|
|
margin: 0 10px;
|
|
font-size: 26px;
|
|
color: #555;
|
|
}
|
|
.separator{
|
|
border-top: 1px dotted #555;
|
|
margin-top: 20px;
|
|
margin-bottom: 20px;
|
|
}
|
|
.info{
|
|
color: #555;
|
|
padding: 10px 0;
|
|
font-style: italic;
|
|
display: inline-block;
|
|
text-shadow: 1px 1px 0 black;
|
|
}
|
|
.info.medium{
|
|
color: #888;
|
|
font-weight: bold;
|
|
font-size: 25px;
|
|
line-height: 32px;
|
|
}
|
|
.info.big{
|
|
color: #888;
|
|
font-weight: bold;
|
|
font-size: 32px;
|
|
line-height: 32px;
|
|
}
|
|
.info:after{
|
|
color: #666;
|
|
display: inline-block;
|
|
padding-left: 5px;
|
|
font-size: 28px;
|
|
}
|
|
#temperature:after{
|
|
content: ' °C';
|
|
}
|
|
#temperature.fahrenheit:after{
|
|
content: ' °F';
|
|
}
|
|
#temperature2:after{
|
|
content: ' °C';
|
|
}
|
|
#temperature2.fahrenheit:after{
|
|
content: ' °F';
|
|
}
|
|
#humidity:after{
|
|
content: '%';
|
|
}
|
|
#pressure:after{
|
|
content: ' hPa';
|
|
}
|
|
#lux:after{
|
|
content: ' lux';
|
|
}
|
|
#color-select-holder > div{
|
|
float: left;
|
|
}
|
|
#color-select-holder > div:first-child{
|
|
width: calc(100% - 40px);
|
|
}
|
|
#color-select-holder > div:last-child{
|
|
width: 40px;
|
|
}
|
|
|
|
#info-popup{
|
|
display: none;
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
bottom: 0;
|
|
right: 0;
|
|
z-index: 9999;
|
|
background: rgba(0,0,0,0.6);
|
|
}
|
|
|
|
#popup-box{
|
|
padding: 12px;
|
|
border: 2px solid;
|
|
margin: auto;
|
|
width: 100%;
|
|
background: #161616;
|
|
margin-top: 50px;
|
|
border-radius: 12px;
|
|
position: relative;
|
|
}
|
|
#popup-box h2{
|
|
margin-top: 0;
|
|
color: #ddd;
|
|
}
|
|
#popup-close-btn{
|
|
position: absolute;
|
|
left: 100%;
|
|
top: 0;
|
|
background: #161616;
|
|
width: 30px;
|
|
height: 30px;
|
|
border-radius: 50%;
|
|
border: 2px solid;
|
|
line-height: 30px;
|
|
text-align: center;
|
|
font-weight: bold;
|
|
cursor: pointer;
|
|
margin-left: -15px;
|
|
margin-top: -15px;
|
|
transition: 0.3s background, 0.3s color;
|
|
}
|
|
#popup-close-btn:hover{
|
|
color: #ddd;
|
|
}
|
|
#info-popup.cantClose #popup-close-btn{
|
|
display: none;
|
|
}
|
|
|
|
#selectedColor{
|
|
width: 30px;
|
|
height: 30px;
|
|
background-color: white;
|
|
border-radius: 50%;
|
|
margin: auto;
|
|
}
|
|
|
|
.slider-info{
|
|
display: none;
|
|
position: absolute;
|
|
padding: 3px;
|
|
font-weight: bold;
|
|
font-size: 24px;
|
|
background: #161616;
|
|
border: 2px solid #c35;
|
|
z-index: 3;
|
|
border-radius: 50%;
|
|
text-align: center;
|
|
color: #ddd;
|
|
min-width: 50px;
|
|
top: 0;
|
|
right: 10px;
|
|
}
|
|
|
|
/* slider control */
|
|
|
|
.slidecontainer {
|
|
width: 100%; /* Width of the outside container */
|
|
}
|
|
|
|
/* The slider itself */
|
|
.slider {
|
|
margin-top: 9px;
|
|
height: 10px;
|
|
min-height: auto;
|
|
-webkit-appearance: none; /* Override default CSS styles */
|
|
appearance: none;
|
|
outline: none; /* Remove outline */
|
|
opacity: 0.7; /* Set transparency (for mouse-over effects on hover) */
|
|
-webkit-transition: .2s; /* 0.2 seconds transition on hover */
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
/* Mouse-over effects */
|
|
.slider:hover {
|
|
opacity: 1; /* Fully shown on mouse-over */
|
|
}
|
|
|
|
/* The slider handle (use -webkit- (Chrome, Opera, Safari, Edge) and -moz- (Firefox) to override default look) */
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none; /* Override default look */
|
|
appearance: none;
|
|
width: 20px; /* Set a specific slider handle width */
|
|
height: 20px; /* Slider handle height */
|
|
background: #c35;
|
|
cursor: pointer; /* Cursor on hover */
|
|
border-radius: 50%;
|
|
border: 2px solid #ddd;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 20px; /* Set a specific slider handle width */
|
|
height: 20px; /* Slider handle height */
|
|
background: #c35;
|
|
cursor: pointer; /* Cursor on hover */
|
|
border-radius: 50%;
|
|
border: 2px solid #ddd;
|
|
}
|
|
|
|
/* slider control end */
|
|
|
|
|
|
/* width */
|
|
::-webkit-scrollbar {
|
|
width: 10px;
|
|
}
|
|
|
|
/* Track */
|
|
::-webkit-scrollbar-track {
|
|
background: #333;
|
|
}
|
|
|
|
/* Handle */
|
|
::-webkit-scrollbar-thumb {
|
|
background: #c35;
|
|
}
|
|
|
|
/* Handle on hover */
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #d43d5f;
|
|
}
|
|
@media screen and (max-width: 600px){
|
|
.control-holder{
|
|
width: 50%;
|
|
}
|
|
.form label{
|
|
font-size: 15px;
|
|
}
|
|
.switcher-text{
|
|
font-size: 14px;
|
|
}
|
|
.info{
|
|
padding: 5px 0;
|
|
}
|
|
.info:after{
|
|
font-size: 16px;
|
|
}
|
|
.info.big{
|
|
font-size: 20px;
|
|
}
|
|
.info.medium{
|
|
font-size: 15px;
|
|
}
|
|
}
|
|
@media screen and (max-width: 360px){
|
|
body{
|
|
text-align: center;
|
|
}
|
|
.control-holder{
|
|
width: 100%;
|
|
}
|
|
} |