diff --git a/data/www/css/compiled/main.css b/data/www/css/compiled/main.css index f768829..d324286 100644 --- a/data/www/css/compiled/main.css +++ b/data/www/css/compiled/main.css @@ -1 +1 @@ -.info{color:#027bff!important}.bg-info{background-color:#027bff!important}.border-info{border-color:#027bff!important}.info-alt{color:#075cb7!important}.bg-info-alt{background-color:#075cb7!important}.border-info-alt{border-color:#075cb7!important}.success{color:#0eef5f!important}.bg-success{background-color:#0eef5f!important}.border-success{border-color:#0eef5f!important}.success-alt{color:#11a948!important}.bg-success-alt{background-color:#11a948!important}.border-success-alt{border-color:#11a948!important}.error{color:#ef0e5d!important}.bg-error{background-color:#ef0e5d!important}.border-error{border-color:#ef0e5d!important}.error-alt{color:#c20941!important}.bg-error-alt{background-color:#c20941!important}.border-error-alt{border-color:#c20941!important}.danger{color:#ef0e5d!important}.bg-danger{background-color:#ef0e5d!important}.border-danger{border-color:#ef0e5d!important}.danger-alt{color:#c20941!important}.bg-danger-alt{background-color:#c20941!important}.border-danger-alt{border-color:#c20941!important}.purple{color:#bc48ff!important}.bg-purple{background-color:#bc48ff!important}.border-purple{border-color:#bc48ff!important}.purple-alt{color:#692fbd!important}.bg-purple-alt{background-color:#692fbd!important}.border-purple-alt{border-color:#692fbd!important}.neutral{color:#464646!important}.bg-neutral{background-color:#464646!important}.border-neutral{border-color:#464646!important}.yellow{color:#e5a123!important}.bg-yellow{background-color:#e5a123!important}.border-yellow{border-color:#e5a123!important}.white{color:#fff!important}.bg-white{background-color:#fff!important}.border-white{border-color:#fff!important}.black{color:#000!important}.bg-black{background-color:#000!important}.border-black{border-color:#000!important}.youtube{color:#fd3c01!important}.bg-youtube{background-color:#fd3c01!important}.border-youtube{border-color:#fd3c01!important}.raspbian{color:#b61240!important}.bg-raspbian{background-color:#b61240!important}.border-raspbian{border-color:#b61240!important}.windows{color:#12a7e3!important}.bg-windows{background-color:#12a7e3!important}.border-windows{border-color:#12a7e3!important}.macos{color:#b3bcc2!important}.bg-macos{background-color:#b3bcc2!important}.border-macos{border-color:#b3bcc2!important}.debian{color:#cf084e!important}.bg-debian{background-color:#cf084e!important}.border-debian{border-color:#cf084e!important}.fedora{color:#52a2da!important}.bg-fedora{background-color:#52a2da!important}.border-fedora{border-color:#52a2da!important}.ubuntu{color:#d64514!important}.bg-ubuntu{background-color:#d64514!important}.border-ubuntu{border-color:#d64514!important}.suse{color:#6fb425!important}.bg-suse{background-color:#6fb425!important}.border-suse{border-color:#6fb425!important}.redhat{color:#c60200!important}.bg-redhat{background-color:#c60200!important}.border-redhat{border-color:#c60200!important}.centos{color:#9b4c88!important}.bg-centos{background-color:#9b4c88!important}.border-centos{border-color:#9b4c88!important}.other{color:#e5a123!important}.bg-other{background-color:#e5a123!important}.border-other{border-color:#e5a123!important}button.btn-info,.btn.btn-info{background:#027bff;box-shadow:0 2px #004a9b}button.btn-info:hover,.btn.btn-info:hover{box-shadow:0 2px 0 1px #004a9b inset}button.btn-info:focus,.btn.btn-info:focus{background:#004a9b}button.btn-info-alt,.btn.btn-info-alt{background:#075cb7;box-shadow:0 2px #032b55}button.btn-info-alt:hover,.btn.btn-info-alt:hover{box-shadow:0 2px 0 1px #032b55 inset}button.btn-info-alt:focus,.btn.btn-info-alt:focus{background:#032b55}button.btn-success,.btn.btn-success{background:#0eef5f;box-shadow:0 2px #088f39}button.btn-success:hover,.btn.btn-success:hover{box-shadow:0 2px 0 1px #088f39 inset}button.btn-success:focus,.btn.btn-success:focus{background:#088f39}button.btn-success-alt,.btn.btn-success-alt{background:#11a948;box-shadow:0 2px #084c21}button.btn-success-alt:hover,.btn.btn-success-alt:hover{box-shadow:0 2px 0 1px #084c21 inset}button.btn-success-alt:focus,.btn.btn-success-alt:focus{background:#084c21}button.btn-error,.btn.btn-error{background:#ef0e5d;box-shadow:0 2px #8f0838}button.btn-error:hover,.btn.btn-error:hover{box-shadow:0 2px 0 1px #8f0838 inset}button.btn-error:focus,.btn.btn-error:focus{background:#8f0838}button.btn-error-alt,.btn.btn-error-alt{background:#c20941;box-shadow:0 2px #610420}button.btn-error-alt:hover,.btn.btn-error-alt:hover{box-shadow:0 2px 0 1px #610420 inset}button.btn-error-alt:focus,.btn.btn-error-alt:focus{background:#610420}button.btn-danger,.btn.btn-danger{background:#ef0e5d;box-shadow:0 2px #8f0838}button.btn-danger:hover,.btn.btn-danger:hover{box-shadow:0 2px 0 1px #8f0838 inset}button.btn-danger:focus,.btn.btn-danger:focus{background:#8f0838}button.btn-danger-alt,.btn.btn-danger-alt{background:#c20941;box-shadow:0 2px #610420}button.btn-danger-alt:hover,.btn.btn-danger-alt:hover{box-shadow:0 2px 0 1px #610420 inset}button.btn-danger-alt:focus,.btn.btn-danger-alt:focus{background:#610420}button.btn-purple,.btn.btn-purple{background:#bc48ff;box-shadow:0 2px #8f00e1}button.btn-purple:hover,.btn.btn-purple:hover{box-shadow:0 2px 0 1px #8f00e1 inset}button.btn-purple:focus,.btn.btn-purple:focus{background:#8f00e1}button.btn-purple-alt,.btn.btn-purple-alt{background:#692fbd;box-shadow:0 2px #3c1b6b}button.btn-purple-alt:hover,.btn.btn-purple-alt:hover{box-shadow:0 2px 0 1px #3c1b6b inset}button.btn-purple-alt:focus,.btn.btn-purple-alt:focus{background:#3c1b6b}button.btn-neutral,.btn.btn-neutral{background:#464646;box-shadow:0 2px #131313}button.btn-neutral:hover,.btn.btn-neutral:hover{box-shadow:0 2px 0 1px #131313 inset}button.btn-yellow,.btn.btn-yellow{background:#e5a123;box-shadow:0 2px #916411}button.btn-yellow:hover,.btn.btn-yellow:hover{box-shadow:0 2px 0 1px #916411 inset}button.btn-yellow:focus,.btn.btn-yellow:focus{background:#916411}button.btn-white,.btn.btn-white{background:#fff;box-shadow:0 2px #ccc}button.btn-white:hover,.btn.btn-white:hover{box-shadow:0 2px 0 1px #ccc inset}button.btn-white:focus,.btn.btn-white:focus{background:#ccc}button.btn-black,.btn.btn-black{background:#000;box-shadow:0 2px #000}button.btn-black:hover,.btn.btn-black:hover{box-shadow:0 2px 0 1px #000 inset}button.btn-black:focus,.btn.btn-black:focus{background:#000}button.btn-youtube,.btn.btn-youtube{background:#fd3c01;box-shadow:0 2px #972401}button.btn-youtube:hover,.btn.btn-youtube:hover{box-shadow:0 2px 0 1px #972401 inset}button.btn-youtube:focus,.btn.btn-youtube:focus{background:#972401}button.btn-raspbian,.btn.btn-raspbian{background:#b61240;box-shadow:0 2px #59091f}button.btn-raspbian:hover,.btn.btn-raspbian:hover{box-shadow:0 2px 0 1px #59091f inset}button.btn-raspbian:focus,.btn.btn-raspbian:focus{background:#59091f}button.btn-windows,.btn.btn-windows{background:#12a7e3;box-shadow:0 2px #0b6184}button.btn-windows:hover,.btn.btn-windows:hover{box-shadow:0 2px 0 1px #0b6184 inset}button.btn-windows:focus,.btn.btn-windows:focus{background:#0b6184}button.btn-macos,.btn.btn-macos{background:#b3bcc2;box-shadow:0 2px #7a8a95}button.btn-macos:hover,.btn.btn-macos:hover{box-shadow:0 2px 0 1px #7a8a95 inset}button.btn-macos:focus,.btn.btn-macos:focus{background:#7a8a95}button.btn-debian,.btn.btn-debian{background:#cf084e;box-shadow:0 2px #6d0429}button.btn-debian:hover,.btn.btn-debian:hover{box-shadow:0 2px 0 1px #6d0429 inset}button.btn-debian:focus,.btn.btn-debian:focus{background:#6d0429}button.btn-fedora,.btn.btn-fedora{background:#52a2da;box-shadow:0 2px #236ea3}button.btn-fedora:hover,.btn.btn-fedora:hover{box-shadow:0 2px 0 1px #236ea3 inset}button.btn-fedora:focus,.btn.btn-fedora:focus{background:#236ea3}button.btn-ubuntu,.btn.btn-ubuntu{background:#d64514;box-shadow:0 2px #79270b}button.btn-ubuntu:hover,.btn.btn-ubuntu:hover{box-shadow:0 2px 0 1px #79270b inset}button.btn-ubuntu:focus,.btn.btn-ubuntu:focus{background:#79270b}button.btn-suse,.btn.btn-suse{background:#6fb425;box-shadow:0 2px #3b5f14}button.btn-suse:hover,.btn.btn-suse:hover{box-shadow:0 2px 0 1px #3b5f14 inset}button.btn-suse:focus,.btn.btn-suse:focus{background:#3b5f14}button.btn-redhat,.btn.btn-redhat{background:#c60200;box-shadow:0 2px #600100}button.btn-redhat:hover,.btn.btn-redhat:hover{box-shadow:0 2px 0 1px #600100 inset}button.btn-redhat:focus,.btn.btn-redhat:focus{background:#600100}button.btn-centos,.btn.btn-centos{background:#9b4c88;box-shadow:0 2px #572a4c}button.btn-centos:hover,.btn.btn-centos:hover{box-shadow:0 2px 0 1px #572a4c inset}button.btn-centos:focus,.btn.btn-centos:focus{background:#572a4c}button.btn-other,.btn.btn-other{background:#e5a123;box-shadow:0 2px #916411}button.btn-other:hover,.btn.btn-other:hover{box-shadow:0 2px 0 1px #916411 inset}button.btn-other:focus,.btn.btn-other:focus{background:#916411}@font-face{font-family:Sixtyfour;src:url(../../webfonts/Sixtyfour-Regular.ttf) format("truetype")}*{font-family:Roboto,Arial,"sans-serif";margin:0;padding:0;box-sizing:border-box}html{background-color:#111}body,html{height:100%;font-family:Arial,sans-serif}.container{display:flex;height:100vh}.horizontal{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex:1;align-self:stretch}main{flex:1;display:flex;flex-direction:column}main .main-container{display:flex;flex-direction:column;flex:1;overflow:hidden;align-self:stretch}main .main-container .top-content{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;padding:10px 10px 10px 20px;background:transparent;border-bottom:1px solid #222}main .main-container .top-content h1{color:#fff;font-weight:600;font-size:24px}main .main-container .top-content .top-actions{flex:1;display:flex;flex-direction:row;justify-content:flex-end;align-items:center}main .main-container .top-content .top-actions button{margin-left:10px}main .main-container .bottom-content{display:flex;flex-direction:row;align-self:stretch;justify-content:flex-start;align-items:flex-start;flex:1;overflow-y:auto;background:radial-gradient(circle at 0% 53%,rgba(239,14,93,.8) 10%,transparent 45%),radial-gradient(circle at 135% 53%,rgba(2,123,255,.8) 10%,transparent 95%),radial-gradient(circle at 50% 80%,rgba(14,239,95,.8) 40%,transparent 95%)}main .main-container .bottom-content .page-content{flex:2;overflow-y:auto;align-self:stretch;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;background:#000c;padding:5px}main .main-container .bottom-content .page-content .inner{flex:1;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:0 10px 40px;background:#111;align-self:stretch}main .main-container .bottom-content .page-panel{flex:1;overflow-y:auto;align-self:stretch;background:#111;border-top:none}main .main-container .bottom-content .page-panel.left-panel{border-right:1px solid #222;border-left:none}main .main-container .bottom-content .page-panel.left-panel.explr-explorer{flex:.5;overflow-y:auto;padding:0;background:#111;box-shadow:1px 1px .5px .5px inset #0003;max-width:250px}main .main-container .bottom-content .page-panel.right-panel{border-left:1px solid #222;border-right:none}.invisible{visibility:hidden!important}.hidden{display:none!important}.tac{text-align:center!important}.tar{text-align:right!important}a{text-decoration:none}.normal{font-weight:400!important}.bold{font-weight:700!important}.col{display:flex;flex:1;flex-direction:column;align-self:stretch}main .context-bar{padding:10px;position:sticky;top:0;z-index:1000;max-height:80px;border-bottom:1px solid #222;display:flex;flex-direction:row;align-items:center}main .context-bar .context-menu{flex:1}main .context-bar .context-menu .inner{display:flex}main .context-bar .context-menu .inner ul.pills{margin:0}main .context-bar .context-divider{width:1px;height:100%;background:#222;margin-left:20px;margin-right:20px}main .context-bar .context-user{display:flex;margin-right:20px}main .context-bar .context-user .trigger{color:#fff}main .context-bar .context-user .trigger .avatar{width:32px;height:32px;border-radius:4px;background:#027bff;margin-right:10px;display:flex;flex-direction:row;justify-content:center;align-items:center;text-align:center;font-weight:700;font-size:14px;border:1px solid #444}main .context-bar .context-user .trigger i{margin-top:-5px;margin-left:10px}menu{width:300px;background:#111;overflow-y:auto;overflow-x:visible;padding:20px;z-index:2000;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;border-right:1px solid #222;min-width:64px}menu h1.logo{margin:40px 0 0 10px;align-self:stretch;display:flex}menu h1.logo a{text-align:center;text-shadow:0px 0 0 #fff,0px 2px 0 #444,0 0px 0 rgb(14,239,95),-0px 0 0 rgb(2,123,255),0 -0px 0 rgb(239,14,93);text-decoration:none;background:linear-gradient(90deg,#a0a0a0 0,#bebebe 46%,#dcdcdc);-webkit-background-clip:text;color:transparent;flex:1;font-family:Sixtyfour,Work Sans,Arial,"sans-serif";align-self:stretch;padding-right:3px;font-size:20px;text-transform:uppercase;transition:all .55s cubic-bezier(.19,1,.22,1);display:flex;flex-direction:row;justify-content:center;align-items:center;position:relative}menu h1.logo a img{flex-shrink:0;width:30px;margin-right:10px;position:absolute;left:5px;transition:all .55s cubic-bezier(.19,1,.22,1)}menu h1.logo a img.after{opacity:0}menu:hover h1.logo a{text-align:center;text-shadow:3px 0 0 #fff,3px 2px 0 #444,0 3px 0 rgb(14,239,95),-3px 0 0 rgb(2,123,255),0 -3px 0 rgb(239,14,93);text-decoration:none;background:linear-gradient(90deg,#a0a0a0 0,#bebebe 46%,#dcdcdc);-webkit-background-clip:text;color:transparent}menu:hover h1.logo a img.before{opacity:0}menu:hover h1.logo a img.after{animation-duration:.2s;animation-name:logotouch}menu nav{display:flex;align-self:stretch;flex:1}menu nav ul{margin:60px 0 20px;flex:1;align-self:flex-start;display:flex;flex-direction:column;list-style:none}menu nav ul li{align-self:stretch;overflow:hidden;position:relative;transition:all .55s cubic-bezier(.19,1,.22,1);margin:10px 0;border-radius:4px}menu nav ul li a{color:#ffffffe6;font-size:16px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1;padding-top:5px;padding-bottom:5px;padding-left:10px}menu nav ul li a i{color:#fff;opacity:.2;background:transparent;display:flex;justify-content:center;align-items:center;align-self:stretch;padding:10px;width:40px;border-radius:4px;text-align:center;margin-right:20px}menu nav ul li:after{background:#fff;content:"";height:195px;left:-200px;opacity:.2;position:absolute;top:-50px;transform:rotate(35deg);transition:all .55s cubic-bezier(.19,1,.22,1);width:50px;z-index:-2;cursor:pointer}menu nav ul li.active a{color:#027bff;font-weight:700}menu nav ul li.active a i{opacity:1;background:#ffffffe6;background:#017bff}menu nav ul li:hover{background:#027bff}menu nav ul li:hover:after{z-index:2;left:120%;transition:all .55s cubic-bezier(.19,1,.22,1)}menu nav ul li:hover a{color:#fff;font-weight:700}menu nav ul li:hover a i{color:#fff;opacity:1}menu footer{background:#ffffff03;padding:20px 0;display:flex;flex-direction:row;align-self:stretch;text-align:center;justify-content:center}menu footer p{color:#444}menu footer p.version a{color:#777;font-weight:700}.dropdown{position:relative;display:flex;align-self:stretch}.dropdown.dropdown-show ul.dropdown-menu{display:flex;flex-direction:column}.dropdown .trigger{cursor:pointer;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1}.dropdown ul.dropdown-menu{position:absolute;top:100%;left:0;display:none;background-color:#222;box-shadow:0 8px 16px #0003;z-index:1000;list-style-type:none;margin:0;overflow:hidden;border-radius:4px}.dropdown ul.dropdown-menu li{padding:8px 16px;cursor:pointer;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;transition:all .55s cubic-bezier(.19,1,.22,1)}.dropdown ul.dropdown-menu li.danger:hover{background-color:#ef0e5d}.dropdown ul.dropdown-menu li:hover{background-color:#027bff}.dropdown ul.dropdown-menu li a{padding:8px 16px 8px 8px;color:#fff;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch}.dropdown ul.dropdown-menu li a i{margin-right:15px}@keyframes logotouch{0%{opacity:0}50%{opacity:1}to{opacity:0;left:27px}}button,.btn{position:relative;padding:10px 13px 8px 10px;font-size:14px;color:#fff;cursor:pointer;border:none;border-radius:4px;background:#027bff;box-shadow:0 2px #004a9b;font-weight:700;letter-spacing:-.5px;margin-top:-2px}button i.icon-left,.btn i.icon-left{margin-right:5px}button:hover,.btn:hover{box-shadow:0 2px 0 1px #004a9b inset;color:#fffc}button:focus,.btn:focus{background:#004a9b;color:#ffffff80;box-shadow:none}button.btn-neutral,.btn.btn-neutral{color:#aaa;background:#464646;box-shadow:0 2px #2d2d2d}button.btn-neutral:hover,.btn.btn-neutral:hover{box-shadow:0 2px 0 1px #222 inset;background:#2d2d2d}button.btn-neutral:focus,.btn.btn-neutral:focus{background:#131313}button.btn-naked,.btn.btn-naked{background:transparent;box-shadow:none}button.btn-naked:hover,.btn.btn-naked:hover{box-shadow:0 2px 0 1px #222 inset;background:#2d2d2d}button.btn-naked:focus,.btn.btn-naked:focus{background:#131313}.alert{padding:20px;align-self:stretch;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:4px}.alert-info{color:#027bff;background:#027bff33}.alert-success{color:#0eef5f;background:#0eef5f33}.alert-danger,.alert-error{color:#ef0e5d;background:#ef0e5d33}.alert i{margin-right:13px}ul.explr-tree{height:100%!important}ul.explr-tree li span{color:#555;font-size:13px;padding-left:5px;cursor:pointer}ul.explr-tree li span.explr-plus,ul.explr-tree li span.explr-minus{z-index:1}ul.explr-tree li span.explr-plus:hover,ul.explr-tree li span.explr-minus:hover{color:#aaa}ul.explr-tree li a{color:#fff;padding-right:80px}ul.explr-tree li a:hover{color:#fff}ul.explr-tree li a.active{background:#ffffff1a;border-radius:4px;font-weight:700;text-decoration:underline;margin-left:35px;padding-left:5px;margin-right:10px}.explr-selection-actions{display:none;margin-right:10px;border-right:1px solid #222;padding-right:20px}.explr-selection-actions button{display:none}body.explr-selection-actionable .explr-selection-actions,body.explr-selection-actionable.explr-selection-folder .explr-selection-actions button.explr-selection-folder,body.explr-selection-actionable.explr-selection-entity .explr-selection-actions button.explr-selection-entity{display:flex}ul.explr-dirview{display:flex;flex-direction:row;flex-wrap:wrap}ul.explr-dirview li{display:flex;flex-direction:column;justify-content:flex-start;align-items:center;flex-shrink:0;margin:18px;min-width:90px;min-height:104px;padding-top:5px;border:1px solid transparent;border-radius:4px}ul.explr-dirview li.renaming a span{display:none}ul.explr-dirview li.renaming a form{display:block}ul.explr-dirview li.highlight-drop{border:1px dotted rgba(2,123,255,.4);background:#027bff4d}ul.explr-dirview li.highlight-clicked{border:1px dotted rgba(255,255,255,.2);background:#ffffff1a}ul.explr-dirview li a{color:#bbb;text-decoration:none;flex:1;text-align:center;font-size:12px;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;max-width:84px}ul.explr-dirview li a i{font-size:64px;margin-bottom:12px;border-radius:8px}ul.explr-dirview li a input{width:100%;padding:0 3px}ul.explr-dirview li a input:focus{outline:none}ul.explr-dirview li a:hover{opacity:.8}ul.explr-dirview li a form{display:none}ul.explr-dirview li.new-folder a{color:#027bff}ul.explr-dirview li.new-folder a form{display:block}ul.explr-dirview .ui-draggable-dragging{z-index:20}ul.explr-dirview .ui-draggable-dragging a{opacity:1!important}ul.pills{background:#222;padding:6px 4px 5px;box-shadow:1px 1px .5px .5px inset #0003;border:1px solid #222;border-radius:4px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;list-style:none;margin:0}ul.pills li.divider{margin:0 20px;width:1px;height:100%;background:#333}ul.pills li:hover a{opacity:.9}ul.pills li a{border-radius:4px;display:flex;flex-direction:row;justify-content:center;align-items:center;color:#fff;overflow:hidden;padding-right:30px;text-align:center;background:#0003;margin-right:5px;transition:all .25s cubic-bezier(.19,1,.22,1)}ul.pills li a span{display:flex;justify-content:center;align-items:center;margin-right:20px;height:42px;background:#0003;width:42px}ul.pills li.active a{color:#333;background:#fff;font-weight:700}ul.pills li:hover a{color:#fff;background:#027bff}ul.pills li:last-child a{margin-right:0}.breadcrumb-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;border-bottom:1px solid #222;background:transparent;padding:10px}.breadcrumb-container ul.breadcrumb{background:#222;padding:6px 4px 5px;box-shadow:1px 1px .5px .5px inset #0003;border:1px solid #222;border-radius:4px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;list-style:none;margin:0}.breadcrumb-container ul.breadcrumb li.divider{margin:0 5px}.breadcrumb-container ul.breadcrumb li.divider i{color:#aaa}.breadcrumb-container ul.breadcrumb li span,.breadcrumb-container ul.breadcrumb li a{border-radius:4px;display:flex;flex-direction:row;justify-content:center;align-items:center;color:#fff;text-align:center;padding:0 3px}.breadcrumb-container ul.breadcrumb li span i,.breadcrumb-container ul.breadcrumb li a i{margin-right:5px}.breadcrumb-container ul.breadcrumb li:hover a{color:#fff;background:#027bff}.breadcrumb-container ul.breadcrumb li:last-child a{margin-right:0}.modals{position:fixed;background:#0006;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10000}.modals .modals-outer{min-width:464px;display:flex;flex-direction:column;overflow:auto;padding-bottom:2px}.modals .modals-outer .modals-inner{background:#111;border-radius:10px;color:#333;padding:40px;box-shadow:0 2px #222;border:1px solid #222}.modals .modals-outer .modals-inner .modal h2{padding:0;margin:0 0 30px;font-weight:400;color:#999}.modals .modals-outer .modals-inner .modal h3{align-self:stretch;border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}table.panes{flex:1;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}table.panes tbody{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;margin:1px 1px 28px;background:#111;border-radius:4px;border:4px solid rgba(255,255,255,.05)}table.panes tbody:hover,table.panes tbody:hover tr.title-item{border-color:#027bff0d}table.panes tbody tr{flex:1;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;padding:8px 18px;background:#222}table.panes tbody tr:nth-child(odd){background-color:#111}table.panes tbody tr:nth-child(odd) td.description{color:#ffffffb3}table.panes tbody tr:nth-child(2n){background-color:#141414}table.panes tbody tr td{color:#888;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex:1;font-size:14px}table.panes tbody tr td.vertical{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}table.panes tbody tr td.description{align-self:stretch}table.panes tbody tr td.value{flex:0;margin-left:20px;word-break:break-all;flex-basis:auto}table.panes tbody tr td.value i.icon-legend{font-size:10px;margin-right:10px}table.panes tbody tr td.value i.icon-value{padding:2px 2px 1px;border-radius:2px;width:16px;text-align:center}table.panes tbody tr.title-item{border-bottom:1px solid #222}table.panes tbody tr.title-item td{color:#027bffe6;font-size:16px;font-weight:700}table.panes tbody tr.title-item td i{margin-right:10px}table.panes tbody tr.title-item td .more{flex:1;text-align:right;font-size:12px;color:#888;font-weight:400;font-style:italic}table.panes tbody tr.variable-item{cursor:pointer}table.panes tbody tr.variable-item:hover{background-color:#027bff0d}table.panes tbody tr.variable-item:hover td{font-weight:700;color:#fff}table.panes tbody tr.variable-item:hover td i.icon-legend{color:#fff}table.panes tbody tr.variable-item:hover td span,table.panes tbody tr.variable-item:hover td i.icon-value{background-color:#ffffff4d;color:#fff}table.panes tbody tr.variable-item:hover td.description{color:#027bff}span.empty{background:#e5a1234d;color:#e5a123;text-transform:lowercase;border-radius:2px;padding:2px 4px;font-weight:700}.form-holder{min-width:686px;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}.form-holder form{max-width:434px}form{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}form .alert{padding:8px 15px;font-size:14px;margin:0 0 25px}form .form-group{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;width:100%;flex:1;margin-bottom:20px}form .form-group label{flex:1;font-size:12px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;color:#666}form .form-group label.btn-upload{color:#fff;font-size:14px;flex:0;flex-basis:auto;margin-top:5px}form .form-group label.btn-upload input[type=file]{display:none}form .form-group label.btn-upload input[type=text]{margin-bottom:2px;padding-left:0;margin-left:10px}form .form-group label.btn-upload i{margin-left:3px;margin-right:10px}form .form-group .widget{margin-top:10px;align-self:stretch;display:flex;flex-direction:row}form .form-group .widget div{color:#ffffffb3;font-size:14px}form .form-group .widget select,form .form-group .widget input,form .form-group .widget textarea{outline:none;padding:8px 0 5px 8px;border-radius:2px;border:1px solid rgba(255,255,255,.05);flex:1;background:#555;box-shadow:0 2px 1px #444,0 4px 2px #333 inset;color:#ddd;font-size:14px}form .form-group .widget select[disabled],form .form-group .widget input[disabled],form .form-group .widget textarea[disabled]{color:#555;background:none;box-shadow:none;border:none;border-bottom:1px solid #333;border-radius:0}form .form-group.tab-select{border-bottom:1px solid #444;display:flex;flex-direction:row;position:relative;height:48px;padding:48px 0 0;flex:0;flex-basis:auto}form .form-group.tab-select .widget{height:49px;margin-top:0;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:absolute;top:0;left:0;border-bottom:2px solid rgb(2,123,255);color:#027bff}form .form-group.tab-select .widget select{border:none;background:none;box-shadow:none;padding:10px 35px 10px 10px;margin:0;color:inherit;appearance:none;-moz-appearance:none;-webkit-appearance:none;text-align:left;font-weight:700;cursor:pointer;border-radius:4px 4px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px;z-index:2}form .form-group.tab-select .widget i{margin-left:10px;margin-right:0}form .form-group.tab-select .widget i.triangle{margin-top:-4px;margin-left:0;position:absolute;right:10px}form .actions{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;align-self:stretch;margin:20px 0 0}form .actions button{margin-left:25px}form .actions.actions-left{justify-content:flex-start}form .actions.actions-left button{margin-left:0;margin-right:25px}.view-content-list main .main-container .content-object-input{margin-bottom:6px}.view-content-edit main .main-container .bottom-content .page-content{flex:1}.view-content-edit main .main-container .bottom-content .page-content .form-holder{margin:20px 20px 20px 10px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel{flex:1;align-self:stretch;display:flex;flex-direction:column;overflow:hidden;justify-content:flex-start;align-items:center;padding:20px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel h3{color:#fff;padding:10px 10px 10px 0;margin-bottom:20px;font-size:16px;align-self:stretch;margin-left:-8px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel h3 span{border-width:1px;border-style:solid;border-radius:4px;padding:4px 10px;margin-left:5px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel h3 i{font-size:16px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel .iframe-wrapper{display:flex;flex-direction:column;width:100%;position:relative;padding-top:56.25%;overflow:hidden;border-radius:4px;outline:4px solid rgba(255,255,255,.1)}.view-content-edit main .main-container .bottom-content .page-panel.right-panel .iframe-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.view-logs-list main .main-container .bottom-content .page-content .inner{padding-top:8px;padding-bottom:8px}.view-logs-list main .main-container .bottom-content .page-content .logs{flex:1;display:flex;flex-direction:column;align-self:stretch}.view-logs-list main .main-container .bottom-content .page-content .logs pre{flex:1;background:#000000e6;border:1px solid rgba(70,70,70,.5);border-radius:4px;font-family:monospace;color:#f2f2f2;padding:20px;overflow:auto;align-self:stretch}.view-node-player-edit main .main-container .bottom-content .page-content{flex:1}.view-node-player-edit main .main-container .bottom-content .page-content .form-holder{margin:20px 20px 20px 10px}.view-playlist-edit main .main-container .bottom-content .page-content{flex:1}.view-playlist-edit main .main-container .bottom-content .page-content .form-holder{margin:20px 20px 20px 10px}.view-plugins-list main .main-container .bottom-content .page-content .inner{padding:10px}.view-settings-list main .main-container .bottom-content .page-content .inner{padding:10px}.view-sysinfo-list main .main-container .bottom-content .page-content .inner{padding:10px} +.info{color:#027bff!important}.bg-info{background-color:#027bff!important}.border-info{border-color:#027bff!important}.info-alt{color:#075cb7!important}.bg-info-alt{background-color:#075cb7!important}.border-info-alt{border-color:#075cb7!important}.success{color:#0eef5f!important}.bg-success{background-color:#0eef5f!important}.border-success{border-color:#0eef5f!important}.success-alt{color:#11a948!important}.bg-success-alt{background-color:#11a948!important}.border-success-alt{border-color:#11a948!important}.error{color:#ef0e5d!important}.bg-error{background-color:#ef0e5d!important}.border-error{border-color:#ef0e5d!important}.error-alt{color:#c20941!important}.bg-error-alt{background-color:#c20941!important}.border-error-alt{border-color:#c20941!important}.danger{color:#ef0e5d!important}.bg-danger{background-color:#ef0e5d!important}.border-danger{border-color:#ef0e5d!important}.danger-alt{color:#c20941!important}.bg-danger-alt{background-color:#c20941!important}.border-danger-alt{border-color:#c20941!important}.purple{color:#bc48ff!important}.bg-purple{background-color:#bc48ff!important}.border-purple{border-color:#bc48ff!important}.purple-alt{color:#692fbd!important}.bg-purple-alt{background-color:#692fbd!important}.border-purple-alt{border-color:#692fbd!important}.neutral{color:#464646!important}.bg-neutral{background-color:#464646!important}.border-neutral{border-color:#464646!important}.yellow{color:#e5a123!important}.bg-yellow{background-color:#e5a123!important}.border-yellow{border-color:#e5a123!important}.white{color:#fff!important}.bg-white{background-color:#fff!important}.border-white{border-color:#fff!important}.black{color:#000!important}.bg-black{background-color:#000!important}.border-black{border-color:#000!important}.youtube{color:#fd3c01!important}.bg-youtube{background-color:#fd3c01!important}.border-youtube{border-color:#fd3c01!important}.raspbian{color:#b61240!important}.bg-raspbian{background-color:#b61240!important}.border-raspbian{border-color:#b61240!important}.windows{color:#12a7e3!important}.bg-windows{background-color:#12a7e3!important}.border-windows{border-color:#12a7e3!important}.macos{color:#b3bcc2!important}.bg-macos{background-color:#b3bcc2!important}.border-macos{border-color:#b3bcc2!important}.debian{color:#cf084e!important}.bg-debian{background-color:#cf084e!important}.border-debian{border-color:#cf084e!important}.fedora{color:#52a2da!important}.bg-fedora{background-color:#52a2da!important}.border-fedora{border-color:#52a2da!important}.ubuntu{color:#d64514!important}.bg-ubuntu{background-color:#d64514!important}.border-ubuntu{border-color:#d64514!important}.suse{color:#6fb425!important}.bg-suse{background-color:#6fb425!important}.border-suse{border-color:#6fb425!important}.redhat{color:#c60200!important}.bg-redhat{background-color:#c60200!important}.border-redhat{border-color:#c60200!important}.centos{color:#9b4c88!important}.bg-centos{background-color:#9b4c88!important}.border-centos{border-color:#9b4c88!important}.other{color:#e5a123!important}.bg-other{background-color:#e5a123!important}.border-other{border-color:#e5a123!important}button.btn-info,.btn.btn-info{background:#027bff;box-shadow:0 2px #004a9b}button.btn-info:hover,.btn.btn-info:hover{box-shadow:0 2px 0 1px #004a9b inset}button.btn-info:focus,.btn.btn-info:focus{background:#004a9b}button.btn-wire-info,.btn.btn-wire-info{background:transparent;box-shadow:none;border:2px solid rgb(2,123,255);color:#fffc}button.btn-wire-info i.btn-match,.btn.btn-wire-info i.btn-match{color:#027bff}button.btn-wire-info:hover,.btn.btn-wire-info:hover{background:#027bff0d;border-color:#0063ce;color:#0063ce;box-shadow:none}button.btn-wire-info:focus,.btn.btn-wire-info:focus{border-color:#004a9b;background:transparent}button.btn-info-alt,.btn.btn-info-alt{background:#075cb7;box-shadow:0 2px #032b55}button.btn-info-alt:hover,.btn.btn-info-alt:hover{box-shadow:0 2px 0 1px #032b55 inset}button.btn-info-alt:focus,.btn.btn-info-alt:focus{background:#032b55}button.btn-wire-info-alt,.btn.btn-wire-info-alt{background:transparent;box-shadow:none;border:2px solid rgb(7,92,183);color:#fffc}button.btn-wire-info-alt i.btn-match,.btn.btn-wire-info-alt i.btn-match{color:#075cb7}button.btn-wire-info-alt:hover,.btn.btn-wire-info-alt:hover{background:#075cb70d;border-color:#054386;color:#054386;box-shadow:none}button.btn-wire-info-alt:focus,.btn.btn-wire-info-alt:focus{border-color:#032b55;background:transparent}button.btn-success,.btn.btn-success{background:#0eef5f;box-shadow:0 2px #088f39}button.btn-success:hover,.btn.btn-success:hover{box-shadow:0 2px 0 1px #088f39 inset}button.btn-success:focus,.btn.btn-success:focus{background:#088f39}button.btn-wire-success,.btn.btn-wire-success{background:transparent;box-shadow:none;border:2px solid rgb(14,239,95);color:#fffc}button.btn-wire-success i.btn-match,.btn.btn-wire-success i.btn-match{color:#0eef5f}button.btn-wire-success:hover,.btn.btn-wire-success:hover{background:#0eef5f0d;border-color:#0bbf4c;color:#0bbf4c;box-shadow:none}button.btn-wire-success:focus,.btn.btn-wire-success:focus{border-color:#088f39;background:transparent}button.btn-success-alt,.btn.btn-success-alt{background:#11a948;box-shadow:0 2px #084c21}button.btn-success-alt:hover,.btn.btn-success-alt:hover{box-shadow:0 2px 0 1px #084c21 inset}button.btn-success-alt:focus,.btn.btn-success-alt:focus{background:#084c21}button.btn-wire-success-alt,.btn.btn-wire-success-alt{background:transparent;box-shadow:none;border:2px solid rgb(17,169,72);color:#fffc}button.btn-wire-success-alt i.btn-match,.btn.btn-wire-success-alt i.btn-match{color:#11a948}button.btn-wire-success-alt:hover,.btn.btn-wire-success-alt:hover{background:#11a9480d;border-color:#0c7b34;color:#0c7b34;box-shadow:none}button.btn-wire-success-alt:focus,.btn.btn-wire-success-alt:focus{border-color:#084c21;background:transparent}button.btn-error,.btn.btn-error{background:#ef0e5d;box-shadow:0 2px #8f0838}button.btn-error:hover,.btn.btn-error:hover{box-shadow:0 2px 0 1px #8f0838 inset}button.btn-error:focus,.btn.btn-error:focus{background:#8f0838}button.btn-wire-error,.btn.btn-wire-error{background:transparent;box-shadow:none;border:2px solid rgb(239,14,93);color:#fffc}button.btn-wire-error i.btn-match,.btn.btn-wire-error i.btn-match{color:#ef0e5d}button.btn-wire-error:hover,.btn.btn-wire-error:hover{background:#ef0e5d0d;border-color:#bf0b4a;color:#bf0b4a;box-shadow:none}button.btn-wire-error:focus,.btn.btn-wire-error:focus{border-color:#8f0838;background:transparent}button.btn-error-alt,.btn.btn-error-alt{background:#c20941;box-shadow:0 2px #610420}button.btn-error-alt:hover,.btn.btn-error-alt:hover{box-shadow:0 2px 0 1px #610420 inset}button.btn-error-alt:focus,.btn.btn-error-alt:focus{background:#610420}button.btn-wire-error-alt,.btn.btn-wire-error-alt{background:transparent;box-shadow:none;border:2px solid rgb(194,9,65);color:#fffc}button.btn-wire-error-alt i.btn-match,.btn.btn-wire-error-alt i.btn-match{color:#c20941}button.btn-wire-error-alt:hover,.btn.btn-wire-error-alt:hover{background:#c209410d;border-color:#910731;color:#910731;box-shadow:none}button.btn-wire-error-alt:focus,.btn.btn-wire-error-alt:focus{border-color:#610420;background:transparent}button.btn-danger,.btn.btn-danger{background:#ef0e5d;box-shadow:0 2px #8f0838}button.btn-danger:hover,.btn.btn-danger:hover{box-shadow:0 2px 0 1px #8f0838 inset}button.btn-danger:focus,.btn.btn-danger:focus{background:#8f0838}button.btn-wire-danger,.btn.btn-wire-danger{background:transparent;box-shadow:none;border:2px solid rgb(239,14,93);color:#fffc}button.btn-wire-danger i.btn-match,.btn.btn-wire-danger i.btn-match{color:#ef0e5d}button.btn-wire-danger:hover,.btn.btn-wire-danger:hover{background:#ef0e5d0d;border-color:#bf0b4a;color:#bf0b4a;box-shadow:none}button.btn-wire-danger:focus,.btn.btn-wire-danger:focus{border-color:#8f0838;background:transparent}button.btn-danger-alt,.btn.btn-danger-alt{background:#c20941;box-shadow:0 2px #610420}button.btn-danger-alt:hover,.btn.btn-danger-alt:hover{box-shadow:0 2px 0 1px #610420 inset}button.btn-danger-alt:focus,.btn.btn-danger-alt:focus{background:#610420}button.btn-wire-danger-alt,.btn.btn-wire-danger-alt{background:transparent;box-shadow:none;border:2px solid rgb(194,9,65);color:#fffc}button.btn-wire-danger-alt i.btn-match,.btn.btn-wire-danger-alt i.btn-match{color:#c20941}button.btn-wire-danger-alt:hover,.btn.btn-wire-danger-alt:hover{background:#c209410d;border-color:#910731;color:#910731;box-shadow:none}button.btn-wire-danger-alt:focus,.btn.btn-wire-danger-alt:focus{border-color:#610420;background:transparent}button.btn-purple,.btn.btn-purple{background:#bc48ff;box-shadow:0 2px #8f00e1}button.btn-purple:hover,.btn.btn-purple:hover{box-shadow:0 2px 0 1px #8f00e1 inset}button.btn-purple:focus,.btn.btn-purple:focus{background:#8f00e1}button.btn-wire-purple,.btn.btn-wire-purple{background:transparent;box-shadow:none;border:2px solid rgb(188,72,255);color:#fffc}button.btn-wire-purple i.btn-match,.btn.btn-wire-purple i.btn-match{color:#bc48ff}button.btn-wire-purple:hover,.btn.btn-wire-purple:hover{background:#bc48ff0d;border-color:#a915ff;color:#a915ff;box-shadow:none}button.btn-wire-purple:focus,.btn.btn-wire-purple:focus{border-color:#8f00e1;background:transparent}button.btn-purple-alt,.btn.btn-purple-alt{background:#692fbd;box-shadow:0 2px #3c1b6b}button.btn-purple-alt:hover,.btn.btn-purple-alt:hover{box-shadow:0 2px 0 1px #3c1b6b inset}button.btn-purple-alt:focus,.btn.btn-purple-alt:focus{background:#3c1b6b}button.btn-wire-purple-alt,.btn.btn-wire-purple-alt{background:transparent;box-shadow:none;border:2px solid rgb(105,47,189);color:#fffc}button.btn-wire-purple-alt i.btn-match,.btn.btn-wire-purple-alt i.btn-match{color:#692fbd}button.btn-wire-purple-alt:hover,.btn.btn-wire-purple-alt:hover{background:#692fbd0d;border-color:#522594;color:#522594;box-shadow:none}button.btn-wire-purple-alt:focus,.btn.btn-wire-purple-alt:focus{border-color:#3c1b6b;background:transparent}button.btn-neutral,.btn.btn-neutral{background:#464646;box-shadow:0 2px #131313}button.btn-neutral:hover,.btn.btn-neutral:hover{box-shadow:0 2px 0 1px #131313 inset}button.btn-wire-neutral,.btn.btn-wire-neutral{background:transparent;box-shadow:none;border:2px solid rgb(70,70,70);color:#fffc}button.btn-wire-neutral i.btn-match,.btn.btn-wire-neutral i.btn-match{color:#464646}button.btn-wire-neutral:hover,.btn.btn-wire-neutral:hover{background:#4646460d;border-color:#2d2d2d;color:#2d2d2d;box-shadow:none}button.btn-wire-neutral:focus,.btn.btn-wire-neutral:focus{border-color:#131313;background:transparent}button.btn-yellow,.btn.btn-yellow{background:#e5a123;box-shadow:0 2px #916411}button.btn-yellow:hover,.btn.btn-yellow:hover{box-shadow:0 2px 0 1px #916411 inset}button.btn-yellow:focus,.btn.btn-yellow:focus{background:#916411}button.btn-wire-yellow,.btn.btn-wire-yellow{background:transparent;box-shadow:none;border:2px solid rgb(229,161,35);color:#fffc}button.btn-wire-yellow i.btn-match,.btn.btn-wire-yellow i.btn-match{color:#e5a123}button.btn-wire-yellow:hover,.btn.btn-wire-yellow:hover{background:#e5a1230d;border-color:#be8417;color:#be8417;box-shadow:none}button.btn-wire-yellow:focus,.btn.btn-wire-yellow:focus{border-color:#916411;background:transparent}button.btn-white,.btn.btn-white{background:#fff;box-shadow:0 2px #ccc}button.btn-white:hover,.btn.btn-white:hover{box-shadow:0 2px 0 1px #ccc inset}button.btn-white:focus,.btn.btn-white:focus{background:#ccc}button.btn-wire-white,.btn.btn-wire-white{background:transparent;box-shadow:none;border:2px solid rgb(255,255,255);color:#fffc}button.btn-wire-white i.btn-match,.btn.btn-wire-white i.btn-match{color:#fff}button.btn-wire-white:hover,.btn.btn-wire-white:hover{background:#ffffff0d;border-color:#e6e6e6;color:#e6e6e6;box-shadow:none}button.btn-wire-white:focus,.btn.btn-wire-white:focus{border-color:#ccc;background:transparent}button.btn-black,.btn.btn-black{background:#000;box-shadow:0 2px #000}button.btn-black:hover,.btn.btn-black:hover{box-shadow:0 2px 0 1px #000 inset}button.btn-black:focus,.btn.btn-black:focus{background:#000}button.btn-wire-black,.btn.btn-wire-black{background:transparent;box-shadow:none;border:2px solid rgb(0,0,0);color:#fffc}button.btn-wire-black i.btn-match,.btn.btn-wire-black i.btn-match{color:#000}button.btn-wire-black:hover,.btn.btn-wire-black:hover{background:#0000000d;border-color:#000;color:#000;box-shadow:none}button.btn-wire-black:focus,.btn.btn-wire-black:focus{border-color:#000;background:transparent}button.btn-youtube,.btn.btn-youtube{background:#fd3c01;box-shadow:0 2px #972401}button.btn-youtube:hover,.btn.btn-youtube:hover{box-shadow:0 2px 0 1px #972401 inset}button.btn-youtube:focus,.btn.btn-youtube:focus{background:#972401}button.btn-wire-youtube,.btn.btn-wire-youtube{background:transparent;box-shadow:none;border:2px solid rgb(253,60,1);color:#fffc}button.btn-wire-youtube i.btn-match,.btn.btn-wire-youtube i.btn-match{color:#fd3c01}button.btn-wire-youtube:hover,.btn.btn-wire-youtube:hover{background:#fd3c010d;border-color:#ca3001;color:#ca3001;box-shadow:none}button.btn-wire-youtube:focus,.btn.btn-wire-youtube:focus{border-color:#972401;background:transparent}button.btn-raspbian,.btn.btn-raspbian{background:#b61240;box-shadow:0 2px #59091f}button.btn-raspbian:hover,.btn.btn-raspbian:hover{box-shadow:0 2px 0 1px #59091f inset}button.btn-raspbian:focus,.btn.btn-raspbian:focus{background:#59091f}button.btn-wire-raspbian,.btn.btn-wire-raspbian{background:transparent;box-shadow:none;border:2px solid rgb(182,18,64);color:#fffc}button.btn-wire-raspbian i.btn-match,.btn.btn-wire-raspbian i.btn-match{color:#b61240}button.btn-wire-raspbian:hover,.btn.btn-wire-raspbian:hover{background:#b612400d;border-color:#880d30;color:#880d30;box-shadow:none}button.btn-wire-raspbian:focus,.btn.btn-wire-raspbian:focus{border-color:#59091f;background:transparent}button.btn-windows,.btn.btn-windows{background:#12a7e3;box-shadow:0 2px #0b6184}button.btn-windows:hover,.btn.btn-windows:hover{box-shadow:0 2px 0 1px #0b6184 inset}button.btn-windows:focus,.btn.btn-windows:focus{background:#0b6184}button.btn-wire-windows,.btn.btn-wire-windows{background:transparent;box-shadow:none;border:2px solid rgb(18,167,227);color:#fffc}button.btn-wire-windows i.btn-match,.btn.btn-wire-windows i.btn-match{color:#12a7e3}button.btn-wire-windows:hover,.btn.btn-wire-windows:hover{background:#12a7e30d;border-color:#0e84b4;color:#0e84b4;box-shadow:none}button.btn-wire-windows:focus,.btn.btn-wire-windows:focus{border-color:#0b6184;background:transparent}button.btn-macos,.btn.btn-macos{background:#b3bcc2;box-shadow:0 2px #7a8a95}button.btn-macos:hover,.btn.btn-macos:hover{box-shadow:0 2px 0 1px #7a8a95 inset}button.btn-macos:focus,.btn.btn-macos:focus{background:#7a8a95}button.btn-wire-macos,.btn.btn-wire-macos{background:transparent;box-shadow:none;border:2px solid rgb(179,188,194);color:#fffc}button.btn-wire-macos i.btn-match,.btn.btn-wire-macos i.btn-match{color:#b3bcc2}button.btn-wire-macos:hover,.btn.btn-wire-macos:hover{background:#b3bcc20d;border-color:#97a3ab;color:#97a3ab;box-shadow:none}button.btn-wire-macos:focus,.btn.btn-wire-macos:focus{border-color:#7a8a95;background:transparent}button.btn-debian,.btn.btn-debian{background:#cf084e;box-shadow:0 2px #6d0429}button.btn-debian:hover,.btn.btn-debian:hover{box-shadow:0 2px 0 1px #6d0429 inset}button.btn-debian:focus,.btn.btn-debian:focus{background:#6d0429}button.btn-wire-debian,.btn.btn-wire-debian{background:transparent;box-shadow:none;border:2px solid rgb(207,8,78);color:#fffc}button.btn-wire-debian i.btn-match,.btn.btn-wire-debian i.btn-match{color:#cf084e}button.btn-wire-debian:hover,.btn.btn-wire-debian:hover{background:#cf084e0d;border-color:#9e063b;color:#9e063b;box-shadow:none}button.btn-wire-debian:focus,.btn.btn-wire-debian:focus{border-color:#6d0429;background:transparent}button.btn-fedora,.btn.btn-fedora{background:#52a2da;box-shadow:0 2px #236ea3}button.btn-fedora:hover,.btn.btn-fedora:hover{box-shadow:0 2px 0 1px #236ea3 inset}button.btn-fedora:focus,.btn.btn-fedora:focus{background:#236ea3}button.btn-wire-fedora,.btn.btn-wire-fedora{background:transparent;box-shadow:none;border:2px solid rgb(82,162,218);color:#fffc}button.btn-wire-fedora i.btn-match,.btn.btn-wire-fedora i.btn-match{color:#52a2da}button.btn-wire-fedora:hover,.btn.btn-wire-fedora:hover{background:#52a2da0d;border-color:#2c8bcd;color:#2c8bcd;box-shadow:none}button.btn-wire-fedora:focus,.btn.btn-wire-fedora:focus{border-color:#236ea3;background:transparent}button.btn-ubuntu,.btn.btn-ubuntu{background:#d64514;box-shadow:0 2px #79270b}button.btn-ubuntu:hover,.btn.btn-ubuntu:hover{box-shadow:0 2px 0 1px #79270b inset}button.btn-ubuntu:focus,.btn.btn-ubuntu:focus{background:#79270b}button.btn-wire-ubuntu,.btn.btn-wire-ubuntu{background:transparent;box-shadow:none;border:2px solid rgb(214,69,20);color:#fffc}button.btn-wire-ubuntu i.btn-match,.btn.btn-wire-ubuntu i.btn-match{color:#d64514}button.btn-wire-ubuntu:hover,.btn.btn-wire-ubuntu:hover{background:#d645140d;border-color:#a73610;color:#a73610;box-shadow:none}button.btn-wire-ubuntu:focus,.btn.btn-wire-ubuntu:focus{border-color:#79270b;background:transparent}button.btn-suse,.btn.btn-suse{background:#6fb425;box-shadow:0 2px #3b5f14}button.btn-suse:hover,.btn.btn-suse:hover{box-shadow:0 2px 0 1px #3b5f14 inset}button.btn-suse:focus,.btn.btn-suse:focus{background:#3b5f14}button.btn-wire-suse,.btn.btn-wire-suse{background:transparent;box-shadow:none;border:2px solid rgb(111,180,37);color:#fffc}button.btn-wire-suse i.btn-match,.btn.btn-wire-suse i.btn-match{color:#6fb425}button.btn-wire-suse:hover,.btn.btn-wire-suse:hover{background:#6fb4250d;border-color:#558a1c;color:#558a1c;box-shadow:none}button.btn-wire-suse:focus,.btn.btn-wire-suse:focus{border-color:#3b5f14;background:transparent}button.btn-redhat,.btn.btn-redhat{background:#c60200;box-shadow:0 2px #600100}button.btn-redhat:hover,.btn.btn-redhat:hover{box-shadow:0 2px 0 1px #600100 inset}button.btn-redhat:focus,.btn.btn-redhat:focus{background:#600100}button.btn-wire-redhat,.btn.btn-wire-redhat{background:transparent;box-shadow:none;border:2px solid rgb(198,2,0);color:#fffc}button.btn-wire-redhat i.btn-match,.btn.btn-wire-redhat i.btn-match{color:#c60200}button.btn-wire-redhat:hover,.btn.btn-wire-redhat:hover{background:#c602000d;border-color:#930100;color:#930100;box-shadow:none}button.btn-wire-redhat:focus,.btn.btn-wire-redhat:focus{border-color:#600100;background:transparent}button.btn-centos,.btn.btn-centos{background:#9b4c88;box-shadow:0 2px #572a4c}button.btn-centos:hover,.btn.btn-centos:hover{box-shadow:0 2px 0 1px #572a4c inset}button.btn-centos:focus,.btn.btn-centos:focus{background:#572a4c}button.btn-wire-centos,.btn.btn-wire-centos{background:transparent;box-shadow:none;border:2px solid rgb(155,76,136);color:#fffc}button.btn-wire-centos i.btn-match,.btn.btn-wire-centos i.btn-match{color:#9b4c88}button.btn-wire-centos:hover,.btn.btn-wire-centos:hover{background:#9b4c880d;border-color:#793b6a;color:#793b6a;box-shadow:none}button.btn-wire-centos:focus,.btn.btn-wire-centos:focus{border-color:#572a4c;background:transparent}button.btn-other,.btn.btn-other{background:#e5a123;box-shadow:0 2px #916411}button.btn-other:hover,.btn.btn-other:hover{box-shadow:0 2px 0 1px #916411 inset}button.btn-other:focus,.btn.btn-other:focus{background:#916411}button.btn-wire-other,.btn.btn-wire-other{background:transparent;box-shadow:none;border:2px solid rgb(229,161,35);color:#fffc}button.btn-wire-other i.btn-match,.btn.btn-wire-other i.btn-match{color:#e5a123}button.btn-wire-other:hover,.btn.btn-wire-other:hover{background:#e5a1230d;border-color:#be8417;color:#be8417;box-shadow:none}button.btn-wire-other:focus,.btn.btn-wire-other:focus{border-color:#916411;background:transparent}@font-face{font-family:Sixtyfour;src:url(../../webfonts/Sixtyfour-Regular.ttf) format("truetype")}*{font-family:Roboto,Arial,"sans-serif";margin:0;padding:0;box-sizing:border-box}html{background-color:#111}body,html{height:100%;font-family:Arial,sans-serif}.container{display:flex;height:100vh}.horizontal{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex:1;align-self:stretch}.vertical{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;flex:1;align-self:stretch}main{flex:1;display:flex;flex-direction:column}main .main-container{display:flex;flex-direction:column;flex:1;overflow:hidden;align-self:stretch}main .main-container .top-content{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;padding:10px 10px 10px 20px;background:transparent;border-bottom:1px solid #222}main .main-container .top-content h1{color:#fff;font-weight:600;font-size:24px}main .main-container .top-content .top-actions{flex:1;display:flex;flex-direction:row;justify-content:flex-end;align-items:center}main .main-container .top-content .top-actions .btn,main .main-container .top-content .top-actions button{margin-left:10px}main .main-container .bottom-content{display:flex;flex-direction:row;align-self:stretch;justify-content:flex-start;align-items:flex-start;flex:1;overflow-y:auto;background:radial-gradient(circle at 0% 53%,rgba(239,14,93,.8) 10%,transparent 45%),radial-gradient(circle at 135% 53%,rgba(2,123,255,.8) 10%,transparent 95%),radial-gradient(circle at 50% 80%,rgba(14,239,95,.8) 40%,transparent 95%)}main .main-container .bottom-content .page-content{flex:2;overflow-y:auto;align-self:stretch;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;background:#000c;padding:5px}main .main-container .bottom-content .page-content .inner{flex:1;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:0 10px 40px;background:#111;align-self:stretch}main .main-container .bottom-content .page-panel{flex:1;overflow-y:auto;align-self:stretch;background:#111;border-top:none}main .main-container .bottom-content .page-panel.left-panel{border-right:1px solid #222;border-left:none}main .main-container .bottom-content .page-panel.left-panel.explr-explorer{flex:.5;overflow-y:auto;padding:0;background:#111;box-shadow:1px 1px .5px .5px inset #0003;max-width:250px}main .main-container .bottom-content .page-panel.right-panel{border-left:1px solid #222;border-right:none}.invisible{visibility:hidden!important}.hidden{display:none!important}.tac{text-align:center!important}.tar{text-align:right!important}a{text-decoration:none}.normal{font-weight:400!important}.bold{font-weight:700!important}.col{display:flex;flex:1;flex-direction:column;align-self:stretch}main .context-bar{padding:10px;position:sticky;top:0;z-index:1000;max-height:80px;border-bottom:1px solid #222;display:flex;flex-direction:row;align-items:center}main .context-bar .context-menu{flex:1}main .context-bar .context-menu .inner{display:flex}main .context-bar .context-menu .inner ul.pills{margin:0}main .context-bar .context-divider{width:1px;height:100%;background:#222;margin-left:20px;margin-right:20px}main .context-bar .context-user{display:flex;margin-right:20px}main .context-bar .context-user .trigger{color:#fff}main .context-bar .context-user .trigger .avatar{width:32px;height:32px;border-radius:4px;background:#027bff;margin-right:10px;display:flex;flex-direction:row;justify-content:center;align-items:center;text-align:center;font-weight:700;font-size:14px;border:1px solid #444}main .context-bar .context-user .trigger i{margin-top:-5px;margin-left:10px}menu{width:300px;background:#111;overflow-y:auto;overflow-x:visible;padding:20px;z-index:2000;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;border-right:1px solid #222;min-width:64px}menu h1.logo{margin:40px 0 0 10px;align-self:stretch;display:flex}menu h1.logo a{text-align:center;text-shadow:0px 0 0 #fff,0px 2px 0 #444,0 0px 0 rgb(14,239,95),-0px 0 0 rgb(2,123,255),0 -0px 0 rgb(239,14,93);text-decoration:none;background:linear-gradient(90deg,#a0a0a0 0,#bebebe 46%,#dcdcdc);-webkit-background-clip:text;color:transparent;flex:1;font-family:Sixtyfour,Work Sans,Arial,"sans-serif";align-self:stretch;padding-right:3px;font-size:20px;text-transform:uppercase;transition:all .55s cubic-bezier(.19,1,.22,1);display:flex;flex-direction:row;justify-content:center;align-items:center;position:relative}menu h1.logo a img{flex-shrink:0;width:30px;margin-right:10px;position:absolute;left:5px;transition:all .55s cubic-bezier(.19,1,.22,1)}menu h1.logo a img.after{opacity:0}menu:hover h1.logo a{text-align:center;text-shadow:3px 0 0 #fff,3px 2px 0 #444,0 3px 0 rgb(14,239,95),-3px 0 0 rgb(2,123,255),0 -3px 0 rgb(239,14,93);text-decoration:none;background:linear-gradient(90deg,#a0a0a0 0,#bebebe 46%,#dcdcdc);-webkit-background-clip:text;color:transparent}menu:hover h1.logo a img.before{opacity:0}menu:hover h1.logo a img.after{animation-duration:.2s;animation-name:logotouch}menu nav{display:flex;align-self:stretch;flex:1}menu nav ul{margin:60px 0 20px;flex:1;align-self:flex-start;display:flex;flex-direction:column;list-style:none}menu nav ul li{align-self:stretch;overflow:hidden;position:relative;transition:all .55s cubic-bezier(.19,1,.22,1);margin:10px 0;border-radius:4px}menu nav ul li a{color:#ffffffe6;font-size:16px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1;padding-top:5px;padding-bottom:5px;padding-left:10px}menu nav ul li a i{color:#fff;opacity:.2;background:transparent;display:flex;justify-content:center;align-items:center;align-self:stretch;padding:10px;width:40px;border-radius:4px;text-align:center;margin-right:20px}menu nav ul li:after{background:#fff;content:"";height:195px;left:-200px;opacity:.2;position:absolute;top:-50px;transform:rotate(35deg);transition:all .55s cubic-bezier(.19,1,.22,1);width:50px;z-index:-2;cursor:pointer}menu nav ul li.active a{color:#027bff;font-weight:700}menu nav ul li.active a i{opacity:1;background:#ffffffe6;background:#017bff}menu nav ul li:hover{background:#027bff}menu nav ul li:hover:after{z-index:2;left:120%;transition:all .55s cubic-bezier(.19,1,.22,1)}menu nav ul li:hover a{color:#fff;font-weight:700}menu nav ul li:hover a i{color:#fff;opacity:1}menu footer{background:#ffffff03;padding:20px 0;display:flex;flex-direction:row;align-self:stretch;text-align:center;justify-content:center}menu footer p{color:#444}menu footer p.version a{color:#777;font-weight:700}.dropdown{position:relative;display:flex;align-self:stretch}.dropdown.dropdown-show ul.dropdown-menu{display:flex;flex-direction:column}.dropdown .trigger{cursor:pointer;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1}.dropdown ul.dropdown-menu{position:absolute;top:100%;left:0;display:none;background-color:#222;box-shadow:0 8px 16px #0003;z-index:1000;list-style-type:none;margin:0;overflow:hidden;border-radius:4px}.dropdown ul.dropdown-menu li{padding:8px 16px;cursor:pointer;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;transition:all .55s cubic-bezier(.19,1,.22,1)}.dropdown ul.dropdown-menu li.danger:hover{background-color:#ef0e5d}.dropdown ul.dropdown-menu li:hover{background-color:#027bff}.dropdown ul.dropdown-menu li a{padding:8px 16px 8px 8px;color:#fff;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch}.dropdown ul.dropdown-menu li a i{margin-right:15px}@keyframes logotouch{0%{opacity:0}50%{opacity:1}to{opacity:0;left:27px}}button,.btn{position:relative;padding:10px 10px 8px;font-size:14px;color:#fff;cursor:pointer;border:none;border-radius:4px;background:#027bff;box-shadow:0 2px #004a9b;font-weight:700;letter-spacing:-.5px;margin-top:-2px}button i.icon-left,.btn i.icon-left{margin-right:5px}button:hover,.btn:hover{box-shadow:0 2px 0 1px #004a9b inset;color:#fffc}button:focus,.btn:focus{background:#004a9b;color:#ffffff80;box-shadow:none}button.btn-neutral,.btn.btn-neutral{color:#aaa;background:#464646;box-shadow:0 2px #2d2d2d}button.btn-neutral:hover,.btn.btn-neutral:hover{box-shadow:0 2px 0 1px #222 inset;background:#2d2d2d}button.btn-neutral:focus,.btn.btn-neutral:focus{background:#131313}button .btn-wire-neutral,.btn .btn-wire-neutral{background:transparent;border:2px solid rgb(70,70,70);color:#fffc;box-shadow:none}button .btn-wire-neutral:hover,.btn .btn-wire-neutral:hover{background:#4646460d;border-color:#2d2d2d;color:#2d2d2d;box-shadow:none}button .btn-wire-neutral:focus,.btn .btn-wire-neutral:focus{border-color:#131313;background:transparent}button.btn-naked,.btn.btn-naked{background:transparent;box-shadow:none}button.btn-naked:hover,.btn.btn-naked:hover{box-shadow:0 2px 0 1px #222 inset;background:#2d2d2d}button.btn-naked:focus,.btn.btn-naked:focus{background:#131313}.alert{padding:20px;align-self:stretch;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:4px}.alert a{color:inherit;margin-left:4px;margin-right:4px;text-decoration:underline}.alert-info{color:#027bff;background:#027bff33}.alert-success{color:#0eef5f;background:#0eef5f33}.alert-danger,.alert-error{color:#ef0e5d;background:#ef0e5d33}.alert i{margin-right:13px}ul.explr-tree{height:100%!important}ul.explr-tree li span{color:#555;font-size:13px;padding-left:5px;cursor:pointer}ul.explr-tree li span.explr-plus,ul.explr-tree li span.explr-minus{z-index:1}ul.explr-tree li span.explr-plus:hover,ul.explr-tree li span.explr-minus:hover{color:#aaa}ul.explr-tree li a{color:#fff;padding-right:80px}ul.explr-tree li a:hover{color:#fff}ul.explr-tree li a.active{background:#ffffff1a;border-radius:4px;font-weight:700;text-decoration:underline;margin-left:35px;padding-left:5px;margin-right:10px}.explr-selection-actions{display:none;margin-right:10px;border-right:1px solid #222;padding-right:20px}.explr-selection-actions button{display:none}body.explr-selection-actionable .explr-selection-actions,body.explr-selection-actionable.explr-selection-folder .explr-selection-actions button.explr-selection-folder,body.explr-selection-actionable.explr-selection-entity .explr-selection-actions button.explr-selection-entity{display:flex}ul.explr-dirview{display:flex;flex-direction:row;flex-wrap:wrap}ul.explr-dirview li{display:flex;flex-direction:column;justify-content:flex-start;align-items:center;flex-shrink:0;margin:18px;min-width:90px;min-height:104px;padding-top:5px;border:1px solid transparent;border-radius:4px}ul.explr-dirview li.renaming a span{display:none}ul.explr-dirview li.renaming a form{display:block}ul.explr-dirview li.highlight-drop{border:1px dotted rgba(2,123,255,.4);background:#027bff4d}ul.explr-dirview li.highlight-clicked{border:1px dotted rgba(255,255,255,.2);background:#ffffff1a}ul.explr-dirview li a{color:#bbb;text-decoration:none;flex:1;text-align:center;font-size:12px;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;max-width:84px}ul.explr-dirview li a i{font-size:64px;margin-bottom:12px;border-radius:8px}ul.explr-dirview li a input{width:100%;padding:0 3px}ul.explr-dirview li a input:focus{outline:none}ul.explr-dirview li a:hover{opacity:.8}ul.explr-dirview li a form{display:none}ul.explr-dirview li.new-folder a{color:#027bff}ul.explr-dirview li.new-folder a form{display:block}ul.explr-dirview .ui-draggable-dragging{z-index:20}ul.explr-dirview .ui-draggable-dragging a{opacity:1!important}ul.pills{background:#222;padding:6px 4px 5px;box-shadow:1px 1px .5px .5px inset #0003;border:1px solid #222;border-radius:4px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;list-style:none;margin:0}ul.pills li.divider{margin:0 20px;width:1px;height:100%;background:#333}ul.pills li:hover a{opacity:.9}ul.pills li a{border-radius:4px;display:flex;flex-direction:row;justify-content:center;align-items:center;color:#fff;overflow:hidden;padding-right:30px;text-align:center;background:#0003;margin-right:5px;transition:all .25s cubic-bezier(.19,1,.22,1)}ul.pills li a span{display:flex;justify-content:center;align-items:center;margin-right:20px;height:42px;background:#0003;width:42px}ul.pills li.active a{color:#333;background:#fff;font-weight:700}ul.pills li:hover a{color:#fff;background:#027bff}ul.pills li:last-child a{margin-right:0}.breadcrumb-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;border-bottom:1px solid #222;background:transparent;padding:10px}.breadcrumb-container ul.breadcrumb{background:#222;padding:6px 4px 5px;box-shadow:1px 1px .5px .5px inset #0003;border:1px solid #222;border-radius:4px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;list-style:none;margin:0}.breadcrumb-container ul.breadcrumb li.divider{margin:0 5px}.breadcrumb-container ul.breadcrumb li.divider i{color:#aaa}.breadcrumb-container ul.breadcrumb li span,.breadcrumb-container ul.breadcrumb li a{border-radius:4px;display:flex;flex-direction:row;justify-content:center;align-items:center;color:#fff;text-align:center;padding:0 3px}.breadcrumb-container ul.breadcrumb li span i,.breadcrumb-container ul.breadcrumb li a i{margin-right:5px}.breadcrumb-container ul.breadcrumb li:hover a{color:#fff;background:#027bff}.breadcrumb-container ul.breadcrumb li:last-child a{margin-right:0}.modals{position:fixed;background:#0006;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:10000}.modals .modals-outer{min-width:464px;display:flex;flex-direction:column;overflow:auto;padding-bottom:2px}.modals .modals-outer .modals-inner{background:#111;border-radius:10px;color:#333;padding:40px;box-shadow:0 2px #222;border:1px solid #222}.modals .modals-outer .modals-inner .modal h2{padding:0;margin:0 0 30px;font-weight:400;color:#999}.modals .modals-outer .modals-inner .modal h3{align-self:stretch;margin:0;font-size:14px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;color:#fff;padding-bottom:10px;text-decoration:none}.modals .modals-outer .modals-inner .modal h3.divide{border-top:1px solid #222;margin-top:20px;padding-top:20px}table.panes{flex:1;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}table.panes tbody{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;margin:1px 1px 28px;background:#111;border-radius:4px;border:4px solid rgba(255,255,255,.05)}table.panes tbody:hover,table.panes tbody:hover tr.title-item{border-color:#027bff0d}table.panes tbody tr{flex:1;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;padding:8px 18px;background:#222}table.panes tbody tr:nth-child(odd){background-color:#111}table.panes tbody tr:nth-child(odd) td.description{color:#ffffffb3}table.panes tbody tr:nth-child(2n){background-color:#141414}table.panes tbody tr td{color:#888;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex:1;font-size:14px}table.panes tbody tr td.vertical{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}table.panes tbody tr td.description{align-self:stretch}table.panes tbody tr td.value{flex:0;margin-left:20px;word-break:break-all;flex-basis:auto}table.panes tbody tr td.value i.icon-legend{font-size:10px;margin-right:10px}table.panes tbody tr td.value i.icon-value{padding:2px 2px 1px;border-radius:2px;width:16px;text-align:center}table.panes tbody tr.title-item{border-bottom:1px solid #222}table.panes tbody tr.title-item td{color:#027bffe6;font-size:16px;font-weight:700}table.panes tbody tr.title-item td i{margin-right:10px}table.panes tbody tr.title-item td .more{flex:1;text-align:right;font-size:12px;color:#888;font-weight:400;font-style:italic}table.panes tbody tr.variable-item{cursor:pointer}table.panes tbody tr.variable-item:hover{background-color:#027bff0d}table.panes tbody tr.variable-item:hover td{font-weight:700;color:#fff}table.panes tbody tr.variable-item:hover td i.icon-legend{color:#fff}table.panes tbody tr.variable-item:hover td span,table.panes tbody tr.variable-item:hover td i.icon-value{background-color:#ffffff4d;color:#fff}table.panes tbody tr.variable-item:hover td.description{color:#027bff}.tiles{flex:1;display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;align-self:stretch}.tiles .tiles-inner{display:flex;flex:1;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:flex-start;align-self:stretch;padding:2px}.tiles .tiles-inner .tile-item{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;background:#222;align-self:stretch;color:#fff;margin:1px;padding:15px}.tiles .tiles-inner .tile-item:hover,.tiles .tiles-inner .tile-item.active{background:#111}.tiles .tiles-inner .tile-item:hover:hover,.tiles .tiles-inner .tile-item.active:hover{opacity:1}.tiles .tiles-inner .tile-item.disabled .tile-header .head-icon i{color:#222}.tiles .tiles-inner .tile-item .tile-header{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch}.tiles .tiles-inner .tile-item .tile-header .head-icon{flex:1}.tiles .tiles-inner .tile-item .tile-header .head-icon i{font-size:6px;color:#fff;opacity:.8;display:flex}.tiles .tiles-inner .tile-item .tile-header .status-icons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.tiles .tiles-inner .tile-item .tile-header .status-icons i{font-size:16px;margin-left:10px}.tiles .tiles-inner .tile-item .tile-body{flex:1;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;font-size:15px;font-weight:400;letter-spacing:.8px;line-height:22px;margin:0 0 0 10px;flex-wrap:nowrap}.tiles .tiles-inner .tile-item .tile-footer{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin:0}.tiles .tiles-inner .tile-item .tile-footer .foot-span{opacity:.8;font-size:13px;font-family:Courier New}span.empty{background:#e5a1234d;color:#e5a123;text-transform:lowercase;border-radius:2px;padding:2px 4px;font-weight:700}.inner-empty{display:flex;flex:1;align-self:stretch;justify-content:center;align-items:center}.inner-empty i{font-size:90px;opacity:.3;text-shadow:0 -1px #333,0 0px .5px #444}.toggle{position:relative;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.toggle input{display:none}.toggle input:checked+label{background:#065e26;border:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px #222 inset}.toggle input:checked+label:after{content:"";display:block;border-radius:50%;margin-left:21px;width:18px;height:18px;transition:.2s;background:#0eef5f;box-shadow:0 2px #032e12}.toggle label{width:44px;height:26px;border-radius:15px;background:#222;cursor:pointer;border:1px solid rgba(255,255,255,.1);box-shadow:0 2px 2px #111 inset}.toggle label:after{content:"";display:block;border-radius:50%;width:18px;height:18px;margin:3px;background:#777;box-shadow:0 2px #000000e6;transition:.2s}.form-holder{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;flex:1}.form-holder form{max-width:434px}form{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}form .alert{padding:8px 15px;font-size:14px;margin:0 0 25px}.form-group{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;width:100%;flex:1;margin-bottom:20px}.form-group label{flex:1;font-size:12px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;color:#666}.form-group label.btn-upload{color:#fff;font-size:14px;flex:0;flex-basis:auto;margin-top:5px}.form-group label.btn-upload input[type=file]{display:none}.form-group label.btn-upload input[type=text]{margin-bottom:2px;padding-left:0;margin-left:10px}.form-group label.btn-upload i{margin-left:3px;margin-right:10px}.form-group .widget{margin-top:10px;align-self:stretch;display:flex;flex-direction:row}.form-group .widget div{color:#ffffffb3;font-size:14px}.form-group .widget select,.form-group .widget input,.form-group .widget textarea{outline:none;padding:8px 0 5px 8px;border-radius:2px;border:1px solid rgba(255,255,255,.05);flex:1;background:#555;box-shadow:0 2px 1px #444,0 4px 2px #333 inset;color:#ddd;font-size:14px}.form-group .widget select[disabled],.form-group .widget input[disabled],.form-group .widget textarea[disabled]{color:#555;background:none;box-shadow:none;border:none;border-bottom:1px solid #333;border-radius:0}.form-group.tab-select{border-bottom:1px solid #444;display:flex;flex-direction:row;position:relative;height:48px;padding:48px 0 0;flex:0;flex-basis:auto}.form-group.tab-select .widget{height:49px;margin-top:0;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:absolute;top:0;left:0;border-bottom:2px solid rgb(2,123,255);color:#027bff}.form-group.tab-select .widget select{border:none;background:none;box-shadow:none;padding:10px 35px 10px 10px;margin:0;color:inherit;appearance:none;-moz-appearance:none;-webkit-appearance:none;text-align:left;font-weight:700;cursor:pointer;border-radius:4px 4px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px;z-index:2}.form-group.tab-select .widget i{margin-left:10px;margin-right:0}.form-group.tab-select .widget i.triangle{margin-top:-4px;margin-left:0;position:absolute;right:10px}.form-group.form-group-horizontal{margin:10px 0 20px;flex-direction:row;justify-content:flex-start;align-items:center}.form-group.form-group-horizontal .widget{margin:0;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.actions{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;align-self:stretch;margin:20px 0 0}.actions button{margin-left:25px}.actions.actions-left{justify-content:flex-start}.actions.actions-left button{margin-left:0;margin-right:25px}.actions.actions-center{justify-content:center}.actions.actions-center button{margin-left:0;margin-right:0}.view-content-list main .main-container .content-object-input{margin-bottom:6px}.view-content-edit main .main-container .bottom-content .page-content{flex:1}.view-content-edit main .main-container .bottom-content .page-content .form-holder{margin:20px 20px 20px 10px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel{flex:2;align-self:stretch;display:flex;flex-direction:column;overflow:hidden;justify-content:flex-start;align-items:center;padding:20px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel h3{color:#fff;padding:10px 10px 10px 0;margin-bottom:20px;font-size:16px;align-self:stretch;margin-left:-8px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel h3 span{border-width:1px;border-style:solid;border-radius:4px;padding:4px 10px;margin-left:5px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel h3 i{font-size:16px}.view-content-edit main .main-container .bottom-content .page-panel.right-panel .iframe-wrapper{display:flex;flex-direction:column;width:100%;position:relative;padding-top:56.25%;overflow:hidden;border-radius:4px;outline:4px solid rgba(255,255,255,.1)}.view-content-edit main .main-container .bottom-content .page-panel.right-panel .iframe-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.view-logs-list main .main-container .bottom-content .page-content .inner{padding-top:8px;padding-bottom:8px}.view-logs-list main .main-container .bottom-content .page-content .logs{flex:1;display:flex;flex-direction:column;align-self:stretch}.view-logs-list main .main-container .bottom-content .page-content .logs pre{flex:1;background:#000000e6;border:1px solid rgba(70,70,70,.5);border-radius:4px;font-family:monospace;color:#f2f2f2;padding:20px;overflow:auto;align-self:stretch}.view-node-player-edit main .main-container .bottom-content .page-content{flex:1}.view-node-player-edit main .main-container .bottom-content .page-content .form-holder{margin:20px 20px 20px 10px}.view-playlist-list main .main-container .modal-playlist-qrcode h2{text-align:center}.view-playlist-list main .main-container .modal-playlist-qrcode .qrcode-pic{text-align:center;display:flex;flex-direction:row;justify-content:center;align-items:center}.view-playlist-list main .main-container .modal-playlist-qrcode .qrcode-pic img{border:4px solid #555;border-radius:4px}.view-playlist-list main .main-container .bottom-content .page-content{flex:1}.view-playlist-list main .main-container .bottom-content .page-content.with-right-panel{flex:.5}.view-playlist-list main .main-container .bottom-content .page-content .inner{padding:0}.view-playlist-list main .main-container .bottom-content .page-content .inner h3{font-size:16px;font-weight:500;color:#ddd;text-decoration:none;margin:0 0 20px}.view-playlist-list main .main-container .bottom-content .page-content .inner .form-holder{margin:20px 10px 20px 20px;border-right:1px solid #222;padding-right:20px;flex:1.3}.view-playlist-list main .main-container .bottom-content .page-content .inner .form-holder form{max-width:initial}.view-playlist-list main .main-container .bottom-content .page-content .inner .form-holder .form-group{flex-grow:0}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder{margin:20px 20px 20px 10px;flex:1}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .form-group{flex-grow:0;margin-bottom:0}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .form-group .widget a,.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .form-group .widget .btn{margin-left:10px}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .form-group .widget input[type=text]{border:none;background:#000;border-radius:4px}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder h4{font-size:14px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;color:#fff;padding-bottom:10px;text-decoration:none}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder h4.divide{border-top:1px solid #222;margin-top:20px;padding-top:20px}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder p{font-size:12px;line-height:18px;display:flex;margin-bottom:5px;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;color:#666}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .qrcode-pic{margin-top:10px}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .qrcode-pic img{border:1px dashed #555;padding:5px;border-radius:4px}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .preview{background:#000;border:1px solid rgba(255,255,255,.3);border-radius:4px;justify-content:center;align-items:center;align-self:stretch;display:flex;margin:10px 0 20px;height:300px}.view-playlist-list main .main-container .bottom-content .page-content .inner .preview-holder .preview iframe{flex:1;align-self:stretch}.view-playlist-list main .main-container .bottom-content .page-content .inner .slides-holder{margin-top:40px;border-top:1px solid #222;align-self:stretch;padding-top:20px}.view-playlist-list main .main-container .bottom-content .page-panel.left-panel{flex:.3;max-width:initial;justify-content:center;align-items:center;display:flex}.view-plugins-list main .main-container .bottom-content .page-content .inner{padding:10px}.view-settings-list main .main-container .bottom-content .page-content .inner{padding:10px}.view-sysinfo-list main .main-container .bottom-content .page-content .inner{padding:10px} diff --git a/data/www/img/logo3.png b/data/www/img/logo3.png new file mode 100644 index 0000000..cf6a9f4 Binary files /dev/null and b/data/www/img/logo3.png differ diff --git a/data/www/js/explorer.js b/data/www/js/explorer.js index 33f19a6..9ac40fa 100644 --- a/data/www/js/explorer.js +++ b/data/www/js/explorer.js @@ -105,7 +105,7 @@ jQuery(function ($) { route = $(this).attr('data-entity-route') + '?id=' + $item.attr('data-id'); } - if (confirm(l.common_are_you_sure)) { + if (confirm(l.js_common_are_you_sure)) { document.location.href = route; } }); @@ -134,7 +134,13 @@ jQuery(function ($) { selectEpxlrLink(verticalNeighbors.above.find('.explr-link')); } else if (e.key === "ArrowDown" && verticalNeighbors.below) { selectEpxlrLink(verticalNeighbors.below.find('.explr-link')); + } else if (e.key === "Backspace") { + if ($('.explr-item-delete:visible').length) { + $('.explr-item-delete:visible').click(); + } } + } else if (e.key.indexOf('Arrow') === 0) { + selectEpxlrLink($('.explr-dirview li:visible:eq(0)').find('.explr-link')); } }); diff --git a/data/www/js/global.js b/data/www/js/global.js index 0bb27b9..18832d2 100644 --- a/data/www/js/global.js +++ b/data/www/js/global.js @@ -18,7 +18,7 @@ const hideDropdowns = function () { const explrSidebarOpenFromFolder = function (folderId) { const $leaf = $('.li-explr-folder-' + folderId); let $parent = $leaf; - while($parent.length > 0) { + while ($parent.length > 0) { const $toggler = $parent.find('.explr-toggler:eq(0)'); if ($toggler.hasClass('explr-plus')) { $parent.find('.explr-toggler:eq(0)').trigger('click'); @@ -112,7 +112,7 @@ jQuery(document).ready(function ($) { $('#entity-utrack-updated-at').val(prettyTimestamp(entity.updated_at * 1000)); }); - setTimeout(function() { + setTimeout(function () { $('.alert-timeout').remove(); }, 3000); @@ -122,5 +122,17 @@ jQuery(document).ready(function ($) { $firstInputText.focus(); } } + + $(document).on('click', '.copy-link', function (e) { + e.preventDefault(); + const $input = $('#' + $(this).attr('data-target-id')); + $input.select(); + $input[0].setSelectionRange(0, 99999); + document.execCommand("copy"); + + if (navigator.clipboard) { + navigator.clipboard.writeText($input.val()); + } + }); }); diff --git a/data/www/js/lib/jquery-explr-1.4.js b/data/www/js/lib/jquery-explr-1.4.js index b9efeef..5e7cbbe 100755 --- a/data/www/js/lib/jquery-explr-1.4.js +++ b/data/www/js/lib/jquery-explr-1.4.js @@ -159,10 +159,8 @@ .find('ul') // hide every ul .hide() .end() - .find('.explr-expand') // unless explicitly set to expand - .show() - .siblings('.explr-toggler') - .addClass('explr-minus '+opts.classesMinus); + .find('.explr-toggler') + .addClass('explr-plus '+opts.classesPlus); } else { $tree .find('.explr-collapse') // hide every element set to collapse diff --git a/data/www/js/lib/qrcode.min.js b/data/www/js/lib/qrcode.min.js new file mode 100644 index 0000000..993e88f --- /dev/null +++ b/data/www/js/lib/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/data/www/js/playlist/playlists.js b/data/www/js/playlist/playlists.js index 46ce2b1..0731403 100644 --- a/data/www/js/playlist/playlists.js +++ b/data/www/js/playlist/playlists.js @@ -1,76 +1,24 @@ jQuery(document).ready(function ($) { - const $tableActive = $('table.active-playlists'); - const $tableInactive = $('table.inactive-playlists'); - - const getId = function ($el) { - return $el.is('tr') ? $el.attr('data-level') : $el.parents('tr:eq(0)').attr('data-level'); - }; - - const updateTable = function () { - $('table').each(function () { - if ($(this).find('tbody tr.playlist-item:visible').length === 0) { - $(this).find('tr.empty-tr').removeClass('hidden'); - } else { - $(this).find('tr.empty-tr').addClass('hidden'); - } - }); - }; const main = function () { + const qrcodeElement = document.getElementById('qrcode'); - }; - - $(document).on('change', 'input[type=checkbox]', function () { - $.ajax({ - url: '/playlist/toggle', - headers: {'Content-Type': 'application/json'}, - data: JSON.stringify({id: getId($(this)), enabled: $(this).is(':checked')}), - method: 'POST', - }); - - const $tr = $(this).parents('tr:eq(0)').remove().clone(); - - if ($(this).is(':checked')) { - $tableActive.append($tr); - } else { - $tableInactive.append($tr); + if (qrcodeElement) { + new QRCode(qrcodeElement, { + text: qrcodeElement.attributes['data-qrcode-payload'].value, + width: 128, + height: 128, + colorDark: '#222', + colorLight: '#fff', + correctLevel: QRCode.CorrectLevel.H + }); } - - updateTable(); - }); + }; $(document).on('click', '.playlist-add', function () { showModal('modal-playlist-add'); $('.modal-playlist-add input:eq(0)').focus().select(); }); - $(document).on('click', '.playlist-edit', function () { - const playlist = JSON.parse($(this).parents('tr:eq(0)').attr('data-entity')); - showModal('modal-playlist-edit'); - $('.modal-playlist-edit input:visible:eq(0)').focus().select(); - $('#playlist-edit-name').val(playlist.name); - $('#playlist-edit-time-sync').val(playlist.time_sync ? '1' : '0'); - $('#playlist-edit-id').val(playlist.id); - }); - - $(document).on('click', '.playlist-delete', function () { - if (confirm(l.js_playlist_delete_confirmation)) { - const $tr = $(this).parents('tr:eq(0)'); - $.ajax({ - method: 'DELETE', - url: '/playlist/delete', - headers: {'Content-Type': 'application/json'}, - data: JSON.stringify({id: getId($(this))}), - success: function(data) { - $tr.remove(); - updateTable(); - }, - error: function(data) { - $('.alert-error').html(data.responseJSON.message).removeClass('hidden'); - } - }); - } - }); - main(); }); diff --git a/data/www/scss/base/_context.scss b/data/www/scss/base/_context.scss index 9da8dee..066c052 100644 --- a/data/www/scss/base/_context.scss +++ b/data/www/scss/base/_context.scss @@ -36,7 +36,7 @@ main { margin-right: 20px; .trigger { - color: white; + color: $white; .avatar { width: 32px; diff --git a/data/www/scss/base/_html.scss b/data/www/scss/base/_html.scss index 8622cec..a130fdd 100644 --- a/data/www/scss/base/_html.scss +++ b/data/www/scss/base/_html.scss @@ -28,6 +28,15 @@ body, html { align-self: stretch; } +.vertical { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + flex: 1; + align-self: stretch; +} + main { flex: 1; display: flex; @@ -51,7 +60,7 @@ main { border-bottom: $layoutBorder; h1 { - color: white; + color: $white; font-weight: 600; font-size: 24px; } @@ -63,16 +72,13 @@ main { justify-content: flex-end; align-items: center; + .btn, button { margin-left: 10px; } } } - .alert { - - } - .bottom-content { display: flex; flex-direction: row; diff --git a/data/www/scss/base/_menu.scss b/data/www/scss/base/_menu.scss index deb6c70..46d5750 100644 --- a/data/www/scss/base/_menu.scss +++ b/data/www/scss/base/_menu.scss @@ -103,7 +103,7 @@ menu { padding-left: 10px; i { - color: white; + color: $white; opacity: .2; background: transparent; display: flex; @@ -119,7 +119,7 @@ menu { } &:after { - background: white; + background: $white; content: ""; height: 195px; left: -200px; @@ -156,11 +156,11 @@ menu { } a { - color: white; + color: $white; font-weight: bold; i { - color: white; + color: $white; opacity: 1; } } diff --git a/data/www/scss/components/_alerts.scss b/data/www/scss/components/_alerts.scss index 884a350..2af861e 100644 --- a/data/www/scss/components/_alerts.scss +++ b/data/www/scss/components/_alerts.scss @@ -1,29 +1,36 @@ .alert { - padding: 20px 20px; - align-self: stretch; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - border-radius: 4px; + padding: 20px 20px; + align-self: stretch; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + border-radius: 4px; + + a { + color: inherit; + margin-left: 4px; + margin-right: 4px; + text-decoration: underline; + } } .alert-info { - color: $info; - background: rgba($info, .2); + color: $info; + background: rgba($info, .2); } .alert-success { - color: $success; - background: rgba($success, .2); + color: $success; + background: rgba($success, .2); } .alert-danger, .alert-error { - color: $danger; - background: rgba($danger, .2); + color: $danger; + background: rgba($danger, .2); } .alert i { - margin-right: 13px; + margin-right: 13px; } \ No newline at end of file diff --git a/data/www/scss/components/_breadcrumb.scss b/data/www/scss/components/_breadcrumb.scss index 6f618b3..1091983 100644 --- a/data/www/scss/components/_breadcrumb.scss +++ b/data/www/scss/components/_breadcrumb.scss @@ -38,7 +38,7 @@ flex-direction: row; justify-content: center; align-items: center; - color: white; + color: $white; text-align: center; padding: 0 3px; diff --git a/data/www/scss/components/_buttons.scss b/data/www/scss/components/_buttons.scss index 8631077..b304d4f 100644 --- a/data/www/scss/components/_buttons.scss +++ b/data/www/scss/components/_buttons.scss @@ -4,7 +4,7 @@ button, $shadowOffset: 2px; position: relative; - padding: 10px 13px 8px 10px; + padding: 10px 10px 8px 10px; font-size: 14px; color: #fff; cursor: pointer; @@ -35,15 +35,48 @@ button, color: #AAA; background: $neutralGrey; box-shadow: 0 $shadowOffset 0 0 darken($neutralGrey, 10%); - &:hover { box-shadow: 0 $shadowOffset 0 1px #222 inset; background: darken($neutralGrey, 10%); } - &:focus { background: darken($neutralGrey, 20%); } + + &:hover { + box-shadow: 0 $shadowOffset 0 1px #222 inset; + background: darken($neutralGrey, 10%); + } + + &:focus { + background: darken($neutralGrey, 20%); + } + } + + .btn-wire-neutral { + background: transparent; + border: 2px solid $neutralGrey; + color: rgba($white, .8); + box-shadow: none; + + &:hover { + background: rgba($neutralGrey, 0.05); + border-color: darken($neutralGrey, 10%); + color: darken($neutralGrey, 10%); + box-shadow: none; + } + + &:focus { + border-color: darken($neutralGrey, 20%); + background: transparent; + } } &.btn-naked { background: transparent; box-shadow: none; - &:hover { box-shadow: 0 $shadowOffset 0 1px #222 inset; background: darken($neutralGrey, 10%); } - &:focus { background: darken($neutralGrey, 20%); } + + &:hover { + box-shadow: 0 $shadowOffset 0 1px #222 inset; + background: darken($neutralGrey, 10%); + } + + &:focus { + background: darken($neutralGrey, 20%); + } } } diff --git a/data/www/scss/components/_dropdown.scss b/data/www/scss/components/_dropdown.scss index 6338e89..440c5b0 100644 --- a/data/www/scss/components/_dropdown.scss +++ b/data/www/scss/components/_dropdown.scss @@ -52,7 +52,7 @@ a { padding: 8px 16px 8px 8px; - color: white; + color: $white; display: flex; flex-direction: row; justify-content: flex-start; diff --git a/data/www/scss/components/_empty.scss b/data/www/scss/components/_empty.scss index d6567e5..01aac60 100644 --- a/data/www/scss/components/_empty.scss +++ b/data/www/scss/components/_empty.scss @@ -6,4 +6,19 @@ span.empty { border-radius: 2px; padding: 2px 4px; font-weight: bold; +} + + +.inner-empty { + display: flex; + flex: 1; + align-self: stretch; + justify-content: center; + align-items: center; + + i { + font-size: 90px; + opacity: 0.3; + text-shadow: 0 -1px #333, 0 0px .5px #444; + } } \ No newline at end of file diff --git a/data/www/scss/components/_explorer.scss b/data/www/scss/components/_explorer.scss index 631773b..1cfd8db 100644 --- a/data/www/scss/components/_explorer.scss +++ b/data/www/scss/components/_explorer.scss @@ -19,11 +19,11 @@ ul.explr-tree { } a { - color: white; + color: $white; padding-right: 80px; &:hover { - color: white; + color: $white; } &.active { diff --git a/data/www/scss/components/_modals.scss b/data/www/scss/components/_modals.scss index ecc59b1..6f15e63 100644 --- a/data/www/scss/components/_modals.scss +++ b/data/www/scss/components/_modals.scss @@ -22,7 +22,7 @@ background: $layoutBackground; border-radius: 10px; color: lighten($black, 20%); - padding: 40px; + padding: 40px; box-shadow: 0 2px #222; border: 1px solid #222; @@ -30,15 +30,27 @@ h2 { padding: 0; margin: 0 0 30px 0; - font-weight: normal; - color: #999; + font-weight: normal; + color: #999; } h3 { align-self: stretch; - border-bottom: 1px solid $lightGrey; - padding: 15px 15px; margin: 0; + font-size: 14px; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + color: white; + padding-bottom: 10px; + text-decoration: none; + + &.divide { + border-top: 1px solid #222; + margin-top: 20px; + padding-top: 20px; + } } } } diff --git a/data/www/scss/components/_panes.scss b/data/www/scss/components/_panes.scss index 55e69ca..4b4b539 100644 --- a/data/www/scss/components/_panes.scss +++ b/data/www/scss/components/_panes.scss @@ -118,16 +118,16 @@ table.panes { td { font-weight: bold; - color: white; + color: $white; i.icon-legend { - color: white; + color: $white; } span, i.icon-value { background-color: rgba($white, .3); - color: white; + color: $white; } &.description { diff --git a/data/www/scss/components/_pills.scss b/data/www/scss/components/_pills.scss index 27caba3..912594b 100644 --- a/data/www/scss/components/_pills.scss +++ b/data/www/scss/components/_pills.scss @@ -31,7 +31,7 @@ ul.pills { flex-direction: row; justify-content: center; align-items: center; - color: white; + color: $white; overflow: hidden; padding-right: 30px; text-align: center; diff --git a/data/www/scss/components/_switches.scss b/data/www/scss/components/_switches.scss index 997b3c8..f5fff41 100644 --- a/data/www/scss/components/_switches.scss +++ b/data/www/scss/components/_switches.scss @@ -1,116 +1,66 @@ -.pure-material-switch { - z-index: 0; - position: relative; - display: inline-block; -} +$toggleActiveColor: $limeGreen; +$containerWidth: 42px; +$containerHeight: 26px; +$containerRadius: 15px; +$containerShadowActive: 0 2px 2px #222 inset; +$containerShadowInactive: 0 2px 2px #111 inset; +$backgroundColorInactive: #222; +$backgroundColorActive: darken($toggleActiveColor, 30%); +$thumbColorActive: $toggleActiveColor; +$thumbColorInactive: #777; +$thumbWidth: 18px; +$thumbHeight: $thumbWidth; +$borderSize: 1px; +$animationSpeed: 0.2s; -.pure-material-switch > input { - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - z-index: -1; - position: absolute; - right: 6px; - top: -8px; - display: block; - margin: 0; - border-radius: 50%; - width: 40px; - height: 40px; - background-color: rgba($black, 0.38); - outline: none; - opacity: 0; - transform: scale(1); - pointer-events: none; - transition: opacity 0.3s 0.1s, transform 0.2s 0.1s; -} +.toggle { + position: relative; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; -.pure-material-switch > span { - display: inline-block; - width: 100%; - cursor: pointer; -} + input { + display: none; -.pure-material-switch > span::before { - content: ""; - float: right; - display: inline-block; - margin: 5px 0 5px 10px; - border-radius: 7px; - width: 36px; - height: 14px; - background-color: rgba($black, 0.38); - vertical-align: top; - transition: background-color 0.2s, opacity 0.2s; -} + &:checked + label { + background: darken($thumbColorActive, 30%); + border: $borderSize solid rgba($white, .1); + box-shadow: $containerShadowActive; -.pure-material-switch > span::after { - content: ""; - position: absolute; - top: 2px; - right: 16px; - border-radius: 50%; - width: 20px; - height: 20px; - background-color: $white; - box-shadow: 0 3px 1px -2px rgba($black, 0.2), 0 2px 2px 0 rgba($black, 0.14), 0 1px 5px 0 rgba($black, 0.12); - transition: background-color 0.2s, transform 0.2s; -} + &::after { + content: ""; + display: block; + border-radius: 50%; + margin-left: calc($containerWidth - 21px); + width: $thumbWidth; + height: $thumbHeight; + transition: $animationSpeed; + background: $thumbColorActive; + box-shadow: 0 2px darken($thumbColorActive, 40%); + } + } + } -.pure-material-switch > input:checked { - right: -10px; - background-color: $limeGreen; -} + label { + width: $containerWidth + ($borderSize * 2); + height: $containerHeight; + border-radius: $containerRadius; + background: $backgroundColorInactive; + cursor: pointer; + border: $borderSize solid rgba($white, .1); + box-shadow: $containerShadowInactive; -.pure-material-switch > input:checked + span::before { - background-color: rgba($limeGreen, 0.6); -} - -.pure-material-switch > input:checked + span::after { - background-color: $limeGreen; - transform: translateX(16px); -} - -.pure-material-switch:hover > input { - opacity: 0.04; -} - -.pure-material-switch > input:focus { - opacity: 0.12; -} - -.pure-material-switch:hover > input:focus { - opacity: 0.16; -} - -.pure-material-switch > input:active { - opacity: 1; - transform: scale(0); - transition: transform 0s, opacity 0s; -} - -.pure-material-switch > input:active + span::before { - background-color: rgba($limeGreen, 0.6); -} - -.pure-material-switch > input:checked:active + span::before { - background-color: rgba($black, 0.38); -} - -.pure-material-switch > input:disabled { - opacity: 0; -} - -.pure-material-switch > input:disabled + span { - color: $black; - opacity: 0.38; - cursor: default; -} - -.pure-material-switch > input:disabled + span::before { - background-color: rgba($black, 0.38); -} - -.pure-material-switch > input:checked:disabled + span::before { - background-color: rgba($limeGreen, 0.6); + &::after { + content: ""; + display: block; + border-radius: 50%; + width: $thumbWidth; + height: $thumbHeight; + margin: 3px; + background: $thumbColorInactive; + box-shadow: 0 2px rgba(0,0,0,0.9); + transition: $animationSpeed; + } + } } diff --git a/data/www/scss/components/_tiles.scss b/data/www/scss/components/_tiles.scss new file mode 100644 index 0000000..4b69247 --- /dev/null +++ b/data/www/scss/components/_tiles.scss @@ -0,0 +1,117 @@ +.tiles { + flex: 1; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + align-self: stretch; + + .tiles-inner { + display: flex; + flex: 1; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: flex-start; + align-self: stretch; + padding: 2px; + + .tiles-empty { + + } + + .tile-item { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + background: #222; + align-self: stretch; + color: $white; + margin: 1px; + padding: 15px; + + &:hover, + &.active { + background: #111; + + &:hover { + opacity: 1; + } + } + + + &.disabled { + + .tile-header { + .head-icon { + i { + color: #222; + } + } + } + } + + .tile-header { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + align-self: stretch; + + + .head-icon { + flex: 1; + + i { + font-size: 6px; + color: white; + opacity: .8; + display: flex; + } + } + + .status-icons { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + + i { + font-size: 16px; + margin-left: 10px; + } + } + } + + .tile-body { + flex: 1; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + font-size: 15px; + font-weight: normal; + letter-spacing: 0.8px; + line-height: 22px; + margin: 0 0 0 10px; + flex-wrap: nowrap; + } + + .tile-footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + margin: 0; + + .foot-span { + opacity: .8; + font-size: 13px; + font-family: "Courier New"; + } + } + + } + } +} \ No newline at end of file diff --git a/data/www/scss/forms/_forms.scss b/data/www/scss/forms/_forms.scss index 921201b..de8a5c2 100644 --- a/data/www/scss/forms/_forms.scss +++ b/data/www/scss/forms/_forms.scss @@ -1,10 +1,10 @@ .form-holder { - min-width: 686px; display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; align-self: stretch; + flex: 1; form { max-width: 434px; @@ -24,172 +24,196 @@ form { font-size: 14px; margin: 0 0 25px 0; } +} - .form-group { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - align-self: stretch; - width: 100%; +.form-group { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + align-self: stretch; + width: 100%; + flex: 1; + margin-bottom: 20px; + + + label { flex: 1; - margin-bottom: 20px; + font-size: 12px; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + align-self: stretch; + color: #666666; + + &.btn-upload { + color: $white; + font-size: 14px; + flex: 0; + flex-basis: auto; + margin-top: 5px; + + input[type=file] { + display: none; + } + + input[type=text] { + margin-bottom: 2px; + padding-left: 0; + margin-left: 10px; + } + + i { + margin-left: 3px; + margin-right: 10px; + } + } + } + + .widget { + margin-top: 10px; + align-self: stretch; + display: flex; + flex-direction: row; - label { + div { + color: rgba($white, .7); + font-size: 14px; + } + + select, + input, + textarea { + outline: none; + padding: 8px 0 5px 8px; + border-radius: 2px; + border: 1px solid rgba($white, .05); flex: 1; - font-size: 12px; + background: #555; + box-shadow: 0 2px 1px #444, 0 4px 2px #333 inset; + color: #DDD; + font-size: 14px; + + &[disabled] { + color: #555; + background: none; + box-shadow: none; + border: none; + border-bottom: 1px solid #333; + border-radius: 0; + } + } + + + } + + + &.tab-select { + border-bottom: 1px solid #444; + display: flex; + flex-direction: row; + position: relative; + height: 48px; + padding: 48px 0 0 0; + flex: 0; + flex-basis: auto; + + .widget { + height: 49px; + margin-top: 0; display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - align-self: stretch; - color: #666666; + position: absolute; + top: 0; + left: 0; + border-bottom: 2px solid $seaBlue; + color: $seaBlue; - &.btn-upload { - color: white; - font-size: 14px; - flex: 0; - flex-basis: auto; - margin-top: 5px; - - input[type=file] { - display: none; - } - - input[type=text] { - margin-bottom: 2px; - padding-left: 0; - margin-left: 10px; - } - - i { - margin-left: 3px; - margin-right: 10px; - } - } - } - - .widget { - margin-top: 10px; - align-self: stretch; - display: flex; - flex-direction: row; - - - div { - color: rgba($white, .7); - font-size: 14px; + select { + border: none; + background: none; + box-shadow: none; + padding: 10px 35px 10px 10px; + margin: 0; + color: inherit; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + text-align: left; + font-weight: bold; + cursor: pointer; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 200px; + z-index: 2; } - select, - input, - textarea { - outline: none; - padding: 8px 0 5px 8px; - border-radius: 2px; - border: 1px solid rgba($white, .05); - flex: 1; - background: #555; - box-shadow: 0 2px 1px #444, 0 4px 2px #333 inset; - color: #DDD; - font-size: 14px; + i { + margin-left: 10px; + margin-right: 0; - &[disabled] { - color: #555; - background: none; - box-shadow: none; - border: none; - border-bottom: 1px solid #333; - border-radius: 0; - } - } - - - } - - - &.tab-select { - border-bottom: 1px solid #444; - display: flex; - flex-direction: row; - position: relative; - height: 48px; - padding: 48px 0 0 0; - flex: 0; - flex-basis: auto; - - .widget { - height: 49px; - margin-top: 0; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - position: absolute; - top: 0; - left: 0; - border-bottom: 2px solid $seaBlue; - color: $seaBlue; - - select { - border: none; - background: none; - box-shadow: none; - padding: 10px 35px 10px 10px; - margin: 0; - color: inherit; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - text-align: left; - font-weight: bold; - cursor: pointer; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 200px; - z-index: 2; - } - - i { - margin-left: 10px; - margin-right: 0; - - &.triangle { - margin-top: -4px; - margin-left: 0; - position: absolute; - right: 10px; - } + &.triangle { + margin-top: -4px; + margin-left: 0; + position: absolute; + right: 10px; } } } } - .actions { - display: flex; + &.form-group-horizontal { + margin: 10px 0 20px 0; flex-direction: row; - justify-content: flex-end; + justify-content: flex-start; align-items: center; - align-self: stretch; - margin: 20px 0 0 0; - button { - margin-left: 25px; - } - - &.actions-left { + .widget { + margin: 0; + display: flex; + flex-direction: row; justify-content: flex-start; - - button { - margin-left: 0; - margin-right: 25px; - } + align-items: center; + } + } +} + +.actions { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + align-self: stretch; + margin: 20px 0 0 0; + + button { + margin-left: 25px; + } + + &.actions-left { + justify-content: flex-start; + + button { + margin-left: 0; + margin-right: 25px; + } + } + + &.actions-center { + justify-content: center; + + button { + margin-left: 0; + margin-right: 0; } } } diff --git a/data/www/scss/layout/_header.scss b/data/www/scss/layout/_header.scss index 531a807..9adb183 100644 --- a/data/www/scss/layout/_header.scss +++ b/data/www/scss/layout/_header.scss @@ -84,5 +84,5 @@ header nav ul li a { header nav ul li a:hover, header nav ul li.active a { - color: white; + color: $white; } diff --git a/data/www/scss/main.scss b/data/www/scss/main.scss index 8ad429e..bf622e6 100644 --- a/data/www/scss/main.scss +++ b/data/www/scss/main.scss @@ -23,8 +23,9 @@ // Legacy @import 'components/panes'; +@import 'components/tiles'; @import 'components/empty'; -//@import 'components/switches'; +@import 'components/switches'; //@import 'components/cards'; //@import 'components/badges'; diff --git a/data/www/scss/pages/_content.scss b/data/www/scss/pages/_content.scss index 892e8c2..86b81d9 100644 --- a/data/www/scss/pages/_content.scss +++ b/data/www/scss/pages/_content.scss @@ -19,7 +19,7 @@ } .page-panel.right-panel { - flex: 1; + flex: 2; align-self: stretch; display: flex; flex-direction: column; @@ -29,7 +29,7 @@ padding: 20px; h3 { - color: white; + color: $white; padding: 10px 10px 10px 0; margin-bottom: 20px; font-size: 16px; diff --git a/data/www/scss/pages/_playlist.scss b/data/www/scss/pages/_playlist.scss index e04a48c..590529b 100644 --- a/data/www/scss/pages/_playlist.scss +++ b/data/www/scss/pages/_playlist.scss @@ -1,28 +1,155 @@ - .view-playlist-list main .main-container { + .modal-playlist-qrcode { + h2 { + text-align: center; + } + .qrcode-pic { + text-align: center; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; -} + img { + border: 4px solid #555; + border-radius: $baseRadius; + } + } -.view-playlist-edit main .main-container { + } .bottom-content { .page-content { flex: 1; - .form-holder { - margin: 20px 20px 20px 10px; + &.with-right-panel { + flex: 0.5; + } + + .inner { + padding: 0; + + h3 { + font-size: 16px; + font-weight: 500; + color: #DDD; + text-decoration: none; + margin: 0 0 20px 0; + } + + .form-holder { + margin: 20px 10px 20px 20px; + border-right: 1px solid #222; + padding-right: 20px; + flex: 1.3; + + form { + max-width: initial; + } + + .form-group { + flex-grow: 0; + } + } + + .preview-holder { + margin: 20px 20px 20px 10px; + flex: 1; + + .form-group { + flex-grow: 0; + margin-bottom: 0; + + .widget { + a, + .btn { + margin-left: 10px; + } + + input[type=text] { + border: none; + background: #000; + border-radius: $baseRadius; + } + } + } + + h4 { + font-size: 14px; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + align-self: stretch; + color: white; + padding-bottom: 10px; + text-decoration: none; + + &.divide { + border-top: 1px solid #222; + margin-top: 20px; + padding-top: 20px; + } + } + + p { + font-size: 12px; + line-height: 18px; + display: flex; + margin-bottom: 5px; + flex-direction: row; + justify-content: flex-start; + align-items: center; + align-self: stretch; + color: #666666; + } + + .qrcode-pic { + margin-top: 10px; + img { + border: 1px dashed #555; + padding: 5px; + border-radius: $baseRadius; + } + } + + .preview { + background: black; + border: 1px solid rgba($white, .3); + border-radius: $baseRadius; + justify-content: center; + align-items: center; + align-self: stretch; + display: flex; + margin: 10px 0 20px 0; + height: 300px; + + iframe { + flex: 1; + align-self: stretch; + } + } + } + + .slides-holder { + margin-top: 40px; + border-top: 1px solid #222; + align-self: stretch; + padding-top: 20px; + } } } - .page-panel.right-panel { - + .page-panel.left-panel { + flex: 0.3; + max-width: initial; + justify-content: center; + align-items: center; + display: flex; } } } - - - diff --git a/data/www/scss/utils/_mixins.scss b/data/www/scss/utils/_mixins.scss index 45171d6..35d4015 100644 --- a/data/www/scss/utils/_mixins.scss +++ b/data/www/scss/utils/_mixins.scss @@ -58,6 +58,29 @@ background: darken($color, 20%); } } + + &.btn-wire-#{"#{$name}"} { + background: transparent; + box-shadow: none; + border: 2px solid $color; + color: rgba($white, .8); + + i.btn-match { + color: $color; + } + + &:hover { + background: rgba($color, 0.05); + border-color: darken($color, 10%); + color: darken($color, 10%); + box-shadow: none; + } + + &:focus { + border-color: darken($color, 20%); + background: transparent; + } + } } } } \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index 74362d4..6f7dcfc 100644 --- a/lang/en.json +++ b/lang/en.json @@ -68,8 +68,12 @@ "js_slideshow_content_delete_confirmation": "Are you sure?", "playlist_page_title": "Playlists", - "playlist_button_add": "Add a playlist", - "playlist_panel_active": "Active playlists", + "playlist_button_add": "Add Playlist", + "playlist_button_delete": "Delete Playlist", + "playlist_panel_about_playlist": "About playlist", + "playlist_panel_content_management": "Content management", + "playlist_panel_preview": "Playlist preview", + "playlist_panel_preview_action": "Preview", "playlist_panel_inactive": "Inactive playlists", "playlist_panel_empty": "Currently, there are no playlists. %link% now.", "playlist_panel_th_name": "Name", @@ -78,10 +82,12 @@ "playlist_panel_th_activity": "Options", "playlist_form_add_title": "Add Playlist", "playlist_form_add_submit": "Add", - "playlist_form_edit_title": "Edit Playlist", - "playlist_form_edit_submit": "Save", + "playlist_form_preview_url_desc": "You can use this link to play this playlist on any browser you want. Use copy button to get that in your clipboard.", + "playlist_form_preview_qrcode_desc": "You can easily access your playlist using a tablet or phone. Just scan the QR code to begin.", + "playlist_form_preview_iframe_desc": "You can view the playlist without leaving this screen by starting the preview from here.", "playlist_form_label_name": "Enter playlist name", "playlist_form_label_time_sync": "Sync slides across players", + "playlist_form_label_enabled": "Enable/Disable playlist", "playlist_form_button_cancel": "Cancel", "js_playlist_delete_confirmation": "Are you sure?", "playlist_delete_has_slides": "Playlist has slides, please remove them before and retry", @@ -165,7 +171,7 @@ "settings_variable_desc_edition_auth_enabled": "Default user credentials will be admin/admin", "settings_variable_desc_external_url": "External url (i.e: https://studio-01.company.com or http://10.10.3.100)", "settings_variable_desc_slide_upload_limit": "Slide upload limit (in megabytes)", - "settings_variable_desc_default_slide_duration": "Introduction slide duration (in seconds)", + "settings_variable_desc_intro_slide_duration": "Introduction slide duration (in seconds)", "settings_variable_desc_default_slide_time_with_seconds": "Show the seconds on the clock in the introduction slide", "settings_variable_desc_polling_interval": "Refresh interval applied for settings to the player (in seconds)", "settings_variable_desc_playlist_default_time_sync": "Sync slides across players for default playlist", @@ -175,6 +181,7 @@ "settings_variable_desc_slide_animation_exit_effect": "Slide animation exit effect (generally better off without it)", "settings_variable_desc_slide_animation_speed": "Slide animation speed", + "settings_variable_desc_ro_start_counter": "Start counter", "settings_variable_desc_ro_last_folder_content": "Current folder in content explorer", "settings_variable_desc_ro_last_folder_node_player": "Current folder in player explorer", "settings_variable_desc_ro_editable": "Last application reboot datetime", @@ -214,6 +221,7 @@ "basic_month_11": "November", "basic_month_12": "December", + "common_untitled": "", "common_loading": "Loading...", "common_default_node_player_group": "Default Playgroup", "common_default_playlist": "Default Playlist", diff --git a/lang/es.json b/lang/es.json index abaddf3..52697f4 100644 --- a/lang/es.json +++ b/lang/es.json @@ -1,294 +1,287 @@ { - "dynmenu_content": "Contenido", - - "slideshow_slide_page_title": "Descripción General del Programa", - "slideshow_slide_goto_player": "Ir al reproductor", - "slideshow_slide_refresh_player": "Actualizar reproductor", - "slideshow_slide_refresh_player_success": "La señal de actualización del reproductor ha sido enviada, debería suceder pronto (%time% segundos máximo)", - "slideshow_slide_button_add": "Agregar una diapositiva", - "slideshow_slide_panel_active": "Diapositivas activas", - "slideshow_slide_panel_inactive": "Diapositivas inactivas", - "slideshow_slide_panel_empty": "Actualmente, no hay diapositivas. %link% ahora.", - "slideshow_slide_panel_th_content": "Contenido", - "slideshow_slide_panel_th_duration": "Termina después", - "slideshow_slide_panel_th_duration_unit": "seg", - "slideshow_slide_panel_th_enabled": "Habilitado", - "slideshow_slide_panel_th_cron_scheduled": "Inicio Programado", - "slideshow_slide_panel_th_activity": "Opciones", - "slideshow_slide_panel_td_cron_scheduled_loop": "Bucle", - "slideshow_slide_panel_td_cron_scheduled_notify": "Notificar", - "slideshow_slide_panel_td_cron_scheduled_bad_cron": "Valor de cron incorrecto", - "slideshow_slide_form_add_title": "Agregar Diapositiva", - "slideshow_slide_form_add_submit": "Agregar", - "slideshow_slide_form_edit_title": "Editar Diapositiva", - "slideshow_slide_form_edit_submit": "Guardar", - "slideshow_slide_form_section_content": "Medios", - "slideshow_slide_form_section_scheduling": "Programación", - "slideshow_slide_form_label_name": "Nombre", - "slideshow_slide_form_label_add_content": "Agregar a la biblioteca", - "slideshow_slide_form_label_from_library": "Dalla biblioteca", - "slideshow_slide_form_label_content_id": "Contenido", - "slideshow_slide_form_label_location": "Ubicación", - "slideshow_slide_form_label_type": "Tipo", - "slideshow_slide_form_label_object": "Objeto", - "slideshow_slide_form_label_duration": "Duración", - "slideshow_slide_form_label_duration_unit": "segundos", - "slideshow_slide_form_label_is_notification": "Actuar como notificación", - "slideshow_slide_form_label_cron_scheduled": "Inicio", - "slideshow_slide_form_label_cron_scheduled_end": "Fin", - "slideshow_slide_form_label_cron_scheduled_loop": "Siempre en bucle", - "slideshow_slide_form_label_cron_scheduled_duration": "Duración", - "slideshow_slide_form_label_cron_scheduled_stayloop": "Seguir el bucle", - "slideshow_slide_form_label_cron_scheduled_duration_unit": "segundos", - "slideshow_slide_form_label_cron_scheduled_datetime": "Fecha y Hora", - "slideshow_slide_form_label_cron_scheduled_datetime_placeholder": "Establecer una fecha y hora", - "slideshow_slide_form_label_cron_scheduled_cron": "Cron", - "slideshow_slide_form_widget_cron_scheduled_placeholder": "Usar formato crontab: * * * * *", - "slideshow_slide_form_button_cancel": "Cancelar", - "js_slideshow_slide_delete_confirmation": "¿Estás seguro?", - - "slideshow_content_page_title": "Biblioteca de contenidos", - "slideshow_content_button_add": "Nuevo Contenido", - "slideshow_content_referenced_in_slide_error": "Se hace referencia al contenido en una diapositiva; elimine la diapositiva primero", - "slideshow_content_panel_active": "Contenido", - "slideshow_content_panel_empty": "Actualmente, no hay contenido. %link% ahora.", - "slideshow_content_panel_th_name": "Nombre", - "slideshow_content_panel_th_activity": "Opciones", - "slideshow_content_form_add_title": "Agregar Contenido", - "slideshow_content_form_add_submit": "Agregar", - "slideshow_content_form_edit_title": "Editar Contenido", - "slideshow_content_form_edit_submit": "Guardar", - "slideshow_content_form_label_name": "Nombre", - "slideshow_content_form_label_location": "Ubicación", - "slideshow_content_form_label_type": "Tipo", - "slideshow_content_form_label_object": "Objeto", - "slideshow_content_form_button_cancel": "Cancelar", - "slideshow_content_form_button_upload": "Subir un archivo", - "slideshow_content_form_button_upload_choosen": "No hay archivos seleccionados", - "js_slideshow_content_delete_confirmation": "¿Estás seguro?", - - "playlist_page_title": "Playlist", - "playlist_button_add": "Agregar una lista de reproducción", - "playlist_panel_active": "Playlist activas", - "playlist_panel_inactive": "Playlist inactivas", - "playlist_panel_empty": "Actualmente, no hay playlist. %link% ahora.", - "playlist_panel_th_name": "Nombre", - "playlist_panel_th_duration": "Duración", - "playlist_panel_th_enabled": "Habilitado", - "playlist_panel_th_activity": "Opciones", - "playlist_form_add_title": "Agregar Playlist", - "playlist_form_add_submit": "Agregar", - "playlist_form_edit_title": "Editar Playlist", - "playlist_form_edit_submit": "Guardar", - "playlist_form_label_name": "Introduce el nombre de la playlist", - "playlist_form_label_time_sync": "Sincronizar diapositivas entre reproductores", - "playlist_form_button_cancel": "Cancelar", - "js_playlist_delete_confirmation": "¿Estás seguro?", - "playlist_delete_has_slides": "La lista de reproducción tiene diapositivas, por favor elimínelas antes y reintente", - "playlist_delete_has_node_player_groups": "La lista de reproducción está asignada a un playgroup", - - "fleet_node_player_page_title": "Reproductores", - "fleet_node_player_button_add": "Agregar un reproductor", - "fleet_node_player_panel_active": "Reproductores activos", - "fleet_node_player_panel_inactive": "Reproductores inactivos", - "fleet_node_player_panel_empty": "Actualmente, no hay reproductores. %link% ahora.", - "fleet_node_player_panel_th_name": "Nombre", - "fleet_node_player_panel_th_host": "Host", - "fleet_node_player_panel_th_group_id": "Grupo", - "fleet_node_player_panel_th_enabled": "Habilitado", - "fleet_node_player_panel_th_activity": "Opciones", - "fleet_node_player_form_add_title": "Agregar Reproductor", - "fleet_node_player_form_add_submit": "Agregar", - "fleet_node_player_form_edit_title": "Editar Reproductor", - "fleet_node_player_form_edit_submit": "Guardar", - "fleet_node_player_form_label_name": "Nombre", - "fleet_node_player_form_label_group_id": "Grupo", - "fleet_node_player_form_label_host": "Host", - "fleet_node_player_form_label_operating_system": "OS", - "fleet_node_player_form_button_cancel": "Cancelar", - "js_fleet_node_player_delete_confirmation": "¿Estás seguro?", - - "fleet_node_player_group_page_title": "Playgroups", - "fleet_node_player_group_button_add": "Agregar Playgroup", - "fleet_node_player_group_panel_active": "Playgroup activos", - "fleet_node_player_group_panel_empty": "Actualmente, no hay playgroup. %link% ahora.", - "fleet_node_player_group_panel_th_name": "Nombre", - "fleet_node_player_group_panel_th_playlist": "Lista de reproducción", - "fleet_node_player_group_panel_th_activity": "Opciones", - "fleet_node_player_group_form_add_title": "Agregar Playgroup", - "fleet_node_player_group_form_add_submit": "Agregar", - "fleet_node_player_group_form_edit_title": "Editar Playgroup", - "fleet_node_player_group_form_edit_submit": "Guardar", - "fleet_node_player_group_form_label_name": "Nombre", - "fleet_node_player_group_form_label_playlist_id": "Lista de reproducción", - "fleet_node_player_group_form_button_cancel": "Cancelar", - "js_fleet_node_player_group_delete_confirmation": "¿Estás seguro?", - "node_player_group_delete_has_node_player": "El playgroup tiene reproductores, por favor elimínelos o desasígnelos antes y reintente", - - "login_page_title": "Iniciar Sesión", - "auth_page_title": "Usuarios", - "auth_user_button_add": "Agregar un usuario", - "auth_user_panel_active": "Usuarios activos", - "auth_user_panel_inactive": "Usuarios inactivos", - "auth_user_panel_empty": "Actualmente, no hay usuarios. %link% ahora.", - "auth_user_panel_th_username": "Nombre de usuario", - "auth_user_panel_th_enabled": "Habilitado", - "auth_user_panel_th_activity": "Opciones", - "auth_user_form_add_title": "Agregar Usuario", - "auth_user_form_add_submit": "Agregar", - "auth_user_form_edit_title": "Editar Usuario", - "auth_user_form_edit_submit": "Guardar", - "auth_user_form_label_username": "Nombre de usuario", - "auth_user_form_label_password": "Contraseña", - "auth_user_form_button_cancel": "Cancelar", - "auth_user_delete_at_least_one_account": "Debe tener al menos un usuario activo mientras usa la función de autenticación", - "js_auth_user_delete_confirmation": "¿Estás seguro?", - - "settings_page_title": "Configuración", - "settings_plugin_page_title": "Plugins", - "settings_variable_panel_system_variables": "Configuración general", - "settings_variable_panel_plugin_variables": "Configuración de plugins", - "settings_variable_panel_th_description": "Descripción", - "settings_variable_panel_th_value": "Valor", - "settings_variable_panel_th_activity": "Opciones", - "settings_variable_form_edit_title": "Editar Configuración", - "settings_variable_form_edit_submit": "Guardar", - "settings_variable_form_label_name": "Nombre", - "settings_variable_form_label_value": "Valor", - "settings_variable_form_button_cancel": "Cancelar", - "settings_variable_form_error_not_playlist_enabled_while_fleet_player_enabled": "No puede deshabilitar playlist mientras la gestión de reproductores de flota está activada", - "settings_variable_desc_lang": "Idioma del servidor", - "settings_variable_desc_playlist_enabled": "Habilitar gestión de playlist", - "settings_variable_desc_fleet_player_enabled": "Habilitar gestión de reproductores de flota", - "settings_variable_desc_edition_fleet_player_enabled": "La gestión de playlist también se habilitará", - "settings_variable_desc_auth_enabled": "Habilitar gestión de autenticación", - "settings_variable_desc_edition_auth_enabled": "Las credenciales predeterminadas del usuario serán admin/admin", - "settings_variable_desc_external_url": "URL externa (ej.: https://studio-01.company.com o http://10.10.3.100)", - "settings_variable_desc_slide_upload_limit": "Límite de carga de diapositivas (en megabytes)", - "settings_variable_desc_default_slide_duration": "Duración de la diapositiva de introducción (en segundos)", - "settings_variable_desc_default_slide_time_with_seconds": "Mostrar los segundos en el reloj de la diapositiva de introducción", - "settings_variable_desc_polling_interval": "Intervalo de actualización aplicado para configuraciones del reproductor (en segundos)", - "settings_variable_desc_playlist_default_time_sync": "Sincronizar diapositivas entre reproductores para la lista de reproducción predeterminada", - - "settings_variable_desc_slide_animation_enabled": "Habilitar efecto de animación entre diapositivas", - "settings_variable_desc_slide_animation_entrance_effect": "Efecto de entrada de animación de diapositiva", - "settings_variable_desc_slide_animation_exit_effect": "Efecto de salida de animación de diapositiva (generalmente mejor sin él)", - "settings_variable_desc_slide_animation_speed": "Velocidad de animación de diapositiva", - - "settings_variable_desc_ro_last_folder_content": "Carpeta actual en el explorador de contenidos", - "settings_variable_desc_ro_last_folder_node_player": "Carpeta actual en el explorador del reproductor", - "settings_variable_desc_ro_editable": "Fecha y hora del último reinicio de la aplicación", - "settings_variable_desc_ro_last_slide_update": "Fecha y hora de la última actualización de diapositiva", - "settings_variable_desc_ro_refresh_player_request": "Fecha y hora de la última solicitud de actualización del reproductor", - - "sysinfo_page_title": "Información del sistema", - "sysinfo_panel_button_restart": "Reiniciar", - "sysinfo_panel_table_section_system": "Sistema", - "sysinfo_panel_table_section_application": "Aplicación", - "sysinfo_panel_title": "Información", - "sysinfo_panel_th_attribute": "Atributo", - "sysinfo_panel_th_value": "Valor", - "sysinfo_panel_td_ipaddr": "Dirección IP", - "logs_page_title": "Logs", - "logs_panel_last_logs": "Registros (últimas 100 líneas)", - "js_sysinfo_restart_confirmation": "¿Estás seguro?", - "js_sysinfo_restart_loading": "Reiniciando, por favor espera...", - - "basic_day_1": "Lunes", - "basic_day_2": "Martes", - "basic_day_3": "Miércoles", - "basic_day_4": "Jueves", - "basic_day_5": "Viernes", - "basic_day_6": "Sábado", - "basic_day_7": "Domingo", - "basic_month_1": "Enero", - "basic_month_2": "Febrero", - "basic_month_3": "Marzo", - "basic_month_4": "Abril", - "basic_month_5": "Mayo", - "basic_month_6": "Junio", - "basic_month_7": "Julio", - "basic_month_8": "Agosto", - "basic_month_9": "Septiembre", - "basic_month_10": "Octubre", - "basic_month_11": "Noviembre", - "basic_month_12": "Diciembre", - - "common_loading": "Cargando...", - "common_default_node_player_group": "Playgroup predeterminado", - "common_default_playlist": "Lista de reproducción predeterminada", - "common_unknown_ipaddr": "Dirección IP desconocida", - "common_empty": "[Vacío]", - "common_are_you_sure": "¿Estás seguro?", - "common_enable_plugin": "Habilitar este plugin", - "common_save": "Guardar", - "common_cancel": "Cancelar", - "common_close": "Cerrar", - "common_confirm": "Confirmar", - "common_submit": "Enviar", - "common_validate": "Validar", - "common_apply": "Aplicar", - "common_saved": "Los cambios se han guardado", - "common_new_folder": "Nuevo Carpeta", - "common_folder_not_empty_error": "La carpeta no está vacía, primero debes eliminar su contenido", - "logout": "Cerrar sesión", - "login_error_not_found": "Credenciales incorrectas", - "login_error_bad_credentials": "Credenciales incorrectas", - "login_form_title": "Iniciar sesión", - "login_form_username": "Nombre de usuario", - "login_form_password": "Contraseña", - "login_form_submit": "Conectar", - "utrack_title": "Acerca de los usuarios", - "created_at": "Creado el", - "updated_at": "Modificado el", - "created_by": "Creado por", - "updated_by": "Última actualización por", - "close": "Cerrar", - "anonymous": "Anónimo", - - "enum_animation_speed_slower": "Más lento", - "enum_animation_speed_slow": "Lento", - "enum_animation_speed_normal": "Normal", - "enum_animation_speed_fast": "Rápido", - "enum_animation_speed_faster": "Más rápido", - "enum_variable_section_general": "1. General", - "enum_variable_section_player_options": "2. Opciones del reproductor", - "enum_variable_section_player_animation": "3. Animación del reproductor", - "enum_variable_section_playlist": "4. Playlist", - "enum_variable_section_fleet": "5. Gestión de flota", - "enum_variable_section_security": "6. Seguridad", - "enum_application_language_english": "Inglés", - "enum_application_language_french": "Francés", - "enum_application_language_italian": "Italiano", - "enum_application_language_spanish": "Español", - "enum_content_type_url": "URL", - "enum_content_type_video": "Video", - "enum_content_type_picture": "Imagen", - "enum_content_type_youtube": "Youtube", - "enum_content_type_url_object_label": "Ingrese el enlace URL", - "enum_content_type_video_object_label": "Sube tu vídeo (solo MP4)", - "enum_content_type_picture_object_label": "Sube tu imagen", - "enum_content_type_youtube_object_label": "Ingrese la URL del vídeo de Youtube", - "enum_operating_system_raspbian": "Raspbian", - "enum_operating_system_debian": "Debian", - "enum_operating_system_windows": "Windows", - "enum_operating_system_macos": "MacOS", - "enum_operating_system_fedora": "Fedora", - "enum_operating_system_ubuntu": "Ubuntu", - "enum_operating_system_suse": "Suse", - "enum_operating_system_redhat": "RedHat", - "enum_operating_system_centos": "CentOS", - "enum_operating_system_other": "Otro", - - "sysinfo_rpi_model": "Modelo de Raspberry Pi", - "sysinfo_rpi_model_unknown": "No es una Raspberry Pi o la información del modelo no está disponible", - "sysinfo_storage_free_space": "Espacio de almacenamiento libre", - "sysinfo_memory_usage": "Uso de memoria", - "sysinfo_os_version": "Versión del SO", - "sysinfo_install_directory": "Directorio de instalación", - "sysinfo_network_interface": "Interfaz de red", - "sysinfo_mac_address": "Dirección MAC", - "sysinfo_ip_address": "Dirección IP", - - "player_default_welcome_message": "Para gestionar este reproductor, ve a un navegador en %link%" + "dynmenu_content": "Contenido", + "slideshow_slide_page_title": "Descripción General del Programa", + "slideshow_slide_goto_player": "Ir al reproductor", + "slideshow_slide_refresh_player": "Actualizar reproductor", + "slideshow_slide_refresh_player_success": "La señal de actualización del reproductor ha sido enviada, debería suceder pronto (%time% segundos máximo)", + "slideshow_slide_button_add": "Agregar una diapositiva", + "slideshow_slide_panel_active": "Diapositivas activas", + "slideshow_slide_panel_inactive": "Diapositivas inactivas", + "slideshow_slide_panel_empty": "Actualmente, no hay diapositivas. %link% ahora.", + "slideshow_slide_panel_th_content": "Contenido", + "slideshow_slide_panel_th_duration": "Termina después", + "slideshow_slide_panel_th_duration_unit": "seg", + "slideshow_slide_panel_th_enabled": "Habilitado", + "slideshow_slide_panel_th_cron_scheduled": "Inicio Programado", + "slideshow_slide_panel_th_activity": "Opciones", + "slideshow_slide_panel_td_cron_scheduled_loop": "Bucle", + "slideshow_slide_panel_td_cron_scheduled_notify": "Notificar", + "slideshow_slide_panel_td_cron_scheduled_bad_cron": "Valor de cron incorrecto", + "slideshow_slide_form_add_title": "Agregar Diapositiva", + "slideshow_slide_form_add_submit": "Agregar", + "slideshow_slide_form_edit_title": "Editar Diapositiva", + "slideshow_slide_form_edit_submit": "Guardar", + "slideshow_slide_form_section_content": "Medios", + "slideshow_slide_form_section_scheduling": "Programación", + "slideshow_slide_form_label_name": "Nombre", + "slideshow_slide_form_label_add_content": "Agregar a la biblioteca", + "slideshow_slide_form_label_from_library": "Dalla biblioteca", + "slideshow_slide_form_label_content_id": "Contenido", + "slideshow_slide_form_label_location": "Ubicación", + "slideshow_slide_form_label_type": "Tipo", + "slideshow_slide_form_label_object": "Objeto", + "slideshow_slide_form_label_duration": "Duración", + "slideshow_slide_form_label_duration_unit": "segundos", + "slideshow_slide_form_label_is_notification": "Actuar como notificación", + "slideshow_slide_form_label_cron_scheduled": "Inicio", + "slideshow_slide_form_label_cron_scheduled_end": "Fin", + "slideshow_slide_form_label_cron_scheduled_loop": "Siempre en bucle", + "slideshow_slide_form_label_cron_scheduled_duration": "Duración", + "slideshow_slide_form_label_cron_scheduled_stayloop": "Seguir el bucle", + "slideshow_slide_form_label_cron_scheduled_duration_unit": "segundos", + "slideshow_slide_form_label_cron_scheduled_datetime": "Fecha y Hora", + "slideshow_slide_form_label_cron_scheduled_datetime_placeholder": "Establecer una fecha y hora", + "slideshow_slide_form_label_cron_scheduled_cron": "Cron", + "slideshow_slide_form_widget_cron_scheduled_placeholder": "Usar formato crontab: * * * * *", + "slideshow_slide_form_button_cancel": "Cancelar", + "js_slideshow_slide_delete_confirmation": "¿Estás seguro?", + "slideshow_content_page_title": "Biblioteca de contenidos", + "slideshow_content_button_add": "Nuevo Contenido", + "slideshow_content_referenced_in_slide_error": "Se hace referencia al contenido en una diapositiva; elimine la diapositiva primero", + "slideshow_content_panel_active": "Contenido", + "slideshow_content_panel_empty": "Actualmente, no hay contenido. %link% ahora.", + "slideshow_content_panel_th_name": "Nombre", + "slideshow_content_panel_th_activity": "Opciones", + "slideshow_content_form_add_title": "Agregar Contenido", + "slideshow_content_form_add_submit": "Agregar", + "slideshow_content_form_edit_title": "Editar Contenido", + "slideshow_content_form_edit_submit": "Guardar", + "slideshow_content_form_label_name": "Nombre", + "slideshow_content_form_label_location": "Ubicación", + "slideshow_content_form_label_type": "Tipo", + "slideshow_content_form_label_object": "Objeto", + "slideshow_content_form_button_cancel": "Cancelar", + "slideshow_content_form_button_upload": "Subir un archivo", + "slideshow_content_form_button_upload_choosen": "No hay archivos seleccionados", + "js_slideshow_content_delete_confirmation": "¿Estás seguro?", + "playlist_page_title": "Playlists", + "playlist_button_add": "Agregar Playlist", + "playlist_button_delete": "Eliminar Playlist", + "playlist_panel_about_playlist": "Acerca de la playlist", + "playlist_panel_content_management": "Gestión de contenido", + "playlist_panel_preview": "Vista previa de la playlist", + "playlist_panel_preview_action": "Avance", + "playlist_panel_inactive": "Playlist inactivas", + "playlist_panel_empty": "Actualmente, no hay playlist. %link% ahora.", + "playlist_panel_th_name": "Nombre", + "playlist_panel_th_duration": "Duración", + "playlist_panel_th_enabled": "Habilitado", + "playlist_panel_th_activity": "Opciones", + "playlist_form_add_title": "Agregar Playlist", + "playlist_form_add_submit": "Agregar", + "playlist_form_preview_url_desc": "Puedes usar este enlace para reproducir esta playlist en cualquier navegador que desees. Usa el botón Copiar para guardarla en tu portapapeles.", + "playlist_form_preview_qrcode_desc": "Puedes acceder fácilmente a tu playlist usando una tableta o un teléfono. Simplemente escanea el código QR para comenzar.", + "playlist_form_preview_iframe_desc": "Puedes ver la playlist sin salir de esta pantalla iniciando la vista previa desde aquí.", + "playlist_form_label_name": "Introduce el nombre de la playlist", + "playlist_form_label_time_sync": "Sincronizar diapositivas entre reproductores", + "playlist_form_label_enabled": "Activar/Desactivar playlist", + "playlist_form_button_cancel": "Cancelar", + "js_playlist_delete_confirmation": "¿Estás seguro?", + "playlist_delete_has_slides": "La playlist tiene diapositivas, por favor elimínelas antes y reintente", + "playlist_delete_has_node_player_groups": "La playlist está asignada a un playgroup", + "fleet_node_player_page_title": "Reproductores", + "fleet_node_player_button_add": "Agregar un reproductor", + "fleet_node_player_panel_active": "Reproductores activos", + "fleet_node_player_panel_inactive": "Reproductores inactivos", + "fleet_node_player_panel_empty": "Actualmente, no hay reproductores. %link% ahora.", + "fleet_node_player_panel_th_name": "Nombre", + "fleet_node_player_panel_th_host": "Host", + "fleet_node_player_panel_th_group_id": "Grupo", + "fleet_node_player_panel_th_enabled": "Habilitado", + "fleet_node_player_panel_th_activity": "Opciones", + "fleet_node_player_form_add_title": "Agregar Reproductor", + "fleet_node_player_form_add_submit": "Agregar", + "fleet_node_player_form_edit_title": "Editar Reproductor", + "fleet_node_player_form_edit_submit": "Guardar", + "fleet_node_player_form_label_name": "Nombre", + "fleet_node_player_form_label_group_id": "Grupo", + "fleet_node_player_form_label_host": "Host", + "fleet_node_player_form_label_operating_system": "OS", + "fleet_node_player_form_button_cancel": "Cancelar", + "js_fleet_node_player_delete_confirmation": "¿Estás seguro?", + "fleet_node_player_group_page_title": "Playgroups", + "fleet_node_player_group_button_add": "Agregar Playgroup", + "fleet_node_player_group_panel_active": "Playgroup activos", + "fleet_node_player_group_panel_empty": "Actualmente, no hay playgroup. %link% ahora.", + "fleet_node_player_group_panel_th_name": "Nombre", + "fleet_node_player_group_panel_th_playlist": "Lista de reproducción", + "fleet_node_player_group_panel_th_activity": "Opciones", + "fleet_node_player_group_form_add_title": "Agregar Playgroup", + "fleet_node_player_group_form_add_submit": "Agregar", + "fleet_node_player_group_form_edit_title": "Editar Playgroup", + "fleet_node_player_group_form_edit_submit": "Guardar", + "fleet_node_player_group_form_label_name": "Nombre", + "fleet_node_player_group_form_label_playlist_id": "Lista de reproducción", + "fleet_node_player_group_form_button_cancel": "Cancelar", + "js_fleet_node_player_group_delete_confirmation": "¿Estás seguro?", + "node_player_group_delete_has_node_player": "El playgroup tiene reproductores, por favor elimínelos o desasígnelos antes y reintente", + "login_page_title": "Iniciar Sesión", + "auth_page_title": "Usuarios", + "auth_user_button_add": "Agregar un usuario", + "auth_user_panel_active": "Usuarios activos", + "auth_user_panel_inactive": "Usuarios inactivos", + "auth_user_panel_empty": "Actualmente, no hay usuarios. %link% ahora.", + "auth_user_panel_th_username": "Nombre de usuario", + "auth_user_panel_th_enabled": "Habilitado", + "auth_user_panel_th_activity": "Opciones", + "auth_user_form_add_title": "Agregar Usuario", + "auth_user_form_add_submit": "Agregar", + "auth_user_form_edit_title": "Editar Usuario", + "auth_user_form_edit_submit": "Guardar", + "auth_user_form_label_username": "Nombre de usuario", + "auth_user_form_label_password": "Contraseña", + "auth_user_form_button_cancel": "Cancelar", + "auth_user_delete_at_least_one_account": "Debe tener al menos un usuario activo mientras usa la función de autenticación", + "js_auth_user_delete_confirmation": "¿Estás seguro?", + "settings_page_title": "Configuración", + "settings_plugin_page_title": "Plugins", + "settings_variable_panel_system_variables": "Configuración general", + "settings_variable_panel_plugin_variables": "Configuración de plugins", + "settings_variable_panel_th_description": "Descripción", + "settings_variable_panel_th_value": "Valor", + "settings_variable_panel_th_activity": "Opciones", + "settings_variable_form_edit_title": "Editar Configuración", + "settings_variable_form_edit_submit": "Guardar", + "settings_variable_form_label_name": "Nombre", + "settings_variable_form_label_value": "Valor", + "settings_variable_form_button_cancel": "Cancelar", + "settings_variable_form_error_not_playlist_enabled_while_fleet_player_enabled": "No puede deshabilitar playlist mientras la gestión de reproductores de flota está activada", + "settings_variable_desc_lang": "Idioma del servidor", + "settings_variable_desc_playlist_enabled": "Habilitar gestión de playlist", + "settings_variable_desc_fleet_player_enabled": "Habilitar gestión de reproductores de flota", + "settings_variable_desc_edition_fleet_player_enabled": "La gestión de playlist también se habilitará", + "settings_variable_desc_auth_enabled": "Habilitar gestión de autenticación", + "settings_variable_desc_edition_auth_enabled": "Las credenciales predeterminadas del usuario serán admin/admin", + "settings_variable_desc_external_url": "URL externa (ej.: https://studio-01.company.com o http://10.10.3.100)", + "settings_variable_desc_slide_upload_limit": "Límite de carga de diapositivas (en megabytes)", + "settings_variable_desc_intro_slide_duration": "Duración de la diapositiva de introducción (en segundos)", + "settings_variable_desc_default_slide_time_with_seconds": "Mostrar los segundos en el reloj de la diapositiva de introducción", + "settings_variable_desc_polling_interval": "Intervalo de actualización aplicado para configuraciones del reproductor (en segundos)", + "settings_variable_desc_playlist_default_time_sync": "Sincronizar diapositivas entre reproductores para la playlist predeterminada", + "settings_variable_desc_slide_animation_enabled": "Habilitar efecto de animación entre diapositivas", + "settings_variable_desc_slide_animation_entrance_effect": "Efecto de entrada de animación de diapositiva", + "settings_variable_desc_slide_animation_exit_effect": "Efecto de salida de animación de diapositiva (generalmente mejor sin él)", + "settings_variable_desc_slide_animation_speed": "Velocidad de animación de diapositiva", + "settings_variable_desc_ro_start_counter": "Contador de inicio", + "settings_variable_desc_ro_last_folder_content": "Carpeta actual en el explorador de contenidos", + "settings_variable_desc_ro_last_folder_node_player": "Carpeta actual en el explorador del reproductor", + "settings_variable_desc_ro_editable": "Fecha y hora del último reinicio de la aplicación", + "settings_variable_desc_ro_last_slide_update": "Fecha y hora de la última actualización de diapositiva", + "settings_variable_desc_ro_refresh_player_request": "Fecha y hora de la última solicitud de actualización del reproductor", + "sysinfo_page_title": "Información del sistema", + "sysinfo_panel_button_restart": "Reiniciar", + "sysinfo_panel_table_section_system": "Sistema", + "sysinfo_panel_table_section_application": "Aplicación", + "sysinfo_panel_title": "Información", + "sysinfo_panel_th_attribute": "Atributo", + "sysinfo_panel_th_value": "Valor", + "sysinfo_panel_td_ipaddr": "Dirección IP", + "logs_page_title": "Logs", + "logs_panel_last_logs": "Registros (últimas 100 líneas)", + "js_sysinfo_restart_confirmation": "¿Estás seguro?", + "js_sysinfo_restart_loading": "Reiniciando, por favor espera...", + "basic_day_1": "Lunes", + "basic_day_2": "Martes", + "basic_day_3": "Miércoles", + "basic_day_4": "Jueves", + "basic_day_5": "Viernes", + "basic_day_6": "Sábado", + "basic_day_7": "Domingo", + "basic_month_1": "Enero", + "basic_month_2": "Febrero", + "basic_month_3": "Marzo", + "basic_month_4": "Abril", + "basic_month_5": "Mayo", + "basic_month_6": "Junio", + "basic_month_7": "Julio", + "basic_month_8": "Agosto", + "basic_month_9": "Septiembre", + "basic_month_10": "Octubre", + "basic_month_11": "Noviembre", + "basic_month_12": "Diciembre", + "common_untitled": "", + "common_loading": "Cargando...", + "common_default_node_player_group": "Playgroup predeterminado", + "common_default_playlist": "Lista de reproducción predeterminada", + "common_unknown_ipaddr": "Dirección IP desconocida", + "common_empty": "[Vacío]", + "common_are_you_sure": "¿Estás seguro?", + "common_enable_plugin": "Habilitar este plugin", + "common_save": "Guardar", + "common_cancel": "Cancelar", + "common_close": "Cerrar", + "common_confirm": "Confirmar", + "common_submit": "Enviar", + "common_validate": "Validar", + "common_apply": "Aplicar", + "common_saved": "Los cambios se han guardado", + "common_new_folder": "Nuevo Carpeta", + "common_folder_not_empty_error": "La carpeta no está vacía, primero debes eliminar su contenido", + "logout": "Cerrar sesión", + "login_error_not_found": "Credenciales incorrectas", + "login_error_bad_credentials": "Credenciales incorrectas", + "login_form_title": "Iniciar sesión", + "login_form_username": "Nombre de usuario", + "login_form_password": "Contraseña", + "login_form_submit": "Conectar", + "utrack_title": "Acerca de los usuarios", + "created_at": "Creado el", + "updated_at": "Modificado el", + "created_by": "Creado por", + "updated_by": "Última actualización por", + "close": "Cerrar", + "anonymous": "Anónimo", + "enum_animation_speed_slower": "Más lento", + "enum_animation_speed_slow": "Lento", + "enum_animation_speed_normal": "Normal", + "enum_animation_speed_fast": "Rápido", + "enum_animation_speed_faster": "Más rápido", + "enum_variable_section_general": "1. General", + "enum_variable_section_player_options": "2. Opciones del reproductor", + "enum_variable_section_player_animation": "3. Animación del reproductor", + "enum_variable_section_playlist": "4. Playlist", + "enum_variable_section_fleet": "5. Gestión de flota", + "enum_variable_section_security": "6. Seguridad", + "enum_application_language_english": "Inglés", + "enum_application_language_french": "Francés", + "enum_application_language_italian": "Italiano", + "enum_application_language_spanish": "Español", + "enum_content_type_url": "URL", + "enum_content_type_video": "Video", + "enum_content_type_picture": "Imagen", + "enum_content_type_youtube": "Youtube", + "enum_content_type_url_object_label": "Ingrese el enlace URL", + "enum_content_type_video_object_label": "Sube tu vídeo (solo MP4)", + "enum_content_type_picture_object_label": "Sube tu imagen", + "enum_content_type_youtube_object_label": "Ingrese la URL del vídeo de Youtube", + "enum_operating_system_raspbian": "Raspbian", + "enum_operating_system_debian": "Debian", + "enum_operating_system_windows": "Windows", + "enum_operating_system_macos": "MacOS", + "enum_operating_system_fedora": "Fedora", + "enum_operating_system_ubuntu": "Ubuntu", + "enum_operating_system_suse": "Suse", + "enum_operating_system_redhat": "RedHat", + "enum_operating_system_centos": "CentOS", + "enum_operating_system_other": "Otro", + "sysinfo_rpi_model": "Modelo de Raspberry Pi", + "sysinfo_rpi_model_unknown": "No es una Raspberry Pi o la información del modelo no está disponible", + "sysinfo_storage_free_space": "Espacio de almacenamiento libre", + "sysinfo_memory_usage": "Uso de memoria", + "sysinfo_os_version": "Versión del SO", + "sysinfo_install_directory": "Directorio de instalación", + "sysinfo_network_interface": "Interfaz de red", + "sysinfo_mac_address": "Dirección MAC", + "sysinfo_ip_address": "Dirección IP", + "player_default_welcome_message": "Para gestionar este reproductor, ve a un navegador en %link%" } diff --git a/lang/fr.json b/lang/fr.json index f1353d3..f5b8824 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -1,294 +1,288 @@ { - "dynmenu_content": "Contenu", - - "slideshow_slide_page_title": "Vue Planning", - "slideshow_slide_goto_player": "Voir le lecteur", - "slideshow_slide_refresh_player": "Rafraîchir le lecteur", - "slideshow_slide_refresh_player_success": "Un rafraîchissement du lecteur a été programmé, il devrait avoir lieu sous peu (%time% secondes maximum)", - "slideshow_slide_button_add": "Ajouter une slide", - "slideshow_slide_panel_active": "Slides actives", - "slideshow_slide_panel_inactive": "Slides inactives", - "slideshow_slide_panel_empty": "Actuellement, il n'y a aucune slide. %link% maintenant.", - "slideshow_slide_panel_th_content": "Contenu", - "slideshow_slide_panel_th_duration": "Fin après", - "slideshow_slide_panel_th_duration_unit": "sec", - "slideshow_slide_panel_th_enabled": "Activé", - "slideshow_slide_panel_th_cron_scheduled": "Programmation", - "slideshow_slide_panel_th_activity": "Options", - "slideshow_slide_panel_td_cron_scheduled_loop": "En boucle", - "slideshow_slide_panel_td_cron_scheduled_notify": "Notifie", - "slideshow_slide_panel_td_cron_scheduled_bad_cron": "Mauvaise valeur cron", - "slideshow_slide_form_add_title": "Ajout d'une slide", - "slideshow_slide_form_add_submit": "Ajouter", - "slideshow_slide_form_edit_title": "Modification d'une slide", - "slideshow_slide_form_edit_submit": "Enregistrer", - "slideshow_slide_form_section_content": "Media", - "slideshow_slide_form_section_scheduling": "Programmation", - "slideshow_slide_form_label_name": "Nom", - "slideshow_slide_form_label_add_content": "Ajouter à la bibliothèque", - "slideshow_slide_form_label_from_library": "Depuis la bibliothèque", - "slideshow_slide_form_label_content_id": "Contenu", - "slideshow_slide_form_label_location": "Chemin", - "slideshow_slide_form_label_type": "Type", - "slideshow_slide_form_label_object": "Objet", - "slideshow_slide_form_label_duration": "Durée", - "slideshow_slide_form_label_duration_unit": "secondes", - "slideshow_slide_form_label_is_notification": "Agit comme une notification", - "slideshow_slide_form_label_cron_scheduled": "Début", - "slideshow_slide_form_label_cron_scheduled_end": "Fin", - "slideshow_slide_form_label_cron_scheduled_loop": "Toujours en boucle", - "slideshow_slide_form_label_cron_scheduled_duration": "Durée", - "slideshow_slide_form_label_cron_scheduled_stayloop": "Suit la boucle", - "slideshow_slide_form_label_cron_scheduled_duration_unit": "secondes", - "slideshow_slide_form_label_cron_scheduled_datetime": "Date & Heure", - "slideshow_slide_form_label_cron_scheduled_datetime_placeholder": "Choisir une date et une heure", - "slideshow_slide_form_label_cron_scheduled_cron": "Cron", - "slideshow_slide_form_widget_cron_scheduled_placeholder": "Utiliser le format crontab: * * * * *", - "slideshow_slide_form_button_cancel": "Annuler", - "js_slideshow_slide_delete_confirmation": "Êtes-vous sûr ?", - - "slideshow_content_page_title": "Bibliothèque de contenus", - "slideshow_content_button_add": "Nouveau Contenu", - "slideshow_content_referenced_in_slide_error": "Le contenu est référencé dans une slide, supprimez d'abord la slide", - "slideshow_content_panel_active": "Contenus", - "slideshow_content_panel_empty": "Actuellement, il n'y a aucun contenu. %link% maintenant.", - "slideshow_content_panel_th_name": "Nom", - "slideshow_content_panel_th_activity": "Options", - "slideshow_content_form_add_title": "Ajout d'un contenu", - "slideshow_content_form_add_submit": "Ajouter", - "slideshow_content_form_edit_title": "Modification d'un contenu", - "slideshow_content_form_edit_submit": "Enregistrer", - "slideshow_content_form_label_name": "Nom de l'élément", - "slideshow_content_form_label_location": "Chemin", - "slideshow_content_form_label_type": "Type", - "slideshow_content_form_label_object": "Objet", - "slideshow_content_form_button_cancel": "Annuler", - "slideshow_content_form_button_upload": "Uploader un fichier", - "slideshow_content_form_button_upload_choosen": "Aucun fichier sélectionné", - "js_slideshow_content_delete_confirmation": "Êtes-vous sûr ?", - - "playlist_page_title": "Playlist", - "playlist_button_add": "Ajouter une playlist", - "playlist_panel_active": "Playlist actives", - "playlist_panel_inactive": "Playlist inactives", - "playlist_panel_empty": "Actuellement, il n'y a pas de playlist. %link% maintenant.", - "playlist_panel_th_name": "Nom", - "playlist_panel_th_duration": "Durée", - "playlist_panel_th_enabled": "Activé", - "playlist_panel_th_activity": "Options", - "playlist_form_add_title": "Ajout d'une Playlist", - "playlist_form_add_submit": "Ajouter", - "playlist_form_edit_title": "Modification d'une Playlist", - "playlist_form_edit_submit": "Enregistrer", - "playlist_form_label_name": "Entrez le nom de la playlist", - "playlist_form_label_time_sync": "Synchroniser les slides des lecteurs", - "playlist_form_button_cancel": "Annuler", - "js_playlist_delete_confirmation": "Êtes-vous sûr ?", - "playlist_delete_has_slides": "La playlist contient des slides, supprimez-les avant et réessayez", - "playlist_delete_has_node_player_groups": "La playlist est attribuée à un playgroup", - - "fleet_node_player_page_title": "Lecteurs", - "fleet_node_player_button_add": "Ajouter un lecteur", - "fleet_node_player_panel_active": "Players actifs", - "fleet_node_player_panel_inactive": "Players inactifs", - "fleet_node_player_panel_empty": "Actuellement, il n'y a pas de lecteurs. %link% maintenant.", - "fleet_node_player_panel_th_name": "Nom", - "fleet_node_player_panel_th_host": "Hôte", - "fleet_node_player_panel_th_group_id": "Groupe", - "fleet_node_player_panel_th_enabled": "Activé", - "fleet_node_player_panel_th_activity": "Options", - "fleet_node_player_form_add_title": "Ajout d'un lecteur", - "fleet_node_player_form_add_submit": "Ajouter", - "fleet_node_player_form_edit_title": "Modification d'un lecteur", - "fleet_node_player_form_edit_submit": "Enregistrer", - "fleet_node_player_form_label_name": "Nom", - "fleet_node_player_form_label_group_id": "Groupe", - "fleet_node_player_form_label_host": "Hôte", - "fleet_node_player_form_label_operating_system": "OS", - "fleet_node_player_form_button_cancel": "Annuler", - "js_fleet_node_player_delete_confirmation": "Êtes-vous sûr ?", - - "fleet_node_player_group_page_title": "Playgroups", - "fleet_node_player_group_button_add": "Ajouter un Playgroup", - "fleet_node_player_group_panel_active": "Playgroups", - "fleet_node_player_group_panel_empty": "Actuellement, il n'y a pas de playgroup. %link% maintenant.", - "fleet_node_player_group_panel_th_name": "Nom", - "fleet_node_player_group_panel_th_playlist": "Liste de lecture", - "fleet_node_player_group_panel_th_activity": "Options", - "fleet_node_player_group_form_add_title": "Ajout d'un playgroup", - "fleet_node_player_group_form_add_submit": "Ajouter", - "fleet_node_player_group_form_edit_title": "Modification d'un playgroup", - "fleet_node_player_group_form_edit_submit": "Enregistrer", - "fleet_node_player_group_form_label_name": "Nom", - "fleet_node_player_group_form_label_playlist_id": "Liste de lecture", - "fleet_node_player_group_form_button_cancel": "Annuler", - "js_fleet_node_player_group_delete_confirmation": "Êtes-vous sûr ?", - "node_player_group_delete_has_node_player": "Le playgroup a des lecteurs, supprimez-les ou réassignez-les avant de le supprimer", - - "login_page_title": "Connexion", - "auth_page_title": "Utilisateurs", - "auth_user_button_add": "Ajouter un utilisateur", - "auth_user_panel_active": "Utilisateurs actifs", - "auth_user_panel_inactive": "Utilisateurs inactifs", - "auth_user_panel_empty": "Actuellement, il n'y a pas d'utilisateurs. %link% maintenant.", - "auth_user_panel_th_username": "Nom d'utilisateur", - "auth_user_panel_th_enabled": "Activé", - "auth_user_panel_th_activity": "Options", - "auth_user_form_add_title": "Ajout d'un utilisateur", - "auth_user_form_add_submit": "Ajouter", - "auth_user_form_edit_title": "Modification d'un utilisateur", - "auth_user_form_edit_submit": "Enregistrer", - "auth_user_form_label_username": "Nom d'utilisateur", - "auth_user_form_label_password": "Mot de passe", - "auth_user_form_button_cancel": "Annuler", - "auth_user_delete_at_least_one_account": "Vous devez avoir au moins un utilisateur actif lorsque vous activez la gestion de l'authentification", - "js_auth_user_delete_confirmation": "Êtes-vous sûr ?", - - "settings_page_title": "Paramètres", - "settings_plugin_page_title": "Plugins", - "settings_variable_panel_system_variables": "Paramètres généraux", - "settings_variable_panel_plugin_variables": "Paramètres des plugins", - "settings_variable_panel_th_description": "Description", - "settings_variable_panel_th_value": "Valeur", - "settings_variable_panel_th_activity": "Options", - "settings_variable_form_edit_title": "Modification du paramètre", - "settings_variable_form_edit_submit": "Enregistrer", - "settings_variable_form_label_name": "Nom", - "settings_variable_form_label_value": "Valeur", - "settings_variable_form_button_cancel": "Annuler", - "settings_variable_form_error_not_playlist_enabled_while_fleet_player_enabled": "Vous ne pouvez pas désactiver les playlists tant que la gestion de flotte de lecteurs est activée", - "settings_variable_desc_lang": "Langage de l'application", - "settings_variable_desc_playlist_enabled": "Activer la gestion des playlists", - "settings_variable_desc_fleet_player_enabled": "Activer la gestion de flotte des players", - "settings_variable_desc_edition_fleet_player_enabled": "Les playlists seront également activées", - "settings_variable_desc_auth_enabled": "Activer la gestion de l'authentification", - "settings_variable_desc_edition_auth_enabled": "Les identifiants de l'utilisateur par défaut seront admin/admin", - "settings_variable_desc_external_url": "URL externe (i.e: https://studio-01.company.com or http://10.10.3.100)", - "settings_variable_desc_slide_upload_limit": "Limite d'upload du fichier d'une slide (en mégaoctets)", - "settings_variable_desc_default_slide_duration": "Durée de la slide d'introduction (en secondes)", - "settings_variable_desc_default_slide_time_with_seconds": "Afficher les secondes de l'horloge de la slide d'introduction", - "settings_variable_desc_polling_interval": "Intervalle de rafraîchissement des paramètres à appliquer au lecteur (en secondes)", - "settings_variable_desc_playlist_default_time_sync": "Synchroniser les slides des lecteurs pour la playlist par défaut", - - "settings_variable_desc_slide_animation_enabled": "Activer les effets d'animation entre les slides", - "settings_variable_desc_slide_animation_entrance_effect": "Effet d'animation d'arrivée de la slide", - "settings_variable_desc_slide_animation_exit_effect": "Effet d'animation de sortie de la slide (généralement mieux sans)", - "settings_variable_desc_slide_animation_speed": "Vitesse de l'animation de la slide", - - "settings_variable_desc_ro_last_folder_content": "Dossier courant dans l'explorateur de contenu", - "settings_variable_desc_ro_last_folder_node_player": "Dossier courant dans l'explorateur du lecteur", - "settings_variable_desc_ro_editable": "Date de dernier redémarrage de l'application", - "settings_variable_desc_ro_last_slide_update": "Date de dernière modification d'une slide", - "settings_variable_desc_ro_refresh_player_request": "Date de dernière demande de rafraîchissement du lecteur", - - "sysinfo_page_title": "Système", - "sysinfo_panel_button_restart": "Redémarrer", - "sysinfo_panel_table_section_system": "Système", - "sysinfo_panel_table_section_application": "Application", - "sysinfo_panel_title": "Informations", - "sysinfo_panel_th_attribute": "Attribut", - "sysinfo_panel_th_value": "Valeur", - "sysinfo_panel_td_ipaddr": "Adresse IP", - "logs_page_title": "Logs", - "logs_panel_last_logs": "Journaux (100 dernières lignes)", - "js_sysinfo_restart_confirmation": "Êtes-vous sûr ?", - "js_sysinfo_restart_loading": "Redémarrage en cours, veuillez patienter...", - - "basic_day_1": "Lundi", - "basic_day_2": "Mardi", - "basic_day_3": "Mercredi", - "basic_day_4": "Jeudi", - "basic_day_5": "Vendredi", - "basic_day_6": "Samedi", - "basic_day_7": "Dimanche", - "basic_month_1": "Janvier", - "basic_month_2": "Février", - "basic_month_3": "Mars", - "basic_month_4": "Avril", - "basic_month_5": "Mai", - "basic_month_6": "Juin", - "basic_month_7": "Juillet", - "basic_month_8": "Août", - "basic_month_9": "Septembre", - "basic_month_10": "Octobre", - "basic_month_11": "Novembre", - "basic_month_12": "Décembre", - - "common_loading": "Chargement...", - "common_default_node_player_group": "Playgroup par défaut", - "common_default_playlist": "Playlist par défaut", - "common_unknown_ipaddr": "Adresse IP inconnue", - "common_empty": "[Vide]", - "common_are_you_sure": "Êtes-vous sûr ?", - "common_enable_plugin": "Activer ce plugin", - "common_save": "Enregistrer", - "common_cancel": "Annuler", - "common_close": "Fermer", - "common_confirm": "Confirmer", - "common_submit": "Envoyer", - "common_validate": "Valider", - "common_apply": "Appliquer", - "common_saved": "Les modifications ont été enregistrées", - "common_new_folder": "Nouveau Dossier", - "common_folder_not_empty_error": "Le dossier n'est pas vide, vous devez d'abord supprimer son contenu", - "logout": "Déconnexion", - "login_error_not_found": "Identifiants invalides", - "login_error_bad_credentials": "Identifiants invalides", - "login_form_title": "Connexion", - "login_form_username": "Identifiant", - "login_form_password": "Mot de passe", - "login_form_submit": "Valider", - "utrack_title": "À propos des utilisateurs", - "created_at": "Création le", - "updated_at": "Modification le", - "created_by": "Création par", - "updated_by": "Dernière modification par", - "close": "Fermer", - "anonymous": "Anon", - - "enum_animation_speed_slower": "Très lent", - "enum_animation_speed_slow": "Lent", - "enum_animation_speed_normal": "Normal", - "enum_animation_speed_fast": "Rapide", - "enum_animation_speed_faster": "Très rapide", - "enum_variable_section_general": "1. Général", - "enum_variable_section_player_options": "2. Options du lecteur", - "enum_variable_section_player_animation": "3. Animation du lecteur", - "enum_variable_section_playlist": "4. Playlists", - "enum_variable_section_fleet": "5. Gestion de flotte", - "enum_variable_section_security": "6. Sécurité", - "enum_application_language_english": "Anglais", - "enum_application_language_french": "Français", - "enum_application_language_italian": "Italien", - "enum_application_language_spanish": "Espagnol", - "enum_content_type_url": "URL", - "enum_content_type_video": "Vidéo", - "enum_content_type_picture": "Image", - "enum_content_type_youtube": "Youtube", - "enum_content_type_url_object_label": "Entrez l'URL de la page", - "enum_content_type_video_object_label": "Uploadez votre vidéo (MP4 seulement)", - "enum_content_type_picture_object_label": "Uploadez votre image", - "enum_content_type_youtube_object_label": "Enrez l'URL de la vidéo Youtube", - "enum_operating_system_raspbian": "Raspbian", - "enum_operating_system_debian": "Debian", - "enum_operating_system_windows": "Windows", - "enum_operating_system_macos": "MacOS", - "enum_operating_system_fedora": "Fedora", - "enum_operating_system_ubuntu": "Ubuntu", - "enum_operating_system_suse": "Suse", - "enum_operating_system_redhat": "RedHat", - "enum_operating_system_centos": "CentOS", - "enum_operating_system_other": "Autre", - - "sysinfo_rpi_model": "Modèle du Raspberry Pi", - "sysinfo_rpi_model_unknown": "Le modèle n'est pas un Raspberry Pi", - "sysinfo_storage_free_space": "Stockage Disponible", - "sysinfo_memory_usage": "Utilisation Mémoire", - "sysinfo_os_version": "Version SE", - "sysinfo_install_directory": "Dossier Racine", - "sysinfo_network_interface": "Interface Réseau", - "sysinfo_mac_address": "Addresse MAC", - "sysinfo_ip_address": "Addresse IP", - - "player_default_welcome_message": "Pour gérer ce lecteur, allez sur un navigateur à l'adresse %link%" + "dynmenu_content": "Contenu", + "slideshow_slide_page_title": "Vue Planning", + "slideshow_slide_goto_player": "Voir le lecteur", + "slideshow_slide_refresh_player": "Rafraîchir le lecteur", + "slideshow_slide_refresh_player_success": "Un rafraîchissement du lecteur a été programmé, il devrait avoir lieu sous peu (%time% secondes maximum)", + "slideshow_slide_button_add": "Ajouter une slide", + "slideshow_slide_panel_active": "Slides actives", + "slideshow_slide_panel_inactive": "Slides inactives", + "slideshow_slide_panel_empty": "Actuellement, il n'y a aucune slide. %link% maintenant.", + "slideshow_slide_panel_th_content": "Contenu", + "slideshow_slide_panel_th_duration": "Fin après", + "slideshow_slide_panel_th_duration_unit": "sec", + "slideshow_slide_panel_th_enabled": "Activé", + "slideshow_slide_panel_th_cron_scheduled": "Programmation", + "slideshow_slide_panel_th_activity": "Options", + "slideshow_slide_panel_td_cron_scheduled_loop": "En boucle", + "slideshow_slide_panel_td_cron_scheduled_notify": "Notifie", + "slideshow_slide_panel_td_cron_scheduled_bad_cron": "Mauvaise valeur cron", + "slideshow_slide_form_add_title": "Ajout d'une slide", + "slideshow_slide_form_add_submit": "Ajouter", + "slideshow_slide_form_edit_title": "Modification d'une slide", + "slideshow_slide_form_edit_submit": "Enregistrer", + "slideshow_slide_form_section_content": "Media", + "slideshow_slide_form_section_scheduling": "Programmation", + "slideshow_slide_form_label_name": "Nom", + "slideshow_slide_form_label_add_content": "Ajouter à la bibliothèque", + "slideshow_slide_form_label_from_library": "Depuis la bibliothèque", + "slideshow_slide_form_label_content_id": "Contenu", + "slideshow_slide_form_label_location": "Chemin", + "slideshow_slide_form_label_type": "Type", + "slideshow_slide_form_label_object": "Objet", + "slideshow_slide_form_label_duration": "Durée", + "slideshow_slide_form_label_duration_unit": "secondes", + "slideshow_slide_form_label_is_notification": "Agit comme une notification", + "slideshow_slide_form_label_cron_scheduled": "Début", + "slideshow_slide_form_label_cron_scheduled_end": "Fin", + "slideshow_slide_form_label_cron_scheduled_loop": "Toujours en boucle", + "slideshow_slide_form_label_cron_scheduled_duration": "Durée", + "slideshow_slide_form_label_cron_scheduled_stayloop": "Suit la boucle", + "slideshow_slide_form_label_cron_scheduled_duration_unit": "secondes", + "slideshow_slide_form_label_cron_scheduled_datetime": "Date & Heure", + "slideshow_slide_form_label_cron_scheduled_datetime_placeholder": "Choisir une date et une heure", + "slideshow_slide_form_label_cron_scheduled_cron": "Cron", + "slideshow_slide_form_widget_cron_scheduled_placeholder": "Utiliser le format crontab: * * * * *", + "slideshow_slide_form_button_cancel": "Annuler", + "js_slideshow_slide_delete_confirmation": "Êtes-vous sûr ?", + "slideshow_content_page_title": "Bibliothèque de contenus", + "slideshow_content_button_add": "Nouveau Contenu", + "slideshow_content_referenced_in_slide_error": "Le contenu est référencé dans une slide, supprimez d'abord la slide", + "slideshow_content_panel_active": "Contenus", + "slideshow_content_panel_empty": "Actuellement, il n'y a aucun contenu. %link% maintenant.", + "slideshow_content_panel_th_name": "Nom", + "slideshow_content_panel_th_activity": "Options", + "slideshow_content_form_add_title": "Ajout d'un contenu", + "slideshow_content_form_add_submit": "Ajouter", + "slideshow_content_form_edit_title": "Modification d'un contenu", + "slideshow_content_form_edit_submit": "Enregistrer", + "slideshow_content_form_label_name": "Nom de l'élément", + "slideshow_content_form_label_location": "Chemin", + "slideshow_content_form_label_type": "Type", + "slideshow_content_form_label_object": "Objet", + "slideshow_content_form_button_cancel": "Annuler", + "slideshow_content_form_button_upload": "Uploader un fichier", + "slideshow_content_form_button_upload_choosen": "Aucun fichier sélectionné", + "js_slideshow_content_delete_confirmation": "Êtes-vous sûr ?", + "playlist_page_title": "Playlists", + "playlist_button_add": "Ajouter Playlist", + "playlist_button_delete": "Supprimer Playlist", + "playlist_panel_about_playlist": "À propos de la playlist", + "playlist_panel_content_management": "Elements de la playlist", + "playlist_panel_preview": "Playlist preview", + "playlist_panel_preview_action": "Prévisualiser", + "playlist_panel_inactive": "Playlist inactives", + "playlist_panel_empty": "Actuellement, il n'y a pas de playlist. %link% maintenant.", + "playlist_panel_th_name": "Nom", + "playlist_panel_th_duration": "Durée", + "playlist_panel_th_enabled": "Activé", + "playlist_panel_th_activity": "Options", + "playlist_form_add_title": "Ajout d'une Playlist", + "playlist_form_add_submit": "Ajouter", + "playlist_form_preview_url_desc": "Vous pouvez utiliser ce lien pour lire cette playlist sur n'importe quel navigateur de votre choix. Utilisez le bouton Copier pour l'obtenir dans votre presse-papiers.", + "playlist_form_preview_qrcode_desc": "Vous pouvez facilement accéder à votre playlist à l'aide d'une tablette ou d'un téléphone. Scannez simplement le code QR pour commencer.", + "playlist_form_preview_iframe_desc": "Vous pouvez visualiser la playlist sans quitter cet écran en démarrant l'aperçu à partir d'ici.", + "playlist_form_edit_submit": "Enregistrer", + "playlist_form_label_name": "Entrez le nom de la playlist", + "playlist_form_label_time_sync": "Synchroniser les slides des lecteurs", + "playlist_form_label_enabled": "Activer/Désactiver la playlist", + "playlist_form_button_cancel": "Annuler", + "js_playlist_delete_confirmation": "Êtes-vous sûr ?", + "playlist_delete_has_slides": "La playlist contient des slides, supprimez-les avant et réessayez", + "playlist_delete_has_node_player_groups": "La playlist est attribuée à un playgroup", + "fleet_node_player_page_title": "Lecteurs", + "fleet_node_player_button_add": "Ajouter un lecteur", + "fleet_node_player_panel_active": "Players actifs", + "fleet_node_player_panel_inactive": "Players inactifs", + "fleet_node_player_panel_empty": "Actuellement, il n'y a pas de lecteurs. %link% maintenant.", + "fleet_node_player_panel_th_name": "Nom", + "fleet_node_player_panel_th_host": "Hôte", + "fleet_node_player_panel_th_group_id": "Groupe", + "fleet_node_player_panel_th_enabled": "Activé", + "fleet_node_player_panel_th_activity": "Options", + "fleet_node_player_form_add_title": "Ajout d'un lecteur", + "fleet_node_player_form_add_submit": "Ajouter", + "fleet_node_player_form_edit_title": "Modification d'un lecteur", + "fleet_node_player_form_edit_submit": "Enregistrer", + "fleet_node_player_form_label_name": "Nom", + "fleet_node_player_form_label_group_id": "Groupe", + "fleet_node_player_form_label_host": "Hôte", + "fleet_node_player_form_label_operating_system": "OS", + "fleet_node_player_form_button_cancel": "Annuler", + "js_fleet_node_player_delete_confirmation": "Êtes-vous sûr ?", + "fleet_node_player_group_page_title": "Playgroups", + "fleet_node_player_group_button_add": "Ajouter un Playgroup", + "fleet_node_player_group_panel_active": "Playgroups", + "fleet_node_player_group_panel_empty": "Actuellement, il n'y a pas de playgroup. %link% maintenant.", + "fleet_node_player_group_panel_th_name": "Nom", + "fleet_node_player_group_panel_th_playlist": "Liste de lecture", + "fleet_node_player_group_panel_th_activity": "Options", + "fleet_node_player_group_form_add_title": "Ajout d'un playgroup", + "fleet_node_player_group_form_add_submit": "Ajouter", + "fleet_node_player_group_form_edit_title": "Modification d'un playgroup", + "fleet_node_player_group_form_edit_submit": "Enregistrer", + "fleet_node_player_group_form_label_name": "Nom", + "fleet_node_player_group_form_label_playlist_id": "Liste de lecture", + "fleet_node_player_group_form_button_cancel": "Annuler", + "js_fleet_node_player_group_delete_confirmation": "Êtes-vous sûr ?", + "node_player_group_delete_has_node_player": "Le playgroup a des lecteurs, supprimez-les ou réassignez-les avant de le supprimer", + "login_page_title": "Connexion", + "auth_page_title": "Utilisateurs", + "auth_user_button_add": "Ajouter un utilisateur", + "auth_user_panel_active": "Utilisateurs actifs", + "auth_user_panel_inactive": "Utilisateurs inactifs", + "auth_user_panel_empty": "Actuellement, il n'y a pas d'utilisateurs. %link% maintenant.", + "auth_user_panel_th_username": "Nom d'utilisateur", + "auth_user_panel_th_enabled": "Activé", + "auth_user_panel_th_activity": "Options", + "auth_user_form_add_title": "Ajout d'un utilisateur", + "auth_user_form_add_submit": "Ajouter", + "auth_user_form_edit_title": "Modification d'un utilisateur", + "auth_user_form_edit_submit": "Enregistrer", + "auth_user_form_label_username": "Nom d'utilisateur", + "auth_user_form_label_password": "Mot de passe", + "auth_user_form_button_cancel": "Annuler", + "auth_user_delete_at_least_one_account": "Vous devez avoir au moins un utilisateur actif lorsque vous activez la gestion de l'authentification", + "js_auth_user_delete_confirmation": "Êtes-vous sûr ?", + "settings_page_title": "Paramètres", + "settings_plugin_page_title": "Plugins", + "settings_variable_panel_system_variables": "Paramètres généraux", + "settings_variable_panel_plugin_variables": "Paramètres des plugins", + "settings_variable_panel_th_description": "Description", + "settings_variable_panel_th_value": "Valeur", + "settings_variable_panel_th_activity": "Options", + "settings_variable_form_edit_title": "Modification du paramètre", + "settings_variable_form_edit_submit": "Enregistrer", + "settings_variable_form_label_name": "Nom", + "settings_variable_form_label_value": "Valeur", + "settings_variable_form_button_cancel": "Annuler", + "settings_variable_form_error_not_playlist_enabled_while_fleet_player_enabled": "Vous ne pouvez pas désactiver les playlists tant que la gestion de flotte de lecteurs est activée", + "settings_variable_desc_lang": "Langage de l'application", + "settings_variable_desc_playlist_enabled": "Activer la gestion des playlists", + "settings_variable_desc_fleet_player_enabled": "Activer la gestion de flotte des players", + "settings_variable_desc_edition_fleet_player_enabled": "Les playlists seront également activées", + "settings_variable_desc_auth_enabled": "Activer la gestion de l'authentification", + "settings_variable_desc_edition_auth_enabled": "Les identifiants de l'utilisateur par défaut seront admin/admin", + "settings_variable_desc_external_url": "URL externe (i.e: https://studio-01.company.com or http://10.10.3.100)", + "settings_variable_desc_slide_upload_limit": "Limite d'upload du fichier d'une slide (en mégaoctets)", + "settings_variable_desc_intro_slide_duration": "Durée de la slide d'introduction (en secondes)", + "settings_variable_desc_default_slide_time_with_seconds": "Afficher les secondes de l'horloge de la slide d'introduction", + "settings_variable_desc_polling_interval": "Intervalle de rafraîchissement des paramètres à appliquer au lecteur (en secondes)", + "settings_variable_desc_playlist_default_time_sync": "Synchroniser les slides des lecteurs pour la playlist par défaut", + "settings_variable_desc_slide_animation_enabled": "Activer les effets d'animation entre les slides", + "settings_variable_desc_slide_animation_entrance_effect": "Effet d'animation d'arrivée de la slide", + "settings_variable_desc_slide_animation_exit_effect": "Effet d'animation de sortie de la slide (généralement mieux sans)", + "settings_variable_desc_slide_animation_speed": "Vitesse de l'animation de la slide", + "settings_variable_desc_ro_start_counter": "Compteur de démarrage", + "settings_variable_desc_ro_last_folder_content": "Dossier courant dans l'explorateur de contenu", + "settings_variable_desc_ro_last_folder_node_player": "Dossier courant dans l'explorateur du lecteur", + "settings_variable_desc_ro_editable": "Date de dernier redémarrage de l'application", + "settings_variable_desc_ro_last_slide_update": "Date de dernière modification d'une slide", + "settings_variable_desc_ro_refresh_player_request": "Date de dernière demande de rafraîchissement du lecteur", + "sysinfo_page_title": "Système", + "sysinfo_panel_button_restart": "Redémarrer", + "sysinfo_panel_table_section_system": "Système", + "sysinfo_panel_table_section_application": "Application", + "sysinfo_panel_title": "Informations", + "sysinfo_panel_th_attribute": "Attribut", + "sysinfo_panel_th_value": "Valeur", + "sysinfo_panel_td_ipaddr": "Adresse IP", + "logs_page_title": "Logs", + "logs_panel_last_logs": "Journaux (100 dernières lignes)", + "js_sysinfo_restart_confirmation": "Êtes-vous sûr ?", + "js_sysinfo_restart_loading": "Redémarrage en cours, veuillez patienter...", + "basic_day_1": "Lundi", + "basic_day_2": "Mardi", + "basic_day_3": "Mercredi", + "basic_day_4": "Jeudi", + "basic_day_5": "Vendredi", + "basic_day_6": "Samedi", + "basic_day_7": "Dimanche", + "basic_month_1": "Janvier", + "basic_month_2": "Février", + "basic_month_3": "Mars", + "basic_month_4": "Avril", + "basic_month_5": "Mai", + "basic_month_6": "Juin", + "basic_month_7": "Juillet", + "basic_month_8": "Août", + "basic_month_9": "Septembre", + "basic_month_10": "Octobre", + "basic_month_11": "Novembre", + "basic_month_12": "Décembre", + "common_untitled": "", + "common_loading": "Chargement...", + "common_default_node_player_group": "Playgroup par défaut", + "common_default_playlist": "Playlist par défaut", + "common_unknown_ipaddr": "Adresse IP inconnue", + "common_empty": "[Vide]", + "common_are_you_sure": "Êtes-vous sûr ?", + "common_enable_plugin": "Activer ce plugin", + "common_save": "Enregistrer", + "common_cancel": "Annuler", + "common_close": "Fermer", + "common_confirm": "Confirmer", + "common_submit": "Envoyer", + "common_validate": "Valider", + "common_apply": "Appliquer", + "common_saved": "Les modifications ont été enregistrées", + "common_new_folder": "Nouveau Dossier", + "common_folder_not_empty_error": "Le dossier n'est pas vide, vous devez d'abord supprimer son contenu", + "logout": "Déconnexion", + "login_error_not_found": "Identifiants invalides", + "login_error_bad_credentials": "Identifiants invalides", + "login_form_title": "Connexion", + "login_form_username": "Identifiant", + "login_form_password": "Mot de passe", + "login_form_submit": "Valider", + "utrack_title": "À propos des utilisateurs", + "created_at": "Création le", + "updated_at": "Modification le", + "created_by": "Création par", + "updated_by": "Dernière modification par", + "close": "Fermer", + "anonymous": "Anon", + "enum_animation_speed_slower": "Très lent", + "enum_animation_speed_slow": "Lent", + "enum_animation_speed_normal": "Normal", + "enum_animation_speed_fast": "Rapide", + "enum_animation_speed_faster": "Très rapide", + "enum_variable_section_general": "1. Général", + "enum_variable_section_player_options": "2. Options du lecteur", + "enum_variable_section_player_animation": "3. Animation du lecteur", + "enum_variable_section_playlist": "4. Playlists", + "enum_variable_section_fleet": "5. Gestion de flotte", + "enum_variable_section_security": "6. Sécurité", + "enum_application_language_english": "Anglais", + "enum_application_language_french": "Français", + "enum_application_language_italian": "Italien", + "enum_application_language_spanish": "Espagnol", + "enum_content_type_url": "URL", + "enum_content_type_video": "Vidéo", + "enum_content_type_picture": "Image", + "enum_content_type_youtube": "Youtube", + "enum_content_type_url_object_label": "Entrez l'URL de la page", + "enum_content_type_video_object_label": "Uploadez votre vidéo (MP4 seulement)", + "enum_content_type_picture_object_label": "Uploadez votre image", + "enum_content_type_youtube_object_label": "Enrez l'URL de la vidéo Youtube", + "enum_operating_system_raspbian": "Raspbian", + "enum_operating_system_debian": "Debian", + "enum_operating_system_windows": "Windows", + "enum_operating_system_macos": "MacOS", + "enum_operating_system_fedora": "Fedora", + "enum_operating_system_ubuntu": "Ubuntu", + "enum_operating_system_suse": "Suse", + "enum_operating_system_redhat": "RedHat", + "enum_operating_system_centos": "CentOS", + "enum_operating_system_other": "Autre", + "sysinfo_rpi_model": "Modèle du Raspberry Pi", + "sysinfo_rpi_model_unknown": "Le modèle n'est pas un Raspberry Pi", + "sysinfo_storage_free_space": "Stockage Disponible", + "sysinfo_memory_usage": "Utilisation Mémoire", + "sysinfo_os_version": "Version SE", + "sysinfo_install_directory": "Dossier Racine", + "sysinfo_network_interface": "Interface Réseau", + "sysinfo_mac_address": "Addresse MAC", + "sysinfo_ip_address": "Addresse IP", + "player_default_welcome_message": "Pour gérer ce lecteur, allez sur un navigateur à l'adresse %link%" } diff --git a/lang/it.json b/lang/it.json index 4d6df04..26ee4b9 100644 --- a/lang/it.json +++ b/lang/it.json @@ -1,294 +1,287 @@ { - "dynmenu_content": "Contenuti", - - "slideshow_slide_page_title": "Programmazione", - "slideshow_slide_goto_player": "Vai al player", - "slideshow_slide_refresh_player": "Aggiorna player", - "slideshow_slide_refresh_player_success": "L' aggiornamento è stato richiesto, sarà applicato in (%time% secondi)", - "slideshow_slide_button_add": "Aggiungi slide", - "slideshow_slide_panel_active": "Attiva slide", - "slideshow_slide_panel_inactive": "Slide inattive", - "slideshow_slide_panel_empty": "Attualmente, non ci sono slide. %link% adesso.", - "slideshow_slide_panel_th_content": "Contenuti", - "slideshow_slide_panel_th_duration": "Finito in", - "slideshow_slide_panel_th_duration_unit": "sec", - "slideshow_slide_panel_th_enabled": "Abilitato", - "slideshow_slide_panel_th_cron_scheduled": "Avvia programmazione", - "slideshow_slide_panel_th_activity": "Opzioni", - "slideshow_slide_panel_td_cron_scheduled_loop": "Loop", - "slideshow_slide_panel_td_cron_scheduled_notify": "Notificare", - "slideshow_slide_panel_td_cron_scheduled_bad_cron": "Valore cron errato", - "slideshow_slide_form_add_title": "Aggiungi Slide", - "slideshow_slide_form_add_submit": "Aggiungi", - "slideshow_slide_form_edit_title": "Modifica Slide", - "slideshow_slide_form_edit_submit": "Salva", - "slideshow_slide_form_section_content": "Media", - "slideshow_slide_form_section_scheduling": "Programmazione", - "slideshow_slide_form_label_name": "Nome", - "slideshow_slide_form_label_add_content": "Aggiunta alla biblioteca", - "slideshow_slide_form_label_from_library": "Dalla biblioteca", - "slideshow_slide_form_label_content_id": "Contenuti", - "slideshow_slide_form_label_location": "Posizione", - "slideshow_slide_form_label_type": "Tipo", - "slideshow_slide_form_label_object": "Oggetto", - "slideshow_slide_form_label_duration": "Durata", - "slideshow_slide_form_label_duration_unit": "Secondi", - "slideshow_slide_form_label_is_notification": "Agisce come una notifica", - "slideshow_slide_form_label_cron_scheduled": "Inizio", - "slideshow_slide_form_label_cron_scheduled_end": "Fine", - "slideshow_slide_form_label_cron_scheduled_loop": "Sempre in loop", - "slideshow_slide_form_label_cron_scheduled_duration": "Durata", - "slideshow_slide_form_label_cron_scheduled_stayloop": "Seguire il ciclo", - "slideshow_slide_form_label_cron_scheduled_duration_unit": "secondi", - "slideshow_slide_form_label_cron_scheduled_datetime": "Data e ora", - "slideshow_slide_form_label_cron_scheduled_datetime_placeholder": "Imposta Data e ora", - "slideshow_slide_form_label_cron_scheduled_cron": "Cron", - "slideshow_slide_form_widget_cron_scheduled_placeholder": "Utilizza formato crontab: * * * * *", - "slideshow_slide_form_button_cancel": "Annulla", - "js_slideshow_slide_delete_confirmation": "Sei sicuro?", - - "slideshow_content_page_title": "Libreria dei contenuti", - "slideshow_content_button_add": "Nuovo Contenuto", - "slideshow_content_referenced_in_slide_error": "Si fa riferimento al contenuto in una diapositiva, rimuovere prima la diapositiva", - "slideshow_content_panel_active": "Contenuti", - "slideshow_content_panel_empty": "Attualmente non ci sono contenuti. %link% adesso.", - "slideshow_content_panel_th_name": "Nome", - "slideshow_content_panel_th_activity": "Opzioni", - "slideshow_content_form_add_title": "Aggiunta di un contenuto", - "slideshow_content_form_add_submit": "Aggiungi", - "slideshow_content_form_edit_title": "Modifica di un contenuto", - "slideshow_content_form_edit_submit": "Salva", - "slideshow_content_form_label_name": "Nome", - "slideshow_content_form_label_location": "Posizione", - "slideshow_content_form_label_type": "Tipo", - "slideshow_content_form_label_object": "Oggetto", - "slideshow_content_form_button_cancel": "Annulla", - "slideshow_content_form_button_upload": "Carica un file", - "slideshow_content_form_button_upload_choosen": "Nessun file selezionato", - "js_slideshow_content_delete_confirmation": "Sei sicuro?", - - "playlist_page_title": "Playlist", - "playlist_button_add": "Aggiungi alla playlist", - "playlist_panel_active": "Attiva playlist", - "playlist_panel_inactive": "Playlist inattive", - "playlist_panel_empty": "Attualmente, non ci sono playlist. %link% adesso.", - "playlist_panel_th_name": "Nome", - "playlist_panel_th_duration": "Durata", - "playlist_panel_th_enabled": "Abilitata", - "playlist_panel_th_activity": "Opzioni", - "playlist_form_add_title": "Aggiungi Playlist", - "playlist_form_add_submit": "Aggiungi", - "playlist_form_edit_title": "Modifica Playlist", - "playlist_form_edit_submit": "Salva", - "playlist_form_label_name": "Inserisci il nome della playlist", - "playlist_form_label_time_sync": "Sincronizza le slide tra gli schermi", - "playlist_form_button_cancel": "Cancella", - "js_playlist_delete_confirmation": "Sei sicuro?", - "playlist_delete_has_slides": "Sono presenti slide nella playlist, annullale e riprova", - "playlist_delete_has_node_player_groups": "La playlist è collegata ad un playgroup", - - "fleet_node_player_page_title": "Schermi", - "fleet_node_player_button_add": "Aggiungi allo schermo", - "fleet_node_player_panel_active": "Schermi attivi", - "fleet_node_player_panel_inactive": "Schermi disattivi", - "fleet_node_player_panel_empty": "Attualmente, non ci sono schermi. %link% adesso.", - "fleet_node_player_panel_th_name": "Nome", - "fleet_node_player_panel_th_host": "Host", - "fleet_node_player_panel_th_group_id": "Gruppo", - "fleet_node_player_panel_th_enabled": "Abilitato", - "fleet_node_player_panel_th_activity": "Opzioni", - "fleet_node_player_form_add_title": "Aggiungi schermo", - "fleet_node_player_form_add_submit": "Aggiungi", - "fleet_node_player_form_edit_title": "Modifica schermo", - "fleet_node_player_form_edit_submit": "Salva", - "fleet_node_player_form_label_name": "Nome", - "fleet_node_player_form_label_group_id": "Group", - "fleet_node_player_form_label_host": "Host", - "fleet_node_player_form_label_operating_system": "OS", - "fleet_node_player_form_button_cancel": "Cancella", - "js_fleet_node_player_delete_confirmation": "Sei sicuro?", - - "fleet_node_player_group_page_title": "Playgroups", - "fleet_node_player_group_button_add": "Aggiungi Playgroup", - "fleet_node_player_group_panel_active": "Playgroup attivi", - "fleet_node_player_group_panel_empty": "Attualmente, non ci sono playgroup. %link% adesso.", - "fleet_node_player_group_panel_th_name": "Nome", - "fleet_node_player_group_panel_th_playlist": "Playlist", - "fleet_node_player_group_panel_th_activity": "Opzioni", - "fleet_node_player_group_form_add_title": "Aggiungi Playgroup", - "fleet_node_player_group_form_add_submit": "Aggiungi", - "fleet_node_player_group_form_edit_title": "Modifica Playgroup", - "fleet_node_player_group_form_edit_submit": "Salva", - "fleet_node_player_group_form_label_name": "Nome", - "fleet_node_player_group_form_label_playlist_id": "Playlist", - "fleet_node_player_group_form_button_cancel": "Cancella", - "js_fleet_node_player_group_delete_confirmation": "Sei sicuro?", - "node_player_group_delete_has_node_player": "Lo playgroup ha una playlist, rumuovila o riassegnala e riprova", - - "login_page_title": "Login", - "auth_page_title": "Utente", - "auth_user_button_add": "Aggiungi utente", - "auth_user_panel_active": "Utenti attivi", - "auth_user_panel_inactive": "Utenti inattivi", - "auth_user_panel_empty": "Attualmente, non ci sono utenti. %link% adesso.", - "auth_user_panel_th_username": "Username", - "auth_user_panel_th_enabled": "Abilitato", - "auth_user_panel_th_activity": "Opzioni", - "auth_user_form_add_title": "Aggiungi utente", - "auth_user_form_add_submit": "Aggiungi", - "auth_user_form_edit_title": "Modifica utente", - "auth_user_form_edit_submit": "Salva", - "auth_user_form_label_username": "Username", - "auth_user_form_label_password": "Password", - "auth_user_form_button_cancel": "Cancella", - "auth_user_delete_at_least_one_account": "È necessario avere almeno un utente attivo durante l'utilizzo della funzione di autenticazione", - "js_auth_user_delete_confirmation": "Sei sicuro?", - - "settings_page_title": "Impostazioni", - "settings_plugin_page_title": "Plugins", - "settings_variable_panel_system_variables": "Impostazioni generali", - "settings_variable_panel_plugin_variables": "Impostazioni Plugin", - "settings_variable_panel_th_description": "Descrizione", - "settings_variable_panel_th_value": "Valore", - "settings_variable_panel_th_activity": "Opzioni", - "settings_variable_form_edit_title": "Modifica impostazioni", - "settings_variable_form_edit_submit": "Salva", - "settings_variable_form_label_name": "Nome", - "settings_variable_form_label_value": "Valore", - "settings_variable_form_button_cancel": "Cancella", - "settings_variable_form_error_not_playlist_enabled_while_fleet_player_enabled": "Non puoi disattivare le playlist mentre è attiva la gestione degli schermi nella panoramica", - "settings_variable_desc_lang": "Lingua server", - "settings_variable_desc_playlist_enabled": "Abilita gestione playlist", - "settings_variable_desc_fleet_player_enabled": "Abilita panoramica gestione monitor", - "settings_variable_desc_edition_fleet_player_enabled": "Verrà abilitata anche la gestione delle playlist", - "settings_variable_desc_auth_enabled": "Abilita la gestione autenticazione", - "settings_variable_desc_edition_auth_enabled": "Le credenziali utente predefinite sono admin/admin", - "settings_variable_desc_external_url": "Url esterno (esempio: https://studio-01.company.com or http://10.10.3.100)", - "settings_variable_desc_slide_upload_limit": "Limite upload slide (in megabytes)", - "settings_variable_desc_default_slide_duration": "Durata introduzione slide (in secondi)", - "settings_variable_desc_default_slide_time_with_seconds": "Mostra secondi introduzione slide", - "settings_variable_desc_polling_interval": "Intervallo di aggiornamento applicato per le impostazioni del monitor (in secondi)", - "settings_variable_desc_playlist_default_time_sync": "Sincronizza le diapositive tra i lettori per la playlist predefinita", - - "settings_variable_desc_slide_animation_enabled": "Abilita l'effetto di animazione tra le diapositive", - "settings_variable_desc_slide_animation_entrance_effect": "Effetto ingresso diapositiva", - "settings_variable_desc_slide_animation_exit_effect": "Effetto di uscita della diapositiva (meglio senza)", - "settings_variable_desc_slide_animation_speed": "Velicita animazione slide", - - "settings_variable_desc_ro_last_folder_content": "Cartella corrente in Esplora contenuti", - "settings_variable_desc_ro_last_folder_node_player": "Cartella corrente in Player Explorer", - "settings_variable_desc_ro_editable": "Data/ora dell'ultimo riavvio dell'applicazione", - "settings_variable_desc_ro_last_slide_update": "Data e ora dell'ultimo aggiornamento della diapositiva", - "settings_variable_desc_ro_refresh_player_request": "Data e ora della richiesta di aggiornamento dell monitor", - - "sysinfo_page_title": "Informazione sistema", - "sysinfo_panel_button_restart": "Riavvia", - "sysinfo_panel_table_section_system": "Sistema", - "sysinfo_panel_table_section_application": "Applicazione", - "sysinfo_panel_title": "Informazioni", - "sysinfo_panel_th_attribute": "Attributi", - "sysinfo_panel_th_value": "Valore", - "sysinfo_panel_td_ipaddr": "Indirizzo ip", - "logs_page_title": "Logs", - "logs_panel_last_logs": "Logs (ultime 100 righe)", - "js_sysinfo_restart_confirmation": "Sei sicuro?", - "js_sysinfo_restart_loading": "Riavvio in corso, attendi...", - - "basic_day_1": "Lunedi", - "basic_day_2": "Martedi", - "basic_day_3": "Mercoledi", - "basic_day_4": "Giovedi", - "basic_day_5": "Venerdi", - "basic_day_6": "Sabato", - "basic_day_7": "Domenica", - "basic_month_1": "Gennaio", - "basic_month_2": "Febbrazio", - "basic_month_3": "Marzo", - "basic_month_4": "Aprile", - "basic_month_5": "Maggio", - "basic_month_6": "Giugno", - "basic_month_7": "Luglio", - "basic_month_8": "Agosto", - "basic_month_9": "Settembre", - "basic_month_10": "Ottobre", - "basic_month_11": "Novembre", - "basic_month_12": "Dicembre", - - "common_loading": "Caricamento...", - "common_default_node_player_group": "Playgroup di default", - "common_default_playlist": "Default playlist", - "common_unknown_ipaddr": "IP sconosciuto", - "common_empty": "[Empty]", - "common_are_you_sure": "Sei sicuro?", - "common_enable_plugin": "Attiva questo plugin", - "common_save": "Salva", - "common_cancel": "Annulla", - "common_close": "Chiudi", - "common_confirm": "Conferma", - "common_submit": "Invia", - "common_validate": "Convalida", - "common_apply": "Applica", - "common_saved": "Le modifiche sono state salvate", - "common_new_folder": "Nuovo Cartella", - "common_folder_not_empty_error": "La cartella non è vuota, devi prima eliminarne il contenuto", - "logout": "Logout", - "login_error_not_found": "Credenziali errate", - "login_error_bad_credentials": "Credenziali errate", - "login_form_title": "Accedi", - "login_form_username": "Username", - "login_form_password": "Password", - "login_form_submit": "Connetti", - "utrack_title": "Utente", - "created_at": "Creato il", - "updated_at": "Modificato il", - "created_by": "Creato da", - "updated_by": "Aggiornato da", - "close": "Chiuso", - "anonymous": "Anonimo", - - "enum_animation_speed_slower": "Lentamente", - "enum_animation_speed_slow": "Lento", - "enum_animation_speed_normal": "Normale", - "enum_animation_speed_fast": "Veloce", - "enum_animation_speed_faster": "Velocemente", - "enum_variable_section_general": "1. Generale", - "enum_variable_section_player_options": "2. Opzioni monitor", - "enum_variable_section_player_animation": "3. Animazioni monitor", - "enum_variable_section_playlist": "4. Playlist", - "enum_variable_section_fleet": "5. Gestione panoramica", - "enum_variable_section_security": "6. Sicurezza", - "enum_application_language_english": "Inglese", - "enum_application_language_french": "Francese", - "enum_application_language_italian": "Italiano", - "enum_application_language_spanish": "Spagnolo", - "enum_content_type_url": "URL", - "enum_content_type_video": "Video", - "enum_content_type_picture": "Immagine", - "enum_content_type_youtube": "Youtube", - "enum_content_type_url_object_label": "Inserisci il collegamento URL", - "enum_content_type_video_object_label": "Carica il tuo video (solo MP4)", - "enum_content_type_picture_object_label": "Carica la tua immagine", - "enum_content_type_youtube_object_label": "Inserisci l'URL del video Youtube", - "enum_operating_system_raspbian": "Raspbian", - "enum_operating_system_debian": "Debian", - "enum_operating_system_windows": "Windows", - "enum_operating_system_macos": "MacOS", - "enum_operating_system_fedora": "Fedora", - "enum_operating_system_ubuntu": "Ubuntu", - "enum_operating_system_suse": "Suse", - "enum_operating_system_redhat": "RedHat", - "enum_operating_system_centos": "CentOS", - "enum_operating_system_other": "Altro", - - "sysinfo_rpi_model": "Raspberry Pi Model", - "sysinfo_rpi_model_unknown": "Informazioni Raspberry Pi non disponibili", - "sysinfo_storage_free_space": "Spazio libero", - "sysinfo_memory_usage": "Memoria usata", - "sysinfo_os_version": "OS Version", - "sysinfo_install_directory": "Percorso installazione", - "sysinfo_network_interface": "interfaccia di rete", - "sysinfo_mac_address": "Indirizzo MAC", - "sysinfo_ip_address": "indirizzo IP", - - "player_default_welcome_message": "Per gestire questo lettore, vai al browser all'indirizzo %link%" + "dynmenu_content": "Contenuti", + "slideshow_slide_page_title": "Programmazione", + "slideshow_slide_goto_player": "Vai al player", + "slideshow_slide_refresh_player": "Aggiorna player", + "slideshow_slide_refresh_player_success": "L' aggiornamento è stato richiesto, sarà applicato in (%time% secondi)", + "slideshow_slide_button_add": "Aggiungi slide", + "slideshow_slide_panel_active": "Attiva slide", + "slideshow_slide_panel_inactive": "Slide inattive", + "slideshow_slide_panel_empty": "Attualmente, non ci sono slide. %link% adesso.", + "slideshow_slide_panel_th_content": "Contenuti", + "slideshow_slide_panel_th_duration": "Finito in", + "slideshow_slide_panel_th_duration_unit": "sec", + "slideshow_slide_panel_th_enabled": "Abilitato", + "slideshow_slide_panel_th_cron_scheduled": "Avvia programmazione", + "slideshow_slide_panel_th_activity": "Opzioni", + "slideshow_slide_panel_td_cron_scheduled_loop": "Loop", + "slideshow_slide_panel_td_cron_scheduled_notify": "Notificare", + "slideshow_slide_panel_td_cron_scheduled_bad_cron": "Valore cron errato", + "slideshow_slide_form_add_title": "Aggiungi Slide", + "slideshow_slide_form_add_submit": "Aggiungi", + "slideshow_slide_form_edit_title": "Modifica Slide", + "slideshow_slide_form_edit_submit": "Salva", + "slideshow_slide_form_section_content": "Media", + "slideshow_slide_form_section_scheduling": "Programmazione", + "slideshow_slide_form_label_name": "Nome", + "slideshow_slide_form_label_add_content": "Aggiunta alla biblioteca", + "slideshow_slide_form_label_from_library": "Dalla biblioteca", + "slideshow_slide_form_label_content_id": "Contenuti", + "slideshow_slide_form_label_location": "Posizione", + "slideshow_slide_form_label_type": "Tipo", + "slideshow_slide_form_label_object": "Oggetto", + "slideshow_slide_form_label_duration": "Durata", + "slideshow_slide_form_label_duration_unit": "Secondi", + "slideshow_slide_form_label_is_notification": "Agisce come una notifica", + "slideshow_slide_form_label_cron_scheduled": "Inizio", + "slideshow_slide_form_label_cron_scheduled_end": "Fine", + "slideshow_slide_form_label_cron_scheduled_loop": "Sempre in loop", + "slideshow_slide_form_label_cron_scheduled_duration": "Durata", + "slideshow_slide_form_label_cron_scheduled_stayloop": "Seguire il ciclo", + "slideshow_slide_form_label_cron_scheduled_duration_unit": "secondi", + "slideshow_slide_form_label_cron_scheduled_datetime": "Data e ora", + "slideshow_slide_form_label_cron_scheduled_datetime_placeholder": "Imposta Data e ora", + "slideshow_slide_form_label_cron_scheduled_cron": "Cron", + "slideshow_slide_form_widget_cron_scheduled_placeholder": "Utilizza formato crontab: * * * * *", + "slideshow_slide_form_button_cancel": "Annulla", + "js_slideshow_slide_delete_confirmation": "Sei sicuro?", + "slideshow_content_page_title": "Libreria dei contenuti", + "slideshow_content_button_add": "Nuovo Contenuto", + "slideshow_content_referenced_in_slide_error": "Si fa riferimento al contenuto in una diapositiva, rimuovere prima la diapositiva", + "slideshow_content_panel_active": "Contenuti", + "slideshow_content_panel_empty": "Attualmente non ci sono contenuti. %link% adesso.", + "slideshow_content_panel_th_name": "Nome", + "slideshow_content_panel_th_activity": "Opzioni", + "slideshow_content_form_add_title": "Aggiunta di un contenuto", + "slideshow_content_form_add_submit": "Aggiungi", + "slideshow_content_form_edit_title": "Modifica di un contenuto", + "slideshow_content_form_edit_submit": "Salva", + "slideshow_content_form_label_name": "Nome", + "slideshow_content_form_label_location": "Posizione", + "slideshow_content_form_label_type": "Tipo", + "slideshow_content_form_label_object": "Oggetto", + "slideshow_content_form_button_cancel": "Annulla", + "slideshow_content_form_button_upload": "Carica un file", + "slideshow_content_form_button_upload_choosen": "Nessun file selezionato", + "js_slideshow_content_delete_confirmation": "Sei sicuro?", + "playlist_page_title": "Playlists", + "playlist_button_add": "Aggiungi Playlist", + "playlist_button_delete": "Elimina Playlist", + "playlist_panel_about_playlist": "Informazioni sulla playlist", + "playlist_panel_content_management": "Gestione dei contenuti", + "playlist_panel_preview": "Anteprima della playlist", + "playlist_panel_preview_action": "Anteprima", + "playlist_panel_inactive": "Playlist inattive", + "playlist_panel_empty": "Attualmente, non ci sono playlist. %link% adesso.", + "playlist_panel_th_name": "Nome", + "playlist_panel_th_duration": "Durata", + "playlist_panel_th_enabled": "Abilitata", + "playlist_panel_th_activity": "Opzioni", + "playlist_form_add_title": "Aggiungi Playlist", + "playlist_form_add_submit": "Aggiungi", + "playlist_form_preview_url_desc": "Puoi utilizzare questo collegamento per riprodurre questa playlist su qualsiasi browser desideri. Utilizza il pulsante Copia per inserirla negli appunti.", + "playlist_form_preview_qrcode_desc": "Puoi accedere facilmente alla tua playlist utilizzando un tablet o un telefono. Basta scansionare il codice QR per iniziare.", + "playlist_form_preview_iframe_desc": "Puoi visualizzare la playlist senza uscire da questa schermata avviando l'anteprima da qui.", + "playlist_form_label_name": "Inserisci il nome della playlist", + "playlist_form_label_time_sync": "Sincronizza le slide tra gli schermi", + "playlist_form_label_enabled": "Abilita/Disabilita playlist", + "playlist_form_button_cancel": "Cancella", + "js_playlist_delete_confirmation": "Sei sicuro?", + "playlist_delete_has_slides": "Sono presenti slide nella playlist, annullale e riprova", + "playlist_delete_has_node_player_groups": "La playlist è collegata ad un playgroup", + "fleet_node_player_page_title": "Schermi", + "fleet_node_player_button_add": "Aggiungi allo schermo", + "fleet_node_player_panel_active": "Schermi attivi", + "fleet_node_player_panel_inactive": "Schermi disattivi", + "fleet_node_player_panel_empty": "Attualmente, non ci sono schermi. %link% adesso.", + "fleet_node_player_panel_th_name": "Nome", + "fleet_node_player_panel_th_host": "Host", + "fleet_node_player_panel_th_group_id": "Gruppo", + "fleet_node_player_panel_th_enabled": "Abilitato", + "fleet_node_player_panel_th_activity": "Opzioni", + "fleet_node_player_form_add_title": "Aggiungi schermo", + "fleet_node_player_form_add_submit": "Aggiungi", + "fleet_node_player_form_edit_title": "Modifica schermo", + "fleet_node_player_form_edit_submit": "Salva", + "fleet_node_player_form_label_name": "Nome", + "fleet_node_player_form_label_group_id": "Group", + "fleet_node_player_form_label_host": "Host", + "fleet_node_player_form_label_operating_system": "OS", + "fleet_node_player_form_button_cancel": "Cancella", + "js_fleet_node_player_delete_confirmation": "Sei sicuro?", + "fleet_node_player_group_page_title": "Playgroups", + "fleet_node_player_group_button_add": "Aggiungi Playgroup", + "fleet_node_player_group_panel_active": "Playgroup attivi", + "fleet_node_player_group_panel_empty": "Attualmente, non ci sono playgroup. %link% adesso.", + "fleet_node_player_group_panel_th_name": "Nome", + "fleet_node_player_group_panel_th_playlist": "Playlist", + "fleet_node_player_group_panel_th_activity": "Opzioni", + "fleet_node_player_group_form_add_title": "Aggiungi Playgroup", + "fleet_node_player_group_form_add_submit": "Aggiungi", + "fleet_node_player_group_form_edit_title": "Modifica Playgroup", + "fleet_node_player_group_form_edit_submit": "Salva", + "fleet_node_player_group_form_label_name": "Nome", + "fleet_node_player_group_form_label_playlist_id": "Playlist", + "fleet_node_player_group_form_button_cancel": "Cancella", + "js_fleet_node_player_group_delete_confirmation": "Sei sicuro?", + "node_player_group_delete_has_node_player": "Lo playgroup ha una playlist, rumuovila o riassegnala e riprova", + "login_page_title": "Login", + "auth_page_title": "Utente", + "auth_user_button_add": "Aggiungi utente", + "auth_user_panel_active": "Utenti attivi", + "auth_user_panel_inactive": "Utenti inattivi", + "auth_user_panel_empty": "Attualmente, non ci sono utenti. %link% adesso.", + "auth_user_panel_th_username": "Username", + "auth_user_panel_th_enabled": "Abilitato", + "auth_user_panel_th_activity": "Opzioni", + "auth_user_form_add_title": "Aggiungi utente", + "auth_user_form_add_submit": "Aggiungi", + "auth_user_form_edit_title": "Modifica utente", + "auth_user_form_edit_submit": "Salva", + "auth_user_form_label_username": "Username", + "auth_user_form_label_password": "Password", + "auth_user_form_button_cancel": "Cancella", + "auth_user_delete_at_least_one_account": "È necessario avere almeno un utente attivo durante l'utilizzo della funzione di autenticazione", + "js_auth_user_delete_confirmation": "Sei sicuro?", + "settings_page_title": "Impostazioni", + "settings_plugin_page_title": "Plugins", + "settings_variable_panel_system_variables": "Impostazioni generali", + "settings_variable_panel_plugin_variables": "Impostazioni Plugin", + "settings_variable_panel_th_description": "Descrizione", + "settings_variable_panel_th_value": "Valore", + "settings_variable_panel_th_activity": "Opzioni", + "settings_variable_form_edit_title": "Modifica impostazioni", + "settings_variable_form_edit_submit": "Salva", + "settings_variable_form_label_name": "Nome", + "settings_variable_form_label_value": "Valore", + "settings_variable_form_button_cancel": "Cancella", + "settings_variable_form_error_not_playlist_enabled_while_fleet_player_enabled": "Non puoi disattivare le playlist mentre è attiva la gestione degli schermi nella panoramica", + "settings_variable_desc_lang": "Lingua server", + "settings_variable_desc_playlist_enabled": "Abilita gestione playlist", + "settings_variable_desc_fleet_player_enabled": "Abilita panoramica gestione monitor", + "settings_variable_desc_edition_fleet_player_enabled": "Verrà abilitata anche la gestione delle playlist", + "settings_variable_desc_auth_enabled": "Abilita la gestione autenticazione", + "settings_variable_desc_edition_auth_enabled": "Le credenziali utente predefinite sono admin/admin", + "settings_variable_desc_external_url": "Url esterno (esempio: https://studio-01.company.com or http://10.10.3.100)", + "settings_variable_desc_slide_upload_limit": "Limite upload slide (in megabytes)", + "settings_variable_desc_intro_slide_duration": "Durata introduzione slide (in secondi)", + "settings_variable_desc_default_slide_time_with_seconds": "Mostra secondi introduzione slide", + "settings_variable_desc_polling_interval": "Intervallo di aggiornamento applicato per le impostazioni del monitor (in secondi)", + "settings_variable_desc_playlist_default_time_sync": "Sincronizza le diapositive tra i lettori per la playlist predefinita", + "settings_variable_desc_slide_animation_enabled": "Abilita l'effetto di animazione tra le diapositive", + "settings_variable_desc_slide_animation_entrance_effect": "Effetto ingresso diapositiva", + "settings_variable_desc_slide_animation_exit_effect": "Effetto di uscita della diapositiva (meglio senza)", + "settings_variable_desc_slide_animation_speed": "Velicita animazione slide", + "settings_variable_desc_ro_start_counter": "Avvia contatore", + "settings_variable_desc_ro_last_folder_content": "Cartella corrente in Esplora contenuti", + "settings_variable_desc_ro_last_folder_node_player": "Cartella corrente in Player Explorer", + "settings_variable_desc_ro_editable": "Data/ora dell'ultimo riavvio dell'applicazione", + "settings_variable_desc_ro_last_slide_update": "Data e ora dell'ultimo aggiornamento della diapositiva", + "settings_variable_desc_ro_refresh_player_request": "Data e ora della richiesta di aggiornamento dell monitor", + "sysinfo_page_title": "Informazione sistema", + "sysinfo_panel_button_restart": "Riavvia", + "sysinfo_panel_table_section_system": "Sistema", + "sysinfo_panel_table_section_application": "Applicazione", + "sysinfo_panel_title": "Informazioni", + "sysinfo_panel_th_attribute": "Attributi", + "sysinfo_panel_th_value": "Valore", + "sysinfo_panel_td_ipaddr": "Indirizzo ip", + "logs_page_title": "Logs", + "logs_panel_last_logs": "Logs (ultime 100 righe)", + "js_sysinfo_restart_confirmation": "Sei sicuro?", + "js_sysinfo_restart_loading": "Riavvio in corso, attendi...", + "basic_day_1": "Lunedi", + "basic_day_2": "Martedi", + "basic_day_3": "Mercoledi", + "basic_day_4": "Giovedi", + "basic_day_5": "Venerdi", + "basic_day_6": "Sabato", + "basic_day_7": "Domenica", + "basic_month_1": "Gennaio", + "basic_month_2": "Febbrazio", + "basic_month_3": "Marzo", + "basic_month_4": "Aprile", + "basic_month_5": "Maggio", + "basic_month_6": "Giugno", + "basic_month_7": "Luglio", + "basic_month_8": "Agosto", + "basic_month_9": "Settembre", + "basic_month_10": "Ottobre", + "basic_month_11": "Novembre", + "basic_month_12": "Dicembre", + "common_untitled": "", + "common_loading": "Caricamento...", + "common_default_node_player_group": "Playgroup di default", + "common_default_playlist": "Default playlist", + "common_unknown_ipaddr": "IP sconosciuto", + "common_empty": "[Empty]", + "common_are_you_sure": "Sei sicuro?", + "common_enable_plugin": "Attiva questo plugin", + "common_save": "Salva", + "common_cancel": "Annulla", + "common_close": "Chiudi", + "common_confirm": "Conferma", + "common_submit": "Invia", + "common_validate": "Convalida", + "common_apply": "Applica", + "common_saved": "Le modifiche sono state salvate", + "common_new_folder": "Nuovo Cartella", + "common_folder_not_empty_error": "La cartella non è vuota, devi prima eliminarne il contenuto", + "logout": "Logout", + "login_error_not_found": "Credenziali errate", + "login_error_bad_credentials": "Credenziali errate", + "login_form_title": "Accedi", + "login_form_username": "Username", + "login_form_password": "Password", + "login_form_submit": "Connetti", + "utrack_title": "Utente", + "created_at": "Creato il", + "updated_at": "Modificato il", + "created_by": "Creato da", + "updated_by": "Aggiornato da", + "close": "Chiuso", + "anonymous": "Anonimo", + "enum_animation_speed_slower": "Lentamente", + "enum_animation_speed_slow": "Lento", + "enum_animation_speed_normal": "Normale", + "enum_animation_speed_fast": "Veloce", + "enum_animation_speed_faster": "Velocemente", + "enum_variable_section_general": "1. Generale", + "enum_variable_section_player_options": "2. Opzioni monitor", + "enum_variable_section_player_animation": "3. Animazioni monitor", + "enum_variable_section_playlist": "4. Playlist", + "enum_variable_section_fleet": "5. Gestione panoramica", + "enum_variable_section_security": "6. Sicurezza", + "enum_application_language_english": "Inglese", + "enum_application_language_french": "Francese", + "enum_application_language_italian": "Italiano", + "enum_application_language_spanish": "Spagnolo", + "enum_content_type_url": "URL", + "enum_content_type_video": "Video", + "enum_content_type_picture": "Immagine", + "enum_content_type_youtube": "Youtube", + "enum_content_type_url_object_label": "Inserisci il collegamento URL", + "enum_content_type_video_object_label": "Carica il tuo video (solo MP4)", + "enum_content_type_picture_object_label": "Carica la tua immagine", + "enum_content_type_youtube_object_label": "Inserisci l'URL del video Youtube", + "enum_operating_system_raspbian": "Raspbian", + "enum_operating_system_debian": "Debian", + "enum_operating_system_windows": "Windows", + "enum_operating_system_macos": "MacOS", + "enum_operating_system_fedora": "Fedora", + "enum_operating_system_ubuntu": "Ubuntu", + "enum_operating_system_suse": "Suse", + "enum_operating_system_redhat": "RedHat", + "enum_operating_system_centos": "CentOS", + "enum_operating_system_other": "Altro", + "sysinfo_rpi_model": "Raspberry Pi Model", + "sysinfo_rpi_model_unknown": "Informazioni Raspberry Pi non disponibili", + "sysinfo_storage_free_space": "Spazio libero", + "sysinfo_memory_usage": "Memoria usata", + "sysinfo_os_version": "OS Version", + "sysinfo_install_directory": "Percorso installazione", + "sysinfo_network_interface": "interfaccia di rete", + "sysinfo_mac_address": "Indirizzo MAC", + "sysinfo_ip_address": "indirizzo IP", + "player_default_welcome_message": "Per gestire questo lettore, vai al browser all'indirizzo %link%" } \ No newline at end of file diff --git a/src/Application.py b/src/Application.py index 1f3970a..9ab0ae6 100644 --- a/src/Application.py +++ b/src/Application.py @@ -24,6 +24,11 @@ class Application: signal.signal(signal.SIGINT, self.signal_handler) def start(self) -> None: + variable = self._model_store.variable().get_one_by_name('start_counter') + + if variable: + self._model_store.variable().update_by_name(variable.name, variable.as_int() + 1) + self._web_server.run() def signal_handler(self, signal, frame) -> None: diff --git a/src/controller/AuthController.py b/src/controller/AuthController.py index e0753a8..46cab46 100644 --- a/src/controller/AuthController.py +++ b/src/controller/AuthController.py @@ -30,17 +30,17 @@ class AuthController(ObController): login_error = None if current_user.is_authenticated: - return redirect(url_for('slideshow_slide_list')) + return redirect(url_for('playlist')) if not self._model_store.variable().map().get('auth_enabled').as_bool(): - return redirect(url_for('slideshow_slide_list')) + return redirect(url_for('playlist')) if len(request.form): user = self._model_store.user().get_one_by_username(request.form['username'], enabled=True) if user: if user.password == self._model_store.user().encode_password(request.form['password']): login_user(user) - return redirect(url_for('slideshow_slide_list')) + return redirect(url_for('playlist')) else: login_error = 'bad_credentials' else: diff --git a/src/controller/PlayerController.py b/src/controller/PlayerController.py index c0f07fb..2ba7d04 100644 --- a/src/controller/PlayerController.py +++ b/src/controller/PlayerController.py @@ -37,13 +37,22 @@ class PlayerController(ObController): playlist_id = current_playlist.id if current_playlist else None items = self._get_playlist(playlist_id=playlist_id, preview_content_id=preview_content_id) + intro_slide_duration = self._model_store.variable().get_one_by_name('intro_slide_duration').eval() + + if items['preview_mode'] or request.args.get('intro', '1') == '0': + intro_slide_duration = 0 + + animation_enabled = self._model_store.variable().get_one_by_name('slide_animation_enabled').eval() + + if request.args.get('animation', '1') == '0': + animation_enabled = False return render_template( 'player/player.jinja.html', items=items, - default_slide_duration=0 if items['preview_mode'] else self._model_store.variable().get_one_by_name('default_slide_duration').eval(), + intro_slide_duration=intro_slide_duration, polling_interval=self._model_store.variable().get_one_by_name('polling_interval'), - slide_animation_enabled=self._model_store.variable().get_one_by_name('slide_animation_enabled'), + slide_animation_enabled=animation_enabled, slide_animation_entrance_effect=self._model_store.variable().get_one_by_name('slide_animation_entrance_effect'), slide_animation_exit_effect=self._model_store.variable().get_one_by_name('slide_animation_exit_effect'), slide_animation_speed=self._model_store.variable().get_one_by_name('slide_animation_speed'), diff --git a/src/controller/PlaylistController.py b/src/controller/PlaylistController.py index 7862d8f..b57e520 100644 --- a/src/controller/PlaylistController.py +++ b/src/controller/PlaylistController.py @@ -1,6 +1,7 @@ import json -from flask import Flask, render_template, redirect, request, url_for, jsonify +from flask import Flask, render_template, redirect, request, url_for, jsonify, abort +from src.exceptions.PlaylistSlugAlreadyExist import PlaylistSlugAlreadyExist from src.service.ModelStore import ModelStore from src.model.entity.Playlist import Playlist from src.interface.ObController import ObController @@ -17,20 +18,31 @@ class PlaylistController(ObController): return decorated_function def register(self): - self._app.add_url_rule('/playlist/list', 'playlist_list', self.guard_playlist(self._auth(self.playlist_list)), methods=['GET']) + self._app.add_url_rule('/playlist', 'playlist', self.guard_playlist(self._auth(self.playlist)), methods=['GET']) + self._app.add_url_rule('/playlist/list/', 'playlist_list', self.guard_playlist(self._auth(self.playlist_list)), methods=['GET']) self._app.add_url_rule('/playlist/add', 'playlist_add', self.guard_playlist(self._auth(self.playlist_add)), methods=['POST']) - self._app.add_url_rule('/playlist/edit', 'playlist_edit', self.guard_playlist(self._auth(self.playlist_edit)), methods=['POST']) - self._app.add_url_rule('/playlist/toggle', 'playlist_toggle', self.guard_playlist(self._auth(self.playlist_toggle)), methods=['POST']) - self._app.add_url_rule('/playlist/delete', 'playlist_delete', self.guard_playlist(self._auth(self.playlist_delete)), methods=['DELETE']) + self._app.add_url_rule('/playlist/save', 'playlist_save', self.guard_playlist(self._auth(self.playlist_save)), methods=['POST']) + self._app.add_url_rule('/playlist/delete/', 'playlist_delete', self.guard_playlist(self._auth(self.playlist_delete)), methods=['GET']) - def playlist_list(self): + def playlist(self): + return redirect(url_for('playlist_list', playlist_id=0)) + + def playlist_list(self, playlist_id: int = 0): + current_playlist = self._model_store.playlist().get(playlist_id) + playlists = self._model_store.playlist().get_all(sort="created_at", ascending=False) durations = self._model_store.playlist().get_durations_by_playlists() + + if not current_playlist and len(playlists) > 0: + current_playlist = playlists[0] + return render_template( 'playlist/list.jinja.html', - playlists=self._model_store.playlist().get_all(ascending=True), - enabled_playlists=self._model_store.playlist().get_enabled_playlists(with_default=True), - disabled_playlists=self._model_store.playlist().get_disabled_playlists(), - durations=durations + error=request.args.get('error', None), + current_playlist=current_playlist, + playlists=playlists, + durations=durations, + slides=self._model_store.slide().get_slides(playlist_id=current_playlist.id), + contents={content.id: content for content in self._model_store.content().get_contents()}, ) def playlist_add(self): @@ -40,32 +52,28 @@ class PlaylistController(ObController): time_sync=False ) - self._model_store.playlist().add_form(playlist) + try: + playlist = self._model_store.playlist().add_form(playlist) + except PlaylistSlugAlreadyExist as e: + abort(409) - return redirect(url_for('playlist_list')) + return redirect(url_for('playlist_list', playlist_id=playlist.id)) - def playlist_edit(self): + def playlist_save(self): self._model_store.playlist().update_form( id=request.form['id'], name=request.form['name'], - time_sync=request.form['time_sync'], + time_sync=True if 'time_sync' in request.form else False, + enabled=True if 'enabled' in request.form else False ) - return redirect(url_for('playlist_list')) + return redirect(url_for('playlist_list', playlist_id=request.form['id'])) - def playlist_toggle(self): - data = request.get_json() - self._model_store.playlist().update_enabled(data.get('id'), data.get('enabled')) - return jsonify({'status': 'ok'}) + def playlist_delete(self, playlist_id: int): + if self._model_store.slide().count_slides_for_playlist(playlist_id) > 0: + return redirect(url_for('playlist_list', playlist_id=playlist_id, error='playlist_delete_has_slides')) - def playlist_delete(self): - data = request.get_json() - id = data.get('id') + if self._model_store.node_player_group().count_node_player_groups_for_playlist(playlist_id) > 0: + return redirect(url_for('playlist_list', playlist_id=playlist_id, error='playlist_delete_has_node_player_groups')) - if self._model_store.slide().count_slides_for_playlist(id) > 0: - return jsonify({'status': 'error', 'message': self.t('playlist_delete_has_slides')}), 400 - - if self._model_store.node_player_group().count_node_player_groups_for_playlist(id) > 0: - return jsonify({'status': 'error', 'message': self.t('playlist_delete_has_node_player_groups')}), 400 - - self._model_store.playlist().delete(id) - return jsonify({'status': 'ok'}) + self._model_store.playlist().delete(playlist_id) + return redirect(url_for('playlist')) diff --git a/src/controller/SlideController.py b/src/controller/SlideController.py index 22e090a..c4b49d8 100644 --- a/src/controller/SlideController.py +++ b/src/controller/SlideController.py @@ -16,31 +16,14 @@ class SlideController(ObController): def register(self): self._app.add_url_rule('/manage', 'manage', self.manage, methods=['GET']) - self._app.add_url_rule('/slideshow', 'slideshow_slide_list', self._auth(self.slideshow), methods=['GET']) - self._app.add_url_rule('/slideshow/playlist/set/', 'slideshow_slide_list_playlist_use', self._auth(self.slideshow), methods=['GET']) self._app.add_url_rule('/slideshow/slide/add', 'slideshow_slide_add', self._auth(self.slideshow_slide_add), methods=['POST']) self._app.add_url_rule('/slideshow/slide/edit', 'slideshow_slide_edit', self._auth(self.slideshow_slide_edit), methods=['POST']) - self._app.add_url_rule('/slideshow/slide/toggle', 'slideshow_slide_toggle', self._auth(self.slideshow_slide_toggle), methods=['POST']) self._app.add_url_rule('/slideshow/slide/delete', 'slideshow_slide_delete', self._auth(self.slideshow_slide_delete), methods=['DELETE']) self._app.add_url_rule('/slideshow/slide/position', 'slideshow_slide_position', self._auth(self.slideshow_slide_position), methods=['POST']) - self._app.add_url_rule('/slideshow/player-refresh', 'slideshow_player_refresh', self._auth(self.slideshow_player_refresh), methods=['GET']) + self._app.add_url_rule('/slideshow/player-refresh', 'slideshow_player_refresh/', self._auth(self.slideshow_player_refresh), methods=['GET']) def manage(self): - return redirect(url_for('slideshow_slide_list')) - - def slideshow(self, playlist_id: int = 0): - current_playlist = self._model_store.playlist().get(playlist_id) - playlist_id = current_playlist.id if current_playlist else None - return render_template( - 'slideshow/slides/list.jinja.html', - current_playlist=current_playlist, - playlists=self._model_store.playlist().get_enabled_playlists(), - enabled_slides=self._model_store.slide().get_slides(playlist_id=playlist_id, enabled=True), - disabled_slides=self._model_store.slide().get_slides(playlist_id=playlist_id, enabled=False), - var_last_restart=self._model_store.variable().get_one_by_name('last_restart'), - contents={content.id: content.name for content in self._model_store.content().get_contents()}, - enum_content_type=ContentType - ) + return redirect(url_for('playlist')) def slideshow_slide_add(self): content = None @@ -67,9 +50,9 @@ class SlideController(ObController): self._post_update() if slide.playlist_id: - return redirect(url_for('slideshow_slide_list_playlist_use', playlist_id=slide.playlist_id)) + return redirect(url_for('playlist_list', playlist_id=slide.playlist_id)) - return redirect(url_for('slideshow_slide_list')) + return redirect(url_for('playlist')) def slideshow_slide_edit(self): slide = self._model_store.slide().update_form( @@ -83,15 +66,9 @@ class SlideController(ObController): self._post_update() if slide.playlist_id: - return redirect(url_for('slideshow_slide_list_playlist_use', playlist_id=slide.playlist_id)) + return redirect(url_for('playlist_list', playlist_id=slide.playlist_id)) - return redirect(url_for('slideshow_slide_list')) - - def slideshow_slide_toggle(self): - data = request.get_json() - self._model_store.slide().update_enabled(data.get('id'), data.get('enabled')) - self._post_update() - return jsonify({'status': 'ok'}) + return redirect(url_for('playlist')) def slideshow_slide_delete(self): data = request.get_json() @@ -105,11 +82,12 @@ class SlideController(ObController): self._post_update() return jsonify({'status': 'ok'}) - def slideshow_player_refresh(self): + def slideshow_player_refresh(self, playlist_id: int): self._model_store.variable().update_by_name("refresh_player_request", time.time()) return redirect( url_for( - 'slideshow_slide_list', + 'playlist_list', + playlist_id=playlist_id, refresh_player=self._model_store.variable().get_one_by_name('polling_interval').as_int() ) ) diff --git a/src/exceptions/PlaylistSlugAlreadyExist.py b/src/exceptions/PlaylistSlugAlreadyExist.py new file mode 100644 index 0000000..0f3113e --- /dev/null +++ b/src/exceptions/PlaylistSlugAlreadyExist.py @@ -0,0 +1,2 @@ +class PlaylistSlugAlreadyExist(Exception): + pass diff --git a/src/manager/DatabaseManager.py b/src/manager/DatabaseManager.py index d7f8809..e34ce3e 100644 --- a/src/manager/DatabaseManager.py +++ b/src/manager/DatabaseManager.py @@ -120,8 +120,13 @@ class DatabaseManager: params=tuple(v for v in values.values()) ) - def get_one_by_query(self, table_name: str, query: str = "1=1", sort: Optional[str] = None, ascending=True, values: dict = {}) -> list: - query = "select * from {} where {} {}".format(table_name, query, "ORDER BY {} {}".format(sort, "ASC" if ascending else "DESC") if sort else "") + def get_one_by_query(self, table_name: str, query: str = "1=1", values: dict = {}, sort: Optional[str] = None, ascending=True, limit: Optional[int] = None) -> list: + query = "select * from {} where {} {} {}".format( + table_name, + query, + "ORDER BY {} {}".format(sort, "ASC" if ascending else "DESC") if sort else "", + "LIMIT {}".format(limit) if limit else "" + ) lines = self.execute_read_query(query=query, params=tuple(v for v in values.values())) count = len(lines) @@ -216,6 +221,7 @@ class DatabaseManager: "DROP TABLE IF EXISTS fleet_studio", "ALTER TABLE slideshow RENAME TO slides", "DELETE FROM settings WHERE name = 'fleet_studio_enabled'", + "DELETE FROM settings WHERE name = 'default_slide_duration'", "UPDATE content SET uuid = id WHERE uuid = '' or uuid is null", ] diff --git a/src/manager/NodePlayerGroupManager.py b/src/manager/NodePlayerGroupManager.py index e540199..f9a40da 100644 --- a/src/manager/NodePlayerGroupManager.py +++ b/src/manager/NodePlayerGroupManager.py @@ -72,10 +72,9 @@ class NodePlayerGroupManager(ModelManager): def get_node_players_groups(self, playlist_id: Optional[int] = None) -> List[NodePlayerGroup]: query = " 1=1 " + if playlist_id: query = "{} {}".format(query, "AND playlist_id = {}".format(playlist_id)) - else: - query = "{} {}".format(query, "AND playlist_id is NULL") return self.get_by(query=query, sort="name") diff --git a/src/manager/PlaylistManager.py b/src/manager/PlaylistManager.py index 010b4d4..45f257d 100644 --- a/src/manager/PlaylistManager.py +++ b/src/manager/PlaylistManager.py @@ -3,7 +3,8 @@ import os from typing import Dict, Optional, List, Tuple, Union from src.model.entity.Playlist import Playlist -from src.util.utils import get_optional_string, get_yt_video_id, slugify +from src.util.utils import get_optional_string, get_yt_video_id, slugify, slugify_next +from src.exceptions.PlaylistSlugAlreadyExist import PlaylistSlugAlreadyExist from src.manager.DatabaseManager import DatabaseManager from src.manager.SlideManager import SlideManager from src.manager.LangManager import LangManager @@ -54,8 +55,8 @@ class PlaylistManager(ModelManager): def get_by(self, query, sort: Optional[str] = None, values: dict = {}) -> List[Playlist]: return self.hydrate_list(self._db.get_by_query(self.TABLE_NAME, query=query, sort=sort, values=values)) - def get_one_by(self, query, values: dict = {}) -> Optional[Playlist]: - object = self._db.get_one_by_query(self.TABLE_NAME, query=query, values=values) + def get_one_by(self, query, values: dict = {}, sort: Optional[str] = None, ascending=True, limit: Optional[int] = None) -> Optional[Playlist]: + object = self._db.get_one_by_query(self.TABLE_NAME, query=query, values=values, sort=sort, ascending=ascending, limit=limit) if not object: return None @@ -105,8 +106,25 @@ class PlaylistManager(ModelManager): for playlist_id, edits in edits_playlists.items(): self._db.update_by_id(self.TABLE_NAME, playlist_id, edits) + def get_available_slug(self, slug) -> str: + known_playlist = {"slug": slug} + next_slug = slug + while known_playlist is not None: + next_slug = slugify_next(next_slug) + known_playlist = self.get_one_by(query="slug = ?", values={"slug": next_slug}, sort="created_at", ascending=False, limit=1) + + return next_slug + def pre_add(self, playlist: Dict) -> Dict: playlist["slug"] = slugify(playlist["name"]) + + known_playlist = self.get_one_by(query="slug = ?", values={ + "slug": playlist["slug"] + }, sort="created_at", ascending=False, limit=1) + + if known_playlist: + playlist["slug"] = self.get_available_slug(playlist["slug"]) + self.user_manager.track_user_on_create(playlist) self.user_manager.track_user_on_update(playlist) return playlist @@ -131,7 +149,7 @@ class PlaylistManager(ModelManager): def post_delete(self, playlist_id: str) -> str: return playlist_id - def update_form(self, id: int, name: str, time_sync: bool) -> None: + def update_form(self, id: int, name: str, time_sync: bool, enabled: bool) -> None: playlist = self.get(id) if not playlist: @@ -139,13 +157,14 @@ class PlaylistManager(ModelManager): form = { "name": name, - "time_sync": time_sync + "time_sync": time_sync, + "enabled": enabled } self._db.update_by_id(self.TABLE_NAME, id, self.pre_update(form)) self.post_update(id) - def add_form(self, playlist: Union[Playlist, Dict]) -> None: + def add_form(self, playlist: Union[Playlist, Dict]) -> Playlist: form = playlist if not isinstance(playlist, dict): @@ -153,7 +172,11 @@ class PlaylistManager(ModelManager): del form['id'] self._db.add(self.TABLE_NAME, self.pre_add(form)) + playlist = self.get_one_by(query="slug = ?", values={ + "slug": form["slug"] + }) self.post_add(playlist.id) + return playlist def delete(self, id: int) -> None: playlist = self.get(id) diff --git a/src/manager/SlideManager.py b/src/manager/SlideManager.py index 7246a98..8b3940c 100644 --- a/src/manager/SlideManager.py +++ b/src/manager/SlideManager.py @@ -73,13 +73,14 @@ class SlideManager(ModelManager): for slide_id, edits in edits_slides.items(): self._db.update_by_id(self.TABLE_NAME, slide_id, edits) - def get_slides(self, playlist_id: Optional[int] = None, content_id: Optional[int] = None, enabled: bool = True) -> List[Slide]: - query = "enabled = {}".format("1" if enabled else "0") + def get_slides(self, playlist_id: Optional[int] = None, content_id: Optional[int] = None, enabled: Optional[bool] = None) -> List[Slide]: + query = " 1=1 " + + if enabled is not None: + query = "{} AND enabled = {} ".format(query, "1" if enabled else "0") if playlist_id: query = "{} {}".format(query, "AND playlist_id = {}".format(playlist_id)) - else: - query = "{} {}".format(query, "AND playlist_id is NULL") if content_id: query = "{} {}".format(query, "AND content_id = {}".format(content_id)) diff --git a/src/manager/VariableManager.py b/src/manager/VariableManager.py index f50300a..101be72 100644 --- a/src/manager/VariableManager.py +++ b/src/manager/VariableManager.py @@ -1,5 +1,6 @@ import json import time +import math from typing import Dict, Optional, List, Tuple, Union from src.manager.DatabaseManager import DatabaseManager @@ -111,7 +112,7 @@ class VariableManager: {"name": "slide_upload_limit", "section": self.t(VariableSection.GENERAL), "value": 32, "unit": VariableUnit.MEGABYTE, "type": VariableType.INT, "editable": True, "description": self.t('settings_variable_desc_slide_upload_limit'), "refresh_player": False}, ### Player Options - {"name": "default_slide_duration", "section": self.t(VariableSection.PLAYER_OPTIONS), "value": 3, "unit": VariableUnit.SECOND, "type": VariableType.INT, "editable": True, "description": self.t('settings_variable_desc_default_slide_duration'), "refresh_player": False}, + {"name": "intro_slide_duration", "section": self.t(VariableSection.PLAYER_OPTIONS), "value": 3, "unit": VariableUnit.SECOND, "type": VariableType.INT, "editable": True, "description": self.t('settings_variable_desc_intro_slide_duration'), "refresh_player": False}, {"name": "default_slide_time_with_seconds", "section": self.t(VariableSection.PLAYER_OPTIONS), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_default_slide_time_with_seconds'), "refresh_player": False}, {"name": "polling_interval", "section": self.t(VariableSection.PLAYER_OPTIONS), "value": 5, "unit": VariableUnit.SECOND, "type": VariableType.INT, "editable": True, "description": self.t('settings_variable_desc_polling_interval'), "refresh_player": True}, @@ -132,6 +133,7 @@ class VariableManager: {"name": "auth_enabled", "section": self.t(VariableSection.SECURITY), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_auth_enabled'), "description_edition": self.t('settings_variable_desc_edition_auth_enabled'), "refresh_player": False}, # Not editable (System information) + {"name": "start_counter", "value": 0, "type": VariableType.INT, "editable": False, "description": self.t('settings_variable_desc_ro_start_counter')}, {"name": "last_folder_content", "value": FOLDER_ROOT_PATH, "type": VariableType.STRING, "editable": False, "description": self.t('settings_variable_desc_ro_last_folder_content')}, {"name": "last_folder_node_player", "value": FOLDER_ROOT_PATH, "type": VariableType.STRING, "editable": False, "description": self.t('settings_variable_desc_ro_last_folder_node_player')}, {"name": "last_restart", "value": time.time(), "type": VariableType.TIMESTAMP, "editable": False, "description": self.t('settings_variable_desc_ro_editable')}, diff --git a/src/model/entity/Playlist.py b/src/model/entity/Playlist.py index 96a8105..572145e 100644 --- a/src/model/entity/Playlist.py +++ b/src/model/entity/Playlist.py @@ -89,7 +89,7 @@ class Playlist: return f"Playlist(" \ f"id='{self.id}',\n" \ f"name='{self.name}',\n" \ - f"nameslug='{self.slug}',\n" \ + f"slug='{self.slug}',\n" \ f"enabled='{self.enabled}',\n" \ f"time_sync='{self.time_sync}',\n" \ f"created_by='{self.created_by}',\n" \ diff --git a/src/model/enum/HookType.py b/src/model/enum/HookType.py index c29b8db..73eb49e 100644 --- a/src/model/enum/HookType.py +++ b/src/model/enum/HookType.py @@ -3,11 +3,6 @@ from enum import Enum class HookType(Enum): - H_SLIDESHOW_SLIDES_TOOLBAR_ACTIONS_START = 'h_slideshow_slides_toolbar_actions_start' - H_SLIDESHOW_SLIDES_TOOLBAR_ACTIONS_END = 'h_slideshow_slides_toolbar_actions_end' - H_SLIDESHOW_SLIDES_CSS = 'h_slideshow_slides_css' - H_SLIDESHOW_SLIDES_JAVASCRIPT = 'h_slideshow_slides_javascript' - H_SLIDESHOW_CONTENT_TOOLBAR_ACTIONS_START = 'h_slideshow_toolbar_actions_start' H_SLIDESHOW_CONTENT_TOOLBAR_ACTIONS_END = 'h_slideshow_toolbar_actions_end' H_SLIDESHOW_CONTENT_CSS = 'h_slideshow_css' diff --git a/src/util/utils.py b/src/util/utils.py index 8662ad1..d20e24b 100644 --- a/src/util/utils.py +++ b/src/util/utils.py @@ -255,3 +255,13 @@ def merge_dicts(dict1, dict2): def dictsort(dict1, attribute="position"): return dict(sorted(dict1.items(), key=lambda item: item[1][attribute])) + + +def slugify_next(slug: str) -> str: + parts = slug.rsplit('-', 1) + + if len(parts) > 1 and parts[-1].isdigit(): + next_number = int(parts[-1]) + 1 + return f"{parts[0]}-{next_number}" + else: + return f"{slug}-1" diff --git a/views/base.jinja.html b/views/base.jinja.html index c82820b..ae15b58 100755 --- a/views/base.jinja.html +++ b/views/base.jinja.html @@ -59,7 +59,7 @@ "position": 0, "pills": [ {"name": "Bibliothèque", "route": "slideshow_content_list", "icon": "fa-image"}, - {"name": "Playlists", "route": "playlist_list", "icon": "fa-play"}, + {"name": "Playlists", "route": "playlist", "icon": "fa-play"}, ] }, "configuration": { @@ -115,7 +115,7 @@ {% block header %}

- + Obscreen @@ -164,7 +164,8 @@

- {{ HOOK(H_SLIDESHOW_CONTENT_TOOLBAR_ACTIONS_START) }} + {{ HOOK(H_FLEET_NODE_PLAYER_TOOLBAR_ACTIONS_START) }}
- {{ HOOK(H_SLIDESHOW_CONTENT_TOOLBAR_ACTIONS_END) }} + {{ HOOK(H_FLEET_NODE_PLAYER_TOOLBAR_ACTIONS_END) }}
@@ -74,7 +73,7 @@ {% set node_player_children = node_players[folder.id]|default([]) %} {% set has_children = folder.children or node_player_children %} -
  • +
  • {{ folder.name }} diff --git a/views/player/player.jinja.html b/views/player/player.jinja.html index ef121b4..ecb9dc0 100755 --- a/views/player/player.jinja.html +++ b/views/player/player.jinja.html @@ -5,7 +5,7 @@ - {% if slide_animation_enabled.eval() %} + {% if slide_animation_enabled %} {% endif %}