diff --git a/platypush/backend/http/static/css/dist/dashboard.css b/platypush/backend/http/static/css/dist/dashboard.css deleted file mode 100644 index d0aa1ef6..00000000 --- a/platypush/backend/http/static/css/dist/dashboard.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Francois+One);@import url(https://fonts.googleapis.com/css?family=PT+Sans);.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,#notifications .notification .body,#notifications .notification .image .row{display:flex;align-items:center}.horizontal-center,#notifications .notification .image .row{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.hidden{display:none !important}.selected{background:#c8ffd0}.pull-right{text-align:right !important}.clickable{cursor:pointer}a:focus{outline:none}::-moz-focus-outer,::-moz-focus-inner{border:0}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}button[disabled],.button[disabled]{color:#bbb;background:#f0f0f0;border:1px solid}.btn-primary{background-color:#d8ffe0 !important;border:1px solid #c2f0cf !important}@font-face{font-family:'Audiowide';font-style:normal;font-weight:400;src:local("Audiowide"),local("Audiowide-Regular"),url(http://themes.googleusercontent.com/static/fonts/audiowide/v2/8XtYtNKEyyZh481XVWfVOj8E0i7KZn-EPnyo3HZu7kw.woff) format("woff")}.switch{display:inline-block;text-align:center;user-select:none;padding:.5rem 0}.switch input[type=checkbox]{display:none !important}.switch label,.switch label:before,.switch label:after,.switch input[type=checkbox],.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature,.switch .feature:before,.switch .feature:after{transition:all 250ms ease-in}.switch label:before,.switch label:after,.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature:before,.switch .feature:after{content:'';display:block}.switch label{position:relative;width:50px;height:50px;background-color:#f9f8f6;border-radius:50%;box-shadow:0 5px 10px 0 #333,0 15px 20px 0 #ccc;display:block;margin:.5rem auto 0 auto;font-size:1.4em;transition:all 350ms ease-in}.switch label:before{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:22.72727px;height:22.72727px;border-radius:50%;background-color:#38ffa0;box-shadow:inset 0 0 0 5px #ccc,inset 0 0 0 14px #f9f8f6}.switch label:after{position:absolute;left:50%;top:35%;transform:translate(-50%, -50%);width:4px;height:12px;background-color:#ccc;box-shadow:0 0 0 2.5px #f9f8f6}.switch label:before,.switch label:after{transition-duration:150ms}.switch label:hover{cursor:pointer}.switch label:hover:before{box-shadow:inset 0 0 0 5px #b3b3b3,inset 0 0 0 14px #f9f8f6}.switch label:hover:after{background-color:#b3b3b3}.switch input[type=checkbox]:checked + label{box-shadow:0 2px 5px 0 gray,0 15px 20px 0 transparent}.switch input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #38ffa0,inset 0 0 0 14px #f9f8f6}.switch input[type=checkbox]:checked + label:after{background-color:#38ffa0}.switch.glow label{background-color:#fff;box-shadow:0 5px 10px 0 #aaa,0 0 0 3px #bbb,0 0 8px 2px transparent,0 0 0 6px #eee}.switch.glow label:before{box-shadow:inset 0 0 0 5px #aaa,inset 0 0 0 14px #fff}.switch.glow label:after{background-color:#aaa}.switch.glow label label:hover:before{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 14px #fff}.switch.glow label label:hover:after{background-color:#fff}.switch.glow input[type=checkbox]:checked + label{box-shadow:0 0 8px 0 #00ad72,0 0 0 3px #00e094,0 0 30px 0 #00e094,0 0 0 6px #fff}.switch.glow input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #00e094,inset 0 0 0 14px #fff}.switch.glow input[type=checkbox]:checked + label:after{background-color:#00e094}@supports (--css: variables){.input-range-container{position:relative}input[type="range"].multirange{padding:0;margin:0;display:inline-block;vertical-align:top;opacity:1 !important}input[type="range"].multirange.original{position:absolute}input[type="range"].multirange.original::-webkit-slider-thumb{position:relative;z-index:2}input[type="range"].multirange.original::-moz-range-thumb{transform:scale(1);z-index:1}input[type="range"].multirange::-moz-range-track{border-color:transparent}input[type="range"].multirange.ghost{position:relative;background:var(--track-background);--track-background:linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 45% / 100% 40%;--range-color:rgba(0,215,80,0.2)}input[type="range"].multirange.ghost::-webkit-slider-runnable-track,input[type="range"].multirange.ghost::-moz-range-track{background:var(--track-background);height:15px}input[type="range"].multirange[disabled]::-webkit-slider-thumb,input[type="range"].multirange[disabled]::-moz-range-thumb{display:none}input[type="range"].multirange::-webkit-progress-value,input[type="range"].multirange::-moz-range-progress{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;background:none}}.slider{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;-webkit-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;-ms-transition:opacity .2s;transition:opacity .2s;width:100%;height:15px;border-radius:5px;background:#e4e4e4;outline:none}.slider::-webkit-slider-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider::-moz-range-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider[disabled]::-webkit-slider-thumb{display:none;width:0}.slider[disabled]::-moz-range-thumb{display:none;width:0}.slider.disabled{opacity:.3}.slider::-moz-range-track{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none}.slider::-moz-range-progress{background:rgba(0,215,80,0.2);height:15px}.slider[disabled]::-webkit-progress-value{background:none}.slider[disabled]::-moz-range-progress{background:none}.input-icon{position:absolute;min-width:3rem;padding:1rem;color:#888}input[type=text],input[type=password]{border-radius:5rem}input[type=text]:hover,input[type=password]:hover{border:1px solid rgba(159,180,152,0.83)}input[type=text]:focus,input[type=password]:focus{border:1px solid rgba(127,216,95,0.83)}input[type=text].with-icon,input[type=password].with-icon{padding-left:3rem}.dropdown{position:absolute;background:#f1f3f2;border-radius:.75rem;border:1px solid #ccc;box-shadow:1px 1px 1px #bbb;min-width:15rem}.dropdown .item{margin:0 !important;padding:1rem;cursor:pointer}.dropdown .item.disabled{color:#999;cursor:initial}.dropdown .item .icon{margin:0 .75rem}.autocomplete{position:relative;display:inline-block}.autocomplete-items{position:absolute;border:1px solid #ddd;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items div{padding:1em;cursor:pointer;border-bottom:1px solid #ddd;background-color:#fff}.autocomplete-items div:hover{background-color:#def6ea}.autocomplete-active{background-color:#c8ffd0 !important}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.modal-container{position:fixed;display:flex;align-items:center;justify-content:center;top:0;left:0;width:100%;height:100%;z-index:var(--z-index);background:rgba(10,10,10,0.9)}.modal-container .modal{--width:auto;--height:auto;width:var(--width);height:var(--height)}.modal-container .modal .header{border-radius:1rem 1rem 0 0}.modal-container .modal .body:first-child{border-radius:1rem}.modal-container .modal .body:not(first-child){border-radius:0 0 1rem 1rem}.modal-container .modal .header{border-bottom:1px solid #ccc;padding:.5rem;text-align:center;background:#f0f0f0;text-transform:uppercase;letter-spacing:.1rem;line-height:3.8rem}.modal-container .modal .body{max-height:75vh;overflow:auto;padding:2.5rem 2rem 1.5rem 2rem;background:#fff}#notifications{position:fixed;bottom:0;right:0;width:25em;z-index:1000}#notifications .notification{background:rgba(185,255,193,0.9);border:1px solid rgba(109,205,134,0.62);border-radius:.5rem;margin-bottom:1rem;margin-right:1rem;cursor:pointer}#notifications .notification:hover{background:rgba(160,245,178,0.95)}#notifications .notification:hover.warning{background:rgba(218,245,68,0.95)}#notifications .notification:hover.error{background:rgba(245,90,90,0.95)}#notifications .notification.warning{background:rgba(228,255,78,0.9);border:1px solid rgba(205,205,109,0.62)}#notifications .notification.warning .image{--color:#662}#notifications .notification.error{background:rgba(255,100,100,0.9);border:1px solid rgba(205,109,109,0.62)}#notifications .notification.error .image{--color:darkred}#notifications .notification .title{padding:.4rem;line-height:3rem;letter-spacing:.1rem;font-weight:bold}#notifications .notification .body{height:6em;overflow:hidden;padding-bottom:1rem;letter-spacing:.05rem}#notifications .notification .image{height:100%;text-align:center;--color:#000}#notifications .notification .image .row{width:100%;height:100%}#notifications .notification .image .row .fa{font-size:2.5rem;color:var(--color)}#notifications .notification .image .row img{width:80%;height:80%}html{min-height:100%}body{--background-image:url('/img/dashboard-background.jpg');--background-color:#fff;background-image:var(--background-image) !important;background-color:var(--background-color);background-size:100% 100%;background-repeat:no-repeat;font-family:Lato}main{display:flex;flex-flow:column;width:100%;height:100vh;margin:0}main .widgets-row{height:calc(50% - 3em);margin:2em 1em;display:flex}main .widget{background:#fff;border-radius:5px;height:100%;overflow:hidden;box-shadow:0 3px 3px 0 rgba(0,0,0,0.16),0 0 0 1px rgba(0,0,0,0.08)}#widgets-container{height:100%}.row-1{height:100% !important}.row-2{height:200% !important}.row-3{height:300% !important}.row-4{height:400% !important}.row-5{height:500% !important}.row-6{height:600% !important}.row-7{height:700% !important}.row-8{height:800% !important}.row-9{height:900% !important}.row-10{height:1000% !important} diff --git a/platypush/backend/http/static/css/dist/dashboard/widgets/calendar.css b/platypush/backend/http/static/css/dist/dashboard/widgets/calendar.css deleted file mode 100644 index 7de45efe..00000000 --- a/platypush/backend/http/static/css/dist/dashboard/widgets/calendar.css +++ /dev/null @@ -1 +0,0 @@ -.widget .calendar{padding:1rem}.widget .calendar .event{font-size:.95em}.widget .calendar .upcoming-event{text-align:center;margin-bottom:1.5rem;font-size:1.2em}.widget .calendar .upcoming-event .summary{text-transform:uppercase;font-size:1.3em} diff --git a/platypush/backend/http/static/css/dist/dashboard/widgets/date-time-weather.css b/platypush/backend/http/static/css/dist/dashboard/widgets/date-time-weather.css deleted file mode 100644 index 6f204462..00000000 --- a/platypush/backend/http/static/css/dist/dashboard/widgets/date-time-weather.css +++ /dev/null @@ -1 +0,0 @@ -.widget .date-time-weather{height:100%;display:flex;flex-direction:column;align-items:center;padding-top:1rem}.widget .date-time-weather .date{font-size:1.3em;height:10%}.widget .date-time-weather .time{font-size:2em;height:14%}.widget .date-time-weather .weather{height:35%;display:flex;align-items:center}.widget .date-time-weather .weather .temperature{font-size:2em;margin-left:1rem}.widget .date-time-weather .summary{height:28%}.widget .date-time-weather .sensors{width:100%;height:13%}.widget .date-time-weather .sensors .sensor{padding:0 1rem}.widget .date-time-weather .sensors .humidity{text-align:right} diff --git a/platypush/backend/http/static/css/dist/dashboard/widgets/image-carousel.css b/platypush/backend/http/static/css/dist/dashboard/widgets/image-carousel.css deleted file mode 100644 index ac91ef6f..00000000 --- a/platypush/backend/http/static/css/dist/dashboard/widgets/image-carousel.css +++ /dev/null @@ -1 +0,0 @@ -.widget .image-carousel{height:100%;position:relative;display:flex;align-items:center;justify-content:center;background-color:transparent}.widget .image-carousel .background{position:absolute;top:0;width:100%;height:100vh;background-color:transparent;background-position:center;background-size:cover;background-repeat:no-repeat;filter:blur(13px);-webkit-filter:blur(13px)}.widget .image-carousel img{position:absolute;max-height:100%;z-index:2} diff --git a/platypush/backend/http/static/css/dist/dashboard/widgets/music.css b/platypush/backend/http/static/css/dist/dashboard/widgets/music.css deleted file mode 100644 index d019b4e1..00000000 --- a/platypush/backend/http/static/css/dist/dashboard/widgets/music.css +++ /dev/null @@ -1 +0,0 @@ -.widget .music{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative}.widget .music .track{text-align:center}.widget .music .track .unknown,.widget .music .track .no-track{font-size:2em}.widget .music .track .artist{font-size:1.9em;font-weight:bold;margin-bottom:.25em}.widget .music .track .title{font-size:1.8em}.widget .music .time{width:100%;margin-top:1em;font-size:1.2em}.widget .music .time .row{padding:0 .5em}.widget .music .time .time-total{text-align:right}.widget .music .time .progress-bar{width:100%;height:1em;position:relative;margin-bottom:.75em}.widget .music .time .progress-bar .total{position:absolute;width:100%;height:100%;top:0;background:#ddd;border-radius:5rem}.widget .music .time .progress-bar .elapsed{position:absolute;width:100%;height:100%;top:0;background:#c8ffd0;border-radius:5rem;z-index:1}.widget .music .playback-status{position:absolute;bottom:0;border-top:1px solid #ddd;color:#757f70;width:100%;height:2em}.widget .music .playback-status .status-property{display:flex;align-items:center;justify-content:center;height:100%}.widget .music .playback-status .active{color:#35b870} diff --git a/platypush/backend/http/static/css/dist/dashboard/widgets/rss-news.css b/platypush/backend/http/static/css/dist/dashboard/widgets/rss-news.css deleted file mode 100644 index 45770041..00000000 --- a/platypush/backend/http/static/css/dist/dashboard/widgets/rss-news.css +++ /dev/null @@ -1 +0,0 @@ -.widget .rss-news{height:100%;display:flex;align-items:center}.widget .rss-news .article{width:90%;padding:0 2em}.widget .rss-news .article .source{font-size:1.7em;font-weight:bold;margin-bottom:.5em}.widget .rss-news .article .title{font-size:1.7em;margin-bottom:.5em}.widget .rss-news .article .published{text-align:right;font-size:1em} diff --git a/platypush/backend/http/static/css/dist/login.css b/platypush/backend/http/static/css/dist/login.css deleted file mode 100644 index c70b08a1..00000000 --- a/platypush/backend/http/static/css/dist/login.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Francois+One);@import url(https://fonts.googleapis.com/css?family=PT+Sans);.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.hidden{display:none !important}.selected{background:#c8ffd0}.pull-right{text-align:right !important}.clickable{cursor:pointer}a:focus{outline:none}::-moz-focus-outer,::-moz-focus-inner{border:0}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}button[disabled],.button[disabled]{color:#bbb;background:#f0f0f0;border:1px solid}.btn-primary{background-color:#d8ffe0 !important;border:1px solid #c2f0cf !important}@font-face{font-family:'Audiowide';font-style:normal;font-weight:400;src:local("Audiowide"),local("Audiowide-Regular"),url(http://themes.googleusercontent.com/static/fonts/audiowide/v2/8XtYtNKEyyZh481XVWfVOj8E0i7KZn-EPnyo3HZu7kw.woff) format("woff")}.switch{display:inline-block;text-align:center;user-select:none;padding:.5rem 0}.switch input[type=checkbox]{display:none !important}.switch label,.switch label:before,.switch label:after,.switch input[type=checkbox],.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature,.switch .feature:before,.switch .feature:after{transition:all 250ms ease-in}.switch label:before,.switch label:after,.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature:before,.switch .feature:after{content:'';display:block}.switch label{position:relative;width:50px;height:50px;background-color:#f9f8f6;border-radius:50%;box-shadow:0 5px 10px 0 #333,0 15px 20px 0 #ccc;display:block;margin:.5rem auto 0 auto;font-size:1.4em;transition:all 350ms ease-in}.switch label:before{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:22.72727px;height:22.72727px;border-radius:50%;background-color:#38ffa0;box-shadow:inset 0 0 0 5px #ccc,inset 0 0 0 14px #f9f8f6}.switch label:after{position:absolute;left:50%;top:35%;transform:translate(-50%, -50%);width:4px;height:12px;background-color:#ccc;box-shadow:0 0 0 2.5px #f9f8f6}.switch label:before,.switch label:after{transition-duration:150ms}.switch label:hover{cursor:pointer}.switch label:hover:before{box-shadow:inset 0 0 0 5px #b3b3b3,inset 0 0 0 14px #f9f8f6}.switch label:hover:after{background-color:#b3b3b3}.switch input[type=checkbox]:checked + label{box-shadow:0 2px 5px 0 gray,0 15px 20px 0 transparent}.switch input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #38ffa0,inset 0 0 0 14px #f9f8f6}.switch input[type=checkbox]:checked + label:after{background-color:#38ffa0}.switch.glow label{background-color:#fff;box-shadow:0 5px 10px 0 #aaa,0 0 0 3px #bbb,0 0 8px 2px transparent,0 0 0 6px #eee}.switch.glow label:before{box-shadow:inset 0 0 0 5px #aaa,inset 0 0 0 14px #fff}.switch.glow label:after{background-color:#aaa}.switch.glow label label:hover:before{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 14px #fff}.switch.glow label label:hover:after{background-color:#fff}.switch.glow input[type=checkbox]:checked + label{box-shadow:0 0 8px 0 #00ad72,0 0 0 3px #00e094,0 0 30px 0 #00e094,0 0 0 6px #fff}.switch.glow input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #00e094,inset 0 0 0 14px #fff}.switch.glow input[type=checkbox]:checked + label:after{background-color:#00e094}@supports (--css: variables){.input-range-container{position:relative}input[type="range"].multirange{padding:0;margin:0;display:inline-block;vertical-align:top;opacity:1 !important}input[type="range"].multirange.original{position:absolute}input[type="range"].multirange.original::-webkit-slider-thumb{position:relative;z-index:2}input[type="range"].multirange.original::-moz-range-thumb{transform:scale(1);z-index:1}input[type="range"].multirange::-moz-range-track{border-color:transparent}input[type="range"].multirange.ghost{position:relative;background:var(--track-background);--track-background:linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 45% / 100% 40%;--range-color:rgba(0,215,80,0.2)}input[type="range"].multirange.ghost::-webkit-slider-runnable-track,input[type="range"].multirange.ghost::-moz-range-track{background:var(--track-background);height:15px}input[type="range"].multirange[disabled]::-webkit-slider-thumb,input[type="range"].multirange[disabled]::-moz-range-thumb{display:none}input[type="range"].multirange::-webkit-progress-value,input[type="range"].multirange::-moz-range-progress{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;background:none}}.slider{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;-webkit-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;-ms-transition:opacity .2s;transition:opacity .2s;width:100%;height:15px;border-radius:5px;background:#e4e4e4;outline:none}.slider::-webkit-slider-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider::-moz-range-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider[disabled]::-webkit-slider-thumb{display:none;width:0}.slider[disabled]::-moz-range-thumb{display:none;width:0}.slider.disabled{opacity:.3}.slider::-moz-range-track{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none}.slider::-moz-range-progress{background:rgba(0,215,80,0.2);height:15px}.slider[disabled]::-webkit-progress-value{background:none}.slider[disabled]::-moz-range-progress{background:none}.input-icon{position:absolute;min-width:3rem;padding:1rem;color:#888}input[type=text],input[type=password]{border-radius:5rem}input[type=text]:hover,input[type=password]:hover{border:1px solid rgba(159,180,152,0.83)}input[type=text]:focus,input[type=password]:focus{border:1px solid rgba(127,216,95,0.83)}input[type=text].with-icon,input[type=password].with-icon{padding-left:3rem}.dropdown{position:absolute;background:#f1f3f2;border-radius:.75rem;border:1px solid #ccc;box-shadow:1px 1px 1px #bbb;min-width:15rem}.dropdown .item{margin:0 !important;padding:1rem;cursor:pointer}.dropdown .item.disabled{color:#999;cursor:initial}.dropdown .item .icon{margin:0 .75rem}.autocomplete{position:relative;display:inline-block}.autocomplete-items{position:absolute;border:1px solid #ddd;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items div{padding:1em;cursor:pointer;border-bottom:1px solid #ddd;background-color:#fff}.autocomplete-items div:hover{background-color:#def6ea}.autocomplete-active{background-color:#c8ffd0 !important}body{width:100vw;height:100vh;margin:0;overflow-x:hidden;font-family:"Raleway","HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px}main{height:100%;display:flex;align-items:center;justify-content:center;margin:0}main form{border:1px solid #ccc;border-radius:3em;padding:4em}main form .row{margin:1em 0}main form input[type=text],main form input[type=password]{width:100%}main form input[type=submit]{border-radius:1em}a{color:#5f7869} diff --git a/platypush/backend/http/static/css/dist/register.css b/platypush/backend/http/static/css/dist/register.css deleted file mode 100644 index c70b08a1..00000000 --- a/platypush/backend/http/static/css/dist/register.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Francois+One);@import url(https://fonts.googleapis.com/css?family=PT+Sans);.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.hidden{display:none !important}.selected{background:#c8ffd0}.pull-right{text-align:right !important}.clickable{cursor:pointer}a:focus{outline:none}::-moz-focus-outer,::-moz-focus-inner{border:0}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}button[disabled],.button[disabled]{color:#bbb;background:#f0f0f0;border:1px solid}.btn-primary{background-color:#d8ffe0 !important;border:1px solid #c2f0cf !important}@font-face{font-family:'Audiowide';font-style:normal;font-weight:400;src:local("Audiowide"),local("Audiowide-Regular"),url(http://themes.googleusercontent.com/static/fonts/audiowide/v2/8XtYtNKEyyZh481XVWfVOj8E0i7KZn-EPnyo3HZu7kw.woff) format("woff")}.switch{display:inline-block;text-align:center;user-select:none;padding:.5rem 0}.switch input[type=checkbox]{display:none !important}.switch label,.switch label:before,.switch label:after,.switch input[type=checkbox],.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature,.switch .feature:before,.switch .feature:after{transition:all 250ms ease-in}.switch label:before,.switch label:after,.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature:before,.switch .feature:after{content:'';display:block}.switch label{position:relative;width:50px;height:50px;background-color:#f9f8f6;border-radius:50%;box-shadow:0 5px 10px 0 #333,0 15px 20px 0 #ccc;display:block;margin:.5rem auto 0 auto;font-size:1.4em;transition:all 350ms ease-in}.switch label:before{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:22.72727px;height:22.72727px;border-radius:50%;background-color:#38ffa0;box-shadow:inset 0 0 0 5px #ccc,inset 0 0 0 14px #f9f8f6}.switch label:after{position:absolute;left:50%;top:35%;transform:translate(-50%, -50%);width:4px;height:12px;background-color:#ccc;box-shadow:0 0 0 2.5px #f9f8f6}.switch label:before,.switch label:after{transition-duration:150ms}.switch label:hover{cursor:pointer}.switch label:hover:before{box-shadow:inset 0 0 0 5px #b3b3b3,inset 0 0 0 14px #f9f8f6}.switch label:hover:after{background-color:#b3b3b3}.switch input[type=checkbox]:checked + label{box-shadow:0 2px 5px 0 gray,0 15px 20px 0 transparent}.switch input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #38ffa0,inset 0 0 0 14px #f9f8f6}.switch input[type=checkbox]:checked + label:after{background-color:#38ffa0}.switch.glow label{background-color:#fff;box-shadow:0 5px 10px 0 #aaa,0 0 0 3px #bbb,0 0 8px 2px transparent,0 0 0 6px #eee}.switch.glow label:before{box-shadow:inset 0 0 0 5px #aaa,inset 0 0 0 14px #fff}.switch.glow label:after{background-color:#aaa}.switch.glow label label:hover:before{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 14px #fff}.switch.glow label label:hover:after{background-color:#fff}.switch.glow input[type=checkbox]:checked + label{box-shadow:0 0 8px 0 #00ad72,0 0 0 3px #00e094,0 0 30px 0 #00e094,0 0 0 6px #fff}.switch.glow input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #00e094,inset 0 0 0 14px #fff}.switch.glow input[type=checkbox]:checked + label:after{background-color:#00e094}@supports (--css: variables){.input-range-container{position:relative}input[type="range"].multirange{padding:0;margin:0;display:inline-block;vertical-align:top;opacity:1 !important}input[type="range"].multirange.original{position:absolute}input[type="range"].multirange.original::-webkit-slider-thumb{position:relative;z-index:2}input[type="range"].multirange.original::-moz-range-thumb{transform:scale(1);z-index:1}input[type="range"].multirange::-moz-range-track{border-color:transparent}input[type="range"].multirange.ghost{position:relative;background:var(--track-background);--track-background:linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 45% / 100% 40%;--range-color:rgba(0,215,80,0.2)}input[type="range"].multirange.ghost::-webkit-slider-runnable-track,input[type="range"].multirange.ghost::-moz-range-track{background:var(--track-background);height:15px}input[type="range"].multirange[disabled]::-webkit-slider-thumb,input[type="range"].multirange[disabled]::-moz-range-thumb{display:none}input[type="range"].multirange::-webkit-progress-value,input[type="range"].multirange::-moz-range-progress{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;background:none}}.slider{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;-webkit-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;-ms-transition:opacity .2s;transition:opacity .2s;width:100%;height:15px;border-radius:5px;background:#e4e4e4;outline:none}.slider::-webkit-slider-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider::-moz-range-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider[disabled]::-webkit-slider-thumb{display:none;width:0}.slider[disabled]::-moz-range-thumb{display:none;width:0}.slider.disabled{opacity:.3}.slider::-moz-range-track{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none}.slider::-moz-range-progress{background:rgba(0,215,80,0.2);height:15px}.slider[disabled]::-webkit-progress-value{background:none}.slider[disabled]::-moz-range-progress{background:none}.input-icon{position:absolute;min-width:3rem;padding:1rem;color:#888}input[type=text],input[type=password]{border-radius:5rem}input[type=text]:hover,input[type=password]:hover{border:1px solid rgba(159,180,152,0.83)}input[type=text]:focus,input[type=password]:focus{border:1px solid rgba(127,216,95,0.83)}input[type=text].with-icon,input[type=password].with-icon{padding-left:3rem}.dropdown{position:absolute;background:#f1f3f2;border-radius:.75rem;border:1px solid #ccc;box-shadow:1px 1px 1px #bbb;min-width:15rem}.dropdown .item{margin:0 !important;padding:1rem;cursor:pointer}.dropdown .item.disabled{color:#999;cursor:initial}.dropdown .item .icon{margin:0 .75rem}.autocomplete{position:relative;display:inline-block}.autocomplete-items{position:absolute;border:1px solid #ddd;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items div{padding:1em;cursor:pointer;border-bottom:1px solid #ddd;background-color:#fff}.autocomplete-items div:hover{background-color:#def6ea}.autocomplete-active{background-color:#c8ffd0 !important}body{width:100vw;height:100vh;margin:0;overflow-x:hidden;font-family:"Raleway","HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px}main{height:100%;display:flex;align-items:center;justify-content:center;margin:0}main form{border:1px solid #ccc;border-radius:3em;padding:4em}main form .row{margin:1em 0}main form input[type=text],main form input[type=password]{width:100%}main form input[type=submit]{border-radius:1em}a{color:#5f7869} diff --git a/platypush/backend/http/static/css/dist/settings.css b/platypush/backend/http/static/css/dist/settings.css deleted file mode 100644 index 6c3db7dc..00000000 --- a/platypush/backend/http/static/css/dist/settings.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Francois+One);@import url(https://fonts.googleapis.com/css?family=PT+Sans);.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,#notifications .notification .body,#notifications .notification .image .row{display:flex;align-items:center}.horizontal-center,#notifications .notification .image .row{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.hidden{display:none !important}.selected{background:#c8ffd0}.pull-right{text-align:right !important}.clickable{cursor:pointer}a:focus{outline:none}::-moz-focus-outer,::-moz-focus-inner{border:0}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}button[disabled],.button[disabled]{color:#bbb;background:#f0f0f0;border:1px solid}.btn-primary{background-color:#d8ffe0 !important;border:1px solid #c2f0cf !important}@font-face{font-family:'Audiowide';font-style:normal;font-weight:400;src:local("Audiowide"),local("Audiowide-Regular"),url(http://themes.googleusercontent.com/static/fonts/audiowide/v2/8XtYtNKEyyZh481XVWfVOj8E0i7KZn-EPnyo3HZu7kw.woff) format("woff")}.switch{display:inline-block;text-align:center;user-select:none;padding:.5rem 0}.switch input[type=checkbox]{display:none !important}.switch label,.switch label:before,.switch label:after,.switch input[type=checkbox],.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature,.switch .feature:before,.switch .feature:after{transition:all 250ms ease-in}.switch label:before,.switch label:after,.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature:before,.switch .feature:after{content:'';display:block}.switch label{position:relative;width:50px;height:50px;background-color:#f9f8f6;border-radius:50%;box-shadow:0 5px 10px 0 #333,0 15px 20px 0 #ccc;display:block;margin:.5rem auto 0 auto;font-size:1.4em;transition:all 350ms ease-in}.switch label:before{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:22.72727px;height:22.72727px;border-radius:50%;background-color:#38ffa0;box-shadow:inset 0 0 0 5px #ccc,inset 0 0 0 14px #f9f8f6}.switch label:after{position:absolute;left:50%;top:35%;transform:translate(-50%, -50%);width:4px;height:12px;background-color:#ccc;box-shadow:0 0 0 2.5px #f9f8f6}.switch label:before,.switch label:after{transition-duration:150ms}.switch label:hover{cursor:pointer}.switch label:hover:before{box-shadow:inset 0 0 0 5px #b3b3b3,inset 0 0 0 14px #f9f8f6}.switch label:hover:after{background-color:#b3b3b3}.switch input[type=checkbox]:checked + label{box-shadow:0 2px 5px 0 gray,0 15px 20px 0 transparent}.switch input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #38ffa0,inset 0 0 0 14px #f9f8f6}.switch input[type=checkbox]:checked + label:after{background-color:#38ffa0}.switch.glow label{background-color:#fff;box-shadow:0 5px 10px 0 #aaa,0 0 0 3px #bbb,0 0 8px 2px transparent,0 0 0 6px #eee}.switch.glow label:before{box-shadow:inset 0 0 0 5px #aaa,inset 0 0 0 14px #fff}.switch.glow label:after{background-color:#aaa}.switch.glow label label:hover:before{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 14px #fff}.switch.glow label label:hover:after{background-color:#fff}.switch.glow input[type=checkbox]:checked + label{box-shadow:0 0 8px 0 #00ad72,0 0 0 3px #00e094,0 0 30px 0 #00e094,0 0 0 6px #fff}.switch.glow input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #00e094,inset 0 0 0 14px #fff}.switch.glow input[type=checkbox]:checked + label:after{background-color:#00e094}@supports (--css: variables){.input-range-container{position:relative}input[type="range"].multirange{padding:0;margin:0;display:inline-block;vertical-align:top;opacity:1 !important}input[type="range"].multirange.original{position:absolute}input[type="range"].multirange.original::-webkit-slider-thumb{position:relative;z-index:2}input[type="range"].multirange.original::-moz-range-thumb{transform:scale(1);z-index:1}input[type="range"].multirange::-moz-range-track{border-color:transparent}input[type="range"].multirange.ghost{position:relative;background:var(--track-background);--track-background:linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 45% / 100% 40%;--range-color:rgba(0,215,80,0.2)}input[type="range"].multirange.ghost::-webkit-slider-runnable-track,input[type="range"].multirange.ghost::-moz-range-track{background:var(--track-background);height:15px}input[type="range"].multirange[disabled]::-webkit-slider-thumb,input[type="range"].multirange[disabled]::-moz-range-thumb{display:none}input[type="range"].multirange::-webkit-progress-value,input[type="range"].multirange::-moz-range-progress{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;background:none}}.slider{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;-webkit-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;-ms-transition:opacity .2s;transition:opacity .2s;width:100%;height:15px;border-radius:5px;background:#e4e4e4;outline:none}.slider::-webkit-slider-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider::-moz-range-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider[disabled]::-webkit-slider-thumb{display:none;width:0}.slider[disabled]::-moz-range-thumb{display:none;width:0}.slider.disabled{opacity:.3}.slider::-moz-range-track{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none}.slider::-moz-range-progress{background:rgba(0,215,80,0.2);height:15px}.slider[disabled]::-webkit-progress-value{background:none}.slider[disabled]::-moz-range-progress{background:none}.input-icon{position:absolute;min-width:3rem;padding:1rem;color:#888}input[type=text],input[type=password]{border-radius:5rem}input[type=text]:hover,input[type=password]:hover{border:1px solid rgba(159,180,152,0.83)}input[type=text]:focus,input[type=password]:focus{border:1px solid rgba(127,216,95,0.83)}input[type=text].with-icon,input[type=password].with-icon{padding-left:3rem}.dropdown{position:absolute;background:#f1f3f2;border-radius:.75rem;border:1px solid #ccc;box-shadow:1px 1px 1px #bbb;min-width:15rem}.dropdown .item{margin:0 !important;padding:1rem;cursor:pointer}.dropdown .item.disabled{color:#999;cursor:initial}.dropdown .item .icon{margin:0 .75rem}.autocomplete{position:relative;display:inline-block}.autocomplete-items{position:absolute;border:1px solid #ddd;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items div{padding:1em;cursor:pointer;border-bottom:1px solid #ddd;background-color:#fff}.autocomplete-items div:hover{background-color:#def6ea}.autocomplete-active{background-color:#c8ffd0 !important}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.modal-container{position:fixed;display:flex;align-items:center;justify-content:center;top:0;left:0;width:100%;height:100%;z-index:var(--z-index);background:rgba(10,10,10,0.9)}.modal-container .modal{--width:auto;--height:auto;width:var(--width);height:var(--height)}.modal-container .modal .header{border-radius:1rem 1rem 0 0}.modal-container .modal .body:first-child{border-radius:1rem}.modal-container .modal .body:not(first-child){border-radius:0 0 1rem 1rem}.modal-container .modal .header{border-bottom:1px solid #ccc;padding:.5rem;text-align:center;background:#f0f0f0;text-transform:uppercase;letter-spacing:.1rem;line-height:3.8rem}.modal-container .modal .body{max-height:75vh;overflow:auto;padding:2.5rem 2rem 1.5rem 2rem;background:#fff}#notifications{position:fixed;bottom:0;right:0;width:25em;z-index:1000}#notifications .notification{background:rgba(185,255,193,0.9);border:1px solid rgba(109,205,134,0.62);border-radius:.5rem;margin-bottom:1rem;margin-right:1rem;cursor:pointer}#notifications .notification:hover{background:rgba(160,245,178,0.95)}#notifications .notification:hover.warning{background:rgba(218,245,68,0.95)}#notifications .notification:hover.error{background:rgba(245,90,90,0.95)}#notifications .notification.warning{background:rgba(228,255,78,0.9);border:1px solid rgba(205,205,109,0.62)}#notifications .notification.warning .image{--color:#662}#notifications .notification.error{background:rgba(255,100,100,0.9);border:1px solid rgba(205,109,109,0.62)}#notifications .notification.error .image{--color:darkred}#notifications .notification .title{padding:.4rem;line-height:3rem;letter-spacing:.1rem;font-weight:bold}#notifications .notification .body{height:6em;overflow:hidden;padding-bottom:1rem;letter-spacing:.05rem}#notifications .notification .image{height:100%;text-align:center;--color:#000}#notifications .notification .image .row{width:100%;height:100%}#notifications .notification .image .row .fa{font-size:2.5rem;color:var(--color)}#notifications .notification .image .row img{width:80%;height:80%}#users ul{list-style-type:none}#users ul li{margin:0;padding:1em .5em;border-bottom:1px solid #ccc;cursor:pointer}#users ul li:hover{background:#def6ea}#users form{display:flex;flex-direction:column;width:20em}#users form input{margin:1em .5em}#token .warning{background:rgba(255,100,100,0.9);border:1px solid rgba(205,109,109,0.62);margin:1em;padding:1em;border-radius:1em}#token .token-container{display:flex;align-items:center;justify-content:center;margin:2em}#token .token-container input{width:100%}body{width:100%;height:100%;margin:0;overflow-x:hidden;font-family:"Raleway","HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px}#app{width:100vw;height:100vh;display:flex;flex-direction:row}#app nav{background:#f0f0f0;color:#5f7869;border-right:1px solid #ccc}#app nav ul{width:100%;height:100%;margin:0;overflow:auto;list-style-type:none}#app nav ul li{display:flex;margin:0;padding:1em;cursor:pointer}#app nav ul li:not(:first-of-type){border-top:1px solid #ccc}#app nav ul li:hover{background:#def6ea}#app nav ul li a:first-child{width:100%}#app main{margin:0;flex:1 1 auto;overflow:hidden;height:inherit}#app main .section{overflow:auto;height:inherit}#app main .section header{display:flex;align-items:center;border-bottom:1px solid #ddd;background:#eee}#app main .section header h1{margin:.45em .2em}#app main .section header button{border:0}#app main .section header button:hover{color:#35b870}#app a{color:#5f7869}.dropdown .item{display:flex;flex-direction:row;cursor:pointer}.dropdown .item:hover{background:#def6ea} diff --git a/platypush/backend/http/static/css/dist/webpanel.css b/platypush/backend/http/static/css/dist/webpanel.css deleted file mode 100644 index a63ae69e..00000000 --- a/platypush/backend/http/static/css/dist/webpanel.css +++ /dev/null @@ -1 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Francois+One);@import url(https://fonts.googleapis.com/css?family=PT+Sans);.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,#notifications .notification .body,#notifications .notification .image .row{display:flex;align-items:center}.horizontal-center,#notifications .notification .image .row{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.hidden{display:none !important}.selected{background:#c8ffd0}.pull-right{text-align:right !important}.clickable{cursor:pointer}a:focus{outline:none}::-moz-focus-outer,::-moz-focus-inner{border:0}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}button[disabled],.button[disabled]{color:#bbb;background:#f0f0f0;border:1px solid}.btn-primary{background-color:#d8ffe0 !important;border:1px solid #c2f0cf !important}@font-face{font-family:'Audiowide';font-style:normal;font-weight:400;src:local("Audiowide"),local("Audiowide-Regular"),url(http://themes.googleusercontent.com/static/fonts/audiowide/v2/8XtYtNKEyyZh481XVWfVOj8E0i7KZn-EPnyo3HZu7kw.woff) format("woff")}.switch{display:inline-block;text-align:center;user-select:none;padding:.5rem 0}.switch input[type=checkbox]{display:none !important}.switch label,.switch label:before,.switch label:after,.switch input[type=checkbox],.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature,.switch .feature:before,.switch .feature:after{transition:all 250ms ease-in}.switch label:before,.switch label:after,.switch input[type=checkbox]:before,.switch input[type=checkbox]:after,.switch .feature:before,.switch .feature:after{content:'';display:block}.switch label{position:relative;width:50px;height:50px;background-color:#f9f8f6;border-radius:50%;box-shadow:0 5px 10px 0 #333,0 15px 20px 0 #ccc;display:block;margin:.5rem auto 0 auto;font-size:1.4em;transition:all 350ms ease-in}.switch label:before{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:22.72727px;height:22.72727px;border-radius:50%;background-color:#38ffa0;box-shadow:inset 0 0 0 5px #ccc,inset 0 0 0 14px #f9f8f6}.switch label:after{position:absolute;left:50%;top:35%;transform:translate(-50%, -50%);width:4px;height:12px;background-color:#ccc;box-shadow:0 0 0 2.5px #f9f8f6}.switch label:before,.switch label:after{transition-duration:150ms}.switch label:hover{cursor:pointer}.switch label:hover:before{box-shadow:inset 0 0 0 5px #b3b3b3,inset 0 0 0 14px #f9f8f6}.switch label:hover:after{background-color:#b3b3b3}.switch input[type=checkbox]:checked + label{box-shadow:0 2px 5px 0 gray,0 15px 20px 0 transparent}.switch input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #38ffa0,inset 0 0 0 14px #f9f8f6}.switch input[type=checkbox]:checked + label:after{background-color:#38ffa0}.switch.glow label{background-color:#fff;box-shadow:0 5px 10px 0 #aaa,0 0 0 3px #bbb,0 0 8px 2px transparent,0 0 0 6px #eee}.switch.glow label:before{box-shadow:inset 0 0 0 5px #aaa,inset 0 0 0 14px #fff}.switch.glow label:after{background-color:#aaa}.switch.glow label label:hover:before{box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 14px #fff}.switch.glow label label:hover:after{background-color:#fff}.switch.glow input[type=checkbox]:checked + label{box-shadow:0 0 8px 0 #00ad72,0 0 0 3px #00e094,0 0 30px 0 #00e094,0 0 0 6px #fff}.switch.glow input[type=checkbox]:checked + label:before{box-shadow:inset 0 0 0 5px #00e094,inset 0 0 0 14px #fff}.switch.glow input[type=checkbox]:checked + label:after{background-color:#00e094}@supports (--css: variables){.input-range-container{position:relative}input[type="range"].multirange{padding:0;margin:0;display:inline-block;vertical-align:top;opacity:1 !important}input[type="range"].multirange.original{position:absolute}input[type="range"].multirange.original::-webkit-slider-thumb{position:relative;z-index:2}input[type="range"].multirange.original::-moz-range-thumb{transform:scale(1);z-index:1}input[type="range"].multirange::-moz-range-track{border-color:transparent}input[type="range"].multirange.ghost{position:relative;background:var(--track-background);--track-background:linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 45% / 100% 40%;--range-color:rgba(0,215,80,0.2)}input[type="range"].multirange.ghost::-webkit-slider-runnable-track,input[type="range"].multirange.ghost::-moz-range-track{background:var(--track-background);height:15px}input[type="range"].multirange[disabled]::-webkit-slider-thumb,input[type="range"].multirange[disabled]::-moz-range-thumb{display:none}input[type="range"].multirange::-webkit-progress-value,input[type="range"].multirange::-moz-range-progress{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;background:none}}.slider{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;-webkit-transition:opacity .2s;-ms-transition:opacity .2s;-o-transition:opacity .2s;-ms-transition:opacity .2s;transition:opacity .2s;width:100%;height:15px;border-radius:5px;background:#e4e4e4;outline:none}.slider::-webkit-slider-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider::-moz-range-thumb{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none;width:25px;height:25px;border-radius:50%;border:0;background:#00d750;cursor:pointer}.slider[disabled]::-webkit-slider-thumb{display:none;width:0}.slider[disabled]::-moz-range-thumb{display:none;width:0}.slider.disabled{opacity:.3}.slider::-moz-range-track{-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;-ms-appearance:none;appearance:none}.slider::-moz-range-progress{background:rgba(0,215,80,0.2);height:15px}.slider[disabled]::-webkit-progress-value{background:none}.slider[disabled]::-moz-range-progress{background:none}.input-icon{position:absolute;min-width:3rem;padding:1rem;color:#888}input[type=text],input[type=password]{border-radius:5rem}input[type=text]:hover,input[type=password]:hover{border:1px solid rgba(159,180,152,0.83)}input[type=text]:focus,input[type=password]:focus{border:1px solid rgba(127,216,95,0.83)}input[type=text].with-icon,input[type=password].with-icon{padding-left:3rem}.dropdown{position:absolute;background:#f1f3f2;border-radius:.75rem;border:1px solid #ccc;box-shadow:1px 1px 1px #bbb;min-width:15rem}.dropdown .item{margin:0 !important;padding:1rem;cursor:pointer}.dropdown .item.disabled{color:#999;cursor:initial}.dropdown .item .icon{margin:0 .75rem}.autocomplete{position:relative;display:inline-block}.autocomplete-items{position:absolute;border:1px solid #ddd;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items div{padding:1em;cursor:pointer;border-bottom:1px solid #ddd;background-color:#fff}.autocomplete-items div:hover{background-color:#def6ea}.autocomplete-active{background-color:#c8ffd0 !important}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.modal-container{position:fixed;display:flex;align-items:center;justify-content:center;top:0;left:0;width:100%;height:100%;z-index:var(--z-index);background:rgba(10,10,10,0.9)}.modal-container .modal{--width:auto;--height:auto;width:var(--width);height:var(--height)}.modal-container .modal .header{border-radius:1rem 1rem 0 0}.modal-container .modal .body:first-child{border-radius:1rem}.modal-container .modal .body:not(first-child){border-radius:0 0 1rem 1rem}.modal-container .modal .header{border-bottom:1px solid #ccc;padding:.5rem;text-align:center;background:#f0f0f0;text-transform:uppercase;letter-spacing:.1rem;line-height:3.8rem}.modal-container .modal .body{max-height:75vh;overflow:auto;padding:2.5rem 2rem 1.5rem 2rem;background:#fff}#notifications{position:fixed;bottom:0;right:0;width:25em;z-index:1000}#notifications .notification{background:rgba(185,255,193,0.9);border:1px solid rgba(109,205,134,0.62);border-radius:.5rem;margin-bottom:1rem;margin-right:1rem;cursor:pointer}#notifications .notification:hover{background:rgba(160,245,178,0.95)}#notifications .notification:hover.warning{background:rgba(218,245,68,0.95)}#notifications .notification:hover.error{background:rgba(245,90,90,0.95)}#notifications .notification.warning{background:rgba(228,255,78,0.9);border:1px solid rgba(205,205,109,0.62)}#notifications .notification.warning .image{--color:#662}#notifications .notification.error{background:rgba(255,100,100,0.9);border:1px solid rgba(205,109,109,0.62)}#notifications .notification.error .image{--color:darkred}#notifications .notification .title{padding:.4rem;line-height:3rem;letter-spacing:.1rem;font-weight:bold}#notifications .notification .body{height:6em;overflow:hidden;padding-bottom:1rem;letter-spacing:.05rem}#notifications .notification .image{height:100%;text-align:center;--color:#000}#notifications .notification .image .row{width:100%;height:100%}#notifications .notification .image .row .fa{font-size:2.5rem;color:var(--color)}#notifications .notification .image .row img{width:80%;height:80%}:root{--nav-height:4.5rem}nav{width:100%;position:relative;height:var(--nav-height);background:#e8e8e8;margin-bottom:.2rem;border-bottom:1px solid #e1e4e8;box-shadow:0 2.5px 4px 0 #bbb;flex:0 1 auto;z-index:2}nav ul{position:relative;width:75%;display:inline-flex;margin:0;padding:0;list-style-type:none;align-items:center}nav ul li{padding:1rem 1.5rem;display:inline-block;margin:0;text-transform:uppercase;letter-spacing:.1rem;border-radius:2rem}nav ul li:hover{background:#def6ea;letter-spacing:.4rem}nav ul li a{text-decoration:none;display:block;color:#5f7869}nav ul li a:hover{color:#5f7869}nav ul:hover .decorator{display:none}nav ul:hover li.selected{border-radius:2rem}nav .date-time{position:absolute;width:25%;display:inline-block;right:0;margin-right:.7rem;font-size:14pt;text-shadow:.2rem .2rem .2rem #ccc}nav .date-time .time{display:inline-block}nav .settings{display:inline-block;padding:.75rem 1rem}nav .settings:hover{background:#def6ea;border-radius:3rem}body{width:100%;height:100%;margin:0;overflow-x:hidden;font-family:"Raleway","HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px}#app{display:flex;flex-flow:column;height:100%}#app main{background:#fff;margin:0;flex:1 1 auto;overflow:hidden;height:-webkit-calc( 100vh - 4.8rem );height:-moz-calc( 100vh - 4.8rem );height:calc( 100vh - 4.8rem )}#app main .plugins-container{height:inherit}#app main .plugins-container .plugin-container{overflow:auto;height:inherit}#app main .plugins-container .plugin-container .plugin{overflow:auto}#app a{color:#5f7869} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/assistant.google.css b/platypush/backend/http/static/css/dist/webpanel/plugins/assistant.google.css deleted file mode 100644 index 462e73c8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/assistant.google.css +++ /dev/null @@ -1 +0,0 @@ -#assistant-google-modal .modal{width:50vw;height:50vh}#assistant-google-modal .modal .body{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center}#assistant-google-modal .modal .body .icon{font-size:3em;color:#7e8;box-shadow:2px 2px 2px #ccc;border:1px solid #ccc;border-radius:3em;padding:.7em 1em .5em 1em}#assistant-google-modal .modal .body .text{margin-top:2.5em} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.android.ipcam.css b/platypush/backend/http/static/css/dist/webpanel/plugins/camera.android.ipcam.css deleted file mode 100644 index 5037c711..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.android.ipcam.css +++ /dev/null @@ -1 +0,0 @@ -.camera{min-height:90%;margin-top:4%;overflow:auto;display:flex;flex-direction:column;align-items:center}.camera .camera-container{min-width:640px;min-height:480px;position:relative;background:#000;margin-bottom:1em}.camera .camera-container .frame,.camera .camera-container .no-frame{position:absolute;top:0;width:100%;height:100%}.camera .camera-container .frame{z-index:1}.camera .camera-container .no-frame{display:flex;background:rgba(0,0,0,0.1);color:#fff;align-items:center;justify-content:center;z-index:2} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.css b/platypush/backend/http/static/css/dist/webpanel/plugins/camera.css deleted file mode 100644 index 1b515f92..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.css +++ /dev/null @@ -1 +0,0 @@ -.camera{min-height:90%;margin-top:4%;overflow:auto;display:flex;flex-direction:column;align-items:center}.camera .camera-container{position:relative;background:#000;margin-bottom:1em}.camera .camera-container .frame,.camera .camera-container .no-frame{position:absolute;top:0;width:100%;height:100%}.camera .camera-container .frame{z-index:1}.camera .camera-container .no-frame{display:flex;background:rgba(0,0,0,0.1);color:#fff;align-items:center;justify-content:center;z-index:2}.camera .url{width:640px;display:flex;margin:1em}.camera .url .row{width:100%;display:flex;align-items:center}.camera .url .name{width:140px}.camera .url input{width:500px;font-weight:normal}.camera .params{margin-top:1em;padding:1em;width:640px;display:flex;flex-direction:column;border:1px solid #ccc;border-radius:1em}.camera .params label{font-weight:normal}.camera .params .head{display:flex;justify-content:center}.camera .params .head label{width:100%;display:flex;justify-content:right}.camera .params .head label .name{margin-right:1em}.camera .params .body{display:flex;flex-direction:column;margin:0 0 0 -1em}.camera .params .body .row{width:100%;display:flex;align-items:center;padding:.5em}.camera .params .body .row .name{width:30%}.camera .params .body .row input{width:70%}.camera .params .body .row:nth-child(even){background:#e4e4e4}.camera .params .body .row:hover{background:#def6ea} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.ir.mlx90640.css b/platypush/backend/http/static/css/dist/webpanel/plugins/camera.ir.mlx90640.css deleted file mode 100644 index 1b515f92..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.ir.mlx90640.css +++ /dev/null @@ -1 +0,0 @@ -.camera{min-height:90%;margin-top:4%;overflow:auto;display:flex;flex-direction:column;align-items:center}.camera .camera-container{position:relative;background:#000;margin-bottom:1em}.camera .camera-container .frame,.camera .camera-container .no-frame{position:absolute;top:0;width:100%;height:100%}.camera .camera-container .frame{z-index:1}.camera .camera-container .no-frame{display:flex;background:rgba(0,0,0,0.1);color:#fff;align-items:center;justify-content:center;z-index:2}.camera .url{width:640px;display:flex;margin:1em}.camera .url .row{width:100%;display:flex;align-items:center}.camera .url .name{width:140px}.camera .url input{width:500px;font-weight:normal}.camera .params{margin-top:1em;padding:1em;width:640px;display:flex;flex-direction:column;border:1px solid #ccc;border-radius:1em}.camera .params label{font-weight:normal}.camera .params .head{display:flex;justify-content:center}.camera .params .head label{width:100%;display:flex;justify-content:right}.camera .params .head label .name{margin-right:1em}.camera .params .body{display:flex;flex-direction:column;margin:0 0 0 -1em}.camera .params .body .row{width:100%;display:flex;align-items:center;padding:.5em}.camera .params .body .row .name{width:30%}.camera .params .body .row input{width:70%}.camera .params .body .row:nth-child(even){background:#e4e4e4}.camera .params .body .row:hover{background:#def6ea} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.pi.css b/platypush/backend/http/static/css/dist/webpanel/plugins/camera.pi.css deleted file mode 100644 index 1b515f92..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/camera.pi.css +++ /dev/null @@ -1 +0,0 @@ -.camera{min-height:90%;margin-top:4%;overflow:auto;display:flex;flex-direction:column;align-items:center}.camera .camera-container{position:relative;background:#000;margin-bottom:1em}.camera .camera-container .frame,.camera .camera-container .no-frame{position:absolute;top:0;width:100%;height:100%}.camera .camera-container .frame{z-index:1}.camera .camera-container .no-frame{display:flex;background:rgba(0,0,0,0.1);color:#fff;align-items:center;justify-content:center;z-index:2}.camera .url{width:640px;display:flex;margin:1em}.camera .url .row{width:100%;display:flex;align-items:center}.camera .url .name{width:140px}.camera .url input{width:500px;font-weight:normal}.camera .params{margin-top:1em;padding:1em;width:640px;display:flex;flex-direction:column;border:1px solid #ccc;border-radius:1em}.camera .params label{font-weight:normal}.camera .params .head{display:flex;justify-content:center}.camera .params .head label{width:100%;display:flex;justify-content:right}.camera .params .head label .name{margin-right:1em}.camera .params .body{display:flex;flex-direction:column;margin:0 0 0 -1em}.camera .params .body .row{width:100%;display:flex;align-items:center;padding:.5em}.camera .params .body .row .name{width:30%}.camera .params .body .row input{width:70%}.camera .params .body .row:nth-child(even){background:#e4e4e4}.camera .params .body .row:hover{background:#def6ea} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/execute.css b/platypush/backend/http/static/css/dist/webpanel/plugins/execute.css deleted file mode 100644 index b1573d3c..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/execute.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.execute-container{height:99%;color:#333;font-weight:400;border-bottom:1px solid #ddd;border-radius:0 0 1em 1em}.execute-container .title{background:#eee;padding:.2em;border:1px solid #ddd;box-shadow:0 3px 3px 0 rgba(187,187,187,0.75);font-size:1.1em}.execute-container .request-type-container{display:flex;flex-direction:row;align-items:baseline;margin:1em 0 0 1em}.execute-container .request-type-container label{margin:0 1em 0 .5em}.execute-container .request{margin:0 .5em}.execute-container .request form{margin-bottom:0 !important}.execute-container .request .autocomplete{width:80%;max-width:60em}.execute-container .request .action-name{box-shadow:1px 1px 1px 1px #ddd;width:100%}.execute-container .request [type=submit]{margin-left:2em}.execute-container .request .options{display:flex;margin-top:.5em;margin-bottom:1.5em;padding-top:.5em}.execute-container .request .params{margin-right:1.5em;max-height:50vh;overflow:auto}.execute-container .request .params .param{margin-bottom:.25em}.execute-container .request .params .action-param-value{width:100%}.execute-container .request .add-param{width:100%}.execute-container .request .add-param button{width:100%;background:#eee;border:1px solid #ddd}.execute-container .request .extra-param{display:flex;margin-bottom:.5em}.execute-container .request .extra-param .action-extra-param-del{border:0;text-align:right;padding:0 .5em}.execute-container .request .output-container{max-height:50vh;overflow:auto}.execute-container .request .output-container .response,.execute-container .request .output-container .error,.execute-container .request .output-container .doc{padding:.5em .5em 0 .5em;border-radius:1em}.execute-container .request .output-container .response{background:#edfff2;border:1px dashed #98ff98}.execute-container .request .output-container .error{background:#ffbcbc;border:1px dashed #ff5353}.execute-container .request .output-container .doc{background:#e8feff;border:1px dashed #84f9ff}.execute-container .request textarea{width:80%;max-width:60em;height:10em;border-radius:1em}.execute-container .raw-request .first-row{display:flex;flex-direction:row}.execute-container .procedures-container .procedure{border-bottom:1px solid #ddd;padding:1.5em .5em;cursor:pointer}.execute-container .procedures-container .procedure:hover{background:#def6ea}.execute-container .procedures-container .procedure.selected{background:#c8ffd0}.execute-container .procedures-container .procedure form{display:flex;margin-bottom:0 !important;flex-direction:column}.execute-container .procedures-container .procedure .head{display:flex;align-items:center}.execute-container .procedures-container .procedure .btn-container{text-align:right}.execute-container .procedures-container .procedure button{background:#ebffeb} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/gpio.css b/platypush/backend/http/static/css/dist/webpanel/plugins/gpio.css deleted file mode 100644 index 51db543b..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/gpio.css +++ /dev/null @@ -1 +0,0 @@ -.gpio-container{display:flex;flex-direction:column;height:100%;overflow:auto}.gpio-container .refresh{border-bottom:1px solid #ddd;background:#f8f8f8}.gpio-container .refresh button{border:0}.gpio-container .refresh button:hover{color:#35b870}.gpio-container .pins .pin{padding:1em;border-bottom:1px solid #ddd;display:flex;flex-direction:row;align-items:center}.gpio-container .pins .pin:nth-child(even){background:#f0f0f0}.gpio-container .pins .pin:hover{background:#def6ea} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/light.hue.css b/platypush/backend/http/static/css/dist/webpanel/plugins/light.hue.css deleted file mode 100644 index a7a1d9fd..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/light.hue.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.light-hue-container .groups .group * > .properties .slider-container,.light-hue-container .groups .scene * > .properties .slider-container,.light-hue-container .groups .unit * > .properties .slider-container,.light-hue-container .groups .animations * > .properties .slider-container,.light-hue-container .groups .group-controller * > .properties .slider-container,.light-hue-container .scenes .group * > .properties .slider-container,.light-hue-container .scenes .scene * > .properties .slider-container,.light-hue-container .scenes .unit * > .properties .slider-container,.light-hue-container .scenes .animations * > .properties .slider-container,.light-hue-container .scenes .group-controller * > .properties .slider-container,.light-hue-container .units .group * > .properties .slider-container,.light-hue-container .units .scene * > .properties .slider-container,.light-hue-container .units .unit * > .properties .slider-container,.light-hue-container .units .animations * > .properties .slider-container,.light-hue-container .units .group-controller * > .properties .slider-container{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.light-hue-container{display:flex;color:#333;font-weight:400;line-height:3.8rem;letter-spacing:.1rem;border-bottom:1px solid #ddd;border-radius:0 0 1em 1em}.light-hue-container .groups .group * > .properties,.light-hue-container .groups .scene * > .properties,.light-hue-container .groups .unit * > .properties,.light-hue-container .groups .animations * > .properties,.light-hue-container .groups .group-controller * > .properties,.light-hue-container .scenes .group * > .properties,.light-hue-container .scenes .scene * > .properties,.light-hue-container .scenes .unit * > .properties,.light-hue-container .scenes .animations * > .properties,.light-hue-container .scenes .group-controller * > .properties,.light-hue-container .units .group * > .properties,.light-hue-container .units .scene * > .properties,.light-hue-container .units .unit * > .properties,.light-hue-container .units .animations * > .properties,.light-hue-container .units .group-controller * > .properties,.light-hue-container .groups .animations .row .animation-container,.light-hue-container .scenes .animations .row .animation-container,.light-hue-container .units .animations .row .animation-container{margin:1.5rem auto;padding:1.5rem;font-weight:100;border:1px solid #ddd;border-radius:1.5rem;background:rgba(239,239,240,0.5);box-shadow:0 0 4px 2px rgba(187,187,187,0.75)}.light-hue-container .groups:not(:last-child),.light-hue-container .scenes:not(:last-child),.light-hue-container .units:not(:last-child){border-right:1px solid #ddd}.light-hue-container .groups .title,.light-hue-container .scenes .title,.light-hue-container .units .title{padding:.75rem;background:#f4f5f6;border-bottom:1px solid #ddd}.light-hue-container .groups .title:last-child,.light-hue-container .scenes .title:last-child,.light-hue-container .units .title:last-child{border-radius:0 1rem 0 0}.light-hue-container .groups .group,.light-hue-container .groups .scene,.light-hue-container .groups .unit,.light-hue-container .groups .animations,.light-hue-container .groups .group-controller,.light-hue-container .scenes .group,.light-hue-container .scenes .scene,.light-hue-container .scenes .unit,.light-hue-container .scenes .animations,.light-hue-container .scenes .group-controller,.light-hue-container .units .group,.light-hue-container .units .scene,.light-hue-container .units .unit,.light-hue-container .units .animations,.light-hue-container .units .group-controller{padding:1rem;cursor:pointer}.light-hue-container .groups .group:hover,.light-hue-container .groups .scene:hover,.light-hue-container .groups .unit:hover,.light-hue-container .groups .animations:hover,.light-hue-container .groups .group-controller:hover,.light-hue-container .scenes .group:hover,.light-hue-container .scenes .scene:hover,.light-hue-container .scenes .unit:hover,.light-hue-container .scenes .animations:hover,.light-hue-container .scenes .group-controller:hover,.light-hue-container .units .group:hover,.light-hue-container .units .scene:hover,.light-hue-container .units .unit:hover,.light-hue-container .units .animations:hover,.light-hue-container .units .group-controller:hover{background:#def6ea}.light-hue-container .groups .group:not(:last-child),.light-hue-container .groups .scene:not(:last-child),.light-hue-container .groups .unit:not(:last-child),.light-hue-container .groups .animations:not(:last-child),.light-hue-container .groups .group-controller:not(:last-child),.light-hue-container .scenes .group:not(:last-child),.light-hue-container .scenes .scene:not(:last-child),.light-hue-container .scenes .unit:not(:last-child),.light-hue-container .scenes .animations:not(:last-child),.light-hue-container .scenes .group-controller:not(:last-child),.light-hue-container .units .group:not(:last-child),.light-hue-container .units .scene:not(:last-child),.light-hue-container .units .unit:not(:last-child),.light-hue-container .units .animations:not(:last-child),.light-hue-container .units .group-controller:not(:last-child){border-bottom:1px solid #ddd}.light-hue-container .groups .group:not(.hidden) .row,.light-hue-container .groups .scene:not(.hidden) .row,.light-hue-container .groups .unit:not(.hidden) .row,.light-hue-container .groups .animations:not(.hidden) .row,.light-hue-container .groups .group-controller:not(.hidden) .row,.light-hue-container .scenes .group:not(.hidden) .row,.light-hue-container .scenes .scene:not(.hidden) .row,.light-hue-container .scenes .unit:not(.hidden) .row,.light-hue-container .scenes .animations:not(.hidden) .row,.light-hue-container .scenes .group-controller:not(.hidden) .row,.light-hue-container .units .group:not(.hidden) .row,.light-hue-container .units .scene:not(.hidden) .row,.light-hue-container .units .unit:not(.hidden) .row,.light-hue-container .units .animations:not(.hidden) .row,.light-hue-container .units .group-controller:not(.hidden) .row{width:100%}.light-hue-container .groups .group * > .properties .slider-container,.light-hue-container .groups .scene * > .properties .slider-container,.light-hue-container .groups .unit * > .properties .slider-container,.light-hue-container .groups .animations * > .properties .slider-container,.light-hue-container .groups .group-controller * > .properties .slider-container,.light-hue-container .scenes .group * > .properties .slider-container,.light-hue-container .scenes .scene * > .properties .slider-container,.light-hue-container .scenes .unit * > .properties .slider-container,.light-hue-container .scenes .animations * > .properties .slider-container,.light-hue-container .scenes .group-controller * > .properties .slider-container,.light-hue-container .units .group * > .properties .slider-container,.light-hue-container .units .scene * > .properties .slider-container,.light-hue-container .units .unit * > .properties .slider-container,.light-hue-container .units .animations * > .properties .slider-container,.light-hue-container .units .group-controller * > .properties .slider-container{margin:1rem auto}.light-hue-container .groups .group * > .properties * > .fa,.light-hue-container .groups .scene * > .properties * > .fa,.light-hue-container .groups .unit * > .properties * > .fa,.light-hue-container .groups .animations * > .properties * > .fa,.light-hue-container .groups .group-controller * > .properties * > .fa,.light-hue-container .scenes .group * > .properties * > .fa,.light-hue-container .scenes .scene * > .properties * > .fa,.light-hue-container .scenes .unit * > .properties * > .fa,.light-hue-container .scenes .animations * > .properties * > .fa,.light-hue-container .scenes .group-controller * > .properties * > .fa,.light-hue-container .units .group * > .properties * > .fa,.light-hue-container .units .scene * > .properties * > .fa,.light-hue-container .units .unit * > .properties * > .fa,.light-hue-container .units .animations * > .properties * > .fa,.light-hue-container .units .group-controller * > .properties * > .fa{font-size:2.5rem;color:#555}.light-hue-container .groups .group * > .properties * > .color-logo,.light-hue-container .groups .scene * > .properties * > .color-logo,.light-hue-container .groups .unit * > .properties * > .color-logo,.light-hue-container .groups .animations * > .properties * > .color-logo,.light-hue-container .groups .group-controller * > .properties * > .color-logo,.light-hue-container .scenes .group * > .properties * > .color-logo,.light-hue-container .scenes .scene * > .properties * > .color-logo,.light-hue-container .scenes .unit * > .properties * > .color-logo,.light-hue-container .scenes .animations * > .properties * > .color-logo,.light-hue-container .scenes .group-controller * > .properties * > .color-logo,.light-hue-container .units .group * > .properties * > .color-logo,.light-hue-container .units .scene * > .properties * > .color-logo,.light-hue-container .units .unit * > .properties * > .color-logo,.light-hue-container .units .animations * > .properties * > .color-logo,.light-hue-container .units .group-controller * > .properties * > .color-logo{width:2rem;height:2rem;border-radius:1rem}.light-hue-container .groups .group * > .properties * > .color-logo-red,.light-hue-container .groups .scene * > .properties * > .color-logo-red,.light-hue-container .groups .unit * > .properties * > .color-logo-red,.light-hue-container .groups .animations * > .properties * > .color-logo-red,.light-hue-container .groups .group-controller * > .properties * > .color-logo-red,.light-hue-container .scenes .group * > .properties * > .color-logo-red,.light-hue-container .scenes .scene * > .properties * > .color-logo-red,.light-hue-container .scenes .unit * > .properties * > .color-logo-red,.light-hue-container .scenes .animations * > .properties * > .color-logo-red,.light-hue-container .scenes .group-controller * > .properties * > .color-logo-red,.light-hue-container .units .group * > .properties * > .color-logo-red,.light-hue-container .units .scene * > .properties * > .color-logo-red,.light-hue-container .units .unit * > .properties * > .color-logo-red,.light-hue-container .units .animations * > .properties * > .color-logo-red,.light-hue-container .units .group-controller * > .properties * > .color-logo-red{background-color:red}.light-hue-container .groups .group * > .properties * > .color-logo-green,.light-hue-container .groups .scene * > .properties * > .color-logo-green,.light-hue-container .groups .unit * > .properties * > .color-logo-green,.light-hue-container .groups .animations * > .properties * > .color-logo-green,.light-hue-container .groups .group-controller * > .properties * > .color-logo-green,.light-hue-container .scenes .group * > .properties * > .color-logo-green,.light-hue-container .scenes .scene * > .properties * > .color-logo-green,.light-hue-container .scenes .unit * > .properties * > .color-logo-green,.light-hue-container .scenes .animations * > .properties * > .color-logo-green,.light-hue-container .scenes .group-controller * > .properties * > .color-logo-green,.light-hue-container .units .group * > .properties * > .color-logo-green,.light-hue-container .units .scene * > .properties * > .color-logo-green,.light-hue-container .units .unit * > .properties * > .color-logo-green,.light-hue-container .units .animations * > .properties * > .color-logo-green,.light-hue-container .units .group-controller * > .properties * > .color-logo-green{background-color:green}.light-hue-container .groups .group * > .properties * > .color-logo-blue,.light-hue-container .groups .scene * > .properties * > .color-logo-blue,.light-hue-container .groups .unit * > .properties * > .color-logo-blue,.light-hue-container .groups .animations * > .properties * > .color-logo-blue,.light-hue-container .groups .group-controller * > .properties * > .color-logo-blue,.light-hue-container .scenes .group * > .properties * > .color-logo-blue,.light-hue-container .scenes .scene * > .properties * > .color-logo-blue,.light-hue-container .scenes .unit * > .properties * > .color-logo-blue,.light-hue-container .scenes .animations * > .properties * > .color-logo-blue,.light-hue-container .scenes .group-controller * > .properties * > .color-logo-blue,.light-hue-container .units .group * > .properties * > .color-logo-blue,.light-hue-container .units .scene * > .properties * > .color-logo-blue,.light-hue-container .units .unit * > .properties * > .color-logo-blue,.light-hue-container .units .animations * > .properties * > .color-logo-blue,.light-hue-container .units .group-controller * > .properties * > .color-logo-blue{background-color:blue}.light-hue-container .groups .group:hover * > .properties,.light-hue-container .groups .scene:hover * > .properties,.light-hue-container .groups .unit:hover * > .properties,.light-hue-container .groups .animations:hover * > .properties,.light-hue-container .groups .group-controller:hover * > .properties,.light-hue-container .scenes .group:hover * > .properties,.light-hue-container .scenes .scene:hover * > .properties,.light-hue-container .scenes .unit:hover * > .properties,.light-hue-container .scenes .animations:hover * > .properties,.light-hue-container .scenes .group-controller:hover * > .properties,.light-hue-container .units .group:hover * > .properties,.light-hue-container .units .scene:hover * > .properties,.light-hue-container .units .unit:hover * > .properties,.light-hue-container .units .animations:hover * > .properties,.light-hue-container .units .group-controller:hover * > .properties{background:#fff}.light-hue-container .groups .group,.light-hue-container .scenes .group,.light-hue-container .units .group{text-transform:uppercase}.light-hue-container .groups .group-controller,.light-hue-container .scenes .group-controller,.light-hue-container .units .group-controller{font-weight:600}.light-hue-container .groups .animations .row .caption,.light-hue-container .scenes .animations .row .caption,.light-hue-container .units .animations .row .caption{font-style:italic}.light-hue-container .groups .animations .row .animation-container,.light-hue-container .scenes .animations .row .animation-container,.light-hue-container .units .animations .row .animation-container{cursor:auto}.light-hue-container .groups .animations .row .animation-container .animation .row,.light-hue-container .scenes .animations .row .animation-container .animation .row,.light-hue-container .units .animations .row .animation-container .animation .row{padding:1rem .3333rem}.light-hue-container .groups .animations .row .animation-container .animation .row:hover,.light-hue-container .scenes .animations .row .animation-container .animation .row:hover,.light-hue-container .units .animations .row .animation-container .animation .row:hover{background:#def6ea;border-radius:1.5rem}.light-hue-container .groups .animations .row .animation-container .animation .row:hover * > input[type=range],.light-hue-container .scenes .animations .row .animation-container .animation .row:hover * > input[type=range],.light-hue-container .units .animations .row .animation-container .animation .row:hover * > input[type=range]{background:#d2d2d2}.light-hue-container .groups .animations .row select[name=animation-type],.light-hue-container .scenes .animations .row select[name=animation-type],.light-hue-container .units .animations .row select[name=animation-type]{width:100%}.light-hue-container .groups .animations * > .input-range-container,.light-hue-container .scenes .animations * > .input-range-container,.light-hue-container .units .animations * > .input-range-container{margin-top:1rem;margin-bottom:-1rem}.light-hue-container .groups .animations * > input[type="text"],.light-hue-container .scenes .animations * > input[type="text"],.light-hue-container .units .animations * > input[type="text"]{width:100%}.light-hue-container .groups .animations:hover .row .animation-container,.light-hue-container .scenes .animations:hover .row .animation-container,.light-hue-container .units .animations:hover .row .animation-container{background:#fff}.light-hue-container .groups .title{border-radius:1rem 0 0 0}.light-hue-container .units .title{border-radius:0 1rem 0 0} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/media.css b/platypush/backend/http/static/css/dist/webpanel/plugins/media.css deleted file mode 100644 index 4647e8a8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/media.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.media-plugin .controls,.media-plugin .controls .item-container,.media-plugin .controls .playback-controls .row{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow,.media-plugin .results .active{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.media-plugin .search{display:flex;align-items:center;width:100%;background:#f1f3f2;border-bottom:1px solid #ccc}.media-plugin .search input[type=text]{width:80%;max-width:600px}.media-plugin .search [type=submit]{color:#35b870;font-size:1.2em}.media-plugin .search [type=submit]:hover{border:1px solid #ddd;border-radius:5rem}.media-plugin .search .types .type{display:inline-block;padding:1rem 1rem 0 1rem}.media-plugin .search .types label{display:inline-block;font-weight:normal;margin:0}.media-plugin .search button{padding:0 2rem;border:0}.media-plugin .search button:hover{color:#35b870}.media-plugin .search form{width:100%;margin:0;padding:1rem 0}.media-plugin .devices{display:inline-block}.media-plugin .devices button{padding:.5rem;margin-right:.5rem}.media-plugin .devices button.selected{background:initial;color:#35b870}.media-plugin .devices button.selected:hover{color:#38cf80}.media-plugin .devices .dropdown{white-space:nowrap}.media-plugin .devices .dropdown .item{display:flex;align-items:center}.media-plugin .devices .dropdown .item .text{text-align:left;margin-left:2rem}.media-plugin .devices .dropdown .item:first-child{border-bottom:1px solid #ccc;color:#666;font-size:.8em}.media-plugin .devices .dropdown .item:hover{background:#def6ea}.media-plugin .results{position:relative;overflow:auto;height:-webkit-calc( 100% );height:-moz-calc( 100% );height:calc( 100% )}.media-plugin .results.resize{height:-webkit-calc( 100% - 16rem );height:-moz-calc( 100% - 16rem );height:calc( 100% - 16rem )}.media-plugin .results .active{height:4rem}.media-plugin .results .empty{height:100%;display:flex;align-items:center;justify-content:center;font-size:1.5em;letter-spacing:.1rem;color:#506050}.media-plugin .results .media-item{display:flex;align-items:center;cursor:pointer;border-radius:1rem;padding:.5rem}.media-plugin .results .media-item:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .results .media-item:nth-child(even){background:#f1f3f2}.media-plugin .results .media-item:hover{background:#def6ea}.media-plugin .results .media-item.selected{background:#c8ffd0}.media-plugin .controls{width:100%;border-top:1px solid #ddd;box-shadow:0 -2.5px 4px 0 silver;flex:0 0 10rem}.media-plugin .controls .item-container{padding-left:1rem;line-height:2.6rem}.media-plugin .controls .item-container .item-info{font-size:1.15em;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.media-plugin .controls .item-container .item-info:hover{color:#35b870}.media-plugin .controls button:hover .fa{color:#59df3e}.media-plugin .controls .playback-controls .row{justify-content:center}.media-plugin .controls .playback-controls .position{margin-top:.75em}.media-plugin .controls .playback-controls button{padding:0 1.5rem}.media-plugin .controls .playback-controls button .fa-play,.media-plugin .controls .playback-controls button .fa-pause{color:#59df3e;font-size:30px;margin-top:.3rem}.media-plugin .controls .playback-controls button .fa-play:hover,.media-plugin .controls .playback-controls button .fa-pause:hover{color:#64ef4a}.media-plugin .controls .pull-right button:not(last-child){padding:0 .7rem}.media-plugin .controls .pull-right button:last-child{padding:0}.media-plugin .controls .pull-right .volume-container button{padding:0 .3rem 0 0;background:none}.media-plugin .controls .seek-slider{width:75%}.media-plugin .controls .volume-slider{width:75%;margin-right:1rem}.media-plugin .controls .elapsed-time,.media-plugin .controls .total-time{font-size:.7em;color:.7em}.media-plugin .controls .elapsed-time{margin-right:1.5rem}.media-plugin .controls .total-time{margin-left:1.5rem}.media-plugin #media-info .modal{max-width:90%}.media-plugin .info-container .row{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd}.media-plugin .info-container .row:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .info-container .row:nth-child(even){background:#f1f3f2}.media-plugin .info-container .row:hover{background:#def6ea;border-radius:1em}.media-plugin .info-container .row .attr{font-size:1.1em}.media-plugin .info-container .row .value{text-align:right}.media-plugin #media-subs .body{padding:0}.media-plugin .subs-container .loading,.media-plugin .subs-container .no-results{display:flex;align-items:center;padding:3rem;font-size:1.5em}.media-plugin .subs-container .subs .list{max-height:50vh;overflow:auto}.media-plugin .subs-container .subs .sub{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd;cursor:pointer}.media-plugin .subs-container .subs .sub:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .subs-container .subs .sub:nth-child(even){background:#f1f3f2}.media-plugin .subs-container .subs .sub.selected{background:#c8ffd0}.media-plugin .subs-container .subs .sub:hover{background:#def6ea;border-radius:1em}.media-plugin .subs-container .subs .controls{position:relative;padding:1.5rem 0;height:4rem}.media-plugin .subs-container .subs .controls button{position:absolute;right:0;margin-right:1rem;border:1px solid #ddd;box-shadow:2px 2px 2px #ddd}.media-plugin .subs-container .subs .controls button:hover:not([disabled]){box-shadow:3px 3px 3px #ddd;color:#35b870}.media-plugin #media-torrents .modal{width:90%}.media-plugin #media-torrents .modal .body{padding:0;text-align:center}.media-plugin #media-torrents .modal .body .search input[type=text]{width:88%;max-width:none}.media-plugin #media-torrents .modal .body .search input[type=submit]{width:8%}.media-plugin #media-torrents .modal .body .head{font-weight:bold;padding:.5rem 0 2.5rem 0;background:#e8e8e8;border-bottom:1px solid #ccc}.media-plugin #media-torrents .modal .body .transfers-container{margin:0;width:100%}.media-plugin #media-torrents .modal .body .transfer{display:flex;padding:1.5rem;cursor:pointer}.media-plugin #media-torrents .modal .body .transfer:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin #media-torrents .modal .body .transfer:nth-child(even){background:#f1f3f2}.media-plugin #media-torrents .modal .body .transfer.selected{background:#c8ffd0}.media-plugin #media-torrents .modal .body .transfer:hover{background:#def6ea;border-radius:.5rem}.media-plugin{display:flex;flex-direction:column;height:inherit;letter-spacing:.03rem}.media-plugin .dropdown{z-index:2}.media-plugin .dropdown .item{display:flex;align-items:center}.media-plugin .dropdown .item .text{margin-left:1rem}.media-plugin .dropdown .item:hover{background:#def6ea}.media-plugin input[type=text]{width:100%}.media-plugin input[type=text]:hover{border-color:#35b870}.media-plugin button{border:0}.media-plugin .icon{color:#444;margin-right:.5em}.media-plugin .top-buttons{text-align:right;float:right} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/media.mplayer.css b/platypush/backend/http/static/css/dist/webpanel/plugins/media.mplayer.css deleted file mode 100644 index 4647e8a8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/media.mplayer.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.media-plugin .controls,.media-plugin .controls .item-container,.media-plugin .controls .playback-controls .row{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow,.media-plugin .results .active{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.media-plugin .search{display:flex;align-items:center;width:100%;background:#f1f3f2;border-bottom:1px solid #ccc}.media-plugin .search input[type=text]{width:80%;max-width:600px}.media-plugin .search [type=submit]{color:#35b870;font-size:1.2em}.media-plugin .search [type=submit]:hover{border:1px solid #ddd;border-radius:5rem}.media-plugin .search .types .type{display:inline-block;padding:1rem 1rem 0 1rem}.media-plugin .search .types label{display:inline-block;font-weight:normal;margin:0}.media-plugin .search button{padding:0 2rem;border:0}.media-plugin .search button:hover{color:#35b870}.media-plugin .search form{width:100%;margin:0;padding:1rem 0}.media-plugin .devices{display:inline-block}.media-plugin .devices button{padding:.5rem;margin-right:.5rem}.media-plugin .devices button.selected{background:initial;color:#35b870}.media-plugin .devices button.selected:hover{color:#38cf80}.media-plugin .devices .dropdown{white-space:nowrap}.media-plugin .devices .dropdown .item{display:flex;align-items:center}.media-plugin .devices .dropdown .item .text{text-align:left;margin-left:2rem}.media-plugin .devices .dropdown .item:first-child{border-bottom:1px solid #ccc;color:#666;font-size:.8em}.media-plugin .devices .dropdown .item:hover{background:#def6ea}.media-plugin .results{position:relative;overflow:auto;height:-webkit-calc( 100% );height:-moz-calc( 100% );height:calc( 100% )}.media-plugin .results.resize{height:-webkit-calc( 100% - 16rem );height:-moz-calc( 100% - 16rem );height:calc( 100% - 16rem )}.media-plugin .results .active{height:4rem}.media-plugin .results .empty{height:100%;display:flex;align-items:center;justify-content:center;font-size:1.5em;letter-spacing:.1rem;color:#506050}.media-plugin .results .media-item{display:flex;align-items:center;cursor:pointer;border-radius:1rem;padding:.5rem}.media-plugin .results .media-item:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .results .media-item:nth-child(even){background:#f1f3f2}.media-plugin .results .media-item:hover{background:#def6ea}.media-plugin .results .media-item.selected{background:#c8ffd0}.media-plugin .controls{width:100%;border-top:1px solid #ddd;box-shadow:0 -2.5px 4px 0 silver;flex:0 0 10rem}.media-plugin .controls .item-container{padding-left:1rem;line-height:2.6rem}.media-plugin .controls .item-container .item-info{font-size:1.15em;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.media-plugin .controls .item-container .item-info:hover{color:#35b870}.media-plugin .controls button:hover .fa{color:#59df3e}.media-plugin .controls .playback-controls .row{justify-content:center}.media-plugin .controls .playback-controls .position{margin-top:.75em}.media-plugin .controls .playback-controls button{padding:0 1.5rem}.media-plugin .controls .playback-controls button .fa-play,.media-plugin .controls .playback-controls button .fa-pause{color:#59df3e;font-size:30px;margin-top:.3rem}.media-plugin .controls .playback-controls button .fa-play:hover,.media-plugin .controls .playback-controls button .fa-pause:hover{color:#64ef4a}.media-plugin .controls .pull-right button:not(last-child){padding:0 .7rem}.media-plugin .controls .pull-right button:last-child{padding:0}.media-plugin .controls .pull-right .volume-container button{padding:0 .3rem 0 0;background:none}.media-plugin .controls .seek-slider{width:75%}.media-plugin .controls .volume-slider{width:75%;margin-right:1rem}.media-plugin .controls .elapsed-time,.media-plugin .controls .total-time{font-size:.7em;color:.7em}.media-plugin .controls .elapsed-time{margin-right:1.5rem}.media-plugin .controls .total-time{margin-left:1.5rem}.media-plugin #media-info .modal{max-width:90%}.media-plugin .info-container .row{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd}.media-plugin .info-container .row:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .info-container .row:nth-child(even){background:#f1f3f2}.media-plugin .info-container .row:hover{background:#def6ea;border-radius:1em}.media-plugin .info-container .row .attr{font-size:1.1em}.media-plugin .info-container .row .value{text-align:right}.media-plugin #media-subs .body{padding:0}.media-plugin .subs-container .loading,.media-plugin .subs-container .no-results{display:flex;align-items:center;padding:3rem;font-size:1.5em}.media-plugin .subs-container .subs .list{max-height:50vh;overflow:auto}.media-plugin .subs-container .subs .sub{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd;cursor:pointer}.media-plugin .subs-container .subs .sub:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .subs-container .subs .sub:nth-child(even){background:#f1f3f2}.media-plugin .subs-container .subs .sub.selected{background:#c8ffd0}.media-plugin .subs-container .subs .sub:hover{background:#def6ea;border-radius:1em}.media-plugin .subs-container .subs .controls{position:relative;padding:1.5rem 0;height:4rem}.media-plugin .subs-container .subs .controls button{position:absolute;right:0;margin-right:1rem;border:1px solid #ddd;box-shadow:2px 2px 2px #ddd}.media-plugin .subs-container .subs .controls button:hover:not([disabled]){box-shadow:3px 3px 3px #ddd;color:#35b870}.media-plugin #media-torrents .modal{width:90%}.media-plugin #media-torrents .modal .body{padding:0;text-align:center}.media-plugin #media-torrents .modal .body .search input[type=text]{width:88%;max-width:none}.media-plugin #media-torrents .modal .body .search input[type=submit]{width:8%}.media-plugin #media-torrents .modal .body .head{font-weight:bold;padding:.5rem 0 2.5rem 0;background:#e8e8e8;border-bottom:1px solid #ccc}.media-plugin #media-torrents .modal .body .transfers-container{margin:0;width:100%}.media-plugin #media-torrents .modal .body .transfer{display:flex;padding:1.5rem;cursor:pointer}.media-plugin #media-torrents .modal .body .transfer:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin #media-torrents .modal .body .transfer:nth-child(even){background:#f1f3f2}.media-plugin #media-torrents .modal .body .transfer.selected{background:#c8ffd0}.media-plugin #media-torrents .modal .body .transfer:hover{background:#def6ea;border-radius:.5rem}.media-plugin{display:flex;flex-direction:column;height:inherit;letter-spacing:.03rem}.media-plugin .dropdown{z-index:2}.media-plugin .dropdown .item{display:flex;align-items:center}.media-plugin .dropdown .item .text{margin-left:1rem}.media-plugin .dropdown .item:hover{background:#def6ea}.media-plugin input[type=text]{width:100%}.media-plugin input[type=text]:hover{border-color:#35b870}.media-plugin button{border:0}.media-plugin .icon{color:#444;margin-right:.5em}.media-plugin .top-buttons{text-align:right;float:right} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/media.mpv.css b/platypush/backend/http/static/css/dist/webpanel/plugins/media.mpv.css deleted file mode 100644 index 4647e8a8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/media.mpv.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.media-plugin .controls,.media-plugin .controls .item-container,.media-plugin .controls .playback-controls .row{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow,.media-plugin .results .active{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.media-plugin .search{display:flex;align-items:center;width:100%;background:#f1f3f2;border-bottom:1px solid #ccc}.media-plugin .search input[type=text]{width:80%;max-width:600px}.media-plugin .search [type=submit]{color:#35b870;font-size:1.2em}.media-plugin .search [type=submit]:hover{border:1px solid #ddd;border-radius:5rem}.media-plugin .search .types .type{display:inline-block;padding:1rem 1rem 0 1rem}.media-plugin .search .types label{display:inline-block;font-weight:normal;margin:0}.media-plugin .search button{padding:0 2rem;border:0}.media-plugin .search button:hover{color:#35b870}.media-plugin .search form{width:100%;margin:0;padding:1rem 0}.media-plugin .devices{display:inline-block}.media-plugin .devices button{padding:.5rem;margin-right:.5rem}.media-plugin .devices button.selected{background:initial;color:#35b870}.media-plugin .devices button.selected:hover{color:#38cf80}.media-plugin .devices .dropdown{white-space:nowrap}.media-plugin .devices .dropdown .item{display:flex;align-items:center}.media-plugin .devices .dropdown .item .text{text-align:left;margin-left:2rem}.media-plugin .devices .dropdown .item:first-child{border-bottom:1px solid #ccc;color:#666;font-size:.8em}.media-plugin .devices .dropdown .item:hover{background:#def6ea}.media-plugin .results{position:relative;overflow:auto;height:-webkit-calc( 100% );height:-moz-calc( 100% );height:calc( 100% )}.media-plugin .results.resize{height:-webkit-calc( 100% - 16rem );height:-moz-calc( 100% - 16rem );height:calc( 100% - 16rem )}.media-plugin .results .active{height:4rem}.media-plugin .results .empty{height:100%;display:flex;align-items:center;justify-content:center;font-size:1.5em;letter-spacing:.1rem;color:#506050}.media-plugin .results .media-item{display:flex;align-items:center;cursor:pointer;border-radius:1rem;padding:.5rem}.media-plugin .results .media-item:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .results .media-item:nth-child(even){background:#f1f3f2}.media-plugin .results .media-item:hover{background:#def6ea}.media-plugin .results .media-item.selected{background:#c8ffd0}.media-plugin .controls{width:100%;border-top:1px solid #ddd;box-shadow:0 -2.5px 4px 0 silver;flex:0 0 10rem}.media-plugin .controls .item-container{padding-left:1rem;line-height:2.6rem}.media-plugin .controls .item-container .item-info{font-size:1.15em;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.media-plugin .controls .item-container .item-info:hover{color:#35b870}.media-plugin .controls button:hover .fa{color:#59df3e}.media-plugin .controls .playback-controls .row{justify-content:center}.media-plugin .controls .playback-controls .position{margin-top:.75em}.media-plugin .controls .playback-controls button{padding:0 1.5rem}.media-plugin .controls .playback-controls button .fa-play,.media-plugin .controls .playback-controls button .fa-pause{color:#59df3e;font-size:30px;margin-top:.3rem}.media-plugin .controls .playback-controls button .fa-play:hover,.media-plugin .controls .playback-controls button .fa-pause:hover{color:#64ef4a}.media-plugin .controls .pull-right button:not(last-child){padding:0 .7rem}.media-plugin .controls .pull-right button:last-child{padding:0}.media-plugin .controls .pull-right .volume-container button{padding:0 .3rem 0 0;background:none}.media-plugin .controls .seek-slider{width:75%}.media-plugin .controls .volume-slider{width:75%;margin-right:1rem}.media-plugin .controls .elapsed-time,.media-plugin .controls .total-time{font-size:.7em;color:.7em}.media-plugin .controls .elapsed-time{margin-right:1.5rem}.media-plugin .controls .total-time{margin-left:1.5rem}.media-plugin #media-info .modal{max-width:90%}.media-plugin .info-container .row{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd}.media-plugin .info-container .row:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .info-container .row:nth-child(even){background:#f1f3f2}.media-plugin .info-container .row:hover{background:#def6ea;border-radius:1em}.media-plugin .info-container .row .attr{font-size:1.1em}.media-plugin .info-container .row .value{text-align:right}.media-plugin #media-subs .body{padding:0}.media-plugin .subs-container .loading,.media-plugin .subs-container .no-results{display:flex;align-items:center;padding:3rem;font-size:1.5em}.media-plugin .subs-container .subs .list{max-height:50vh;overflow:auto}.media-plugin .subs-container .subs .sub{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd;cursor:pointer}.media-plugin .subs-container .subs .sub:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .subs-container .subs .sub:nth-child(even){background:#f1f3f2}.media-plugin .subs-container .subs .sub.selected{background:#c8ffd0}.media-plugin .subs-container .subs .sub:hover{background:#def6ea;border-radius:1em}.media-plugin .subs-container .subs .controls{position:relative;padding:1.5rem 0;height:4rem}.media-plugin .subs-container .subs .controls button{position:absolute;right:0;margin-right:1rem;border:1px solid #ddd;box-shadow:2px 2px 2px #ddd}.media-plugin .subs-container .subs .controls button:hover:not([disabled]){box-shadow:3px 3px 3px #ddd;color:#35b870}.media-plugin #media-torrents .modal{width:90%}.media-plugin #media-torrents .modal .body{padding:0;text-align:center}.media-plugin #media-torrents .modal .body .search input[type=text]{width:88%;max-width:none}.media-plugin #media-torrents .modal .body .search input[type=submit]{width:8%}.media-plugin #media-torrents .modal .body .head{font-weight:bold;padding:.5rem 0 2.5rem 0;background:#e8e8e8;border-bottom:1px solid #ccc}.media-plugin #media-torrents .modal .body .transfers-container{margin:0;width:100%}.media-plugin #media-torrents .modal .body .transfer{display:flex;padding:1.5rem;cursor:pointer}.media-plugin #media-torrents .modal .body .transfer:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin #media-torrents .modal .body .transfer:nth-child(even){background:#f1f3f2}.media-plugin #media-torrents .modal .body .transfer.selected{background:#c8ffd0}.media-plugin #media-torrents .modal .body .transfer:hover{background:#def6ea;border-radius:.5rem}.media-plugin{display:flex;flex-direction:column;height:inherit;letter-spacing:.03rem}.media-plugin .dropdown{z-index:2}.media-plugin .dropdown .item{display:flex;align-items:center}.media-plugin .dropdown .item .text{margin-left:1rem}.media-plugin .dropdown .item:hover{background:#def6ea}.media-plugin input[type=text]{width:100%}.media-plugin input[type=text]:hover{border-color:#35b870}.media-plugin button{border:0}.media-plugin .icon{color:#444;margin-right:.5em}.media-plugin .top-buttons{text-align:right;float:right} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/media.omxplayer.css b/platypush/backend/http/static/css/dist/webpanel/plugins/media.omxplayer.css deleted file mode 100644 index 4647e8a8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/media.omxplayer.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.media-plugin .controls,.media-plugin .controls .item-container,.media-plugin .controls .playback-controls .row{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow,.media-plugin .results .active{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.media-plugin .search{display:flex;align-items:center;width:100%;background:#f1f3f2;border-bottom:1px solid #ccc}.media-plugin .search input[type=text]{width:80%;max-width:600px}.media-plugin .search [type=submit]{color:#35b870;font-size:1.2em}.media-plugin .search [type=submit]:hover{border:1px solid #ddd;border-radius:5rem}.media-plugin .search .types .type{display:inline-block;padding:1rem 1rem 0 1rem}.media-plugin .search .types label{display:inline-block;font-weight:normal;margin:0}.media-plugin .search button{padding:0 2rem;border:0}.media-plugin .search button:hover{color:#35b870}.media-plugin .search form{width:100%;margin:0;padding:1rem 0}.media-plugin .devices{display:inline-block}.media-plugin .devices button{padding:.5rem;margin-right:.5rem}.media-plugin .devices button.selected{background:initial;color:#35b870}.media-plugin .devices button.selected:hover{color:#38cf80}.media-plugin .devices .dropdown{white-space:nowrap}.media-plugin .devices .dropdown .item{display:flex;align-items:center}.media-plugin .devices .dropdown .item .text{text-align:left;margin-left:2rem}.media-plugin .devices .dropdown .item:first-child{border-bottom:1px solid #ccc;color:#666;font-size:.8em}.media-plugin .devices .dropdown .item:hover{background:#def6ea}.media-plugin .results{position:relative;overflow:auto;height:-webkit-calc( 100% );height:-moz-calc( 100% );height:calc( 100% )}.media-plugin .results.resize{height:-webkit-calc( 100% - 16rem );height:-moz-calc( 100% - 16rem );height:calc( 100% - 16rem )}.media-plugin .results .active{height:4rem}.media-plugin .results .empty{height:100%;display:flex;align-items:center;justify-content:center;font-size:1.5em;letter-spacing:.1rem;color:#506050}.media-plugin .results .media-item{display:flex;align-items:center;cursor:pointer;border-radius:1rem;padding:.5rem}.media-plugin .results .media-item:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .results .media-item:nth-child(even){background:#f1f3f2}.media-plugin .results .media-item:hover{background:#def6ea}.media-plugin .results .media-item.selected{background:#c8ffd0}.media-plugin .controls{width:100%;border-top:1px solid #ddd;box-shadow:0 -2.5px 4px 0 silver;flex:0 0 10rem}.media-plugin .controls .item-container{padding-left:1rem;line-height:2.6rem}.media-plugin .controls .item-container .item-info{font-size:1.15em;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.media-plugin .controls .item-container .item-info:hover{color:#35b870}.media-plugin .controls button:hover .fa{color:#59df3e}.media-plugin .controls .playback-controls .row{justify-content:center}.media-plugin .controls .playback-controls .position{margin-top:.75em}.media-plugin .controls .playback-controls button{padding:0 1.5rem}.media-plugin .controls .playback-controls button .fa-play,.media-plugin .controls .playback-controls button .fa-pause{color:#59df3e;font-size:30px;margin-top:.3rem}.media-plugin .controls .playback-controls button .fa-play:hover,.media-plugin .controls .playback-controls button .fa-pause:hover{color:#64ef4a}.media-plugin .controls .pull-right button:not(last-child){padding:0 .7rem}.media-plugin .controls .pull-right button:last-child{padding:0}.media-plugin .controls .pull-right .volume-container button{padding:0 .3rem 0 0;background:none}.media-plugin .controls .seek-slider{width:75%}.media-plugin .controls .volume-slider{width:75%;margin-right:1rem}.media-plugin .controls .elapsed-time,.media-plugin .controls .total-time{font-size:.7em;color:.7em}.media-plugin .controls .elapsed-time{margin-right:1.5rem}.media-plugin .controls .total-time{margin-left:1.5rem}.media-plugin #media-info .modal{max-width:90%}.media-plugin .info-container .row{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd}.media-plugin .info-container .row:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .info-container .row:nth-child(even){background:#f1f3f2}.media-plugin .info-container .row:hover{background:#def6ea;border-radius:1em}.media-plugin .info-container .row .attr{font-size:1.1em}.media-plugin .info-container .row .value{text-align:right}.media-plugin #media-subs .body{padding:0}.media-plugin .subs-container .loading,.media-plugin .subs-container .no-results{display:flex;align-items:center;padding:3rem;font-size:1.5em}.media-plugin .subs-container .subs .list{max-height:50vh;overflow:auto}.media-plugin .subs-container .subs .sub{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd;cursor:pointer}.media-plugin .subs-container .subs .sub:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .subs-container .subs .sub:nth-child(even){background:#f1f3f2}.media-plugin .subs-container .subs .sub.selected{background:#c8ffd0}.media-plugin .subs-container .subs .sub:hover{background:#def6ea;border-radius:1em}.media-plugin .subs-container .subs .controls{position:relative;padding:1.5rem 0;height:4rem}.media-plugin .subs-container .subs .controls button{position:absolute;right:0;margin-right:1rem;border:1px solid #ddd;box-shadow:2px 2px 2px #ddd}.media-plugin .subs-container .subs .controls button:hover:not([disabled]){box-shadow:3px 3px 3px #ddd;color:#35b870}.media-plugin #media-torrents .modal{width:90%}.media-plugin #media-torrents .modal .body{padding:0;text-align:center}.media-plugin #media-torrents .modal .body .search input[type=text]{width:88%;max-width:none}.media-plugin #media-torrents .modal .body .search input[type=submit]{width:8%}.media-plugin #media-torrents .modal .body .head{font-weight:bold;padding:.5rem 0 2.5rem 0;background:#e8e8e8;border-bottom:1px solid #ccc}.media-plugin #media-torrents .modal .body .transfers-container{margin:0;width:100%}.media-plugin #media-torrents .modal .body .transfer{display:flex;padding:1.5rem;cursor:pointer}.media-plugin #media-torrents .modal .body .transfer:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin #media-torrents .modal .body .transfer:nth-child(even){background:#f1f3f2}.media-plugin #media-torrents .modal .body .transfer.selected{background:#c8ffd0}.media-plugin #media-torrents .modal .body .transfer:hover{background:#def6ea;border-radius:.5rem}.media-plugin{display:flex;flex-direction:column;height:inherit;letter-spacing:.03rem}.media-plugin .dropdown{z-index:2}.media-plugin .dropdown .item{display:flex;align-items:center}.media-plugin .dropdown .item .text{margin-left:1rem}.media-plugin .dropdown .item:hover{background:#def6ea}.media-plugin input[type=text]{width:100%}.media-plugin input[type=text]:hover{border-color:#35b870}.media-plugin button{border:0}.media-plugin .icon{color:#444;margin-right:.5em}.media-plugin .top-buttons{text-align:right;float:right} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/media.vlc.css b/platypush/backend/http/static/css/dist/webpanel/plugins/media.vlc.css deleted file mode 100644 index 4647e8a8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/media.vlc.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.media-plugin .controls,.media-plugin .controls .item-container,.media-plugin .controls .playback-controls .row{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow,.media-plugin .results .active{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.media-plugin .search{display:flex;align-items:center;width:100%;background:#f1f3f2;border-bottom:1px solid #ccc}.media-plugin .search input[type=text]{width:80%;max-width:600px}.media-plugin .search [type=submit]{color:#35b870;font-size:1.2em}.media-plugin .search [type=submit]:hover{border:1px solid #ddd;border-radius:5rem}.media-plugin .search .types .type{display:inline-block;padding:1rem 1rem 0 1rem}.media-plugin .search .types label{display:inline-block;font-weight:normal;margin:0}.media-plugin .search button{padding:0 2rem;border:0}.media-plugin .search button:hover{color:#35b870}.media-plugin .search form{width:100%;margin:0;padding:1rem 0}.media-plugin .devices{display:inline-block}.media-plugin .devices button{padding:.5rem;margin-right:.5rem}.media-plugin .devices button.selected{background:initial;color:#35b870}.media-plugin .devices button.selected:hover{color:#38cf80}.media-plugin .devices .dropdown{white-space:nowrap}.media-plugin .devices .dropdown .item{display:flex;align-items:center}.media-plugin .devices .dropdown .item .text{text-align:left;margin-left:2rem}.media-plugin .devices .dropdown .item:first-child{border-bottom:1px solid #ccc;color:#666;font-size:.8em}.media-plugin .devices .dropdown .item:hover{background:#def6ea}.media-plugin .results{position:relative;overflow:auto;height:-webkit-calc( 100% );height:-moz-calc( 100% );height:calc( 100% )}.media-plugin .results.resize{height:-webkit-calc( 100% - 16rem );height:-moz-calc( 100% - 16rem );height:calc( 100% - 16rem )}.media-plugin .results .active{height:4rem}.media-plugin .results .empty{height:100%;display:flex;align-items:center;justify-content:center;font-size:1.5em;letter-spacing:.1rem;color:#506050}.media-plugin .results .media-item{display:flex;align-items:center;cursor:pointer;border-radius:1rem;padding:.5rem}.media-plugin .results .media-item:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .results .media-item:nth-child(even){background:#f1f3f2}.media-plugin .results .media-item:hover{background:#def6ea}.media-plugin .results .media-item.selected{background:#c8ffd0}.media-plugin .controls{width:100%;border-top:1px solid #ddd;box-shadow:0 -2.5px 4px 0 silver;flex:0 0 10rem}.media-plugin .controls .item-container{padding-left:1rem;line-height:2.6rem}.media-plugin .controls .item-container .item-info{font-size:1.15em;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.media-plugin .controls .item-container .item-info:hover{color:#35b870}.media-plugin .controls button:hover .fa{color:#59df3e}.media-plugin .controls .playback-controls .row{justify-content:center}.media-plugin .controls .playback-controls .position{margin-top:.75em}.media-plugin .controls .playback-controls button{padding:0 1.5rem}.media-plugin .controls .playback-controls button .fa-play,.media-plugin .controls .playback-controls button .fa-pause{color:#59df3e;font-size:30px;margin-top:.3rem}.media-plugin .controls .playback-controls button .fa-play:hover,.media-plugin .controls .playback-controls button .fa-pause:hover{color:#64ef4a}.media-plugin .controls .pull-right button:not(last-child){padding:0 .7rem}.media-plugin .controls .pull-right button:last-child{padding:0}.media-plugin .controls .pull-right .volume-container button{padding:0 .3rem 0 0;background:none}.media-plugin .controls .seek-slider{width:75%}.media-plugin .controls .volume-slider{width:75%;margin-right:1rem}.media-plugin .controls .elapsed-time,.media-plugin .controls .total-time{font-size:.7em;color:.7em}.media-plugin .controls .elapsed-time{margin-right:1.5rem}.media-plugin .controls .total-time{margin-left:1.5rem}.media-plugin #media-info .modal{max-width:90%}.media-plugin .info-container .row{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd}.media-plugin .info-container .row:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .info-container .row:nth-child(even){background:#f1f3f2}.media-plugin .info-container .row:hover{background:#def6ea;border-radius:1em}.media-plugin .info-container .row .attr{font-size:1.1em}.media-plugin .info-container .row .value{text-align:right}.media-plugin #media-subs .body{padding:0}.media-plugin .subs-container .loading,.media-plugin .subs-container .no-results{display:flex;align-items:center;padding:3rem;font-size:1.5em}.media-plugin .subs-container .subs .list{max-height:50vh;overflow:auto}.media-plugin .subs-container .subs .sub{display:flex;align-items:center;padding:.75em .5em;border-bottom:1px solid #ddd;cursor:pointer}.media-plugin .subs-container .subs .sub:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin .subs-container .subs .sub:nth-child(even){background:#f1f3f2}.media-plugin .subs-container .subs .sub.selected{background:#c8ffd0}.media-plugin .subs-container .subs .sub:hover{background:#def6ea;border-radius:1em}.media-plugin .subs-container .subs .controls{position:relative;padding:1.5rem 0;height:4rem}.media-plugin .subs-container .subs .controls button{position:absolute;right:0;margin-right:1rem;border:1px solid #ddd;box-shadow:2px 2px 2px #ddd}.media-plugin .subs-container .subs .controls button:hover:not([disabled]){box-shadow:3px 3px 3px #ddd;color:#35b870}.media-plugin #media-torrents .modal{width:90%}.media-plugin #media-torrents .modal .body{padding:0;text-align:center}.media-plugin #media-torrents .modal .body .search input[type=text]{width:88%;max-width:none}.media-plugin #media-torrents .modal .body .search input[type=submit]{width:8%}.media-plugin #media-torrents .modal .body .head{font-weight:bold;padding:.5rem 0 2.5rem 0;background:#e8e8e8;border-bottom:1px solid #ccc}.media-plugin #media-torrents .modal .body .transfers-container{margin:0;width:100%}.media-plugin #media-torrents .modal .body .transfer{display:flex;padding:1.5rem;cursor:pointer}.media-plugin #media-torrents .modal .body .transfer:nth-child(odd){background:rgba(255,255,255,0)}.media-plugin #media-torrents .modal .body .transfer:nth-child(even){background:#f1f3f2}.media-plugin #media-torrents .modal .body .transfer.selected{background:#c8ffd0}.media-plugin #media-torrents .modal .body .transfer:hover{background:#def6ea;border-radius:.5rem}.media-plugin{display:flex;flex-direction:column;height:inherit;letter-spacing:.03rem}.media-plugin .dropdown{z-index:2}.media-plugin .dropdown .item{display:flex;align-items:center}.media-plugin .dropdown .item .text{margin-left:1rem}.media-plugin .dropdown .item:hover{background:#def6ea}.media-plugin input[type=text]{width:100%}.media-plugin input[type=text]:hover{border-color:#35b870}.media-plugin button{border:0}.media-plugin .icon{color:#444;margin-right:.5em}.media-plugin .top-buttons{text-align:right;float:right} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/music.mpd.css b/platypush/backend/http/static/css/dist/webpanel/plugins/music.mpd.css deleted file mode 100644 index 391aee82..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/music.mpd.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center,.music-mpd-container .controls,.music-mpd-container .controls .track-container,.music-mpd-container .controls .playback-controls .row{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.fade-in{--duration:.5s;animation-name:fadeIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.roll-in{--duration:.5s;animation-name:rollIn;animation-timing-function:ease-in;animation-duration:var(--duration);animation-fill-mode:both}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}.active-glow,.music-mpd-container .browser .item.active,.music-mpd-container .search .item.active,.music-mpd-container .playlist .item.active{-webkit-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;-o-animation:active-glow 5s infinite;-ms-animation:active-glow 5s infinite;animation:active-glow 5s infinite}@keyframes active-glow{0%{background:#d4ffe3}50%{background:#9cdfb0}100%{background:#d4ffe3}}.music-mpd-container{display:flex;flex-direction:column;line-height:3rem;letter-spacing:.03rem;height:inherit;overflow:hidden}.music-mpd-container .item{display:flex;align-items:center;cursor:pointer;border-radius:1rem;padding:.5rem}.music-mpd-container .item:nth-child(odd){background:rgba(255,255,255,0)}.music-mpd-container .item:nth-child(even){background:#f1f3f2}.music-mpd-container .item:hover{background:#def6ea !important}.music-mpd-container .item.selected{background:#c8ffd0 !important}.music-mpd-container .item .artist{font-size:.9em}.music-mpd-container .duration{color:#666;font-size:.7em}.music-mpd-container button{border:0}.music-mpd-container button:disabled{background:none}.music-mpd-container button.enabled{color:#59df3e !important}.music-mpd-container button.enabled .fa{color:#59df3e !important}.music-mpd-container button:hover .fa{opacity:.75}.music-mpd-container .spacer{height:5rem}.music-mpd-container .panels{display:flex;flex-direction:row;flex:0 1 auto;order:0;height:-webkit-calc( 100% - 10.1rem );height:-moz-calc( 100% - 10.1rem );height:calc( 100% - 10.1rem )}.music-mpd-container .panels .panel{height:100%}.music-mpd-container .browser{width:40%;min-width:20rem;max-width:35rem;background:rgba(248,250,250,0.95);font-size:.9em}.music-mpd-container .browser .item{background:none}.music-mpd-container .browser .fa{color:#666}.music-mpd-container .browser .browser-controls button,.music-mpd-container .browser .results-controls button,.music-mpd-container .browser .playlist-controls button,.music-mpd-container .search .browser-controls button,.music-mpd-container .search .results-controls button,.music-mpd-container .search .playlist-controls button,.music-mpd-container .playlist .browser-controls button,.music-mpd-container .playlist .results-controls button,.music-mpd-container .playlist .playlist-controls button,.music-mpd-container .playlist-add button,.music-mpd-container .editor button{border:0;padding:0 1.5rem}.music-mpd-container .browser .browser-controls button:disabled,.music-mpd-container .browser .results-controls button:disabled,.music-mpd-container .browser .playlist-controls button:disabled,.music-mpd-container .search .browser-controls button:disabled,.music-mpd-container .search .results-controls button:disabled,.music-mpd-container .search .playlist-controls button:disabled,.music-mpd-container .playlist .browser-controls button:disabled,.music-mpd-container .playlist .results-controls button:disabled,.music-mpd-container .playlist .playlist-controls button:disabled,.music-mpd-container .playlist-add button:disabled,.music-mpd-container .editor button:disabled{background:none}.music-mpd-container .browser .browser-controls button.enabled,.music-mpd-container .browser .results-controls button.enabled,.music-mpd-container .browser .playlist-controls button.enabled,.music-mpd-container .search .browser-controls button.enabled,.music-mpd-container .search .results-controls button.enabled,.music-mpd-container .search .playlist-controls button.enabled,.music-mpd-container .playlist .browser-controls button.enabled,.music-mpd-container .playlist .results-controls button.enabled,.music-mpd-container .playlist .playlist-controls button.enabled,.music-mpd-container .playlist-add button.enabled,.music-mpd-container .editor button.enabled{color:#59df3e}.music-mpd-container .browser .browser-controls button .fa-search,.music-mpd-container .browser .results-controls button .fa-search,.music-mpd-container .browser .playlist-controls button .fa-search,.music-mpd-container .search .browser-controls button .fa-search,.music-mpd-container .search .results-controls button .fa-search,.music-mpd-container .search .playlist-controls button .fa-search,.music-mpd-container .playlist .browser-controls button .fa-search,.music-mpd-container .playlist .results-controls button .fa-search,.music-mpd-container .playlist .playlist-controls button .fa-search,.music-mpd-container .playlist-add button .fa-search,.music-mpd-container .editor button .fa-search{color:#59df3e}.music-mpd-container .browser .item.move:hover,.music-mpd-container .search .item.move:hover,.music-mpd-container .playlist .item.move:hover,.music-mpd-container .playlist-add .editor-container .item.move:hover,.music-mpd-container .editor .editor-container .item.move:hover{background:rgba(216,156,136,0.3) !important;border-top:3px dotted #d89c88;border-bottom:3px dotted #d89c88;cursor:move}.music-mpd-container .browser .results,.music-mpd-container .search .results,.music-mpd-container .playlist .results{position:relative;height:-webkit-calc( 100% - 5.1rem );height:-moz-calc( 100% - 5.1rem );height:calc( 100% - 5.1rem );overflow:auto}.music-mpd-container .browser .browser-controls,.music-mpd-container .browser .results-controls,.music-mpd-container .browser .playlist-controls,.music-mpd-container .search .browser-controls,.music-mpd-container .search .results-controls,.music-mpd-container .search .playlist-controls,.music-mpd-container .playlist .browser-controls,.music-mpd-container .playlist .results-controls,.music-mpd-container .playlist .playlist-controls{width:100%;height:4rem;background:rgba(247,247,247,0.95);border-bottom:1px solid #ddd;padding:.5rem 0}.music-mpd-container .browser .browser-controls input[type=text],.music-mpd-container .browser .results-controls input[type=text],.music-mpd-container .browser .playlist-controls input[type=text],.music-mpd-container .search .browser-controls input[type=text],.music-mpd-container .search .results-controls input[type=text],.music-mpd-container .search .playlist-controls input[type=text],.music-mpd-container .playlist .browser-controls input[type=text],.music-mpd-container .playlist .results-controls input[type=text],.music-mpd-container .playlist .playlist-controls input[type=text]{width:100%}.music-mpd-container .browser .browser-controls button,.music-mpd-container .browser .results-controls button,.music-mpd-container .browser .playlist-controls button,.music-mpd-container .search .browser-controls button,.music-mpd-container .search .results-controls button,.music-mpd-container .search .playlist-controls button,.music-mpd-container .playlist .browser-controls button,.music-mpd-container .playlist .results-controls button,.music-mpd-container .playlist .playlist-controls button{padding:0 .75rem}.music-mpd-container .browser .empty,.music-mpd-container .search .empty,.music-mpd-container .playlist .empty{display:flex;align-items:center;justify-content:center;height:100%;font-size:5rem;color:rgba(200,200,200,0.7);text-shadow:2px 1px #ebebeb}.music-mpd-container .browser .item .empty,.music-mpd-container .search .item .empty,.music-mpd-container .playlist .item .empty{font-size:1em;display:block;height:auto}.music-mpd-container .browser .item.active,.music-mpd-container .search .item.active,.music-mpd-container .playlist .item.active{height:4rem}.music-mpd-container .playlist{width:100%}.music-mpd-container .playlist-add .editor-controls,.music-mpd-container .playlist-add .playlist-add-controls,.music-mpd-container .editor .editor-controls,.music-mpd-container .editor .playlist-add-controls{background:rgba(247,247,247,0.95);border-bottom:1px solid #ddd;border-radius:0;box-shadow:0 2.5px 4px 0 #bbb;margin:-2.5rem -2rem 0 -2rem;padding:.5rem}.music-mpd-container .playlist-add input[type=text],.music-mpd-container .editor input[type=text]{width:100%}.music-mpd-container .playlist-add button,.music-mpd-container .editor button{padding:0 .75rem}.music-mpd-container .playlist-add .editor-container,.music-mpd-container .playlist-add .playlists-container,.music-mpd-container .editor .editor-container,.music-mpd-container .editor .playlists-container{overflow:auto;margin:0 -2rem;padding:1rem}.music-mpd-container .playlist-add .playlists-container,.music-mpd-container .editor .playlists-container{max-height:70vh}.music-mpd-container .playlist-add .editor-container,.music-mpd-container .editor .editor-container{max-height:65vh}.music-mpd-container .controls{width:100%;border-top:1px solid #ddd;background:rgba(245,245,245,0.95);box-shadow:0 -2.5px 4px 0 silver;z-index:2;order:1;flex:0 0 10rem}.music-mpd-container .controls .track-container{padding-left:1rem;line-height:2.6rem}.music-mpd-container .controls .track-container a{color:initial;text-decoration:none}.music-mpd-container .controls .track-container a:hover{color:#2ebe6e}.music-mpd-container .controls .track-container .track-info .artist{font-weight:bold}.music-mpd-container .controls button:hover .fa{color:#59df3e}.music-mpd-container .controls .playback-controls .row{justify-content:center}.music-mpd-container .controls .playback-controls button{padding:0 1.5rem}.music-mpd-container .controls .playback-controls button .fa-play,.music-mpd-container .controls .playback-controls button .fa-pause{color:#59df3e;font-size:30px;margin-top:.3rem}.music-mpd-container .controls .playback-controls button .fa-play:hover,.music-mpd-container .controls .playback-controls button .fa-pause:hover{color:#64ef4a}.music-mpd-container .controls .pull-right{padding-right:2.5rem}.music-mpd-container .controls .pull-right button:not(last-child){padding:0 .7rem}.music-mpd-container .controls .pull-right button:last-child{padding:0}.music-mpd-container .controls .pull-right .volume-container button{padding:0 .3rem 0 0;background:none}.music-mpd-container .controls .seek-slider{width:75%}.music-mpd-container .controls .volume-slider{width:75%;margin-right:1rem}.music-mpd-container .controls .elapsed-time,.music-mpd-container .controls .total-time{font-size:.7em;color:.7em}.music-mpd-container .controls .elapsed-time{margin-right:1.5rem}.music-mpd-container .controls .total-time{margin-left:1.5rem}.music-mpd-container .search{--width:90vw;padding:0}.music-mpd-container .search form{margin-bottom:0;padding:2.7rem}.music-mpd-container .search form .row{padding:.5rem}.music-mpd-container .search form .footer{padding-top:1.5rem;margin:2.5rem 0;border-top:1px solid #ccc}.music-mpd-container .search form .footer .left{display:flex;justify-content:left}.music-mpd-container .search form button,.music-mpd-container .search form input[type=submit]{border-radius:5rem}.music-mpd-container .search .results-controls{padding:0;border-bottom:1px solid #ddd;width:var(--width);height:4.5rem;display:flex;align-items:center;z-index:502}.music-mpd-container .search form,.music-mpd-container .search .results{position:relative}.music-mpd-container .search .results{height:-webkit-calc( 100% - 4.7rem );height:-moz-calc( 100% - 4.7rem );height:calc( 100% - 4.7rem )}.music-mpd-container .dropdown{width:20rem}.music-mpd-container .filter-container{position:relative}#music-mpd-info .modal .body .row{margin:.5rem;padding:.5rem;border-bottom:1px solid #ddd}#music-mpd-info .modal .body .row:hover{border-radius:1rem;background:#def6ea}#music-mpd-info .modal .body .row .attr{color:#777}#music-mpd-info .modal .body .row .value{text-align:right}#music-mpd-search-modal .dropdown,#music-mpd-playlist-edit .dropdown{z-index:503}#music-mpd-search-modal .header{height:3.8rem}#music-mpd-search-modal .body{display:flex;padding:0}#music-mpd-playlist-add .modal{min-width:50rem}#music-mpd-playlist-edit .modal{min-width:80rem}@media (max-width: 720px){#music-mpd-info .modal{width:80vw}}@media (max-width: 1024px) and (min-width: 720px){#music-mpd-info .modal{width:70vw}}@media (min-width: 1024px){#music-mpd-info .modal{width:45vw}} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/music.snapcast.css b/platypush/backend/http/static/css/dist/webpanel/plugins/music.snapcast.css deleted file mode 100644 index e3de780b..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/music.snapcast.css +++ /dev/null @@ -1 +0,0 @@ -.col-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-1:first-child{margin-left:0}.col-no-margin-1{float:left;box-sizing:border-box;width:8.33333%;margin:0}.col-offset-1:first-child{margin-left:8.66667% !important}.col-offset-1:not(first-child){margin-left:12.66667% !important}.col-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-2:first-child{margin-left:0}.col-no-margin-2{float:left;box-sizing:border-box;width:16.66667%;margin:0}.col-offset-2:first-child{margin-left:17.33333% !important}.col-offset-2:not(first-child){margin-left:21.33333% !important}.col-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3:first-child{margin-left:0}.col-no-margin-3{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3:first-child{margin-left:26% !important}.col-offset-3:not(first-child){margin-left:30% !important}.col-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-4:first-child{margin-left:0}.col-no-margin-4{float:left;box-sizing:border-box;width:33.33333%;margin:0}.col-offset-4:first-child{margin-left:34.66667% !important}.col-offset-4:not(first-child){margin-left:38.66667% !important}.col-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-5:first-child{margin-left:0}.col-no-margin-5{float:left;box-sizing:border-box;width:41.66667%;margin:0}.col-offset-5:first-child{margin-left:43.33333% !important}.col-offset-5:not(first-child){margin-left:47.33333% !important}.col-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6:first-child{margin-left:0}.col-no-margin-6{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6:first-child{margin-left:52% !important}.col-offset-6:not(first-child){margin-left:56% !important}.col-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-7:first-child{margin-left:0}.col-no-margin-7{float:left;box-sizing:border-box;width:58.33333%;margin:0}.col-offset-7:first-child{margin-left:60.66667% !important}.col-offset-7:not(first-child){margin-left:64.66667% !important}.col-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-8:first-child{margin-left:0}.col-no-margin-8{float:left;box-sizing:border-box;width:66.66667%;margin:0}.col-offset-8:first-child{margin-left:69.33333% !important}.col-offset-8:not(first-child){margin-left:73.33333% !important}.col-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9:first-child{margin-left:0}.col-no-margin-9{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9:first-child{margin-left:78% !important}.col-offset-9:not(first-child){margin-left:82% !important}.col-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-10:first-child{margin-left:0}.col-no-margin-10{float:left;box-sizing:border-box;width:83.33333%;margin:0}.col-offset-10:first-child{margin-left:86.66667% !important}.col-offset-10:not(first-child){margin-left:90.66667% !important}.col-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-11:first-child{margin-left:0}.col-no-margin-11{float:left;box-sizing:border-box;width:91.66667%;margin:0}.col-offset-11:first-child{margin-left:95.33333% !important}.col-offset-11:not(first-child){margin-left:99.33333% !important}.col-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12:first-child{margin-left:0}.col-no-margin-12{float:left;box-sizing:border-box;width:100%;margin:0}@media (max-width: 720px){.col-s-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-s-1:first-child{margin-left:0}.col-offset-s-1{margin-left:8.66667%}.col-no-margin-s-1{float:left;box-sizing:border-box;width:8.33333%}.col-s-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-s-2:first-child{margin-left:0}.col-offset-s-2{margin-left:17.33333%}.col-no-margin-s-2{float:left;box-sizing:border-box;width:16.66667%}.col-s-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3:first-child{margin-left:0}.col-offset-s-3{margin-left:26%}.col-no-margin-s-3{float:left;box-sizing:border-box;width:25%}.col-s-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-s-4:first-child{margin-left:0}.col-offset-s-4{margin-left:34.66667%}.col-no-margin-s-4{float:left;box-sizing:border-box;width:33.33333%}.col-s-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-s-5:first-child{margin-left:0}.col-offset-s-5{margin-left:43.33333%}.col-no-margin-s-5{float:left;box-sizing:border-box;width:41.66667%}.col-s-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6:first-child{margin-left:0}.col-offset-s-6{margin-left:52%}.col-no-margin-s-6{float:left;box-sizing:border-box;width:50%}.col-s-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-s-7:first-child{margin-left:0}.col-offset-s-7{margin-left:60.66667%}.col-no-margin-s-7{float:left;box-sizing:border-box;width:58.33333%}.col-s-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-s-8:first-child{margin-left:0}.col-offset-s-8{margin-left:69.33333%}.col-no-margin-s-8{float:left;box-sizing:border-box;width:66.66667%}.col-s-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9:first-child{margin-left:0}.col-offset-s-9{margin-left:78%}.col-no-margin-s-9{float:left;box-sizing:border-box;width:75%}.col-s-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-s-10:first-child{margin-left:0}.col-offset-s-10{margin-left:86.66667%}.col-no-margin-s-10{float:left;box-sizing:border-box;width:83.33333%}.col-s-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-s-11:first-child{margin-left:0}.col-offset-s-11{margin-left:95.33333%}.col-no-margin-s-11{float:left;box-sizing:border-box;width:91.66667%}.col-s-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12:first-child{margin-left:0}.col-no-margin-s-12{float:left;box-sizing:border-box;width:100%}.s-hidden{display:none !important}.s-visible{display:block !important}}@media (max-width: 1024px) and (min-width: 720px){.col-m-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-m-1:first-child{margin-left:0}.col-offset-m-1{margin-left:8.66667%}.col-no-margin-m-1{float:left;box-sizing:border-box;width:8.33333%}.col-m-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-m-2:first-child{margin-left:0}.col-offset-m-2{margin-left:17.33333%}.col-no-margin-m-2{float:left;box-sizing:border-box;width:16.66667%}.col-m-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3:first-child{margin-left:0}.col-offset-m-3{margin-left:26%}.col-no-margin-m-3{float:left;box-sizing:border-box;width:25%}.col-m-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-m-4:first-child{margin-left:0}.col-offset-m-4{margin-left:34.66667%}.col-no-margin-m-4{float:left;box-sizing:border-box;width:33.33333%}.col-m-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-m-5:first-child{margin-left:0}.col-offset-m-5{margin-left:43.33333%}.col-no-margin-m-5{float:left;box-sizing:border-box;width:41.66667%}.col-m-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6:first-child{margin-left:0}.col-offset-m-6{margin-left:52%}.col-no-margin-m-6{float:left;box-sizing:border-box;width:50%}.col-m-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-m-7:first-child{margin-left:0}.col-offset-m-7{margin-left:60.66667%}.col-no-margin-m-7{float:left;box-sizing:border-box;width:58.33333%}.col-m-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-m-8:first-child{margin-left:0}.col-offset-m-8{margin-left:69.33333%}.col-no-margin-m-8{float:left;box-sizing:border-box;width:66.66667%}.col-m-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9:first-child{margin-left:0}.col-offset-m-9{margin-left:78%}.col-no-margin-m-9{float:left;box-sizing:border-box;width:75%}.col-m-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-m-10:first-child{margin-left:0}.col-offset-m-10{margin-left:86.66667%}.col-no-margin-m-10{float:left;box-sizing:border-box;width:83.33333%}.col-m-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-m-11:first-child{margin-left:0}.col-offset-m-11{margin-left:95.33333%}.col-no-margin-m-11{float:left;box-sizing:border-box;width:91.66667%}.col-m-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12:first-child{margin-left:0}.col-no-margin-m-12{float:left;box-sizing:border-box;width:100%}.m-hidden{display:none !important}.m-visible{display:block !important}}@media (min-width: 1024px){.col-l-1{float:left;box-sizing:border-box;width:4.66667%;margin-left:4%}.col-l-1:first-child{margin-left:0}.col-offset-l-1{margin-left:8.66667%}.col-no-margin-l-1{float:left;box-sizing:border-box;width:8.33333%}.col-l-2{float:left;box-sizing:border-box;width:13.33333%;margin-left:4%}.col-l-2:first-child{margin-left:0}.col-offset-l-2{margin-left:17.33333%}.col-no-margin-l-2{float:left;box-sizing:border-box;width:16.66667%}.col-l-3{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3:first-child{margin-left:0}.col-offset-l-3{margin-left:26%}.col-no-margin-l-3{float:left;box-sizing:border-box;width:25%}.col-l-4{float:left;box-sizing:border-box;width:30.66667%;margin-left:4%}.col-l-4:first-child{margin-left:0}.col-offset-l-4{margin-left:34.66667%}.col-no-margin-l-4{float:left;box-sizing:border-box;width:33.33333%}.col-l-5{float:left;box-sizing:border-box;width:39.33333%;margin-left:4%}.col-l-5:first-child{margin-left:0}.col-offset-l-5{margin-left:43.33333%}.col-no-margin-l-5{float:left;box-sizing:border-box;width:41.66667%}.col-l-6{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6:first-child{margin-left:0}.col-offset-l-6{margin-left:52%}.col-no-margin-l-6{float:left;box-sizing:border-box;width:50%}.col-l-7{float:left;box-sizing:border-box;width:56.66667%;margin-left:4%}.col-l-7:first-child{margin-left:0}.col-offset-l-7{margin-left:60.66667%}.col-no-margin-l-7{float:left;box-sizing:border-box;width:58.33333%}.col-l-8{float:left;box-sizing:border-box;width:65.33333%;margin-left:4%}.col-l-8:first-child{margin-left:0}.col-offset-l-8{margin-left:69.33333%}.col-no-margin-l-8{float:left;box-sizing:border-box;width:66.66667%}.col-l-9{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9:first-child{margin-left:0}.col-offset-l-9{margin-left:78%}.col-no-margin-l-9{float:left;box-sizing:border-box;width:75%}.col-l-10{float:left;box-sizing:border-box;width:82.66667%;margin-left:4%}.col-l-10:first-child{margin-left:0}.col-offset-l-10{margin-left:86.66667%}.col-no-margin-l-10{float:left;box-sizing:border-box;width:83.33333%}.col-l-11{float:left;box-sizing:border-box;width:91.33333%;margin-left:4%}.col-l-11:first-child{margin-left:0}.col-offset-l-11{margin-left:95.33333%}.col-no-margin-l-11{float:left;box-sizing:border-box;width:91.66667%}.col-l-12{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12:first-child{margin-left:0}.col-no-margin-l-12{float:left;box-sizing:border-box;width:100%}.l-hidden{display:none !important}.l-visible{display:block !important}}@media (min-width: 720px) and (orientation:portrait){body{font-size:25px}}.vertical-center{display:flex;align-items:center}.horizontal-center{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.music-snapcast-container .host{width:95%;margin:2rem auto;border:1px solid #ddd;border-radius:1rem;box-shadow:2px 2px 2px #ccc}.music-snapcast-container .host .head{padding:1rem .5rem;background:#edf0ee;border-bottom:1px solid #ddd;border-radius:1rem 1rem 0 0;display:flex;align-items:center}.music-snapcast-container .host .head .name{padding-left:.5rem;text-transform:uppercase}.music-snapcast-container .host .head .name:hover{color:#35b870;cursor:pointer}.music-snapcast-container .host .head button{padding:0;border:0}.music-snapcast-container .host .head button:hover{color:#35b870}.music-snapcast-container .host .group .head{background:#f8f8f8;border-radius:0}.music-snapcast-container .host .group .head,.music-snapcast-container .host .group .client{padding:0 1rem}.music-snapcast-container .host .group .client{display:flex;align-items:center}.music-snapcast-container .host .group .client.offline{color:#888}.music-snapcast-container .host .group .client:hover{background:#def6ea}.music-snapcast-container .host .group .client .name:hover{color:#35b870;cursor:pointer}.music-snapcast-container .host .icon{margin-right:1rem}.music-snapcast-container .modal .info{padding:2rem}.music-snapcast-container .modal .info .section{border:1px solid #ddd;border-radius:1rem}.music-snapcast-container .modal .info .section:not(last-child){margin-bottom:2rem}.music-snapcast-container .modal .info .section .title{border-bottom:1px solid #ddd;padding:1rem;text-transform:uppercase}.music-snapcast-container .modal .info .section.clients .row{padding:.5rem}.music-snapcast-container .modal .info .section.clients .row label{margin:0 0 0 .5rem}.music-snapcast-container .modal .info .row{padding:.33rem .5rem;border-radius:.75rem;display:flex;align-items:center}.music-snapcast-container .modal .info .row:nth-child(odd){background:rgba(255,255,255,0)}.music-snapcast-container .modal .info .row:nth-child(even){background:#f1f3f2}.music-snapcast-container .modal .info .row:hover{background:#def6ea}.music-snapcast-container .modal .info .row .label{font-weight:bold}.music-snapcast-container .modal .info .row .value{text-align:right}#music-snapcast-client-info .info .buttons{background:initial;margin-top:1.5rem;padding-top:1.5rem;border-top:1px solid #ddd;display:flex;justify-content:center}#music-snapcast-client-info .info .buttons button{color:#900;border-color:#900}@media (max-width: 720px){.music-snapcast-container .modal{width:80vw}}@media (max-width: 1024px) and (min-width: 720px){.music-snapcast-container .modal{width:70vw}}@media (min-width: 1024px){.music-snapcast-container .modal{width:45vw}} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/sensors.css b/platypush/backend/http/static/css/dist/webpanel/plugins/sensors.css deleted file mode 100644 index 76aa6b6d..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/sensors.css +++ /dev/null @@ -1 +0,0 @@ -.sensors .head{text-align:right}.sensors .head button{border:0}.sensors .head button:hover{background:#def6ea}.sensors .body{display:flex;flex-direction:column;margin:2rem auto;width:80%}.sensors .body .metric{margin-bottom:.75rem;padding:2rem;border:1px solid #ccc;border-radius:2rem}.sensors .body .metric:nth-child(odd){background:rgba(255,255,255,0)}.sensors .body .metric:nth-child(even){background:#f1f3f2}.sensors .body .metric:hover{background:#def6ea}.sensors .body .metric .value{text-align:right;font-weight:bold} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/sound.css b/platypush/backend/http/static/css/dist/webpanel/plugins/sound.css deleted file mode 100644 index 0118afd0..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/sound.css +++ /dev/null @@ -1 +0,0 @@ -.sound{height:90%;margin-top:7%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.sound .sound-container{margin-bottom:1em} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/stt.deepspeech.css b/platypush/backend/http/static/css/dist/webpanel/plugins/stt.deepspeech.css deleted file mode 100644 index 462e73c8..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/stt.deepspeech.css +++ /dev/null @@ -1 +0,0 @@ -#assistant-google-modal .modal{width:50vw;height:50vh}#assistant-google-modal .modal .body{width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center}#assistant-google-modal .modal .body .icon{font-size:3em;color:#7e8;box-shadow:2px 2px 2px #ccc;border:1px solid #ccc;border-radius:3em;padding:.7em 1em .5em 1em}#assistant-google-modal .modal .body .text{margin-top:2.5em} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/switches.css b/platypush/backend/http/static/css/dist/webpanel/plugins/switches.css deleted file mode 100644 index f666f224..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/switches.css +++ /dev/null @@ -1 +0,0 @@ -.switches-root .switch-root .head{padding:1rem .5rem;background:#e8e8e8;border-top:1px solid #ddd;border-bottom:1px solid #ddd;text-transform:uppercase}.switches-root .switch-root .switches{display:flex;flex-direction:column;padding:1rem}.switches-root .switch-root .device{display:flex;align-items:center}.switches-root .switch-root .device .toggle{text-align:right}.switches-root .switch-root .device:hover{background:#def6ea}.switches-root .switch-root .device:not(:last-child){border-bottom:1px solid #ddd} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/tts.css b/platypush/backend/http/static/css/dist/webpanel/plugins/tts.css deleted file mode 100644 index 3243e848..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/tts.css +++ /dev/null @@ -1 +0,0 @@ -.tts-container{max-width:80rem;min-height:10rem;margin:3rem auto;display:flex;align-items:center;justify-content:center;border:1px solid #ddd;border-radius:3rem}.tts-container form{margin:0;width:90%}.tts-container form input[type=text]{width:100%}.tts-container form button{border-radius:5rem}.tts-container form input:hover,.tts-container form button:hover{border-color:#35b870} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/tts.google.css b/platypush/backend/http/static/css/dist/webpanel/plugins/tts.google.css deleted file mode 100644 index 3243e848..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/tts.google.css +++ /dev/null @@ -1 +0,0 @@ -.tts-container{max-width:80rem;min-height:10rem;margin:3rem auto;display:flex;align-items:center;justify-content:center;border:1px solid #ddd;border-radius:3rem}.tts-container form{margin:0;width:90%}.tts-container form input[type=text]{width:100%}.tts-container form button{border-radius:5rem}.tts-container form input:hover,.tts-container form button:hover{border-color:#35b870} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/tv.samsung.ws.css b/platypush/backend/http/static/css/dist/webpanel/plugins/tv.samsung.ws.css deleted file mode 100644 index 77857cff..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/tv.samsung.ws.css +++ /dev/null @@ -1 +0,0 @@ -.tv-samsung-ws-container{height:100%;display:flex;justify-content:center}.tv-samsung-ws-container .controls{max-width:500px;height:calc(100% - .15em);display:flex;align-items:center;justify-content:center;flex-direction:column;padding:0 1em;border:1px solid #ddd;border-radius:2em;box-shadow:0 2px 9px 2px #bbb}.tv-samsung-ws-container .controls .power{color:red}.tv-samsung-ws-container .controls button{margin:.5em 0}.tv-samsung-ws-container .rows{flex-direction:column}.tv-samsung-ws-container .rows * button{width:100%}.tv-samsung-ws-container .section{width:100%;display:flex;margin:0 0 1.5em 0;padding:0 0 1.5em 0;border-bottom:1px solid #ddd}.tv-samsung-ws-container .directions{flex-direction:column}.tv-samsung-ws-container .directions * button{width:5em;height:4em}.tv-samsung-ws-container .volume,.tv-samsung-ws-container .channel{text-align:center}.tv-samsung-ws-container .colors{text-align:center}.tv-samsung-ws-container .colors .color{width:3em;height:3em;padding:0;border-radius:2em}.tv-samsung-ws-container .colors .color.red{background:red}.tv-samsung-ws-container .colors .color.green{background:green}.tv-samsung-ws-container .colors .color.yellow{background:#ff0}.tv-samsung-ws-container .colors .color.blue{background:blue} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/zigbee.mqtt.css b/platypush/backend/http/static/css/dist/webpanel/plugins/zigbee.mqtt.css deleted file mode 100644 index 7a1dc317..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/zigbee.mqtt.css +++ /dev/null @@ -1 +0,0 @@ -.fa.fa-zigbee:before{content:' ';background:url('/static/img/icons/zigbee-logo.svg');background-size:1em 1em;width:1em;height:1em;display:inline-block}.zigbee-container{height:100%;padding:0 .5em;background:#f1f1f1;display:flex;flex-direction:column;align-items:center;overflow:auto}.zigbee-container .no-items{padding:2em;font-size:1.5em;color:#555;display:flex;align-items:center;justify-content:center}.zigbee-container .view-options{display:flex;width:100%;justify-content:space-between;padding:1em 0}.zigbee-container .view-options .view-selector{display:inline-flex}.zigbee-container .view-options .buttons{display:inline-flex}.zigbee-container .view-options select{width:100%;border-radius:1em}.zigbee-container .btn-default{border:0;padding:0 1em}.zigbee-container .btn-default:hover{border:1px solid #ddd;border-radius:1em}.zigbee-container .buttons{text-align:right}.zigbee-container .view{min-width:400pt;max-width:750pt;background:#fff;border:1px solid #d8d8d8;border-radius:1.5em;box-shadow:1px 2px 2px #ccc}.zigbee-container .item.selected{box-shadow:0 2px 4px 0 #bbb}.zigbee-container .item .name{padding:1em;cursor:pointer;text-transform:uppercase;letter-spacing:.06em}.zigbee-container .item .name.selected{border-radius:1.5em}.zigbee-container .item:hover{background:#def6ea}.zigbee-container .item:not(:last-child){border-bottom:1px solid #ddd}.zigbee-container .item:first-child{border-radius:1.5em 1.5em 0 0}.zigbee-container .item:last-child{border-radius:0 0 1.5em 1.5em}.zigbee-container .params{background:#fff;padding-bottom:1em}.zigbee-container .params .section{display:flex;flex-direction:column;padding:0 1em}.zigbee-container .params .section:not(:first-child){padding-top:1em}.zigbee-container .params .section .header{display:flex;align-items:center;font-weight:bold;border-bottom:1px solid #e8e8e8}.zigbee-container .params .row{display:flex;align-items:center;border-radius:1em;padding:.3em}.zigbee-container .params .row:nth-child(even){background:#ededed}.zigbee-container .params .row:nth-child(odd){background:#fff}.zigbee-container .params .row:hover{background:#def6ea}.zigbee-container .params .param-name{display:inline-flex;width:40%;margin-left:1%;vertical-align:top;letter-spacing:.04em}.zigbee-container .params .param-value{display:inline-block;width:58%;text-align:right}.zigbee-container .params .param-value .value-edit{display:flex;align-items:center}.zigbee-container .params .param-value .value-data{display:inline-block;font-weight:bold}.zigbee-container .params .param-value .slider-container{display:flex;align-items:center}.zigbee-container .params .param-value .unit{font-size:.8em;margin-left:1em;display:inline}.zigbee-container .params .param-value select{width:100%;border-radius:2em}.zigbee-container .params .param-value .numeric input.slider{text-align:left}.zigbee-container .params .param-value .numeric input[type=text]{text-align:right;width:100%}.zigbee-container .params .param-value .numeric .row{background:none}.zigbee-container .params .param-value .numeric .row:hover{background:none}.zigbee-container .params .param-value .numeric .value-min,.zigbee-container .params .param-value .numeric .value-max{width:50%;font-size:.85em;opacity:.75}.zigbee-container .params .param-value .numeric .value-min{text-align:left}.zigbee-container .params .param-value .numeric .value-max{text-align:right}.zigbee-container .btn-value-name-edit{padding:0}.zigbee-container .modal .section .header{background:none;padding:.5em 0}.zigbee-container .modal .section .body{padding:0}.zigbee-container .modal .network-info{min-width:600pt}.zigbee-container .error{color:#a00}.zigbee-container .device .actions .row,.zigbee-container .group .actions .row{cursor:pointer}.zigbee-container .device form,.zigbee-container .group form{margin-bottom:0}.zigbee-container .device .param-value input[type=text],.zigbee-container .group .param-value input[type=text]{text-align:right} diff --git a/platypush/backend/http/static/css/dist/webpanel/plugins/zwave.css b/platypush/backend/http/static/css/dist/webpanel/plugins/zwave.css deleted file mode 100644 index 1a6d41e2..00000000 --- a/platypush/backend/http/static/css/dist/webpanel/plugins/zwave.css +++ /dev/null @@ -1 +0,0 @@ -.fa.fa-zwave:before{content:' ';background:url('/static/img/icons/z-wave-logo.png');background-size:1em 1em;width:1em;height:1em;display:inline-block}.zwave-container{height:100%;padding:0 .5em;background:#f1f1f1;display:flex;flex-direction:column;align-items:center;overflow:auto}.zwave-container .no-items{padding:2em;font-size:1.5em;color:#555;display:flex;align-items:center;justify-content:center}.zwave-container .view-options{display:flex;width:100%;justify-content:space-between;padding:1em 0}.zwave-container .view-options .view-selector{display:inline-flex}.zwave-container .view-options .buttons{display:inline-flex}.zwave-container .view-options select{width:100%;border-radius:1em}.zwave-container .btn-default{border:0;padding:0 1em}.zwave-container .btn-default:hover{border:1px solid #ddd;border-radius:1em}.zwave-container .buttons{text-align:right}.zwave-container .view{min-width:400pt;max-width:750pt;background:#fff;border:1px solid #d8d8d8;border-radius:1.5em;box-shadow:1px 2px 2px #ccc}.zwave-container .item.selected{box-shadow:0 2px 4px 0 #bbb}.zwave-container .item .name{padding:1em;cursor:pointer;text-transform:uppercase;letter-spacing:.06em}.zwave-container .item .name.selected{border-radius:1.5em}.zwave-container .item:hover{background:#def6ea}.zwave-container .item:not(:last-child){border-bottom:1px solid #ddd}.zwave-container .item:first-child{border-radius:1.5em 1.5em 0 0}.zwave-container .item:last-child{border-radius:0 0 1.5em 1.5em}.zwave-container .params{background:#fff;padding-bottom:1em}.zwave-container .params .section{display:flex;flex-direction:column;padding:0 1em}.zwave-container .params .section:not(:first-child){padding-top:1em}.zwave-container .params .section .header{display:flex;align-items:center;font-weight:bold;border-bottom:1px solid #e8e8e8}.zwave-container .params .row{display:flex;align-items:center;border-radius:1em;padding:.3em}.zwave-container .params .row:nth-child(even){background:#ededed}.zwave-container .params .row:nth-child(odd){background:#fff}.zwave-container .params .row:hover{background:#def6ea}.zwave-container .params .param-name{display:inline-flex;width:40%;margin-left:1%;vertical-align:top;letter-spacing:.04em}.zwave-container .params .param-value{display:inline-block;width:58%;text-align:right}.zwave-container .params .param-value .value-edit{display:flex;align-items:center}.zwave-container .params .param-value .value-data{display:inline-block;font-weight:bold}.zwave-container .params .param-value .slider-container{display:flex;align-items:center}.zwave-container .params .param-value .unit{font-size:.8em;margin-left:1em;display:inline}.zwave-container .params .param-value select{width:100%;border-radius:2em}.zwave-container .params .param-value .numeric input.slider{text-align:left}.zwave-container .params .param-value .numeric input[type=text]{text-align:right;width:100%}.zwave-container .params .param-value .numeric .row{background:none}.zwave-container .params .param-value .numeric .row:hover{background:none}.zwave-container .params .param-value .numeric .value-min,.zwave-container .params .param-value .numeric .value-max{width:50%;font-size:.85em;opacity:.75}.zwave-container .params .param-value .numeric .value-min{text-align:left}.zwave-container .params .param-value .numeric .value-max{text-align:right}.zwave-container .btn-value-name-edit{padding:0}.zwave-container .modal .section .header{background:none;padding:.5em 0}.zwave-container .modal .section .body{padding:0}.zwave-container .modal .network-info{min-width:600pt}.zwave-container .error{color:#a00}.zwave-container .node .actions .row,.zwave-container .scene .actions .row{cursor:pointer}.zwave-container .node form,.zwave-container .scene form{margin-bottom:0} diff --git a/platypush/backend/http/static/css/normalize.css b/platypush/backend/http/static/css/normalize.css deleted file mode 100644 index 81c6f31e..00000000 --- a/platypush/backend/http/static/css/normalize.css +++ /dev/null @@ -1,427 +0,0 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} \ No newline at end of file diff --git a/platypush/backend/http/static/css/skeleton.css b/platypush/backend/http/static/css/skeleton.css deleted file mode 100644 index f28bf6c5..00000000 --- a/platypush/backend/http/static/css/skeleton.css +++ /dev/null @@ -1,418 +0,0 @@ -/* -* Skeleton V2.0.4 -* Copyright 2014, Dave Gamache -* www.getskeleton.com -* Free to use under the MIT license. -* http://www.opensource.org/licenses/mit-license.php -* 12/29/2014 -*/ - - -/* Table of contents -–––––––––––––––––––––––––––––––––––––––––––––––––– -- Grid -- Base Styles -- Typography -- Links -- Buttons -- Forms -- Lists -- Code -- Tables -- Spacing -- Utilities -- Clearing -- Media Queries -*/ - - -/* Grid -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.container { - position: relative; - width: 100%; - max-width: 960px; - margin: 0 auto; - padding: 0 20px; - box-sizing: border-box; } -.column, -.columns { - width: 100%; - float: left; - box-sizing: border-box; } - -/* For devices larger than 400px */ -@media (min-width: 400px) { - .container { - width: 85%; - padding: 0; } -} - -/* For devices larger than 550px */ -@media (min-width: 550px) { - .container { - width: 80%; } - .column, - .columns { - margin-left: 4%; } - .column:first-child, - .columns:first-child { - margin-left: 0; } - - .one.column, - .one.columns { width: 4.66666666667%; } - .two.columns { width: 13.3333333333%; } - .three.columns { width: 22%; } - .four.columns { width: 30.6666666667%; } - .five.columns { width: 39.3333333333%; } - .six.columns { width: 48%; } - .seven.columns { width: 56.6666666667%; } - .eight.columns { width: 65.3333333333%; } - .nine.columns { width: 74.0%; } - .ten.columns { width: 82.6666666667%; } - .eleven.columns { width: 91.3333333333%; } - .twelve.columns { width: 100%; margin-left: 0; } - - .one-third.column { width: 30.6666666667%; } - .two-thirds.column { width: 65.3333333333%; } - - .one-half.column { width: 48%; } - - /* Offsets */ - .offset-by-one.column, - .offset-by-one.columns { margin-left: 8.66666666667%; } - .offset-by-two.column, - .offset-by-two.columns { margin-left: 17.3333333333%; } - .offset-by-three.column, - .offset-by-three.columns { margin-left: 26%; } - .offset-by-four.column, - .offset-by-four.columns { margin-left: 34.6666666667%; } - .offset-by-five.column, - .offset-by-five.columns { margin-left: 43.3333333333%; } - .offset-by-six.column, - .offset-by-six.columns { margin-left: 52%; } - .offset-by-seven.column, - .offset-by-seven.columns { margin-left: 60.6666666667%; } - .offset-by-eight.column, - .offset-by-eight.columns { margin-left: 69.3333333333%; } - .offset-by-nine.column, - .offset-by-nine.columns { margin-left: 78.0%; } - .offset-by-ten.column, - .offset-by-ten.columns { margin-left: 86.6666666667%; } - .offset-by-eleven.column, - .offset-by-eleven.columns { margin-left: 95.3333333333%; } - - .offset-by-one-third.column, - .offset-by-one-third.columns { margin-left: 34.6666666667%; } - .offset-by-two-thirds.column, - .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } - - .offset-by-one-half.column, - .offset-by-one-half.columns { margin-left: 52%; } - -} - - -/* Base Styles -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -/* NOTE -html is set to 62.5% so that all the REM measurements throughout Skeleton -are based on 10px sizing. So basically 1.5rem = 15px :) */ -html { - font-size: 62.5%; } -body { - font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ - line-height: 1.6; - font-weight: 400; - font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #222; } - - -/* Typography -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 2rem; - font-weight: 300; } -h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} -h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } -h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } -h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } -h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } -h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } - -/* Larger than phablet */ -@media (min-width: 550px) { - h1 { font-size: 5.0rem; } - h2 { font-size: 4.2rem; } - h3 { font-size: 3.6rem; } - h4 { font-size: 3.0rem; } - h5 { font-size: 2.4rem; } - h6 { font-size: 1.5rem; } -} - -p { - margin-top: 0; } - - -/* Links -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -a { - color: #1EAEDB; } -a:hover { - color: #0FA0CE; } - - -/* Buttons -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.button, -button, -input[type="submit"], -input[type="reset"], -input[type="button"] { - display: inline-block; - height: 38px; - padding: 0 30px; - color: #555; - text-align: center; - font-size: 11px; - font-weight: 600; - line-height: 38px; - letter-spacing: .1rem; - text-transform: uppercase; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border-radius: 4px; - border: 1px solid #bbb; - cursor: pointer; - box-sizing: border-box; } -.button:hover, -button:hover, -input[type="submit"]:hover, -input[type="reset"]:hover, -input[type="button"]:hover, -.button:focus, -button:focus, -input[type="submit"]:focus, -input[type="reset"]:focus, -input[type="button"]:focus { - color: #333; - border-color: #888; - outline: 0; } -.button.button-primary, -button.button-primary, -input[type="submit"].button-primary, -input[type="reset"].button-primary, -input[type="button"].button-primary { - color: #FFF; - background-color: #33C3F0; - border-color: #33C3F0; } -.button.button-primary:hover, -button.button-primary:hover, -input[type="submit"].button-primary:hover, -input[type="reset"].button-primary:hover, -input[type="button"].button-primary:hover, -.button.button-primary:focus, -button.button-primary:focus, -input[type="submit"].button-primary:focus, -input[type="reset"].button-primary:focus, -input[type="button"].button-primary:focus { - color: #FFF; - background-color: #1EAEDB; - border-color: #1EAEDB; } - - -/* Forms -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -input[type="email"], -input[type="number"], -input[type="search"], -input[type="text"], -input[type="tel"], -input[type="url"], -input[type="password"], -textarea, -select { - height: 38px; - padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ - background-color: #fff; - border: 1px solid #D1D1D1; - border-radius: 4px; - box-shadow: none; - box-sizing: border-box; } -/* Removes awkward default styles on some inputs for iOS */ -input[type="email"], -input[type="number"], -input[type="search"], -input[type="text"], -input[type="tel"], -input[type="url"], -input[type="password"], -textarea { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; } -textarea { - min-height: 65px; - padding-top: 6px; - padding-bottom: 6px; } -input[type="email"]:focus, -input[type="number"]:focus, -input[type="search"]:focus, -input[type="text"]:focus, -input[type="tel"]:focus, -input[type="url"]:focus, -input[type="password"]:focus, -textarea:focus, -select:focus { - border: 1px solid #33C3F0; - outline: 0; } -label, -legend { - display: block; - margin-bottom: .5rem; - font-weight: 600; } -fieldset { - padding: 0; - border-width: 0; } -input[type="checkbox"], -input[type="radio"] { - display: inline; } -label > .label-body { - display: inline-block; - margin-left: .5rem; - font-weight: normal; } - - -/* Lists -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -ul { - list-style: circle inside; } -ol { - list-style: decimal inside; } -ol, ul { - padding-left: 0; - margin-top: 0; } -ul ul, -ul ol, -ol ol, -ol ul { - margin: 1.5rem 0 1.5rem 3rem; - font-size: 90%; } -li { - margin-bottom: 1rem; } - - -/* Code -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -code { - padding: .2rem .5rem; - margin: 0 .2rem; - font-size: 90%; - white-space: nowrap; - background: #F1F1F1; - border: 1px solid #E1E1E1; - border-radius: 4px; } -pre > code { - display: block; - padding: 1rem 1.5rem; - white-space: pre; } - - -/* Tables -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -th, -td { - padding: 12px 15px; - text-align: left; - border-bottom: 1px solid #E1E1E1; } -th:first-child, -td:first-child { - padding-left: 0; } -th:last-child, -td:last-child { - padding-right: 0; } - - -/* Spacing -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -button, -.button { - margin-bottom: 1rem; } -input, -textarea, -select, -fieldset { - margin-bottom: 1.5rem; } -pre, -blockquote, -dl, -figure, -table, -p, -ul, -ol, -form { - margin-bottom: 2.5rem; } - - -/* Utilities -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -.u-full-width { - width: 100%; - box-sizing: border-box; } -.u-max-full-width { - max-width: 100%; - box-sizing: border-box; } -.u-pull-right { - float: right; } -.u-pull-left { - float: left; } - - -/* Misc -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -hr { - margin-top: 3rem; - margin-bottom: 3.5rem; - border-width: 0; - border-top: 1px solid #E1E1E1; } - - -/* Clearing -–––––––––––––––––––––––––––––––––––––––––––––––––– */ - -/* Self Clearing Goodness */ -.container:after, -.row:after, -.u-cf { - content: ""; - display: table; - clear: both; } - - -/* Media Queries -–––––––––––––––––––––––––––––––––––––––––––––––––– */ -/* -Note: The best way to structure the use of media queries is to create the queries -near the relevant code. For example, if you wanted to change the styles for buttons -on small devices, paste the mobile query code up in the buttons section and style it -there. -*/ - - -/* Larger than mobile */ -@media (min-width: 400px) {} - -/* Larger than phablet (also point when grid becomes active) */ -@media (min-width: 550px) {} - -/* Larger than tablet */ -@media (min-width: 750px) {} - -/* Larger than desktop */ -@media (min-width: 1000px) {} - -/* Larger than Desktop HD */ -@media (min-width: 1200px) {} diff --git a/platypush/backend/http/static/css/source/common/animations.scss b/platypush/backend/http/static/css/source/common/animations.scss deleted file mode 100644 index 98f0768a..00000000 --- a/platypush/backend/http/static/css/source/common/animations.scss +++ /dev/null @@ -1,46 +0,0 @@ -.fade-in { - --duration: $fade-in-transition-duration; - animation-name: fadeIn; - animation-timing-function: ease-in; - animation-duration: var(--duration); - animation-fill-mode:both; -} - -@keyframes fadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - -.roll-in { - --duration: $roll-in-transition-duration; - animation-name: rollIn; - animation-timing-function: ease-in; - animation-duration: var(--duration); - animation-fill-mode:both; -} - -@keyframes rollIn { - 0% { - opacity: 0; - transform:translateX(-100%); - } - 100% { - opacity: 1; - transform:translateX(0); - } -} - -.active-glow { - @include animation(active-glow 5s infinite); -} - -@keyframes active-glow { - 0% { background: $active-glow-bg-1; } - 50% { background: $active-glow-bg-2; } - 100% { background: $active-glow-bg-1; } -} - diff --git a/platypush/backend/http/static/css/source/common/elements.scss b/platypush/backend/http/static/css/source/common/elements.scss deleted file mode 100644 index d78c2be4..00000000 --- a/platypush/backend/http/static/css/source/common/elements.scss +++ /dev/null @@ -1,41 +0,0 @@ -//// General purpose classes and rules ///// -.hidden { - display: none !important; -} - -.selected { - background: $selected-bg; -} - -.pull-right { - text-align: right !important; -} - -.clickable { - cursor: pointer; -} - -a:focus { - outline: none; -} - -::-moz-focus-outer, -::-moz-focus-inner { - border: 0; -} - -select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #000; -} - -//// UI elements definitions ///// - -@import 'common/elements/button'; -@import 'common/elements/switch'; -@import 'common/elements/range-slider'; -@import 'common/elements/slider'; -@import 'common/elements/text'; -@import 'common/elements/dropdown'; -@import 'common/elements/autocomplete'; - diff --git a/platypush/backend/http/static/css/source/common/elements/autocomplete.scss b/platypush/backend/http/static/css/source/common/elements/autocomplete.scss deleted file mode 100644 index 63986743..00000000 --- a/platypush/backend/http/static/css/source/common/elements/autocomplete.scss +++ /dev/null @@ -1,33 +0,0 @@ -.autocomplete { - /*the container must be positioned relative:*/ - position: relative; - display: inline-block; -} - -.autocomplete-items { - position: absolute; - border: $default-border-2; - border-bottom: none; - border-top: none; - z-index: 99; - /*position the autocomplete items to be the same width as the container:*/ - top: 100%; - left: 0; - right: 0; -} - -.autocomplete-items div { - padding: 1em; - cursor: pointer; - border-bottom: $default-border-2; - background-color: $autocomplete-bg; -} - -.autocomplete-items div:hover { - background-color: $hover-bg; -} - -.autocomplete-active { - background-color: $selected-bg !important; -} - diff --git a/platypush/backend/http/static/css/source/common/elements/button.scss b/platypush/backend/http/static/css/source/common/elements/button.scss deleted file mode 100644 index 22014cfd..00000000 --- a/platypush/backend/http/static/css/source/common/elements/button.scss +++ /dev/null @@ -1,12 +0,0 @@ -button[disabled], -.button[disabled] { - color: #bbb; - background: rgba(240,240,240,1); - border: 1px solid; -} - -.btn-primary { - background-color: #d8ffe0 !important; - border: 1px solid #c2f0cf !important; -} - diff --git a/platypush/backend/http/static/css/source/common/elements/dropdown.scss b/platypush/backend/http/static/css/source/common/elements/dropdown.scss deleted file mode 100644 index 8301598c..00000000 --- a/platypush/backend/http/static/css/source/common/elements/dropdown.scss +++ /dev/null @@ -1,26 +0,0 @@ -@import 'common/vars'; - -.dropdown { - position: absolute; - background: $default-bg-3; - border-radius: .75rem; - border: $default-border-3; - box-shadow: $dropdown-shadow; - min-width: 15rem; - - .item { - margin: 0 !important; - padding: 1rem; - cursor: pointer; - - &.disabled { - color: $dropdown-disabled-color; - cursor: initial; - } - - .icon { - margin: 0 .75rem; - } - } -} - diff --git a/platypush/backend/http/static/css/source/common/elements/range-slider.scss b/platypush/backend/http/static/css/source/common/elements/range-slider.scss deleted file mode 100644 index d52bdda5..00000000 --- a/platypush/backend/http/static/css/source/common/elements/range-slider.scss +++ /dev/null @@ -1,59 +0,0 @@ -@supports (--css: variables) { - .input-range-container { - position: relative; - } - - input[type="range"].multirange { - padding: 0; - margin: 0; - display: inline-block; - vertical-align: top; - opacity: 1 !important; - - &.original { - position: absolute; - - &::-webkit-slider-thumb { - position: relative; - z-index: 2; - } - - &::-moz-range-thumb { - transform: scale(1); /* FF doesn't apply position it seems */ - z-index: 1; - } - } - - &::-moz-range-track { - border-color: transparent; /* needed to switch FF to "styleable" control */ - } - - &.ghost { - position: relative; - background: var(--track-background); - --track-background: linear-gradient(to right, - transparent var(--low), var(--range-color) 0, - var(--range-color) var(--high), transparent 0 - ) no-repeat 0 45% / 100% 40%; - --range-color: $slider-progress-bg; - - &::-webkit-slider-runnable-track, - &::-moz-range-track { - background: var(--track-background); - height: 15px; - } - } - - &[disabled]::-webkit-slider-thumb, - &[disabled]::-moz-range-thumb { - display: none; - } - - &::-webkit-progress-value, - &::-moz-range-progress { - @include appearance(none); - background: none; - } - } -} - diff --git a/platypush/backend/http/static/css/source/common/elements/slider.scss b/platypush/backend/http/static/css/source/common/elements/slider.scss deleted file mode 100644 index d19c640d..00000000 --- a/platypush/backend/http/static/css/source/common/elements/slider.scss +++ /dev/null @@ -1,62 +0,0 @@ -@import 'common/mixins'; - -.slider { - @include appearance(none); - @include transition(opacity .2s); - width: 100%; - height: 15px; - border-radius: 5px; - background: $slider-bg; - outline: none; - - // Cursed be thy name Chrome for forcing designers to this hysterical redundancy - &::-webkit-slider-thumb { - @include appearance(none); - width: 25px; - height: 25px; - border-radius: 50%; - border: 0; - background: $slider-thumb-bg; - cursor: pointer; - } - - &::-moz-range-thumb { - @include appearance(none); - width: 25px; - height: 25px; - border-radius: 50%; - border: 0; - background: $slider-thumb-bg; - cursor: pointer; - } - - &[disabled]::-webkit-slider-thumb { - display: none; - width: 0; - } - - &[disabled]::-moz-range-thumb { - display: none; - width: 0; - } - - &.disabled { opacity: 0.3; } - - &::-moz-range-track { - @include appearance(none); - } - - &::-moz-range-progress { - background: $slider-progress-bg; - height: 15px; - } - - &[disabled]::-webkit-progress-value { - background: none; - } - - &[disabled]::-moz-range-progress { - background: none; - } -} - diff --git a/platypush/backend/http/static/css/source/common/elements/switch.scss b/platypush/backend/http/static/css/source/common/elements/switch.scss deleted file mode 100644 index 6e871fdb..00000000 --- a/platypush/backend/http/static/css/source/common/elements/switch.scss +++ /dev/null @@ -1,109 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Francois+One); -@import url(https://fonts.googleapis.com/css?family=PT+Sans); - -@font-face { - font-family: 'Audiowide'; - font-style: normal; - font-weight: 400; - src: local("Audiowide"), local("Audiowide-Regular"), url(http://themes.googleusercontent.com/static/fonts/audiowide/v2/8XtYtNKEyyZh481XVWfVOj8E0i7KZn-EPnyo3HZu7kw.woff) format("woff"); -} - -.switch { - display: inline-block; - text-align: center; - user-select: none; - padding: .5rem 0; - - input[type=checkbox] { - display: none !important; - } - - label, label:before, label:after, - input[type=checkbox], input[type=checkbox]:before, input[type=checkbox]:after, - .feature, .feature:before, .feature:after { - transition: all 250ms ease-in; - } - - label:before, label:after, - input[type=checkbox]:before, input[type=checkbox]:after, - .feature:before, .feature:after { - content: ''; - display: block; - } - - label { - position: relative; - width: 50px; - height: 50px; - background-color: $switch-bg-1; - border-radius: 50%; - box-shadow: $switch-shadow-1; - display: block; - margin: .5rem auto 0 auto; - font-size: 1.4em; - transition: all 350ms ease-in; - - &:before { - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - width: 22.7272727273px; - height: 22.7272727273px; - border-radius: 50%; - background-color: $switch-bg-2; - box-shadow: $switch-shadow-2; - } - - &:after { - position: absolute; - left: 50%; - top: 35%; - transform: translate(-50%, -50%); - width: 4px; - height: 12px; - background-color: $switch-bg-3; - box-shadow: $switch-shadow-3; - } - - &:before, &:after { - transition-duration: 150ms; - } - - &:hover { - cursor: pointer; - &:before { box-shadow: $switch-shadow-hover; } - &:after { background-color: $switch-bg-hover; } - } - } - - input[type=checkbox]:checked + label { - box-shadow: $switch-shadow-checked-1; - &:before { box-shadow: $switch-shadow-checked-2; } - &:after { background-color: $switch-bg-checked; } - } - - &.glow { - label { - background-color: $switch-bg-glow-2; - box-shadow: $switch-shadow-glow-1; - - &:before { box-shadow: $switch-shadow-glow-2; } - &:after { - background-color: $switch-bg-glow-3; - } - - label:hover { - &:before { box-shadow: $switch-shadow-glow-hover; } - &:after { background-color: $switch-bg-glow-hover; } - } - } - - input[type=checkbox]:checked + label { - box-shadow: $switch-shadow-glow-checked-1; - &:before { box-shadow: $switch-shadow-glow-checked-2; } - &:after { background-color: $switch-bg-glow-checked; } - } - } -} - diff --git a/platypush/backend/http/static/css/source/common/elements/text.scss b/platypush/backend/http/static/css/source/common/elements/text.scss deleted file mode 100644 index f9639a87..00000000 --- a/platypush/backend/http/static/css/source/common/elements/text.scss +++ /dev/null @@ -1,26 +0,0 @@ -@import 'common/vars'; - -.input-icon { - position: absolute; - min-width: 3rem; - padding: 1rem; - color: $text-icon-color; -} - -input[type=text], -input[type=password] { - border-radius: 5rem; - - &:hover { - border: $border-hover; - } - - &:focus { - border: $border-focus; - } - - &.with-icon { - padding-left: 3rem; - } -} - diff --git a/platypush/backend/http/static/css/source/common/layout.scss b/platypush/backend/http/static/css/source/common/layout.scss deleted file mode 100644 index 17849d96..00000000 --- a/platypush/backend/http/static/css/source/common/layout.scss +++ /dev/null @@ -1,102 +0,0 @@ -$widths: ( - s: '(max-width: 720px)', - m: '(max-width: 1024px) and (min-width: 720px)', - l: '(min-width: 1024px)', -); - -@for $i from 1 through 12 { - .col-#{$i} { - float: left; - box-sizing: border-box; - - @if $i < 12 { - width: (4.66666666667%*$i) + (4% * if($i > 1, $i - 1, 0)); - margin-left: 4%; - } @else { - width: 100%; - margin-left: 0; - } - - &:first-child { - margin-left: 0; - } - } - - .col-no-margin-#{$i} { - float: left; - box-sizing: border-box; - width: ((100%/12)*$i); - margin: 0; - } - - @if $i < 12 { - .col-offset-#{$i}:first-child { - margin-left: (8.66666666667%*$i) !important; - } - .col-offset-#{$i}:not(first-child) { - margin-left: 4% + (8.66666666667%*$i) !important; - } - } -} - -@each $size, $width in $widths { - @media #{$width} { - @for $i from 1 through 12 { - .col-#{$size}-#{$i} { - float: left; - box-sizing: border-box; - - @if $i < 12 { - width: (4.66666666667%*$i) + (4% * if($i > 1, $i - 1, 0)); - margin-left: 4%; - } @else { - width: 100%; - margin-left: 0; - } - - &:first-child { - margin-left: 0; - } - } - - @if $i < 12 { - .col-offset-#{$size}-#{$i} { - margin-left: (8.66666666667%*$i); - } - } - - .col-no-margin-#{$size}-#{$i} { - float: left; - box-sizing: border-box; - width: ((100%/12)*$i); - } - } - - .#{$size}-hidden { - display: none !important; - } - - .#{$size}-visible { - display: block !important; - } - } -} - -@media (min-width: 720px) and (orientation:portrait) { - body { - font-size: $default-font-size-vertial; - } -} - -.vertical-center { - display: flex; - align-items: center; -} - -.horizontal-center { - display: flex; - justify-content: center; - margin-left: auto; - margin-right: auto; -} - diff --git a/platypush/backend/http/static/css/source/common/mixins.scss b/platypush/backend/http/static/css/source/common/mixins.scss deleted file mode 100644 index aa5f3757..00000000 --- a/platypush/backend/http/static/css/source/common/mixins.scss +++ /dev/null @@ -1,37 +0,0 @@ -@mixin appearance($value) { - -webkit-appearance: $value; - -ms-appearance: $value; - -o-appearance: $value; - -ms-appearance: $value; - appearance: $value; -} - -@mixin transition($value) { - -webkit-transition: $value; - -ms-transition: $value; - -o-transition: $value; - -ms-transition: $value; - transition: $value; -} - -@mixin animation($value) { - -webkit-animation: $value; - -ms-animation: $value; - -o-animation: $value; - -ms-animation: $value; - animation: $value; -} - -@mixin box-shadow($value) { - -webkit-box-shadow: $value; - -o-box-shadow: $value; - -ms-box-shadow: $value; - box-shadow: $value; -} - -@mixin calc($property, $expression) { - #{$property}: -webkit-calc( #{$expression} ); - #{$property}: -moz-calc( #{$expression} ); - #{$property}: calc( #{$expression} ); -} - diff --git a/platypush/backend/http/static/css/source/common/modal.scss b/platypush/backend/http/static/css/source/common/modal.scss deleted file mode 100644 index c6deaa36..00000000 --- a/platypush/backend/http/static/css/source/common/modal.scss +++ /dev/null @@ -1,49 +0,0 @@ -.modal-container { - position: fixed; - display: flex; - align-items: center; - justify-content: center; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: var(--z-index); - background: rgba(10,10,10,0.9); - - .modal { - --width: auto; - --height: auto; - width: var(--width); - height: var(--height); - - .header { - border-radius: 1rem 1rem 0 0; - } - - .body:first-child { - border-radius: 1rem; - } - - .body:not(first-child) { - border-radius: 0 0 1rem 1rem; - } - - .header { - border-bottom: $modal-header-border; - padding: .5rem; - text-align: center; - background: $modal-header-bg; - text-transform: uppercase; - letter-spacing: .1rem; - line-height: 3.8rem; - } - - .body { - max-height: 75vh; - overflow: auto; - padding: 2.5rem 2rem 1.5rem 2rem; - background: $modal-body-bg; - } - } -} - diff --git a/platypush/backend/http/static/css/source/common/notifications.scss b/platypush/backend/http/static/css/source/common/notifications.scss deleted file mode 100644 index fdb829d0..00000000 --- a/platypush/backend/http/static/css/source/common/notifications.scss +++ /dev/null @@ -1,73 +0,0 @@ -#notifications { - position: fixed; - bottom: 0; - right: 0; - width: 25em; - z-index: 1000; - - .notification { - background: $notification-bg; - border: $notification-border; - border-radius: .5rem; - margin-bottom: 1rem; - margin-right: 1rem; - cursor: pointer; - - &:hover { - background: $notification-hover-bg; - &.warning { background: $notification-warning-hover-bg; } - &.error { background: $notification-error-hover-bg; } - } - - &.warning { - background: $notification-warning-bg; - border: $notification-warning-border; - .image { --color: $notification-warning-icon-color; } - } - - &.error { - background: $notification-error-bg; - border: $notification-error-border; - .image { --color: $notification-error-icon-color; } - } - - .title { - padding: .4rem; - line-height: 3rem; - letter-spacing: .1rem; - font-weight: bold; - } - - .body { - @extend .vertical-center; - height: 6em; - overflow: hidden; - padding-bottom: 1rem; - letter-spacing: .05rem; - } - - .image { - height: 100%; - text-align: center; - --color: $notification-icon-color; - - .row { - @extend .vertical-center; - @extend .horizontal-center; - width: 100%; - height: 100%; - - .fa { - font-size: 2.5rem; - color: var(--color); - } - - img { - width: 80%; - height: 80%; - } - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/common/vars.scss b/platypush/backend/http/static/css/source/common/vars.scss deleted file mode 100644 index 3ff63302..00000000 --- a/platypush/backend/http/static/css/source/common/vars.scss +++ /dev/null @@ -1,113 +0,0 @@ -//// Common defaults -$default-bg: white !default; -$default-bg-2: #f4f5f6 !default; -$default-bg-3: #f1f3f2 !default; -$default-bg-4: #edf0ee !default; -$default-bg-5: #f8f8f8 !default; -$default-bg-6: #e4e4e4 !default; -$default-fg: black !default; -$default-fg-2: #333333 !default; -$default-fg-3: #888888 !default; -$default-font-size: 15px !default; -$default-font-size-vertial: 25px !default; -$default-shadow: 2px 2px 2px #ccc !default; -$default-hover-fg: #35b870 !default; -$default-hover-fg-2: #38cf80 !default; - -$default-font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif !default; -$default-border: 1px solid #e1e4e8 !default; -$default-border-2: 1px solid #dddddd !default; -$default-border-3: 1px solid #cccccc !default; -$default-bottom: $default-border !default; -$default-link-fg: #5f7869 !default; - -$font-size: $default-font-size !default; -$selected-bg: #c8ffd0 !default; -$hover-bg: #def6ea !default; -$header-bg: $default_bg !default; - -$nav-height: 4.5rem !default; -$nav-bg: #e8e8e8 !default; -$nav-fg: $default-link-fg; -$nav-margin: .2rem; -$nav-date-time-shadow: .2rem .2rem .2rem #ccc !default; - -//// Animations defaults -$transition-duration: .5s !default; -$fade-transition-duration: $transition-duration !default; -$roll-transition-duration: $transition-duration !default; -$fade-in-transition-duration: $fade-transition-duration !default; -$fade-out-transition-duration: $fade-transition-duration !default; -$roll-in-transition-duration: $roll-transition-duration !default; -$roll-out-transition-duration: $roll-transition-duration !default; -$active-glow-bg-1: #d4ffe3 !default; -$active-glow-bg-2: #9cdfb0 !default; - -//// Notifications -$notification-bg: rgba(185, 255, 193, 0.9) !default; -$notification-hover-bg: rgba(160,245,178,0.95) !default; -$notification-warning-bg: rgba(228, 255, 78, 0.9) !default; -$notification-warning-hover-bg: rgba(218, 245, 68, 0.95) !default; -$notification-error-bg: rgba(255, 100, 100, 0.9) !default; -$notification-error-hover-bg: rgba(245, 90, 90, 0.95) !default; -$notification-border: 1px solid rgba(109, 205, 134, 0.62) !default; -$notification-warning-border: 1px solid rgba(205, 205, 109, 0.62) !default; -$notification-error-border: 1px solid rgba(205, 109, 109, 0.62) !default; -$notification-title-border: 1px solid rgba(83, 158, 102, 0.43) !default; -$notification-icon-color: black !default; -$notification-warning-icon-color: #662 !default; -$notification-error-icon-color: #8b0000 !default; - -//// Switch element -$switch-bg-1: #f9f8f6 !default; -$switch-bg-2: #38ffa0 !default; -$switch-bg-3: #cccccc !default; -$switch-bg-hover: #b3b3b3 !default; -$switch-bg-checked: #38ffa0 !default; -$switch-bg-glow-1: #111111 !default; -$switch-bg-glow-2: #ffffff !default; -$switch-bg-glow-3: #aaaaaa !default; -$switch-bg-glow-hover: #ffffff !default; -$switch-bg-glow-checked: #00e094 !default; - -$switch-shadow-1: 0 5px 10px 0px #333, 0 15px 20px 0px #cccccc !default; -$switch-shadow-2: inset 0 0 0 5px #ccc, inset 0 0 0 14px #f9f8f6 !default; -$switch-shadow-3: 0 0 0 2.5px #f9f8f6 !default; -$switch-shadow-hover: inset 0 0 0 5px #b3b3b3, inset 0 0 0 14px #f9f8f6 !default; -$switch-shadow-checked-1: 0 2px 5px 0px gray, 0 15px 20px 0px transparent !default; -$switch-shadow-checked-2: inset 0 0 0 5px #38ffa0, inset 0 0 0 14px #f9f8f6 !default; -$switch-shadow-glow-1: 0 5px 10px 0 #aaa, 0 0 0 3px #bbb, 0 0 8px 2px transparent, 0 0 0 6px #eee !default; -$switch-shadow-glow-2: inset 0 0 0 5px #aaa, inset 0 0 0 14px #fff !default; -$switch-shadow-glow-hover: inset 0 0 0 5px #fff, inset 0 0 0 14px #fff !default; -$switch-shadow-glow-checked-1: 0 0px 8px 0 #00ad72, 0 0 0 3px #00e094, 0 0 30px 0 #00e094, 0 0 0 6px #fff !default; -$switch-shadow-glow-checked-2: inset 0 0 0 5px #00e094, inset 0 0 0 14px #fff !default; - -//// Slider element -$slider-bg: #e4e4e4 !default; -$slider-thumb-bg: rgba(0,215,80,1.0) !default; -$slider-thumb-disabled-bg: rgba(0,215,80,0.3) !default; -$slider-hover-on-hover-bg: #d2d2d2 !default; -$slider-progress-bg: rgba(0,215,80,0.2) !default; - -//// Input element -$text-icon-color: #888; -$border-focus: 1px solid rgba(127, 216, 95, 0.83); -$border-hover: 1px solid rgba(159, 180, 152, 0.83); -$text-shadow: 2px 2px 2px #d4d4d4; - -//// Header style -$header-bottom: $default-bottom; - -//// Dropdown element -$dropdown-bg: rgba(241,243,242,0.9) !default; -$dropdown-disabled-color: #999 !default; -$dropdown-shadow: 1px 1px 1px #bbb !default; - -//// Modal element -$modal-header-bg: #f0f0f0 !default; -$modal-header-border: 1px solid #ccc !default; -$modal-body-bg: white !default; - -//// Autocomplete element -$autocomplete-bg: white !default; - diff --git a/platypush/backend/http/static/css/source/dashboard/index.scss b/platypush/backend/http/static/css/source/dashboard/index.scss deleted file mode 100644 index 744562b3..00000000 --- a/platypush/backend/http/static/css/source/dashboard/index.scss +++ /dev/null @@ -1,60 +0,0 @@ -@import 'common/vars'; - -@import 'common/mixins'; -@import 'common/layout'; -@import 'common/elements'; -@import 'common/animations'; -@import 'common/modal'; -@import 'common/notifications'; - -$background-image: url('/img/dashboard-background.jpg') !default; -$background-color: white !default; -$font-family: Lato !default; - -html { - min-height: 100%; -} - -body { - --background-image: $background-image; - --background-color: $background-color; - - background-image: var(--background-image) !important; - background-color: var(--background-color); - background-size: 100% 100%; - background-repeat: no-repeat; - font-family: $font-family; -} - -main { - display: flex; - flex-flow: column; - width: 100%; - height: 100vh; - margin: 0; - - .widgets-row { - height: calc(50% - 3em); - margin: 2em 1em; - display: flex; - } - - .widget { - background: $background-color; - border-radius: 5px; - height: 100%; - overflow: hidden; - box-shadow: 0 3px 3px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08); - } -} - -#widgets-container { - height: 100%; -} - -@for $i from 1 through 10 { - .row-#{$i} { - height: $i * 100% !important; - } -} - diff --git a/platypush/backend/http/static/css/source/dashboard/widgets/calendar/index.scss b/platypush/backend/http/static/css/source/dashboard/widgets/calendar/index.scss deleted file mode 100644 index d3cf0cfb..00000000 --- a/platypush/backend/http/static/css/source/dashboard/widgets/calendar/index.scss +++ /dev/null @@ -1,21 +0,0 @@ -@import 'common/vars'; - -.widget .calendar { - padding: 1rem; - - .event { - font-size: .95em; - } - - .upcoming-event { - text-align: center; - margin-bottom: 1.5rem; - font-size: 1.2em; - - .summary { - text-transform: uppercase; - font-size: 1.3em; - } - } -} - diff --git a/platypush/backend/http/static/css/source/dashboard/widgets/date-time-weather/index.scss b/platypush/backend/http/static/css/source/dashboard/widgets/date-time-weather/index.scss deleted file mode 100644 index d0bbaf5b..00000000 --- a/platypush/backend/http/static/css/source/dashboard/widgets/date-time-weather/index.scss +++ /dev/null @@ -1,48 +0,0 @@ -@import 'common/vars'; - -.widget .date-time-weather { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - padding-top: 1rem; - - .date { - font-size: 1.3em; - height: 10%; - } - - .time { - font-size: 2em; - height: 14%; - } - - .weather { - height: 35%; - display: flex; - align-items: center; - - .temperature { - font-size: 2em; - margin-left: 1rem; - } - } - - .summary { - height: 28%; - } - - .sensors { - width: 100%; - height: 13%; - - .sensor { - padding: 0 1rem; - } - - .humidity { - text-align: right; - } - } -} - diff --git a/platypush/backend/http/static/css/source/dashboard/widgets/image-carousel/index.scss b/platypush/backend/http/static/css/source/dashboard/widgets/image-carousel/index.scss deleted file mode 100644 index 346aa94d..00000000 --- a/platypush/backend/http/static/css/source/dashboard/widgets/image-carousel/index.scss +++ /dev/null @@ -1,30 +0,0 @@ -@import 'common/vars'; - -.widget .image-carousel { - height: 100%; - position: relative; - display: flex; - align-items: center; - justify-content: center; - background-color: rgba(0,0,0,0); - - .background { - position: absolute; - top: 0; - width: 100%; - height: 100vh; - background-color: rgba(0,0,0,0); - background-position: center; - background-size: cover; - background-repeat: no-repeat; - filter: blur(13px); - -webkit-filter: blur(13px); - } - - img { - position: absolute; - max-height: 100%; - z-index: 2; - } -} - diff --git a/platypush/backend/http/static/css/source/dashboard/widgets/music/index.scss b/platypush/backend/http/static/css/source/dashboard/widgets/music/index.scss deleted file mode 100644 index 97396936..00000000 --- a/platypush/backend/http/static/css/source/dashboard/widgets/music/index.scss +++ /dev/null @@ -1,93 +0,0 @@ -@import 'common/vars'; - -$progress-bar-bg: #ddd; -$playback-status-color: #757f70; - -.widget .music { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - - .track { - text-align: center; - - .unknown, - .no-track { - font-size: 2em; - } - - .artist { - font-size: 1.9em; - font-weight: bold; - margin-bottom: .25em; - } - - .title { - font-size: 1.8em; - } - } - - .time { - width: 100%; - margin-top: 1em; - font-size: 1.2em; - - .row { - padding: 0 .5em; - } - - .time-total { - text-align: right; - } - - .progress-bar { - width: 100%; - height: 1em; - position: relative; - margin-bottom: .75em; - - .total { - position: absolute; - width: 100%; - height: 100%; - top: 0; - background: $progress-bar-bg; - border-radius: 5rem; - } - - .elapsed { - position: absolute; - width: 100%; - height: 100%; - top: 0; - background: $selected-bg; - border-radius: 5rem; - z-index: 1; - } - } - } - - .playback-status { - position: absolute; - bottom: 0; - border-top: $default-border-2; - color: $playback-status-color; - width: 100%; - height: 2em; - - .status-property { - display: flex; - align-items: center; - justify-content: center; - height: 100%; - } - - .active { - color: $default-hover-fg; - } - } -} - diff --git a/platypush/backend/http/static/css/source/dashboard/widgets/rss-news/index.scss b/platypush/backend/http/static/css/source/dashboard/widgets/rss-news/index.scss deleted file mode 100644 index 85227b2c..00000000 --- a/platypush/backend/http/static/css/source/dashboard/widgets/rss-news/index.scss +++ /dev/null @@ -1,29 +0,0 @@ -@import 'common/vars'; - -.widget .rss-news { - height: 100%; - display: flex; - align-items: center; - - .article { - width: 90%; - padding: 0 2em; - - .source { - font-size: 1.7em; - font-weight: bold; - margin-bottom: .5em; - } - - .title { - font-size: 1.7em; - margin-bottom: .5em; - } - - .published { - text-align: right; - font-size: 1em; - } - } -} - diff --git a/platypush/backend/http/static/css/source/login/index.scss b/platypush/backend/http/static/css/source/login/index.scss deleted file mode 100644 index b94d0b79..00000000 --- a/platypush/backend/http/static/css/source/login/index.scss +++ /dev/null @@ -1,46 +0,0 @@ -@import 'common/vars'; - -@import 'common/mixins'; -@import 'common/layout'; -@import 'common/elements'; - -body { - width: 100vw; - height: 100vh; - margin: 0; - overflow-x: hidden; - font-family: $default-font-family; - font-size: $default-font-size; -} - -main { - height: 100%; - display: flex; - align-items: center; - justify-content: center; - margin: 0; - - form { - border: $default-border-3; - border-radius: 3em; - padding: 4em; - - .row { - margin: 1em 0; - } - - input[type=text], - input[type=password] { - width: 100%; - } - - input[type=submit] { - border-radius: 1em; - } - } -} - -a { - color: $default-link-fg; -} - diff --git a/platypush/backend/http/static/css/source/register b/platypush/backend/http/static/css/source/register deleted file mode 120000 index e9f12b60..00000000 --- a/platypush/backend/http/static/css/source/register +++ /dev/null @@ -1 +0,0 @@ -login \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/settings/index.scss b/platypush/backend/http/static/css/source/settings/index.scss deleted file mode 100644 index 53b3f9cf..00000000 --- a/platypush/backend/http/static/css/source/settings/index.scss +++ /dev/null @@ -1,111 +0,0 @@ -@import 'common/vars'; - -@import 'common/mixins'; -@import 'common/layout'; -@import 'common/elements'; -@import 'common/animations'; -@import 'common/modal'; -@import 'common/notifications'; - -@import 'settings/users'; -@import 'settings/token'; - -$nav-background: #f0f0f0; -$section-header-background: #eee; - -body { - width: 100%; - height: 100%; - margin: 0; - overflow-x: hidden; - font-family: $default-font-family; - font-size: $default-font-size; -} - -#app { - width: 100vw; - height: 100vh; - display: flex; - flex-direction: row; - - nav { - background: $nav-background; - color: $default-link-fg; - border-right: $default-border-3; - - ul { - width: 100%; - height: 100%; - margin: 0; - overflow: auto; - list-style-type: none; - - li { - display: flex; - margin: 0; - padding: 1em; - cursor: pointer; - - &:not(:first-of-type) { - border-top: $default-border-3; - } - - &:hover { - background: $hover-bg; - } - - a:first-child { - width: 100%; - } - } - } - } - - main { - margin: 0; - flex: 1 1 auto; - overflow: hidden; - height: inherit; - - .section { - overflow: auto; - height: inherit; - - header { - display: flex; - align-items: center; - border-bottom: $default-border-2; - background: $section-header-background; - - h1 { - margin: .45em .2em; - } - - button { - border: 0; - &:hover { - color: $default-hover-fg; - } - } - } - } - } - - a { - color: $default-link-fg; - } -} - -.dropdown { - .item { - display: flex; - flex-direction: row; - cursor: pointer; - - &:hover { - background: $hover-bg; - } - - } -} - diff --git a/platypush/backend/http/static/css/source/settings/token.scss b/platypush/backend/http/static/css/source/settings/token.scss deleted file mode 100644 index 451f77e0..00000000 --- a/platypush/backend/http/static/css/source/settings/token.scss +++ /dev/null @@ -1,21 +0,0 @@ -#token { - .warning { - background: $notification-error-bg; - border: $notification-error-border; - margin: 1em; - padding: 1em; - border-radius: 1em; - } - - .token-container { - display: flex; - align-items: center; - justify-content: center; - margin: 2em; - - input { - width: 100%; - } - } -} - diff --git a/platypush/backend/http/static/css/source/settings/users.scss b/platypush/backend/http/static/css/source/settings/users.scss deleted file mode 100644 index 5452b9dd..00000000 --- a/platypush/backend/http/static/css/source/settings/users.scss +++ /dev/null @@ -1,27 +0,0 @@ -#users { - ul { - list-style-type: none; - - li { - margin: 0; - padding: 1em .5em; - border-bottom: $default-border-3; - cursor: pointer; - - &:hover { - background: $hover-bg; - } - } - } - - form { - display: flex; - flex-direction: column; - width: 20em; - - input { - margin: 1em .5em; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/index.scss b/platypush/backend/http/static/css/source/webpanel/index.scss deleted file mode 100644 index a1a3e483..00000000 --- a/platypush/backend/http/static/css/source/webpanel/index.scss +++ /dev/null @@ -1,53 +0,0 @@ -@import 'common/vars'; - -@import 'common/mixins'; -@import 'common/layout'; -@import 'common/elements'; -@import 'common/animations'; -@import 'common/modal'; -@import 'common/notifications'; - -@import 'nav'; - -body { - width: 100%; - height: 100%; - margin: 0; - overflow-x: hidden; - font-family: $default-font-family; - font-size: $default-font-size; -} - -#app { - display: flex; - flex-flow: column; - height: 100%; - - main { - background: $default-bg; - margin: 0; - flex: 1 1 auto; - overflow: hidden; - - // nav height hardcoded, calc won't support either CSS4 nor SASS vars - @include calc(height, '100vh - 4.8rem'); - - .plugins-container { - height: inherit; - - .plugin-container { - overflow: auto; - height: inherit; - - .plugin { - overflow: auto; - } - } - } - } - - a { - color: $default-link-fg; - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/nav.scss b/platypush/backend/http/static/css/source/webpanel/nav.scss deleted file mode 100644 index 28f8548f..00000000 --- a/platypush/backend/http/static/css/source/webpanel/nav.scss +++ /dev/null @@ -1,84 +0,0 @@ -:root { - --nav-height: $nav-height; -} - -nav { - width: 100%; - position: relative; - height: var(--nav-height); - background: $nav-bg; - margin-bottom: $nav-margin; - border-bottom: $default-bottom; - box-shadow: 0 2.5px 4px 0 #bbb; - flex: 0 1 auto; - z-index: 2; - - ul { - position: relative; - width: 75%; - display: inline-flex; - margin: 0; - padding: 0; - list-style-type: none; - align-items: center; - - li { - padding: 1rem 1.5rem; - display: inline-block; - margin: 0; - text-transform: uppercase; - letter-spacing: .1rem; - border-radius: 2rem; - - &:hover { - background: $hover-bg; - letter-spacing: .4rem; - } - - a { - text-decoration: none; - display: block; - color: $nav-fg; - - &:hover { - color: $nav-fg; - } - } - } - - &:hover { - .decorator { - display: none; - } - - li.selected { - border-radius: 2rem; - } - } - } - - .date-time { - position: absolute; - width: 25%; - display: inline-block; - right: 0; - margin-right: .7rem; - font-size: 14pt; - text-shadow: $nav-date-time-shadow; - - .time { - display: inline-block; - } - } - - .settings { - display: inline-block; - padding: .75rem 1rem; - - &:hover { - background: $hover-bg; - border-radius: 3rem; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/assistant.google/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/assistant.google/index.scss deleted file mode 100644 index 64cec730..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/assistant.google/index.scss +++ /dev/null @@ -1,34 +0,0 @@ -$icon-color: #7e8; -$icon-border: 1px solid #ccc; -$icon-shadow: 2px 2px 2px #ccc; - -#assistant-google-modal { - .modal { - width: 50vw; - height: 50vh; - - .body { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - text-align: center; - - .icon { - font-size: 3em; - color: $icon-color; - box-shadow: $icon-shadow; - border: $icon-border; - border-radius: 3em; - padding: .7em 1em .5em 1em; - } - - .text { - margin-top: 2.5em; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera.android.ipcam/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/camera.android.ipcam/index.scss deleted file mode 100644 index 43387330..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera.android.ipcam/index.scss +++ /dev/null @@ -1,39 +0,0 @@ -@import 'common/vars'; - -.camera { - min-height: 90%; - margin-top: 4%; - overflow: auto; - display: flex; - flex-direction: column; - align-items: center; - - .camera-container { - min-width: 640px; - min-height: 480px; - position: relative; - background: black; - margin-bottom: 1em; - - .frame, .no-frame { - position: absolute; - top: 0; - width: 100%; - height: 100%; - } - - .frame { - z-index: 1; - } - - .no-frame { - display: flex; - background: rgba(0, 0, 0, 0.1); - color: white; - align-items: center; - justify-content: center; - z-index: 2; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera.cv b/platypush/backend/http/static/css/source/webpanel/plugins/camera.cv deleted file mode 120000 index 5f839334..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera.cv +++ /dev/null @@ -1 +0,0 @@ -camera \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera.ffmpeg b/platypush/backend/http/static/css/source/webpanel/plugins/camera.ffmpeg deleted file mode 120000 index 5f839334..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera.ffmpeg +++ /dev/null @@ -1 +0,0 @@ -camera \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera.gstreamer b/platypush/backend/http/static/css/source/webpanel/plugins/camera.gstreamer deleted file mode 120000 index 5f839334..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera.gstreamer +++ /dev/null @@ -1 +0,0 @@ -camera \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera.ir.mlx90640 b/platypush/backend/http/static/css/source/webpanel/plugins/camera.ir.mlx90640 deleted file mode 120000 index 5f839334..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera.ir.mlx90640 +++ /dev/null @@ -1 +0,0 @@ -camera \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera.pi b/platypush/backend/http/static/css/source/webpanel/plugins/camera.pi deleted file mode 120000 index 5f839334..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera.pi +++ /dev/null @@ -1 +0,0 @@ -camera \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/camera/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/camera/index.scss deleted file mode 100644 index f8fc3bcc..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/camera/index.scss +++ /dev/null @@ -1,116 +0,0 @@ -@import 'common/vars'; - -.camera { - min-height: 90%; - margin-top: 4%; - overflow: auto; - display: flex; - flex-direction: column; - align-items: center; - - .camera-container { - position: relative; - background: black; - margin-bottom: 1em; - - .frame, .no-frame { - position: absolute; - top: 0; - width: 100%; - height: 100%; - } - - .frame { - z-index: 1; - } - - .no-frame { - display: flex; - background: rgba(0, 0, 0, 0.1); - color: white; - align-items: center; - justify-content: center; - z-index: 2; - } - } - - .url { - width: 640px; - display: flex; - margin: 1em; - - .row { - width: 100%; - display: flex; - align-items: center; - } - - .name { - width: 140px; - } - - input { - width: 500px; - font-weight: normal; - } - } - - .params { - margin-top: 1em; - padding: 1em; - width: 640px; - display: flex; - flex-direction: column; - border: $default-border-3; - border-radius: 1em; - - label { - font-weight: normal; - } - - .head { - display: flex; - justify-content: center; - - label { - width: 100%; - display: flex; - justify-content: right; - - .name { - margin-right: 1em; - } - } - } - - .body { - display: flex; - flex-direction: column; - margin: 0 0 0 -1em; - - .row { - width: 100%; - display: flex; - align-items: center; - padding: 0.5em; - - .name { - width: 30%; - } - - input { - width: 70%; - } - - &:nth-child(even) { - background: $default-bg-6; - } - - &:hover { - background: $hover-bg; - } - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/execute/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/execute/index.scss deleted file mode 100644 index ea376b2c..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/execute/index.scss +++ /dev/null @@ -1,173 +0,0 @@ -@import 'common/vars'; -@import 'common/layout'; -@import 'webpanel/plugins/execute/vars'; - -.execute-container { - height: 99%; - color: $default-fg-2; - font-weight: 400; - //line-height: 3.8rem; - //letter-spacing: .1rem; - border-bottom: $default-border-2; - border-radius: 0 0 1em 1em; - - .title { - background: $title-bg; - padding: .2em; - border: $title-border; - box-shadow: $title-shadow; - font-size: 1.1em; - } - - .request-type-container { - display: flex; - flex-direction: row; - align-items: baseline; - margin: 1em 0 0 1em; - - label { - margin: 0 1em 0 .5em; - } - } - - .request { - margin: 0 .5em; - - form { - margin-bottom: 0 !important; - } - - .autocomplete { - width: 80%; - max-width: 60em; - } - - .action-name { - box-shadow: $action-name-shadow; - width: 100%; - } - - [type=submit] { - margin-left: 2em; - } - - .options { - display: flex; - margin-top: .5em; - margin-bottom: 1.5em; - padding-top: .5em; - } - - .params { - margin-right: 1.5em; - max-height: 50vh; - overflow: auto; - - .param { - margin-bottom: .25em; - } - - .action-param-value { - width: 100%; - } - } - - .add-param { - width: 100%; - - button { - width: 100%; - background: $extra-params-btn-bg; - border: $title-border; - } - } - - .extra-param { - display: flex; - margin-bottom: .5em; - - .action-extra-param-del { - border: 0; - text-align: right; - padding: 0 .5em; - } - } - - .output-container { - max-height: 50vh; - overflow: auto; - - .response, - .error, - .doc { - padding: .5em .5em 0 .5em; - border-radius: 1em; - } - - .response { - background: $response-bg; - border: $response-border; - } - - .error { - background: $error-bg; - border: $error-border; - } - - .doc { - background: $doc-bg; - border: $doc-border; - } - } - - textarea { - width: 80%; - max-width: 60em; - height: 10em; - border-radius: 1em; - } - } - - .raw-request { - .first-row { - display: flex; - flex-direction: row; - } - } - - .procedures-container { - .procedure { - border-bottom: $default-border-2; - padding: 1.5em .5em; - cursor: pointer; - - &:hover { - background: $hover-bg; - } - - &.selected { - background: $selected-bg; - } - - form { - display: flex; - margin-bottom: 0 !important; - flex-direction: column; - } - - .head { - display: flex; - align-items: center; - } - - .btn-container { - text-align: right; - } - - button { - background: $procedure-submit-btn-bg; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/execute/vars.scss b/platypush/backend/http/static/css/source/webpanel/plugins/execute/vars.scss deleted file mode 100644 index fd6fc9e0..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/execute/vars.scss +++ /dev/null @@ -1,14 +0,0 @@ -$title-bg: #eee; -$title-border: 1px solid #ddd; -$title-shadow: 0 3px 3px 0 rgba(187,187,187,0.75); -$action-name-shadow: 1px 1px 1px 1px #ddd; -$extra-params-btn-bg: #eee; -$response-bg: #edfff2; -$response-border: 1px dashed #98ff98; -$error-bg: #ffbcbc; -$error-border: 1px dashed #ff5353; -$doc-bg: #e8feff; -$doc-border: 1px dashed #84f9ff; -$procedure-submit-btn-bg: #ebffeb; - - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/gpio/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/gpio/index.scss deleted file mode 100644 index 8a6d3c38..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/gpio/index.scss +++ /dev/null @@ -1,39 +0,0 @@ -@import 'common/vars'; - -.gpio-container { - display: flex; - flex-direction: column; - height: 100%; - overflow: auto; - - .refresh { - border-bottom: $default-border-2; - background: $default-bg-5; - - button { - border: 0; - &:hover { - color: $default-hover-fg; - } - } - } - - .pins { - .pin { - padding: 1em; - border-bottom: $default-border-2; - display: flex; - flex-direction: row; - align-items: center; - - &:nth-child(even) { - background: $modal-header-bg; - } - - &:hover { - background: $hover-bg; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/light.hue/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/light.hue/index.scss deleted file mode 100644 index 0243f42c..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/light.hue/index.scss +++ /dev/null @@ -1,163 +0,0 @@ -@import 'common/vars'; -@import 'common/layout'; -@import 'webpanel/plugins/light.hue/vars'; - -.light-hue-container { - display: flex; - color: $default-fg-2; - font-weight: 400; - line-height: 3.8rem; - letter-spacing: .1rem; - border-bottom: $default-border-2; - border-radius: 0 0 1em 1em; - - %panel { - margin: 1.5rem auto; - padding: 1.5rem; - font-weight: 100; - border: $default-border-2; - border-radius: 1.5rem; - background: $light-hue-properties-bg; - box-shadow: $light-hue-properties-shadow; - } - - .groups, - .scenes, - .units { - &:not(:last-child) { - border-right: $default-border-2; - } - - .title { - padding: .75rem; - background: $default-bg-2; - border-bottom: $default-border-2; - - &:last-child { - border-radius: 0 1rem 0 0; - } - } - - .group, - .scene, - .unit, - .animations, - .group-controller { - padding: 1rem; - cursor: pointer; - - &:hover { - background: $hover-bg; - } - - &:not(:last-child) { - border-bottom: $default-border-2; - } - - &:not(.hidden) { - .row { - width: 100%; - } - } - - * > .properties { - @extend %panel; - - .slider-container { - @extend .vertical-center; - margin: 1rem auto; - } - - * > .fa { - font-size: 2.5rem; - color: $light-hue-icon-color; - } - - * > .color-logo { - width: 2rem; - height: 2rem; - border-radius: 1rem; - } - - * > .color-logo-red { background-color: red; } - * > .color-logo-green { background-color: green; } - * > .color-logo-blue { background-color: blue; } - } - - &:hover { - * > .properties { - background: $light-hue-properties-hover-bg; - } - } - } - - .group { - text-transform: uppercase; - } - - .group-controller { - font-weight: 600; - } - - .animations { - .row { - .caption { - font-style: italic; - } - - .animation-container { - @extend %panel; - cursor: auto; - - .animation { - .row { - padding: 1rem .3333rem; - &:hover { - background: $hover-bg; - border-radius: 1.5rem; - - * > input[type=range] { - background: $slider-hover-on-hover-bg; - } - } - } - } - } - - select[name=animation-type] { - width: 100%; - } - } - - * > .input-range-container { - margin-top: 1rem; - margin-bottom: -1rem; - } - - * > input[type="text"] { - width: 100%; - } - - &:hover { - .row { - .animation-container { - background: $light-hue-properties-hover-bg; - } - } - } - } - } - - .groups { - .title { - border-radius: 1rem 0 0 0; - } - } - - .units { - .title { - border-radius: 0 1rem 0 0; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/light.hue/vars.scss b/platypush/backend/http/static/css/source/webpanel/plugins/light.hue/vars.scss deleted file mode 100644 index 5422d35e..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/light.hue/vars.scss +++ /dev/null @@ -1,5 +0,0 @@ -$light-hue-properties-bg: rgba(239,239,240,0.5); -$light-hue-properties-hover-bg: white; -$light-hue-properties-shadow: 0 0 4px 2px rgba(187,187,187,0.75); -$light-hue-icon-color: #555; - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media.gstreamer b/platypush/backend/http/static/css/source/webpanel/plugins/media.gstreamer deleted file mode 120000 index 27949aaf..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media.gstreamer +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media.mplayer b/platypush/backend/http/static/css/source/webpanel/plugins/media.mplayer deleted file mode 120000 index 27949aaf..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media.mplayer +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media.mpv b/platypush/backend/http/static/css/source/webpanel/plugins/media.mpv deleted file mode 120000 index 27949aaf..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media.mpv +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media.omxplayer b/platypush/backend/http/static/css/source/webpanel/plugins/media.omxplayer deleted file mode 120000 index 27949aaf..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media.omxplayer +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media.vlc b/platypush/backend/http/static/css/source/webpanel/plugins/media.vlc deleted file mode 120000 index 27949aaf..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media.vlc +++ /dev/null @@ -1 +0,0 @@ -media \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/controls.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/controls.scss deleted file mode 100644 index 835bdf8c..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/controls.scss +++ /dev/null @@ -1,104 +0,0 @@ -.media-plugin { - .controls { - @extend .vertical-center; - width: 100%; - border-top: $default-border-2; - box-shadow: $control-panel-shadow; - flex: 0 0 $control-panel-height; - - .item-container { - @extend .vertical-center; - padding-left: 1rem; - line-height: 2.6rem; - - .item-info { - font-size: 1.15em; - letter-spacing: .02em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - cursor: pointer; - - &:hover { - color: $default-hover-fg; - } - } - } - - button { - &:hover { - .fa { - color: $button-hover-color; - } - } - } - - .playback-controls { - .row { - @extend .vertical-center; - justify-content: center; - } - - .position { - margin-top: .75em; - } - - button { - padding: 0 1.5rem; - - .fa-play, .fa-pause { - color: $button-hover-color; - font-size: $font-size * 2; - margin-top: .3rem; - - &:hover { - color: $play-button-hover-color; - } - } - } - } - - .pull-right { - button { - &:not(last-child) { - padding: 0 .7rem; - } - - &:last-child { - padding: 0; - } - } - - .volume-container { - button { - padding: 0 .3rem 0 0; - background: none; - } - } - } - - .seek-slider { - width: 75%; - } - - .volume-slider { - width: 75%; - margin-right: 1rem; - } - - .elapsed-time, - .total-time { - font-size: .7em; - color: .7em; - } - - .elapsed-time { - margin-right: 1.5rem; - } - - .total-time { - margin-left: 1.5rem; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/devices.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/devices.scss deleted file mode 100644 index 49f28aa8..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/devices.scss +++ /dev/null @@ -1,44 +0,0 @@ -.media-plugin { - .devices { - display: inline-block; - - button { - padding: .5rem; - margin-right: .5rem; - - &.selected { - background: initial; - color: $default-hover-fg; - - &:hover { - color: $default-hover-fg-2; - } - } - } - - .dropdown { - white-space: nowrap; - - .item { - display: flex; - align-items: center; - - .text { - text-align: left; - margin-left: 2rem; - } - - &:first-child { - border-bottom: $default-border-3; - color: $devices-dropdown-refresh-fg; - font-size: .8em; - } - - &:hover { - background: $hover-bg - } - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/index.scss deleted file mode 100644 index ce18c35a..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/index.scss +++ /dev/null @@ -1,60 +0,0 @@ -@import 'common/vars'; -@import 'common/mixins'; -@import 'common/layout'; -@import 'common/animations'; - -@import 'webpanel/plugins/media/vars'; -@import 'webpanel/plugins/media/search'; -@import 'webpanel/plugins/media/devices'; -@import 'webpanel/plugins/media/results'; -@import 'webpanel/plugins/media/controls'; -@import 'webpanel/plugins/media/info'; -@import 'webpanel/plugins/media/subs'; -@import 'webpanel/plugins/media/torrents'; - -.media-plugin { - display: flex; - flex-direction: column; - height: inherit; - letter-spacing: .03rem; - - .dropdown { - z-index: $devices-dropdown-z-index; - - .item { - display: flex; - align-items: center; - - .text { - margin-left: 1rem; - } - - &:hover { - background: $hover-bg; - } - } - } - - input[type=text] { - width: 100%; - - &:hover { - border-color: $default-hover-fg; - } - } - - button { - border: 0; - } - - .icon { - color: $result-item-icon; - margin-right: .5em; - } - - .top-buttons { - text-align: right; - float: right; - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/info.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/info.scss deleted file mode 100644 index 384cfac6..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/info.scss +++ /dev/null @@ -1,33 +0,0 @@ -.media-plugin { - #media-info { - .modal { - max-width: 90%; - } - } - - .info-container { - .row { - display: flex; - align-items: center; - padding: .75em .5em; - border-bottom: $default-border-2; - - &:nth-child(odd) { background: rgba(255,255,255,0.0); } - &:nth-child(even) { background: $default-bg-3; } - - &:hover { - background: $hover-bg; - border-radius: 1em; - } - - .attr { - font-size: 1.1em; - } - - .value { - text-align: right; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/results.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/results.scss deleted file mode 100644 index 37c158ad..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/results.scss +++ /dev/null @@ -1,42 +0,0 @@ -@import 'common/animations'; - -.media-plugin { - .results { - position: relative; // For the dropdown menu - overflow: auto; - @include calc(height, '100%'); - - &.resize { - @include calc(height, '100% - 16rem'); - } - - .active { - @extend .active-glow; - height: 4rem; - } - - .empty { - height: 100%; - display: flex; - align-items: center; - justify-content: center; - font-size: 1.5em; - letter-spacing: .1rem; - color: $empty-results-color; - } - - .media-item { - display: flex; - align-items: center; - cursor: pointer; - border-radius: 1rem; - padding: .5rem; - - &:nth-child(odd) { background: rgba(255, 255, 255, 0.0); } - &:nth-child(even) { background: $default-bg-3; } - &:hover { background: $hover-bg; } - &.selected { background: $selected-bg; } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/search.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/search.scss deleted file mode 100644 index 6e19ecea..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/search.scss +++ /dev/null @@ -1,53 +0,0 @@ -.media-plugin { - .search { - display: flex; - align-items: center; - width: 100%; - background: $default-bg-3; - border-bottom: $default-border-3; - - input[type=text] { - width: 80%; - max-width: 600px; - } - - [type=submit] { - color: $default-hover-fg; - font-size: 1.2em; - - &:hover { - border: $default-border-2; - border-radius: 5rem; - } - } - - .types { - .type { - display: inline-block; - padding: 1rem 1rem 0 1rem; - } - - label { - display: inline-block; - font-weight: normal; - margin: 0; - } - } - - button { - padding: 0 2rem; - border: 0; - - &:hover { - color: $default-hover-fg; - } - } - - form { - width: 100%; - margin: 0; - padding: 1rem 0; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/subs.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/subs.scss deleted file mode 100644 index cea6c893..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/subs.scss +++ /dev/null @@ -1,60 +0,0 @@ -.media-plugin { - #media-subs { - .body { - padding: 0; - } - } - - .subs-container { - .loading, .no-results { - display: flex; - align-items: center; - padding: 3rem; - font-size: 1.5em; - } - - .subs { - .list { - max-height: 50vh; - overflow: auto; - } - - .sub { - display: flex; - align-items: center; - padding: .75em .5em; - border-bottom: $default-border-2; - cursor: pointer; - - &:nth-child(odd) { background: rgba(255, 255, 255, 0.0); } - &:nth-child(even) { background: $default-bg-3; } - &.selected { background: $selected-bg; } - - &:hover { - background: $hover-bg; - border-radius: 1em; - } - } - - .controls { - position: relative; - padding: 1.5rem 0; - height: $subs-control-height; - - button { - position: absolute; - right: 0; - margin-right: 1rem; - border: $default-border-2; - box-shadow: $btn-default-shadow; - - &:hover:not([disabled]) { - box-shadow: $btn-hover-default-shadow; - color: $default-hover-fg; - } - } - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/torrents.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/torrents.scss deleted file mode 100644 index b813c4a8..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/torrents.scss +++ /dev/null @@ -1,51 +0,0 @@ -.media-plugin { - #media-torrents { - .modal { - width: 90%; - - .body { - padding: 0; - text-align: center; - - .search { - input[type=text] { - width: 88%; - max-width: none; - } - - input[type=submit] { - width: 8%; - } - } - - .head { - font-weight: bold; - padding: .5rem 0 2.5rem 0; - background: $torrents-head-bg; - border-bottom: $default-border-3; - } - - .transfers-container { - margin: 0; - width: 100%; - } - - .transfer { - display: flex; - padding: 1.5rem; - cursor: pointer; - - &:nth-child(odd) { background: rgba(255,255,255,0.0); } - &:nth-child(even) { background: $default-bg-3; } - &.selected { background: $selected-bg; } - - &:hover { - background: $hover-bg; - border-radius: .5rem; - } - } - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/media/vars.scss b/platypush/backend/http/static/css/source/webpanel/plugins/media/vars.scss deleted file mode 100644 index 49ab5f2e..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/media/vars.scss +++ /dev/null @@ -1,21 +0,0 @@ -$button-enabled-color: #59df3e; -$button-hover-color: $button-enabled-color; -$play-button-hover-color: #64ef4a; - -$control-panel-bg: rgba(245,245,245,0.95); -$control-panel-height: 10rem !default; -$control-panel-shadow: 0 -2.5px 4px 0 #c0c0c0; -$control-time-color: #666; - -$empty-results-color: #506050; -$result-item-icon: #444; - -$devices-dropdown-z-index: 2; -$devices-dropdown-refresh-fg: #666; - -$subs-control-height: 4rem; -$btn-default-shadow: 2px 2px 2px #ddd; -$btn-hover-default-shadow: 3px 3px 3px #ddd; - -$torrents-head-bg: #e8e8e8; - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/music.mpd/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/music.mpd/index.scss deleted file mode 100644 index 37f7264e..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/music.mpd/index.scss +++ /dev/null @@ -1,453 +0,0 @@ -@import 'common/vars'; -@import 'common/mixins'; -@import 'common/layout'; -@import 'common/animations'; - -@import 'webpanel/plugins/music.mpd/vars'; - -.music-mpd-container { - display: flex; - flex-direction: column; - line-height: 3rem; - letter-spacing: .03rem; - height: inherit; - overflow: hidden; - - .item { - display: flex; - align-items: center; - cursor: pointer; - border-radius: 1rem; - padding: .5rem; - - &:nth-child(odd) { background: rgba(255, 255, 255, 0.0); } - &:nth-child(even) { background: $default-bg-3; } - &:hover { background: $hover-bg !important; } - &.selected { background: $selected-bg !important; } - - .artist { - font-size: .9em; - } - } - - .duration { - color: $duration-color; - font-size: .7em; - } - - button { - border: 0; - - &:disabled { - background: none; - } - - &.enabled { - color: $button-enabled-color !important; - .fa { color: $button-enabled-color !important; } - } - - &:hover { - .fa { - opacity: 0.75; - } - } - } - - .spacer { - height: 5rem; - } - - .panels { - display: flex; - flex-direction: row; - flex: 0 1 auto; - order: 0; - @include calc(height, '100% - 10.1rem'); - - .panel { - height: 100%; - } - } - - .browser { - width: 40%; - min-width: 20rem; - max-width: 35rem; - background: $browser-panel-bg; - font-size: .9em; - - .item { - background: none; - } - - .fa { - color: #666; - } - } - - %ctrl-button { - border: 0; - padding: 0 1.5rem; - - &:disabled { - background: none; - } - - &.enabled { - color: $button-enabled-color; - } - - .fa-search { - color: $button-hover-color; - } - } - - %move { - background: $move-mode-track-bg !important; - border-top: $move-mode-track-border; - border-bottom: $move-mode-track-border; - cursor: move; - } - - .browser, - .search, - .playlist { - .results { - position: relative; // For the dropdown menu - @include calc(height, '100% - 5.1rem'); - overflow: auto; - } - - .browser-controls, - .results-controls, - .playlist-controls { - width: 100%; - height: 4rem; - background: $playlist-controls-bg; - border-bottom: $playlist-controls-border; - padding: .5rem 0; - - input[type=text] { - width: 100%; - } - - button { - @extend %ctrl-button; - padding: 0 .75rem; - } - } - - .empty { - display: flex; - align-items: center; - justify-content: center; - height: 100%; - font-size: 5rem; - color: $empty-playlist-color; - text-shadow: $empty-playlist-shadow; - } - - .item { - .empty { - font-size: 1em; - display: block; - height: auto; - } - - &.active { - height: 4rem; - @extend .active-glow; - } - - &.move:hover { - @extend %move; - } - } - } - - .playlist { - width: 100%; - } - .playlist-add, - .editor { - .editor-controls, - .playlist-add-controls { - background: $playlist-controls-bg; - border-bottom: $playlist-controls-border; - border-radius: 0; - box-shadow: $filter-bar-shadow; - margin: -2.5rem -2rem 0 -2rem; - padding: .5rem; - } - - input[type=text] { - width: 100%; - } - - button { - @extend %ctrl-button; - padding: 0 .75rem; - } - - .editor-container, - .playlists-container { - overflow: auto; - margin: 0 -2rem; - padding: 1rem; - } - - .playlists-container { - max-height: 70vh; - } - - .editor-container { - max-height: 65vh; - - .item { - &.move:hover { - @extend %move; - } - } - } - } - - .controls { - @extend .vertical-center; - width: 100%; - border-top: $default-border-2; - background: $control-panel-bg; - box-shadow: $control-panel-shadow; - z-index: 2; - order: 1; - flex: 0 0 $control-panel-height; - - .track-container { - @extend .vertical-center; - padding-left: 1rem; - line-height: 2.6rem; - - a { - color: initial; - text-decoration: none; - - &:hover { - color: $track-info-hover-color; - } - } - - .track-info { - .artist { - font-weight: bold; - } - } - } - - button { - &:hover { - .fa { - color: $button-hover-color; - } - } - } - - .playback-controls { - .row { - @extend .vertical-center; - justify-content: center; - } - - button { - padding: 0 1.5rem; - - .fa-play, .fa-pause { - color: $button-hover-color; - font-size: $font-size * 2; - margin-top: .3rem; - - &:hover { - color: $play-button-hover-color; - } - } - } - } - - .pull-right { - padding-right: 2.5rem; - button { - &:not(last-child) { - padding: 0 .7rem; - } - - &:last-child { - padding: 0; - } - } - - .volume-container { - button { - padding: 0 .3rem 0 0; - background: none; - } - } - } - - .seek-slider { - width: 75%; - } - - .volume-slider { - width: 75%; - margin-right: 1rem; - } - - .elapsed-time, - .total-time { - font-size: .7em; - color: .7em; - } - - .elapsed-time { - margin-right: 1.5rem; - } - - .total-time { - margin-left: 1.5rem; - } - } - - .search { - --width: 90vw; - padding: 0; - - form { - margin-bottom: 0; - padding: 2.7rem; - - .row { - padding: .5rem; - } - - .footer { - padding-top: 1.5rem; - margin: 2.5rem 0; - border-top: $search-modal-footer-border; - - .left { - display: flex; - justify-content: left; - } - } - - button, input[type=submit] { - border-radius: 5rem; - } - } - - .results-controls { - padding: 0; - border-bottom: $default-border-2; - width: var(--width); - height: 4.5rem; - display: flex; - align-items: center; - z-index: 502; - } - - form, .results { - position: relative; - } - - .results { - @include calc(height, '100% - 4.7rem'); - } - } - - .dropdown { - width: 20rem; - } - - .filter-container { - position: relative; - } -} - -#music-mpd-info { - .modal { - .body { - .row { - margin: .5rem; - padding: .5rem; - border-bottom: $info-modal-row-border; - - &:hover { - border-radius: 1rem; - background: $hover-bg; - } - - .attr { - color: $info-modal-attr-color; - } - - .value { - text-align: right; - } - } - } - } -} - -#music-mpd-search-modal, -#music-mpd-playlist-edit { - .dropdown { - z-index: 503; - } -} - -#music-mpd-search-modal { - .header { - height: 3.8rem; - } - - .body { - display: flex; - padding: 0; - } -} - -#music-mpd-playlist-add { - .modal { - min-width: 50rem; - } -} - -#music-mpd-playlist-edit { - .modal { - min-width: 80rem; - } -} - -@media #{map-get($widths, 's')} { - #music-mpd-info { - .modal { - width: 80vw; - } - } -} - -@media #{map-get($widths, 'm')} { - #music-mpd-info { - .modal { - width: 70vw; - } - } -} - -@media #{map-get($widths, 'l')} { - #music-mpd-info { - .modal { - width: 45vw; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/music.mpd/vars.scss b/platypush/backend/http/static/css/source/webpanel/plugins/music.mpd/vars.scss deleted file mode 100644 index 4bd2c32d..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/music.mpd/vars.scss +++ /dev/null @@ -1,28 +0,0 @@ -$button-enabled-color: #59df3e; -$button-hover-color: $button-enabled-color; -$play-button-hover-color: #64ef4a; - -$duration-color: #666; - -$control-panel-height: 10rem !default; -$control-panel-bg: rgba(245,245,245,0.95); -$control-panel-shadow: 0 -2.5px 4px 0 #c0c0c0; -$control-time-color: #666; - -$browser-panel-bg: rgba(248,250,250,0.95); - -$empty-playlist-color: rgba(200,200,200,0.7); -$empty-playlist-shadow: 2px 1px rgb(235,235,235); -$playlist-controls-bg: rgba(247,247,247,0.95); -$playlist-controls-border: $default-border-2; - -$move-mode-track-border: 3px dotted rgb(216,156,136); -$move-mode-track-bg: rgba(216,156,136,0.3); - -$search-modal-footer-border: 1px solid #ccc; - -$info-modal-row-border: 1px solid #ddd; -$info-modal-attr-color: #777; -$track-info-hover-color: rgb(46,190,110); -$filter-bar-shadow: 0 2.5px 4px 0 #bbb; - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/music.snapcast/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/music.snapcast/index.scss deleted file mode 100644 index 53137142..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/music.snapcast/index.scss +++ /dev/null @@ -1,153 +0,0 @@ -@import 'common/vars'; -@import 'common/mixins'; -@import 'common/layout'; - -$host-border: $default-border-2; -$host-shadow: $default-shadow; - -.music-snapcast-container { - .host { - width: 95%; - margin: 2rem auto; - border: $host-border; - border-radius: 1rem; - box-shadow: $host-shadow; - - .head { - padding: 1rem .5rem; - background: $default-bg-4; - border-bottom: $host-border; - border-radius: 1rem 1rem 0 0; - display: flex; - align-items: center; - - .name { - padding-left: .5rem; - text-transform: uppercase; - - &:hover { - color: $default-hover-fg; - cursor: pointer; - } - } - - button { - padding: 0; - border: 0; - &:hover { color: $default-hover-fg; } - } - } - - .group { - .head { - background: $default-bg-5; - border-radius: 0; - } - - .head, - .client { - padding: 0 1rem; - } - - .client { - display: flex; - align-items: center; - - &.offline { color: $default-fg-3; } - &:hover { background: $hover-bg; } - - .name { - &:hover { - color: $default-hover-fg; - cursor: pointer; - } - } - } - } - - .icon { margin-right: 1rem; } - } - - .modal { - .info { - padding: 2rem; - - .section { - border: $default-border-2; - border-radius: 1rem; - &:not(last-child) { margin-bottom: 2rem; } - - .title { - border-bottom: $default-border-2; - padding: 1rem; - text-transform: uppercase; - } - - &.clients .row { - padding: .5rem; - - label { - margin: 0 0 0 .5rem; - } - } - } - - .row { - padding: .33rem .5rem; - border-radius: .75rem; - display: flex; - align-items: center; - - &:nth-child(odd) { background: rgba(255, 255, 255, 0.0); } - &:nth-child(even) { background: $default-bg-3; } - &:hover { background: $hover-bg; } - - .label { font-weight: bold; } - .value { text-align: right; } - } - } - } -} - -#music-snapcast-client-info { - .info { - .buttons { - background: initial; - margin-top: 1.5rem; - padding-top: 1.5rem; - border-top: $default-border-2; - display: flex; - justify-content: center; - - button { - color: #900; - border-color: #900; - } - } - } -} - -@media #{map-get($widths, 's')} { - .music-snapcast-container { - .modal { - width: 80vw; - } - } -} - -@media #{map-get($widths, 'm')} { - .music-snapcast-container { - .modal { - width: 70vw; - } - } -} - -@media #{map-get($widths, 'l')} { - .music-snapcast-container { - .modal { - width: 45vw; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/sensors/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/sensors/index.scss deleted file mode 100644 index 183cd0d6..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/sensors/index.scss +++ /dev/null @@ -1,36 +0,0 @@ -@import 'common/vars'; - -.sensors { - .head { - text-align: right; - - button { - border: 0; - &:hover { background: $hover-bg; } - } - } - - .body { - display: flex; - flex-direction: column; - margin: 2rem auto; - width: 80%; - - .metric { - margin-bottom: .75rem; - padding: 2rem; - border: $default-border-3; - border-radius: 2rem; - - &:nth-child(odd) { background: rgba(255, 255, 255, 0.0); } - &:nth-child(even) { background: $default-bg-3; } - &:hover { background: $hover-bg; } - - .value { - text-align: right; - font-weight: bold; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/sound/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/sound/index.scss deleted file mode 100644 index 2c8f9def..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/sound/index.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import 'common/vars'; - -.sound { - height: 90%; - margin-top: 7%; - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; - - .sound-container { - margin-bottom: 1em; - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/switches/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/switches/index.scss deleted file mode 100644 index ac90599e..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/switches/index.scss +++ /dev/null @@ -1,34 +0,0 @@ -@import 'common/vars'; - -$head-bg: #e8e8e8; - -.switches-root { - .switch-root { - .head { - padding: 1rem .5rem; - background: $head-bg; - border-top: $default-border-2; - border-bottom: $default-border-2; - text-transform: uppercase; - } - - .switches { - display: flex; - flex-direction: column; - padding: 1rem; - } - - .device { - display: flex; - align-items: center; - - .toggle { - text-align: right; - } - - &:hover { background: $hover-bg; } - &:not(:last-child) { border-bottom: $default-border-2; } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/tts.google/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/tts.google/index.scss deleted file mode 120000 index 867ef5c6..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/tts.google/index.scss +++ /dev/null @@ -1 +0,0 @@ -../tts/index.scss \ No newline at end of file diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/tts/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/tts/index.scss deleted file mode 100644 index ed059b99..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/tts/index.scss +++ /dev/null @@ -1,32 +0,0 @@ -@import 'common/vars'; - -.tts-container { - max-width: 80rem; - min-height: 10rem; - margin: 3rem auto; - display: flex; - align-items: center; - justify-content: center; - border: $default-border-2; - border-radius: 3rem; - - form { - margin: 0; - width: 90%; - - input[type=text] { - width: 100%; - } - - button { - border-radius: 5rem; - } - - input, button { - &:hover { - border-color: $default-hover-fg; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/tv.samsung.ws/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/tv.samsung.ws/index.scss deleted file mode 100644 index aa73ed1d..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/tv.samsung.ws/index.scss +++ /dev/null @@ -1,73 +0,0 @@ -@import 'common/vars'; - -.tv-samsung-ws-container { - height: 100%; - display: flex; - justify-content: center; - - .controls { - max-width: 500px; - height: calc(100% - .15em); - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - padding: 0 1em; - border: $default-border-2; - border-radius: 2em; - box-shadow: 0 2px 9px 2px #bbb; - - .power { color: red; } - button { margin: .5em 0; } - } - - .rows { - flex-direction: column; - - * { - button { - width: 100%; - } - } - } - - .section { - width: 100%; - display: flex; - margin: 0 0 1.5em 0; - padding: 0 0 1.5em 0; - border-bottom: $default-border-2; - } - - .directions { - flex-direction: column; - - * { - button { - width: 5em; - height: 4em; - } - } - } - - .volume, .channel { - text-align: center; - } - - .colors { - text-align: center; - - .color { - width: 3em; - height: 3em; - padding: 0; - border-radius: 2em; - - &.red { background: red; } - &.green { background: green; } - &.yellow { background: yellow; } - &.blue { background: blue; } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/zigbee.mqtt/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/zigbee.mqtt/index.scss deleted file mode 100644 index 28293469..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/zigbee.mqtt/index.scss +++ /dev/null @@ -1,264 +0,0 @@ -@import 'common/vars'; -@import 'webpanel/plugins/zigbee.mqtt/vars'; - -.fa.fa-zigbee:before { - content: ' '; - background: url('/static/img/icons/zigbee-logo.svg'); - background-size: 1em 1em; - width: 1em; - height: 1em; - display: inline-block; -} - -.zigbee-container { - height: 100%; - padding: 0 .5em; - background: $container-bg; - display: flex; - flex-direction: column; - align-items: center; - overflow: auto; - - .no-items { - padding: 2em; - font-size: 1.5em; - color: $no-items-color; - display: flex; - align-items: center; - justify-content: center; - } - - .view-options { - display: flex; - width: 100%; - justify-content: space-between; - padding: 1em 0; - - .view-selector { - display: inline-flex; - } - - .buttons { - display: inline-flex; - } - - select { - width: 100%; - border-radius: 1em; - } - } - - .btn-default { - border: 0; - padding: 0 1em; - - &:hover { - border: $default-border-2; - border-radius: 1em; - } - } - - - .buttons { - text-align: right; - } - - .view { - min-width: 400pt; - max-width: 750pt; - background: $view-bg; - border: $view-border; - border-radius: 1.5em; - box-shadow: $view-box-shadow; - } - - .item { - &.selected { - box-shadow: $selected-item-box-shadow; - } - - .name { - padding: 1em; - cursor: pointer; - text-transform: uppercase; - letter-spacing: .06em; - - &.selected { - border-radius: 1.5em; - } - } - - &:hover { - background: $hover-bg; - } - - &:not(:last-child) { - border-bottom: $item-border; - } - - &:first-child { - border-radius: 1.5em 1.5em 0 0; - } - - &:last-child { - border-radius: 0 0 1.5em 1.5em; - } - } - - .params { - background: $params-bg; - padding-bottom: 1em; - - .section { - display: flex; - flex-direction: column; - padding: 0 1em; - - &:not(:first-child) { - padding-top: 1em; - } - - .header { - display: flex; - align-items: center; - font-weight: bold; - border-bottom: $param-section-header-border; - } - } - - .row { - display: flex; - align-items: center; - border-radius: 1em; - padding: .3em; - - &:nth-child(even) { - background: $param-even-row-bg; - } - - &:nth-child(odd) { - background: $param-odd-row-bg; - } - - &:hover { - background: $hover-bg; - } - } - - .param-name { - display: inline-flex; - width: 40%; - margin-left: 1%; - vertical-align: top; - letter-spacing: .04em; - } - - .param-value { - display: inline-block; - width: 58%; - text-align: right; - - .value-edit { - display: flex; - align-items: center; - } - - .value-data { - display: inline-block; - font-weight: bold; - } - - .slider-container { - display: flex; - align-items: center; - } - - .unit { - font-size: .8em; - margin-left: 1em; - display: inline; - } - - select { - width: 100%; - border-radius: 2em; - } - - .numeric { - input.slider { - text-align: left; - } - - input[type=text] { - text-align: right; - width: 100%; - } - - .row { - background: none; - &:hover { - background: none; - } - } - - .value-min, .value-max { - width: 50%; - font-size: .85em; - opacity: .75; - } - - .value-min { - text-align: left; - } - - .value-max { - text-align: right; - } - } - } - } - - .btn-value-name-edit { - padding: 0; - } - - .modal { - .section { - .header { - background: none; - padding: .5em 0; - } - - .body { - padding: 0; - } - } - - .network-info { - min-width: 600pt; - } - } - - .error { - color: $error-color; - } - - .device, .group { - .actions { - .row { - cursor: pointer; - } - } - - form { - margin-bottom: 0; - } - - .param-value { - input[type=text] { - text-align: right; - } - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/zigbee.mqtt/vars.scss b/platypush/backend/http/static/css/source/webpanel/plugins/zigbee.mqtt/vars.scss deleted file mode 100644 index 798334a2..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/zigbee.mqtt/vars.scss +++ /dev/null @@ -1,13 +0,0 @@ -$container-bg: #f1f1f1; -$view-bg: white; -$view-border: 1px solid #d8d8d8; -$view-box-shadow: 1px 2px 2px #ccc; -$item-border: 1px solid #dddddd; -$no-items-color: #555555; -$params-bg: white; -$param-even-row-bg: #ededed; -$param-odd-row-bg: white; -$param-section-header-border: 1px solid #e8e8e8; -$selected-item-box-shadow: 0 2px 4px 0 #bbb; -$error-color: #aa0000; - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/zwave/index.scss b/platypush/backend/http/static/css/source/webpanel/plugins/zwave/index.scss deleted file mode 100644 index 1bc977ab..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/zwave/index.scss +++ /dev/null @@ -1,258 +0,0 @@ -@import 'common/vars'; -@import 'webpanel/plugins/zwave/vars'; - -.fa.fa-zwave:before { - content: ' '; - background: url('/static/img/icons/z-wave-logo.png'); - background-size: 1em 1em; - width: 1em; - height: 1em; - display: inline-block; -} - -.zwave-container { - height: 100%; - padding: 0 .5em; - background: $container-bg; - display: flex; - flex-direction: column; - align-items: center; - overflow: auto; - - .no-items { - padding: 2em; - font-size: 1.5em; - color: $no-items-color; - display: flex; - align-items: center; - justify-content: center; - } - - .view-options { - display: flex; - width: 100%; - justify-content: space-between; - padding: 1em 0; - - .view-selector { - display: inline-flex; - } - - .buttons { - display: inline-flex; - } - - select { - width: 100%; - border-radius: 1em; - } - } - - .btn-default { - border: 0; - padding: 0 1em; - - &:hover { - border: $default-border-2; - border-radius: 1em; - } - } - - - .buttons { - text-align: right; - } - - .view { - min-width: 400pt; - max-width: 750pt; - background: $view-bg; - border: $view-border; - border-radius: 1.5em; - box-shadow: $view-box-shadow; - } - - .item { - &.selected { - box-shadow: $selected-item-box-shadow; - } - - .name { - padding: 1em; - cursor: pointer; - text-transform: uppercase; - letter-spacing: .06em; - - &.selected { - border-radius: 1.5em; - } - } - - &:hover { - background: $hover-bg; - } - - &:not(:last-child) { - border-bottom: $item-border; - } - - &:first-child { - border-radius: 1.5em 1.5em 0 0; - } - - &:last-child { - border-radius: 0 0 1.5em 1.5em; - } - } - - .params { - background: $params-bg; - padding-bottom: 1em; - - .section { - display: flex; - flex-direction: column; - padding: 0 1em; - - &:not(:first-child) { - padding-top: 1em; - } - - .header { - display: flex; - align-items: center; - font-weight: bold; - border-bottom: $param-section-header-border; - } - } - - .row { - display: flex; - align-items: center; - border-radius: 1em; - padding: .3em; - - &:nth-child(even) { - background: $param-even-row-bg; - } - - &:nth-child(odd) { - background: $param-odd-row-bg; - } - - &:hover { - background: $hover-bg; - } - } - - .param-name { - display: inline-flex; - width: 40%; - margin-left: 1%; - vertical-align: top; - letter-spacing: .04em; - } - - .param-value { - display: inline-block; - width: 58%; - text-align: right; - - .value-edit { - display: flex; - align-items: center; - } - - .value-data { - display: inline-block; - font-weight: bold; - } - - .slider-container { - display: flex; - align-items: center; - } - - .unit { - font-size: .8em; - margin-left: 1em; - display: inline; - } - - select { - width: 100%; - border-radius: 2em; - } - - .numeric { - input.slider { - text-align: left; - } - - input[type=text] { - text-align: right; - width: 100%; - } - - .row { - background: none; - &:hover { - background: none; - } - } - - .value-min, .value-max { - width: 50%; - font-size: .85em; - opacity: .75; - } - - .value-min { - text-align: left; - } - - .value-max { - text-align: right; - } - } - } - } - - .btn-value-name-edit { - padding: 0; - } - - .modal { - .section { - .header { - background: none; - padding: .5em 0; - } - - .body { - padding: 0; - } - } - - .network-info { - min-width: 600pt; - } - } - - .error { - color: $error-color; - } - - .node, .scene { - .actions { - .row { - cursor: pointer; - } - } - - form { - margin-bottom: 0; - } - } -} - diff --git a/platypush/backend/http/static/css/source/webpanel/plugins/zwave/vars.scss b/platypush/backend/http/static/css/source/webpanel/plugins/zwave/vars.scss deleted file mode 100644 index 798334a2..00000000 --- a/platypush/backend/http/static/css/source/webpanel/plugins/zwave/vars.scss +++ /dev/null @@ -1,13 +0,0 @@ -$container-bg: #f1f1f1; -$view-bg: white; -$view-border: 1px solid #d8d8d8; -$view-box-shadow: 1px 2px 2px #ccc; -$item-border: 1px solid #dddddd; -$no-items-color: #555555; -$params-bg: white; -$param-even-row-bg: #ededed; -$param-odd-row-bg: white; -$param-section-header-border: 1px solid #e8e8e8; -$selected-item-box-shadow: 0 2px 4px 0 #bbb; -$error-color: #aa0000; - diff --git a/platypush/backend/http/static/img/icons/z-wave-logo.png b/platypush/backend/http/static/img/icons/z-wave-logo.png deleted file mode 100644 index df9c9550..00000000 Binary files a/platypush/backend/http/static/img/icons/z-wave-logo.png and /dev/null differ diff --git a/platypush/backend/http/static/img/icons/zigbee-logo.svg b/platypush/backend/http/static/img/icons/zigbee-logo.svg deleted file mode 100644 index b7cf73a1..00000000 --- a/platypush/backend/http/static/img/icons/zigbee-logo.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - Zigbee icon - - diff --git a/platypush/backend/http/static/js/api.js b/platypush/backend/http/static/js/api.js deleted file mode 100644 index fc889c5b..00000000 --- a/platypush/backend/http/static/js/api.js +++ /dev/null @@ -1,56 +0,0 @@ -function execute(request, timeout=60000) { - var additionalPayload = {}; - - if (!('target' in request) || !request['target']) { - request['target'] = 'localhost'; - } - - if (!('type' in request) || !request['type']) { - request['type'] = 'request'; - } - - if (window.config.token) { - additionalPayload.headers = { - 'X-Token': window.config.token - }; - } - - if (timeout) { - additionalPayload.timeout = timeout; - } - - return new Promise((resolve, reject) => { - axios.post('/execute', request, additionalPayload) - .then((response) => { - response = response.data.response; - if (!response.errors.length) { - resolve(response.output); - } else { - const error = response.errors[0]; - createNotification({ - text: error, - error: true, - }); - - reject(error); - } - }) - .catch((error) => { - createNotification({ - text: error, - error: true, - }); - - reject(error); - }); - }); -} - -function request(action, args={}, timeout=60000) { - return execute({ - type: 'request', - action: action, - args: args, - }); -} - diff --git a/platypush/backend/http/static/js/application.js b/platypush/backend/http/static/js/application.js deleted file mode 100644 index b8f02e77..00000000 --- a/platypush/backend/http/static/js/application.js +++ /dev/null @@ -1,47 +0,0 @@ -Vue.component('plugin', { - template: '#tmpl-plugin', - props: ['config','tag'], - - data: function() { - return { - selected: false, - }; - }, -}); - -// Declaration of the main vue app -window.vm = new Vue({ - el: '#app', - // Override {{ }} delimiters to prevent clash with Flask templates - delimiters: ['[[',']]'], - - data: function() { - return { - config: window.config, - selectedPlugin: undefined, - now: new Date(), - fullscreen: false, - }; - }, - - methods: { - toggleFullScreen: function() { - toggleFullScreen(); - }, - }, - - created: function() { - let m = window.location.href.match('#([a-zA-Z0-9._]+)$'); - if (m) { - this.selectedPlugin = m[1]; - } - - const self = this; - setInterval(() => { - self.now = new Date(); - }, 1000); - - initEvents(); - }, -}); - diff --git a/platypush/backend/http/static/js/autocomplete.js b/platypush/backend/http/static/js/autocomplete.js deleted file mode 100644 index a57de31e..00000000 --- a/platypush/backend/http/static/js/autocomplete.js +++ /dev/null @@ -1,110 +0,0 @@ -function autocomplete(inp, arr, listener) { - /*the autocomplete function takes two arguments, - the text field element and an array of possible autocompleted values:*/ - var currentFocus; - /*execute a function when someone writes in the text field:*/ - inp.addEventListener("input", function(e) { - var a, b, i, val = this.value; - /*close any already open lists of autocompleted values*/ - closeAllLists(); - if (!val) { return false;} - currentFocus = -1; - /*create a DIV element that will contain the items (values):*/ - a = document.createElement("DIV"); - a.setAttribute("id", this.id + "autocomplete-list"); - a.setAttribute("class", "autocomplete-items"); - /*append the DIV element as a child of the autocomplete container:*/ - this.parentNode.appendChild(a); - /*for each item in the array...*/ - for (i = 0; i < arr.length; i++) { - /*check if the item starts with the same letters as the text field value:*/ - if (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) { - /*create a DIV element for each matching element:*/ - b = document.createElement("DIV"); - /*make the matching letters bold:*/ - b.innerHTML = "" + arr[i].substr(0, val.length) + ""; - b.innerHTML += arr[i].substr(val.length); - /*insert a input field that will hold the current array item's value:*/ - b.innerHTML += ""; - /*execute a function when someone clicks on the item value (DIV element):*/ - b.addEventListener("click", function(e) { - /*insert the value for the autocomplete text field:*/ - inp.value = this.getElementsByTagName("input")[0].value; - /*trigger event listener if any:*/ - if (listener) { - listener(e, inp.value); - } - /*close the list of autocompleted values, - (or any other open lists of autocompleted values:*/ - closeAllLists(); - }); - a.appendChild(b); - } - } - }); - - inp.addEventListener("keydown", function(e) { - if (e.keyCode == 9) { - /*Reset the list if tab has been pressed*/ - closeAllLists(); - } - }); - - /*execute a function presses a key on the keyboard:*/ - inp.addEventListener("keydown", function(e) { - var x = document.getElementById(this.id + "autocomplete-list"); - if (x) x = x.getElementsByTagName("div"); - if (e.keyCode == 40) { - /*If the arrow DOWN key is pressed, - increase the currentFocus variable:*/ - currentFocus++; - /*and and make the current item more visible:*/ - addActive(x); - } else if (e.keyCode == 38) { //up - /*If the arrow UP key is pressed, - decrease the currentFocus variable:*/ - currentFocus--; - /*and and make the current item more visible:*/ - addActive(x); - } else if (e.keyCode == 13) { - /*If the ENTER key is pressed, prevent the form from being submitted,*/ - if (currentFocus > -1 && x && x.length) { - e.preventDefault(); - /*and simulate a click on the "active" item:*/ - x[currentFocus].click(); - /*and restore the focus on the input element:*/ - this.focus(); - } - } - }); - function addActive(x) { - /*a function to classify an item as "active":*/ - if (!x) return false; - /*start by removing the "active" class on all items:*/ - removeActive(x); - if (currentFocus >= x.length) currentFocus = 0; - if (currentFocus < 0) currentFocus = (x.length - 1); - /*add class "autocomplete-active":*/ - x[currentFocus].classList.add("autocomplete-active"); - } - function removeActive(x) { - /*a function to remove the "active" class from all autocomplete items:*/ - for (var i = 0; i < x.length; i++) { - x[i].classList.remove("autocomplete-active"); - } - } - function closeAllLists(elmnt) { - /*close all autocomplete lists in the document, - except the one passed as an argument:*/ - var x = document.getElementsByClassName("autocomplete-items"); - for (var i = 0; i < x.length; i++) { - if (elmnt != x[i] && elmnt != inp) { - x[i].parentNode.removeChild(x[i]); - } - } -} -/*execute a function when someone clicks in the document:*/ -document.addEventListener("click", function (e) { - closeAllLists(e.target); -}); -} diff --git a/platypush/backend/http/static/js/dashboard.js b/platypush/backend/http/static/js/dashboard.js deleted file mode 100644 index 2bb8857a..00000000 --- a/platypush/backend/http/static/js/dashboard.js +++ /dev/null @@ -1,30 +0,0 @@ -Vue.component('widget', { - template: '#tmpl-widget', - props: ['config','tag'], -}); - -// Declaration of the main vue app -window.vm = new Vue({ - el: '#app', - - props: { - config: { - type: Object, - default: () => window.config, - }, - }, - - data: function() { - return { - iframeModal: { - visible: false, - }, - }; - }, - - created: function() { - initEvents(); - enterFullScreen(); - }, -}); - diff --git a/platypush/backend/http/static/js/elements/common.js b/platypush/backend/http/static/js/elements/common.js deleted file mode 100644 index 48b0505a..00000000 --- a/platypush/backend/http/static/js/elements/common.js +++ /dev/null @@ -1,15 +0,0 @@ -var parseElement = function(element) { - if (element instanceof Object) { - if (element.$el) { - element = element.$el; - } - } else if (element instanceof String || typeof(element) === 'string') { - element = document.getElementById(element); - } else { - console.error('Got unexpected type ' + typeof(element) + ' for DOM element'); - return; - } - - return element; -}; - diff --git a/platypush/backend/http/static/js/elements/dropdown.js b/platypush/backend/http/static/js/elements/dropdown.js deleted file mode 100644 index 292ef325..00000000 --- a/platypush/backend/http/static/js/elements/dropdown.js +++ /dev/null @@ -1,118 +0,0 @@ -Vue.component('dropdown', { - template: '#tmpl-dropdown', - props: { - id: { - type: String, - }, - - visible: { - type: Boolean, - default: false, - }, - - items: { - type: Array, - default: [], - }, - - classes: { - type: Array, - default: () => [], - }, - }, - - methods: { - clicked: function(item) { - if (item.click && !item.disabled) { - item.click(); - } - - if (!item.preventClose) { - closeDropdown(); - } - }, - }, -}); - -let openedDropdown; - -let clickHndl = function(event) { - if (!openedDropdown) { - return; - } - - var element = event.target; - while (element) { - if (element === openedDropdown) { - return; - } - - element = element.parentElement; - } - - // Click outside the dropdown, close it - closeDropdown(); -}; - -function closeDropdown() { - if (!openedDropdown) { - return; - } - - document.removeEventListener('click', clickHndl); - - if (openedDropdown.className.indexOf('hidden') < 0) { - openedDropdown.className = (openedDropdown.className + ' hidden').trim(); - } - - openedDropdown = undefined; -} - -function openDropdown(element) { - element = parseElement(element); - if (!element) { - console.error('Invalid dropdown element'); - return; - } - - event.stopPropagation(); - closeDropdown(); - - if (getComputedStyle(element.parentElement).position === 'relative') { - // Position the dropdown relatively to the parent - element.style.left = (window.event.clientX - element.parentElement.offsetLeft + element.parentElement.scrollLeft) + 'px'; - element.style.top = (window.event.clientY - element.parentElement.offsetTop + element.parentElement.scrollTop) + 'px'; - } else { - // Position the dropdown absolutely on the window - element.style.left = (window.event.clientX + window.scrollX) + 'px'; - element.style.top = (window.event.clientY + window.scrollY) + 'px'; - } - - document.addEventListener('click', clickHndl); - element.className = element.className.split(' ').filter(c => c !== 'hidden').join(' '); - openedDropdown = element; - - const maxLeft = Math.min(window.innerWidth, element.parentElement.clientWidth) + element.parentElement.scrollLeft; - const maxTop = Math.min(window.innerHeight, element.parentElement.clientHeight) + element.parentElement.scrollTop; - - if (element.parentElement.offsetLeft + element.offsetLeft + parseFloat(getComputedStyle(element).width) >= maxLeft) { - if (parseFloat(element.style.left) - parseFloat(getComputedStyle(element).width) >= 0) { - element.style.left = (parseFloat(element.style.left) - parseFloat(getComputedStyle(element).width)) + 'px'; - } - } - - if (element.parentElement.offsetTop + element.offsetTop + parseFloat(getComputedStyle(element).height) >= maxTop) { - if (parseFloat(element.style.top) - parseFloat(getComputedStyle(element).height) >= 0) { - element.style.top = (parseFloat(element.style.top) - parseFloat(getComputedStyle(element).height)) + 'px'; - } - } - - if (parseFloat(element.style.left) < 0) { - element.style.left = 0; - } - - if (parseFloat(element.style.top) < 0) { - element.style.top = 0; - } -} - diff --git a/platypush/backend/http/static/js/elements/modal.js b/platypush/backend/http/static/js/elements/modal.js deleted file mode 100644 index 3a403d9b..00000000 --- a/platypush/backend/http/static/js/elements/modal.js +++ /dev/null @@ -1,106 +0,0 @@ -Vue.component('modal', { - template: '#tmpl-modal', - props: { - id: { - type: String, - }, - - title: { - type: String, - }, - - width: { - type: [Number, String], - }, - - height: { - type: [Number, String], - }, - - // Modal visibility value - value: { - type: Boolean, - default: false, - }, - - timeout: { - type: [Number, String], - }, - - level: { - type: Number, - default: 1, - }, - }, - - data: function() { - return { - timeoutId: undefined, - prevValue: this.value, - }; - }, - - computed: { - zIndex: function() { - return 500 + this.level; - }, - }, - - methods: { - modalClicked: function(event) { - // Close any opened dropdowns before stopping the click propagation - const dropdowns = this.$el.querySelectorAll('.dropdown:not(.hidden)'); - for (const dropdown of dropdowns) { - closeDropdown(dropdown); - } - - event.stopPropagation(); - }, - - modalClose: function() { - event.stopPropagation(); - this.$emit('input', false); - }, - }, - - updated: function() { - if (this.value != this.prevValue) { - this.$emit((this.value ? 'open' : 'close'), this); - this.prevValue = this.value; - } - - if (this.value) { - // Make sure that a newly opened or visible+updated modal always comes to the front - const myZIndex = parseInt(getComputedStyle(this.$el).zIndex); - var maxZIndex = myZIndex; - var outermostModals = []; - - for (const modal of document.querySelectorAll('.modal-container:not(.hidden)')) { - const zIndex = parseInt(getComputedStyle(modal).zIndex); - - if (zIndex > maxZIndex) { - maxZIndex = zIndex; - outermostModals = [modal]; - } else if (zIndex == maxZIndex) { - outermostModals.push(modal); - } - } - - if (outermostModals.indexOf(this.$el) < 0 || outermostModals.length > 1) { - this.$el.style.zIndex = maxZIndex+1; - } - } - - if (this.value && this.timeout && !this.timeoutId) { - var handler = (self) => { - return () => { - self.modalClose(); - self.timeoutId = undefined; - }; - }; - - this.timeoutId = setTimeout(handler(this), 0+this.timeout); - } - }, -}); - diff --git a/platypush/backend/http/static/js/elements/range-slider.js b/platypush/backend/http/static/js/elements/range-slider.js deleted file mode 100644 index d5273412..00000000 --- a/platypush/backend/http/static/js/elements/range-slider.js +++ /dev/null @@ -1,89 +0,0 @@ -Vue.component('range-slider', { - template: '#tmpl-range-slider', - props: ['min','max','value'], - - mounted: function() { - var input = this.$el.querySelector('input[type=range]'); - var supportsMultiple = self.HTMLInputElement && "valueLow" in HTMLInputElement.prototype; - var descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value"); - - if (supportsMultiple || input.classList.contains("multirange")) { - return; - } - - var values = []; - if (Array.isArray(this.value)) { - values = this.value; - } else if (this.value !== null) { - values = this.value.split(","); - } - - var min = +(this.min || 0); - var max = +(this.max || 100); - var ghost = input.cloneNode(); - - input.classList.add("multirange", "original"); - ghost.classList.add("multirange", "ghost"); - - input.value = values[0] !== undefined ? values[0] : min + (max - min) / 2; - ghost.value = values[1] !== undefined ? values[1] : min + (max - min) / 2; - - input.parentNode.insertBefore(ghost, input.nextSibling); - - Object.defineProperty(input, "originalValue", descriptor.get ? descriptor : { - // Fuck you Safari >:( - get: function() { return this.value; }, - set: function(v) { this.value = v; } - }); - - Object.defineProperties(input, { - valueLow: { - get: function() { return Math.min(this.originalValue, ghost.value); }, - set: function(v) { this.originalValue = v; }, - enumerable: true - }, - valueHigh: { - get: function() { return Math.max(this.originalValue, ghost.value); }, - set: function(v) { ghost.value = v; }, - enumerable: true - } - }); - - if (descriptor.get) { - // Again, fuck you Safari - Object.defineProperty(input, "value", { - get: function() { return this.valueLow + "," + this.valueHigh; }, - set: function(v) { - var values = v.split(","); - this.valueLow = values[0]; - this.valueHigh = values[1]; - update(); - }, - enumerable: true - }); - } - - input.oninput = this.changed; - ghost.oninput = this.changed; - - function update() { - ghost.style.setProperty("--low", 100 * ((input.valueLow - min) / (max - min)) + 1 + "%"); - ghost.style.setProperty("--high", 100 * ((input.valueHigh - min) / (max - min)) - 1 + "%"); - } - - input.addEventListener("input", update); - ghost.addEventListener("input", update); - - update(); - }, - - methods: { - changed: function(event) { - const value = this.$el.querySelectorAll('input[type=range]')[0].value - .split(',').map(_ => parseFloat(_)); - - this.$emit('changed', value); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/elements/switch.js b/platypush/backend/http/static/js/elements/switch.js deleted file mode 100644 index ced82ced..00000000 --- a/platypush/backend/http/static/js/elements/switch.js +++ /dev/null @@ -1,15 +0,0 @@ -Vue.component('toggle-switch', { - template: '#tmpl-switch', - props: ['id','value','glow'], - - methods: { - toggled: function(event) { - this.$emit('toggled', { - id: this.id, - value: !this.value, - event: event, - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/events.js b/platypush/backend/http/static/js/events.js deleted file mode 100644 index 13732aa2..00000000 --- a/platypush/backend/http/static/js/events.js +++ /dev/null @@ -1,134 +0,0 @@ -const websocket = { - ws: undefined, - instance: undefined, - pending: false, - opened: false, - timeout: undefined, - reconnectMsecs: 30000, - handlers: {}, -}; - -function initEvents() { - try { - const url_prefix = window.config.has_ssl ? 'wss://' : 'ws://'; - websocket.ws = new WebSocket(url_prefix + window.location.hostname + ':' + window.config.websocket_port); - } catch (err) { - console.error("Websocket initialization error"); - console.log(err); - return; - } - - websocket.pending = true; - - const onWebsocketTimeout = function(self) { - return function() { - console.log('Websocket reconnection timed out, retrying'); - websocket.pending = false; - self.close(); - self.onclose(); - }; - }; - - websocket.timeout = setTimeout( - onWebsocketTimeout(websocket.ws), websocket.reconnectMsecs); - - websocket.ws.onmessage = function(event) { - const handlers = []; - event = event.data; - - if (typeof event === 'string') { - try { - event = JSON.parse(event); - } catch (e) { - console.warn('Received invalid non-JSON event'); - console.warn(event); - } - } - - console.debug(event); - if (event.type !== 'event') { - // Discard non-event messages - return; - } - - if (null in websocket.handlers) { - handlers.push(websocket.handlers[null]); - } - - if (event.args.type in websocket.handlers) { - handlers.push(...websocket.handlers[event.args.type]); - } - - for (const handler of handlers) { - handler(event.args); - } - }; - - websocket.ws.onopen = function(event) { - if (websocket.instance) { - console.log("There's already an opened websocket connection, closing the newly opened one"); - this.onclose = function() {}; - this.close(); - } - - console.log('Websocket connection successful'); - websocket.instance = this; - - if (websocket.pending) { - websocket.pending = false; - } - - if (websocket.timeout) { - clearTimeout(websocket.timeout); - websocket.timeout = undefined; - } - }; - - websocket.ws.onerror = function(event) { - console.error(event); - }; - - websocket.ws.onclose = function(event) { - if (event) { - console.log('Websocket closed - code: ' + event.code + ' - reason: ' + event.reason); - } - - websocket.instance = undefined; - - if (!websocket.pending) { - websocket.pending = true; - initEvents(); - } - }; -} - -function registerEventHandler(handler, ...events) { - if (events.length) { - // Event type filter specified - for (const event of events) { - if (!(event in websocket.handlers)) { - websocket.handlers[event] = []; - } - - websocket.handlers[event].push(handler); - } - } else { - // No event type specified, listen to all events - if (!(null in websocket.handlers)) { - websocket.handlers[null] = []; - } - - websocket.handlers[null].push(handler); - } -} - -function onReady(handler) { - if (document.readyState === "complete" || document.readyState === "loaded") { - handler(); - } else { - document.addEventListener("DOMContentLoaded", () => { - handler(); - }, false); - } -} - diff --git a/platypush/backend/http/static/js/lib/axios.min.js b/platypush/backend/http/static/js/lib/axios.min.js deleted file mode 100644 index 69cc188e..00000000 --- a/platypush/backend/http/static/js/lib/axios.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* axios v0.18.0 | (c) 2018 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(5),u=n(6),a=r(u);a.Axios=s,a.create=function(e){return r(o.merge(u,e))},a.Cancel=n(23),a.CancelToken=n(24),a.isCancel=n(20),a.all=function(e){return Promise.all(e)},a.spread=n(25),e.exports=a,e.exports.default=a},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"[object ArrayBuffer]"===R.call(e)}function i(e){return"undefined"!=typeof FormData&&e instanceof FormData}function s(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function u(e){return"string"==typeof e}function a(e){return"number"==typeof e}function c(e){return"undefined"==typeof e}function f(e){return null!==e&&"object"==typeof e}function p(e){return"[object Date]"===R.call(e)}function d(e){return"[object File]"===R.call(e)}function l(e){return"[object Blob]"===R.call(e)}function h(e){return"[object Function]"===R.call(e)}function m(e){return f(e)&&h(e.pipe)}function y(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function w(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function g(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function v(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n - * @license MIT - */ -e.exports=function(e){return null!=e&&(n(e)||r(e)||!!e._isBuffer)}},function(e,t,n){"use strict";function r(e){this.defaults=e,this.interceptors={request:new s,response:new s}}var o=n(6),i=n(2),s=n(17),u=n(18);r.prototype.request=function(e){"string"==typeof e&&(e=i.merge({url:arguments[0]},arguments[1])),e=i.merge(o,{method:"get"},this.defaults,e),e.method=e.method.toLowerCase();var t=[u,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)n=n.then(t.shift(),t.shift());return n},i.forEach(["delete","get","head","options"],function(e){r.prototype[e]=function(t,n){return this.request(i.merge(n||{},{method:e,url:t}))}}),i.forEach(["post","put","patch"],function(e){r.prototype[e]=function(t,n,r){return this.request(i.merge(r||{},{method:e,url:t,data:n}))}}),e.exports=r},function(e,t,n){"use strict";function r(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}function o(){var e;return"undefined"!=typeof XMLHttpRequest?e=n(8):"undefined"!=typeof process&&(e=n(8)),e}var i=n(2),s=n(7),u={"Content-Type":"application/x-www-form-urlencoded"},a={adapter:o(),transformRequest:[function(e,t){return s(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(r(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(r(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(e){return e>=200&&e<300}};a.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){a.headers[e]={}}),i.forEach(["post","put","patch"],function(e){a.headers[e]=i.merge(u)}),e.exports=a},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(9),i=n(12),s=n(13),u=n(14),a=n(10),c="undefined"!=typeof window&&window.btoa&&window.btoa.bind(window)||n(15);e.exports=function(e){return new Promise(function(t,f){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest,h="onreadystatechange",m=!1;if("undefined"==typeof window||!window.XDomainRequest||"withCredentials"in l||u(e.url)||(l=new window.XDomainRequest,h="onload",m=!0,l.onprogress=function(){},l.ontimeout=function(){}),e.auth){var y=e.auth.username||"",w=e.auth.password||"";d.Authorization="Basic "+c(y+":"+w)}if(l.open(e.method.toUpperCase(),i(e.url,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l[h]=function(){if(l&&(4===l.readyState||m)&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in l?s(l.getAllResponseHeaders()):null,r=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:r,status:1223===l.status?204:l.status,statusText:1223===l.status?"No Content":l.statusText,headers:n,config:e,request:l};o(t,f,i),l=null}},l.onerror=function(){f(a("Network Error",e,null,l)),l=null},l.ontimeout=function(){f(a("timeout of "+e.timeout+"ms exceeded",e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=n(16),v=(e.withCredentials||u(e.url))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;v&&(d[e.xsrfHeaderName]=v)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),e.withCredentials&&(l.withCredentials=!0),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),f(e),l=null)}),void 0===p&&(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(10);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(11);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e}},function(e,t,n){"use strict";function r(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var o=n(2);e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(o.isURLSearchParams(t))i=t.toString();else{var s=[];o.forEach(t,function(e,t){null!==e&&"undefined"!=typeof e&&(o.isArray(e)?t+="[]":e=[e],o.forEach(e,function(e){o.isDate(e)?e=e.toISOString():o.isObject(e)&&(e=JSON.stringify(e)),s.push(r(t)+"="+r(e))}))}),i=s.join("&")}return i&&(e+=(e.indexOf("?")===-1?"?":"&")+i),e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t){"use strict";function n(){this.message="String contains an invalid character"}function r(e){for(var t,r,i=String(e),s="",u=0,a=o;i.charAt(0|u)||(a="=",u%1);s+=a.charAt(63&t>>8-u%1*8)){if(r=i.charCodeAt(u+=.75),r>255)throw new n;t=t<<8|r}return s}var o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";n.prototype=new Error,n.prototype.code=5,n.prototype.name="InvalidCharacterError",e.exports=r},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var u=[];u.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&u.push("expires="+new Date(n).toGMTString()),r.isString(o)&&u.push("path="+o),r.isString(i)&&u.push("domain="+i),s===!0&&u.push("secure"),document.cookie=u.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";function r(){this.handlers=[]}var o=n(2);r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(e){o.forEach(this.handlers,function(t){null!==t&&e(t)})},e.exports=r},function(e,t,n){"use strict";function r(e){e.cancelToken&&e.cancelToken.throwIfRequested()}var o=n(2),i=n(19),s=n(20),u=n(6),a=n(21),c=n(22);e.exports=function(e){r(e),e.baseURL&&!a(e.url)&&(e.url=c(e.baseURL,e.url)),e.headers=e.headers||{},e.data=i(e.data,e.headers,e.transformRequest),e.headers=o.merge(e.headers.common||{},e.headers[e.method]||{},e.headers||{}),o.forEach(["delete","get","head","post","put","patch","common"],function(t){delete e.headers[t]});var t=e.adapter||u.adapter;return t(e).then(function(t){return r(e),t.data=i(t.data,t.headers,e.transformResponse),t},function(t){return s(t)||(r(e),t&&t.response&&(t.response.data=i(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)})}},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t,n){return r.forEach(n,function(n){e=n(e,t)}),e}},function(e,t){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/platypush/backend/http/static/js/lib/vue.min.js b/platypush/backend/http/static/js/lib/vue.min.js deleted file mode 100644 index 087ee42c..00000000 --- a/platypush/backend/http/static/js/lib/vue.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Vue.js v2.6.10 - * (c) 2014-2019 Evan You - * Released under the MIT License. - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vue=t()}(this,function(){"use strict";var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function r(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function o(e){return null!==e&&"object"==typeof e}var a=Object.prototype.toString;function s(e){return"[object Object]"===a.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function l(e){return null==e?"":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():""})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\B([A-Z])/g,C=g(function(e){return e.replace(w,"-$1").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf("edge/")>0,G=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===K),X=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),Y={}.watch,Q=!1;if(z)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Q=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!z&&!V&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,oe="undefined"!=typeof Symbol&&re(Symbol)&&"undefined"!=typeof Reflect&&re(Reflect.ownKeys);ie="undefined"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,"default"))a=!1;else if(""===a||a===C(e)){var c=Pe(String,i.type);(c<0||s0&&(st((u=e(u,(a||"")+"_"+c))[0])&&st(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?st(f)?s[l]=he(f.text+u):""!==u&&s.push(he(u)):st(u)&&st(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key="__vlist"+a+"_"+c+"__"),s.push(u)));return s}(e):void 0}function st(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=pt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=dt(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,"$stable",a),R(i,"$key",s),R(i,"$hasNormal",o),i}function pt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:at(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function dt(e,t){return function(){return e[t]}}function vt(e,t){var r,i,a,s,c;if(Array.isArray(e)||"string"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent("Event").timeStamp&&(sn=function(){return cn.now()})}function un(){var e,t;for(an=sn(),rn=!0,Qt.sort(function(e,t){return e.id-t.id}),on=0;onon&&Qt[n].id>e.id;)n--;Qt.splice(n+1,0,e)}else Qt.push(e);nn||(nn=!0,Ye(un))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var pn={enumerable:!0,configurable:!0,get:S,set:S};function dn(e,t,n){pn.get=function(){return this[t][n]},pn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,pn)}function vn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);xe(r,o,a),o in e||dn(e,"_props",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data="function"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return Re(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&dn(e,"_data",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new fn(e,a||S,S,hn)),i in e||mn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===a.call(n)&&e.test(t));var n}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=xn(a.componentOptions);s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=bn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De($n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&qt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=ut(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Pt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Pt(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,"$attrs",o&&o.attrs||e,null,!0),xe(t,"$listeners",n._parentListeners||e,null,!0)}(n),Yt(n,"beforeCreate"),function(e){var t=ct(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),vn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Yt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return _n(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Re(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;iparseInt(this.max)&&On(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Ye,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),M.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,A(e.options.components,Tn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Cn(e),function(e){M.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(wn),Object.defineProperty(wn.prototype,"$isServer",{get:te}),Object.defineProperty(wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,"FunctionalRenderContext",{value:Tt}),wn.version="2.6.10";var En=p("style,class"),Nn=p("input,textarea,option,select,progress"),jn=function(e,t,n){return"value"===n&&Nn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Dn=p("contenteditable,draggable,spellcheck"),Ln=p("events,caret,typing,plaintext-only"),Mn=function(e,t){return Hn(t)||"false"===t?"false":"contenteditable"===e&&Ln(t)?t:"true"},In=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Fn="http://www.w3.org/1999/xlink",Pn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Rn=function(e){return Pn(e)?e.slice(6,e.length):""},Hn=function(e){return null==e||!1===e};function Bn(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Un(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Un(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Vn(t));return""}(t.staticClass,t.class)}function Un(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function Vn(e){return Array.isArray(e)?function(e){for(var t,r="",i=0,o=e.length;i-1?hr(e,t,n):In(t)?Hn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Dn(t)?e.setAttribute(t,Mn(t,n)):Pn(t)?Hn(n)?e.removeAttributeNS(Fn,Rn(t)):e.setAttributeNS(Fn,t,n):hr(e,t,n)}function hr(e,t,n){if(Hn(n))e.removeAttribute(t);else{if(q&&!W&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var mr={create:dr,update:dr};function yr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Bn(r),c=i._transitionClasses;n(c)&&(s=zn(s,Vn(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}var gr,_r,br,$r,wr,Cr,xr={create:yr,update:yr},kr=/[\w).+\-_$\]]/;function Ar(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=e.charAt(v));v--);h&&kr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,$r),key:'"'+e.slice($r+1)+'"'}:{exp:e,key:null};_r=e,$r=wr=Cr=0;for(;!zr();)Vr(br=Ur())?Jr(br):91===br&&Kr(br);return{exp:e.slice(0,wr),key:e.slice(wr+1,Cr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Ur(){return _r.charCodeAt(++$r)}function zr(){return $r>=gr}function Vr(e){return 34===e||39===e}function Kr(e){var t=1;for(wr=$r;!zr();)if(Vr(e=Ur()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){Cr=$r;break}}function Jr(e){for(var t=e;!zr()&&(e=Ur())!==t;);}var qr,Wr="__r",Zr="__c";function Gr(e,t,n){var r=qr;return function i(){null!==t.apply(null,arguments)&&Qr(e,i,n,r)}}var Xr=Ve&&!(X&&Number(X[1])<=53);function Yr(e,t,n,r){if(Xr){var i=an,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}qr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function Qr(e,t,n,r){(r||qr).removeEventListener(e,t._wrapper||t,n)}function ei(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};qr=r.elm,function(e){if(n(e[Wr])){var t=q?"change":"input";e[t]=[].concat(e[Wr],e[t]||[]),delete e[Wr]}n(e[Zr])&&(e.change=[].concat(e[Zr],e.change||[]),delete e[Zr])}(i),rt(i,o,Yr,Qr,Gr,r.context),qr=void 0}}var ti,ni={create:ei,update:ei};function ri(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]="");for(i in c){if(o=c[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i&&"PROGRESS"!==a.tagName){a._value=o;var u=t(o)?"":String(o);ii(a,u)&&(a.value=u)}else if("innerHTML"===i&&qn(a.tagName)&&t(a.innerHTML)){(ti=ti||document.createElement("div")).innerHTML=""+o+"";for(var l=ti.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function ii(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var oi={create:ri,update:ri},ai=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function si(e){var t=ci(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ci(e){return Array.isArray(e)?O(e):"string"==typeof e?ai(e):e}var ui,li=/^--/,fi=/\s*!important$/,pi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(fi.test(n))e.style.setProperty(C(t),n.replace(fi,""),"important");else{var r=vi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(yi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(yi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function bi(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&A(t,$i(e.name||"v")),A(t,e),t}return"string"==typeof e?$i(e):void 0}}var $i=g(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),wi=z&&!W,Ci="transition",xi="animation",ki="transition",Ai="transitionend",Oi="animation",Si="animationend";wi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ki="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi="WebkitAnimation",Si="webkitAnimationEnd"));var Ti=z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ti(function(){Ti(e)})}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gi(e,t))}function ji(e,t){e._transitionClasses&&h(e._transitionClasses,t),_i(e,t)}function Di(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ci?Ai:Si,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ci,l=a,f=o.length):t===xi?u>0&&(n=xi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ci:xi:null)?n===Ci?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ci&&Li.test(r[ki+"Property"])}}function Ii(e,t){for(;e.length1}function Ui(e,t){!0!==t.data.show&&Pi(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(0,r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,o)):n(h)?$(0,h,0,h.length-1):n(e.text)&&u.setTextContent(p,""):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(N(Wi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function qi(e,t){return t.every(function(t){return!N(t,e)})}function Wi(e){return"_value"in e?e._value:e.value}function Zi(e){e.target.composing=!0}function Gi(e){e.target.composing&&(e.target.composing=!1,Xi(e.target,"input"))}function Xi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Yi(e){return!e.componentInstance||e.data&&e.data.transition?e:Yi(e.componentInstance._vnode)}var Qi={model:Vi,show:{bind:function(e,t,n){var r=t.value,i=(n=Yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,Pi(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Yi(n)).data&&n.data.transition?(n.data.show=!0,r?Pi(n,function(){e.style.display=e.__vOriginalDisplay}):Ri(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},eo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function to(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?to(zt(t.children)):e}function no(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function ro(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var io=function(e){return e.tag||Ut(e)},oo=function(e){return"show"===e.name},ao={name:"transition",props:eo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(io)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=to(o);if(!a)return o;if(this._leaving)return ro(e,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=no(this),u=this._vnode,l=to(u);if(a.data.directives&&a.data.directives.some(oo)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!Ut(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if("out-in"===r)return this._leaving=!0,it(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),ro(e,o);if("in-out"===r){if(Ut(a))return u;var p,d=function(){p()};it(c,"afterEnter",d),it(c,"enterCancelled",d),it(f,"delayLeave",function(e){p=e})}}return o}}},so=A({tag:String,moveClass:String},eo);function co(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function uo(e){e.data.newPos=e.elm.getBoundingClientRect()}function lo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete so.mode;var fo={Transition:ao,TransitionGroup:{props:so,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Zt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=no(this),s=0;s-1?Gn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Gn[e]=/HTMLUnknownElement/.test(t.toString())},A(wn.options.directives,Qi),A(wn.options.components,fo),wn.prototype.__patch__=z?zi:S,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Yt(e,"beforeMount"),r=function(){e._update(e._render(),n)},new fn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Yt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Yt(e,"mounted")),e}(this,e=e&&z?Yn(e):void 0,t)},z&&setTimeout(function(){F.devtools&&ne&&ne.emit("init",wn)},0);var po=/\{\{((?:.|\r?\n)+?)\}\}/g,vo=/[-.*+?^${}()|[\]\/\\]/g,ho=g(function(e){var t=e[0].replace(vo,"\\$&"),n=e[1].replace(vo,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var mo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Fr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Ir(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var yo,go={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Fr(e,"style");n&&(e.staticStyle=JSON.stringify(ai(n)));var r=Ir(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},_o=function(e){return(yo=yo||document.createElement("div")).innerHTML=e,yo.textContent},bo=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),$o=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),wo=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Co=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,xo=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+P.source+"]*",Ao="((?:"+ko+"\\:)?"+ko+")",Oo=new RegExp("^<"+Ao),So=/^\s*(\/?)>/,To=new RegExp("^<\\/"+Ao+"[^>]*>"),Eo=/^]+>/i,No=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Io=/&(?:lt|gt|quot|amp|#39);/g,Fo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Po=p("pre,textarea",!0),Ro=function(e,t){return e&&Po(e)&&"\n"===t[0]};function Ho(e,t){var n=t?Fo:Io;return e.replace(n,function(e){return Mo[e]})}var Bo,Uo,zo,Vo,Ko,Jo,qo,Wo,Zo=/^@|^v-on:/,Go=/^v-|^@|^:/,Xo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Yo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Qo=/^\(|\)$/g,ea=/^\[.*\]$/,ta=/:(.*)$/,na=/^:|^\.|^v-bind:/,ra=/\.[^.\]]+(?=[^\]]*$)/g,ia=/^v-slot(:|$)|^#/,oa=/[\r\n]/,aa=/\s+/g,sa=g(_o),ca="_empty_";function ua(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ma(t),rawAttrsMap:{},parent:n,children:[]}}function la(e,t){Bo=t.warn||Sr,Jo=t.isPreTag||T,qo=t.mustUseProp||T,Wo=t.getTagNamespace||T;t.isReservedTag;zo=Tr(t.modules,"transformNode"),Vo=Tr(t.modules,"preTransformNode"),Ko=Tr(t.modules,"postTransformNode"),Uo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=fa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&da(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&da(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),Jo(e.tag)&&(c=!1);for(var f=0;f]*>)","i")),p=e.replace(f,function(e,n,r){return u=r.length,Do(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Ro(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf("<");if(0===d){if(No.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(jo.test(e)){var h=e.indexOf("]>");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(To);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ro(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(To.test($)||Oo.test($)||No.test($)||jo.test($)||(w=$.indexOf("<",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(Oo);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(So))&&(r=e.match(xo)||e.match(Co));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&("p"===r&&wo(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Bo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Wo(e);q&&"svg"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Ar(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Mr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Br(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Br(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Br(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Ir(e,"value")||"null";Er(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Mr(e,"change",Br(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Wr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Br(t,l);c&&(f="if($event.target.composing)return;"+f),Er(e,"value","("+t+")"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,"blur","$forceUpdate()")}(e,r,i);else if(!F.isReservedTag(o))return Hr(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Er(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:bo,mustUseProp:jn,canBeLeftOpenTag:$o,isReservedTag:Wn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}(ba)},xa=g(function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function ka(e,t){e&&($a=xa(t.staticKeys||""),wa=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!wa(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every($a)))}(t);if(1===t.type){if(!wa(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n|^function\s*(?:[\w$]+)?\s*\(/,Oa=/\([^)]*?\);*$/,Sa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Ta={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Na=function(e){return"if("+e+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Na("$event.target !== $event.currentTarget"),ctrl:Na("!$event.ctrlKey"),shift:Na("!$event.shiftKey"),alt:Na("!$event.altKey"),meta:Na("!$event.metaKey"),left:Na("'button' in $event && $event.button !== 0"),middle:Na("'button' in $event && $event.button !== 1"),right:Na("'button' in $event && $event.button !== 2")};function Da(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=La(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function La(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return La(e)}).join(",")+"]";var t=Sa.test(e.value),n=Aa.test(e.value),r=Sa.test(e.value.replace(Oa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Ta[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=Na(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ma).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ma(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Ta[e],r=Ea[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ia={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:S},Fa=function(e){this.options=e,this.warn=e.warn||Sr,this.transforms=Tr(e.modules,"transformCode"),this.dataGenFns=Tr(e.modules,"genData"),this.directives=A(A({},Ia),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Pa(e,t){var n=new Fa(t);return{render:"with(this){return "+(e?Ra(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ra(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ha(e,t);if(e.once&&!e.onceProcessed)return Ba(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Ua(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=qa(e,t),i="_t("+n+(r?","+r:""),o=e.attrs||e.dynamicAttrs?Ga((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:qa(t,n,!0);return"_c("+e+","+Va(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Va(e,t));var i=e.inlineTemplate?null:qa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Pa(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ga(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ka(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ka))}function Ja(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ua(e,t,Ja,"null");if(e.for&&!e.forProcessed)return za(e,t,Ja);var r=e.slotScope===ca?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(qa(e,t)||"undefined")+":undefined":qa(e,t)||"undefined":Ra(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Ra)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
',ts.innerHTML.indexOf(" ")>0}var os=!!z&&is(!1),as=!!z&&is(!0),ss=g(function(e){var t=Yn(e);return t&&t.innerHTML}),cs=wn.prototype.$mount;return wn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ss(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=rs(r,{outputSourceRange:!1,shouldDecodeNewlines:os,shouldDecodeNewlinesForHref:as,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return cs.call(this,e,t)},wn.compile=rs,wn}); \ No newline at end of file diff --git a/platypush/backend/http/static/js/notifications.js b/platypush/backend/http/static/js/notifications.js deleted file mode 100644 index 8b8b1767..00000000 --- a/platypush/backend/http/static/js/notifications.js +++ /dev/null @@ -1,63 +0,0 @@ -Vue.component('notifications', { - template: '#tmpl-notifications', - props: { - duration: { - // Default notification duration in milliseconds - type: Number, - default: 10000, - } - }, - - data: function() { - return { - index: 0, - notifications: {}, - timeouts: {}, - }; - }, - - methods: { - create: function(args) { - var id = this.index++; - Vue.set(this.notifications, id, args); - - if (args.duration == null) { - args.duration = this.duration; - } - - if (args.duration != 0) { - this.timeouts[id] = setTimeout(this.destroy.bind(null, id), args.duration); - } - }, - - destroy: function(id) { - Vue.delete(this.notifications, id); - delete this.timeouts[id]; - }, - }, -}); - -Vue.component('notification', { - template: '#tmpl-notification', - props: ['id','text','html','title','image','link','error','warning'], - - methods: { - mousein: function(event) { - }, - - mouseout: function(event) { - }, - clicked: function(event) { - if (this.link) { - window.open(this.link, '_blank'); - } - - this.$emit('clicked', this.id); - }, - }, -}); - -function createNotification(args) { - window.vm.$refs.notifications.create(args); -} - diff --git a/platypush/backend/http/static/js/plugins/assistant.google/index.js b/platypush/backend/http/static/js/plugins/assistant.google/index.js deleted file mode 100644 index 24e39d9d..00000000 --- a/platypush/backend/http/static/js/plugins/assistant.google/index.js +++ /dev/null @@ -1,124 +0,0 @@ -const Assistant = Vue.extend({ - template: ` - -
- - - - -
- -
-
- Assistant listening -
-
- -
-
- -
-
-
- `, - - data: function() { - return { - responseText: '', - phrase: '', - visible: false, - hideTimeout: undefined, - - state: { - listening: false, - speechRecognized: false, - responding: false, - alerting: false, - }, - }; - }, - - methods: { - reset: function() { - this.state.listening = false; - this.state.speechRecognized = false; - this.state.responding = false; - this.state.alerting = false; - this.phrase = ''; - this.responseText = ''; - }, - - conversationStart: function() { - this.reset(); - this.state.listening = true; - this.visible = true; - - if (this.hideTimeout) { - clearTimeout(this.hideTimeout); - this.hideTimeout = undefined; - } - }, - - conversationEnd: function() { - const self = this; - - this.hideTimeout = setTimeout(() => { - this.reset(); - self.visible = false; - self.hideTimeout = undefined; - }, 4000); - }, - - speechRecognized: function(event) { - this.reset(); - this.state.speechRecognized = true; - this.phrase = event.phrase; - this.visible = true; - }, - - response: function(event) { - this.reset(); - this.state.responding = true; - this.responseText = event.response_text; - this.visible = true; - }, - - alertOn: function() { - this.reset(); - this.state.alerting = true; - this.visible = true; - }, - - alertOff: function() { - this.reset(); - this.state.alerting = false; - this.visible = false; - }, - - registerHandlers: function() { - registerEventHandler(this.conversationStart, 'platypush.message.event.assistant.ConversationStartEvent'); - registerEventHandler(this.alertOn, 'platypush.message.event.assistant.AlertStartedEvent'); - registerEventHandler(this.alertOff, 'platypush.message.event.assistant.AlertEndEvent'); - registerEventHandler(this.speechRecognized, 'platypush.message.event.assistant.SpeechRecognizedEvent'); - registerEventHandler(this.response, 'platypush.message.event.assistant.ResponseEvent'); - registerEventHandler(this.conversationEnd, 'platypush.message.event.assistant.ConversationEndEvent'); - registerEventHandler(this.conversationEnd, 'platypush.message.event.assistant.NoResponseEvent'); - registerEventHandler(this.conversationEnd, 'platypush.message.event.assistant.ConversationTimeoutEvent'); - }, - }, - - mounted: function() { - this.registerHandlers(); - }, -}); - -onReady(() => { - const container = document.createElement('div'); - const containerId = 'assistant-google-container'; - - container.setAttribute('id', containerId); - document.querySelector('#app').appendChild(container); - - new Assistant().$mount('#' + containerId); -}); - diff --git a/platypush/backend/http/static/js/plugins/camera.android.ipcam/index.js b/platypush/backend/http/static/js/plugins/camera.android.ipcam/index.js deleted file mode 100644 index 565fd506..00000000 --- a/platypush/backend/http/static/js/plugins/camera.android.ipcam/index.js +++ /dev/null @@ -1,113 +0,0 @@ -Vue.component('camera-android-ipcam', { - template: '#tmpl-camera-android-ipcam', - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - loading: false, - streaming: false, - capturing: false, - recording: false, - cameras: {}, - selectedCamera: undefined, - }; - }, - - computed: { - hasMultipleCameras: function () { - return Object.keys(this.cameras).length > 1; - }, - }, - - methods: { - startStreaming: function() { - if (this.streaming) - return; - - const cam = this.cameras[this.selectedCamera]; - this.streaming = true; - this.capturing = false; - this.$refs.frame.setAttribute('src', cam.stream_url); - }, - - stopStreaming: function() { - if (!this.streaming) - return; - - this.streaming = false; - this.capturing = false; - this.$refs.frame.removeAttribute('src'); - }, - - capture: function() { - if (this.capturing) - return; - - const cam = this.cameras[this.selectedCamera]; - this.streaming = false; - this.capturing = true; - this.$refs.frame.setAttribute('src', cam.image_url + '?t=' + (new Date()).getTime()); - }, - - onFrameLoaded: function(event) { - if (this.capturing) - this.capturing = false; - }, - - onCameraSelected: function(event) { - this.selectedCamera = event.target.value; - }, - - flipCamera: async function() { - const cam = this.cameras[this.selectedCamera]; - this.loading = true; - - try { - const value = !cam.ffc; - await request('camera.android.ipcam.set_front_facing_camera', { - activate: value, camera: cam.name - }); - - this.cameras[this.selectedCamera].ffc = value; - } finally { - this.loading = false; - } - }, - - updateCameraStatus: async function() { - this.loading = true; - - try { - const cameras = await request('camera.android.ipcam.status'); - this.cameras = cameras.reduce((cameras, cam) => { - for (const attr of ['stream_url', 'image_url', 'audio_url']) { - if (cam[attr].startsWith('https://')) { - cam[attr] = cam[attr].replace('https://', 'http://'); - } - - if (cam.name in this.config.cameras && this.config.cameras[cam.name].username) { - cam[attr] = 'http://' + this.config.cameras[cam.name].username + ':' + - this.config.cameras[cam.name].password + '@' + cam[attr].substr(7); - } - } - - cameras[cam.name] = cam; - return cameras; - }, {}); - - if (cameras.length) - this.selectedCamera = cameras[0].name; - - } finally { - this.loading = false; - } - }, - }, - - mounted: function() { - this.$refs.frame.addEventListener('load', this.onFrameLoaded); - this.updateCameraStatus(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/camera.cv/index.js b/platypush/backend/http/static/js/plugins/camera.cv/index.js deleted file mode 100644 index 4674c92b..00000000 --- a/platypush/backend/http/static/js/plugins/camera.cv/index.js +++ /dev/null @@ -1,15 +0,0 @@ -Vue.component('camera-cv', { - template: '#tmpl-camera-cv', - mixins: [cameraMixin], - - methods: { - startStreaming: function() { - this._startStreaming('cv'); - }, - - capture: function() { - this._capture('cv'); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/camera.ffmpeg/index.js b/platypush/backend/http/static/js/plugins/camera.ffmpeg/index.js deleted file mode 100644 index 5e8ee321..00000000 --- a/platypush/backend/http/static/js/plugins/camera.ffmpeg/index.js +++ /dev/null @@ -1,15 +0,0 @@ -Vue.component('camera-ffmpeg', { - template: '#tmpl-camera-ffmpeg', - mixins: [cameraMixin], - - methods: { - startStreaming: function() { - this._startStreaming('ffmpeg'); - }, - - capture: function() { - this._capture('ffmpeg'); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/camera.gstreamer/index.js b/platypush/backend/http/static/js/plugins/camera.gstreamer/index.js deleted file mode 100644 index 59afd23b..00000000 --- a/platypush/backend/http/static/js/plugins/camera.gstreamer/index.js +++ /dev/null @@ -1,15 +0,0 @@ -Vue.component('camera-gstreamer', { - template: '#tmpl-camera-gstreamer', - mixins: [cameraMixin], - - methods: { - startStreaming: function() { - this._startStreaming('gstreamer'); - }, - - capture: function() { - this._capture('gstreamer'); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/camera.ir.mlx90640/index.js b/platypush/backend/http/static/js/plugins/camera.ir.mlx90640/index.js deleted file mode 100644 index 2bfc460a..00000000 --- a/platypush/backend/http/static/js/plugins/camera.ir.mlx90640/index.js +++ /dev/null @@ -1,19 +0,0 @@ -Vue.component('camera-ir-mlx90640', { - template: '#tmpl-camera-ir-mlx90640', - mixins: [cameraMixin], - - methods: { - startStreaming: function() { - this._startStreaming('ir.mlx90640'); - }, - - capture: function() { - this._capture('ir.mlx90640'); - }, - }, - - mounted: function() { - this.attrs.resolution = [32, 24]; - } -}); - diff --git a/platypush/backend/http/static/js/plugins/camera.pi/index.js b/platypush/backend/http/static/js/plugins/camera.pi/index.js deleted file mode 100644 index 7341c589..00000000 --- a/platypush/backend/http/static/js/plugins/camera.pi/index.js +++ /dev/null @@ -1,15 +0,0 @@ -Vue.component('camera-pi', { - template: '#tmpl-camera-pi', - mixins: [cameraMixin], - - methods: { - startStreaming: function() { - this._startStreaming('pi'); - }, - - capture: function() { - this._capture('pi'); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/camera/index.js b/platypush/backend/http/static/js/plugins/camera/index.js deleted file mode 100644 index b8d871e5..00000000 --- a/platypush/backend/http/static/js/plugins/camera/index.js +++ /dev/null @@ -1,103 +0,0 @@ -var cameraMixin = { - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - streaming: false, - capturing: false, - showParams: false, - url: null, - attrs: { - resolution: this.config.resolution || [640, 480], - device: this.config.device, - horizontal_flip: this.config.horizontal_flip || 0, - vertical_flip: this.config.vertical_flip || 0, - rotate: this.config.rotate || 0, - scale_x: this.config.scale_x || 1.0, - scale_y: this.config.scale_y || 1.0, - fps: this.config.fps || 16.0, - grayscale: this.config.grayscale || 0, - stream_format: this.config.stream_format || 'mjpeg', - }, - }; - }, - - computed: { - params: function() { - return { - resolution: this.attrs.resolution, - device: this.attrs.device != null && ('' + this.attrs.device).length > 0 ? this.attrs.device : null, - horizontal_flip: parseInt(0 + this.attrs.horizontal_flip), - vertical_flip: parseInt(0 + this.attrs.vertical_flip), - rotate: parseFloat(this.attrs.rotate), - scale_x: parseFloat(this.attrs.scale_x), - scale_y: parseFloat(this.attrs.scale_y), - fps: parseFloat(this.attrs.fps), - grayscale: parseInt(0 + this.attrs.grayscale), - }; - }, - - window: function() { - return window; - }, - }, - - methods: { - getUrl: function(plugin, action) { - return '/camera/' + plugin + '/' + action + '?' + - Object.entries(this.params).filter(([k, v]) => v != null && ('' + v).length > 0) - .map(([k, v]) => k + '=' + v).join('&'); - }, - - _startStreaming: function(plugin) { - if (this.streaming) - return; - - this.streaming = true; - this.capturing = false; - this.url = this.getUrl(plugin, 'video.' + this.attrs.stream_format); - }, - - stopStreaming: function() { - if (!this.streaming) - return; - - this.streaming = false; - this.capturing = false; - this.url = null; - }, - - _capture: function(plugin) { - if (this.capturing) - return; - - this.streaming = false; - this.capturing = true; - this.url = this.getUrl(plugin, 'photo.jpg') + '&t=' + (new Date()).getTime(); - }, - - onFrameLoaded: function(event) { - if (this.capturing) { - this.capturing = false; - } - }, - - onDeviceChanged: function(event) {}, - onFlipChanged: function(event) {}, - onSizeChanged: function(event) { - const degToRad = (deg) => (deg * Math.PI)/180; - const rot = degToRad(this.params.rotate); - this.$refs.frameContainer.style.width = Math.round(this.params.scale_x * Math.abs(this.params.resolution[0] * Math.cos(rot) + this.params.resolution[1] * Math.sin(rot))) + 'px'; - this.$refs.frameContainer.style.height = Math.round(this.params.scale_y * Math.abs(this.params.resolution[0] * Math.sin(rot) + this.params.resolution[1] * Math.cos(rot))) + 'px'; - }, - - onFpsChanged: function(event) {}, - onGrayscaleChanged: function(event) {}, - }, - - mounted: function() { - this.$refs.frame.addEventListener('load', this.onFrameLoaded); - this.onSizeChanged(); - }, -}; diff --git a/platypush/backend/http/static/js/plugins/execute/index.js b/platypush/backend/http/static/js/plugins/execute/index.js deleted file mode 100644 index ffa8b574..00000000 --- a/platypush/backend/http/static/js/plugins/execute/index.js +++ /dev/null @@ -1,215 +0,0 @@ -Vue.component('execute', { - template: '#tmpl-execute', - props: ['config'], - data: function() { - return { - loading: false, - running: false, - structuredInput: true, - actionChanged: false, - selectedDoc: undefined, - selectedProcedure: { - name: undefined, - args: {}, - }, - - response: undefined, - error: undefined, - htmlDoc: false, - rawRequest: undefined, - actions: {}, - plugins: {}, - procedures: {}, - action: { - name: undefined, - args: {}, - extraArgs: [], - supportsExtraArgs: false, - }, - }; - }, - - methods: { - refresh: async function() { - this.loading = true; - this.procedures = window.config.procedures; - this.plugins = await request('inspect.get_all_plugins', {html_doc: true}); - - for (const plugin of Object.values(this.plugins)) { - if (plugin.html_doc) - this.htmlDoc = true; - - for (const action of Object.values(plugin.actions)) { - action.name = plugin.name + '.' + action.name; - action.supportsExtraArgs = !!action.has_kwargs; - delete action.has_kwargs; - this.actions[action.name] = action; - } - } - - const self = this; - autocomplete(this.$refs.actionName, Object.keys(this.actions).sort(), (evt, value) => { - this.action.name = value; - self.updateAction(); - }); - - this.loading = false; - }, - - updateAction: function() { - if (!this.actionChanged || !(this.action.name in this.actions)) - return; - - this.loading = true; - this.action = { - ...this.actions[this.action.name], - args: Object.entries(this.actions[this.action.name].args).reduce((args, entry) => { - args[entry[0]] = { - ...entry[1], - value: entry[1].default, - }; - - return args; - }, {}), - extraArgs: [], - }; - - this.selectedDoc = this.action.doc; - this.actionChanged = false; - this.response = undefined; - this.error = undefined; - this.loading = false; - }, - - updateProcedure: function(name) { - if (event.target.getAttribute('type') === 'submit') { - return; - } - - if (this.selectedProcedure.name === name) { - this.selectedProcedure = { - name: undefined, - args: {}, - }; - - return; - } - - if (!(name in this.procedures)) { - console.warn('Procedure not found: ' + name); - return; - } - - this.selectedProcedure = { - name: name, - args: this.procedures[name].args.reduce((args, arg) => { - args[arg] = undefined; - return args; - }, {}), - }; - }, - - addParameter: function() { - this.action.extraArgs.push({ - name: undefined, - value: undefined, - }) - }, - - removeParameter: function(i) { - this.action.extraArgs.pop(i); - }, - - selectAttrDoc: function(name) { - this.response = undefined; - this.error = undefined; - this.selectedDoc = this.action.args[name].doc; - }, - - resetDoc: function() { - this.response = undefined; - this.error = undefined; - this.selectedDoc = this.action.doc; - }, - - onInputTypeChange: function(structuredInput) { - this.structuredInput = structuredInput; - this.response = undefined; - this.error = undefined; - }, - - onResponse: function(response) { - this.response = '
' + JSON.stringify(response, null, 2) + '
'; - this.error = undefined; - }, - - onError: function(error) { - this.response = undefined; - this.error = '
' + error + '
'; - }, - - onDone: function() { - this.running = false; - }, - - executeAction: function() { - if (!this.action.name && !this.rawRequest || this.running) - return; - - this.running = true; - if (this.structuredInput) { - const args = { - ...Object.entries(this.action.args).reduce((args, param) => { - if (param[1].value != null) { - let value = param[1].value; - try {value = JSON.parse(value);} - catch (e) {} - args[param[0]] = value; - } - return args; - }, {}), - - ...this.action.extraArgs.reduce((args, param) => { - let value = args[param.value]; - try {value = JSON.parse(value);} - catch (e) {} - - args[param.name] = value; - return args; - }, {}) - }; - - request(this.action.name, args).then(this.onResponse).catch(this.onError).finally(this.onDone); - } else { - execute(JSON.parse(this.rawRequest)).then(this.onResponse).catch(this.onError).finally(this.onDone); - } - }, - - executeProcedure: function(event) { - if (!this.selectedProcedure.name || this.running) - return; - - event.stopPropagation(); - this.running = true; - const args = { - ...Object.entries(this.selectedProcedure.args).reduce((args, param) => { - if (param[1] != null) { - let value = param[1]; - try {value = JSON.parse(value);} - catch (e) {} - args[param[0]] = value; - } - return args; - }, {}), - }; - - request('procedure.' + this.selectedProcedure.name, args) - .then(this.onResponse).catch(this.onError).finally(this.onDone); - }, - }, - - created: function() { - this.refresh(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/gpio/index.js b/platypush/backend/http/static/js/plugins/gpio/index.js deleted file mode 100644 index 72d5da84..00000000 --- a/platypush/backend/http/static/js/plugins/gpio/index.js +++ /dev/null @@ -1,35 +0,0 @@ -Vue.component('gpio', { - template: '#tmpl-gpio', - props: ['config'], - - data: function() { - return { - pins: {}, - }; - }, - - methods: { - refresh: async function() { - const pins = await request('gpio.read_all'); - this.pins = pins.reduce((pins, pin) => { - pins[pin.pin] = { - name: pin.name, - number: pin.pin, - on: !!pin.value, - }; - - return pins; - }, {}); - }, - - toggle: async function(pin) { - await request('gpio.write', {pin: pin, value: +(!this.pins[pin].on)}); - this.refresh(); - }, - }, - - mounted: function() { - this.refresh(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/animations.js b/platypush/backend/http/static/js/plugins/light.hue/animations.js deleted file mode 100644 index ed345b34..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/animations.js +++ /dev/null @@ -1,39 +0,0 @@ -Vue.component('light-hue-animations-container', { - template: '#tmpl-light-hue-animations-container', - props: ['groupId','animation','collapsed'], - data: function() { - return { - selectedAnimation: 'color_transition', - }; - }, - - methods: { - animationsCollapsedToggled: function() { - this.$emit('animations-collapsed-toggled', { - type: 'animation', - id: this.groupId, - }); - }, - toggled: async function(event) { - if (event.value) { - var args = { - ...this.$refs[this.selectedAnimation].value, - animation: this.selectedAnimation, - groups: [this.groupId], - } - - await request('light.hue.on', {groups: [this.groupId]}); - await request('light.hue.animate', args); - - this.$emit('animation-started', { - ...this.$refs[this.selectedAnimation].value, - type: this.selectedAnimation, - }); - } else { - await request('light.hue.stop_animation'); - this.$emit('animation-stopped', {}); - } - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/animations/blink.js b/platypush/backend/http/static/js/plugins/light.hue/animations/blink.js deleted file mode 100644 index 51e09f5f..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/animations/blink.js +++ /dev/null @@ -1,28 +0,0 @@ -Vue.component('light-hue-animation-blink', { - template: '#tmpl-light-hue-animation-blink', - data: function() { - return { - value: { - transition_seconds: 1, - duration: undefined, - }, - transitionSecondsRange: [0.1, 60], - durationRange: [0, 600], - }; - }, - - methods: { - onTransitionSecondsChange: function(event) { - this.value.transition_seconds = event.target.value; - }, - onDurationChanged: function(event) { - var value = event.target.value; - if (value == null || value.length === 0 || parseFloat(value) == 0) { - value = undefined; - } - - this.value.duration = value; - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/animations/color_transition.js b/platypush/backend/http/static/js/plugins/light.hue/animations/color_transition.js deleted file mode 100644 index f36c7413..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/animations/color_transition.js +++ /dev/null @@ -1,59 +0,0 @@ -Vue.component('light-hue-animation-color_transition', { - template: '#tmpl-light-hue-animation-color_transition', - data: function() { - return { - value: { - hue_range: [0,65535], - sat_range: [150,255], - bri_range: [190,255], - hue_step: 150, - sat_step: 5, - bri_step: 2, - transition_seconds: 1, - duration: undefined, - }, - }; - }, - - computed: { - hueStepRange: function() { - return [1, parseInt((this.value.hue_range[1]-this.value.hue_range[0])/2)-1]; - }, - satStepRange: function() { - return [1, parseInt((this.value.sat_range[1]-this.value.sat_range[0])/2)-1]; - }, - briStepRange: function() { - return [1, parseInt((this.value.bri_range[1]-this.value.bri_range[0])/2)-1]; - }, - transitionSecondsRange: function() { - return [0.1, 60]; - }, - durationRange: function() { - return [0, 600]; - }, - }, - - methods: { - hueRangeChanged: function(value) { - this.value.hue_range = value; - }, - satRangeChanged: function(value) { - this.value.sat_range = value; - }, - briRangeChanged: function(value) { - this.value.bri_range = value; - }, - onTransitionSecondsChange: function(event) { - this.value.transition_seconds = event.target.value; - }, - onDurationChanged: function(event) { - var value = event.target.value; - if (value == null || value.length === 0 || parseFloat(value) == 0) { - value = undefined; - } - - this.value.duration = value; - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/converter.js b/platypush/backend/http/static/js/plugins/light.hue/converter.js deleted file mode 100644 index a2d531ef..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/converter.js +++ /dev/null @@ -1,106 +0,0 @@ -// Source: https://gist.github.com/uredkar/bd305f2dda9abf5b393d417424777c87#file-cie_rgb_converter-js - -/** - * Converts CIE color space to RGB color space - * @param {Number} x - * @param {Number} y - * @param {Number} brightness - Ranges from 1 to 254 - * @return {Array} Array that contains the color values for red, green and blue - */ -function toRGB(x, y, brightness) { - //Set to maximum brightness if no custom value was given (Not the slick ECMAScript 6 way for compatibility reasons) - if (brightness === undefined) { - brightness = 254; - } - - var z = 1.0 - x - y; - var Y = (brightness / 254).toFixed(2); - var X = (Y / y) * x; - var Z = (Y / y) * z; - - //Convert to RGB using Wide RGB D65 conversion - var red = X * 1.656492 - Y * 0.354851 - Z * 0.255038; - var green = -X * 0.707196 + Y * 1.655397 + Z * 0.036152; - var blue = X * 0.051713 - Y * 0.121364 + Z * 1.011530; - - //If red, green or blue is larger than 1.0 set it back to the maximum of 1.0 - if (red > blue && red > green && red > 1.0) { - - green = green / red; - blue = blue / red; - red = 1.0; - } - else if (green > blue && green > red && green > 1.0) { - - red = red / green; - blue = blue / green; - green = 1.0; - } - else if (blue > red && blue > green && blue > 1.0) { - - red = red / blue; - green = green / blue; - blue = 1.0; - } - - //Reverse gamma correction - red = red <= 0.0031308 ? 12.92 * red : (1.0 + 0.055) * Math.pow(red, (1.0 / 2.4)) - 0.055; - green = green <= 0.0031308 ? 12.92 * green : (1.0 + 0.055) * Math.pow(green, (1.0 / 2.4)) - 0.055; - blue = blue <= 0.0031308 ? 12.92 * blue : (1.0 + 0.055) * Math.pow(blue, (1.0 / 2.4)) - 0.055; - - - //Convert normalized decimal to decimal - red = Math.round(red * 255); - green = Math.round(green * 255); - blue = Math.round(blue * 255); - - if (isNaN(red)) - red = 0; - - if (isNaN(green)) - green = 0; - - if (isNaN(blue)) - blue = 0; - - - return [red, green, blue]; -} - - -/** - * Converts RGB color space to CIE color space - * @param {Number} red - * @param {Number} green - * @param {Number} blue - * @return {Array} Array that contains the CIE color values for x and y - */ -function toXY(red, green, blue) { - if (red > 1) { red /= 255; } - if (green > 1) { green /= 255; } - if (blue > 1) { blue /= 255; } - - //Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device - var red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92); - var green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92); - var blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92); - - //RGB values to XYZ using the Wide RGB D65 conversion formula - var X = red * 0.664511 + green * 0.154324 + blue * 0.162028; - var Y = red * 0.283881 + green * 0.668433 + blue * 0.047685; - var Z = red * 0.000088 + green * 0.072310 + blue * 0.986039; - - //Calculate the xy values from the XYZ values - var x = (X / (X + Y + Z)).toFixed(4); - var y = (Y / (X + Y + Z)).toFixed(4); - - if (isNaN(x)) - x = 0; - - if (isNaN(y)) - y = 0; - - - return [x, y]; -} - diff --git a/platypush/backend/http/static/js/plugins/light.hue/elements.js b/platypush/backend/http/static/js/plugins/light.hue/elements.js deleted file mode 100644 index 0dd084df..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/elements.js +++ /dev/null @@ -1,41 +0,0 @@ -Vue.component('light-hue-property-selector', { - template: '#tmpl-light-hue-property-selector', - props: ['id','value'], - computed: { - rgb: function() { - if (!(this.value && 'xy' in this.value)) { - return; - } - - return toRGB(this.value.xy[0], this.value.xy[1], this.value.bri); - }, - }, - - methods: { - changed: function(event) { - var value = parseInt(event.target.value); - var xy; - - if (event.target.getAttribute('class').split(' ').indexOf('bri') > -1) { - this.$emit('bri-changed', {bri: value}); - return; - } else if (event.target.getAttribute('class').split(' ').indexOf('ct') > -1) { - this.$emit('ct-changed', {ct: value}); - return; - } - - if (event.target.getAttribute('class').split(' ').indexOf('red') > -1) { - xy = toXY(value, this.rgb[1], this.rgb[2]); - } else if (event.target.getAttribute('class').split(' ').indexOf('green') > -1) { - xy = toXY(this.rgb[0], value, this.rgb[2]); - } else if (event.target.getAttribute('class').split(' ').indexOf('blue') > -1) { - xy = toXY(this.rgb[0], this.rgb[1], value); - } else { - return; - } - - this.$emit('color-changed', {xy: xy}); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/groups.js b/platypush/backend/http/static/js/plugins/light.hue/groups.js deleted file mode 100644 index b9b6b19c..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/groups.js +++ /dev/null @@ -1,118 +0,0 @@ -Vue.component('light-hue-group', { - template: '#tmpl-light-hue-group', - props: ['id','name'], -}); - -Vue.component('light-hue-group-controller', { - template: '#tmpl-light-hue-group-controller', - props: ['id','groups','value','collapsed'], - computed: { - lights: function() { - return this.groups[this.id].lights; - }, - - name: function() { - return this.groups[this.id].name; - }, - - properties: function() { - var self = this; - var avg = function(values) { - if (values.length) { - return values.reduce((sum,value) => sum+value) / values.length; - } else { - return 0; - } - }; - - var getLightValues = function(attribute) { - return Object.values(self.lights).map( - light => attribute in light.state && light.state.on ? light.state[attribute] : undefined - ).filter(value => value !== undefined); - }; - - return { - xy: [ - avg(getLightValues('xy').map(_ => parseFloat(_[0]))), - avg(getLightValues('xy').map(_ => parseFloat(_[1]))) - ], - ct: avg(getLightValues('ct')), - bri: avg(getLightValues('bri')), - }; - }, - }, - - methods: { - toggled: async function(event) { - await request( - 'light.hue.' + (event.value ? 'on' : 'off'), - { groups: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - lights: this._updateLights('on', event.value), - }); - - this.$emit('input', {...this.value, state: {...this.value.state, any_on: event.value, all_on: event.value}}); - }, - - propertiesCollapsedToggled: function() { - this.$emit('properties-collapsed-toggled', { - type: 'group', - id: this.id, - }); - }, - - colorChanged: async function(event) { - await request( - 'light.hue.xy', - { value: event.xy, groups: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - lights: this._updateLights('xy', event.xy), - }); - }, - - briChanged: async function(event) { - await request( - 'light.hue.bri', - { value: event.bri, groups: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - lights: this._updateLights('bri', event.bri), - }); - }, - - ctChanged: async function(event) { - await request( - 'light.hue.ct', - { value: event.ct, groups: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - lights: this._updateLights('ct', event.ct), - }); - }, - - _updateLights: function(attr, value) { - var lights = []; - for (const light of Object.values(this.value.lights)) { - var state = light.state; - state[attr] = value; - lights.push({ - ...light, - state: state, - }); - } - - return lights; - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/index.js b/platypush/backend/http/static/js/plugins/light.hue/index.js deleted file mode 100644 index d903a07f..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/index.js +++ /dev/null @@ -1,229 +0,0 @@ -Vue.component('light-hue', { - template: '#tmpl-light-hue', - props: ['config'], - data: function() { - return { - groups: {}, - lights: {}, - scenes: {}, - animations: {}, - selectedGroup: undefined, - selectedScene: undefined, - selectedProperties: { - type: undefined, - id: undefined, - }, - }; - }, - - methods: { - _prepareGroups: function() { - for (const [groupId, group] of Object.entries(this.groups)) { - if (group.type !== 'Room' || group.recycle) { - delete this.groups[groupId]; - continue; - } - - this.groups[groupId].scenes = {}; - let lights = {}; - - for (const lightId of this.groups[groupId].lights) { - lights[lightId] = this.lights[lightId]; - } - - this.groups[groupId].lights = lights; - } - }, - - _prepareScenes: function() { - for (const [sceneId, scene] of Object.entries(this.scenes)) { - if (scene.recycle) { - delete this.scenes[sceneId]; - continue; - } - - this.scenes[sceneId].groups = {}; - } - }, - - _linkLights: function() { - // Special group for lights with no group - this.groups[-1] = { - type: undefined, - lights: {}, - scenes: {}, - name: "[No Group]", - recycle: false, - }; - - for (const [lightId, light] of Object.entries(this.lights)) { - this.lights[lightId].groups = {}; - - for (const [groupId, group] of Object.entries(this.groups)) { - if (lightId in group.lights) { - this.lights[lightId].groups[groupId] = group; - } - } - - if (!light.groups.length) { - this.groups[-1].lights[lightId] = light; - } - } - - if (!this.groups[-1].lights.length) { - delete this.groups[-1]; - } - }, - - _linkScenes: function() { - for (const [sceneId, scene] of Object.entries(this.scenes)) { - for (const lightId of scene.lights) { - for (const [groupId, group] of Object.entries(this.lights[lightId].groups)) { - this.scenes[sceneId].groups[groupId] = group; - this.groups[groupId].scenes[sceneId] = scene; - } - } - } - }, - - refresh: async function() { - const getLights = request('light.hue.get_lights'); - const getGroups = request('light.hue.get_groups'); - const getScenes = request('light.hue.get_scenes'); - const getAnimations = request('light.hue.get_animations'); - - [this.lights, this.groups, this.scenes, this.animations] = await Promise.all( - [getLights, getGroups, getScenes, getAnimations]); - - this._prepareGroups(); - this._prepareScenes(); - this._linkLights(); - this._linkScenes(); - }, - - updatedGroup: function(event) { - for (const light of Object.values(this.groups[this.selectedGroup].lights)) { - if (event.state.any_on === event.state.all_on) { - light.state.on = event.state.all_on; - } - - for (const attr in ['hue', 'sat', 'bri', 'xy', 'ct']) { - if (attr in event.state) { - light.state[attr] = event.state[attr]; - } - } - } - }, - - startedAnimation: function(value) { - this.animations.groups[this.selectedGroup] = value; - }, - - stoppedAnimation: function() { - this.animations.groups[this.selectedGroup] = undefined; - }, - - selectScene: async function(event) { - await request( - 'light.hue.scene', { - name: event.name, - groups: [this.groups[this.selectedGroup].name], - }, - ); - - this.selectedScene = event.id; - const groups = {}; - - for (const lightId of Object.values(this.scenes[this.selectedScene].lights)) { - this.lights[lightId].state.on = true; - - for (const [groupId, group] of Object.entries(this.lights[lightId].groups)) { - if (!(group.id in groups)) { - groups[groupId] = { - any_on: true, - all_on: group.state.all_on, - lights: [], - } - } - - groups[groupId].lights.push(lightId); - - if (groups[groupId].lights.length === Object.values(group.lights).length) { - groups[groupId].all_on = true; - } - } - } - - for (const [id, group] of Object.entries(groups)) { - this.groups[id].state = { - ...group.state, - any_on: group.any_on, - any_off: group.any_off, - } - } - }, - - collapsedToggled: function(event) { - if (event.type === this.selectedProperties.type - && event.id === this.selectedProperties.id) { - this.selectedProperties = { - type: undefined, - id: undefined, - }; - } else { - this.selectedProperties = { - type: event.type, - id: event.id, - }; - } - }, - - onUnitInput: function(event) { - for (let attr of ['on', 'hue', 'sat', 'bri', 'xy', 'ct']) { - if (attr in event) { - this.lights[event.id].state[attr] = event[attr]; - } - } - - let groups = this.lights[event.id].groups; - for (const [groupId, group] of Object.entries(groups)) { - if (event.on === true) { - this.groups[groupId].state.any_on = true; - this.groups[groupId].state.all_on = Object.values(group.lights).filter((l) => l.state.on).length === Object.values(group.lights).length; - } else if (event.on === false) { - this.groups[groupId].state.all_on = false; - this.groups[groupId].state.any_on = Object.values(group.lights).filter((l) => l.state.on).length > 0; - } - } - }, - - eventHandler: function(event) { - if ('light_id' in event) { - this.onUnitInput({ - ...event, - id: event.light_id, - }); - } else if ('group_id' in event) { - let args = { - id: event.group_id, - state: { - ...event, - }, - }; - - if ('on' in event) { - args.state.any_on = event.on; - args.state.all_on = event.on; - } - - this.updatedGroup(args); - } - }, - }, - - created: function() { - this.refresh(); - registerEventHandler(this.eventHandler, 'platypush.message.event.light.LightStatusChangeEvent'); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/scenes.js b/platypush/backend/http/static/js/plugins/light.hue/scenes.js deleted file mode 100644 index a72f67b0..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/scenes.js +++ /dev/null @@ -1,11 +0,0 @@ -Vue.component('light-hue-scene', { - template: '#tmpl-light-hue-scene', - props: ['id','name'], - - methods: { - clicked: function(event) { - this.$emit('input', {id: this.id, name: this.name}); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/light.hue/units.js b/platypush/backend/http/static/js/plugins/light.hue/units.js deleted file mode 100644 index a32739cd..00000000 --- a/platypush/backend/http/static/js/plugins/light.hue/units.js +++ /dev/null @@ -1,69 +0,0 @@ -Vue.component('light-hue-unit', { - template: '#tmpl-light-hue-unit', - props: ['id','capabilities','config','name', - 'uniqueid','type','productname','modelid', - 'manufacturername', 'swupdate','swversion','value', - 'collapsed'], - - methods: { - toggled: async function(event) { - await request( - 'light.hue.' + (event.value ? 'on' : 'off'), - { lights: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - id: this.id, - on: event.value - }); - }, - - colorChanged: async function(event) { - await request( - 'light.hue.xy', - { value: event.xy, lights: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - id: this.id, - xy: event.xy - }); - }, - - briChanged: async function(event) { - await request( - 'light.hue.bri', - { value: event.bri, lights: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - id: this.id, - bri: event.bri - }); - }, - - ctChanged: async function(event) { - await request( - 'light.hue.ct', - { value: event.ct, lights: [this.id] }, - ); - - this.$emit('input', { - ...this.value, - id: this.id, - ct: event.ct - }); - }, - - propertiesCollapsedToggled: function() { - this.$emit('properties-collapsed-toggled', { - type: 'unit', - id: this.id - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media.gstreamer/index.js b/platypush/backend/http/static/js/plugins/media.gstreamer/index.js deleted file mode 100644 index 67682dc3..00000000 --- a/platypush/backend/http/static/js/plugins/media.gstreamer/index.js +++ /dev/null @@ -1,5 +0,0 @@ -Vue.component('media-gstreamer', { - template: '#tmpl-media-gstreamer', - props: ['config'], -}); - diff --git a/platypush/backend/http/static/js/plugins/media.mplayer/index.js b/platypush/backend/http/static/js/plugins/media.mplayer/index.js deleted file mode 100644 index ab8f2b5c..00000000 --- a/platypush/backend/http/static/js/plugins/media.mplayer/index.js +++ /dev/null @@ -1,5 +0,0 @@ -Vue.component('media-mplayer', { - template: '#tmpl-media-mplayer', - props: ['config'], -}); - diff --git a/platypush/backend/http/static/js/plugins/media.mpv/index.js b/platypush/backend/http/static/js/plugins/media.mpv/index.js deleted file mode 100644 index 4bdc97b8..00000000 --- a/platypush/backend/http/static/js/plugins/media.mpv/index.js +++ /dev/null @@ -1,5 +0,0 @@ -Vue.component('media-mpv', { - template: '#tmpl-media-mpv', - props: ['config'], -}); - diff --git a/platypush/backend/http/static/js/plugins/media.omxplayer/index.js b/platypush/backend/http/static/js/plugins/media.omxplayer/index.js deleted file mode 100644 index 7bf182f1..00000000 --- a/platypush/backend/http/static/js/plugins/media.omxplayer/index.js +++ /dev/null @@ -1,5 +0,0 @@ -Vue.component('media-omxplayer', { - template: '#tmpl-media-omxplayer', - props: ['config'], -}); - diff --git a/platypush/backend/http/static/js/plugins/media.vlc/index.js b/platypush/backend/http/static/js/plugins/media.vlc/index.js deleted file mode 100644 index 679f02f5..00000000 --- a/platypush/backend/http/static/js/plugins/media.vlc/index.js +++ /dev/null @@ -1,5 +0,0 @@ -Vue.component('media-vlc', { - template: '#tmpl-media-vlc', - props: ['config'], -}); - diff --git a/platypush/backend/http/static/js/plugins/media/controls.js b/platypush/backend/http/static/js/plugins/media/controls.js deleted file mode 100644 index 81670b9a..00000000 --- a/platypush/backend/http/static/js/plugins/media/controls.js +++ /dev/null @@ -1,12 +0,0 @@ -Vue.component('media-controls', { - template: '#tmpl-media-controls', - mixins: [mediaUtils], - props: { - bus: { type: Object }, - status: { - type: Object, - default: () => {}, - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/devices.js b/platypush/backend/http/static/js/plugins/media/devices.js deleted file mode 100644 index 07093236..00000000 --- a/platypush/backend/http/static/js/plugins/media/devices.js +++ /dev/null @@ -1,147 +0,0 @@ -// Will be filled by dynamically loading device scripts -const MediaPlayers = {}; - -Vue.component('media-devices', { - template: '#tmpl-media-devices', - props: { - bus: { type: Object }, - localPlayer: { type: String }, - }, - - data: function() { - return { - showDevicesMenu: false, - selectedDevice: {}, - loading: false, - devices: [], - }; - }, - - computed: { - staticItems: function() { - return [ - { - text: 'Refresh', - type: 'refresh', - icon: 'sync-alt', - preventClose: true, - }, - ]; - }, - - dropdownItems: function() { - const self = this; - const onClick = (menuItem) => { - return () => { - if (self.loading) { - return; - } - - self.selectDevice(menuItem.device); - }; - }; - - return self.staticItems.concat( - self.devices.map($dev => { - return { - name: $dev.name, - text: $dev.text || $dev.name, - icon: $dev.icon, - iconClass: $dev.iconClass, - device: $dev, - }; - }) - ).map(item => { - item.click = item.type === 'refresh' ? self.refreshDevices : onClick(item); - item.disabled = self.loading; - return item; - }); - }, - }, - - methods: { - refreshDevices: async function() { - if (this.loading) { - return; - } - - this.loading = true; - const self = this; - - try { - const promises = Object.entries(MediaPlayers).map((p) => { - const playerType = p[0]; - const Player = p[1]; - - return new Promise((resolve, reject) => { - const player = new Player(); - - if (player.scan) { - player.scan().then(devs => { - resolve(devs.map(device => { - const handler = new Player(); - handler.device = device; - return handler; - })); - }); - - return; - } - - if (player.type === 'local') { - player.device = { - plugin: self.localPlayer, - }; - } else { - player.device = {}; - } - - resolve([player]); - }); - }); - - this.devices = (await Promise.all(promises)).reduce((list, devs) => { - return [...list, ...devs]; - }, []).sort((a,b) => { - if (a.type === 'local') - return -1; - if (b.type === 'local') - return 1; - if (a.type === 'browser') - return -1; - if (b.type === 'browser') - return 1; - if (a.type !== b.type) - return b.type.localeCompare(a); - return b.name.localeCompare(a); - }); - - this.devices.forEach(dev => { - dev.status().then(status => { - self.bus.$emit('status-update', { - device: dev, - status: status, - }); - }); - }); - } finally { - this.loading = false; - this.selectDevice(this.devices.filter(_ => _.type === 'local')[0]); - } - }, - - selectDevice: function(device) { - this.selectedDevice = device; - this.bus.$emit('selected-device', device); - }, - - openDevicesMenu: function() { - openDropdown(this.$refs.menu); - }, - }, - - created: function() { - this.refreshDevices(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/handlers/base.js b/platypush/backend/http/static/js/plugins/media/handlers/base.js deleted file mode 100644 index b6e50544..00000000 --- a/platypush/backend/http/static/js/plugins/media/handlers/base.js +++ /dev/null @@ -1,64 +0,0 @@ -MediaHandlers.base = Vue.extend({ - props: { - bus: { type: Object }, - iconClass: { - type: String, - }, - }, - - computed: { - dropdownItems: function() { - return [ - { - text: 'Play', - icon: 'play', - action: this.play, - }, - - { - text: 'View info', - icon: 'info', - action: this.info, - }, - ]; - }, - }, - - methods: { - matchesUrl: function(url) { - return false; - }, - - getMetadata: async function(item, onlyBase=false) { - return {}; - }, - - play: function(item) { - this.bus.$emit('play', item); - }, - - info: async function(item) { - this.bus.$emit('info-loading'); - this.bus.$emit('info', {...item, ...(await this.getMetadata(item))}); - }, - - infoLoad: function(url) { - if (!this.matchesUrl(url)) - return; - - this.info(url); - }, - - searchSubtitles: function(item) { - this.bus.$emit('search-subs', item); - }, - }, - - created: function() { - const self = this; - setTimeout(() => { - self.infoLoadWatch = self.bus.$on('info-load', this.infoLoad); - }, 1000); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/handlers/file.js b/platypush/backend/http/static/js/plugins/media/handlers/file.js deleted file mode 100644 index 5cc272eb..00000000 --- a/platypush/backend/http/static/js/plugins/media/handlers/file.js +++ /dev/null @@ -1,114 +0,0 @@ -MediaHandlers.file = MediaHandlers.base.extend({ - props: { - iconClass: { - type: String, - default: 'fa fa-hdd', - }, - }, - - computed: { - dropdownItems: function() { - return [ - { - text: 'Play', - icon: 'play', - action: this.play, - }, - - { - text: 'Play with subtitles', - iconClass: 'fas fa-closed-captioning', - action: this.searchSubtitles, - }, - - { - text: 'Download (on client)', - icon: 'download', - action: this.download, - }, - - { - text: 'View info', - icon: 'info', - action: this.info, - }, - ]; - }, - }, - - methods: { - matchesUrl: function(url) { - return !!url.match('^(file://)?/'); - }, - - getMetadata: async function(item, onlyBase=false) { - if (typeof item === 'string') { - item = { - url: item, - }; - } - - if (!item.path) - item.path = item.url.startsWith('file://') ? item.url.substr(7) : item.url; - - if (!item.title) - item.title = item.path.split('/').pop(); - - if (!item.size && !onlyBase) - item.size = await request('file.getsize', {filename: item.path}); - - if (!item.duration && !onlyBase) - item.duration = await request('media.get_media_file_duration', {filename: item.path}); - - return item; - }, - - download: async function(item) { - this.bus.$on('streaming-started', (media) => { - if (media.resource === item.url) { - this.bus.$off('streaming-started'); - window.open(media.url + '?download', '_blank'); - } - }); - - this.bus.$emit('start-streaming', item.url); - }, - }, -}); - -MediaHandlers.generic = MediaHandlers.file.extend({ - props: { - iconClass: { - type: String, - default: 'fa fa-globe', - }, - }, - - computed: { - dropdownItems: function() { - return [ - { - text: 'Play', - icon: 'play', - action: this.play, - }, - - { - text: 'View info', - icon: 'info', - action: this.info, - }, - ]; - }, - }, - - methods: { - getMetadata: async function(item) { - return { - url: item.url, - title: item.url, - }; - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/handlers/torrent.js b/platypush/backend/http/static/js/plugins/media/handlers/torrent.js deleted file mode 100644 index 9df370d1..00000000 --- a/platypush/backend/http/static/js/plugins/media/handlers/torrent.js +++ /dev/null @@ -1,304 +0,0 @@ -MediaHandlers.torrent = MediaHandlers.base.extend({ - props: { - bus: { type: Object }, - iconClass: { - type: String, - default: 'fa fa-magnet', - }, - }, - - computed: { - dropdownItems: function() { - return [ - { - text: 'Play', - icon: 'play', - action: this.play, - }, - - { - text: 'Download (on server)', - icon: 'download', - action: this.download, - }, - - { - text: 'View info', - icon: 'info', - action: this.info, - }, - ]; - }, - }, - - data: function() { - return { - torrentStatus: {}, - }; - }, - - methods: { - matchesUrl: function(url) { - return !!( - url.match('^magnet:?') || - url.match('^https?://.*\.torrent$') || - url.match('^(file://)?/.*\.torrent$') - ); - }, - - getTorrentPlugin: async function() { - if (this.config && this.config.torrent_plugin) { - return this.config.torrent_plugin; - } - - const config = await request('inspect.get_config'); - if ('rtorrent' in config) - return 'rtorrent'; - if ('webtorrent' in config) - return 'webtorrent'; - return 'torrent' - }, - - getMetadata: async function(item, onlyBase=false) { - let status = {}; - - if (!onlyBase) - status = await this.status({url: item.url}); - - let transferInfo = {}; - if (item.url in this.torrentStatus) - transferInfo = this.torrentStatus[item.url]; - - return {...status, ...transferInfo}; - }, - - play: async function(item) { - let status = await this.download(item); - status.waitingPlay = true; - const torrentId = this.getTorrentUrlOrHash(item.url); - - if (torrentId in this.torrentStatus) { - this.firePlay(event); - } - }, - - pause: async function(item) { - const torrentPlugin = await this.getTorrentPlugin(); - const torrentId = this.getTorrentUrlOrHash(item.url); - let status = {}; - - if (item.paused) { - status = await request(torrentPlugin + '.resume', {torrent: torrentId}); - } else { - status = await request(torrentPlugin + '.pause', {torrent: torrentId}); - } - - this.mergeStatus(status); - }, - - remove: async function(item) { - const torrentPlugin = await this.getTorrentPlugin(); - const torrentId = this.getTorrentUrlOrHash(item.url); - let status = await request(torrentPlugin + '.remove', {torrent: torrentId}); - if (torrentId in this.torrentStatus) - delete this.torrentStatus[torrentId]; - }, - - status: async function(item) { - const torrentPlugin = await this.getTorrentPlugin(); - if (item) { - const torrentId = this.getTorrentUrlOrHash(typeof item === 'string' ? item : item.url); - return await request(torrentPlugin + '.status', { - torrent: torrentId, - }); - } - - return await request(torrentPlugin + '.status'); - }, - - getTorrentUrlOrHash: function(torrent) { - if (torrent.startsWith('magnet:?')) { - m = torrent.match(/xt=urn:btih:([^&/]+)/, torrent) - if (m) { - return m[1]; // Torrent hash - } - } - - return torrent; - }, - - download: async function(item) { - const torrentPlugin = await this.getTorrentPlugin(); - let status = await this.status(item.url); - - if (status && Object.keys(status).length > 1) { - createNotification({ - text: 'This torrent is already being downloaded, please play the downloading local media file instead', - image: { - icon: 'download', - }, - }); - - return status; - } - - status = await request( - torrentPlugin + '.download', - { - torrent: item.url, - _async: true, - is_media: true, - }, - timeout=120000 // Wait up to two minutes while downloading enough torrent chunks - ); - - const torrentId = this.getTorrentUrlOrHash(item.url); - this.torrentStatus[torrentId] = { - ...item, ...status, - scheduledPlay: false, - torrentState: status.state, - state: 'idle', - }; - - return this.torrentStatus[torrentId]; - }, - - onTorrentEvent: function(event) { - this.mergeStatus(event); - }, - - onTorrentQueued: function(event) { - if (!this.mergeStatus(event)) - this.torrentStatus[event.url] = event; - - createNotification({ - text: 'Torrent download queued. Will start playing when enough chunks have been downloaded', - image: { - icon: 'clock', - }, - }); - }, - - onTorrentStart: function(event) { - if (!this.mergeStatus(event)) - return; - - createNotification({ - text: 'Download of '.concat(event.name, ' started'), - image: { - icon: 'download', - }, - }); - }, - - onTorrentStop: function(event) { - if (!this.mergeStatus(event)) - return; - - const torrentId = this.getTorrentUrlOrHash(event.url); - if (torrentId in this.torrentStatus) - delete this.torrentStatus[torrentId]; - - this.bus.$emit('torrent-status-update', this.torrentStatus); - }, - - onTorrentProgress: function(event) { - if (!this.mergeStatus(event)) - return; - - const torrentId = this.getTorrentUrlOrHash(event.url); - if (this.torrentStatus[torrentId].waitingPlay) - this.firePlay(event); - }, - - onTorrentCompleted: function(event) { - if (!this.mergeStatus(event)) - return; - - const torrentId = this.getTorrentUrlOrHash(event.url); - if (torrentId in this.torrentStatus) - delete this.torrentStatus[event.url]; - - this.bus.$emit('torrent-status-update', this.torrentStatus); - - createNotification({ - text: 'Download of '.concat(event.name, ' completed'), - image: { - icon: 'check', - }, - }); - }, - - firePlay: function(item) { - if (!item.files || !item.files.length) { - console.warn('Torrent ' + item.url + ' has no media files available yet'); - return; - } - - if (event.progress < 5) { - console.warn('Please wait for enough chunks to be downloaded before playing'); - return; - } - - const url = 'file://' + item.files[0]; - this.bus.$emit('play', {...item, type: 'file', url: url}); - - if (this.torrentStatus[item.url].waitingPlay) - this.torrentStatus[item.url].waitingPlay = false; - - createNotification({ - text: 'Playback of '.concat(item.name, ' started'), - image: { - icon: 'play', - }, - }); - }, - - mergeStatus: function(event) { - const torrentId = this.getTorrentUrlOrHash(event.url); - const torrentState = event.state; - delete event.state; - - this.torrentStatus[torrentId] = { - ...this.torrentStatus[torrentId], - ...event, - torrentState: torrentState, - }; - - this.bus.$emit('torrent-status-update', this.torrentStatus); - return this.torrentStatus[torrentId]; - }, - }, - - created: function() { - registerEventHandler(this.onTorrentStart, 'platypush.message.event.torrent.TorrentDownloadStartEvent'); - registerEventHandler(this.onTorrentProgress, 'platypush.message.event.torrent.TorrentDownloadProgressEvent'); - registerEventHandler(this.onTorrentCompleted, 'platypush.message.event.torrent.TorrentDownloadCompletedEvent'); - registerEventHandler(this.onTorrentQueued, 'platypush.message.event.torrent.TorrentQueuedEvent'); - registerEventHandler(this.onTorrentStop, 'platypush.message.event.torrent.TorrentDownloadStopEvent', - 'platypush.message.event.torrent.TorrentRemovedEvent'); - registerEventHandler(this.onTorrentEvent, 'platypush.message.event.torrent.TorrentPausedEvent', - 'platypush.message.event.torrent.TorrentResumedEvent', - 'platypush.message.event.torrent.TorrentDownloadStartEvent', - 'platypush.message.event.torrent.TorrentStateChangeEvent'); - - const self = this; - this.status().then((status) => { - if (!status) - return; - - for (const [url, torrent] of Object.entries(status)) { - if (!torrent.url) - continue; - self.mergeStatus(torrent); - } - }); - - setTimeout(() => { - self.bus.$on('torrent-play', self.firePlay); - self.bus.$on('torrent-pause', self.pause); - self.bus.$on('torrent-remove', self.remove); - }, 100); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/handlers/youtube.js b/platypush/backend/http/static/js/plugins/media/handlers/youtube.js deleted file mode 100644 index 07cd35a2..00000000 --- a/platypush/backend/http/static/js/plugins/media/handlers/youtube.js +++ /dev/null @@ -1,97 +0,0 @@ -MediaHandlers.youtube = MediaHandlers.base.extend({ - props: { - iconClass: { - type: String, - default: 'fab fa-youtube', - }, - }, - - computed: { - dropdownItems: function() { - return [ - { - text: 'Play', - icon: 'play', - action: this.play, - }, - - { - text: 'Download (on server)', - icon: 'download', - action: this.downloadServer, - }, - - { - text: 'Download (on client)', - icon: 'download', - action: this.downloadClient, - }, - - { - text: 'View info', - icon: 'info', - action: this.info, - }, - ]; - }, - }, - - methods: { - matchesUrl: function(url) { - return !!(url.match('^https?://(www\.)?youtube.com/') || url.match('^https?://youtu.be/') || url.match('^https?://.*googlevideo.com/')); - }, - - getMetadata: function(item) { - return {}; - }, - - _getRawUrl: async function(url) { - if (url.indexOf('.googlevideo.com') < 0) { - url = await request('media.get_youtube_url', {url: url}); - } - - return url; - }, - - play: async function(item) { - if (typeof item === 'string') - item = {url: item}; - - let url = await this._getRawUrl(item.url); - this.bus.$emit('play', {...item, url:url}); - }, - - downloadServer: async function(item) { - createNotification({ - text: 'Downloading video', - image: { - icon: 'download', - }, - }); - - let url = await this._getRawUrl(item.url); - let args = { - url: url, - } - - if (item.title) { - args.filename = item.title + '.webm'; - } - - let path = await request('media.download', args); - - createNotification({ - text: 'Video downloaded to ' + path, - image: { - icon: 'check', - }, - }); - }, - - downloadClient: async function(item) { - let url = await this._getRawUrl(item.url); - window.open(url, '_blank'); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/index.js b/platypush/backend/http/static/js/plugins/media/index.js deleted file mode 100644 index 6cf186c4..00000000 --- a/platypush/backend/http/static/js/plugins/media/index.js +++ /dev/null @@ -1,355 +0,0 @@ -// Will be filled by dynamically loading media type handler scripts -const MediaHandlers = {}; - -const mediaUtils = { - methods: { - convertTime: function(time) { - time = parseFloat(time); // Normalize strings - var t = {}; - t.h = '' + parseInt(time/3600); - t.m = '' + parseInt(time/60 - t.h*60); - t.s = '' + parseInt(time - (t.h*3600 + t.m*60)); - - for (var attr of ['m','s']) { - if (parseInt(t[attr]) < 10) { - t[attr] = '0' + t[attr]; - } - } - - var ret = []; - if (parseInt(t.h)) { - ret.push(t.h); - } - - ret.push(t.m, t.s); - return ret.join(':'); - }, - - convertSize: function(size) { - size = parseInt(size); // Normalize strings - - const units = ['B', 'KB', 'MB', 'GB']; - let s=size, i=0; - - for (; s > 1024 && i < units.length; i++, s = parseInt(s/1024)); - return (size / Math.pow(2, 10*i)).toFixed(2) + ' ' + units[i]; - }, - }, -}; - -Vue.component('media', { - template: '#tmpl-media', - props: ['config','player'], - mixins: [mediaUtils], - - data: function() { - return { - bus: new Vue({}), - results: [], - status: {}, - selectedDevice: {}, - deviceHandlers: {}, - - loading: { - results: false, - media: false, - }, - - infoModal: { - visible: false, - loading: false, - item: {}, - }, - - torrentModal: { - visible: false, - items: {}, - }, - - subsModal: { - visible: false, - }, - }; - }, - - computed: { - types: function() { - return MediaHandlers; - }, - - torrentsDownloading: function() { - return Object.entries(this.torrentModal.items).length > 0; - }, - }, - - methods: { - onResultsLoading: function() { - this.loading.results = true; - }, - - onResultsReady: async function(results) { - for (const result of results) { - if (result.type && MediaHandlers[result.type]) { - result.handler = MediaHandlers[result.type]; - } else { - result.type = 'generic'; - result.handler = MediaHandlers.generic; - - for (const [handlerType, handler] of Object.entries(MediaHandlers)) { - if (handler.matchesUrl && handler.matchesUrl(result.url)) { - result.type = handlerType; - result.handler = handler; - break; - } - } - } - - Object.entries(await result.handler.getMetadata(result, onlyBase=true)).forEach(entry => { - Vue.set(result, entry[0], entry[1]); - }); - } - - this.results = results; - this.loading.results = false; - }, - - play: async function(item) { - if (!this.selectedDevice.accepts[item.type]) { - item = await this.startStreaming(item); - } - - let status = await this.selectedDevice.play(item, item.subtitles); - - if (item.title) - status.title = item.title; - - this.subsModal.visible = false; - this.onStatusUpdate({ - device: this.selectedDevice, - status: status, - }); - }, - - pause: async function() { - let status = await this.selectedDevice.pause(); - this.onStatusUpdate({ - device: this.selectedDevice, - status: status, - }); - }, - - stop: async function() { - let status = await this.selectedDevice.stop(); - this.onStatusUpdate({ - device: this.selectedDevice, - status: status, - }); - }, - - seek: async function(position) { - let status = await this.selectedDevice.seek(position); - this.onStatusUpdate({ - device: this.selectedDevice, - status: status, - }); - }, - - setVolume: async function(volume) { - let status = await this.selectedDevice.setVolume(volume); - this.onStatusUpdate({ - device: this.selectedDevice, - status: status, - }); - }, - - info: function(item) { - Vue.set(this.infoModal, 'item', item); - this.infoModal.loading = false; - this.infoModal.visible = true; - }, - - infoLoading: function() { - this.infoModal.loading = true; - this.infoModal.visible = true; - }, - - startStreaming: async function(item) { - if (typeof item === 'string') - item = {url: item}; - - const ret = await request('media.start_streaming', { - media: item.url, - subtitles: item.subtitles, - }); - - this.bus.$emit('streaming-started', { - url: ret.url, - resource: item.url, - subtitles_url: ret.subtiles_url, - }); - - return {...item, ...ret}; - }, - - searchSubs: function(item) { - if (typeof item === 'string') - item = {url: item}; - - this.subsModal.visible = true; - this.$refs.subs.search(item); - }, - - selectDevice: async function(device) { - this.selectedDevice = device; - let status = await this.selectedDevice.status(); - - this.onStatusUpdate({ - device: this.selectedDevice, - status: status, - }); - }, - - syncPosition: function(status) { - if (!status) - return; - - status._syncTime = { - timestamp: new Date(), - position: status.position, - }; - }, - - getTorrentPlugin: async function() { - if (this.config && this.config.torrent_plugin) { - return this.config.torrent_plugin; - } - - const config = await request('inspect.get_config'); - if ('rtorrent' in config) - return 'rtorrent'; - if ('webtorrent' in config) - return 'webtorrent'; - return 'torrent' - }, - - torrentStatusUpdate: function(torrents) { - Vue.set(this.torrentModal, 'items', {}); - - for (const [url, torrent] of Object.entries(torrents)) { - Vue.set(this.torrentModal.items, url, torrent); - } - }, - - refreshTorrents: async function() { - const torrentPlugin = await this.getTorrentPlugin(); - const torrents = await request(torrentPlugin + '.status'); - this.torrentStatusUpdate(torrents); - }, - - onStatusUpdate: function(event) { - const dev = event.device; - const status = event.status; - this.syncPosition(status); - - if (status.state !== 'stop' && this.status[dev.type] && this.status[dev.type][dev.name]) { - status.title = status.title || this.status[dev.type][dev.name].title; - } - - if (!this.status[dev.type]) - Vue.set(this.status, dev.type, {}); - Vue.set(this.status[dev.type], dev.name, status); - - if (!this.deviceHandlers[dev.type]) - Vue.set(this.deviceHandlers, dev.type, {}); - Vue.set(this.deviceHandlers[dev.type], dev.name, dev); - }, - - onMediaEvent: async function(event) { - var type, player; - const plugin = event.plugin.replace(/^media\./, ''); - - if (this.status[event.player] && this.status[event.player][plugin]) { - type = event.player; - player = plugin; - } else if (this.status[plugin] && this.status[plugin][event.player]) { - type = plugin; - player = event.player; - } - - var handler; - if (this.deviceHandlers[event.player] && this.deviceHandlers[event.player][plugin]) { - handler = this.deviceHandlers[event.player][plugin]; - } else if (this.deviceHandlers[plugin] && this.deviceHandlers[plugin][event.player]) { - handler = this.deviceHandlers[plugin][event.player]; - } else { - // No handlers - console.warn('No handlers found for device type '.concat(event.plugin, ' and player ', event.player)); - return; - } - - let status = await handler.status(event.player); - this.syncPosition(status); - - if (event.resource) { - event.url = event.resource; - delete event.resource; - } - - if (status.state !== 'stop' || event.type.endsWith('.MediaPlayEvent')) { - status.title = status.title || this.status[type][player].title; - } - - if (event.type.endsWith('.MediaPlayEvent')) { - status.state = 'play'; - } else if (event.type.endsWith('.MediaPauseEvent')) { - status.state = 'pause'; - } - - Vue.set(this.status[type], player, status); - }, - - timerFunc: function() { - for (const [playerType, players] of Object.entries(this.status)) { - for (const [playerName, status] of Object.entries(players)) { - if (status.state === 'play' && !isNaN(status.position) && status._syncTime) { - status.position = status._syncTime.position + - ((new Date()).getTime()/1000) - (status._syncTime.timestamp.getTime()/1000); - } - } - } - }, - }, - - created: function() { - for (const [type, Handler] of Object.entries(MediaHandlers)) { - MediaHandlers[type] = new Handler(); - MediaHandlers[type].bus = this.bus; - } - - this.refreshTorrents(); - registerEventHandler(this.onMediaEvent, - 'platypush.message.event.media.NewPlayingMediaEvent', - 'platypush.message.event.media.MediaPlayEvent', - 'platypush.message.event.media.MediaPauseEvent', - 'platypush.message.event.media.MediaStopEvent', - 'platypush.message.event.media.MediaSeekEvent'); - - this.bus.$on('play', this.play); - this.bus.$on('pause', this.pause); - this.bus.$on('stop', this.stop); - this.bus.$on('seek', this.seek); - this.bus.$on('volume', this.setVolume); - this.bus.$on('info', this.info); - this.bus.$on('info-loading', this.infoLoading); - this.bus.$on('selected-device', this.selectDevice); - this.bus.$on('results-loading', this.onResultsLoading); - this.bus.$on('results-ready', this.onResultsReady); - this.bus.$on('status-update', this.onStatusUpdate); - this.bus.$on('start-streaming', this.startStreaming); - this.bus.$on('search-subs', this.searchSubs); - this.bus.$on('torrent-status-update', this.torrentStatusUpdate); - - setInterval(this.timerFunc, 1000); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/info.js b/platypush/backend/http/static/js/plugins/media/info.js deleted file mode 100644 index 8360d53d..00000000 --- a/platypush/backend/http/static/js/plugins/media/info.js +++ /dev/null @@ -1,13 +0,0 @@ -Vue.component('media-info', { - template: '#tmpl-media-info', - mixins: [mediaUtils], - props: { - bus: { type: Object }, - - item: { - type: Object, - default: () => {}, - } - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/item.js b/platypush/backend/http/static/js/plugins/media/item.js deleted file mode 100644 index c4ab9c15..00000000 --- a/platypush/backend/http/static/js/plugins/media/item.js +++ /dev/null @@ -1,28 +0,0 @@ -Vue.component('media-item', { - template: '#tmpl-media-item', - props: { - bus: { type: Object }, - - selected: { - type: Boolean, - default: false, - }, - - active: { - type: Boolean, - default: false, - }, - - item: { - type: Object, - default: () => {}, - } - }, - - methods: { - onClick: function(event) { - this.bus.$emit('result-clicked', this.item); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/players/browser.js b/platypush/backend/http/static/js/plugins/media/players/browser.js deleted file mode 100644 index 140e1ea9..00000000 --- a/platypush/backend/http/static/js/plugins/media/players/browser.js +++ /dev/null @@ -1,56 +0,0 @@ -MediaPlayers.browser = Vue.extend({ - props: { - type: { - type: String, - default: 'browser', - }, - - accepts: { - type: Object, - default: () => { - return { - youtube: true, - generic: true, - }; - }, - }, - - subFormats: { - type: Array, - default: () => { - return ['vtt']; - }, - }, - - name: { - type: String, - default: 'Browser', - }, - - iconClass: { - type: String, - default: 'fa fa-laptop', - }, - }, - - methods: { - status: async function() { - return {}; - }, - - play: async function(item, subtitles) { - let url = item.url; - - if (item.source && !item.source.match('https?://')) { - // Non-HTTP resource streamed over HTTP - const hostRegex = /^(https?:\/\/[^:/]+(:[0-9]+)?\/?)/; - const baseURL = window.location.href.match(hostRegex)[1]; - url = url.replace(hostRegex, baseURL) + '?webplayer'; - } - - window.open(url, '_blank'); - return {}; - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/players/chromecast.js b/platypush/backend/http/static/js/plugins/media/players/chromecast.js deleted file mode 100644 index c53d3807..00000000 --- a/platypush/backend/http/static/js/plugins/media/players/chromecast.js +++ /dev/null @@ -1,88 +0,0 @@ -MediaPlayers.chromecast = Vue.extend({ - props: { - type: { - type: String, - default: 'chromecast', - }, - - accepts: { - type: Object, - default: () => { - return { - youtube: true, - generic: true, - }; - }, - }, - - subFormats: { - type: Array, - default: () => { - return ['vtt']; - }, - }, - - device: { - type: null, - address: null, - port: null, - uuid: null, - status: {}, - name: '', - model_name: null, - }, - }, - - computed: { - name: function() { - return this.device.name; - }, - - iconClass: function() { - return this.device.type === 'audio' ? 'fa fa-volume-up' : 'fab fa-chromecast'; - }, - }, - - methods: { - scan: async function() { - return await request('media.chromecast.get_chromecasts'); - }, - - status: async function(device) { - return await request('media.chromecast.status', {chromecast: device || this.device.name}); - }, - - play: async function(item) { - return await request('media.chromecast.play', { - resource: item.url, - chromecast: this.device.name, - title: item.title || item.url, - subtitles: item.subtitles_url, - content_type: item.mime_type, - }); - }, - - pause: async function() { - return await request('media.chromecast.pause', {chromecast: this.device.name}); - }, - - stop: async function() { - return await request('media.chromecast.stop', {chromecast: this.device.name}); - }, - - seek: async function(position) { - return await request('media.chromecast.set_position', { - position: position, - chromecast: this.device.name, - }); - }, - - setVolume: async function(volume) { - return await request('media.chromecast.set_volume', { - volume: volume, - chromecast: this.device.name, - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/players/kodi.js b/platypush/backend/http/static/js/plugins/media/players/kodi.js deleted file mode 100644 index 52896060..00000000 --- a/platypush/backend/http/static/js/plugins/media/players/kodi.js +++ /dev/null @@ -1,86 +0,0 @@ -MediaPlayers.kodi = Vue.extend({ - props: { - type: { - type: String, - default: 'kodi', - }, - - device: { - type: Object, - default: () => { - return { - host: undefined, - }; - }, - }, - - accepts: { - type: Object, - default: () => { - return { - file: true, - generic: true, - youtube: true, - }; - }, - }, - - iconClass: { - type: String, - default: 'fa fa-film', - }, - }, - - computed: { - name: function() { - return this.device.host; - }, - - text: function() { - return 'Kodi '.concat('[', this.device.host, ']'); - }, - }, - - methods: { - scan: async function() { - const plugin = await request('inspect.get_config', {entry: 'media.kodi'}); - if (!(plugin && plugin.host)) { - return []; - } - - return [{ host: plugin.host }]; - }, - - status: async function() { - return await request('media.kodi.status'); - }, - - play: async function(item) { - return await request('media.kodi.play', { - resource: item.url, - subtitles: item.subtitles_url, - }); - }, - - pause: async function() { - return await request('media.kodi.pause'); - }, - - stop: async function() { - return await request('media.kodi.stop'); - }, - - seek: async function(position) { - return await request('media.kodi.set_position', { - position: position, - }); - }, - - setVolume: async function(volume) { - return await request('media.kodi.set_volume', { - volume: volume, - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/players/local.js b/platypush/backend/http/static/js/plugins/media/players/local.js deleted file mode 100644 index 1260130c..00000000 --- a/platypush/backend/http/static/js/plugins/media/players/local.js +++ /dev/null @@ -1,86 +0,0 @@ -MediaPlayers.local = Vue.extend({ - props: { - type: { - type: String, - default: 'local', - }, - - accepts: { - type: Object, - default: () => { - return { - file: true, - youtube: true, - generic: true, - }; - }, - }, - - subFormats: { - type: Array, - default: () => { - return ['srt']; - }, - }, - - device: { - type: Object, - default: () => { - return { - plugin: undefined, - }; - }, - }, - - iconClass: { - type: String, - default: 'fa fa-desktop', - }, - }, - - computed: { - name: function() { - return this.device.plugin; - }, - - pluginPrefix: function() { - return 'media.' + this.device.plugin; - }, - }, - - methods: { - status: async function() { - return await request(this.pluginPrefix.concat('.status')); - }, - - play: async function(item, subtitles=undefined) { - return await request( - this.pluginPrefix.concat('.play'), - {resource: item.url, subtitles: subtitles} - ); - }, - - pause: async function() { - return await request(this.pluginPrefix.concat('.pause')); - }, - - stop: async function() { - return await request(this.pluginPrefix.concat('.stop')); - }, - - seek: async function(position) { - return await request( - this.pluginPrefix.concat('.set_position'), - {position: position}, - ); - }, - - setVolume: async function(volume) { - return await request( - this.pluginPrefix.concat('.set_volume'), - {volume: volume} - ); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/results.js b/platypush/backend/http/static/js/plugins/media/results.js deleted file mode 100644 index 2fb1128d..00000000 --- a/platypush/backend/http/static/js/plugins/media/results.js +++ /dev/null @@ -1,69 +0,0 @@ -Vue.component('media-results', { - template: '#tmpl-media-results', - props: { - bus: { type: Object }, - searching: { - type: Boolean, - default: false, - }, - loading: { - type: Boolean, - default: false, - }, - results: { - type: Array, - default: () => [], - }, - status: { - type: Object, - default: () => {}, - }, - resize: { - type: Boolean, - default: false, - }, - }, - - data: function() { - return { - selectedItem: {}, - }; - }, - - computed: { - mediaItemDropdownItems: function() { - if (!Object.keys(this.selectedItem).length) { - return []; - } - - const self = this; - - return this.selectedItem.handler.dropdownItems.map(item => { - return { - text: item.text, - icon: item.icon, - iconClass: item.iconClass, - click: function() { - item.action(self.selectedItem); - }, - }; - }); - }, - }, - - methods: { - itemClicked: function(item) { - if (this.selectedItem.length && this.selectedItem.url === item.url) { - return; - } - - this.selectedItem = item; - openDropdown(this.$refs.mediaItemDropdown); - }, - }, - - created: function() { - this.bus.$on('result-clicked', this.itemClicked); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/search.js b/platypush/backend/http/static/js/plugins/media/search.js deleted file mode 100644 index 8b7f5a16..00000000 --- a/platypush/backend/http/static/js/plugins/media/search.js +++ /dev/null @@ -1,71 +0,0 @@ -Vue.component('media-search', { - template: '#tmpl-media-search', - props: { - bus: { type: Object }, - supportedTypes: { type: Object }, - }, - - data: function() { - return { - searching: false, - showFilter: false, - query: '', - - types: Object.keys(this.supportedTypes).reduce((obj, type) => { - obj[type] = true; - return obj; - }, {}), - - searchTypes: Object.keys(this.supportedTypes).reduce((obj, type) => { - if (type !== 'generic' && type !== 'base') - obj[type] = true; - return obj; - }, {}), - }; - }, - - methods: { - isUrl: function(query) { - const match = query.match('^([^:]+)://'); - if (match) { - let protocol = match[1]; - if (protocol === 'https') - protocol = 'http'; - - return protocol; - } - }, - - search: async function(event) { - const types = Object.entries(this.searchTypes).filter(t => t[1]).map(t => t[0]); - const protocol = this.isUrl(this.query); - - if (protocol) { - this.bus.$emit('results-ready', [{ - type: protocol, - url: this.query, - }]); - - return; - } - - var results = []; - this.searching = true; - this.bus.$emit('results-loading'); - - try { - results = await request('media.search', { - query: this.query, - types: types, - }); - } finally { - this.searching = false; - this.bus.$emit('results-ready', results); - } - }, - }, - - created: function() { - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/subs.js b/platypush/backend/http/static/js/plugins/media/subs.js deleted file mode 100644 index 68c1e075..00000000 --- a/platypush/backend/http/static/js/plugins/media/subs.js +++ /dev/null @@ -1,45 +0,0 @@ -Vue.component('media-subs', { - template: '#tmpl-media-subs', - props: { - bus: { type: Object }, - subFormats: { - type: Array, - default: () => [], - }, - }, - - data: function() { - return { - loading: false, - media: {}, - items: [], - selectedItem: undefined, - }; - }, - - methods: { - search: async function(media) { - this.loading = true; - - this.media = media; - this.selectedItem = undefined; - this.items = await request('media.subtitles.get_subtitles', {resource: this.media.url}); - - this.loading = false; - }, - - play: async function() { - let args = {link: this.selectedItem.SubDownloadLink}; - - if (this.media.url && this.media.url.startsWith('file://')) - args.media_resource = this.media.url; - - if (this.subFormats.indexOf('srt') < 0) - args.convert_to_vtt = true; - - this.media.subtitles = (await request('media.subtitles.download', args)).filename; - this.bus.$emit('play', this.media); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/media/torrents.js b/platypush/backend/http/static/js/plugins/media/torrents.js deleted file mode 100644 index eddb2db2..00000000 --- a/platypush/backend/http/static/js/plugins/media/torrents.js +++ /dev/null @@ -1,93 +0,0 @@ -Vue.component('media-torrents', { - template: '#tmpl-media-torrents', - mixins: [mediaUtils], - props: { - bus: { type: Object }, - torrents: { - type: Object, - default: () => {}, - }, - }, - - data: function() { - return { - selectedItem: undefined, - }; - }, - - computed: { - dropdownItems: function() { - const self = this; - return [ - { - name: 'play', - text: 'Play', - iconClass: 'fa fa-play', - click: function() { - self.bus.$emit('torrent-play', self.selectedItem); - }, - }, - - { - name: 'pause', - text: 'Pause/unpause transfer', - iconClass: 'fa fa-pause', - click: function() { - self.bus.$emit('torrent-pause', self.selectedItem); - }, - }, - - { - name: 'cancel', - text: 'Cancel transfer', - iconClass: 'fa fa-trash', - click: function() { - self.bus.$emit('torrent-remove', self.selectedItem); - }, - }, - - { - name: 'info', - text: 'View details', - iconClass: 'fa fa-info', - click: function() { - self.bus.$emit('info', self.selectedItem); - }, - }, - ]; - }, - }, - - methods: { - getTorrentPlugin: async function() { - if (this.config && this.config.torrent_plugin) { - return this.config.torrent_plugin; - } - - const config = await request('inspect.get_config'); - if ('rtorrent' in config) - return 'rtorrent'; - if ('webtorrent' in config) - return 'webtorrent'; - return 'torrent' - }, - - openDropdown: function(item) { - this.selectedItem = item; - openDropdown(this.$refs.menu); - }, - - onMagnetDownload: async function() { - const magnet = this.$refs.magnetLink.value.trim(); - if (!magnet.length) - return; - - const torrentPlugin = await this.getTorrentPlugin(); - await request(torrentPlugin + '.download', { - torrent: magnet, - _async: true, - }); - } - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.mpd/browser.js b/platypush/backend/http/static/js/plugins/music.mpd/browser.js deleted file mode 100644 index e748fd13..00000000 --- a/platypush/backend/http/static/js/plugins/music.mpd/browser.js +++ /dev/null @@ -1,26 +0,0 @@ -Vue.component('music-mpd-browser-item', { - template: '#tmpl-music-mpd-browser-item', - props: { - id: { type: String, }, - type: { type: String, }, - name: { type: String, }, - file: { type: String, }, - time: { type: String, }, - artist: { type: String, }, - title: { type: String, }, - date: { type: String, }, - track: { type: String, }, - genre: { type: String, }, - lastModified: { type: String, }, - albumUri: { type: String, }, - - selected: { - type: Boolean, - default: false, - }, - }, - - methods: { - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.mpd/index.js b/platypush/backend/http/static/js/plugins/music.mpd/index.js deleted file mode 100644 index 0b4e0665..00000000 --- a/platypush/backend/http/static/js/plugins/music.mpd/index.js +++ /dev/null @@ -1,1265 +0,0 @@ -Vue.component('music-mpd', { - template: '#tmpl-music-mpd', - props: ['config'], - mixins: [utils], - data: function() { - return { - track: {}, - status: {}, - timer: null, - playlist: [], - playlists: [], - playlistFilter: '', - browserFilter: '', - playlistAddFilter: '', - editorFilter: '', - browserPath: [], - browserItems: [], - - selectionMode: { - playlist: false, - browser: false, - editor: false, - }, - - moveMode: { - playlist: false, - editor: false, - }, - - infoItem: {}, - modalVisible: { - info: false, - editor: false, - playlistAdd: false, - }, - - addToPlaylistItems: [], - selectedPlaylist: {}, - selectedPlaylistItems: {}, - selectedPlaylistAddItems: {}, - selectedEditorItems: {}, - selectedBrowserItems: {}, - - syncTime: { - timestamp: null, - elapsed: null, - }, - }; - }, - - computed: { - playlistDropdownItems: function() { - var self = this; - var items = []; - - if (Object.keys(this.selectedPlaylistItems).length === 1) { - const track = Object.values(this.selectedPlaylistItems)[0]; - - items.push({ - text: 'Play', - icon: 'play', - click: async function() { - await self.playpos(); - self.selectedPlaylistItems = {}; - }, - } - ); - - if (track.artist && track.artist.length) { - items.push({ - text: 'View artist', - icon: 'user', - click: async function() { - await self.searchArtist(track); - self.selectedPlaylistItems = {}; - } - }); - } - - if (track.album && track.album.length) { - items.push({ - text: 'View album', - icon: 'compact-disc', - click: async function() { - await self.searchAlbum(track); - self.selectedPlaylistItems = {}; - }, - }); - } - } - - items.push({ - text: 'Add to playlist', - icon: 'list', - click: async function() { - self.addToPlaylistItems = Object.values(self.selectedPlaylistItems).map(_ => _.file); - self.selectedPlaylistItems = {}; - self.modalVisible.playlistAdd = true; - await self.listplaylists(); - }, - }); - - if (Object.keys(this.selectedPlaylistItems).length < this.playlist.length) { - items.push({ - text: 'Move', - icon: 'retweet', - click: function() { - self.moveMode.playlist = true; - }, - }); - } - - items.push({ - text: 'Remove from queue', - icon: 'trash', - click: async function() { - await self.del(); - self.selectedPlaylistItems = {}; - }, - }); - - if (Object.keys(this.selectedPlaylistItems).length === 1) { - items.push({ - text: 'View track info', - icon: 'info', - click: async function() { - await self.info(Object.values(self.selectedPlaylistItems)[0]); - }, - }); - } - - return items; - }, - - browserDropdownItems: function() { - var self = this; - var items = []; - - if (Object.keys(this.selectedBrowserItems).length === 1 && - Object.values(this.selectedBrowserItems)[0].type === 'directory') { - items.push({ - text: 'Open', - icon: 'folder', - click: async function() { - await self.cd(); - self.selectedBrowserItems = {}; - }, - }); - } - - if (Object.keys(this.selectedBrowserItems).length === 1) { - const item = Object.values(this.selectedBrowserItems)[0]; - - items.push( - { - text: 'Play', - icon: 'play', - click: async function() { - const item = Object.values(self.selectedBrowserItems)[0]; - var promise; - - switch (item.type) { - case 'playlist': - promise = self.load(item.name); - break; - case 'file': - promise = self.add(item.name, position=0); - break; - case 'directory': - promise = self.add(item.name); - break; - default: - console.warning('Unable to handle type: ' + item.type); - break; - } - - await promise; - await self.playpos(0); - self.selectedBrowserItems = {}; - }, - }, - { - text: 'Replace and play', - icon: 'play', - click: async function() { - await self.clear(); - - const item = Object.values(self.selectedBrowserItems)[0]; - var promise; - - switch (item.type) { - case 'playlist': - promise = self.load(item.name); - break; - case 'file': - promise = self.add(item.name, position=0); - break; - case 'directory': - promise = self.add(item.name); - break; - default: - console.warning('Unable to handle type: ' + item.type); - break; - } - - await promise; - await self.playpos(0); - self.selectedBrowserItems = {}; - }, - } - ); - - if (item.artist && item.artist.length) { - items.push({ - text: 'View artist', - icon: 'user', - click: async function() { - await self.searchArtist(item); - self.selectedBrowserItems = {}; - } - }); - } - - if (item.album && item.album.length) { - items.push({ - text: 'View album', - icon: 'compact-disc', - click: async function() { - await self.searchAlbum(item); - self.selectedBrowserItems = {}; - }, - }); - } - } - - items.push( - { - text: 'Add to queue', - icon: 'plus', - click: async function() { - const items = Object.values(self.selectedBrowserItems); - const promises = items.map(item => item.type === 'playlist' ? self.load(item.name) : self.add(item.name)); - - await Promise.all(promises); - self.selectedBrowserItems = {}; - }, - }, - ); - - if (Object.values(this.selectedBrowserItems).filter(_ => _.type === 'file').length === Object.values(this.selectedBrowserItems).length) { - items.push( - { - text: 'Add to playlist', - icon: 'list', - click: async function() { - self.addToPlaylistItems = Object.keys(self.selectedBrowserItems); - self.modalVisible.playlistAdd = true; - await self.listplaylists(); - self.selectedBrowserItems = {}; - }, - }, - ); - } - - if (Object.keys(this.selectedBrowserItems).length === 1 - && Object.values(this.selectedBrowserItems)[0].type === 'playlist') { - items.push({ - text: 'Edit', - icon: 'pen', - click: async function() { - const item = Object.values(self.selectedBrowserItems)[0]; - self.selectedPlaylist.name = item.name; - await self.refreshSelectedPlaylist(); - self.modalVisible.editor = true; - self.selectedBrowserItems = {}; - }, - }); - } - - if (Object.values(this.selectedBrowserItems).filter(item => item.type === 'playlist').length === Object.values(this.selectedBrowserItems).length) { - items.push({ - text: 'Remove', - icon: 'trash', - click: async function() { - if (!confirm('Are you sure you want to remove the selected playlist' + - (Object.values(self.selectedBrowserItems).length > 1 ? 's' : '') + '?')) { - return; - } - - const items = Object.values(self.selectedBrowserItems); - await self.rm(items); - self.selectedBrowserItems = {}; - }, - }); - } - - if (Object.keys(this.selectedBrowserItems).length === 1 - && Object.values(this.selectedBrowserItems)[0].type === 'file') { - items.push({ - text: 'View info', - icon: 'info', - click: async function() { - await self.info(Object.values(self.selectedBrowserItems)[0].name); - }, - }); - } - - return items; - }, - - editorDropdownItems: function() { - var self = this; - var items = []; - - if (Object.keys(this.selectedEditorItems).length === 1) { - const item = Object.values(this.selectedEditorItems)[0]; - - items.push( - { - text: 'Play', - icon: 'play', - click: async function() { - await self.add(item.file, position=0); - await self.playpos(0); - self.selectedEditorItems = {}; - }, - }, - { - text: 'Replace and play', - icon: 'play', - click: async function() { - await self.clear(); - await self.add(item.file, position=0); - await self.playpos(0); - self.selectedEditorItems = {}; - }, - } - ); - - if (item.artist && item.artist.length) { - items.push({ - text: 'View artist', - icon: 'user', - click: async function() { - await self.searchArtist(item); - self.selectedEditorItems = {}; - } - }); - } - - if (item.album && item.album.length) { - items.push({ - text: 'View album', - icon: 'compact-disc', - click: async function() { - await self.searchAlbum(item); - self.selectedEditorItems = {}; - }, - }); - } - } - - items.push( - { - text: 'Add to queue', - icon: 'plus', - click: async function() { - const items = Object.values(self.selectedEditorItems); - const promises = items.map(item => self.add(item.file)); - - await Promise.all(promises); - self.selectedEditorItems = {}; - }, - }, - { - text: 'Add to playlist', - icon: 'list', - click: async function() { - self.addToPlaylistItems = Object.keys(self.selectedEditorItems); - self.modalVisible.playlistAdd = true; - await self.listplaylists(); - self.selectedEditorItems = {}; - }, - } - ); - - if (Object.keys(this.selectedEditorItems).length < this.selectedPlaylist.items.length) { - items.push({ - text: 'Move', - icon: 'retweet', - click: function() { - self.moveMode.editor = true; - }, - }); - } - - items.push( - { - text: 'Remove', - icon: 'trash', - click: async function() { - if (!confirm('Are you sure you want to remove the selected track' + - (Object.values(self.selectedEditorItems).length > 1 ? 's' : '') + ' from the playlist?')) { - return; - } - - const items = Object.values(self.selectedEditorItems); - await self.playlistdelete(items.map(_ => _.pos)); - self.selectedEditorItems = {}; - }, - } - ); - - if (Object.keys(this.selectedEditorItems).length === 1) { - const item = Object.values(self.selectedEditorItems)[0]; - - items.push({ - text: 'View info', - icon: 'info', - click: async function() { - await self.info(item.file); - }, - }); - } - - return items; - }, - }, - - methods: { - refresh: async function() { - const getStatus = request('music.mpd.status'); - const getTrack = request('music.mpd.currentsong'); - const getPlaylist = request('music.mpd.playlistinfo'); - const getBrowserItems = request('music.mpd.lsinfo'); - - let [status, track, playlist, browserItems] = await Promise.all([getStatus, getTrack, getPlaylist, getBrowserItems]); - - this._parseStatus(status); - this._parseTrack(track); - this._parsePlaylist(playlist); - this._parseBrowserItems(browserItems); - - if (this.status.state === 'play') { - this.startTimer(); - } - }, - - // Hack-ish workaround to get the browser and playlist panels to keep their height - // in sync with the nav and control bars, as both those elements are fixed. - adjustLayout: function() { - const adjust = (self) => { - const nav = document.querySelector('nav'); - const panels = document.querySelectorAll('.music-mpd-container .panels .panel'); - const controls = document.querySelector('.music-mpd-container .controls'); - - return () => { - const panelHeight = window.innerHeight - nav.clientHeight - controls.clientHeight - 5; - if (panelHeight >= 0) { - for (const panel of panels) { - if (panelHeight != parseFloat(panel.style.height)) { - panel.style.height = panelHeight + 'px'; - } - } - } - } - }; - }, - - _parseStatus: async function(status) { - if (!status || status.length === 0) { - status = await request('music.mpd.status'); - } - - for (const [attr, value] of Object.entries(status)) { - if (['consume','random','repeat','single','bitrate'].indexOf(attr) >= 0) { - Vue.set(this.status, attr, !!parseInt(value)); - } else if (['nextsong','nextsongid','playlist','playlistlength', - 'volume','xfade','song','songid'].indexOf(attr) >= 0) { - Vue.set(this.status, attr, parseInt(value)); - } else if (['elapsed'].indexOf(attr) >= 0) { - Vue.set(this.status, attr, parseFloat(value)); - } else { - Vue.set(this.status, attr, value); - } - } - }, - - _parseTrack: async function(track) { - if (!track || track.length === 0) { - track = await request('music.mpd.currentsong'); - } - - for (const [attr, value] of Object.entries(track)) { - if (['id','pos','time','track','disc'].indexOf(attr) >= 0) { - Vue.set(this.track, attr, parseInt(value)); - } else { - Vue.set(this.track, attr, value); - } - } - }, - - _parsePlaylist: function(playlist) { - if (!playlist || playlist.length === 0) { - return; - } - - this.playlist = []; - - for (var track of playlist) { - for (const [attr, value] of Object.entries(track)) { - if (['time','pos','id','track','disc'].indexOf(attr) >= 0) { - track[attr] = parseInt(value); - } else { - track[attr] = value; - } - } - - this.playlist.push(track); - } - }, - - _parseBrowserItems: function(browserItems) { - if (!browserItems || browserItems.length === 0) { - return; - } - - this.browserItems = []; - - for (var item of browserItems) { - if (item.directory) { - this.browserItems.push({ - id: 'directory:' + item.directory, - type: 'directory', - name: item.directory, - }); - } else if (item.playlist) { - this.browserItems.push({ - id: 'playlist:' + item.playlist, - type: 'playlist', - name: item.playlist, - 'last-modified': item['last-modified'], - }); - } else if (item.file) { - this.browserItems.push({ - id: item.file, - type: 'file', - name: item.file, - ...item, - }); - } - } - }, - - previous: async function() { - await request('music.mpd.previous'); - let track = await request('music.mpd.currentsong'); - this.onNewPlayingTrack({track: track}); - }, - - repeat: async function() { - await request('music.mpd.repeat'); - let status = await request('music.mpd.status'); - this._parseStatus(status); - }, - - consume: async function() { - await request('music.mpd.consume'); - let status = await request('music.mpd.status'); - this._parseStatus(status); - }, - - single: async function() { - await request('music.mpd.single'); - let status = await request('music.mpd.status'); - this._parseStatus(status); - }, - - playPause: async function() { - await request('music.mpd.pause'); - let status = await request('music.mpd.status'); - const method = status.state === 'play' ? this.onMusicPlay : this.onMusicPause; - method({ status: status }); - }, - - playpos: async function(pos) { - if (pos == null) { - if (!Object.keys(this.selectedPlaylistItems).length) { - return; - } - - pos = Object.keys(this.selectedPlaylistItems)[0]; - } - - let status = await request('music.mpd.play_pos', {pos: pos}); - this._parseStatus(status); - - let track = await request('music.mpd.currentsong'); - this._parseTrack(track); - }, - - stop: async function() { - await request('music.mpd.stop'); - this.onMusicStop({}); - }, - - random: async function() { - await request('music.mpd.random'); - let status = await request('music.mpd.status'); - this._parseStatus(status); - }, - - next: async function() { - await request('music.mpd.next'); - let track = await request('music.mpd.currentsong'); - this.onNewPlayingTrack({track: track}); - }, - - seek: async function(event) { - var value; - - if (event.target) { - value = parseFloat(event.target.value); - } else if (event.value) { - value = parseFloat(event.value); - } else { - value = parseFloat(event); - } - - const status = await request('music.mpd.seekcur', {value: value}); - this.onSeekChange({status: status}); - }, - - volume: async function(event) { - var value; - - if (event.target) { - value = parseFloat(event.target.value); - } else if (event.value) { - value = parseFloat(event.value); - } else { - value = parseFloat(event); - } - - const status = await request('music.mpd.setvol', {vol: value}); - this.onVolumeChange({status: status}); - }, - - clear: async function() { - if (!confirm('Are you sure that you want to clear the playlist?')) { - return; - } - - await request('music.mpd.clear'); - this.stopTimer(); - this.track = {}; - this.playlist = []; - - let status = await request('music.mpd.status'); - this._parseStatus(status); - }, - - add: async function(resource, position=null) { - var args = {resource: resource}; - if (position != null) { - args.position = position; - } - - let status = await request('music.mpd.add', args); - this._parseStatus(status); - - let playlist = await request('music.mpd.playlistinfo'); - this._parsePlaylist(playlist); - }, - - load: async function(item, play=false) { - await request('music.mpd.load', {playlist:item, play:play}); - let playlist = await request('music.mpd.playlistinfo'); - this._parsePlaylist(playlist); - }, - - del: async function() { - const positions = Object.keys(this.selectedPlaylistItems); - if (!positions.length) { - return; - } - - let status = await request('music.mpd.delete', {'positions': positions}); - this._parseStatus(status); - - for (const pos in positions) { - Vue.delete(this.selectedPlaylistItems, pos); - } - }, - - rm: async function(items) { - if (!items) { - items = Object.values(this.selectedBrowserItems); - } - - if (!items.length) { - return; - } - - let status = await request('music.mpd.rm', {playlist: items.map(_ => _.name)}); - this._parseStatus(status); - - items = await request('music.mpd.lsinfo', {uri: this.browserPath.join('/')}); - this._parseBrowserItems(items); - }, - - move: async function(fromPos, toPos, updateChanges=true) { - let status = await request('music.mpd.move', {from_pos: fromPos, to_pos: toPos}); - - if (updateChanges) { - this._parseStatus(status); - const playlist = await request('music.mpd.playlistinfo'); - this._parsePlaylist(playlist); - } - }, - - playlistmove: async function(fromPos, toPos) { - if (!this.selectedPlaylist.name) { - return; - } - - await request('music.mpd.playlistmove', {name: this.selectedPlaylist.name, from_pos: fromPos, to_pos: toPos}); - }, - - swap: async function() { - if (Object.keys(this.selectedPlaylistItems).length !== 2) { - return; - } - - const positions = Object.keys(this.selectedPlaylistItems).sort(); - await request('music.mpd.move', {from_pos: positions[1], to_pos: positions[0]}); - - let status = await request('music.mpd.move', {from_pos: positions[0]+1, to_pos: positions[1]}); - this._parseStatus(status); - - const playlist = await request('music.mpd.playlistinfo'); - this._parsePlaylist(playlist); - }, - - cd: async function() { - const item = Object.values(this.selectedBrowserItems)[0]; - - if (item.name === '..') { - if (this.browserPath.length) { - this.browserPath.pop(); - } - } else { - this.browserPath = item.name.split('/'); - } - - const items = await request('music.mpd.lsinfo', {uri: this.browserPath.join('/')}); - this._parseBrowserItems(items); - }, - - info: async function(item) { - var info = item; - - if (typeof(item) === 'string') { - var items = await request('music.mpd.search', {filter: {file: info}}); - item = items.length ? items[0] : {file: info}; - } - - this.infoItem = item; - this.modalVisible.info = true; - }, - - searchArtist: async function(item) { - await this.search({artist: item.artist}); - }, - - searchAlbum: async function(item) { - var query = {}; - - if (item['x-albumuri']) { - query.file = item['x-albumuri']; - } else { - query.artist = item.albumartist || item.artist; - query.album = item.album; - } - - await this.search(query); - }, - - search: async function(query) { - this.$refs.search.resetQuery(); - this.$refs.search.query = query; - this.$refs.search.visible = true; - await this.$refs.search.search(); - }, - - listplaylists: async function() { - this.playlists = []; - let playlists = await request('music.mpd.listplaylists'); - - for (const p of playlists) { - this.playlists.push(p); - } - }, - - listplaylist: async function(name) { - return await request('music.mpd.listplaylist', {name: name}); - }, - - listplaylistinfo: async function(name) { - return await request('music.mpd.listplaylistinfo', {name: name}); - }, - - playlistadd: async function(items=[], playlists=[]) { - if (!playlists.length) { - if (this.modalVisible.playlistAdd) { - playlists = Object.keys(this.selectedPlaylistAddItems); - } - } - - if (!items.length) { - items = this.addToPlaylistItems; - } - - if (!items.length || !playlists.length) { - return; - } - - var promises = []; - for (const playlist of playlists) { - promises.push(request('music.mpd.playlistadd', { - name: playlist, uri: items.map(_ => typeof(_) === 'object' ? _.file : _) - })); - } - - await Promise.all(promises); - this.modalVisible.playlistAdd = false; - this.addToPlaylistItems = []; - }, - - playlistdelete: async function(items=[]) { - if (!items.length) { - items = Object.keys(this.selectedEditorItems); - } - - if (!items.length || !this.selectedPlaylist.name) { - return; - } - - await request('music.mpd.playlistdelete', {name: this.selectedPlaylist.name, pos: items}); - await this.refreshSelectedPlaylist(); - }, - - playlistclear: async function() { - if (!confirm('Are you sure that you want to clear this playlist? This operation is NOT REVERSIBLE')) { - return; - } - - await request('music.mpd.playlistclear', {name: this.selectedPlaylist.name}); - await this.refreshSelectedPlaylist(); - }, - - rename: async function() { - if (!this.selectedPlaylist.name) { - return; - } - - var newName = prompt('New name for the playlist', this.selectedPlaylist.name); - if (!newName.length) { - return; - } - - await request('music.mpd.rename', {name: this.selectedPlaylist.name, new_name: newName}); - await this.listplaylists(); - - for (var item of this.browserItems) { - if (item.type === 'playlist' && item.name === this.selectedPlaylist.name) { - item.name = newName; - } - } - - this.selectedPlaylist.name = newName; - }, - - onNewPlayingTrack: async function(event) { - var previousTrack = { - file: this.track.file, - artist: this.track.artist, - title: this.track.title, - }; - - this.status.state = 'play'; - Vue.set(this.status, 'elapsed', 0); - this.track = {}; - this._parseTrack(event.track); - - let status = event.status ? event.status : await request('music.mpd.status'); - this._parseStatus(status); - this.startTimer(); - - if (this.track.file != previousTrack.file - || this.track.artist != previousTrack.artist - || this.track.title != previousTrack.title) { - this.showNewTrackNotification(); - - const self = this; - setTimeout(function() { - self.scrollToActiveTrack(); - }, 100); - } - }, - - showNewTrackNotification: function() { - createNotification({ - html: '' + (this.track.artist || '[No Artist]') + '
' + - (this.track.title || '[No Title]'), - image: { - icon: 'play', - } - }); - }, - - onMusicStop: function(event) { - this.status.state = 'stop'; - Vue.set(this.status, 'elapsed', 0); - this._parseStatus(event.status); - this._parseTrack(event.track); - this.stopTimer(); - }, - - onMusicPlay: function(event) { - this.status.state = 'play'; - this._parseStatus(event.status); - this._parseTrack(event.track); - this.startTimer(); - }, - - onMusicPause: function(event) { - this.status.state = 'pause'; - this._parseStatus(event.status); - this._parseTrack(event.track); - - Vue.set(this.syncTime, 'timestamp', new Date()); - Vue.set(this.syncTime, 'elapsed', this.status.elapsed); - }, - - onSeekChange: function(event) { - if (event.position != null) - Vue.set(this.status, 'elapsed', parseFloat(event.position)); - if (event.status) - this._parseStatus(event.status); - if (event.track) - this._parseTrack(event.track); - - Vue.set(this.syncTime, 'timestamp', new Date()); - Vue.set(this.syncTime, 'elapsed', this.status.elapsed); - }, - - onPlaylistChange: async function(event) { - if (event.changes) { - this.playlist = event.changes; - } else { - const playlist = await request('music.mpd.playlistinfo'); - this._parsePlaylist(playlist); - } - }, - - onVolumeChange: function(event) { - if (event.volume != null) - this.status.volume = parseFloat(event.volume); - if (event.status) - this._parseStatus(event.status); - if (event.track) - this._parseTrack(event.track); - }, - - onRepeatChange: function(event) { - this.status.repeat = event.state; - }, - - onRandomChange: function(event) { - this.status.random = event.state; - }, - - onConsumeChange: function(event) { - this.status.consume = event.state; - }, - - onSingleChange: function(event) { - this.status.single = event.state; - }, - - startTimer: function() { - if (this.timer != null) { - this.stopTimer(); - } - - Vue.set(this.syncTime, 'timestamp', new Date()); - Vue.set(this.syncTime, 'elapsed', this.status.elapsed); - this.timer = setInterval(this.timerFunc, 1000); - }, - - stopTimer: function() { - if (this.timer == null) { - clearInterval(this.timer); - this.timer = null; - } - }, - - timerFunc: function() { - if (this.status.state !== 'play' || this.status.elapsed == null) { - return; - } - - Vue.set(this.status, 'elapsed', this.syncTime.elapsed + - ((new Date()).getTime()/1000) - (this.syncTime.timestamp.getTime()/1000)); - }, - - matchesPlaylistFilter: function(track) { - if (this.playlistFilter.length === 0) - return true; - - const filter = this.playlistFilter.split(' ').filter(_ => _.length > 0).map(_ => _.toLocaleLowerCase()).join(' '); - return [track.artist || '', track.title || '', track.album || ''].join(' ').toLocaleLowerCase().indexOf(filter) >= 0; - }, - - matchesEditorFilter: function(track) { - if (this.editorFilter.length === 0) - return true; - - const filter = this.editorFilter.split(' ').filter(_ => _.length > 0).map(_ => _.toLocaleLowerCase()).join(' '); - return [track.artist || '', track.title || '', track.album || ''].join(' ').toLocaleLowerCase().indexOf(filter) >= 0; - }, - - matchesBrowserFilter: function(item) { - if (this.browserFilter.length === 0) - return true; - - const filter = this.browserFilter.toLocaleLowerCase().split(' ').filter(_ => _.length > 0).join(' '); - return (item.artist || '').concat(item.name).toLocaleLowerCase().indexOf(filter) >= 0; - }, - - matchesPlaylistAddFilter: function(item) { - if (this.playlistAddFilter.length === 0) - return true; - - const filter = this.playlistAddFilter.toLocaleLowerCase().split(' ').filter(_ => _.length > 0).join(' '); - return (item.playlist || '').toLocaleLowerCase().indexOf(filter) >= 0; - }, - - onPlaylistItemClick: async function(track) { - if (this.selectionMode.playlist) { - if (track.pos in this.selectedPlaylistItems) { - Vue.delete(this.selectedPlaylistItems, track.pos); - } else { - Vue.set(this.selectedPlaylistItems, track.pos, track); - } - } else if (this.moveMode.playlist) { - var fromPos = Object.values(this.selectedPlaylistItems).map(_ => _.pos); - var toPos = track.pos; - this.moveMode.playlist = false; - - const promises = fromPos.map((pos,i) => this.move(pos, toPos+i, false)); - await Promise.all(promises); - this.selectedPlaylistItems = {}; - - const playlist = await request('music.mpd.playlistinfo'); - this._parsePlaylist(playlist); - } else if (track.pos in this.selectedPlaylistItems) { - Vue.delete(this.selectedPlaylistItems, track.pos); - } else { - this.selectedPlaylistItems = {}; - Vue.set(this.selectedPlaylistItems, track.pos, track); - openDropdown(this.$refs.playlistDropdown.$el); - } - }, - - onEditorItemClick: async function(track) { - if (this.selectionMode.editor) { - if (track.pos in this.selectedEditorItems) { - Vue.delete(this.selectedEditorItems, track.pos); - } else { - Vue.set(this.selectedEditorItems, track.pos, track); - } - } else if (this.moveMode.editor) { - var fromPos = Object.values(this.selectedEditorItems).map(_ => _.pos); - var toPos = track.pos; - this.moveMode.editor = false; - - const promises = fromPos.map((pos,i) => this.playlistmove(pos, toPos+i)); - await Promise.all(promises); - await this.refreshSelectedPlaylist(); - } else if (track.pos in this.selectedEditorItems) { - Vue.delete(this.selectedEditorItems, track.pos); - } else { - this.selectedEditorItems = {}; - Vue.set(this.selectedEditorItems, track.pos, track); - openDropdown(this.$refs.editorDropdown.$el); - } - }, - - onBrowserItemClick: function(item) { - if (item.type === 'directory' && item.name === '..') { - this.selectedBrowserItems = {}; - this.selectedBrowserItems[item.id] = item; - this.cd(); - this.selectedBrowserItems = {}; - return; - } - - if (this.selectionMode.browser) { - if (item.id in this.selectedBrowserItems) { - Vue.delete(this.selectedBrowserItems, item.id); - } else { - Vue.set(this.selectedBrowserItems, item.id, item); - } - } else if (item.id in this.selectedBrowserItems) { - Vue.delete(this.selectedBrowserItems, item.id); - } else { - this.selectedBrowserItems = {}; - Vue.set(this.selectedBrowserItems, item.id, item); - openDropdown(this.$refs.browserDropdown.$el); - } - }, - - onPlaylistAddItemClick: function(playlist) { - if (playlist.playlist in this.selectedPlaylistAddItems) { - Vue.delete(this.selectedPlaylistAddItems, playlist.playlist); - } else { - Vue.set(this.selectedPlaylistAddItems, playlist.playlist, playlist); - } - }, - - togglePlaylistSelectionMode: function() { - if (this.selectionMode.playlist && Object.keys(this.selectedPlaylistItems).length) { - openDropdown(this.$refs.playlistDropdown.$el); - } - - this.selectionMode.playlist = !this.selectionMode.playlist; - }, - - playlistSelectAll: function() { - this.selectedPlaylistItems = {}; - this.selectionMode.playlist = true; - - for (var track of this.playlist) { - this.selectedPlaylistItems[track.pos] = track; - } - - openDropdown(this.$refs.playlistDropdown.$el); - }, - - toggleBrowserSelectionMode: function() { - if (this.selectionMode.browser && Object.keys(this.selectedBrowserItems).length) { - openDropdown(this.$refs.browserDropdown.$el); - } - - this.selectionMode.browser = !this.selectionMode.browser; - }, - - toggleEditorSelectionMode: function() { - if (this.selectionMode.editor && Object.keys(this.selectedEditorItems).length) { - openDropdown(this.$refs.editorDropdown.$el); - } - - this.selectionMode.editor = !this.selectionMode.editor; - }, - - browserSelectAll: function() { - this.selectedBrowserItems = {}; - this.selectionMode.browser = true; - - for (var item of this.browserItems) { - if (item.type !== 'directory' && item.name !== '..') { - this.selectedBrowserItems[item.id] = item; - } - } - - openDropdown(this.$refs.browserDropdown.$el); - }, - - editorSelectAll: function() { - this.selectedEditorItems = {}; - this.selectionMode.editor = true; - - for (var item of this.selectedPlaylist.items) { - Vue.set(this.selectedEditorItems, item.pos, item); - } - - openDropdown(this.$refs.editorDropdown.$el); - }, - - scrollToActiveTrack: function() { - if (this.$refs.activePlaylistTrack && this.$refs.activePlaylistTrack.length) { - this.$refs.activePlaylistTrack[0].$el.scrollIntoView({behavior: 'smooth'}); - } else { - return; - } - }, - - addToPlaylistPrompt: async function() { - var resource = prompt('Path or URI of the resource to add'); - if (!resource.length) { - return; - } - - await this.add(resource); - }, - - addToPlaylistEditorPrompt: async function() { - var resource = prompt('Path or URI of the resource to add'); - if (!resource.length) { - return; - } - - await request('music.mpd.playlistadd', {name: this.selectedPlaylist.name, uri: resource}); - await this.refreshSelectedPlaylist(); - }, - - savePlaylistPrompt: async function() { - var name = prompt('Playlist name'); - if (!name.length) { - return; - } - - let status = await request('music.mpd.save', {name: name}); - this._parseStatus(status); - - let items = await request('music.mpd.lsinfo', {uri: this.browserPath.join('/')}); - this._parseBrowserItems(items); - }, - - refreshSelectedPlaylist: async function() { - if (!this.selectedPlaylist.name) { - return; - } - - let items = (await this.listplaylistinfo(this.selectedPlaylist.name)).map((_, i) => { - return { ..._, pos: i } - }); - - Vue.set(this.selectedPlaylist, 'items', items); - }, - }, - - created: function() { - this.refresh(); - registerEventHandler(this.onNewPlayingTrack, 'platypush.message.event.music.NewPlayingTrackEvent'); - registerEventHandler(this.onMusicStop, 'platypush.message.event.music.MusicStopEvent'); - registerEventHandler(this.onMusicPlay, 'platypush.message.event.music.MusicPlayEvent'); - registerEventHandler(this.onMusicPause, 'platypush.message.event.music.MusicPauseEvent'); - registerEventHandler(this.onSeekChange, 'platypush.message.event.music.SeekChangeEvent'); - registerEventHandler(this.onPlaylistChange, 'platypush.message.event.music.PlaylistChangeEvent'); - registerEventHandler(this.onVolumeChange, 'platypush.message.event.music.VolumeChangeEvent'); - registerEventHandler(this.onRepeatChange, 'platypush.message.event.music.PlaybackRepeatModeChangeEvent'); - registerEventHandler(this.onRandomChange, 'platypush.message.event.music.PlaybackRandomModeChangeEvent'); - registerEventHandler(this.onConsumeChange, 'platypush.message.event.music.PlaybackConsumeModeChangeEvent'); - registerEventHandler(this.onSingleChange, 'platypush.message.event.music.PlaybackSingleModeChangeEvent'); - }, - - mounted: function() { - this.adjustLayout(); - this.scrollToActiveTrack(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.mpd/playlist.js b/platypush/backend/http/static/js/plugins/music.mpd/playlist.js deleted file mode 100644 index 99a0eca7..00000000 --- a/platypush/backend/http/static/js/plugins/music.mpd/playlist.js +++ /dev/null @@ -1,26 +0,0 @@ -Vue.component('music-mpd-playlist-item', { - template: '#tmpl-music-mpd-playlist-item', - mixins: [utils], - props: { - track: { - type: Object, - default: {}, - }, - - selected: { - type: Boolean, - default: false, - }, - - active: { - type: Boolean, - default: false, - }, - - move: { - type: Boolean, - default: false, - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.mpd/search.js b/platypush/backend/http/static/js/plugins/music.mpd/search.js deleted file mode 100644 index dcf8a789..00000000 --- a/platypush/backend/http/static/js/plugins/music.mpd/search.js +++ /dev/null @@ -1,229 +0,0 @@ -Vue.component('music-mpd-search', { - template: '#tmpl-music-mpd-search', - props: ['mpd'], - data: function() { - return { - visible: false, - showResults: false, - results: [], - filter: '', - selectionMode: false, - selectedItems: {}, - - query: { - any: '', - file: '', - artist: '', - title: '', - album: '', - }, - }; - }, - - computed: { - dropdownItems: function() { - var self = this; - var items = []; - - if (Object.keys(this.selectedItems).length === 1) { - items.push( - { - text: 'Play', - icon: 'play', - click: async function() { - const item = Object.values(self.selectedItems)[0]; - await self.mpd.add(item.file, position=0); - await self.mpd.playpos(0); - self.selectedItems = {}; - }, - }, - { - text: 'Replace and play', - icon: 'play', - click: async function() { - await self.mpd.clear(); - - const item = Object.values(self.selectedItems)[0]; - await self.mpd.add(item.file, position=0); - await self.mpd.playpos(0); - self.selectedItems = {}; - }, - } - ); - } - - items.push( - { - text: 'Add to queue', - icon: 'plus', - click: async function() { - const items = Object.values(self.selectedItems); - const promises = items.map(item => self.mpd.add(item.file)); - - await Promise.all(promises); - self.selectedItems = {}; - }, - }, - ); - - if (Object.values(this.selectedItems).filter(_ => _.time != null).length === Object.values(this.selectedItems).length) { - items.push( - { - text: 'Add to playlist', - icon: 'list', - click: async function() { - self.mpd.addToPlaylistItems = Object.values(self.selectedItems).map(_ => _.file); - self.mpd.modalVisible.playlistAdd = true; - await self.mpd.listplaylists(); - self.selectedItems = {}; - }, - }, - ); - } - - if (Object.keys(this.selectedItems).length === 1) { - const item = Object.values(this.selectedItems)[0]; - - if (item.artist && item.artist.length) { - items.push({ - text: 'View artist', - icon: 'user', - click: async function() { - await self.mpd.searchArtist(item); - self.selectedItems = {}; - } - }); - } - - if (item.album && item.album.length) { - items.push({ - text: 'View album', - icon: 'compact-disc', - click: async function() { - await self.mpd.searchAlbum(item); - self.selectedItems = {}; - }, - }); - } - - items.push({ - text: 'View info', - icon: 'info', - click: function() { - self.$emit('info', item); - }, - }); - } - - return items; - }, - }, - - methods: { - search: async function() { - const filter = Object.keys(this.query).reduce((query, key) => { - if (this.query[key].length) { - query[key] = this.query[key]; - } - - return query; - }, {}); - - this.results = []; - var results = await request('music.mpd.search', {filter: filter}); - - this.results = results.sort((a,b) => { - if (a.artist != b.artist) - return (a.artist || '').localeCompare(b.artist || ''); - if (a.album != b.album) - return (a.album || '').localeCompare(b.album || ''); - if (a.track != b.track) - return parseInt(a.track || 0) > parseInt(b.track || 0); - if (a.title != b.title) - return (a.title || '').localeCompare(b.title || ''); - if (a.file != b.file) - return (a.file || '').localeCompare(b.file || ''); - return 0; - }); - - this.showResults = true; - }, - - matchesFilter: function(item) { - if (this.filter.length === 0) - return true; - - const filter = this.filter.split(' ').filter(_ => _.length > 0).map(_ => _.toLocaleLowerCase()).join(' '); - return [item.file || '', item.artist || '', item.title || '', item.album || ''].join(' ').toLocaleLowerCase().indexOf(filter) >= 0; - }, - - onItemClick: function(item) { - if (this.selectionMode) { - if (item.file in this.selectedItems) { - Vue.delete(this.selectedItems, item.file); - } else { - Vue.set(this.selectedItems, item.file, item); - } - } else if (item.file in this.selectedItems) { - Vue.delete(this.selectedItems, item.file); - } else { - this.selectedItems = {}; - Vue.set(this.selectedItems, item.file, item); - openDropdown(this.$refs.dropdown.$el); - } - }, - - toggleSelectionMode: function() { - if (this.selectionMode && Object.keys(this.selectedItems).length) { - openDropdown(this.$refs.dropdown.$el); - } - - this.selectionMode = !this.selectionMode; - }, - - selectAll: function() { - this.selectedItems = {}; - this.selectionMode = true; - - for (var item of this.results) { - this.selectedItems[item.file] = item; - } - - openDropdown(this.$refs.dropdown.$el); - }, - - resetQuery: function() { - this.filter = ''; - for (const attr of Object.keys(this.query)) { - this.query[attr] = ''; - } - }, - - resetForm: function() { - this.resetQuery(); - this.showResults = false; - var self = this; - - setTimeout(() => { - self.$refs.form.querySelector('input[type=text]:first-child').focus() - }, 100) - }, - }, -}); - -Vue.component('music-mpd-search-item', { - template: '#tmpl-music-mpd-search-item', - mixins: [utils], - props: { - item: { - type: Object, - default: {}, - }, - - selected: { - type: Boolean, - default: false, - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.mpd/utils.js b/platypush/backend/http/static/js/plugins/music.mpd/utils.js deleted file mode 100644 index 5fe84b74..00000000 --- a/platypush/backend/http/static/js/plugins/music.mpd/utils.js +++ /dev/null @@ -1,26 +0,0 @@ -var utils = { - methods: { - convertTime: function(time) { - time = parseFloat(time); // Normalize strings - var t = {}; - t.h = '' + parseInt(time/3600); - t.m = '' + parseInt(time/60 - t.h*60); - t.s = '' + parseInt(time - (t.h*3600 + t.m*60)); - - for (var attr of ['m','s']) { - if (parseInt(t[attr]) < 10) { - t[attr] = '0' + t[attr]; - } - } - - var ret = []; - if (parseInt(t.h)) { - ret.push(t.h); - } - - ret.push(t.m, t.s); - return ret.join(':'); - }, - }, -}; - diff --git a/platypush/backend/http/static/js/plugins/music.snapcast/client.js b/platypush/backend/http/static/js/plugins/music.snapcast/client.js deleted file mode 100644 index 105e118e..00000000 --- a/platypush/backend/http/static/js/plugins/music.snapcast/client.js +++ /dev/null @@ -1,66 +0,0 @@ -Vue.component('music-snapcast-client', { - template: '#tmpl-music-snapcast-client', - props: { - config: { type: Object }, - connected: { type: Boolean }, - host: { type: Object }, - id: { type: String }, - groupId: { type: String }, - lastSeen: { type: Object }, - snapclient: { type: Object }, - server: { type: Object }, - bus: { type: Object }, - }, - - methods: { - muteToggled: function(event) { - this.bus.$emit('client-mute-changed', { - id: this.id, - server: this.server, - value: !event.value, - }); - }, - - volumeChanged: function(event) { - this.bus.$emit('client-volume-changed', { - id: this.id, - server: this.server, - value: parseInt(event.target.value), - }); - }, - }, -}); - -Vue.component('music-snapcast-client-info', { - props: { - info: { type: Object } - }, - - data: function() { - return { - loading: false, - }; - }, - - methods: { - deleteClient: async function(event) { - if (!confirm('Are you SURE that you want to remove this client?')) { - return; - } - - this.loading = true; - await request('music.snapcast.delete_client', { - client: this.info.id, - host: this.info.server.host.name, - port: this.info.server.host.port, - }); - - this.loading = false; - createNotification({ - text: 'Snapcast client successfully removed', - image: { icon: 'check' } - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.snapcast/group.js b/platypush/backend/http/static/js/plugins/music.snapcast/group.js deleted file mode 100644 index 626bd5fc..00000000 --- a/platypush/backend/http/static/js/plugins/music.snapcast/group.js +++ /dev/null @@ -1,80 +0,0 @@ -Vue.component('music-snapcast-group', { - template: '#tmpl-music-snapcast-group', - props: { - id: { type: String }, - clients: { type: Object }, - muted: { type: Boolean }, - name: { type: String }, - stream: { type: Object }, - server: { type: Object }, - bus: { type: Object }, - }, - - methods: { - muteToggled: function(event) { - this.bus.$emit('group-mute-changed', { - id: this.id, - server: this.server, - value: !event.value, - }); - }, - }, -}); - -Vue.component('music-snapcast-group-info', { - props: { - info: { type: Object } - }, - - data: function() { - return { - loading: false, - }; - }, - - methods: { - onClientUpdate: async function(event) { - var clients = this.$refs.groupClients - .map(row => row.querySelector('input[type=checkbox]:checked')) - .filter(_ => _ != null) - .map(input => input.value); - - this.loading = true; - await request('music.snapcast.group_set_clients', { - clients: clients, - group: this.info.group.id, - host: this.info.server.host.name, - port: this.info.server.host.port, - }); - - this.loading = false; - createNotification({ - text: 'Snapcast group successfully updated', - image: { - icon: 'check', - } - }); - }, - - onStreamUpdate: async function(event) { - this.loading = true; - await request('music.snapcast.group_set_stream', { - stream_id: event.target.value, - group: this.info.group.id, - host: this.info.server.host.name, - port: this.info.server.host.port, - }); - - this.loading = false; - this.info.group.stream_id = event.target.value; - - createNotification({ - text: 'Snapcast stream successfully updated', - image: { - icon: 'check', - } - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.snapcast/host.js b/platypush/backend/http/static/js/plugins/music.snapcast/host.js deleted file mode 100644 index e27ab147..00000000 --- a/platypush/backend/http/static/js/plugins/music.snapcast/host.js +++ /dev/null @@ -1,22 +0,0 @@ -Vue.component('music-snapcast-host', { - template: '#tmpl-music-snapcast-host', - props: { - groups: { type: Object }, - server: { type: Object }, - streams: { type: Object }, - bus: { type: Object }, - }, - - data: function() { - return { - collapsed: false, - }; - }, -}); - -Vue.component('music-snapcast-host-info', { - props: { - info: { type: Object } - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/music.snapcast/index.js b/platypush/backend/http/static/js/plugins/music.snapcast/index.js deleted file mode 100644 index 812e3d9b..00000000 --- a/platypush/backend/http/static/js/plugins/music.snapcast/index.js +++ /dev/null @@ -1,195 +0,0 @@ -Vue.component('music-snapcast', { - template: '#tmpl-music-snapcast', - props: ['config'], - data: function() { - return { - hosts: {}, - ports: {}, - modal: { - host: { - visible: false, - info: {}, - }, - group: { - visible: false, - info: {}, - }, - client: { - visible: false, - info: {}, - }, - }, - - bus: new Vue({}), - }; - }, - - methods: { - _parseServerStatus: function(status) { - status.server.host.port = this.ports[status.server.host.name]; - var groups = {}; - - for (const group of status.groups) { - var clients = {}; - for (const client of group.clients) { - clients[client.id] = client; - } - - group.clients = clients; - groups[group.id] = group; - } - - status.groups = groups; - var streams = {}; - - for (const stream of status.streams) { - streams[stream.id] = stream; - } - - status.streams = streams; - Vue.set(this.hosts, status.server.host.name, status); - }, - - refresh: async function() { - let hosts = await request('music.snapcast.get_backend_hosts'); - let promises = Object.keys(hosts).map( - (host) => request('music.snapcast.status', {host: host, port: hosts[host]}) - ); - - let statuses = await Promise.all(promises); - this.hosts = {}; - - for (const status of statuses) { - this.ports[status.server.host.name] = hosts[status.server.host.name]; - this._parseServerStatus(status); - } - }, - - onClientUpdate: function(event) { - for (const groupId of Object.keys(this.hosts[event.host].groups)) { - if (event.client.id in this.hosts[event.host].groups[groupId].clients) { - this.hosts[event.host].groups[groupId].clients[event.client.id] = event.client; - } - } - }, - - onGroupStreamChange: function(event) { - this.hosts[event.host].groups[event.group].stream_id = event.stream; - }, - - onServerUpdate: function(event) { - this._parseServerStatus(event.server); - }, - - onStreamUpdate: function(event) { - this.hosts[event.host].streams[event.stream.id] = event.stream; - }, - - onClientVolumeChange: function(event) { - for (const groupId of Object.keys(this.hosts[event.host].groups)) { - if (event.client in this.hosts[event.host].groups[groupId].clients) { - if (event.volume != null) { - this.hosts[event.host].groups[groupId].clients[event.client].config.volume.percent = event.volume; - } - - if (event.muted != null) { - this.hosts[event.host].groups[groupId].clients[event.client].config.volume.muted = event.muted; - } - } - } - }, - - onGroupMuteChange: function(event) { - this.hosts[event.host].groups[event.group].muted = event.muted; - }, - - modalShow: function(event) { - switch(event.type) { - case 'host': - this.modal[event.type].info = this.hosts[event.host]; - break; - case 'group': - this.modal[event.type].info.server = this.hosts[event.host].server; - this.modal[event.type].info.group = this.hosts[event.host].groups[event.group]; - this.modal[event.type].info.streams = this.hosts[event.host].streams; - this.modal[event.type].info.clients = {}; - - for (const group of Object.values(this.hosts[event.host].groups)) { - for (const client of Object.values(group.clients)) { - this.modal[event.type].info.clients[client.id] = client; - } - } - - break; - case 'client': - this.modal[event.type].info = this.hosts[event.host].groups[event.group].clients[event.client]; - this.modal[event.type].info.server = this.hosts[event.host].server; - break; - } - - this.modal[event.type].visible = true; - }, - - groupMute: async function(event) { - await request('music.snapcast.mute', { - group: event.id, - host: event.server.ip || event.server.name, - port: event.server.port, - mute: event.value, - }); - - this.hosts[event.server.name].groups[event.id].muted = event.value; - }, - - clientMute: async function(event) { - await request('music.snapcast.mute', { - client: event.id, - host: event.server.ip || event.server.name, - port: event.server.port, - mute: event.value, - }); - - for (const groupId of Object.keys(this.hosts[event.server.name].groups)) { - if (event.id in this.hosts[event.server.name].groups[groupId].clients) { - this.hosts[event.server.name].groups[groupId].clients[event.id].config.volume.muted = event.value; - } - } - }, - - clientSetVolume: async function(event) { - await request('music.snapcast.volume', { - client: event.id, - host: event.server.ip || event.server.name, - port: event.server.port, - volume: event.value, - }); - - for (const groupId of Object.keys(this.hosts[event.server.name].groups)) { - if (event.id in this.hosts[event.server.name].groups[groupId].clients) { - this.hosts[event.server.name].groups[groupId].clients[event.id].config.volume.percent = event.value; - } - } - }, - }, - - created: function() { - this.refresh(); - - registerEventHandler(this.onClientUpdate, - 'platypush.message.event.music.snapcast.ClientConnectedEvent', - 'platypush.message.event.music.snapcast.ClientDisconnectedEvent', - 'platypush.message.event.music.snapcast.ClientNameChangeEvent'); - - registerEventHandler(this.onGroupStreamChange, 'platypush.message.event.music.snapcast.GroupStreamChangeEvent'); - registerEventHandler(this.onServerUpdate, 'platypush.message.event.music.snapcast.ServerUpdateEvent'); - registerEventHandler(this.onStreamUpdate, 'platypush.message.event.music.snapcast.StreamUpdateEvent'); - registerEventHandler(this.onClientVolumeChange, 'platypush.message.event.music.snapcast.ClientVolumeChangeEvent'); - registerEventHandler(this.onGroupMuteChange, 'platypush.message.event.music.snapcast.GroupMuteChangeEvent'); - - this.bus.$on('group-mute-changed', this.groupMute); - this.bus.$on('client-mute-changed', this.clientMute); - this.bus.$on('client-volume-changed', this.clientSetVolume); - this.bus.$on('modal-show', this.modalShow); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/pushbullet/index.js b/platypush/backend/http/static/js/plugins/pushbullet/index.js deleted file mode 100644 index 323a686a..00000000 --- a/platypush/backend/http/static/js/plugins/pushbullet/index.js +++ /dev/null @@ -1,23 +0,0 @@ -const Pushbullet = { - onMsg: function(event) { - if (event.push_type === 'mirror') { - createNotification({ - title: event.title, - text: event.body, - image: { - src: event.icon ? 'data:image/png;base64, ' + event.icon : undefined, - icon: event.icon ? undefined : 'bell', - }, - }); - } - }, - - registerHandlers: function() { - registerEventHandler(this.onMsg, 'platypush.message.event.pushbullet.PushbulletEvent'); - }, -}; - -onReady(() => { - Pushbullet.registerHandlers(); -}); - diff --git a/platypush/backend/http/static/js/plugins/sensors/index.js b/platypush/backend/http/static/js/plugins/sensors/index.js deleted file mode 100644 index 2cfbb263..00000000 --- a/platypush/backend/http/static/js/plugins/sensors/index.js +++ /dev/null @@ -1,76 +0,0 @@ -Vue.component('sensor-metric', { - template: '#tmpl-sensor-metric', - props: { - bus: { - type: Object, - }, - - name: { - type: String, - }, - - value: { - type: [String, Number, Object, Boolean, Array], - }, - }, -}); - -Vue.component('sensors', { - template: '#tmpl-sensors', - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - metrics: {}, - }; - }, - - methods: { - refresh: async function() { - if (!this.config.plugins) { - console.warn('Please specify a list of sensor plugins in your sensors section configuration'); - return; - } - - const promises = this.config.plugins.map(plugin => { - return new Promise((resolve, reject) => { - if (plugin === 'serial') { - // Don't refresh reads over the serial port, - // as it might mess up any data transfer already in progress - resolve(); - return; - } - - request(plugin + '.get_measurement').then(metrics => { - resolve(metrics); - }); - }); - }); - - Vue.set(this, 'metrics', (await Promise.all(promises)).reduce((obj, metrics) => { - if (!metrics) - return obj; - - for (const [name, value] of Object.entries(metrics)) { - obj[name] = value; - } - - return obj; - }, {})); - }, - - onSensorEvent: function(event) { - const data = event.data; - for (const [name, value] of Object.entries(data)) { - Vue.set(this.metrics, name, value); - } - }, - }, - - mounted: function() { - registerEventHandler(this.onSensorEvent, 'platypush.message.event.sensor.SensorDataChangeEvent'); - this.refresh(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/sound/index.js b/platypush/backend/http/static/js/plugins/sound/index.js deleted file mode 100644 index 5e2230b4..00000000 --- a/platypush/backend/http/static/js/plugins/sound/index.js +++ /dev/null @@ -1,23 +0,0 @@ -Vue.component('sound', { - template: '#tmpl-sound', - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - recording: false, - }; - }, - - methods: { - startRecording: function() { - this.recording = true; - }, - - stopRecording: async function() { - this.recording = false; - await request('sound.stop_recording') - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/switches/index.js b/platypush/backend/http/static/js/plugins/switches/index.js deleted file mode 100644 index f2a68429..00000000 --- a/platypush/backend/http/static/js/plugins/switches/index.js +++ /dev/null @@ -1,99 +0,0 @@ -const SwitchDevice = Vue.component('switch-device', { - template: '#tmpl-switch-device', - props: { - bus: { - type: Object, - }, - - device: { - type: Object, - default: () => {}, - }, - }, -}); - -const SwitchType = Vue.component('switch-type', { - template: '#tmpl-switch-type', - props: { - bus: { - type: Object, - }, - - name: { - type: String, - }, - - devices: { - type: Object, - default: () => {}, - }, - }, -}); - -Vue.component('switches', { - template: '#tmpl-switches', - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - plugins: {}, - }; - }, - - methods: { - refresh: async function() { - if (!this.config.plugins) { - console.warn('Please specify a list of switch plugins in your switch section configuration'); - return; - } - - const promises = this.config.plugins.map(plugin => { - return new Promise((resolve, reject) => { - request(plugin + '.status').then(status => { - const ret = {}; - ret[plugin] = status; - resolve(ret); - }); - }); - }); - - const statuses = (await Promise.all(promises)).reduce((obj, status) => { - obj[Object.keys(status)[0]] = Object.values(status)[0].reduce((obj2, device) => { - device.type = Object.keys(status)[0]; - obj2[device.id] = device; - return obj2; - }, {}); - - return obj; - }, {}); - - for (const [name, status] of Object.entries(statuses)) { - this.plugins[name] = status; - - const switchType = new SwitchType(); - switchType.bus = this.bus; - switchType.name = name; - switchType.devices = this.plugins[name]; - - switchType.$mount(); - this.$refs.root.appendChild(switchType.$el); - } - }, - - toggle: async function(type, device) { - let status = await request(type + '.toggle', {device: device}); - this.plugins[type][status.id].on = status.on; - }, - }, - - mounted: function() { - const self = this; - this.refresh(); - - this.bus.$on('switch-toggled', (evt) => { - self.toggle(evt.type, evt.device); - }); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/tts.google/index.js b/platypush/backend/http/static/js/plugins/tts.google/index.js deleted file mode 100644 index b9a16866..00000000 --- a/platypush/backend/http/static/js/plugins/tts.google/index.js +++ /dev/null @@ -1,26 +0,0 @@ -Vue.component('tts-google', { - template: '#tmpl-tts-google', - data: function() { - return { - talking: false, - }; - }, - - methods: { - talk: async function(event) { - event.preventDefault(); - - const args = [...event.target.querySelectorAll('input')].reduce((obj, el) => { - if (el.value.length) - obj[el.name] = el.value; - return obj; - }, {}); - - this.talking = true; - await request('tts.google.say', args); - this.talking = false; - }, - }, -}); - - diff --git a/platypush/backend/http/static/js/plugins/tts/index.js b/platypush/backend/http/static/js/plugins/tts/index.js deleted file mode 100644 index 6a8ee794..00000000 --- a/platypush/backend/http/static/js/plugins/tts/index.js +++ /dev/null @@ -1,25 +0,0 @@ -Vue.component('tts', { - template: '#tmpl-tts', - data: function() { - return { - talking: false, - }; - }, - - methods: { - talk: async function(event) { - event.preventDefault(); - - const args = [...event.target.querySelectorAll('input')].reduce((obj, el) => { - if (el.value.length) - obj[el.name] = el.value; - return obj; - }, {}); - - this.talking = true; - await request('tts.say', args); - this.talking = false; - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/tv.samsung.ws/index.js b/platypush/backend/http/static/js/plugins/tv.samsung.ws/index.js deleted file mode 100644 index b4718d01..00000000 --- a/platypush/backend/http/static/js/plugins/tv.samsung.ws/index.js +++ /dev/null @@ -1,115 +0,0 @@ -Vue.component('tv-samsung-ws', { - template: '#tmpl-tv-samsung-ws', - data: function() { - return {}; - }, - - methods: { - up: async function() { - await request('tv.samsung.ws.up'); - }, - - down: async function() { - await request('tv.samsung.ws.down'); - }, - - left: async function() { - await request('tv.samsung.ws.left'); - }, - - right: async function() { - await request('tv.samsung.ws.right'); - }, - - enter: async function() { - await request('tv.samsung.ws.enter'); - }, - - power: async function() { - await request('tv.samsung.ws.power'); - }, - - red: async function() { - await request('tv.samsung.ws.red'); - }, - - yellow: async function() { - await request('tv.samsung.ws.yellow'); - }, - - green: async function() { - await request('tv.samsung.ws.green'); - }, - - blue: async function() { - await request('tv.samsung.ws.blue'); - }, - - volumeUp: async function() { - await request('tv.samsung.ws.volume_up'); - }, - - volumeDown: async function() { - await request('tv.samsung.ws.volume_down'); - }, - - channelUp: async function() { - await request('tv.samsung.ws.channel_up'); - }, - - channelDown: async function() { - await request('tv.samsung.ws.channel_down'); - }, - - mute: async function() { - await request('tv.samsung.ws.mute'); - }, - - home: async function() { - await request('tv.samsung.ws.home'); - }, - - back: async function() { - await request('tv.samsung.ws.back'); - }, - - menu: async function() { - await request('tv.samsung.ws.menu'); - }, - - info: async function() { - await request('tv.samsung.ws.info'); - }, - - source: async function() { - await request('tv.samsung.ws.source'); - }, - - tools: async function() { - await request('tv.samsung.ws.tools'); - }, - - browser: async function() { - const url = prompt('URL to open').trim(); - if (!url.length) { - return; - } - - await request('tv.samsung.ws.open_browser', {'url': url}); - }, - - channel: async function() { - const ch = prompt('Channel number').trim(); - if (!ch.length) { - return; - } - - await request('tv.samsung.ws.channel', {channel: parseInt(ch)}); - }, - - color: async function(event) { - await request('tv.samsung.ws.' + event.target.value); - } - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zigbee.mqtt/device.js b/platypush/backend/http/static/js/plugins/zigbee.mqtt/device.js deleted file mode 100644 index 102bfae8..00000000 --- a/platypush/backend/http/static/js/plugins/zigbee.mqtt/device.js +++ /dev/null @@ -1,127 +0,0 @@ -Vue.component('zigbee-device', { - template: '#tmpl-zigbee-device', - props: ['device','bus','selected'], - data: function() { - return { - newPropertyName: '', - editMode: { - name: false, - }, - }; - }, - - methods: { - onDeviceClicked: function() { - this.bus.$emit('deviceClicked', { - deviceId: this.device.friendly_name, - }); - }, - - setValue: async function(event) { - let name = undefined; - if (this.newPropertyName && this.newPropertyName.length) { - name = this.newPropertyName; - } else { - name = event.event - ? event.event.target.parentElement.dataset.name - : event.target.dataset.name; - } - - if (!name || !name.length) { - return; - } - - const target = event.event - ? event.event.target.parentElement.querySelector('input') - : event.target; - - const value = target.getAttribute('type') === 'checkbox' - ? (target.checked ? 'OFF' : 'ON') - : target.value; - - await request('zigbee.mqtt.device_set', { - device: this.device.friendly_name, - property: name, - value: value, - }); - - if (this.newPropertyName && this.newPropertyName.length) { - this.newPropertyName = ''; - } - - this.bus.$emit('refreshDevices'); - }, - - removeDevice: async function(force=false) { - if (!confirm('Are you sure that you want to remove this device?')) { - return; - } - - await request('zigbee.mqtt.device_remove', { - device: this.device.friendly_name, - force: force, - }); - - this.bus.$emit('refreshDevices'); - }, - - banDevice: async function() { - if (!confirm('Are you sure that you want to ban this device?')) { - return; - } - - await request('zigbee.mqtt.device_ban', { - device: this.device.friendly_name, - }); - - this.bus.$emit('refreshDevices'); - }, - - whitelistDevice: async function() { - if (!confirm('Are you sure that you want to whitelist this device? Note: ALL the other non-whitelisted ' + - 'devices will be removed from the network')) { - return; - } - - await request('zigbee.mqtt.device_whitelist', { - device: this.device.friendly_name, - }); - - this.bus.$emit('refreshDevices'); - }, - - disableForm: function(form) { - form.querySelector('input,button').readOnly = true; - }, - - enableForm: function(form) { - form.querySelector('input,button').readOnly = false; - }, - - onEditMode: function(mode) { - Vue.set(this.editMode, mode, true); - const form = this.$refs[mode + 'Form']; - const input = form.querySelector('input[type=text]'); - - setTimeout(() => { - input.focus(); - input.select(); - }, 10); - }, - - editName: async function(event) { - this.disableForm(event.target); - const name = event.target.querySelector('input[name=name]').value; - - await request('zigbee.mqtt.device_rename', { - device: this.device.friendly_name, - name: name, - }); - - this.editMode.name = false; - this.enableForm(event.target); - this.bus.$emit('refreshDevices'); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zigbee.mqtt/group.js b/platypush/backend/http/static/js/plugins/zigbee.mqtt/group.js deleted file mode 100644 index 26f90257..00000000 --- a/platypush/backend/http/static/js/plugins/zigbee.mqtt/group.js +++ /dev/null @@ -1,149 +0,0 @@ -Vue.component('zigbee-group', { - template: '#tmpl-zigbee-group', - props: ['group','bus','selected'], - data: function() { - return { - properties: {}, - }; - }, - - methods: { - anyOn: async function() { - for (const dev of this.group.devices) { - const params = await request('zigbee.mqtt.device_get', {device: dev.friendly_name}); - if (params.state === 'ON') { - return true; - } - } - - return false; - }, - - allOn: async function() { - for (const dev of this.group.devices) { - const params = await request('zigbee.mqtt.device_get', {device: dev.friendly_name}); - if (params.state === 'OFF') { - return false; - } - } - - return true; - }, - - refreshProperties: async function() { - const props = {}; - - for (const dev of this.group.devices) { - const params = await request('zigbee.mqtt.device_get', {device: dev.friendly_name}); - for (const [name, value] of Object.entries(params)) { - if (name === 'linkquality') { - continue; - } - - if (name in props) { - props[name].push(value); - } else { - props[name] = [value]; - } - } - } - - for (const [name, values] of Object.entries(props)) { - if (name === 'state') { - props[name] = values.filter((value) => value === 'ON').length > 0; - } else if (!isNaN(values[0])) { - props[name] = values.reduce((sum, value) => sum + value, 0) / values.length; - } else { - props[name] = values[0]; - } - } - - this.properties = props; - }, - - onGroupClicked: function() { - this.bus.$emit('groupClicked', { - groupId: this.group.id, - }); - }, - - setValue: async function(event) { - const name = event.target.dataset.name; - if (!name || !name.length) { - return; - } - - await request('zigbee.mqtt.group_set', { - group: this.group.friendly_name, - property: name, - value: event.target.value, - }); - - this.bus.$emit('refreshDevices'); - }, - - toggleState: async function() { - const state = (await this.anyOn()) ? 'OFF' : 'ON'; - await request('zigbee.mqtt.group_set', { - group: this.group.friendly_name, - property: 'state', - value: state, - }); - - this.bus.$emit('refreshDevices'); - }, - - renameGroup: async function() { - const name = prompt('New name', this.group.friendly_name); - if (!name || !name.length || name === this.group.friendly_name) { - return; - } - - this.commandRunning = true; - await request('zigbee.mqtt.group_rename', { - name: name, - group: this.group.friendly_name, - }); - - this.commandRunning = false; - const self = this; - - setTimeout(() => { - self.bus.$emit('refreshGroups'); - }, 100); - }, - - removeGroup: async function() { - if (!confirm('Are you sure that you want to delete this group?')) { - return; - } - - this.commandRunning = true; - await request('zigbee.mqtt.group_remove', {name: this.group.friendly_name}); - this.commandRunning = false; - this.bus.$emit('refreshGroups'); - }, - - removeFromGroup: async function(device) { - if (!confirm('Are you sure that you want to remove this node from ' + this.group.label + '?')) { - return; - } - - await request('zigbee.mqtt.group_remove_device', { - device: device, - group: this.group.friendly_name, - }); - - this.bus.$emit('refreshGroups'); - }, - }, - - created: function() { - this.refreshProperties(); - this.bus.$on('refresh', this.refreshProperties); - this.bus.$on('refreshDevices', this.refreshProperties); - this.bus.$on('refreshGroups', this.refreshProperties); - this.bus.$on('refreshProperties', this.refreshProperties); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zigbee.mqtt/index.js b/platypush/backend/http/static/js/plugins/zigbee.mqtt/index.js deleted file mode 100644 index df4c04c0..00000000 --- a/platypush/backend/http/static/js/plugins/zigbee.mqtt/index.js +++ /dev/null @@ -1,325 +0,0 @@ -Vue.component('zigbee-mqtt', { - template: '#tmpl-zigbee-mqtt', - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - status: {}, - devices: {}, - groups: {}, - commandRunning: false, - selected: { - view: 'devices', - deviceId: undefined, - groupId: undefined, - }, - loading: { - status: false, - devices: false, - groups: false, - }, - views: { - devices: true, - groups: true, - }, - modal: { - group: { - visible: false, - }, - }, - }; - }, - - computed: { - networkDropdownItems: function() { - const self = this; - return [ - { - text: 'Start Network', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zigbee.mqtt.start_network'); - self.commandRunning = false; - }, - }, - - { - text: 'Stop Network', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zigbee.mqtt.stop_network'); - self.commandRunning = false; - }, - }, - - { - text: 'Permit Join', - disabled: this.commandRunning, - click: async function() { - let seconds = prompt('Join allow period in seconds (type 0 for no time limits)', '60'); - if (!seconds) { - return; - } - - seconds = parseInt(seconds); - self.commandRunning = true; - await request('zigbee.mqtt.permit_join', {permit: true, timeout: seconds || null}); - self.commandRunning = false; - }, - }, - - { - text: 'Reset', - disabled: this.commandRunning, - click: async function() { - if (!confirm('Are you sure that you want to reset the device?')) { - return; - } - - await request('zigbee.mqtt.reset'); - }, - }, - - { - text: 'Factory Reset', - disabled: this.commandRunning, - classes: ['error'], - click: async function() { - if (!confirm('Are you sure that you want to do a device soft reset? ALL network information and custom firmware will be lost!!')) { - return; - } - - await request('zigbee.mqtt.factory_reset'); - }, - }, - ] - }, - - addToGroupDropdownItems: function() { - const self = this; - return Object.values(this.groups).filter((group) => { - return !group.values || !group.values.length || !(this.selected.valueId in this.scene.values); - }).map((group) => { - return { - text: group.name, - disabled: this.commandRunning, - click: async function () { - if (!self.selected.valueId) { - return; - } - - self.commandRunning = true; - await request('zwave.scene_add_value', { - id_on_network: self.selected.valueId, - scene_id: group.scene_id, - }); - - self.commandRunning = false; - self.refresh(); - }, - }; - }); - }, - }, - - methods: { - refreshDevices: async function () { - const self = this; - this.loading.devices = true; - this.devices = (await request('zigbee.mqtt.devices')).reduce((devices, device) => { - if (device.friendly_name in self.devices) { - device = { - values: self.devices[device.friendly_name].values || {}, - ...self.devices[device.friendly_name], - } - } - - devices[device.friendly_name] = device; - return devices; - }, {}); - - Object.values(this.devices).forEach((device) => { - if (device.type === 'Coordinator') { - return; - } - - request('zigbee.mqtt.device_get', {device: device.friendly_name}).then((response) => { - Vue.set(self.devices[device.friendly_name], 'values', response || {}); - }); - }); - - this.loading.devices = false; - }, - - refreshGroups: async function () { - this.loading.groups = true; - this.groups = (await request('zigbee.mqtt.groups')).reduce((groups, group) => { - groups[group.id] = group; - return groups; - }, {}); - - this.loading.groups = false; - }, - - refresh: function () { - this.refreshDevices(); - this.refreshGroups(); - this.bus.$emit('refreshProperties'); - }, - - updateProperties: function(device, props) { - Vue.set(this.devices[device], 'values', props); - }, - - addGroup: async function() { - const name = prompt('Group name'); - if (!name) { - return; - } - - this.commandRunning = true; - await request('zigbee.mqtt.group_add', {name: name}); - this.commandRunning = false; - this.refreshGroups(); - }, - - onViewChange: function(event) { - Vue.set(this.selected, 'view', event.target.value); - }, - - onDeviceClicked: function(event) { - Vue.set(this.selected, 'deviceId', event.deviceId === this.selected.deviceId ? undefined : event.deviceId); - }, - - onGroupClicked: function(event) { - Vue.set(this.selected, 'groupId', event.groupId === this.selected.groupId ? undefined : event.groupId); - }, - - openNetworkCommandsDropdown: function() { - openDropdown(this.$refs.networkCommandsDropdown); - }, - - openAddToGroupDropdown: function(event) { - this.selected.valueId = event.valueId; - openDropdown(this.$refs.addToGroupDropdown); - }, - - addToGroup: async function(device, group) { - this.commandRunning = true; - await request('zigbee.mqtt.group_add_device', { - device: device, - group: group, - }); - - this.commandRunning = false; - const self = this; - - setTimeout(() => { - self.refresh(); - self.bus.$emit('refreshProperties'); - }, 100) - }, - - removeNodeFromGroup: async function(event) { - if (!confirm('Are you sure that you want to remove this value from the group?')) { - return; - } - - this.commandRunning = true; - await request('zigbee.mqtt.group_remove_device', { - group: event.group, - device: event.device, - }); - - this.commandRunning = false; - }, - }, - - created: function() { - const self = this; - this.bus.$on('refresh', this.refresh); - this.bus.$on('refreshDevices', this.refreshDevices); - this.bus.$on('refreshGroups', this.refreshGroups); - this.bus.$on('deviceClicked', this.onDeviceClicked); - this.bus.$on('groupClicked', this.onGroupClicked); - this.bus.$on('openAddToGroupModal', () => {self.modal.group.visible = true}); - this.bus.$on('openAddToGroupDropdown', this.openAddToGroupDropdown); - this.bus.$on('removeFromGroup', this.removeNodeFromGroup); - - registerEventHandler(() => { - createNotification({ - text: 'WARNING: The controller is now offline', - error: true, - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttOfflineEvent'); - - registerEventHandler(() => { - createNotification({ - text: 'The controller is now online', - iconClass: 'fas fa-check', - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttOfflineEvent'); - - registerEventHandler(() => { - createNotification({ - text: 'Failed to remove the device', - error: true, - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceRemovedFailedEvent'); - - registerEventHandler(() => { - createNotification({ - text: 'Failed to add the group', - error: true, - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttGroupAddedFailedEvent'); - - registerEventHandler(() => { - createNotification({ - text: 'Failed to remove the group', - error: true, - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttGroupRemovedFailedEvent'); - - registerEventHandler(() => { - createNotification({ - text: 'Failed to remove the devices from the group', - error: true, - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttGroupRemoveAllFailedEvent'); - - registerEventHandler((event) => { - createNotification({ - text: 'Unhandled Zigbee error: ' + (event.error || '[Unknown error]'), - error: true, - }); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttErrorEvent'); - - registerEventHandler((event) => { - self.updateProperties(event.device, event.properties); - }, 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePropertySetEvent'); - - registerEventHandler(this.refresh, - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttOnlineEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDevicePairingEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceConnectedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceBannedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceRemovedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceWhitelistedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceRenamedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceBindEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttDeviceUnbindEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttGroupAddedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttGroupRemovedEvent', - 'platypush.message.event.zigbee.mqtt.ZigbeeMqttGroupRemoveAllEvent', - ); - }, - - mounted: function() { - this.refresh(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zwave/group.js b/platypush/backend/http/static/js/plugins/zwave/group.js deleted file mode 100644 index 0410c1af..00000000 --- a/platypush/backend/http/static/js/plugins/zwave/group.js +++ /dev/null @@ -1,24 +0,0 @@ -Vue.component('zwave-group', { - template: '#tmpl-zwave-group', - props: ['group','nodes','bus','selected'], - - methods: { - onGroupClicked: function() { - this.bus.$emit('groupClicked', { - groupId: this.group.index, - }); - }, - - removeFromGroup: async function(nodeId) { - if (!confirm('Are you sure that you want to remove this node from ' + this.group.label + '?')) { - return; - } - - await request('zwave.remove_node_from_group', { - node_id: nodeId, - group_index: this.group.index, - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zwave/index.js b/platypush/backend/http/static/js/plugins/zwave/index.js deleted file mode 100644 index 90c2b074..00000000 --- a/platypush/backend/http/static/js/plugins/zwave/index.js +++ /dev/null @@ -1,473 +0,0 @@ -Vue.component('zwave', { - template: '#tmpl-zwave', - props: ['config'], - - data: function() { - return { - bus: new Vue({}), - status: {}, - views: {}, - nodes: {}, - groups: {}, - scenes: {}, - commandRunning: false, - values: { - switches: {}, - dimmers: {}, - sensors: {}, - battery_levels: {}, - power_levels: {}, - bulbs: {}, - doorlocks: {}, - usercodes: {}, - thermostats: {}, - protections: {}, - }, - selected: { - view: 'nodes', - nodeId: undefined, - groupId: undefined, - sceneId: undefined, - valueId: undefined, - }, - loading: { - status: false, - nodes: false, - groups: false, - scenes: false, - }, - modal: { - networkInfo: { - visible: false, - }, - group: { - visible: false, - }, - }, - }; - }, - - computed: { - valuesMap: function() { - const values = {}; - for (const node of Object.values(this.nodes)) { - for (const value of Object.values(node.values)) { - values[value.id_on_network] = value; - } - } - - return values; - }, - - networkDropdownItems: function() { - const self = this; - return [ - { - text: 'Start Network', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.start_network'); - self.commandRunning = false; - }, - }, - - { - text: 'Stop Network', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.stop_network'); - self.commandRunning = false; - }, - }, - - { - text: 'Switch All On', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.switch_all', {state: true}); - self.commandRunning = false; - self.refresh(); - }, - }, - - { - text: 'Switch All Off', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.switch_all', {state: false}); - self.commandRunning = false; - self.refresh(); - }, - }, - - { - text: 'Cancel Command', - click: async function() { - await request('zwave.cancel_command'); - }, - }, - - { - text: 'Kill Command', - click: async function() { - await request('zwave.kill_command'); - }, - }, - - { - text: 'Set Controller Name', - disabled: this.commandRunning, - click: async function() { - const name = prompt('Controller name'); - if (!name) { - return; - } - - self.commandRunning = true; - await request('zwave.set_controller_name', {name: name}); - self.commandRunning = false; - self.refresh(); - }, - }, - - - { - text: 'Receive Configuration From Primary', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.receive_configuration'); - self.commandRunning = false; - self.refresh(); - }, - }, - - { - text: 'Create New Primary', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.create_new_primary'); - self.commandRunning = false; - self.refresh(); - }, - }, - - { - text: 'Transfer Primary Role', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.transfer_primary_role'); - self.commandRunning = false; - self.refresh(); - }, - }, - - { - text: 'Heal Network', - disabled: this.commandRunning, - click: async function() { - self.commandRunning = true; - await request('zwave.heal'); - self.commandRunning = false; - self.refresh(); - }, - }, - - { - text: 'Soft Reset', - disabled: this.commandRunning, - click: async function() { - if (!confirm('Are you sure that you want to do a device soft reset? Network information will not be lost')) { - return; - } - - await request('zwave.soft_reset'); - }, - }, - - { - text: 'Hard Reset', - disabled: this.commandRunning, - click: async function() { - if (!confirm('Are you sure that you want to do a device soft reset? ALL network information will be lost!')) { - return; - } - - await request('zwave.hard_reset'); - }, - }, - ] - }, - - addToSceneDropdownItems: function() { - const self = this; - return Object.values(this.scenes).filter((scene) => { - return !scene.values || !scene.values.length || !(this.selected.valueId in this.scene.values); - }).map((scene) => { - return { - text: scene.label, - disabled: this.commandRunning, - click: async function () { - if (!self.selected.valueId) { - return; - } - - self.commandRunning = true; - await request('zwave.scene_add_value', { - id_on_network: self.selected.valueId, - scene_id: scene.scene_id, - }); - - self.commandRunning = false; - self.refresh(); - }, - }; - }); - }, - }, - - methods: { - refreshNodes: async function () { - this.loading.nodes = true; - this.nodes = await request('zwave.get_nodes'); - - if (Object.keys(this.nodes).length) { - Vue.set(this.views, 'values', true); - } - }, - - refreshGroups: async function () { - this.loading.groups = true; - this.groups = Object.values(await request('zwave.get_groups')) - .filter((group) => group.index) - .reduce((groups, group) => { - groups[group.index] = group; - return groups; - }, {}); - - if (Object.keys(this.groups).length) { - Vue.set(this.views, 'groups', true); - } - - this.loading.groups = false; - }, - - refreshScenes: async function () { - this.loading.scenes = true; - this.scenes = Object.values(await request('zwave.get_scenes')) - .filter((scene) => scene.scene_id) - .reduce((scenes, scene) => { - scenes[scene.scene_id] = scene; - return scenes; - }, {}); - - this.loading.scenes = false; - }, - - refreshValues: async function(type) { - Vue.set(this.values, type, Object.values(await request('zwave.get_' + type)) - .filter((item) => item.id_on_network) - .reduce((values, value) => { - values[value.id_on_network] = true; - return values; - }, {})); - - if (Object.keys(this.values[type]).length) { - Vue.set(this.views, type, true); - } - }, - - refreshStatus: async function() { - this.loading.status = true; - this.status = await request('zwave.status'); - this.loading.status = false; - }, - - refresh: function () { - this.views = { - nodes: true, - scenes: true, - }; - - this.refreshNodes(); - this.refreshGroups(); - this.refreshScenes(); - this.refreshValues('switches'); - this.refreshValues('dimmers'); - this.refreshValues('sensors'); - this.refreshValues('bulbs'); - this.refreshValues('doorlocks'); - this.refreshValues('usercodes'); - this.refreshValues('thermostats'); - this.refreshValues('protections'); - this.refreshValues('battery_levels'); - this.refreshValues('power_levels'); - this.refreshValues('node_config'); - this.refreshStatus(); - }, - - addScene: async function() { - const name = prompt('Scene name'); - if (!name) { - return; - } - - this.commandRunning = true; - await request('zwave.create_scene', {label: name}); - this.commandRunning = false; - this.refreshScenes(); - }, - - removeScene: async function(sceneId) { - if (!confirm('Are you sure that you want to delete this scene?')) { - return; - } - - this.commandRunning = true; - await request('zwave.remove_scene', {scene_id: sceneId}); - this.commandRunning = false; - this.refreshScenes(); - }, - - onNodeUpdate: function(event) { - Vue.set(this.nodes, event.node.node_id, event.node); - }, - - onViewChange: function(event) { - Vue.set(this.selected, 'view', event.target.value); - }, - - onNodeClicked: function(event) { - Vue.set(this.selected, 'nodeId', event.nodeId === this.selected.nodeId ? undefined : event.nodeId); - }, - - onGroupClicked: function(event) { - Vue.set(this.selected, 'groupId', event.groupId === this.selected.groupId ? undefined : event.groupId); - }, - - onSceneClicked: function(event) { - Vue.set(this.selected, 'sceneId', event.sceneId === this.selected.sceneId ? undefined : event.sceneId); - }, - - onNetworkInfoModalOpen: function() { - this.refreshStatus(); - this.modal.networkInfo.visible = true; - }, - - onCommandEvent: function(event) { - if (event.error && event.error.length) { - createNotification({ - text: event.state_description + ': ' + event.error_description, - error: true, - }); - } - }, - - openNetworkCommandsDropdown: function() { - openDropdown(this.$refs.networkCommandsDropdown); - }, - - openAddToSceneDropdown: function(event) { - this.selected.valueId = event.valueId; - openDropdown(this.$refs.addToSceneDropdown); - }, - - addNode: async function() { - this.commandRunning = true; - await request('zwave.add_node'); - this.commandRunning = false; - }, - - addToGroup: async function(nodeId, groupId) { - this.commandRunning = true; - await request('zwave.add_node_to_group', { - node_id: nodeId, - group_index: groupId, - }); - - this.commandRunning = false; - this.refreshGroups(); - }, - - removeNode: async function() { - this.commandRunning = true; - await request('zwave.remove_node'); - this.commandRunning = false; - }, - - removeNodeFromScene: async function(event) { - if (!confirm('Are you sure that you want to remove this value from the scene?')) { - return; - } - - this.commandRunning = true; - await request('zwave.scene_remove_value', { - id_on_network: event.valueId, - scene_id: event.sceneId, - }); - - this.commandRunning = false; - }, - - renameScene: async function(sceneId) { - const scene = this.scenes[sceneId]; - const name = prompt('New name', scene.label); - - if (!name || !name.length || name === scene.label) { - return; - } - - this.commandRunning = true; - await request('zwave.set_scene_label', { - new_label: name, - scene_id: sceneId, - }); - - this.commandRunning = false; - this.refreshScenes(); - }, - }, - - created: function() { - const self = this; - this.bus.$on('refresh', this.refresh); - this.bus.$on('refreshNodes', this.refreshNodes); - this.bus.$on('nodeClicked', this.onNodeClicked); - this.bus.$on('groupClicked', this.onGroupClicked); - this.bus.$on('openAddToGroupModal', () => {self.modal.group.visible = true}); - this.bus.$on('openAddToSceneDropdown', this.openAddToSceneDropdown); - this.bus.$on('removeFromScene', this.removeNodeFromScene); - - registerEventHandler(this.refreshGroups, 'platypush.message.event.zwave.ZwaveNodeGroupEvent'); - registerEventHandler(this.refreshScenes, 'platypush.message.event.zwave.ZwaveNodeSceneEvent'); - registerEventHandler(this.refreshNodes, 'platypush.message.event.zwave.ZwaveNodeRemovedEvent'); - registerEventHandler(this.onCommandEvent, 'platypush.message.event.zwave.ZwaveCommandEvent'); - - registerEventHandler(this.refreshStatus, - 'platypush.message.event.zwave.ZwaveNetworkReadyEvent', - 'platypush.message.event.zwave.ZwaveNetworkStoppedEvent', - 'platypush.message.event.zwave.ZwaveNetworkErrorEvent', - 'platypush.message.event.zwave.ZwaveNetworkResetEvent'); - - registerEventHandler(this.onNodeUpdate, - 'platypush.message.event.zwave.ZwaveNodeEvent', - 'platypush.message.event.zwave.ZwaveNodeAddedEvent', - 'platypush.message.event.zwave.ZwaveNodeRenamedEvent', - 'platypush.message.event.zwave.ZwaveNodeReadyEvent', - 'platypush.message.event.zwave.ZwaveValueAddedEvent', - 'platypush.message.event.zwave.ZwaveValueChangedEvent', - 'platypush.message.event.zwave.ZwaveValueRemovedEvent', - 'platypush.message.event.zwave.ZwaveValueRefreshedEvent'); - }, - - mounted: function() { - this.refresh(); - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zwave/node.js b/platypush/backend/http/static/js/plugins/zwave/node.js deleted file mode 100644 index 9dc88a44..00000000 --- a/platypush/backend/http/static/js/plugins/zwave/node.js +++ /dev/null @@ -1,96 +0,0 @@ -Vue.component('zwave-node', { - template: '#tmpl-zwave-node', - props: ['node','bus','selected'], - data: function() { - return { - editMode: { - name: false, - }, - }; - }, - - methods: { - onNodeClicked: function() { - this.bus.$emit('nodeClicked', { - nodeId: this.node.node_id, - }); - }, - - removeFailedNode: async function() { - if (!confirm('Are you sure that you want to remove this node?')) { - return; - } - - await request('zwave.remove_node', { - node_id: this.node.node_id, - }); - }, - - replaceFailedNode: async function() { - if (!confirm('Are you sure that you want to replace this node?')) { - return; - } - - await request('zwave.replace_node', { - node_id: this.node.node_id, - }); - }, - - replicationSend: async function() { - await request('zwave.replication_send', { - node_id: this.node.node_id, - }); - }, - - requestNetworkUpdate: async function() { - await request('zwave.request_network_update', { - node_id: this.node.node_id, - }); - }, - - requestNeighbourUpdate: async function() { - await request('zwave.request_node_neighbour_update', { - node_id: this.node.node_id, - }); - }, - - disableForm: function(form) { - form.querySelector('input,button').readOnly = true; - }, - - enableForm: function(form) { - form.querySelector('input,button').readOnly = false; - }, - - onEditMode: function(mode) { - Vue.set(this.editMode, mode, true); - const form = this.$refs[mode + 'Form']; - const input = form.querySelector('input[type=text]'); - - setTimeout(() => { - input.focus(); - input.select(); - }, 10); - }, - - editName: async function(event) { - this.disableForm(event.target); - const name = event.target.querySelector('input[name=name]').value; - - await request('zwave.set_node_name', { - node_id: this.node.node_id, - new_name: name, - }); - - this.editMode.name = false; - this.enableForm(event.target); - }, - - heal: async function(event) { - await request('zwave.node_heal', { - node_id: this.node.node_id, - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/plugins/zwave/value.js b/platypush/backend/http/static/js/plugins/zwave/value.js deleted file mode 100644 index a1f85081..00000000 --- a/platypush/backend/http/static/js/plugins/zwave/value.js +++ /dev/null @@ -1,55 +0,0 @@ -Vue.component('zwave-value', { - template: '#tmpl-zwave-value', - props: ['value','node','bus','selected','sceneId'], - data: function() { - return {}; - }, - - methods: { - disableForm: function(form) { - form.querySelector('input,button').readOnly = true; - }, - - enableForm: function(form) { - form.querySelector('input,button').readOnly = false; - }, - - editName: function(event) { - const value = this.node.values[event.target.parentElement.dataset.idOnNetwork]; - const name = prompt('New name', value.label); - - if (!name || !name.length || name === value.label) { - return; - } - - request('zwave.set_value_label', { - id_on_network: value.id_on_network, - new_label: name, - }).then(() => { - this.bus.$emit('refreshNodes'); - createNotification({ - text: 'Value successfully renamed', - image: { icon: 'check' } - }); - }); - }, - - onValueChanged: function(event) { - const target = event.target ? event.target : event.event.target.parentElement; - const value = this.node.values[target.dataset.idOnNetwork]; - const data = value.type === 'List' ? value.data_items[event.target.value] : (target.value || event.value); - - request('zwave.set_value', { - id_on_network: value.id_on_network, - data: data, - }).then(() => { - this.bus.$emit('refreshNodes'); - createNotification({ - text: 'Value successfully modified', - image: { icon: 'check' } - }); - }); - }, - }, -}); - diff --git a/platypush/backend/http/static/js/settings/index.js b/platypush/backend/http/static/js/settings/index.js deleted file mode 100644 index b6f906d6..00000000 --- a/platypush/backend/http/static/js/settings/index.js +++ /dev/null @@ -1,186 +0,0 @@ -window.vm = new Vue({ - el: '#app', - data: function() { - return { - config: window.config, - document: undefined, - sessionToken: undefined, - selectedTab: 'users', - selectedUser: undefined, - - modalVisible: { - addUser: false, - changePassword: false, - }, - - formDisabled: { - addUser: false, - changePassword: false, - }, - }; - }, - - computed: { - userDropdownItems: function() { - const self = this; - return [ - { - text: 'Change password', - iconClass: 'fas fa-key', - click: function() { - self.modalVisible.changePassword = true; - }, - }, - { - text: 'Delete user', - iconClass: 'fa fa-trash', - click: async function() { - if (!confirm('Are you sure that you want to remove the user ' + self.selectedUser + '?')) - return; - - await request('user.delete_user', { - username: self.selectedUser, - session_token: self.sessionToken, - }); - - createNotification({ - text: 'User ' + self.selectedUser + ' removed', - image: { - iconClass: 'fas fa-check', - }, - }); - - window.location.reload(); - }, - }, - ]; - }, - }, - - methods: { - createUser: async function(event) { - event.preventDefault(); - - let form = [...this.$refs.createUserForm.querySelectorAll('input[name]')].reduce((map, input) => { - map[input.name] = input.value; - return map; - }, {}); - - if (form.password != form.confirm_password) { - createNotification({ - text: 'Please check that the passwords match', - image: { - iconClass: 'fas fa-times', - }, - error: true, - }); - - return; - } - - this.formDisabled.addUser = true; - await request('user.create_user', { - username: form.username, - password: form.password, - session_token: this.sessionToken, - }); - - this.formDisabled.addUser = false; - createNotification({ - text: 'User ' + form.username + ' created', - image: { - iconClass: 'fas fa-check', - }, - }); - - this.modalVisible.addUser = false; - window.location.reload(); - }, - - onUserClick: function(username) { - this.selectedUser = username; - openDropdown(this.$refs.userDropdown.$el); - }, - - onTokenFocus: function(event) { - event.target.select(); - this.document.execCommand('copy'); - event.target.setAttribute('disabled', true); - - createNotification({ - text: 'Token copied to clipboard', - image: { - iconClass: 'fas fa-copy', - }, - }); - }, - - onTokenBlur: function(event) { - event.target.select(); - this.document.execCommand('copy'); - event.target.removeAttribute('disabled'); - - createNotification({ - text: 'Token copied to clipboard', - image: { - iconClass: 'fas fa-copy', - }, - }); - }, - - changePassword: async function(event) { - event.preventDefault(); - - let form = [...this.$refs.changePasswordForm.querySelectorAll('input[name]')].reduce((map, input) => { - map[input.name] = input.value; - return map; - }, {}); - - if (form.new_password !== form.confirm_new_password) { - createNotification({ - text: 'Please check that the passwords match', - image: { - iconClass: 'fas fa-times', - }, - error: true, - }); - - return; - } - - this.formDisabled.changePassword = true; - let success = await request('user.update_password', { - username: form.username, - old_password: form.password, - new_password: form.new_password, - }); - - this.formDisabled.changePassword = false; - - if (success) { - this.modalVisible.changePassword = false; - createNotification({ - text: 'Password successfully updated', - image: { - iconClass: 'fas fa-check', - }, - }); - } else { - createNotification({ - text: 'Unable to update password: the current password is incorrect', - image: { - iconClass: 'fas fa-times', - }, - error: true, - }); - } - }, - }, - - created: function() { - this.document = document; - let cookies = Object.fromEntries(this.document.cookie.split('; ').map(x => x.split('='))); - this.sessionToken = cookies.session_token; - }, -}); - diff --git a/platypush/backend/http/static/js/utils.js b/platypush/backend/http/static/js/utils.js deleted file mode 100644 index 0f6c9c46..00000000 --- a/platypush/backend/http/static/js/utils.js +++ /dev/null @@ -1,47 +0,0 @@ -function enterFullScreen() { - const app = document.documentElement; - if (app.requestFullscreen()) { - return app.requestFullscreen(); - } else if (app.msRequestFullscreen()) { - return app.msRequestFullscreen(); - } else if (app.mozRequestFullScreen()) { - return app.mozRequestFullScreen(); - } else if (app.webkitRequestFullscreen()) { - return app.webkitRequestFullscreen(); - } else { - console.warn('This browser does not support fullscreen mode'); - } - - // The day will come when browser developers will have to pay web developers - // back for all the time wasted to write such crappy portable code. A two-lines - // function becomes a 10-lines function just because they can't talk to - // one another before implementing sh*t. -} - -function exitFullScreen() { - if (document.exitFullscreen()) { - return document.exitFullscreen(); - } else if (document.msExitFullscreen()) { - return document.msExitFullscreen(); - } else if (document.mozCancelFullScreen()) { - return document.mozCancelFullScreen(); - } else if (document.webkitExitFullscreen()) { - return document.webkitExitFullscreen(); - } else { - console.warn('This browser does not support fullscreen mode'); - } -} - -function toggleFullScreen() { - const elem = document.fullscreenElement - || document.webkitFullscreenElement - || document.msFullscreenElement - || document.mozFullScreenElement; - - if (elem) { - exitFullScreen(); - } else { - enterFullScreen(); - } -} - diff --git a/platypush/backend/http/static/js/widgets/calendar/index.js b/platypush/backend/http/static/js/widgets/calendar/index.js deleted file mode 100644 index c5a299b0..00000000 --- a/platypush/backend/http/static/js/widgets/calendar/index.js +++ /dev/null @@ -1,37 +0,0 @@ -Vue.component('calendar', { - template: '#tmpl-widget-calendar', - props: ['config'], - - data: function() { - return { - events: [], - }; - }, - - methods: { - refresh: async function() { - this.events = (await request('calendar.get_upcoming_events')).map(event => { - if (event.start) - event.start = new Date(event.start.dateTime || event.start.date); - if (event.end) - event.end = new Date(event.end.dateTime || event.end.date); - - return event; - }); - }, - - formatDate: function(date) { - return date.toDateString().substring(0, 10); - }, - - formatTime: function(date) { - return date.toTimeString().substring(0, 5); - }, - }, - - mounted: function() { - this.refresh(); - setInterval(this.refresh, 600000); - }, -}); - diff --git a/platypush/backend/http/static/js/widgets/date-time-weather/index.js b/platypush/backend/http/static/js/widgets/date-time-weather/index.js deleted file mode 100644 index 0a1417a9..00000000 --- a/platypush/backend/http/static/js/widgets/date-time-weather/index.js +++ /dev/null @@ -1,68 +0,0 @@ -Vue.component('date-time-weather', { - template: '#tmpl-widget-date-time-weather', - props: ['config'], - - data: function() { - return { - weather: undefined, - sensors: {}, - now: new Date(), - weatherIcon: undefined, - }; - }, - - methods: { - refresh: async function() { - let weather = (await request('weather.darksky.get_hourly_forecast')).data[0]; - this.onWeatherChange(weather); - }, - - refreshTime: function() { - this.now = new Date(); - }, - - formatDate: function(date) { - return date.toDateString().substring(0, 10); - }, - - formatTime: function(date) { - return date.toTimeString().substring(0, 8); - }, - - onWeatherChange: function(event) { - if (!this.weather) - this.weather = {}; - - Vue.set(this, 'weather', {...this.weather, ...event}); - - var skycons = new Skycons({ - 'color':'#333', 'resizeClear':'true' - }); - - if (this.weatherIcon) { - skycons.remove('weather-icon'); - } - - skycons.add('weather-icon', this.weather.icon); - this.weatherIcon = this.weather.icon; - }, - - onSensorData: function(event) { - if ('temperature' in event.data) - this.sensors.temperature = event.data.temperature; - - if ('humidity' in event.data) - this.sensors.temperature = event.data.humidity; - }, - }, - - mounted: function() { - this.refresh(); - setInterval(this.refresh, 900000); - setInterval(this.refreshTime, 1000); - - registerEventHandler(this.onWeatherChange, 'platypush.message.event.weather.NewWeatherConditionEvent'); - registerEventHandler(this.onSensorData, 'platypush.message.event.sensor.SensorDataChangeEvent'); - }, -}); - diff --git a/platypush/backend/http/static/js/widgets/date-time-weather/skycons.js b/platypush/backend/http/static/js/widgets/date-time-weather/skycons.js deleted file mode 100644 index d8a1583e..00000000 --- a/platypush/backend/http/static/js/widgets/date-time-weather/skycons.js +++ /dev/null @@ -1,726 +0,0 @@ -(function(global) { - "use strict"; - - /* Set up a RequestAnimationFrame shim so we can animate efficiently FOR - * GREAT JUSTICE. */ - var requestInterval, cancelInterval; - - (function() { - var raf = global.requestAnimationFrame || - global.webkitRequestAnimationFrame || - global.mozRequestAnimationFrame || - global.oRequestAnimationFrame || - global.msRequestAnimationFrame , - caf = global.cancelAnimationFrame || - global.webkitCancelAnimationFrame || - global.mozCancelAnimationFrame || - global.oCancelAnimationFrame || - global.msCancelAnimationFrame ; - - if(raf && caf) { - requestInterval = function(fn) { - var handle = {value: null}; - - function loop() { - handle.value = raf(loop); - fn(); - } - - loop(); - return handle; - }; - - cancelInterval = function(handle) { - caf(handle.value); - }; - } - - else { - requestInterval = setInterval; - cancelInterval = clearInterval; - } - }()); - - /* Catmull-rom spline stuffs. */ - /* - function upsample(n, spline) { - var polyline = [], - len = spline.length, - bx = spline[0], - by = spline[1], - cx = spline[2], - cy = spline[3], - dx = spline[4], - dy = spline[5], - i, j, ax, ay, px, qx, rx, sx, py, qy, ry, sy, t; - - for(i = 6; i !== spline.length; i += 2) { - ax = bx; - bx = cx; - cx = dx; - dx = spline[i ]; - px = -0.5 * ax + 1.5 * bx - 1.5 * cx + 0.5 * dx; - qx = ax - 2.5 * bx + 2.0 * cx - 0.5 * dx; - rx = -0.5 * ax + 0.5 * cx ; - sx = bx ; - - ay = by; - by = cy; - cy = dy; - dy = spline[i + 1]; - py = -0.5 * ay + 1.5 * by - 1.5 * cy + 0.5 * dy; - qy = ay - 2.5 * by + 2.0 * cy - 0.5 * dy; - ry = -0.5 * ay + 0.5 * cy ; - sy = by ; - - for(j = 0; j !== n; ++j) { - t = j / n; - - polyline.push( - ((px * t + qx) * t + rx) * t + sx, - ((py * t + qy) * t + ry) * t + sy - ); - } - } - - polyline.push( - px + qx + rx + sx, - py + qy + ry + sy - ); - - return polyline; - } - - function downsample(n, polyline) { - var len = 0, - i, dx, dy; - - for(i = 2; i !== polyline.length; i += 2) { - dx = polyline[i ] - polyline[i - 2]; - dy = polyline[i + 1] - polyline[i - 1]; - len += Math.sqrt(dx * dx + dy * dy); - } - - len /= n; - - var small = [], - target = len, - min = 0, - max, t; - - small.push(polyline[0], polyline[1]); - - for(i = 2; i !== polyline.length; i += 2) { - dx = polyline[i ] - polyline[i - 2]; - dy = polyline[i + 1] - polyline[i - 1]; - max = min + Math.sqrt(dx * dx + dy * dy); - - if(max > target) { - t = (target - min) / (max - min); - - small.push( - polyline[i - 2] + dx * t, - polyline[i - 1] + dy * t - ); - - target += len; - } - - min = max; - } - - small.push(polyline[polyline.length - 2], polyline[polyline.length - 1]); - - return small; - } - */ - - /* Define skycon things. */ - /* FIXME: I'm *really really* sorry that this code is so gross. Really, I am. - * I'll try to clean it up eventually! Promise! */ - var KEYFRAME = 500, - STROKE = 0.08, - TAU = 2.0 * Math.PI, - TWO_OVER_SQRT_2 = 2.0 / Math.sqrt(2); - - function circle(ctx, x, y, r) { - ctx.beginPath(); - ctx.arc(x, y, r, 0, TAU, false); - ctx.fill(); - } - - function line(ctx, ax, ay, bx, by) { - ctx.beginPath(); - ctx.moveTo(ax, ay); - ctx.lineTo(bx, by); - ctx.stroke(); - } - - function puff(ctx, t, cx, cy, rx, ry, rmin, rmax) { - var c = Math.cos(t * TAU), - s = Math.sin(t * TAU); - - rmax -= rmin; - - circle( - ctx, - cx - s * rx, - cy + c * ry + rmax * 0.5, - rmin + (1 - c * 0.5) * rmax - ); - } - - function puffs(ctx, t, cx, cy, rx, ry, rmin, rmax) { - var i; - - for(i = 5; i--; ) - puff(ctx, t + i / 5, cx, cy, rx, ry, rmin, rmax); - } - - function cloud(ctx, t, cx, cy, cw, s, color) { - t /= 30000; - - var a = cw * 0.21, - b = cw * 0.12, - c = cw * 0.24, - d = cw * 0.28; - - ctx.fillStyle = color; - puffs(ctx, t, cx, cy, a, b, c, d); - - ctx.globalCompositeOperation = 'destination-out'; - puffs(ctx, t, cx, cy, a, b, c - s, d - s); - ctx.globalCompositeOperation = 'source-over'; - } - - function sun(ctx, t, cx, cy, cw, s, color) { - t /= 120000; - - var a = cw * 0.25 - s * 0.5, - b = cw * 0.32 + s * 0.5, - c = cw * 0.50 - s * 0.5, - i, p, cos, sin; - - ctx.strokeStyle = color; - ctx.lineWidth = s; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - ctx.beginPath(); - ctx.arc(cx, cy, a, 0, TAU, false); - ctx.stroke(); - - for(i = 8; i--; ) { - p = (t + i / 8) * TAU; - cos = Math.cos(p); - sin = Math.sin(p); - line(ctx, cx + cos * b, cy + sin * b, cx + cos * c, cy + sin * c); - } - } - - function moon(ctx, t, cx, cy, cw, s, color) { - t /= 15000; - - var a = cw * 0.29 - s * 0.5, - b = cw * 0.05, - c = Math.cos(t * TAU), - p = c * TAU / -16; - - ctx.strokeStyle = color; - ctx.lineWidth = s; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - cx += c * b; - - ctx.beginPath(); - ctx.arc(cx, cy, a, p + TAU / 8, p + TAU * 7 / 8, false); - ctx.arc(cx + Math.cos(p) * a * TWO_OVER_SQRT_2, cy + Math.sin(p) * a * TWO_OVER_SQRT_2, a, p + TAU * 5 / 8, p + TAU * 3 / 8, true); - ctx.closePath(); - ctx.stroke(); - } - - function rain(ctx, t, cx, cy, cw, s, color) { - t /= 1350; - - var a = cw * 0.16, - b = TAU * 11 / 12, - c = TAU * 7 / 12, - i, p, x, y; - - ctx.fillStyle = color; - - for(i = 4; i--; ) { - p = (t + i / 4) % 1; - x = cx + ((i - 1.5) / 1.5) * (i === 1 || i === 2 ? -1 : 1) * a; - y = cy + p * p * cw; - ctx.beginPath(); - ctx.moveTo(x, y - s * 1.5); - ctx.arc(x, y, s * 0.75, b, c, false); - ctx.fill(); - } - } - - function sleet(ctx, t, cx, cy, cw, s, color) { - t /= 750; - - var a = cw * 0.1875, - i, p, x, y; - - ctx.strokeStyle = color; - ctx.lineWidth = s * 0.5; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - for(i = 4; i--; ) { - p = (t + i / 4) % 1; - x = Math.floor(cx + ((i - 1.5) / 1.5) * (i === 1 || i === 2 ? -1 : 1) * a) + 0.5; - y = cy + p * cw; - line(ctx, x, y - s * 1.5, x, y + s * 1.5); - } - } - - function snow(ctx, t, cx, cy, cw, s, color) { - t /= 3000; - - var a = cw * 0.16, - b = s * 0.75, - u = t * TAU * 0.7, - ux = Math.cos(u) * b, - uy = Math.sin(u) * b, - v = u + TAU / 3, - vx = Math.cos(v) * b, - vy = Math.sin(v) * b, - w = u + TAU * 2 / 3, - wx = Math.cos(w) * b, - wy = Math.sin(w) * b, - i, p, x, y; - - ctx.strokeStyle = color; - ctx.lineWidth = s * 0.5; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - for(i = 4; i--; ) { - p = (t + i / 4) % 1; - x = cx + Math.sin((p + i / 4) * TAU) * a; - y = cy + p * cw; - - line(ctx, x - ux, y - uy, x + ux, y + uy); - line(ctx, x - vx, y - vy, x + vx, y + vy); - line(ctx, x - wx, y - wy, x + wx, y + wy); - } - } - - function fogbank(ctx, t, cx, cy, cw, s, color) { - t /= 30000; - - var a = cw * 0.21, - b = cw * 0.06, - c = cw * 0.21, - d = cw * 0.28; - - ctx.fillStyle = color; - puffs(ctx, t, cx, cy, a, b, c, d); - - ctx.globalCompositeOperation = 'destination-out'; - puffs(ctx, t, cx, cy, a, b, c - s, d - s); - ctx.globalCompositeOperation = 'source-over'; - } - - /* - var WIND_PATHS = [ - downsample(63, upsample(8, [ - -1.00, -0.28, - -0.75, -0.18, - -0.50, 0.12, - -0.20, 0.12, - -0.04, -0.04, - -0.07, -0.18, - -0.19, -0.18, - -0.23, -0.05, - -0.12, 0.11, - 0.02, 0.16, - 0.20, 0.15, - 0.50, 0.07, - 0.75, 0.18, - 1.00, 0.28 - ])), - downsample(31, upsample(16, [ - -1.00, -0.10, - -0.75, 0.00, - -0.50, 0.10, - -0.25, 0.14, - 0.00, 0.10, - 0.25, 0.00, - 0.50, -0.10, - 0.75, -0.14, - 1.00, -0.10 - ])) - ]; - */ - - var WIND_PATHS = [ - [ - -0.7500, -0.1800, -0.7219, -0.1527, -0.6971, -0.1225, - -0.6739, -0.0910, -0.6516, -0.0588, -0.6298, -0.0262, - -0.6083, 0.0065, -0.5868, 0.0396, -0.5643, 0.0731, - -0.5372, 0.1041, -0.5033, 0.1259, -0.4662, 0.1406, - -0.4275, 0.1493, -0.3881, 0.1530, -0.3487, 0.1526, - -0.3095, 0.1488, -0.2708, 0.1421, -0.2319, 0.1342, - -0.1943, 0.1217, -0.1600, 0.1025, -0.1290, 0.0785, - -0.1012, 0.0509, -0.0764, 0.0206, -0.0547, -0.0120, - -0.0378, -0.0472, -0.0324, -0.0857, -0.0389, -0.1241, - -0.0546, -0.1599, -0.0814, -0.1876, -0.1193, -0.1964, - -0.1582, -0.1935, -0.1931, -0.1769, -0.2157, -0.1453, - -0.2290, -0.1085, -0.2327, -0.0697, -0.2240, -0.0317, - -0.2064, 0.0033, -0.1853, 0.0362, -0.1613, 0.0672, - -0.1350, 0.0961, -0.1051, 0.1213, -0.0706, 0.1397, - -0.0332, 0.1512, 0.0053, 0.1580, 0.0442, 0.1624, - 0.0833, 0.1636, 0.1224, 0.1615, 0.1613, 0.1565, - 0.1999, 0.1500, 0.2378, 0.1402, 0.2749, 0.1279, - 0.3118, 0.1147, 0.3487, 0.1015, 0.3858, 0.0892, - 0.4236, 0.0787, 0.4621, 0.0715, 0.5012, 0.0702, - 0.5398, 0.0766, 0.5768, 0.0890, 0.6123, 0.1055, - 0.6466, 0.1244, 0.6805, 0.1440, 0.7147, 0.1630, - 0.7500, 0.1800 - ], - [ - -0.7500, 0.0000, -0.7033, 0.0195, -0.6569, 0.0399, - -0.6104, 0.0600, -0.5634, 0.0789, -0.5155, 0.0954, - -0.4667, 0.1089, -0.4174, 0.1206, -0.3676, 0.1299, - -0.3174, 0.1365, -0.2669, 0.1398, -0.2162, 0.1391, - -0.1658, 0.1347, -0.1157, 0.1271, -0.0661, 0.1169, - -0.0170, 0.1046, 0.0316, 0.0903, 0.0791, 0.0728, - 0.1259, 0.0534, 0.1723, 0.0331, 0.2188, 0.0129, - 0.2656, -0.0064, 0.3122, -0.0263, 0.3586, -0.0466, - 0.4052, -0.0665, 0.4525, -0.0847, 0.5007, -0.1002, - 0.5497, -0.1130, 0.5991, -0.1240, 0.6491, -0.1325, - 0.6994, -0.1380, 0.7500, -0.1400 - ] - ], - WIND_OFFSETS = [ - {start: 0.36, end: 0.11}, - {start: 0.56, end: 0.16} - ]; - - function leaf(ctx, t, x, y, cw, s, color) { - var a = cw / 8, - b = a / 3, - c = 2 * b, - d = (t % 1) * TAU, - e = Math.cos(d), - f = Math.sin(d); - - ctx.fillStyle = color; - ctx.strokeStyle = color; - ctx.lineWidth = s; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - ctx.beginPath(); - ctx.arc(x , y , a, d , d + Math.PI, false); - ctx.arc(x - b * e, y - b * f, c, d + Math.PI, d , false); - ctx.arc(x + c * e, y + c * f, b, d + Math.PI, d , true ); - ctx.globalCompositeOperation = 'destination-out'; - ctx.fill(); - ctx.globalCompositeOperation = 'source-over'; - ctx.stroke(); - } - - function swoosh(ctx, t, cx, cy, cw, s, index, total, color) { - t /= 2500; - - var path = WIND_PATHS[index], - a = (t + index - WIND_OFFSETS[index].start) % total, - c = (t + index - WIND_OFFSETS[index].end ) % total, - e = (t + index ) % total, - b, d, f, i; - - ctx.strokeStyle = color; - ctx.lineWidth = s; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - if(a < 1) { - ctx.beginPath(); - - a *= path.length / 2 - 1; - b = Math.floor(a); - a -= b; - b *= 2; - b += 2; - - ctx.moveTo( - cx + (path[b - 2] * (1 - a) + path[b ] * a) * cw, - cy + (path[b - 1] * (1 - a) + path[b + 1] * a) * cw - ); - - if(c < 1) { - c *= path.length / 2 - 1; - d = Math.floor(c); - c -= d; - d *= 2; - d += 2; - - for(i = b; i !== d; i += 2) - ctx.lineTo(cx + path[i] * cw, cy + path[i + 1] * cw); - - ctx.lineTo( - cx + (path[d - 2] * (1 - c) + path[d ] * c) * cw, - cy + (path[d - 1] * (1 - c) + path[d + 1] * c) * cw - ); - } - - else - for(i = b; i !== path.length; i += 2) - ctx.lineTo(cx + path[i] * cw, cy + path[i + 1] * cw); - - ctx.stroke(); - } - - else if(c < 1) { - ctx.beginPath(); - - c *= path.length / 2 - 1; - d = Math.floor(c); - c -= d; - d *= 2; - d += 2; - - ctx.moveTo(cx + path[0] * cw, cy + path[1] * cw); - - for(i = 2; i !== d; i += 2) - ctx.lineTo(cx + path[i] * cw, cy + path[i + 1] * cw); - - ctx.lineTo( - cx + (path[d - 2] * (1 - c) + path[d ] * c) * cw, - cy + (path[d - 1] * (1 - c) + path[d + 1] * c) * cw - ); - - ctx.stroke(); - } - - if(e < 1) { - e *= path.length / 2 - 1; - f = Math.floor(e); - e -= f; - f *= 2; - f += 2; - - leaf( - ctx, - t, - cx + (path[f - 2] * (1 - e) + path[f ] * e) * cw, - cy + (path[f - 1] * (1 - e) + path[f + 1] * e) * cw, - cw, - s, - color - ); - } - } - - var Skycons = function(opts) { - this.list = []; - this.interval = null; - this.color = opts && opts.color ? opts.color : "black"; - this.resizeClear = !!(opts && opts.resizeClear); - }; - - Skycons.CLEAR_DAY = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - sun(ctx, t, w * 0.5, h * 0.5, s, s * STROKE, color); - }; - - Skycons.CLEAR_NIGHT = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - moon(ctx, t, w * 0.5, h * 0.5, s, s * STROKE, color); - }; - - Skycons.PARTLY_CLOUDY_DAY = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - sun(ctx, t, w * 0.625, h * 0.375, s * 0.75, s * STROKE, color); - cloud(ctx, t, w * 0.375, h * 0.625, s * 0.75, s * STROKE, color); - }; - - Skycons.PARTLY_CLOUDY_NIGHT = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - moon(ctx, t, w * 0.667, h * 0.375, s * 0.75, s * STROKE, color); - cloud(ctx, t, w * 0.375, h * 0.625, s * 0.75, s * STROKE, color); - }; - - Skycons.CLOUDY = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - cloud(ctx, t, w * 0.5, h * 0.5, s, s * STROKE, color); - }; - - Skycons.RAIN = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - rain(ctx, t, w * 0.5, h * 0.37, s * 0.9, s * STROKE, color); - cloud(ctx, t, w * 0.5, h * 0.37, s * 0.9, s * STROKE, color); - }; - - Skycons.SLEET = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - sleet(ctx, t, w * 0.5, h * 0.37, s * 0.9, s * STROKE, color); - cloud(ctx, t, w * 0.5, h * 0.37, s * 0.9, s * STROKE, color); - }; - - Skycons.SNOW = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - snow(ctx, t, w * 0.5, h * 0.37, s * 0.9, s * STROKE, color); - cloud(ctx, t, w * 0.5, h * 0.37, s * 0.9, s * STROKE, color); - }; - - Skycons.WIND = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h); - - swoosh(ctx, t, w * 0.5, h * 0.5, s, s * STROKE, 0, 2, color); - swoosh(ctx, t, w * 0.5, h * 0.5, s, s * STROKE, 1, 2, color); - }; - - Skycons.FOG = function(ctx, t, color) { - var w = ctx.canvas.width, - h = ctx.canvas.height, - s = Math.min(w, h), - k = s * STROKE; - - fogbank(ctx, t, w * 0.5, h * 0.32, s * 0.75, k, color); - - t /= 5000; - - var a = Math.cos((t ) * TAU) * s * 0.02, - b = Math.cos((t + 0.25) * TAU) * s * 0.02, - c = Math.cos((t + 0.50) * TAU) * s * 0.02, - d = Math.cos((t + 0.75) * TAU) * s * 0.02, - n = h * 0.936, - e = Math.floor(n - k * 0.5) + 0.5, - f = Math.floor(n - k * 2.5) + 0.5; - - ctx.strokeStyle = color; - ctx.lineWidth = k; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - - line(ctx, a + w * 0.2 + k * 0.5, e, b + w * 0.8 - k * 0.5, e); - line(ctx, c + w * 0.2 + k * 0.5, f, d + w * 0.8 - k * 0.5, f); - }; - - Skycons.prototype = { - _determineDrawingFunction: function(draw) { - if(typeof draw === "string") - draw = Skycons[draw.toUpperCase().replace(/-/g, "_")] || null; - - return draw; - }, - add: function(el, draw) { - var obj; - - if(typeof el === "string") - el = document.getElementById(el); - - // Does nothing if canvas name doesn't exists - if(el === null) - return; - - draw = this._determineDrawingFunction(draw); - - // Does nothing if the draw function isn't actually a function - if(typeof draw !== "function") - return; - - obj = { - element: el, - context: el.getContext("2d"), - drawing: draw - }; - - this.list.push(obj); - this.draw(obj, KEYFRAME); - }, - set: function(el, draw) { - var i; - - if(typeof el === "string") - el = document.getElementById(el); - - for(i = this.list.length; i--; ) - if(this.list[i].element === el) { - this.list[i].drawing = this._determineDrawingFunction(draw); - this.draw(this.list[i], KEYFRAME); - return; - } - - this.add(el, draw); - }, - remove: function(el) { - var i; - - if(typeof el === "string") - el = document.getElementById(el); - - for(i = this.list.length; i--; ) - if(this.list[i].element === el) { - this.list.splice(i, 1); - return; - } - }, - draw: function(obj, time) { - var canvas = obj.context.canvas; - - if(this.resizeClear) - canvas.width = canvas.width; - - else - obj.context.clearRect(0, 0, canvas.width, canvas.height); - - obj.drawing(obj.context, time, this.color); - }, - play: function() { - var self = this; - - this.pause(); - this.interval = requestInterval(function() { - var now = Date.now(), - i; - - for(i = self.list.length; i--; ) - self.draw(self.list[i], now); - }, 1000 / 60); - }, - pause: function() { - if(this.interval) { - cancelInterval(this.interval); - this.interval = null; - } - } - }; - - global.Skycons = Skycons; -}(this)); diff --git a/platypush/backend/http/static/js/widgets/image-carousel/index.js b/platypush/backend/http/static/js/widgets/image-carousel/index.js deleted file mode 100644 index f7e4e991..00000000 --- a/platypush/backend/http/static/js/widgets/image-carousel/index.js +++ /dev/null @@ -1,59 +0,0 @@ -Vue.component('image-carousel', { - template: '#tmpl-widget-image-carousel', - props: ['config'], - - data: function() { - return { - images: [], - currentImage: undefined, - }; - }, - - methods: { - refresh: async function() { - if (!this.images.length) { - this.images = await request('utils.search_web_directory', { - directory: this.config.images_path, - extensions: ['.jpg', '.jpeg', '.png'], - }); - - this.shuffleImages(); - } - - this.currentImage = this.images.pop(); - }, - - onNewImage: function() { - this.$refs.background.style['background-image'] = 'url(' + this.currentImage + ')'; - this.$refs.img.style.width = 'auto'; - - if (this.$refs.img.width > this.$refs.img.height) { - if ((this.$refs.img.width / this.$refs.img.height) >= 1.25) { - this.$refs.img.style.width = '100%'; - } - - if ((this.$refs.img.width / this.$refs.img.height) <= 16/9) { - this.$refs.img.style.height = '100%'; - } - } - }, - - shuffleImages: function() { - for (var i=this.images.length-1; i > 0; i--) { - let j = Math.floor(Math.random() * (i+1)); - let x = this.images[i]; - Vue.set(this.images, i, this.images[j]); - Vue.set(this.images, j, x); - } - }, - }, - - mounted: function() { - this.$refs.img.addEventListener('load', this.onNewImage); - this.$refs.img.addEventListener('error', this.refresh); - - this.refresh(); - setInterval(this.refresh, 'refresh_seconds' in this.config ? this.config.refresh_seconds*1000 : 15000); - }, -}); - diff --git a/platypush/backend/http/static/js/widgets/music/index.js b/platypush/backend/http/static/js/widgets/music/index.js deleted file mode 100644 index 0626f101..00000000 --- a/platypush/backend/http/static/js/widgets/music/index.js +++ /dev/null @@ -1,233 +0,0 @@ -Vue.component('music', { - template: '#tmpl-widget-music', - props: ['config'], - - data: function() { - return { - track: undefined, - status: undefined, - timer: undefined, - - syncTime: { - timestamp: null, - elapsed: null, - }, - }; - }, - - methods: { - refresh: async function() { - let status = await request('music.mpd.status'); - let track = await request('music.mpd.currentsong'); - - this._parseStatus(status); - this._parseTrack(track); - - if (status.state === 'play' && !this.timer) - this.startTimer(); - else if (status.state !== 'play' && this.timer) - this.stopTimer(); - }, - - convertTime: function(time) { - time = parseFloat(time); // Normalize strings - var t = {}; - t.h = '' + parseInt(time/3600); - t.m = '' + parseInt(time/60 - t.h*60); - t.s = '' + parseInt(time - (t.h*3600 + t.m*60)); - - for (var attr of ['m','s']) { - if (parseInt(t[attr]) < 10) { - t[attr] = '0' + t[attr]; - } - } - - var ret = []; - if (parseInt(t.h)) { - ret.push(t.h); - } - - ret.push(t.m, t.s); - return ret.join(':'); - }, - - _parseStatus: async function(status) { - if (!status || status.length === 0) - status = await request('music.mpd.status'); - - if (!this.status) - this.status = {}; - - for (const [attr, value] of Object.entries(status)) { - if (['consume','random','repeat','single','bitrate'].indexOf(attr) >= 0) { - Vue.set(this.status, attr, !!parseInt(value)); - } else if (['nextsong','nextsongid','playlist','playlistlength', - 'volume','xfade','song','songid'].indexOf(attr) >= 0) { - Vue.set(this.status, attr, parseInt(value)); - } else if (['elapsed'].indexOf(attr) >= 0) { - Vue.set(this.status, attr, parseFloat(value)); - } else { - Vue.set(this.status, attr, value); - } - } - }, - - _parseTrack: async function(track) { - if (!track || track.length === 0) { - track = await request('music.mpd.currentsong'); - } - - if (!this.track) - this.track = {}; - - for (const [attr, value] of Object.entries(track)) { - if (['id','pos','time','track','disc'].indexOf(attr) >= 0) { - Vue.set(this.track, attr, parseInt(value)); - } else { - Vue.set(this.track, attr, value); - } - } - }, - - showNewTrackNotification: function() { - createNotification({ - html: '' + (this.track.artist || '[No Artist]') + '
' + - (this.track.title || '[No Title]'), - image: { - icon: 'play', - } - }); - }, - - onNewPlayingTrack: async function(event) { - let previousTrack = undefined; - - if (this.track) { - previousTrack = { - file: this.track.file, - artist: this.track.artist, - title: this.track.title, - }; - } - - this.status.state = 'play'; - Vue.set(this.status, 'elapsed', 0); - this.track = {}; - this._parseTrack(event.track); - - let status = event.status ? event.status : await request('music.mpd.status'); - this._parseStatus(status); - this.startTimer(); - - if (previousTrack && this.track.file != previousTrack.file - || this.track.artist != previousTrack.artist - || this.track.title != previousTrack.title) { - this.showNewTrackNotification(); - } - }, - - onMusicStop: function(event) { - this.status.state = 'stop'; - Vue.set(this.status, 'elapsed', 0); - this._parseStatus(event.status); - this._parseTrack(event.track); - this.stopTimer(); - }, - - onMusicPlay: function(event) { - this.status.state = 'play'; - this._parseStatus(event.status); - this._parseTrack(event.track); - this.startTimer(); - }, - - onMusicPause: function(event) { - this.status.state = 'pause'; - this._parseStatus(event.status); - this._parseTrack(event.track); - - Vue.set(this.syncTime, 'timestamp', new Date()); - Vue.set(this.syncTime, 'elapsed', this.status.elapsed); - }, - - onSeekChange: function(event) { - if (event.position != null) - Vue.set(this.status, 'elapsed', parseFloat(event.position)); - if (event.status) - this._parseStatus(event.status); - if (event.track) - this._parseTrack(event.track); - - Vue.set(this.syncTime, 'timestamp', new Date()); - Vue.set(this.syncTime, 'elapsed', this.status.elapsed); - }, - - onVolumeChange: function(event) { - if (event.volume != null) - this.status.volume = parseFloat(event.volume); - if (event.status) - this._parseStatus(event.status); - if (event.track) - this._parseTrack(event.track); - }, - - onRepeatChange: function(event) { - this.status.repeat = event.state; - }, - - onRandomChange: function(event) { - this.status.random = event.state; - }, - - onConsumeChange: function(event) { - this.status.consume = event.state; - }, - - onSingleChange: function(event) { - this.status.single = event.state; - }, - - startTimer: function() { - if (this.timer != null) { - this.stopTimer(); - } - - Vue.set(this.syncTime, 'timestamp', new Date()); - Vue.set(this.syncTime, 'elapsed', this.status.elapsed); - this.timer = setInterval(this.timerFunc, 1000); - }, - - stopTimer: function() { - if (this.timer == null) { - clearInterval(this.timer); - this.timer = null; - } - }, - - timerFunc: function() { - if (this.status.state !== 'play' || this.status.elapsed == null) { - return; - } - - Vue.set(this.status, 'elapsed', this.syncTime.elapsed + - ((new Date()).getTime()/1000) - (this.syncTime.timestamp.getTime()/1000)); - }, - }, - - mounted: function() { - this.refresh(); - setInterval(this.refresh, 60000); - - registerEventHandler(this.onNewPlayingTrack, 'platypush.message.event.music.NewPlayingTrackEvent'); - registerEventHandler(this.onMusicStop, 'platypush.message.event.music.MusicStopEvent'); - registerEventHandler(this.onMusicPlay, 'platypush.message.event.music.MusicPlayEvent'); - registerEventHandler(this.onMusicPause, 'platypush.message.event.music.MusicPauseEvent'); - registerEventHandler(this.onSeekChange, 'platypush.message.event.music.SeekChangeEvent'); - registerEventHandler(this.onVolumeChange, 'platypush.message.event.music.VolumeChangeEvent'); - registerEventHandler(this.onRepeatChange, 'platypush.message.event.music.PlaybackRepeatModeChangeEvent'); - registerEventHandler(this.onRandomChange, 'platypush.message.event.music.PlaybackRandomModeChangeEvent'); - registerEventHandler(this.onConsumeChange, 'platypush.message.event.music.PlaybackConsumeModeChangeEvent'); - registerEventHandler(this.onSingleChange, 'platypush.message.event.music.PlaybackSingleModeChangeEvent'); - }, -}); - diff --git a/platypush/backend/http/static/js/widgets/rss-news/index.js b/platypush/backend/http/static/js/widgets/rss-news/index.js deleted file mode 100644 index 1e16c6b0..00000000 --- a/platypush/backend/http/static/js/widgets/rss-news/index.js +++ /dev/null @@ -1,40 +0,0 @@ -Vue.component('rss-news', { - template: '#tmpl-widget-rss-news', - props: ['config'], - - data: function() { - return { - articles: [], - queue: [], - currentArticle: undefined, - }; - }, - - methods: { - refresh: async function() { - if (!this.queue.length) { - this.articles = await request('db.select', { - engine: this.config.db, - query: "select s.title as source, e.title, e.summary, " + - "strftime('%Y-%m-%dT%H:%M:%fZ', e.published) as published " + - "from FeedEntry e join FeedSource s " + - "on e.source_id = s.id order by e.published desc limit " + - ('limit' in this.config ? this.config.limit : 10) - }); - - this.queue = [...this.articles]; - } - - if (!this.queue.length) - return; - - this.currentArticle = this.queue.pop(); - }, - }, - - mounted: function() { - this.refresh(); - setInterval(this.refresh, 'refresh_seconds' in this.config ? this.config.refresh_seconds*1000 : 15000); - }, -}); - diff --git a/platypush/backend/http/templates/css-common.html b/platypush/backend/http/templates/css-common.html deleted file mode 100644 index cd882722..00000000 --- a/platypush/backend/http/templates/css-common.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/dashboard.html b/platypush/backend/http/templates/dashboard.html deleted file mode 100644 index 7ccc4d74..00000000 --- a/platypush/backend/http/templates/dashboard.html +++ /dev/null @@ -1,100 +0,0 @@ - - - Platypush Dashboard - - - {% include 'css-common.html' %} - - - - {% include 'js-common.html' %} - - - - - - - {% include 'elements.html' %} - - {% for widget in config['widgets'] %} - {% with name = widget['widget'] %} - {% include 'widgets/' + name + '/index.html' %} - - {% with js_file = static_folder + '/js/widgets/' + name + '/index.js' %} - {% if utils.isfile(js_file) %} - - {% endif %} - {% endwith %} - - {% with css_file = static_folder + '/css/dist/dashboard/widgets/' + name + '.css' %} - {% if utils.isfile(css_file) %} - - {% endif %} - {% endwith %} - {% endwith %} - {% endfor %} - - - -
-
- - - - - -
- {% set used_columns = [0] %} - {% for widget in config['widgets'] %} - {% with name = widget['widget'] %} - {% if used_columns[0] % 12 == 0 %} -
- {% endif %} - - {% with properties=widget %} - - - {% endwith %} - - {# increment counter #} - {% if used_columns.append(used_columns.pop() + widget.get('columns', 12)) %}{% endif %} - - {% if used_columns[0] % 12 == 0 %} -
- {% endif %} - {% endwith %} - {% endfor %} -
- - {% include 'notifications.html' %} -
-
- - {% include 'widgets/template.html' %} - - - - diff --git a/platypush/backend/http/templates/elements.html b/platypush/backend/http/templates/elements.html deleted file mode 100644 index a9a6dc3d..00000000 --- a/platypush/backend/http/templates/elements.html +++ /dev/null @@ -1,6 +0,0 @@ -{% include 'elements/common.html' %} -{% include 'elements/switch.html' %} -{% include 'elements/range-slider.html' %} -{% include 'elements/dropdown.html' %} -{% include 'elements/modal.html' %} - diff --git a/platypush/backend/http/templates/elements/common.html b/platypush/backend/http/templates/elements/common.html deleted file mode 100644 index 23ee1261..00000000 --- a/platypush/backend/http/templates/elements/common.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/platypush/backend/http/templates/elements/dropdown.html b/platypush/backend/http/templates/elements/dropdown.html deleted file mode 100644 index 82e4e9b4..00000000 --- a/platypush/backend/http/templates/elements/dropdown.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/elements/modal.html b/platypush/backend/http/templates/elements/modal.html deleted file mode 100644 index 299d2851..00000000 --- a/platypush/backend/http/templates/elements/modal.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/elements/range-slider.html b/platypush/backend/http/templates/elements/range-slider.html deleted file mode 100644 index e394f0d3..00000000 --- a/platypush/backend/http/templates/elements/range-slider.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/elements/switch.html b/platypush/backend/http/templates/elements/switch.html deleted file mode 100644 index a8e8ed10..00000000 --- a/platypush/backend/http/templates/elements/switch.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/index.html b/platypush/backend/http/templates/index.html deleted file mode 100644 index 4c7a31d1..00000000 --- a/platypush/backend/http/templates/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - Platypush Web Panel - - - - {% include 'css-common.html' %} - - - - - {% include 'js-common.html' %} - - - {% for style in styles.values() %} - - {% endfor %} - - {% include 'elements.html' %} - - {% for plugin, conf in templates.items() %} - {% with configuration=templates[plugin] %} - {% include conf['_template_file'] %} - {% endwith %} - {% endfor %} - - {% for script in scripts.values() %} - - {% endfor %} - - - -
- {% with plugins=templates.keys() %} - {% include 'nav.html' %} - {% endwith %} - -
-
- - -
-
- - {% include 'notifications.html' %} -
- - {% include 'plugins/template.html' %} - - - - diff --git a/platypush/backend/http/templates/js-common.html b/platypush/backend/http/templates/js-common.html deleted file mode 100644 index b99394d1..00000000 --- a/platypush/backend/http/templates/js-common.html +++ /dev/null @@ -1,12 +0,0 @@ -{% if utils.isfile(static_folder, 'js', 'lib', 'vue.js') %} - -{% else %} - -{% endif %} - - - - - - - diff --git a/platypush/backend/http/templates/login.html b/platypush/backend/http/templates/login.html deleted file mode 100644 index 42e177a9..00000000 --- a/platypush/backend/http/templates/login.html +++ /dev/null @@ -1,27 +0,0 @@ - - - Platypush login page - - {% include 'css-common.html' %} - - - - -
- -
- - diff --git a/platypush/backend/http/templates/nav.html b/platypush/backend/http/templates/nav.html deleted file mode 100644 index 6023c120..00000000 --- a/platypush/backend/http/templates/nav.html +++ /dev/null @@ -1,61 +0,0 @@ -{% - with pluginIcons = { - 'camera': 'fas fa-camera', - 'camera.android.ipcam': 'fab fa-android', - 'camera.cv': 'fas fa-camera', - 'camera.ffmpeg': 'fas fa-camera', - 'camera.gstreamer': 'fas fa-camera', - 'camera.pi': 'fab fa-raspberry-pi', - 'camera.ir.mlx90640': 'fas fa-sun', - 'execute': 'fas fa-play', - 'gpio': 'fas fa-plug', - 'gpio.zeroborg': 'fas fa-robot', - 'light.hue': 'fa fa-lightbulb', - 'media.gstreamer': 'fa fa-film', - 'media.mplayer': 'fa fa-film', - 'media.mpv': 'fa fa-film', - 'media.omxplayer': 'fa fa-film', - 'media.vlc': 'fa fa-film', - 'music.mpd': 'fa fa-music', - 'music.snapcast': 'fa fa-volume-up', - 'sensors': 'fas fa-thermometer-half', - 'sound': 'fas fa-microphone', - 'switches': 'fa fa-toggle-on', - 'tts': 'fa fa-comment', - 'tts.google': 'fa fa-comment', - 'tv.samsung.ws': 'fas fa-tv', - 'zigbee.mqtt': 'fa fa-zigbee', - 'zwave': 'fa fa-zwave', - } -%} - - - -{% endwith %} - diff --git a/platypush/backend/http/templates/notifications.html b/platypush/backend/http/templates/notifications.html deleted file mode 100644 index 0825ff5a..00000000 --- a/platypush/backend/http/templates/notifications.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - diff --git a/platypush/backend/http/templates/plugin.html b/platypush/backend/http/templates/plugin.html deleted file mode 100644 index 72c4256f..00000000 --- a/platypush/backend/http/templates/plugin.html +++ /dev/null @@ -1,63 +0,0 @@ - - - {{ plugin }} - - - - {% include 'css-common.html' %} - - - - - {% include 'js-common.html' %} - - - - - - {% include 'elements.html' %} - - {% with configuration=conf %} - {% include template %} - {% endwith %} - - - - - -
-
-
- - -
-
- - {% include 'notifications.html' %} -
- - {% include 'plugins/template.html' %} - - - - diff --git a/platypush/backend/http/templates/plugins/camera.android.ipcam/index.html b/platypush/backend/http/templates/plugins/camera.android.ipcam/index.html deleted file mode 100644 index f588f39b..00000000 --- a/platypush/backend/http/templates/plugins/camera.android.ipcam/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/camera.cv/index.html b/platypush/backend/http/templates/plugins/camera.cv/index.html deleted file mode 100644 index 988bcd66..00000000 --- a/platypush/backend/http/templates/plugins/camera.cv/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/camera.ffmpeg/index.html b/platypush/backend/http/templates/plugins/camera.ffmpeg/index.html deleted file mode 100644 index bb22481c..00000000 --- a/platypush/backend/http/templates/plugins/camera.ffmpeg/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/camera.gstreamer/index.html b/platypush/backend/http/templates/plugins/camera.gstreamer/index.html deleted file mode 100644 index 60510169..00000000 --- a/platypush/backend/http/templates/plugins/camera.gstreamer/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/camera.ir.mlx90640/index.html b/platypush/backend/http/templates/plugins/camera.ir.mlx90640/index.html deleted file mode 100644 index 943cfb02..00000000 --- a/platypush/backend/http/templates/plugins/camera.ir.mlx90640/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/camera.pi/index.html b/platypush/backend/http/templates/plugins/camera.pi/index.html deleted file mode 100644 index a6f31603..00000000 --- a/platypush/backend/http/templates/plugins/camera.pi/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/camera/index.html b/platypush/backend/http/templates/plugins/camera/index.html deleted file mode 100644 index 1a05b3d8..00000000 --- a/platypush/backend/http/templates/plugins/camera/index.html +++ /dev/null @@ -1,90 +0,0 @@ -
-
-
The camera is not active
- -
- -
- - - - - -
- -
- -
- -
-
- -
- -
- - - - - - - - - - - - - - - - - - - -
-
-
- diff --git a/platypush/backend/http/templates/plugins/execute/index.html b/platypush/backend/http/templates/plugins/execute/index.html deleted file mode 100644 index 6ea560bb..00000000 --- a/platypush/backend/http/templates/plugins/execute/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/gpio/index.html b/platypush/backend/http/templates/plugins/gpio/index.html deleted file mode 100644 index 84a5d915..00000000 --- a/platypush/backend/http/templates/plugins/gpio/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/light.hue/animations.html b/platypush/backend/http/templates/plugins/light.hue/animations.html deleted file mode 100644 index 168003bb..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/animations.html +++ /dev/null @@ -1,41 +0,0 @@ -{% with templates = utils.find_templates_in_dir('plugins/light.hue/animations') %} - {% for template in templates %} - {% include template %} - {% endfor %} -{% endwith %} - - - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/animations/blink.html b/platypush/backend/http/templates/plugins/light.hue/animations/blink.html deleted file mode 100644 index bd72d9c7..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/animations/blink.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/animations/color_transition.html b/platypush/backend/http/templates/plugins/light.hue/animations/color_transition.html deleted file mode 100644 index 5aa3fdd8..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/animations/color_transition.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/elements.html b/platypush/backend/http/templates/plugins/light.hue/elements.html deleted file mode 100644 index 357dccfd..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/elements.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/groups.html b/platypush/backend/http/templates/plugins/light.hue/groups.html deleted file mode 100644 index 1b4450d8..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/groups.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/index.html b/platypush/backend/http/templates/plugins/light.hue/index.html deleted file mode 100644 index aaf7a34b..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - -{% include 'plugins/light.hue/elements.html' %} -{% include 'plugins/light.hue/groups.html' %} -{% include 'plugins/light.hue/scenes.html' %} -{% include 'plugins/light.hue/units.html' %} -{% include 'plugins/light.hue/animations.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/scenes.html b/platypush/backend/http/templates/plugins/light.hue/scenes.html deleted file mode 100644 index f522ac4b..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/scenes.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/light.hue/units.html b/platypush/backend/http/templates/plugins/light.hue/units.html deleted file mode 100644 index 3fe70759..00000000 --- a/platypush/backend/http/templates/plugins/light.hue/units.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/media.gstreamer/index.html b/platypush/backend/http/templates/plugins/media.gstreamer/index.html deleted file mode 100644 index dc35992f..00000000 --- a/platypush/backend/http/templates/plugins/media.gstreamer/index.html +++ /dev/null @@ -1,7 +0,0 @@ - -{% include 'plugins/media/index.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/media.mplayer/index.html b/platypush/backend/http/templates/plugins/media.mplayer/index.html deleted file mode 100644 index f1e52f66..00000000 --- a/platypush/backend/http/templates/plugins/media.mplayer/index.html +++ /dev/null @@ -1,7 +0,0 @@ - -{% include 'plugins/media/index.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/media.mpv/index.html b/platypush/backend/http/templates/plugins/media.mpv/index.html deleted file mode 100644 index dba35b8b..00000000 --- a/platypush/backend/http/templates/plugins/media.mpv/index.html +++ /dev/null @@ -1,7 +0,0 @@ - -{% include 'plugins/media/index.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/media.omxplayer/index.html b/platypush/backend/http/templates/plugins/media.omxplayer/index.html deleted file mode 100644 index 6547fee4..00000000 --- a/platypush/backend/http/templates/plugins/media.omxplayer/index.html +++ /dev/null @@ -1,7 +0,0 @@ - -{% include 'plugins/media/index.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/media.vlc/index.html b/platypush/backend/http/templates/plugins/media.vlc/index.html deleted file mode 100644 index 9d6fb93a..00000000 --- a/platypush/backend/http/templates/plugins/media.vlc/index.html +++ /dev/null @@ -1,7 +0,0 @@ - -{% include 'plugins/media/index.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/media/controls.html b/platypush/backend/http/templates/plugins/media/controls.html deleted file mode 100644 index 90205177..00000000 --- a/platypush/backend/http/templates/plugins/media/controls.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/media/devices.html b/platypush/backend/http/templates/plugins/media/devices.html deleted file mode 100644 index 37064cdc..00000000 --- a/platypush/backend/http/templates/plugins/media/devices.html +++ /dev/null @@ -1,23 +0,0 @@ - - -{% for script in utils.search_directory(static_folder + '/js/plugins/media/players', 'js', recursive=True) %} - -{% endfor %} - - - diff --git a/platypush/backend/http/templates/plugins/media/index.html b/platypush/backend/http/templates/plugins/media/index.html deleted file mode 100644 index 61889906..00000000 --- a/platypush/backend/http/templates/plugins/media/index.html +++ /dev/null @@ -1,75 +0,0 @@ -{% include 'plugins/media/search.html' %} -{% include 'plugins/media/controls.html' %} -{% include 'plugins/media/results.html' %} -{% include 'plugins/media/item.html' %} -{% include 'plugins/media/info.html' %} -{% include 'plugins/media/subs.html' %} -{% include 'plugins/media/torrents.html' %} - - - -{% for script in utils.search_directory(static_folder + '/js/plugins/media/handlers', 'js', recursive=True) %} - {% if script != 'base.js' %} - - {% endif %} -{% endfor %} - - - - - diff --git a/platypush/backend/http/templates/plugins/media/info.html b/platypush/backend/http/templates/plugins/media/info.html deleted file mode 100644 index d59b5ef3..00000000 --- a/platypush/backend/http/templates/plugins/media/info.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/media/item.html b/platypush/backend/http/templates/plugins/media/item.html deleted file mode 100644 index 45b63005..00000000 --- a/platypush/backend/http/templates/plugins/media/item.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/media/results.html b/platypush/backend/http/templates/plugins/media/results.html deleted file mode 100644 index 77abbbaa..00000000 --- a/platypush/backend/http/templates/plugins/media/results.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/media/search.html b/platypush/backend/http/templates/plugins/media/search.html deleted file mode 100644 index c759b889..00000000 --- a/platypush/backend/http/templates/plugins/media/search.html +++ /dev/null @@ -1,31 +0,0 @@ -{% include 'plugins/media/devices.html' %} - - - - - diff --git a/platypush/backend/http/templates/plugins/media/subs.html b/platypush/backend/http/templates/plugins/media/subs.html deleted file mode 100644 index c9e75f89..00000000 --- a/platypush/backend/http/templates/plugins/media/subs.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/media/torrents.html b/platypush/backend/http/templates/plugins/media/torrents.html deleted file mode 100644 index 703f6d49..00000000 --- a/platypush/backend/http/templates/plugins/media/torrents.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/music.mpd/browser.html b/platypush/backend/http/templates/plugins/music.mpd/browser.html deleted file mode 100644 index 2720db41..00000000 --- a/platypush/backend/http/templates/plugins/music.mpd/browser.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/music.mpd/index.html b/platypush/backend/http/templates/plugins/music.mpd/index.html deleted file mode 100644 index 1de680c9..00000000 --- a/platypush/backend/http/templates/plugins/music.mpd/index.html +++ /dev/null @@ -1,336 +0,0 @@ - - -{% include 'plugins/music.mpd/browser.html' %} -{% include 'plugins/music.mpd/playlist.html' %} -{% include 'plugins/music.mpd/search.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/music.mpd/playlist.html b/platypush/backend/http/templates/plugins/music.mpd/playlist.html deleted file mode 100644 index b24cb7c9..00000000 --- a/platypush/backend/http/templates/plugins/music.mpd/playlist.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/music.mpd/search.html b/platypush/backend/http/templates/plugins/music.mpd/search.html deleted file mode 100644 index 3e153980..00000000 --- a/platypush/backend/http/templates/plugins/music.mpd/search.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - diff --git a/platypush/backend/http/templates/plugins/music.snapcast/client.html b/platypush/backend/http/templates/plugins/music.snapcast/client.html deleted file mode 100644 index 00392b62..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/client.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/music.snapcast/group.html b/platypush/backend/http/templates/plugins/music.snapcast/group.html deleted file mode 100644 index 7f7e80ea..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/group.html +++ /dev/null @@ -1,33 +0,0 @@ -{% include 'plugins/music.snapcast/client.html' %} - - - - - diff --git a/platypush/backend/http/templates/plugins/music.snapcast/host.html b/platypush/backend/http/templates/plugins/music.snapcast/host.html deleted file mode 100644 index b79cd4d4..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/host.html +++ /dev/null @@ -1,34 +0,0 @@ -{% include 'plugins/music.snapcast/group.html' %} - - - - - diff --git a/platypush/backend/http/templates/plugins/music.snapcast/index.html b/platypush/backend/http/templates/plugins/music.snapcast/index.html deleted file mode 100644 index d65ff5e2..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/index.html +++ /dev/null @@ -1,27 +0,0 @@ -{% include 'plugins/music.snapcast/host.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/music.snapcast/modals/client.html b/platypush/backend/http/templates/plugins/music.snapcast/modals/client.html deleted file mode 100644 index d22cb36e..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/modals/client.html +++ /dev/null @@ -1,76 +0,0 @@ - -
-
-
ID
-
-
- -
-
Name
-
-
- -
-
Connected
-
-
- -
-
Volume
-
{% raw %}{{ info.config.volume.percent }}%{% endraw %}
-
- -
-
Muted
-
-
- -
-
Latency
-
-
- -
-
IP Address
-
-
- -
-
MAC Address
-
-
- -
-
OS
-
-
- -
-
Architecture
-
-
- -
-
Client name
-
-
- -
-
Client version
-
-
- -
-
Protocol version
-
-
- -
- -
-
-
- diff --git a/platypush/backend/http/templates/plugins/music.snapcast/modals/group.html b/platypush/backend/http/templates/plugins/music.snapcast/modals/group.html deleted file mode 100644 index a0c90bb4..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/modals/group.html +++ /dev/null @@ -1,56 +0,0 @@ - -
-
-
Clients
-
- - -
-
- -
-
Stream
-
-
ID
-
- -
-
- -
-
Status
-
-
- -
-
Host
-
-
- -
-
Path
-
-
- -
-
URI
-
-
-
-
-
- diff --git a/platypush/backend/http/templates/plugins/music.snapcast/modals/host.html b/platypush/backend/http/templates/plugins/music.snapcast/modals/host.html deleted file mode 100644 index 24954688..00000000 --- a/platypush/backend/http/templates/plugins/music.snapcast/modals/host.html +++ /dev/null @@ -1,54 +0,0 @@ - -
-
-
IP Address
-
-
- -
-
MAC Address
-
-
- -
-
Name
-
-
- -
-
Port
-
-
- -
-
OS
-
-
- -
-
Architecture
-
-
- -
-
Server name
-
-
- -
-
Server version
-
-
- -
-
Protocol version
-
-
- -
-
Control protocol version
-
-
-
-
- diff --git a/platypush/backend/http/templates/plugins/sensors/index.html b/platypush/backend/http/templates/plugins/sensors/index.html deleted file mode 100644 index 5583e3e3..00000000 --- a/platypush/backend/http/templates/plugins/sensors/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/platypush/backend/http/templates/plugins/sound/index.html b/platypush/backend/http/templates/plugins/sound/index.html deleted file mode 100644 index e80d86ab..00000000 --- a/platypush/backend/http/templates/plugins/sound/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/switches/index.html b/platypush/backend/http/templates/plugins/switches/index.html deleted file mode 100644 index f8241a4e..00000000 --- a/platypush/backend/http/templates/plugins/switches/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - diff --git a/platypush/backend/http/templates/plugins/template.html b/platypush/backend/http/templates/plugins/template.html deleted file mode 100644 index cca5bd02..00000000 --- a/platypush/backend/http/templates/plugins/template.html +++ /dev/null @@ -1,6 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/tts.google/index.html b/platypush/backend/http/templates/plugins/tts.google/index.html deleted file mode 100644 index e08192d4..00000000 --- a/platypush/backend/http/templates/plugins/tts.google/index.html +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/tts/common.html b/platypush/backend/http/templates/plugins/tts/common.html deleted file mode 100644 index 992ba8e4..00000000 --- a/platypush/backend/http/templates/plugins/tts/common.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
- -
-
- -
-
- -
-
-
diff --git a/platypush/backend/http/templates/plugins/tts/index.html b/platypush/backend/http/templates/plugins/tts/index.html deleted file mode 100644 index a8de0e8c..00000000 --- a/platypush/backend/http/templates/plugins/tts/index.html +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/tv.samsung.ws/index.html b/platypush/backend/http/templates/plugins/tv.samsung.ws/index.html deleted file mode 100644 index 0824208e..00000000 --- a/platypush/backend/http/templates/plugins/tv.samsung.ws/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - diff --git a/platypush/backend/http/templates/plugins/zigbee.mqtt/device.html b/platypush/backend/http/templates/plugins/zigbee.mqtt/device.html deleted file mode 100644 index a481399a..00000000 --- a/platypush/backend/http/templates/plugins/zigbee.mqtt/device.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/zigbee.mqtt/group.html b/platypush/backend/http/templates/plugins/zigbee.mqtt/group.html deleted file mode 100644 index 9ba2e44e..00000000 --- a/platypush/backend/http/templates/plugins/zigbee.mqtt/group.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/zigbee.mqtt/index.html b/platypush/backend/http/templates/plugins/zigbee.mqtt/index.html deleted file mode 100644 index e059679f..00000000 --- a/platypush/backend/http/templates/plugins/zigbee.mqtt/index.html +++ /dev/null @@ -1,69 +0,0 @@ -{% include 'plugins/zigbee.mqtt/device.html' %} -{% include 'plugins/zigbee.mqtt/group.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/zigbee.mqtt/modals/group.html b/platypush/backend/http/templates/plugins/zigbee.mqtt/modals/group.html deleted file mode 100644 index 0f7f39e5..00000000 --- a/platypush/backend/http/templates/plugins/zigbee.mqtt/modals/group.html +++ /dev/null @@ -1,20 +0,0 @@ - -
-
-
-
-
Select devices to add
-
- -
-
-
-
-
-
-
-
-
- diff --git a/platypush/backend/http/templates/plugins/zwave/group.html b/platypush/backend/http/templates/plugins/zwave/group.html deleted file mode 100644 index f2ae849d..00000000 --- a/platypush/backend/http/templates/plugins/zwave/group.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/zwave/index.html b/platypush/backend/http/templates/plugins/zwave/index.html deleted file mode 100644 index 709c60d9..00000000 --- a/platypush/backend/http/templates/plugins/zwave/index.html +++ /dev/null @@ -1,172 +0,0 @@ -{% include 'plugins/zwave/node.html' %} -{% include 'plugins/zwave/group.html' %} -{% include 'plugins/zwave/value.html' %} - - - diff --git a/platypush/backend/http/templates/plugins/zwave/modals/group.html b/platypush/backend/http/templates/plugins/zwave/modals/group.html deleted file mode 100644 index 668bb309..00000000 --- a/platypush/backend/http/templates/plugins/zwave/modals/group.html +++ /dev/null @@ -1,19 +0,0 @@ - -
-
-
-
-
Select nodes to add
-
- -
-
-
-
-
-
-
-
-
- diff --git a/platypush/backend/http/templates/plugins/zwave/modals/network.html b/platypush/backend/http/templates/plugins/zwave/modals/network.html deleted file mode 100644 index 1cc7fce9..00000000 --- a/platypush/backend/http/templates/plugins/zwave/modals/network.html +++ /dev/null @@ -1,35 +0,0 @@ - -
-
- Loading status... -
- -
-
-
State
-
-
- -
-
Device
-
-
- -
-
-
Statistics
-
- -
-
-
-
-
-
-
-
-
-
- diff --git a/platypush/backend/http/templates/plugins/zwave/node.html b/platypush/backend/http/templates/plugins/zwave/node.html deleted file mode 100644 index 27cce6d9..00000000 --- a/platypush/backend/http/templates/plugins/zwave/node.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/plugins/zwave/value.html b/platypush/backend/http/templates/plugins/zwave/value.html deleted file mode 100644 index c5183b2e..00000000 --- a/platypush/backend/http/templates/plugins/zwave/value.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/register.html b/platypush/backend/http/templates/register.html deleted file mode 100644 index 45f025be..00000000 --- a/platypush/backend/http/templates/register.html +++ /dev/null @@ -1,30 +0,0 @@ - - - Platypush registration page - - {% include 'css-common.html' %} - - - - -
-
-
- -
-
- -
-
- -
-
- -
-
- Keep me logged in on this device   -
-
-
- - diff --git a/platypush/backend/http/templates/settings/index.html b/platypush/backend/http/templates/settings/index.html deleted file mode 100644 index 2f022f17..00000000 --- a/platypush/backend/http/templates/settings/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - Platypush Settings - - - - {% include 'css-common.html' %} - - - - - {% include 'js-common.html' %} - {% include 'elements.html' %} - - - -
- {% include 'settings/nav.html' %} - -
- {% include 'settings/sections/users.html' %} - {% include 'settings/sections/token.html' %} -
- - {% include 'notifications.html' %} -
- - - - diff --git a/platypush/backend/http/templates/settings/nav.html b/platypush/backend/http/templates/settings/nav.html deleted file mode 100644 index aaa4f767..00000000 --- a/platypush/backend/http/templates/settings/nav.html +++ /dev/null @@ -1,47 +0,0 @@ - - diff --git a/platypush/backend/http/templates/settings/sections/token.html b/platypush/backend/http/templates/settings/sections/token.html deleted file mode 100644 index 03b94a6e..00000000 --- a/platypush/backend/http/templates/settings/sections/token.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
-

Token

-
- -
- No token configured for requests. It is strongly advised to generate a random token (e.g. - dd if=/dev/urandom bs=18 count=1 | base64) and copy it in the token: - section of your configuration file. -
- -
- -
-
- diff --git a/platypush/backend/http/templates/settings/sections/users.html b/platypush/backend/http/templates/settings/sections/users.html deleted file mode 100644 index df55ce67..00000000 --- a/platypush/backend/http/templates/settings/sections/users.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
-

Users

-
- -
-
- - -
- - - - -
-
- - -
- - - - - -
-
- -
-
    - {% for user in users %} -
  • {{ user.username }}
  • - {% endfor %} -
- - - -
-
- diff --git a/platypush/backend/http/templates/webplayer.html b/platypush/backend/http/templates/webplayer.html deleted file mode 100644 index af7216c4..00000000 --- a/platypush/backend/http/templates/webplayer.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/platypush/backend/http/templates/widgets/calendar/index.html b/platypush/backend/http/templates/widgets/calendar/index.html deleted file mode 100644 index 2be6e8d4..00000000 --- a/platypush/backend/http/templates/widgets/calendar/index.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/platypush/backend/http/templates/widgets/date-time-weather/index.html b/platypush/backend/http/templates/widgets/date-time-weather/index.html deleted file mode 100644 index 866e119a..00000000 --- a/platypush/backend/http/templates/widgets/date-time-weather/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/platypush/backend/http/templates/widgets/image-carousel/index.html b/platypush/backend/http/templates/widgets/image-carousel/index.html deleted file mode 100644 index 4768849c..00000000 --- a/platypush/backend/http/templates/widgets/image-carousel/index.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/platypush/backend/http/templates/widgets/music/index.html b/platypush/backend/http/templates/widgets/music/index.html deleted file mode 100644 index 08f59925..00000000 --- a/platypush/backend/http/templates/widgets/music/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - diff --git a/platypush/backend/http/templates/widgets/rss-news/index.html b/platypush/backend/http/templates/widgets/rss-news/index.html deleted file mode 100644 index aad0a9fb..00000000 --- a/platypush/backend/http/templates/widgets/rss-news/index.html +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/platypush/backend/http/templates/widgets/template.html b/platypush/backend/http/templates/widgets/template.html deleted file mode 100644 index 22852a26..00000000 --- a/platypush/backend/http/templates/widgets/template.html +++ /dev/null @@ -1,6 +0,0 @@ - -