diff --git a/README.md b/README.md index ddafbf24..a003063d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # motion-UI -A web responsive interface to manage motion (an open-source motion detection software) and visualize cameras live stream. +A web responsive interface to manage motion (an open-source motion detection software) and visualize cameras live stream.
@@ -31,7 +31,7 @@ A web responsive interface to manage here (in the assets section). +An Android app is available for download here (in the assets section).
diff --git a/docker/init b/docker/init index e37b61a0..b8912697 100644 --- a/docker/init +++ b/docker/init @@ -44,6 +44,9 @@ fi # Start go2rtc in background /bin/su -s /bin/bash -c "/usr/local/bin/go2rtc -c $GO2RTC_DIR/go2rtc.yml >/dev/null 2>/dev/null &" www-data +# Start shell service in background +/bin/bash "$WWW_DIR/bin/service.sh" & + # Start motionui service /bin/su -s /bin/bash -c "php $WWW_DIR/tools/service.php" www-data diff --git a/www/bin/service.sh b/www/bin/service.sh new file mode 100644 index 00000000..0ce8114c --- /dev/null +++ b/www/bin/service.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Run commands every day +while true; do + /usr/bin/apt-get clean all > /dev/null + /usr/bin/apt-get update -y -qq > /dev/null + + # Sleep for a day + /usr/bin/sleep 86400 +done \ No newline at end of file diff --git a/www/controllers/Go2rtc/Go2rtc.php b/www/controllers/Go2rtc/Go2rtc.php index 397a24c3..aad0c85e 100644 --- a/www/controllers/Go2rtc/Go2rtc.php +++ b/www/controllers/Go2rtc/Go2rtc.php @@ -56,13 +56,10 @@ public function addStream(int $id, array $params) * Rotate filter */ if ($rotate == 90) { - // $ffmpegParams .= ' -vf "transpose=1"'; $ffmpegParams .= '#rotate=90'; } else if ($rotate == 180) { - // $ffmpegParams .= ' -vf "transpose=2,transpose=2"'; $ffmpegParams .= '#rotate=180'; } else if ($rotate == 270) { - // $ffmpegParams .= ' -vf "transpose=2"'; $ffmpegParams .= '#rotate=270'; } diff --git a/www/controllers/Motion/Event.php b/www/controllers/Motion/Event.php index 4d60e407..002e85c6 100644 --- a/www/controllers/Motion/Event.php +++ b/www/controllers/Motion/Event.php @@ -120,7 +120,7 @@ public function attachFile(string $motionEventId, string $file, int $width, int * Create thumbnail if not already exist */ if (!file_exists($file . '.thumbnail')) { - $myprocess = new \Controllers\Process('/usr/bin/ffmpeg -loglevel error -ss 00:00:01.00 -i ' . $file . ' -vf \'scale=320:320:force_original_aspect_ratio=decrease\' -vframes 1 ' . $file . '.thumbnail.jpg'); + $myprocess = new \Controllers\Process('/usr/bin/ffmpeg -loglevel error -ss 00:00:00.10 -i ' . $file . ' -vf \'scale=320:320:force_original_aspect_ratio=decrease\' -vframes 1 ' . $file . '.thumbnail.jpg'); $myprocess->execute(); $myprocess->close(); } diff --git a/www/public/resources/js/camera.js b/www/public/resources/js/camera.js index 778f08e3..6989816c 100644 --- a/www/public/resources/js/camera.js +++ b/www/public/resources/js/camera.js @@ -380,13 +380,13 @@ $(document).on('click','#timelapse-play-btn',function () { * @returns */ async function playTimelapse() -{ +{ /** * Retrieve camera id, date, max range and all pictures names */ var cameraId = $('#picture-slider').attr('camera-id'); var date = $('#picture-slider').attr('date'); - var max = $('#picture-slider').attr('max'); + var max = parseInt($('#picture-slider').attr('max')); var pictures = $('timelapse-data').attr('pictures'); /** @@ -443,7 +443,7 @@ async function playTimelapse() /** * Convert max to integer */ - var max = parseInt(max); + max = parseInt(max); /** * If current index is greater or equal to max, then reset index to 0 @@ -455,81 +455,92 @@ async function playTimelapse() } /** - * The loop will run until the index reaches the max range + * Define timelapse object */ - while (index < max + 1) { - /** - * Quit if timelapse div was closed - */ - if ($('#timelapse').length == 0) { - return; - } - - /** - * Quit if timelapse is in pause mode - */ - if ($('#picture-slider').attr('pause') == 'true') { - return; - } - - /** - * Quit if timelapse-date-changed is set in local storage - * This means that the user has changed the date while the timelapse is playing so we stop the timelapse and - * remove the 'timelapse-date-changed' from local storage - */ - if (localStorage.getItem('timelapse-date-changed')) { - localStorage.removeItem('timelapse-date-changed'); - return; - } - - /** - * Get JPEG picture filename from the array - * e.g. timelapse_08-17-50.jpg - */ - var picture = pictures[index]; + const timelapse = { + images: pictures, + index: index, + imgElement: $("#timelapse-picture"), + loadNextImage: function() { + if (this.index < this.images.length) { + /** + * Quit if timelapse div was closed + */ + if ($('#timelapse').length == 0) { + return; + } - /** - * Define the path to the target picture - * e.g. /timelapse?id=14&picture=2024-06-04/timelapse_08-17-50.jpg - */ - var path = '/timelapse?id=' + cameraId + '&picture=' + date + '/' + picture; + /** + * Quit if timelapse is in pause mode + */ + if ($('#picture-slider').attr('pause') == 'true') { + return; + } - /** - * Extract the time from the picture name - */ - var time = picture.split('_')[1].split('.')[0]; - var hour = time.split('-')[0]; - var min = time.split('-')[1]; - var sec = time.split('-')[2]; + /** + * Quit if timelapse-date-changed is set in local storage + * This means that the user has changed the date while the timelapse is playing so we stop the timelapse and + * remove the 'timelapse-date-changed' from local storage + */ + if (localStorage.getItem('timelapse-date-changed')) { + localStorage.removeItem('timelapse-date-changed'); + return; + } - /** - * Update the image and the slider value - */ - $('#timelapse-picture').attr('src', path); - $('#picture-slider').val(index); + /** + * Get JPEG picture filename from the array + * e.g. timelapse_08-17-50.jpg + */ + var picture = pictures[this.index]; - /** - * Update the picture time - */ - $('#picture-time').text(hour + ':' + min + ':' + sec); + /** + * Define the path to the target picture + * e.g. /timelapse?id=14&picture=2024-06-04/timelapse_08-17-50.jpg + */ + var path = '/timelapse?id=' + cameraId + '&picture=' + date + '/' + picture; - /** - * Wait 100ms before updating the index - */ - await new Promise(r => setTimeout(r, 100)); + /** + * Extract the time from the picture name + */ + var time = picture.split('_')[1].split('.')[0]; + var hour = time.split('-')[0]; + var min = time.split('-')[1]; + var sec = time.split('-')[2]; + + /** + * Create a new Image object and set its src to the target picture path + */ + const nextImage = new Image(); + nextImage.src = path; - /** - * Always define index from the current slider value (in case the user changed the slider value while the timelapse is playing) - * and increment it by 1 - */ - index = parseInt($('#picture-slider').val()) + 1; - } + /** + * Once the image is fully loaded, update the image and the slider value + */ + nextImage.onload = () => { + // Image is fully loaded, update the slider value + $('#picture-slider').val(this.index); + + // Update the picture time + $('#picture-time').text(hour + ':' + min + ':' + sec); + + this.imgElement.attr("src", path); + + /** + * Always define index from the current slider value (in case the user changed the slider value while the timelapse is playing) + * and increment it by 1 + */ + this.index++; + + setTimeout(() => this.loadNextImage(), 150); // Pause + }; + } + } + }; /** - * Change button to 'play' button + * Start timelapse */ - $('#timelapse-pause-btn').hide(); - $('#timelapse-play-btn').css('display', 'inline-flex'); + timelapse.loadNextImage(); } /** diff --git a/www/public/resources/styles/common.css b/www/public/resources/styles/common.css index 289e794b..a42f9629 100644 --- a/www/public/resources/styles/common.css +++ b/www/public/resources/styles/common.css @@ -1,5 +1,5 @@ /** - * v1.13 + * v1.15 */ @font-face{font-family: 'Roboto'; src: url('/assets/fonts/Roboto/Roboto-Regular.ttf') format('truetype');} @@ -33,6 +33,10 @@ p, label, a, i, span { color: white; } +a { + color: inherit; +} + span { line-height: initial !important; } @@ -143,7 +147,10 @@ pre.codeblock { .baseline { vertical-align: baseline; } .vertical-align-text-top{vertical-align: text-top !important} .font-size-10{font-size:10px !important}.font-size-11{font-size: 11px !important}.font-size-12{font-size: 12px !important}.font-size-13{font-size: 13px !important}.font-size-14{font-size: 14px !important}.font-size-15{font-size: 15px !important}.font-size-16{font-size: 16px !important}.font-size-17{font-size: 17px !important}.font-size-18{font-size: 18px !important}.font-size-20{font-size: 20px !important}.font-size-22{font-size: 22px !important} -.mediumopacity,.mediumopacity-cst{opacity: 0.55} +.mediumopacity,.mediumopacity-cst{ + color: #97a5b4; + filter: brightness(0) saturate(100%) invert(72%) sepia(2%) saturate(2168%) hue-rotate(169deg) brightness(89%) contrast(95%); +} .lowopacity,.lowopacity-cst{ color: #8A99AA; filter: brightness(0) saturate(100%) invert(65%) sepia(17%) saturate(341%) hue-rotate(171deg) brightness(90%) contrast(88%); @@ -166,8 +173,9 @@ pre.codeblock { .grid {display: grid} .grid-2 {grid-template-columns: 1fr 1fr !important} .grid-2-1 {grid-template-columns: 2fr 1fr !important} -.grid-3 {grid-template-columns: 1fr 1fr 1fr !important} -.grid-4 {grid-template-columns: 1fr 1fr 1fr 1fr !important} +.grid-3 {grid-template-columns: repeat(3, 1fr) !important} +.grid-4 {grid-template-columns: repeat(4, 1fr) !important} +.grid-5 {grid-template-columns: repeat(5, 1fr) !important} .grid-fr-1-2 {grid-template-columns: 1fr 2fr !important} .grid-fr-2-1 {grid-template-columns: 2fr 1fr !important} .grid-fr-4-1 {grid-template-columns: 4fr 1fr !important} @@ -175,6 +183,7 @@ pre.codeblock { .grid-fr-auto-1-3 {grid-template-columns: auto 1fr 3fr !important} .grid-fr-5 {grid-template-columns: 1fr 1fr 1fr 1fr 1fr !important} .grid-fr-6 {grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr !important} +.grid-40p-45p-10p{grid-template-columns: 40% 45% 10% !important} .justify-center {justify-content: center} .justify-space-between {justify-content: space-between} .justify-space-around{justify-content: space-around} @@ -182,23 +191,26 @@ pre.codeblock { .justify-items-center{justify-items: center} .align-content-center {align-content: center} .align-content-right {align-content: flex-end} +.align-item-start {align-items: start !important} +.align-flex-start {align-items: flex-start !important} .align-item-center {align-items: center} .align-item-right, .align-flex-end {align-items: flex-end} .align-self-center{align-self: center} .align-self-end{align-self: flex-end} -.column-gap-1{column-gap: 1px}.column-gap-2 {column-gap: 2px}.column-gap-4 {column-gap: 4px}.column-gap-5{column-gap: 5px}.column-gap-6{column-gap: 6px}.column-gap-7{column-gap: 7px}.column-gap-8{column-gap: 8px}.column-gap-9{column-gap: 9px}.column-gap-10{column-gap: 10px}.column-gap-15{column-gap: 15px} -.column-gap-20{column-gap: 20px}.column-gap-30{column-gap: 30px}.column-gap-40{column-gap: 40px}.column-gap-50{column-gap: 50px}.column-gap-60{column-gap: 60px}.column-gap-70{column-gap: 70px}.column-gap-80{column-gap: 80px}.column-gap-90{column-gap: 90px}.column-gap-100{column-gap: 100px} +.column-gap-1{column-gap:1px!important}.column-gap-2{column-gap:2px!important}.column-gap-4{column-gap:4px!important}.column-gap-5{column-gap:5px!important}.column-gap-6{column-gap:6px!important}.column-gap-7{column-gap:7px!important}.column-gap-8{column-gap:8px!important}.column-gap-9{column-gap:9px!important}.column-gap-10{column-gap:10px!important}.column-gap-15{column-gap:15px!important} +.column-gap-20{column-gap:20px!important}.column-gap-30{column-gap:30px!important}.column-gap-40{column-gap:40px!important}.column-gap-50{column-gap:50px!important}.column-gap-60{column-gap:60px!important}.column-gap-70{column-gap:70px!important}.column-gap-80{column-gap:80px!important}.column-gap-90{column-gap:90px!important}.column-gap-100{column-gap:100px!important} .row-gap-1 {row-gap: 1px}.row-gap-2 {row-gap: 2px}.row-gap-4 {row-gap: 4px}.row-gap-5 {row-gap: 5px}.row-gap-6 {row-gap: 6px}.row-gap-7 {row-gap: 7px}.row-gap-8 {row-gap: 8px}.row-gap-9{row-gap: 9px}.row-gap-10{row-gap: 10px}.row-gap-15{row-gap: 15px}.row-gap-20{row-gap: 20px} .padding-left-15{padding-left:15px !important}.padding-left-20{padding-left:20px !important}.padding-left-30{padding-left:30px !important}.padding-left-40{padding-left:40px !important} .padding-right-15{padding-right:15px !important}.padding-right-20{padding-right:20px !important}.padding-right-30{padding-right:30px !important}.padding-right-40{padding-right:40px !important} -.margin-10{margin:10px !important}.margin-15{margin:15px !important} +.margin-0{margin:0 !important}.margin-10{margin:10px !important}.margin-15{margin:15px !important} .margin-left-0 {margin-left: 0px !important}.margin-left-5 {margin-left: 5px !important}.margin-left-10 {margin-left: 10px !important}.margin-left-15 {margin-left: 15px !important}.margin-left-20 {margin-left: 20px !important}.margin-left-30 {margin-left: 30px !important}.margin-left-40 {margin-left: 40px !important} .margin-right-0 {margin-right: 0px !important}.margin-right-5 {margin-right: 5px !important}.margin-right-10 {margin-right: 10px !important}.margin-right-15 {margin-right: 15px !important}.margin-right-20 {margin-right: 20px !important}.margin-right-30 {margin-right: 30px !important}.margin-right-40 {margin-right: 40px !important} -.margin-top-0 {margin-top: 0px !important}.margin-top-5 {margin-top: 5px !important}.margin-top-10 {margin-top: 10px !important}.margin-top-15 {margin-top: 15px !important}.margin-top-20 {margin-top: 20px !important}.margin-top-30 {margin-top: 30px !important}.margin-top-40 {margin-top: 40px !important} +.margin-top-0 {margin-top: 0px !important}.margin-top-5 {margin-top: 5px !important}.margin-top-10 {margin-top: 10px !important}.margin-top-15 {margin-top: 15px !important}.margin-top-20 {margin-top: 20px !important}.margin-top-30 {margin-top: 30px !important}.margin-top-40 {margin-top: 40px !important}.margin-top-50{margin-top:50px !important} .margin-bottom-0 {margin-bottom: 0px !important}.margin-bottom-5 {margin-bottom: 5px !important}.margin-bottom-10 {margin-bottom: 10px !important}.margin-bottom-15 {margin-bottom: 15px !important}.margin-bottom-20 {margin-bottom: 20px !important}.margin-bottom-30 {margin-bottom: 30px !important}.margin-bottom-40 {margin-bottom: 40px !important} .min-height-100 {min-height: 100px}.min-height-200 {min-height: 200px}.min-height-300 {min-height: 300px}.min-height-400 {min-height: 400px}.min-height-500 {min-height: 500px}.min-height-600 {min-height: 600px}.min-height-700 {min-height: 700px}.min-height-800 {min-height: 800px}.min-height-900 {min-height: 900px}.min-height-1000 {min-height: 1000px} .min-width-100 {min-width: 100px}.min-width-200 {min-width: 200px}.min-width-300 {min-width: 300px}.min-width-400 {min-width: 400px}.min-width-500 {min-width: 500px}.min-width-600 {min-width: 600px}.min-width-700 {min-width: 700px}.min-width-800 {min-width: 800px}.min-width-900 {min-width: 900px}.min-width-1000 {min-width: 1000px} .width-100{width:100%} +.resize-disabled{resize:none;} code { font-family: monospace, monospace; @@ -293,7 +305,7 @@ td { /** * Icons */ -.icon, .icon-small, .icon-medium, .icon-lowopacity, .icon-mediumopacity, .icon-nf, .icon-np { +.icon, .icon-small, .icon-medium, .icon-large, .icon-lowopacity, .icon-mediumopacity, .icon-nf, .icon-np { height: 19px; vertical-align: middle; cursor: pointer; @@ -304,6 +316,9 @@ td { .icon-medium { height: 18px !important; } +.icon-large { + height: 25px !important; +} .icon-lowopacity { opacity: 0.60; } @@ -344,7 +359,6 @@ input[type=file] { input::file-selector-button { color: rgba(0, 0, 0, 0.667) !important; } -input[type=color].color-xsmall { width: 50px; vertical-align: middle; } input[type].input-small, .select-small { width: 100px; } input[type].input-medium, .select-medium { width: 150px; } input[type].input-large, .select-large { width: 250px; } @@ -356,10 +370,25 @@ input::placeholder, select::placeholder, textarea::placeholder { width: 400px; } +/* All color input */ +input[type="color"] { + padding: 0; + width: 150%; + height: 150%; + margin: -25%; +} + +.input-color-wrapper { + overflow: hidden; + width: 30px; + height: 30px; + border-radius: 50%; + box-shadow: 0px 0px 3px 0px #000000; +} + + /* All checkboxes unless onoff-switch-input */ input[type=checkbox]:not(.onoff-switch-input) { - /* width: 16px; - height: 16px; */ width: 20px; height: 20px; background-color: white; @@ -376,6 +405,7 @@ input[type=checkbox]:not(.onoff-switch-input) { input[type=checkbox]:not(.onoff-switch-input):checked { background-color: #15bf7f; position: relative; + filter: inherit !important; &:before { content: '✔'; display: block; @@ -404,28 +434,38 @@ input[type=checkbox]:not(.onoff-switch-input):checked { /* All transparent buttons */ .btn-large-tr, .btn-medium-tr, .btn-small-tr, .btn-xsmall-tr, .btn-xxsmall-tr, .btn-fit-tr, .round-btn-tr, -.btn-large-tr-to-red, .btn-medium-tr-to-red, .btn-small-tr-to-red, .btn-xsmall-tr-to-red, .btn-xxsmall-tr-to-red, .btn-fit-tr-to-red, .round-btn-tr-to-red { +.btn-large-tr-to-red, .btn-medium-tr-to-red, .btn-small-tr-to-red, .btn-xsmall-tr-to-red, .btn-xxsmall-tr-to-red, .btn-fit-tr-to-red, .round-btn-tr-to-red, +.btn-auto-tr { background-color: initial; box-shadow: rgb(0 0 0) 0px 10px 13px -12px, rgb(0 0 0 / 15%) 0px 0px 10px 2px; border: 1px solid #24405c; } /* All blue buttons */ -.btn-large-blue, .btn-medium-blue, .btn-small-blue, .btn-xsmall-blue, .btn-xxsmall-blue, .btn-fit-blue, .round-btn-blue { +.btn-large-blue, .btn-medium-blue, .btn-small-blue, .btn-xsmall-blue, .btn-xxsmall-blue, .btn-fit-blue, .round-btn-blue, .btn-auto-blue { background-color: #1d3349; } +/* All blue alt buttons */ +.btn-large-blue-alt, .btn-medium-blue-alt, .btn-small-blue-alt, .btn-xsmall-blue-alt, .btn-xxsmall-blue-alt, .btn-fit-blue-alt, .round-btn-blue-alt, .btn-auto-blue-alt { + background-color: #24405b; +} /* All green buttons */ -.btn-large-green, .btn-medium-green, .btn-small-green, .btn-xsmall-green, .btn-xxsmall-green, .btn-fit-green, .round-btn-green { +.btn-large-green, .btn-medium-green, .btn-small-green, .btn-xsmall-green, .btn-xxsmall-green, .btn-fit-green, .round-btn-green, .btn-auto-green { background-color: #15bf7f; } /* All red buttons */ -.btn-large-red, .btn-medium-red, .btn-small-red, .btn-xsmall-red, .btn-xxsmall-red, .btn-fit-red, .round-btn-red { +.btn-large-red, .btn-medium-red, .btn-small-red, .btn-xsmall-red, .btn-xxsmall-red, .btn-fit-red, .round-btn-red, .btn-auto-red { background-color: #F32F63; } /* All yellow buttons */ -.btn-large-yellow, .btn-medium-yellow, .btn-small-yellow, .btn-xsmall-yellow, .btn-xxsmall-yellow, .btn-fit-yellow, .round-btn-yellow { +.btn-large-yellow, .btn-medium-yellow, .btn-small-yellow, .btn-xsmall-yellow, .btn-xxsmall-yellow, .btn-fit-yellow, .round-btn-yellow, .btn-auto-yellow { background-color: #ffb536; } +/* All auto buttons */ +.btn-auto-blue, .btn-auto-blue-alt, .btn-auto-green, .btn-auto-red, .btn-auto-yellow { + width: auto; +} + /* All large buttons */ .btn-large, .btn-large-blue, .btn-large-green, .btn-large-red, .btn-large-tr { width: 100%; @@ -445,36 +485,36 @@ input[type=checkbox]:not(.onoff-switch-input):checked { /* All very very small buttons */ .btn-xxsmall, .btn-xxsmall-blue, .btn-xxsmall-green, .btn-xxsmall-red, .btn-xxsmall-tr { margin: 2px; - width: 30px; + width: 34px; } /* All transparent buttons (hover) */ -.btn-large-tr:hover, .btn-medium-tr:hover, .btn-small-tr:hover, .btn-xsmall-tr:hover, .btn-xxsmall-tr:hover, .btn-fit-tr:hover, .round-btn-tr:hover { +.btn-large-tr:hover, .btn-medium-tr:hover, .btn-small-tr:hover, .btn-xsmall-tr:hover, .btn-xxsmall-tr:hover, .btn-fit-tr:hover, .round-btn-tr:hover, .btn-auto-tr:hover { transition-duration: 0.2s; background-color: #1d3349; opacity: 1; } /* All transparent to red buttons (hover) */ -.btn-large-tr-to-red:hover, .btn-medium-tr-to-red:hover, .btn-small-tr-to-red:hover, .btn-xsmall-tr-to-red:hover, .btn-xxsmall-tr-to-red:hover, .btn-fit-tr-to-red:hover, .round-btn-tr-to-red:hover { +.btn-large-tr-to-red:hover, .btn-medium-tr-to-red:hover, .btn-small-tr-to-red:hover, .btn-xsmall-tr-to-red:hover, .btn-xxsmall-tr-to-red:hover, .btn-fit-tr-to-red:hover, .round-btn-tr-to-red:hover, .btn-auto-tr-to-red:hover { transition-duration: 0.2s; - background-color: #f10e4b; - border: 1px solid #f10e4b; + background-color: #F32F63; + border: 1px solid #F32F63; opacity: 1; } /* All blue buttons (hover) */ -.btn-large-blue:hover, .btn-medium-blue:hover, .btn-small-blue:hover, .btn-xsmall-blue:hover, .btn-xxsmall-blue:hover, .btn-fit-blue:hover, .round-btn-blue:hover { +.btn-large-blue:hover, .btn-medium-blue:hover, .btn-small-blue:hover, .btn-xsmall-blue:hover, .btn-xxsmall-blue:hover, .btn-fit-blue:hover, .round-btn-blue:hover, .btn-auto-blue:hover { transition-duration: 0.2s; background-color: #1e3a54; } /* All green buttons (hover) */ -.btn-large-green:hover, .btn-medium-green:hover, .btn-small-green:hover, .btn-xsmall-green:hover, .btn-xxsmall-green:hover, .btn-fit-green:hover, .round-btn-green:hover { +.btn-large-green:hover, .btn-medium-green:hover, .btn-small-green:hover, .btn-xsmall-green:hover, .btn-xxsmall-green:hover, .btn-fit-green:hover, .round-btn-green:hover, .btn-auto-green:hover { transition-duration: 0.2s; background-color: #12a16a; } /* All red buttons (hover) */ -.btn-large-red:hover, .btn-medium-red:hover, .btn-small-red:hover, .btn-xsmall-red:hover, .btn-xxsmall-red:hover, .btn-fit-red:hover, .round-btn-red:hover { +.btn-large-red:hover, .btn-medium-red:hover, .btn-small-red:hover, .btn-xsmall-red:hover, .btn-xxsmall-red:hover, .btn-fit-red:hover, .round-btn-red:hover, .btn-auto-red:hover { transition-duration: 0.2s; background-color: #f10e4b; } @@ -499,7 +539,7 @@ input[type=checkbox]:not(.onoff-switch-input):checked { } [class^="round-btn"] img { - width: 16px; + width: 18px; } /** @@ -863,6 +903,34 @@ textarea { border-bottom: 1px solid #d1d1d11f; } +#loginDiv-container { + height: 90vh; + position: relative; +} +#loginDiv { + width: 250px; + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; +} +#loginDiv img { + max-width: 80px; +} +#loginDiv h3 { + margin-left: auto; + margin-right: auto; +} +#loginDiv form input { + display: block; +} +#loginDiv div { + margin: auto; +} + /** * Loading div */ @@ -887,6 +955,7 @@ textarea { display: flex; justify-content: center; align-items: center; + column-gap: 5px; position: absolute; top: 0; left: 0; @@ -965,7 +1034,7 @@ textarea { @media (min-width:1025px) { /* All buttons */ [class^="btn-"], [class*=" btn-"], input::file-selector-button { - padding: 7px 5px 7px 5px; + padding: 9px 5px 9px 5px; } /** @@ -979,7 +1048,11 @@ textarea { width: 30%; } - .alert, .alert-success, .alert-error, .confirm-box { - width: 25%; + .alert, .alert-success, .alert-error { + width: 29%; + } + + .confirm-box { + width: 29%; } } \ No newline at end of file diff --git a/www/public/resources/styles/motionui.css b/www/public/resources/styles/motionui.css index cdc8022c..ffcd8b26 100644 --- a/www/public/resources/styles/motionui.css +++ b/www/public/resources/styles/motionui.css @@ -685,44 +685,6 @@ footer #github img { width: 25px; } border-radius: 5px; } -#loginDiv-container { - height: 90vh; - position: relative; -} - -#loginDiv { - width: 250px; - margin: 0; - position: absolute; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - text-align: center; -} -#loginDiv img { - max-width: 80px; -} -#loginDiv h3 { - margin-left: auto; - margin-right: auto; -} -#loginDiv form input { - display: block; -} -#loginDiv div { - margin: auto; -} - -.rotation-wrapper-outer { - display: table; -} - -.rotation-wrapper-inner { - padding: 50% 0; - height: 0; -} - /** * Full page loading veil */ diff --git a/www/version b/www/version index 7cbea073..80444066 100644 --- a/www/version +++ b/www/version @@ -1 +1 @@ -5.2.0 \ No newline at end of file +5.2.1 \ No newline at end of file