diff --git a/webclient/dist/css/main.css b/webclient/dist/css/main.css index 67c38a4..17df483 100644 --- a/webclient/dist/css/main.css +++ b/webclient/dist/css/main.css @@ -1,2 +1,2 @@ -@charset "UTF-8";@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Regular.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Medium.ttf) format("truetype");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf) format("truetype");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Bold.ttf) format("truetype");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Italic.ttf) format("truetype");font-weight:400;font-style:italic;font-display:swap}.container{padding:18px}.section{margin-bottom:48px}.section-title{margin-bottom:34px}.block{margin-bottom:34px}.block-title{margin-bottom:22px}.text,p{margin-bottom:15px}.hint{margin-top:8px}.list{padding-left:22px;margin-bottom:15px}.list-item{margin-bottom:8px}.list-nested{margin-top:8px}.table{margin-bottom:22px}.table-caption{margin-bottom:8px}.form-group{margin-bottom:15px}.label{margin-bottom:5px;display:block}.input,.select,.textarea{margin-top:5px}.toast{padding:15px}.toast-stack{gap:8px}html{font-size:100%}body{font-family:"IBM Plex Mono",monospace;font-size:16px;font-weight:400;line-height:1.6;letter-spacing:0}h1,h2,h3,h4,h5,h6{font-family:"IBM Plex Mono",monospace;font-weight:600;line-height:1.25;margin:0}h1.contrast,h2.contrast,h3.contrast,h4.contrast,h5.contrast,h6.contrast{background:#f8f8f8;color:#0a0a0d}h1{font-size:36px;letter-spacing:-.01em}h2{font-size:28px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px;font-weight:500}.text,p{font-size:16px;line-height:1.6}.text-sm{font-size:13px;line-height:1.4}.text-lg{font-size:17px;line-height:1.6}.text-muted{font-size:13px;color:#aaaeb2}.text-strong,strong{font-weight:600}.text-bold{font-weight:700}.text-italic,em{font-style:italic}.code,code,pre{font-family:"IBM Plex Mono",monospace;font-size:16px;line-height:1.4;background-color:#1a1a23}pre{font-size:16px;line-height:1.6;white-space:pre-wrap}.code,pre code{-o-tab-size:2;tab-size:2;-moz-tab-size:2}a{font-weight:500;text-decoration:none}.link{font-size:inherit;font-weight:500}.label{font-size:13px;font-weight:500;line-height:1.4}.hint,.meta{font-size:12px;line-height:1.4}.table{font-size:13px;line-height:1.4}.table th{font-weight:600}.table td{font-weight:400}.list{font-size:16px;line-height:1.6}.list-item{font-size:inherit}.modal-title{font-size:20px;font-weight:600}.modal-body{font-size:16px}.toast-title{font-size:14px;font-weight:600}.toast-text{font-size:13px;line-height:1.4}.palette{display:flex;flex-direction:row;gap:8px}.palette .color .color-box{width:100px;height:80px}body .bg-primary{background:#f8f8f8}body .bg-secondary{background:#00b3ff}body .bg-success{background:#0fa}body .bg-accent{background:#ff6f30}body .bg-info{background:#8a2ce2}body .bg-warning{background:#ffd900}body .bg-error{background:#ff3c00}body .text-color-primary{color:#f8f8f8}body .text-color-secondary{color:#00b3ff}body .text-color-success{color:#0fa}body .text-color-accent{color:#ff6f30}body .text-color-info{color:#8a2ce2}body .text-color-warning{color:#ffd900}body .text-color-error{color:#ff3c00}.loader{width:45px;aspect-ratio:1;--c:no-repeat linear-gradient(#FF3C00 0 0);background:var(--c) 0 0,var(--c) 0 100%,var(--c) 50% 0,var(--c) 50% 100%,var(--c) 100% 0,var(--c) 100% 100%;animation:l12 1s infinite}@keyframes l12{0%,100%{background-size:20% 50%}16.67%{background-size:20% 30%,20% 30%,20% 50%,20% 50%,20% 50%,20% 50%}33.33%{background-size:20% 30%,20% 30%,20% 30%,20% 30%,20% 50%,20% 50%}50%{background-size:20% 30%,20% 30%,20% 30%,20% 30%,20% 30%,20% 30%}66.67%{background-size:20% 50%,20% 50%,20% 30%,20% 30%,20% 30%,20% 30%}83.33%{background-size:20% 50%,20% 50%,20% 50%,20% 50%,20% 30%,20% 30%}}@keyframes icon_spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.btn{font-family:"IBM Plex Mono",monospace;font-size:17px;font-weight:600;line-height:1;letter-spacing:.04em;padding:12px 22px;border-radius:0;border-width:2px;border-left-width:6px;border-style:solid;border-color:#f8f8f8;text-transform:uppercase;background-color:transparent;transition-duration:.2s;transition-property:background-color,border-color,color}.btn.with-icon{border-left-width:48px;position:relative}.btn.with-icon .ph,.btn.with-icon .ph-bold{position:absolute;color:#0a0a0d;left:-48px;top:0;font-size:28px;height:100%;display:inline-flex;align-items:center;width:48px;justify-content:center;transition-duration:.2s;transition-property:color,left}.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph,.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph-bold{left:-28px}.btn.btn-primary{color:#f8f8f8;border-color:#f8f8f8}.btn.btn-primary:hover{background-color:#f8f8f8;color:#0a0a0d}.btn.btn-secondary{color:#00b3ff;border-color:#00b3ff}.btn.btn-secondary:hover{background-color:#00b3ff;color:#f8f8f8}.btn.btn-secondary:hover.with-icon .ph,.btn.btn-secondary:hover.with-icon .ph-bold{color:#f8f8f8}.btn.btn-accent{color:#ff6f30;border-color:#ff6f30}.btn.btn-accent:hover{background-color:#ff6f30;color:#f8f8f8}.btn.btn-accent:hover.with-icon .ph,.btn.btn-accent:hover.with-icon .ph-bold{color:#f8f8f8}.btn.btn-danger{color:#ff3c00;border-color:#ff3c00}.btn.btn-danger:hover{background-color:#ff3c00;color:#0a0a0d}.btn.btn-warning{color:#ffd900;border-color:#ffd900}.btn.btn-warning:hover{background-color:#ffd900;color:#0a0a0d}.btn.btn-success{color:#0fa;border-color:#0fa}.btn.btn-success:hover{background-color:#0fa;color:#0a0a0d}.btn.btn-info{color:#8a2ce2;border-color:#8a2ce2}.btn.btn-info:hover{background-color:#8a2ce2;color:#f8f8f8}.btn.btn-info:hover.with-icon .ph,.btn.btn-info:hover.with-icon .ph-bold{color:#f8f8f8}.btn[disabled]:not(.loading-state){color:#aaaeb2;border-color:#1a1a23;background-color:#1a1a23}.btn[disabled]:not(.loading-state).with-icon .ph,.btn[disabled]:not(.loading-state).with-icon .ph-bold{color:#aaaeb2}.btn[disabled]:not(.loading-state):hover{background-color:#1a1a23;color:#aaaeb2}.btn[disabled]:not(.loading-state):hover.with-icon .ph,.btn[disabled]:not(.loading-state):hover.with-icon .ph-bold{color:#aaaeb2}.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph,.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph-bold{left:-28px}.btn.btn-small{font-size:14px;font-weight:500;padding:8px 8px}.btn.btn-small.with-icon{border-left-width:32px}.btn.btn-small.with-icon .ph,.btn.btn-small.with-icon .ph-bold{left:-40px;font-size:23px}.btn.btn-small.with-icon.loading-state .ph,.btn.btn-small.with-icon.loading-state .ph-bold{font-size:30px}.btn.btn-large{font-size:20px;font-weight:700;padding:15px 48px}.btn.loading-state{color:#0a0a0d!important;border-color:#f8f8f8!important;background-color:#f8f8f8!important}.btn.loading-state .ph,.btn.loading-state .ph-bold{font-size:31px;transform-origin:50% 50%;animation:icon_spin 1.2s linear infinite}.btn-icon{display:flex;justify-content:center;align-items:center;width:30px;height:30px;background:0 0;color:#f8f8f8;font-size:20px;border:0;transition-duration:.2s;transition-property:color}.btn-icon .ph{transform:rotate(0);transition-duration:.2s;transition-property:transform}.btn-icon:not(.without-hover):hover{color:#aaaeb2}.btn-icon:not(.without-hover):hover .ph{transform:rotate(90deg)}.form-group .label{display:flex;flex-direction:column;font-size:17px;width:100%;max-width:600px;position:relative}.form-group .label>.ph{position:absolute;color:#f8f8f8;left:0;bottom:2px;font-size:28px;height:56px;display:inline-flex;align-items:center;width:48px;justify-content:center;transition-duration:.2s;transition-property:color,left}.form-group .label .input{font-family:"IBM Plex Mono",monospace;font-size:16px;font-weight:500;line-height:1;letter-spacing:.04em;padding:12px 22px;margin-top:8px;border-radius:0;border-width:2px;border-bottom-width:6px;border-style:solid;border-color:#f8f8f8;color:#f8f8f8;background-color:transparent;transition-duration:.2s;transition-property:background-color,border-color,color}.form-group .label .input:hover{border-bottom-color:#aaaeb2}.form-group .label .input:focus{outline:0;border-color:#00b3ff}.form-group .label .input::-moz-placeholder{color:#aaaeb2}.form-group .label .input::placeholder{color:#aaaeb2}.form-group .label textarea.input{height:120px;line-height:1.25;resize:none}.form-group .label .ph+.input,.form-group .label .ph+.select-wrap .select{padding-left:42px}.form-group .label .select-wrap{margin-top:8px}.form-group .label .select{width:100%;height:56px;margin-top:0;appearance:none;-webkit-appearance:none;-moz-appearance:none}.form-group .label .select:focus{outline:0}.form-group .label .select option{color:#f8f8f8;background:#1a1a23}.form-group .label .select-wrap::after{content:"";position:absolute;right:22px;bottom:18px;transform:translateY(-50%);width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:10px solid #f8f8f8;pointer-events:none}.form-group .label.error .input:not(:focus){border-color:#ff3c00}.form-group .label.error+.input-info{color:#ffd900}.form-group .input-info{font-size:14px;margin-top:8px}.form-group .input-info .ph{position:relative;top:1px}.radio{display:inline-flex;flex-direction:row;gap:8px;align-items:center}.radio input[type=radio]{display:none}.radio .radio-control{display:inline-block;border-radius:100%;border:2px solid #f8f8f8;width:20px;height:20px;background:0 0;transition-duration:.2s;transition-property:background,border-color}.radio:hover .radio-control{background:#4a4a57}.radio input[type=radio]:checked+.radio-control{background:#f8f8f8}.radio input[type=radio]:disabled+.radio-control{background:#4a4a57;border-color:#4a4a57}.radio .radio-label{font-size:17px}.checkbox{display:inline-flex;flex-direction:row;gap:8px;align-items:center}.checkbox input[type=checkbox]{display:none}.checkbox .checkbox-control{height:16px;width:30px;border:2px solid #f8f8f8;position:relative;background:0 0;transition-duration:.2s;transition-property:border-color,background;display:block}.checkbox .checkbox-control:before{content:"";display:block;height:20px;width:20px;background:#f8f8f8;position:absolute;left:-6px;top:-4px;transition-duration:.2s;transition-property:left,background}.checkbox:hover .checkbox-control{background:#4a4a57}.checkbox input[type=checkbox]:checked:not(:disabled)+.checkbox-control{background:#00b3ff;border-color:#00b3ff}.checkbox input[type=checkbox]:checked+.checkbox-control:before{left:12px}.checkbox input[type=checkbox]:disabled+.checkbox-control{border-color:#4a4a57}.checkbox input[type=checkbox]:disabled+.checkbox-control:before{background:#4a4a57}.list{display:flex;flex-direction:column;gap:5px;list-style-type:none;padding-left:0}.list .list-item{display:flex;flex-direction:row;align-items:center;gap:8px;margin-left:0}.list.list-ordered{list-style-type:decimal;display:list-item;margin-left:30px}.list.list-ordered .list-item{display:list-item}.list.list-definition{gap:15px}.list.list-definition .list-row{border-left:2px solid #f8f8f8}.list.list-definition .list-row .list-desc::before,.list.list-definition .list-row .list-term::before{content:"";height:2px;width:12px;position:absolute;top:50%;left:0;margin-top:-1px;display:block;background:#f8f8f8}.list.list-definition .list-row .list-desc,.list.list-definition .list-row .list-term{position:relative}.list.list-definition .list-row .list-term{padding-left:18px;font-size:20px}.list.list-definition .list-row .list-desc{padding-left:18px}.list.list-nav{max-width:420px;width:100%;gap:0}.list.list-nav .list-item{display:flex;flex-direction:column;align-items:flex-start;height:50px;margin:0}.list.list-nav .list-item .list-action{display:flex;justify-content:space-between;align-items:center;width:100%;height:100%;padding:8px 12px;border:0;font-size:17px;background:#1a1a23;color:inherit;transition-duration:.2s;transition-property:background}.list.list-nav .list-item .list-action:hover{background:#00b3ff}.list.list-nav .list-item .list-action .list-label{display:flex;flex-direction:row;gap:8px;align-items:center;letter-spacing:-.05em;font-weight:400}.list.list-nav .list-item .list-action .list-meta{padding:8px;background:#0fa;color:#0a0a0d;display:flex}.list.list-nav .list-item.list-item-active .list-action{background:#00b3ff}.list.list-actions{width:100%;max-width:420px;gap:22px}.list.list-actions .list-item{justify-content:space-between;align-items:flex-start}.list.list-actions .list-item .list-content{display:flex;flex-direction:column;gap:8px}.list.list-actions .list-item .list-content .list-title{font-size:20px;line-height:1}.badge{background:#f8f8f8;color:#1a1a23;padding:5px 8px;font-size:16px;display:inline-block}.badge.badge-success{background:#0fa}.badge.badge-warning{background:#ffd900}.badge.badge-danger,.badge.badge-error{background:#ff3c00}.badge.badge-info{background:#8a2ce2;color:#f8f8f8}.badge.badge-secondary{background:#00b3ff;color:#f8f8f8}.table{text-align:left;border:2px solid #f8f8f8;padding:15px}.table .table-caption{text-align:left;font-size:20px;background:#f8f8f8;width:-moz-max-content;width:max-content;color:#1a1a23;padding:5px 12px;margin-bottom:0}.table.table-empty{width:100%}.table.table-empty .is-empty{width:100%;padding:15px;font-size:16px;color:#aaaeb2;text-align:left}.table .table-row td,.table .table-row th{padding:12px 18px;font-size:16px;vertical-align:top}.table .table-foot td,.table .table-foot th{padding-top:15px}.toast{position:fixed;bottom:-100px;right:15px;max-width:420px;background:#1a1a23;border:2px solid #f8f8f8;padding:0;opacity:0;transition-duration:.25s;transition-property:opacity,top,bottom}.toast.a-show{bottom:15px;opacity:1}.toast.a-hide{bottom:115px;opacity:0}.toast .toast-content{display:flex;flex-direction:column;gap:0}.toast .toast-content .toast-title{font-size:24px;display:flex;flex-direction:row;gap:8px;align-items:center;color:#0a0a0d;background:#f8f8f8;padding:5px 8px;padding-right:42px}.toast .toast-content .toast-text{font-size:16px;padding:22px 15px;margin:0}.toast .toast-close{position:absolute;top:0;right:0;color:#0a0a0d;height:40px;width:40px}.toast .toast-close:hover{color:#1a1a23}.toast.toast-success{border-color:#0fa}.toast.toast-success .toast-title{background:#0fa}.toast.toast-warning{border-color:#ffd900}.toast.toast-warning .toast-title{background:#ffd900}.toast.toast-danger{border-color:#ff3c00}.toast.toast-danger .toast-title{background:#ff3c00}.card{max-width:420px;width:100%;border:2px solid #f8f8f8}.card .card-title{color:#0a0a0d;background:#f8f8f8;padding:8px 12px}.card .card-content{padding:15px}.card .card-content .card-thumb{width:100%}.card .card-content p{margin-top:8px;margin-bottom:0}.card .card-footer{padding:8px 15px;padding-bottom:15px}.card.device-action{max-width:220px;transition-duration:.2s;transition-property:border-color}.card.device-action .device-icon-container{position:relative}.card.device-action .device-icon-container .device-online-status{position:absolute;top:-15px;left:-5px;font-size:24px;color:#ff3c00}.card.device-action .device-icon-container .device-online-status.status-online{color:#0fa}.card.device-action .device-icon-container .device-icon{display:flex;flex-direction:row;align-items:center;justify-content:center;font-size:64px;height:120px;width:100%;transition-duration:.2s;transition-property:color}.card.device-action .card-title{display:flex;width:100%;font-size:14px;font-weight:700;align-items:center;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;transition-duration:.2s;transition-property:background-color,color}.card.device-action .device-name{font-size:14px;line-height:1.4}.card.device-action.card-success{border-color:#0fa}.card.device-action.card-success .card-title{background:#0fa}.card.device-action.card-success .device-icon{color:#0fa}.card.device-action.card-warning{border-color:#ffd900}.card.device-action.card-warning .card-title{background:#ffd900}.card.device-action.card-warning .device-icon{color:#ffd900}.card.device-action.card-info{border-color:#8a2ce2}.card.device-action.card-info .card-title{background:#8a2ce2;color:#f8f8f8}.card.device-action.card-info .device-icon{color:#8a2ce2}.card.device-action.card-secondary{border-color:#00b3ff}.card.device-action.card-secondary .card-title{background:#00b3ff;color:#f8f8f8}.card.device-action.card-secondary .device-icon{color:#00b3ff}.card.device-action.card-danger,.card.device-action.card-error{border-color:#ff3c00}.card.device-action.card-danger .card-title,.card.device-action.card-error .card-title{background:#ff3c00}.card.device-action.card-danger .device-icon,.card.device-action.card-error .device-icon{color:#ff3c00}.modal{position:fixed;top:0;bottom:0;left:0;right:0;z-index:1000;display:flex;flex-direction:column;align-items:center;justify-content:center}.modal .modal-backdrop{position:fixed;z-index:1010;top:0;bottom:0;left:0;right:0;background:#0a0a0d;opacity:0;transition-duration:.25s;transition-property:opacity}.modal .modal-panel{position:relative;z-index:1020;width:100%;max-width:960px;height:auto;min-height:200px;max-height:800px;padding:0;display:flex;flex-direction:column;gap:15px;margin-top:200px;background:#0a0a0d;border:2px solid #f8f8f8;opacity:0;transition-duration:.25s;transition-property:opacity,margin-top}.modal .modal-panel .modal-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-right:15px}.modal .modal-panel .modal-header .modal-title{padding:12px 15px;background:#f8f8f8;color:#0a0a0d;text-transform:uppercase}.modal .modal-panel .modal-body{max-height:700px;overflow-y:auto;padding:18px}.modal .modal-panel .modal-footer{padding:18px}.modal .modal-panel .modal-footer .actions{display:flex;flex-direction:row;justify-content:flex-end;gap:15px;width:100%}.modal.a-show .modal-backdrop{opacity:1}.modal.a-show .modal-panel{opacity:1;margin-top:0}.modal.a-hide .modal-backdrop{opacity:0}.modal.a-hide .modal-panel{opacity:0;margin-top:-200px}.alert{padding:12px 15px;border-left-style:solid;border-left-width:4px;color:#f8f8f8}.alert.alert-primary{border-color:#f8f8f8;background:rgba(248,248,248,.1);color:#f8f8f8}.alert.alert-success{border-color:#0fa;background:rgba(0,255,170,.1);color:#0fa}.alert.alert-secondary{border-color:#00b3ff;background:rgba(0,179,255,.1);color:rgb(51,194.2,255)}.alert.alert-info{border-color:#8a2ce2;background:rgba(138,44,226,.1);color:rgb(187.725,133.675,238.325)}.alert.alert-warning{border-color:#ffd900;background:rgba(255,217,0,.1);color:#ffd900}.alert.alert-danger,.alert.alert-error{border-color:#ff3c00;background:rgba(255,60,0,.1);color:rgb(255,118.5,76.5)}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.g-0{gap:0!important}.m-1{margin:5px!important}.mt-1{margin-top:5px!important}.mr-1{margin-right:5px!important}.mb-1{margin-bottom:5px!important}.ml-1{margin-left:5px!important}.mx-1{margin-left:5px!important;margin-right:5px!important}.my-1{margin-top:5px!important;margin-bottom:5px!important}.p-1{padding:5px!important}.pt-1{padding-top:5px!important}.pr-1{padding-right:5px!important}.pb-1{padding-bottom:5px!important}.pl-1{padding-left:5px!important}.px-1{padding-left:5px!important;padding-right:5px!important}.py-1{padding-top:5px!important;padding-bottom:5px!important}.g-1{gap:5px!important}.m-2{margin:8px!important}.mt-2{margin-top:8px!important}.mr-2{margin-right:8px!important}.mb-2{margin-bottom:8px!important}.ml-2{margin-left:8px!important}.mx-2{margin-left:8px!important;margin-right:8px!important}.my-2{margin-top:8px!important;margin-bottom:8px!important}.p-2{padding:8px!important}.pt-2{padding-top:8px!important}.pr-2{padding-right:8px!important}.pb-2{padding-bottom:8px!important}.pl-2{padding-left:8px!important}.px-2{padding-left:8px!important;padding-right:8px!important}.py-2{padding-top:8px!important;padding-bottom:8px!important}.g-2{gap:8px!important}.m-3{margin:12px!important}.mt-3{margin-top:12px!important}.mr-3{margin-right:12px!important}.mb-3{margin-bottom:12px!important}.ml-3{margin-left:12px!important}.mx-3{margin-left:12px!important;margin-right:12px!important}.my-3{margin-top:12px!important;margin-bottom:12px!important}.p-3{padding:12px!important}.pt-3{padding-top:12px!important}.pr-3{padding-right:12px!important}.pb-3{padding-bottom:12px!important}.pl-3{padding-left:12px!important}.px-3{padding-left:12px!important;padding-right:12px!important}.py-3{padding-top:12px!important;padding-bottom:12px!important}.g-3{gap:12px!important}.m-4{margin:15px!important}.mt-4{margin-top:15px!important}.mr-4{margin-right:15px!important}.mb-4{margin-bottom:15px!important}.ml-4{margin-left:15px!important}.mx-4{margin-left:15px!important;margin-right:15px!important}.my-4{margin-top:15px!important;margin-bottom:15px!important}.p-4{padding:15px!important}.pt-4{padding-top:15px!important}.pr-4{padding-right:15px!important}.pb-4{padding-bottom:15px!important}.pl-4{padding-left:15px!important}.px-4{padding-left:15px!important;padding-right:15px!important}.py-4{padding-top:15px!important;padding-bottom:15px!important}.g-4{gap:15px!important}.m-5{margin:18px!important}.mt-5{margin-top:18px!important}.mr-5{margin-right:18px!important}.mb-5{margin-bottom:18px!important}.ml-5{margin-left:18px!important}.mx-5{margin-left:18px!important;margin-right:18px!important}.my-5{margin-top:18px!important;margin-bottom:18px!important}.p-5{padding:18px!important}.pt-5{padding-top:18px!important}.pr-5{padding-right:18px!important}.pb-5{padding-bottom:18px!important}.pl-5{padding-left:18px!important}.px-5{padding-left:18px!important;padding-right:18px!important}.py-5{padding-top:18px!important;padding-bottom:18px!important}.g-5{gap:18px!important}.m-6{margin:22px!important}.mt-6{margin-top:22px!important}.mr-6{margin-right:22px!important}.mb-6{margin-bottom:22px!important}.ml-6{margin-left:22px!important}.mx-6{margin-left:22px!important;margin-right:22px!important}.my-6{margin-top:22px!important;margin-bottom:22px!important}.p-6{padding:22px!important}.pt-6{padding-top:22px!important}.pr-6{padding-right:22px!important}.pb-6{padding-bottom:22px!important}.pl-6{padding-left:22px!important}.px-6{padding-left:22px!important;padding-right:22px!important}.py-6{padding-top:22px!important;padding-bottom:22px!important}.g-6{gap:22px!important}.m-7{margin:26px!important}.mt-7{margin-top:26px!important}.mr-7{margin-right:26px!important}.mb-7{margin-bottom:26px!important}.ml-7{margin-left:26px!important}.mx-7{margin-left:26px!important;margin-right:26px!important}.my-7{margin-top:26px!important;margin-bottom:26px!important}.p-7{padding:26px!important}.pt-7{padding-top:26px!important}.pr-7{padding-right:26px!important}.pb-7{padding-bottom:26px!important}.pl-7{padding-left:26px!important}.px-7{padding-left:26px!important;padding-right:26px!important}.py-7{padding-top:26px!important;padding-bottom:26px!important}.g-7{gap:26px!important}.m-8{margin:34px!important}.mt-8{margin-top:34px!important}.mr-8{margin-right:34px!important}.mb-8{margin-bottom:34px!important}.ml-8{margin-left:34px!important}.mx-8{margin-left:34px!important;margin-right:34px!important}.my-8{margin-top:34px!important;margin-bottom:34px!important}.p-8{padding:34px!important}.pt-8{padding-top:34px!important}.pr-8{padding-right:34px!important}.pb-8{padding-bottom:34px!important}.pl-8{padding-left:34px!important}.px-8{padding-left:34px!important;padding-right:34px!important}.py-8{padding-top:34px!important;padding-bottom:34px!important}.g-8{gap:34px!important}.m-9{margin:42px!important}.mt-9{margin-top:42px!important}.mr-9{margin-right:42px!important}.mb-9{margin-bottom:42px!important}.ml-9{margin-left:42px!important}.mx-9{margin-left:42px!important;margin-right:42px!important}.my-9{margin-top:42px!important;margin-bottom:42px!important}.p-9{padding:42px!important}.pt-9{padding-top:42px!important}.pr-9{padding-right:42px!important}.pb-9{padding-bottom:42px!important}.pl-9{padding-left:42px!important}.px-9{padding-left:42px!important;padding-right:42px!important}.py-9{padding-top:42px!important;padding-bottom:42px!important}.g-9{gap:42px!important}.m-10{margin:48px!important}.mt-10{margin-top:48px!important}.mr-10{margin-right:48px!important}.mb-10{margin-bottom:48px!important}.ml-10{margin-left:48px!important}.mx-10{margin-left:48px!important;margin-right:48px!important}.my-10{margin-top:48px!important;margin-bottom:48px!important}.p-10{padding:48px!important}.pt-10{padding-top:48px!important}.pr-10{padding-right:48px!important}.pb-10{padding-bottom:48px!important}.pl-10{padding-left:48px!important}.px-10{padding-left:48px!important;padding-right:48px!important}.py-10{padding-top:48px!important;padding-bottom:48px!important}.g-10{gap:48px!important}.row{display:flex;flex-direction:row}.f-grid{display:flex;flex-direction:row;flex-wrap:wrap}.w-100{width:100%}.w-200{width:200%}.fs-xs{font-size:12px}.fs-sm{font-size:13px}.fs-md{font-size:14px}.fs-base{font-size:16px}.fs-lg{font-size:17px}.fs-xl{font-size:20px}*{box-sizing:border-box}::-webkit-scrollbar{width:10px}::-webkit-scrollbar-track{width:10px;background:#0a0a0d;cursor:pointer}::-webkit-scrollbar-thumb{width:10px;background:#4a4a57;cursor:default}::-webkit-scrollbar-corner{background:0 0;height:1px}::-webkit-scrollbar-button{display:none}.ph.normalize{position:relative;top:.15em}*{padding:0;margin:0}body,html{font-family:"IBM Plex Mono",monospace;font-weight:400}body{background-color:#0a0a0d;color:#f8f8f8;font-size:15px;line-height:1.45;letter-spacing:.01em}.screen{display:none}.screen.a-show{display:block}.sidebar{width:100%}.main-container{width:100%}.card.device-action,.card.script-action{max-width:280px}.card.device-action .card-content,.card.script-action .card-content{cursor:default;transition-duration:.2s;transition-property:color,opacity,background}.card.device-action:not(.card-success):not(.card-error):not(.card-danger):hover,.card.script-action:not(.card-success):not(.card-error):not(.card-danger):hover{color:#0a0a0d;background:#ffd900}.card.device-action .action-details-btn,.card.script-action .action-details-btn{color:#0a0a0d;font-size:34px;position:relative;right:-10px}.card.device-action.loading-state,.card.script-action.loading-state{position:relative;border-color:#ffd900}.card.device-action.loading-state .device-icon-container,.card.script-action.loading-state .device-icon-container{position:absolute;top:0;left:0;z-index:1;display:flex;flex-direction:row;align-items:center;width:100%;height:100%;background:#ffd900}.card.device-action.loading-state .device-icon-container .device-icon,.card.script-action.loading-state .device-icon-container .device-icon{color:#0a0a0d}.card.device-action.loading-state .device-icon-container .device-icon .ph,.card.device-action.loading-state .device-icon-container .device-icon .ph-bold,.card.script-action.loading-state .device-icon-container .device-icon .ph,.card.script-action.loading-state .device-icon-container .device-icon .ph-bold{transform-origin:50% 50%;animation:icon_spin 1.2s linear infinite}.sidebar-container{max-width:260px;width:100%}.tree .branch{display:flex;flex-direction:column;padding-left:66px}.tree .branch .title{font-size:20px}.tree .branch .branch-container{border:2px solid #f8f8f8;padding:12px;display:flex;flex-direction:column;gap:12px;width:-moz-max-content;width:max-content;margin-bottom:22px}.tree>.branch,.tree>.branch>.branch{padding-left:0}#area-devices-modal .modal-body{position:relative;min-height:300px}#area-devices-modal .modal-body .loader{margin:auto;position:relative;top:120px}.top-bar{width:100%}.top-bar>.row{justify-content:space-between;align-items:center}.hud{width:100%;padding:18px}.hud>.row{justify-content:space-between;align-items:center;gap:15px;flex-wrap:wrap}.hud .hud-btns{display:flex;flex-direction:row;align-items:center;gap:15px}.hud .nav-toggle,.hud .reload-screen{font-size:42px;width:50px;height:50px;background:#f8f8f8;color:#0a0a0d}.hud .nav-toggle{position:relative;z-index:710}.hud .nav-toggle.state-off .icon-state-on{display:none}.hud .nav-toggle.state-on .icon-state-off{display:none}.hud .app-title{padding:8px 15px;text-transform:uppercase}.hud .navigation{position:fixed;z-index:700;left:0;top:0;right:0;bottom:0;background:#0a0a0d;opacity:0;visibility:hidden;transition-duration:.2s;transition-property:visibility,opacity}.hud .navigation .container{width:100%;max-width:600px;height:100vh;margin:auto;padding:12px;display:flex;align-items:center}.hud .navigation .nav-items{display:flex;flex-direction:row;flex-wrap:wrap;gap:48px;align-items:center;justify-content:space-between;height:-moz-max-content;height:max-content;margin-top:100px;transition-duration:.2s;transition-property:margin-top}.hud .navigation .nav-link{text-decoration:none;color:#f8f8f8}.hud .navigation .nav-item{width:160px;border:2px solid #f8f8f8;padding:22px;display:flex;flex-direction:column;gap:12px;transition-property:color,background,border-color;transition-duration:.2s}.hud .navigation .nav-item .nav-icon{text-align:center}.hud .navigation .nav-item .nav-icon .ph,.hud .navigation .nav-item .nav-icon .ph-bold{font-size:64px}.hud .navigation .nav-item .nav-text{width:100%;text-align:center;text-transform:uppercase;font-size:17px}.hud .navigation .nav-item:hover{background:#0fa;border-color:#0fa;color:#0a0a0d}.hud .navigation.a-show{visibility:visible;opacity:1}.hud .navigation.a-show .nav-items{margin-top:0}.hud .navigation.a-hide .nav-items{margin-top:-100px}.load-screen{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:row;align-items:center;justify-content:center;visibility:hidden;opacity:0;background:#0a0a0d;transition-duration:.2s;transition-property:opacity,visibility}.load-screen.a-show{visibility:visible;opacity:1;z-index:900;transition-duration:0s}.error-screen{display:none}.error-screen .container{display:flex;align-items:center;flex-direction:column;justify-content:center;flex-wrap:nowrap;gap:15px;padding-top:20%;max-width:420px;width:100%;margin:auto}.error-screen .icon-container{color:#ff3c00}.error-screen .icon-container .ph,.error-screen .icon-container .ph-bold{font-size:72px}.error-screen .error-title{padding:8px 12px}.error-screen .error-text{font-size:16px;text-align:center}.error-screen.a-show{display:block} +@charset "UTF-8";@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Regular.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Medium.ttf) format("truetype");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf) format("truetype");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Bold.ttf) format("truetype");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:"IBM Plex Mono";src:url(/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Italic.ttf) format("truetype");font-weight:400;font-style:italic;font-display:swap}.container{padding:18px}.section{margin-bottom:48px}.section-title{margin-bottom:34px}.block{margin-bottom:34px}.block-title{margin-bottom:22px}.text,p{margin-bottom:15px}.hint{margin-top:8px}.list{padding-left:22px;margin-bottom:15px}.list-item{margin-bottom:8px}.list-nested{margin-top:8px}.table{margin-bottom:22px}.table-caption{margin-bottom:8px}.form-group{margin-bottom:15px}.label{margin-bottom:5px;display:block}.input,.select,.textarea{margin-top:5px}.toast{padding:15px}.toast-stack{gap:8px}html{font-size:100%}body{font-family:"IBM Plex Mono",monospace;font-size:16px;font-weight:400;line-height:1.6;letter-spacing:0}h1,h2,h3,h4,h5,h6{font-family:"IBM Plex Mono",monospace;font-weight:600;line-height:1.25;margin:0}h1.contrast,h2.contrast,h3.contrast,h4.contrast,h5.contrast,h6.contrast{background:#f8f8f8;color:#0a0a0d}h1{font-size:36px;letter-spacing:-.01em}h2{font-size:28px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px;font-weight:500}.text,p{font-size:16px;line-height:1.6}.text-sm{font-size:13px;line-height:1.4}.text-lg{font-size:17px;line-height:1.6}.text-muted{font-size:13px;color:#aaaeb2}.text-strong,strong{font-weight:600}.text-bold{font-weight:700}.text-italic,em{font-style:italic}.code,code,pre{font-family:"IBM Plex Mono",monospace;font-size:16px;line-height:1.4;background-color:#1a1a23}pre{font-size:16px;line-height:1.6;white-space:pre-wrap}.code,pre code{-o-tab-size:2;tab-size:2;-moz-tab-size:2}a{font-weight:500;text-decoration:none}.link{font-size:inherit;font-weight:500}.label{font-size:13px;font-weight:500;line-height:1.4}.hint,.meta{font-size:12px;line-height:1.4}.table{font-size:13px;line-height:1.4}.table th{font-weight:600}.table td{font-weight:400}.list{font-size:16px;line-height:1.6}.list-item{font-size:inherit}.modal-title{font-size:20px;font-weight:600}.modal-body{font-size:16px}.toast-title{font-size:14px;font-weight:600}.toast-text{font-size:13px;line-height:1.4}.palette{display:flex;flex-direction:row;gap:8px}.palette .color .color-box{width:100px;height:80px}body .bg-primary{background:#f8f8f8}body .bg-secondary{background:#00b3ff}body .bg-success{background:#0fa}body .bg-accent{background:#ff6f30}body .bg-info{background:#8a2ce2}body .bg-warning{background:#ffd900}body .bg-error{background:#ff3c00}body .text-color-primary{color:#f8f8f8}body .text-color-secondary{color:#00b3ff}body .text-color-success{color:#0fa}body .text-color-accent{color:#ff6f30}body .text-color-info{color:#8a2ce2}body .text-color-warning{color:#ffd900}body .text-color-error{color:#ff3c00}.loader{width:45px;aspect-ratio:1;--c:no-repeat linear-gradient(#FF3C00 0 0);background:var(--c) 0 0,var(--c) 0 100%,var(--c) 50% 0,var(--c) 50% 100%,var(--c) 100% 0,var(--c) 100% 100%;animation:l12 1s infinite}@keyframes l12{0%,100%{background-size:20% 50%}16.67%{background-size:20% 30%,20% 30%,20% 50%,20% 50%,20% 50%,20% 50%}33.33%{background-size:20% 30%,20% 30%,20% 30%,20% 30%,20% 50%,20% 50%}50%{background-size:20% 30%,20% 30%,20% 30%,20% 30%,20% 30%,20% 30%}66.67%{background-size:20% 50%,20% 50%,20% 30%,20% 30%,20% 30%,20% 30%}83.33%{background-size:20% 50%,20% 50%,20% 50%,20% 50%,20% 30%,20% 30%}}@keyframes icon_spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}.btn{font-family:"IBM Plex Mono",monospace;font-size:17px;font-weight:600;line-height:1;letter-spacing:.04em;padding:12px 22px;border-radius:0;border-width:2px;border-left-width:6px;border-style:solid;border-color:#f8f8f8;text-transform:uppercase;background-color:transparent;transition-duration:.2s;transition-property:background-color,border-color,color}.btn.with-icon{border-left-width:48px;position:relative}.btn.with-icon .ph,.btn.with-icon .ph-bold{position:absolute;color:#0a0a0d;left:-48px;top:0;font-size:28px;height:100%;display:inline-flex;align-items:center;width:48px;justify-content:center;transition-duration:.2s;transition-property:color,left}.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph,.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph-bold{left:-28px}.btn.btn-primary{color:#f8f8f8;border-color:#f8f8f8}.btn.btn-primary:hover{background-color:#f8f8f8;color:#0a0a0d}.btn.btn-secondary{color:#00b3ff;border-color:#00b3ff}.btn.btn-secondary:hover{background-color:#00b3ff;color:#f8f8f8}.btn.btn-secondary:hover.with-icon .ph,.btn.btn-secondary:hover.with-icon .ph-bold{color:#f8f8f8}.btn.btn-accent{color:#ff6f30;border-color:#ff6f30}.btn.btn-accent:hover{background-color:#ff6f30;color:#f8f8f8}.btn.btn-accent:hover.with-icon .ph,.btn.btn-accent:hover.with-icon .ph-bold{color:#f8f8f8}.btn.btn-danger{color:#ff3c00;border-color:#ff3c00}.btn.btn-danger:hover{background-color:#ff3c00;color:#0a0a0d}.btn.btn-warning{color:#ffd900;border-color:#ffd900}.btn.btn-warning:hover{background-color:#ffd900;color:#0a0a0d}.btn.btn-success{color:#0fa;border-color:#0fa}.btn.btn-success:hover{background-color:#0fa;color:#0a0a0d}.btn.btn-info{color:#8a2ce2;border-color:#8a2ce2}.btn.btn-info:hover{background-color:#8a2ce2;color:#f8f8f8}.btn.btn-info:hover.with-icon .ph,.btn.btn-info:hover.with-icon .ph-bold{color:#f8f8f8}.btn[disabled]:not(.loading-state){color:#aaaeb2;border-color:#1a1a23;background-color:#1a1a23}.btn[disabled]:not(.loading-state).with-icon .ph,.btn[disabled]:not(.loading-state).with-icon .ph-bold{color:#aaaeb2}.btn[disabled]:not(.loading-state):hover{background-color:#1a1a23;color:#aaaeb2}.btn[disabled]:not(.loading-state):hover.with-icon .ph,.btn[disabled]:not(.loading-state):hover.with-icon .ph-bold{color:#aaaeb2}.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph,.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph-bold{left:-28px}.btn.btn-small{font-size:14px;font-weight:500;padding:8px 8px}.btn.btn-small.with-icon{border-left-width:32px}.btn.btn-small.with-icon .ph,.btn.btn-small.with-icon .ph-bold{left:-40px;font-size:23px}.btn.btn-small.with-icon.loading-state .ph,.btn.btn-small.with-icon.loading-state .ph-bold{font-size:30px}.btn.btn-large{font-size:20px;font-weight:700;padding:15px 48px}.btn.loading-state{color:#0a0a0d!important;border-color:#f8f8f8!important;background-color:#f8f8f8!important}.btn.loading-state .ph,.btn.loading-state .ph-bold{font-size:31px;transform-origin:50% 50%;animation:icon_spin 1.2s linear infinite}.btn-icon{display:flex;justify-content:center;align-items:center;width:30px;height:30px;background:0 0;color:#f8f8f8;font-size:20px;border:0;transition-duration:.2s;transition-property:color}.btn-icon .ph{transform:rotate(0);transition-duration:.2s;transition-property:transform}.btn-icon:not(.without-hover):hover{color:#aaaeb2}.btn-icon:not(.without-hover):hover .ph{transform:rotate(90deg)}.form-group .label{display:flex;flex-direction:column;font-size:17px;width:100%;max-width:600px;position:relative}.form-group .label>.ph{position:absolute;color:#f8f8f8;left:0;bottom:2px;font-size:28px;height:56px;display:inline-flex;align-items:center;width:48px;justify-content:center;transition-duration:.2s;transition-property:color,left}.form-group .label .input{font-family:"IBM Plex Mono",monospace;font-size:16px;font-weight:500;line-height:1;letter-spacing:.04em;padding:12px 22px;margin-top:8px;border-radius:0;border-width:2px;border-bottom-width:6px;border-style:solid;border-color:#f8f8f8;color:#f8f8f8;background-color:transparent;transition-duration:.2s;transition-property:background-color,border-color,color}.form-group .label .input:hover{border-bottom-color:#aaaeb2}.form-group .label .input:focus{outline:0;border-color:#00b3ff}.form-group .label .input::-moz-placeholder{color:#aaaeb2}.form-group .label .input::placeholder{color:#aaaeb2}.form-group .label textarea.input{height:120px;line-height:1.25;resize:none}.form-group .label .ph+.input,.form-group .label .ph+.select-wrap .select{padding-left:42px}.form-group .label .select-wrap{margin-top:8px}.form-group .label .select{width:100%;height:56px;margin-top:0;appearance:none;-webkit-appearance:none;-moz-appearance:none}.form-group .label .select:focus{outline:0}.form-group .label .select option{color:#f8f8f8;background:#1a1a23}.form-group .label .select-wrap::after{content:"";position:absolute;right:22px;bottom:18px;transform:translateY(-50%);width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:10px solid #f8f8f8;pointer-events:none}.form-group .label.error .input:not(:focus){border-color:#ff3c00}.form-group .label.error+.input-info{color:#ffd900}.form-group .input-info{font-size:14px;margin-top:8px}.form-group .input-info .ph{position:relative;top:1px}.radio{display:inline-flex;flex-direction:row;gap:8px;align-items:center}.radio input[type=radio]{display:none}.radio .radio-control{display:inline-block;border-radius:100%;border:2px solid #f8f8f8;width:20px;height:20px;background:0 0;transition-duration:.2s;transition-property:background,border-color}.radio:hover .radio-control{background:#4a4a57}.radio input[type=radio]:checked+.radio-control{background:#f8f8f8}.radio input[type=radio]:disabled+.radio-control{background:#4a4a57;border-color:#4a4a57}.radio .radio-label{font-size:17px}.checkbox{display:inline-flex;flex-direction:row;gap:8px;align-items:center}.checkbox input[type=checkbox]{display:none}.checkbox .checkbox-control{height:16px;width:30px;border:2px solid #f8f8f8;position:relative;background:0 0;transition-duration:.2s;transition-property:border-color,background;display:block}.checkbox .checkbox-control:before{content:"";display:block;height:20px;width:20px;background:#f8f8f8;position:absolute;left:-6px;top:-4px;transition-duration:.2s;transition-property:left,background}.checkbox:hover .checkbox-control{background:#4a4a57}.checkbox input[type=checkbox]:checked:not(:disabled)+.checkbox-control{background:#00b3ff;border-color:#00b3ff}.checkbox input[type=checkbox]:checked+.checkbox-control:before{left:12px}.checkbox input[type=checkbox]:disabled+.checkbox-control{border-color:#4a4a57}.checkbox input[type=checkbox]:disabled+.checkbox-control:before{background:#4a4a57}.list{display:flex;flex-direction:column;gap:5px;list-style-type:none;padding-left:0}.list .list-item{display:flex;flex-direction:row;align-items:center;gap:8px;margin-left:0}.list.list-ordered{list-style-type:decimal;display:list-item;margin-left:30px}.list.list-ordered .list-item{display:list-item}.list.list-definition{gap:15px}.list.list-definition .list-row{border-left:2px solid #f8f8f8}.list.list-definition .list-row .list-desc::before,.list.list-definition .list-row .list-term::before{content:"";height:2px;width:12px;position:absolute;top:50%;left:0;margin-top:-1px;display:block;background:#f8f8f8}.list.list-definition .list-row .list-desc,.list.list-definition .list-row .list-term{position:relative}.list.list-definition .list-row .list-term{padding-left:18px;font-size:20px}.list.list-definition .list-row .list-desc{padding-left:18px}.list.list-nav{max-width:420px;width:100%;gap:0}.list.list-nav .list-item{display:flex;flex-direction:column;align-items:flex-start;height:50px;margin:0}.list.list-nav .list-item .list-action{display:flex;justify-content:space-between;align-items:center;width:100%;height:100%;padding:8px 12px;border:0;font-size:17px;background:#1a1a23;color:inherit;transition-duration:.2s;transition-property:background}.list.list-nav .list-item .list-action:hover{background:#00b3ff}.list.list-nav .list-item .list-action .list-label{display:flex;flex-direction:row;gap:8px;align-items:center;letter-spacing:-.05em;font-weight:400}.list.list-nav .list-item .list-action .list-meta{padding:8px;background:#0fa;color:#0a0a0d;display:flex}.list.list-nav .list-item.list-item-active .list-action{background:#00b3ff}.list.list-actions{width:100%;max-width:420px;gap:22px}.list.list-actions .list-item{justify-content:space-between;align-items:flex-start}.list.list-actions .list-item .list-content{display:flex;flex-direction:column;gap:8px}.list.list-actions .list-item .list-content .list-title{font-size:20px;line-height:1}.badge{background:#f8f8f8;color:#1a1a23;padding:5px 8px;font-size:16px;display:inline-block}.badge.badge-success{background:#0fa}.badge.badge-warning{background:#ffd900}.badge.badge-danger,.badge.badge-error{background:#ff3c00}.badge.badge-info{background:#8a2ce2;color:#f8f8f8}.badge.badge-secondary{background:#00b3ff;color:#f8f8f8}.table{text-align:left;border:2px solid #f8f8f8;padding:15px}.table .table-caption{text-align:left;font-size:20px;background:#f8f8f8;width:-moz-max-content;width:max-content;color:#1a1a23;padding:5px 12px;margin-bottom:0}.table.table-empty{width:100%}.table.table-empty .is-empty{width:100%;padding:15px;font-size:16px;color:#aaaeb2;text-align:left}.table .table-row td,.table .table-row th{padding:12px 18px;font-size:16px;vertical-align:top}.table .table-foot td,.table .table-foot th{padding-top:15px}.toast{position:fixed;z-index:1100;bottom:-100px;right:15px;max-width:420px;background:#1a1a23;border:2px solid #f8f8f8;padding:0;opacity:0;transition-duration:.25s;transition-property:opacity,top,bottom}.toast.a-show{bottom:15px;opacity:1}.toast.a-hide{bottom:115px;opacity:0}.toast .toast-content{display:flex;flex-direction:column;gap:0}.toast .toast-content .toast-title{font-size:24px;display:flex;flex-direction:row;gap:8px;align-items:center;color:#0a0a0d;background:#f8f8f8;padding:5px 8px;padding-right:42px}.toast .toast-content .toast-text{font-size:16px;padding:22px 15px;margin:0}.toast .toast-close{position:absolute;top:0;right:0;color:#0a0a0d;height:40px;width:40px}.toast .toast-close:hover{color:#1a1a23}.toast.toast-success{border-color:#0fa}.toast.toast-success .toast-title{background:#0fa}.toast.toast-warning{border-color:#ffd900}.toast.toast-warning .toast-title{background:#ffd900}.toast.toast-danger{border-color:#ff3c00}.toast.toast-danger .toast-title{background:#ff3c00}.card{max-width:420px;width:100%;border:2px solid #f8f8f8}.card .card-title{color:#0a0a0d;background:#f8f8f8;padding:8px 12px}.card .card-content{padding:15px}.card .card-content .card-thumb{width:100%}.card .card-content p{margin-top:8px;margin-bottom:0}.card .card-footer{padding:8px 15px;padding-bottom:15px}.card.device-action{max-width:220px;transition-duration:.2s;transition-property:border-color}.card.device-action .device-icon-container{position:relative}.card.device-action .device-icon-container .device-online-status{position:absolute;top:-15px;left:-5px;font-size:24px;color:#ff3c00}.card.device-action .device-icon-container .device-online-status.status-online{color:#0fa}.card.device-action .device-icon-container .device-icon{display:flex;flex-direction:row;align-items:center;justify-content:center;font-size:64px;height:120px;width:100%;transition-duration:.2s;transition-property:color}.card.device-action .card-title{display:flex;width:100%;font-size:14px;font-weight:700;align-items:center;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;transition-duration:.2s;transition-property:background-color,color}.card.device-action .device-name{font-size:14px;line-height:1.4}.card.device-action.card-success{border-color:#0fa}.card.device-action.card-success .card-title{background:#0fa}.card.device-action.card-success .device-icon{color:#0fa}.card.device-action.card-warning{border-color:#ffd900}.card.device-action.card-warning .card-title{background:#ffd900}.card.device-action.card-warning .device-icon{color:#ffd900}.card.device-action.card-info{border-color:#8a2ce2}.card.device-action.card-info .card-title{background:#8a2ce2;color:#f8f8f8}.card.device-action.card-info .device-icon{color:#8a2ce2}.card.device-action.card-secondary{border-color:#00b3ff}.card.device-action.card-secondary .card-title{background:#00b3ff;color:#f8f8f8}.card.device-action.card-secondary .device-icon{color:#00b3ff}.card.device-action.card-danger,.card.device-action.card-error{border-color:#ff3c00}.card.device-action.card-danger .card-title,.card.device-action.card-error .card-title{background:#ff3c00}.card.device-action.card-danger .device-icon,.card.device-action.card-error .device-icon{color:#ff3c00}.modal{position:fixed;top:0;bottom:0;left:0;right:0;z-index:1000;display:flex;flex-direction:column;align-items:center;justify-content:center}.modal .modal-backdrop{position:fixed;z-index:1010;top:0;bottom:0;left:0;right:0;background:#0a0a0d;opacity:0;transition-duration:.25s;transition-property:opacity}.modal .modal-panel{position:relative;z-index:1020;width:100%;max-width:960px;height:auto;min-height:200px;max-height:800px;padding:0;display:flex;flex-direction:column;gap:15px;margin-top:200px;background:#0a0a0d;border:2px solid #f8f8f8;opacity:0;transition-duration:.25s;transition-property:opacity,margin-top}.modal .modal-panel .modal-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-right:15px}.modal .modal-panel .modal-header .modal-title{padding:12px 15px;background:#f8f8f8;color:#0a0a0d;text-transform:uppercase}.modal .modal-panel .modal-body{max-height:700px;overflow-y:auto;padding:18px}.modal .modal-panel .modal-footer{padding:18px}.modal .modal-panel .modal-footer .actions{display:flex;flex-direction:row;justify-content:flex-end;gap:15px;width:100%}.modal.a-show .modal-backdrop{opacity:1}.modal.a-show .modal-panel{opacity:1;margin-top:0}.modal.a-hide .modal-backdrop{opacity:0}.modal.a-hide .modal-panel{opacity:0;margin-top:-200px}.alert{padding:12px 15px;border-left-style:solid;border-left-width:4px;color:#f8f8f8}.alert.alert-primary{border-color:#f8f8f8;background:rgba(248,248,248,.1);color:#f8f8f8}.alert.alert-success{border-color:#0fa;background:rgba(0,255,170,.1);color:#0fa}.alert.alert-secondary{border-color:#00b3ff;background:rgba(0,179,255,.1);color:rgb(51,194.2,255)}.alert.alert-info{border-color:#8a2ce2;background:rgba(138,44,226,.1);color:rgb(187.725,133.675,238.325)}.alert.alert-warning{border-color:#ffd900;background:rgba(255,217,0,.1);color:#ffd900}.alert.alert-danger,.alert.alert-error{border-color:#ff3c00;background:rgba(255,60,0,.1);color:rgb(255,118.5,76.5)}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-left:0!important;margin-right:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-left:0!important;padding-right:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.g-0{gap:0!important}.m-1{margin:5px!important}.mt-1{margin-top:5px!important}.mr-1{margin-right:5px!important}.mb-1{margin-bottom:5px!important}.ml-1{margin-left:5px!important}.mx-1{margin-left:5px!important;margin-right:5px!important}.my-1{margin-top:5px!important;margin-bottom:5px!important}.p-1{padding:5px!important}.pt-1{padding-top:5px!important}.pr-1{padding-right:5px!important}.pb-1{padding-bottom:5px!important}.pl-1{padding-left:5px!important}.px-1{padding-left:5px!important;padding-right:5px!important}.py-1{padding-top:5px!important;padding-bottom:5px!important}.g-1{gap:5px!important}.m-2{margin:8px!important}.mt-2{margin-top:8px!important}.mr-2{margin-right:8px!important}.mb-2{margin-bottom:8px!important}.ml-2{margin-left:8px!important}.mx-2{margin-left:8px!important;margin-right:8px!important}.my-2{margin-top:8px!important;margin-bottom:8px!important}.p-2{padding:8px!important}.pt-2{padding-top:8px!important}.pr-2{padding-right:8px!important}.pb-2{padding-bottom:8px!important}.pl-2{padding-left:8px!important}.px-2{padding-left:8px!important;padding-right:8px!important}.py-2{padding-top:8px!important;padding-bottom:8px!important}.g-2{gap:8px!important}.m-3{margin:12px!important}.mt-3{margin-top:12px!important}.mr-3{margin-right:12px!important}.mb-3{margin-bottom:12px!important}.ml-3{margin-left:12px!important}.mx-3{margin-left:12px!important;margin-right:12px!important}.my-3{margin-top:12px!important;margin-bottom:12px!important}.p-3{padding:12px!important}.pt-3{padding-top:12px!important}.pr-3{padding-right:12px!important}.pb-3{padding-bottom:12px!important}.pl-3{padding-left:12px!important}.px-3{padding-left:12px!important;padding-right:12px!important}.py-3{padding-top:12px!important;padding-bottom:12px!important}.g-3{gap:12px!important}.m-4{margin:15px!important}.mt-4{margin-top:15px!important}.mr-4{margin-right:15px!important}.mb-4{margin-bottom:15px!important}.ml-4{margin-left:15px!important}.mx-4{margin-left:15px!important;margin-right:15px!important}.my-4{margin-top:15px!important;margin-bottom:15px!important}.p-4{padding:15px!important}.pt-4{padding-top:15px!important}.pr-4{padding-right:15px!important}.pb-4{padding-bottom:15px!important}.pl-4{padding-left:15px!important}.px-4{padding-left:15px!important;padding-right:15px!important}.py-4{padding-top:15px!important;padding-bottom:15px!important}.g-4{gap:15px!important}.m-5{margin:18px!important}.mt-5{margin-top:18px!important}.mr-5{margin-right:18px!important}.mb-5{margin-bottom:18px!important}.ml-5{margin-left:18px!important}.mx-5{margin-left:18px!important;margin-right:18px!important}.my-5{margin-top:18px!important;margin-bottom:18px!important}.p-5{padding:18px!important}.pt-5{padding-top:18px!important}.pr-5{padding-right:18px!important}.pb-5{padding-bottom:18px!important}.pl-5{padding-left:18px!important}.px-5{padding-left:18px!important;padding-right:18px!important}.py-5{padding-top:18px!important;padding-bottom:18px!important}.g-5{gap:18px!important}.m-6{margin:22px!important}.mt-6{margin-top:22px!important}.mr-6{margin-right:22px!important}.mb-6{margin-bottom:22px!important}.ml-6{margin-left:22px!important}.mx-6{margin-left:22px!important;margin-right:22px!important}.my-6{margin-top:22px!important;margin-bottom:22px!important}.p-6{padding:22px!important}.pt-6{padding-top:22px!important}.pr-6{padding-right:22px!important}.pb-6{padding-bottom:22px!important}.pl-6{padding-left:22px!important}.px-6{padding-left:22px!important;padding-right:22px!important}.py-6{padding-top:22px!important;padding-bottom:22px!important}.g-6{gap:22px!important}.m-7{margin:26px!important}.mt-7{margin-top:26px!important}.mr-7{margin-right:26px!important}.mb-7{margin-bottom:26px!important}.ml-7{margin-left:26px!important}.mx-7{margin-left:26px!important;margin-right:26px!important}.my-7{margin-top:26px!important;margin-bottom:26px!important}.p-7{padding:26px!important}.pt-7{padding-top:26px!important}.pr-7{padding-right:26px!important}.pb-7{padding-bottom:26px!important}.pl-7{padding-left:26px!important}.px-7{padding-left:26px!important;padding-right:26px!important}.py-7{padding-top:26px!important;padding-bottom:26px!important}.g-7{gap:26px!important}.m-8{margin:34px!important}.mt-8{margin-top:34px!important}.mr-8{margin-right:34px!important}.mb-8{margin-bottom:34px!important}.ml-8{margin-left:34px!important}.mx-8{margin-left:34px!important;margin-right:34px!important}.my-8{margin-top:34px!important;margin-bottom:34px!important}.p-8{padding:34px!important}.pt-8{padding-top:34px!important}.pr-8{padding-right:34px!important}.pb-8{padding-bottom:34px!important}.pl-8{padding-left:34px!important}.px-8{padding-left:34px!important;padding-right:34px!important}.py-8{padding-top:34px!important;padding-bottom:34px!important}.g-8{gap:34px!important}.m-9{margin:42px!important}.mt-9{margin-top:42px!important}.mr-9{margin-right:42px!important}.mb-9{margin-bottom:42px!important}.ml-9{margin-left:42px!important}.mx-9{margin-left:42px!important;margin-right:42px!important}.my-9{margin-top:42px!important;margin-bottom:42px!important}.p-9{padding:42px!important}.pt-9{padding-top:42px!important}.pr-9{padding-right:42px!important}.pb-9{padding-bottom:42px!important}.pl-9{padding-left:42px!important}.px-9{padding-left:42px!important;padding-right:42px!important}.py-9{padding-top:42px!important;padding-bottom:42px!important}.g-9{gap:42px!important}.m-10{margin:48px!important}.mt-10{margin-top:48px!important}.mr-10{margin-right:48px!important}.mb-10{margin-bottom:48px!important}.ml-10{margin-left:48px!important}.mx-10{margin-left:48px!important;margin-right:48px!important}.my-10{margin-top:48px!important;margin-bottom:48px!important}.p-10{padding:48px!important}.pt-10{padding-top:48px!important}.pr-10{padding-right:48px!important}.pb-10{padding-bottom:48px!important}.pl-10{padding-left:48px!important}.px-10{padding-left:48px!important;padding-right:48px!important}.py-10{padding-top:48px!important;padding-bottom:48px!important}.g-10{gap:48px!important}.row{display:flex;flex-direction:row}.f-grid{display:flex;flex-direction:row;flex-wrap:wrap}.w-100{width:100%}.w-200{width:200%}.fs-xs{font-size:12px}.fs-sm{font-size:13px}.fs-md{font-size:14px}.fs-base{font-size:16px}.fs-lg{font-size:17px}.fs-xl{font-size:20px}*{box-sizing:border-box}::-webkit-scrollbar{width:10px}::-webkit-scrollbar-track{width:10px;background:#0a0a0d;cursor:pointer}::-webkit-scrollbar-thumb{width:10px;background:#4a4a57;cursor:default}::-webkit-scrollbar-corner{background:0 0;height:1px}::-webkit-scrollbar-button{display:none}.ph.normalize{position:relative;top:.15em}*{padding:0;margin:0}body,html{font-family:"IBM Plex Mono",monospace;font-weight:400}body{background-color:#0a0a0d;color:#f8f8f8;font-size:15px;line-height:1.45;letter-spacing:.01em}.screen{display:none}.screen.a-show{display:block}.sidebar{width:100%}.main-container{width:100%}.card.device-action,.card.script-action{max-width:280px}.card.device-action .card-content,.card.script-action .card-content{cursor:default;transition-duration:.2s;transition-property:color,opacity,background}.card.device-action:not(.card-success):not(.card-error):not(.card-danger):hover,.card.script-action:not(.card-success):not(.card-error):not(.card-danger):hover{color:#0a0a0d;background:#ffd900}.card.device-action .action-details-btn,.card.script-action .action-details-btn{color:#0a0a0d;font-size:34px;position:relative;right:-10px}.card.device-action.loading-state,.card.script-action.loading-state{position:relative;border-color:#ffd900}.card.device-action.loading-state .device-icon-container,.card.script-action.loading-state .device-icon-container{position:absolute;top:0;left:0;z-index:1;display:flex;flex-direction:row;align-items:center;width:100%;height:100%;background:#ffd900}.card.device-action.loading-state .device-icon-container .device-icon,.card.script-action.loading-state .device-icon-container .device-icon{color:#0a0a0d}.card.device-action.loading-state .device-icon-container .device-icon .ph,.card.device-action.loading-state .device-icon-container .device-icon .ph-bold,.card.script-action.loading-state .device-icon-container .device-icon .ph,.card.script-action.loading-state .device-icon-container .device-icon .ph-bold{transform-origin:50% 50%;animation:icon_spin 1.2s linear infinite}.sidebar-container{max-width:260px;width:100%}.tree .branch{display:flex;flex-direction:column;padding-left:66px}.tree .branch .title{font-size:20px}.tree .branch .branch-container{border:2px solid #f8f8f8;padding:12px;display:flex;flex-direction:column;gap:12px;width:-moz-max-content;width:max-content;margin-bottom:22px}.tree>.branch,.tree>.branch>.branch{padding-left:0}#area-devices-modal .modal-body{position:relative;min-height:300px}#area-devices-modal .modal-body .loader{margin:auto;position:relative;top:120px}.top-bar{width:100%}.top-bar>.row{justify-content:space-between;align-items:center}.hud{width:100%;padding:18px}.hud>.row{justify-content:space-between;align-items:center;gap:15px;flex-wrap:wrap}.hud .hud-btns{display:flex;flex-direction:row;align-items:center;gap:15px}.hud .nav-toggle,.hud .reload-screen{font-size:42px;width:50px;height:50px;background:#f8f8f8;color:#0a0a0d}.hud .nav-toggle{position:relative;z-index:710}.hud .nav-toggle.state-off .icon-state-on{display:none}.hud .nav-toggle.state-on .icon-state-off{display:none}.hud .app-title{padding:8px 15px;text-transform:uppercase}.hud .navigation{position:fixed;z-index:700;left:0;top:0;right:0;bottom:0;background:#0a0a0d;opacity:0;visibility:hidden;transition-duration:.2s;transition-property:visibility,opacity}.hud .navigation .container{width:100%;max-width:600px;height:100vh;margin:auto;padding:12px;display:flex;align-items:center}.hud .navigation .nav-items{display:flex;flex-direction:row;flex-wrap:wrap;gap:48px;align-items:center;justify-content:space-between;height:-moz-max-content;height:max-content;margin-top:100px;transition-duration:.2s;transition-property:margin-top}.hud .navigation .nav-link{text-decoration:none;color:#f8f8f8}.hud .navigation .nav-item{width:160px;border:2px solid #f8f8f8;padding:22px;display:flex;flex-direction:column;gap:12px;transition-property:color,background,border-color;transition-duration:.2s}.hud .navigation .nav-item .nav-icon{text-align:center}.hud .navigation .nav-item .nav-icon .ph,.hud .navigation .nav-item .nav-icon .ph-bold{font-size:64px}.hud .navigation .nav-item .nav-text{width:100%;text-align:center;text-transform:uppercase;font-size:17px}.hud .navigation .nav-item:hover{background:#0fa;border-color:#0fa;color:#0a0a0d}.hud .navigation.a-show{visibility:visible;opacity:1}.hud .navigation.a-show .nav-items{margin-top:0}.hud .navigation.a-hide .nav-items{margin-top:-100px}.load-screen{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:row;align-items:center;justify-content:center;visibility:hidden;opacity:0;background:#0a0a0d;transition-duration:.2s;transition-property:opacity,visibility}.load-screen.a-show{visibility:visible;opacity:1;z-index:900;transition-duration:0s}.error-screen{display:none}.error-screen .container{display:flex;align-items:center;flex-direction:column;justify-content:center;flex-wrap:nowrap;gap:15px;padding-top:20%;max-width:420px;width:100%;margin:auto}.error-screen .icon-container{color:#ff3c00}.error-screen .icon-container .ph,.error-screen .icon-container .ph-bold{font-size:72px}.error-screen .error-title{padding:8px 12px}.error-screen .error-text{font-size:16px;text-align:center}.error-screen.a-show{display:block} /*# sourceMappingURL=main.css.map */ diff --git a/webclient/dist/css/main.css.map b/webclient/dist/css/main.css.map index e8c8992..5e5da5b 100644 --- a/webclient/dist/css/main.css.map +++ b/webclient/dist/css/main.css.map @@ -1 +1 @@ -{"version":3,"sources":["_fonts.scss","_spacing.scss","main.css","ui_components/_typography.scss","ui_components/_palette.scss","ui_components/_loader.scss","ui_components/_buttons.scss","ui_components/_forms.scss","ui_components/_lists.scss","ui_components/_badges.scss","ui_components/_tables.scss","ui_components/_toasts.scss","ui_components/_cards.scss","ui_components/_modals.scss","ui_components/_alerts.scss","_utils.scss","_ui.scss","_app.scss","app/_hud.scss","app/_load-screen.scss","app/_error-screen.scss"],"names":[],"mappings":"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","file":"main.css","sourcesContent":["@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Regular.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Medium.ttf\") format(\"truetype\");\n font-weight: 500;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf\") format(\"truetype\");\n font-weight: 600;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Bold.ttf\") format(\"truetype\");\n font-weight: 700;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Italic.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: italic;\n font-display: swap;\n}\n","/* =========================\n\t SPACING SCALE\n========================= */\n\n$space-0: 0;\n$space-1: 5px;\n$space-2: 8px;\n$space-3: 12px;\n$space-4: 15px;\n$space-5: 18px;\n$space-6: 22px;\n$space-7: 26px;\n$space-8: 34px;\n$space-9: 42px;\n$space-10: 48px;\n$space-11: 64px;\n$space-12: 80px;\n\n/* aliases for readability */\n$space-xs: $space-1;\n$space-sm: $space-2;\n$space-md: $space-4;\n$space-lg: $space-6;\n$space-xl: $space-8;\n$space-xxl: $space-10;\n\n/* map — for utilities generation */\n$spaces: (\n\t0: $space-0,\n\t1: $space-1,\n\t2: $space-2,\n\t3: $space-3,\n\t4: $space-4,\n\t5: $space-5,\n\t6: $space-6,\n\t7: $space-7,\n\t8: $space-8,\n\t9: $space-9,\n\t10: $space-10\n);\n\n/* =========================\n\t BASE LAYOUT\n========================= */\n\n.container {\n\tpadding: $space-5;\n}\n\n.section {\n\tmargin-bottom: $space-xxl;\n}\n\n.section-title {\n\tmargin-bottom: $space-xl;\n}\n\n.block {\n\tmargin-bottom: $space-xl;\n}\n\n.block-title {\n\tmargin-bottom: $space-lg;\n}\n\n/* =========================\n\t TEXT & CONTENT\n========================= */\n\np,\n.text {\n\tmargin-bottom: $space-md;\n}\n\n.hint {\n\tmargin-top: $space-sm;\n}\n\n/* =========================\n\t LISTS\n========================= */\n\n.list {\n\tpadding-left: $space-lg;\n\tmargin-bottom: $space-md;\n}\n\n.list-item {\n\tmargin-bottom: $space-sm;\n}\n\n.list-nested {\n\tmargin-top: $space-sm;\n}\n\n/* =========================\n\t TABLES\n========================= */\n\n.table {\n\tmargin-bottom: $space-lg;\n}\n\n.table-caption {\n\tmargin-bottom: $space-sm;\n}\n\n/* =========================\n\t FORMS\n========================= */\n\n.form-group {\n\tmargin-bottom: $space-md;\n}\n\n.label {\n\tmargin-bottom: $space-xs;\n\tdisplay: block;\n}\n\n.input,\n.textarea,\n.select {\n\tmargin-top: $space-xs;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n\n.toast {\n\tpadding: $space-md;\n}\n\n.toast-stack {\n\tgap: $space-sm;\n}\n","@charset \"UTF-8\";\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Regular.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Medium.ttf\") format(\"truetype\");\n font-weight: 500;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf\") format(\"truetype\");\n font-weight: 600;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Bold.ttf\") format(\"truetype\");\n font-weight: 700;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Italic.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: italic;\n font-display: swap;\n}\n/* =========================\n\t SPACING SCALE\n========================= */\n/* aliases for readability */\n/* map — for utilities generation */\n/* =========================\n\t BASE LAYOUT\n========================= */\n.container {\n padding: 18px;\n}\n\n.section {\n margin-bottom: 48px;\n}\n\n.section-title {\n margin-bottom: 34px;\n}\n\n.block {\n margin-bottom: 34px;\n}\n\n.block-title {\n margin-bottom: 22px;\n}\n\n/* =========================\n\t TEXT & CONTENT\n========================= */\np,\n.text {\n margin-bottom: 15px;\n}\n\n.hint {\n margin-top: 8px;\n}\n\n/* =========================\n\t LISTS\n========================= */\n.list {\n padding-left: 22px;\n margin-bottom: 15px;\n}\n\n.list-item {\n margin-bottom: 8px;\n}\n\n.list-nested {\n margin-top: 8px;\n}\n\n/* =========================\n\t TABLES\n========================= */\n.table {\n margin-bottom: 22px;\n}\n\n.table-caption {\n margin-bottom: 8px;\n}\n\n/* =========================\n\t FORMS\n========================= */\n.form-group {\n margin-bottom: 15px;\n}\n\n.label {\n margin-bottom: 5px;\n display: block;\n}\n\n.input,\n.textarea,\n.select {\n margin-top: 5px;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n.toast {\n padding: 15px;\n}\n\n.toast-stack {\n gap: 8px;\n}\n\n/* =========================\n\t FONT FAMILIES\n========================= */\n/* =========================\n\t FONT WEIGHTS\n========================= */\n/* =========================\n\t FONT SIZES (scale)\n========================= */\n/* =========================\n\t LINE HEIGHTS\n========================= */\n/* =========================\n\t LETTER SPACING\n========================= */\n/* =========================\n\t BASE TYPOGRAPHY\n========================= */\nhtml {\n font-size: 100%;\n}\n\nbody {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.6;\n letter-spacing: 0;\n}\n\n/* =========================\n\t HEADINGS\n========================= */\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-family: \"IBM Plex Mono\", monospace;\n font-weight: 600;\n line-height: 1.25;\n margin: 0;\n}\nh1.contrast,\nh2.contrast,\nh3.contrast,\nh4.contrast,\nh5.contrast,\nh6.contrast {\n background: #F8F8F8;\n color: #0A0A0D;\n}\n\nh1 {\n font-size: 36px;\n letter-spacing: -0.01em;\n}\n\nh2 {\n font-size: 28px;\n}\n\nh3 {\n font-size: 24px;\n}\n\nh4 {\n font-size: 20px;\n}\n\nh5 {\n font-size: 18px;\n}\n\nh6 {\n font-size: 16px;\n font-weight: 500;\n}\n\n/* =========================\n\t TEXT VARIANTS\n========================= */\n.text,\np {\n font-size: 16px;\n line-height: 1.6;\n}\n\n.text-sm {\n font-size: 13px;\n line-height: 1.4;\n}\n\n.text-lg {\n font-size: 17px;\n line-height: 1.6;\n}\n\n.text-muted {\n font-size: 13px;\n color: #AAAEB2;\n}\n\n.text-strong,\nstrong {\n font-weight: 600;\n}\n\n.text-bold {\n font-weight: 700;\n}\n\n.text-italic,\nem {\n font-style: italic;\n}\n\n/* =========================\n\t CODE / MONO\n========================= */\ncode,\npre,\n.code {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 16px;\n line-height: 1.4;\n background-color: #1A1A23;\n}\n\npre {\n font-size: 16px;\n line-height: 1.6;\n white-space: pre-wrap;\n}\n\npre code,\n.code {\n tab-size: 2;\n -moz-tab-size: 2;\n}\n\n/* =========================\n\t LINKS\n========================= */\na {\n font-weight: 500;\n text-decoration: none;\n}\n\n.link {\n font-size: inherit;\n font-weight: 500;\n}\n\n/* =========================\n\t LABELS / META\n========================= */\n.label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.4;\n}\n\n.hint,\n.meta {\n font-size: 12px;\n line-height: 1.4;\n}\n\n/* =========================\n\t TABLE TEXT\n========================= */\n.table {\n font-size: 13px;\n line-height: 1.4;\n}\n.table th {\n font-weight: 600;\n}\n.table td {\n font-weight: 400;\n}\n\n/* =========================\n\t LISTS\n========================= */\n.list {\n font-size: 16px;\n line-height: 1.6;\n}\n\n.list-item {\n font-size: inherit;\n}\n\n/* =========================\n\t MODALS\n========================= */\n.modal-title {\n font-size: 20px;\n font-weight: 600;\n}\n\n.modal-body {\n font-size: 16px;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n.toast-title {\n font-size: 14px;\n font-weight: 600;\n}\n\n.toast-text {\n font-size: 13px;\n line-height: 1.4;\n}\n\n.palette {\n display: flex;\n flex-direction: row;\n gap: 8px;\n}\n.palette .color .color-box {\n width: 100px;\n height: 80px;\n}\n\n/* BACKGROUND COLORS */\nbody .bg-primary {\n background: #F8F8F8;\n}\nbody .bg-secondary {\n background: #00B3FF;\n}\nbody .bg-success {\n background: #00FFAA;\n}\nbody .bg-accent {\n background: #ff6f30;\n}\nbody .bg-info {\n background: #8A2CE2;\n}\nbody .bg-warning {\n background: #FFD900;\n}\nbody .bg-error {\n background: #FF3C00;\n}\nbody {\n /* TEXT COLORS */\n}\nbody .text-color-primary {\n color: #F8F8F8;\n}\nbody .text-color-secondary {\n color: #00B3FF;\n}\nbody .text-color-success {\n color: #00FFAA;\n}\nbody .text-color-accent {\n color: #ff6f30;\n}\nbody .text-color-info {\n color: #8A2CE2;\n}\nbody .text-color-warning {\n color: #FFD900;\n}\nbody .text-color-error {\n color: #FF3C00;\n}\n\n/* HTML:
*/\n.loader {\n width: 45px;\n aspect-ratio: 1;\n --c:no-repeat linear-gradient(#FF3C00 0 0);\n background: var(--c) 0 0, var(--c) 0 100%, var(--c) 50% 0, var(--c) 50% 100%, var(--c) 100% 0, var(--c) 100% 100%;\n animation: l12 1s infinite;\n}\n\n@keyframes l12 {\n 0%, 100% {\n background-size: 20% 50%;\n }\n 16.67% {\n background-size: 20% 30%, 20% 30%, 20% 50%, 20% 50%, 20% 50%, 20% 50%;\n }\n 33.33% {\n background-size: 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 50%, 20% 50%;\n }\n 50% {\n background-size: 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%;\n }\n 66.67% {\n background-size: 20% 50%, 20% 50%, 20% 30%, 20% 30%, 20% 30%, 20% 30%;\n }\n 83.33% {\n background-size: 20% 50%, 20% 50%, 20% 50%, 20% 50%, 20% 30%, 20% 30%;\n }\n}\n@keyframes icon_spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n.btn {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 17px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.04em;\n padding: 12px 22px;\n border-radius: 0;\n border-width: 2px;\n border-left-width: 6px;\n border-style: solid;\n border-color: #F8F8F8;\n text-transform: uppercase;\n background-color: transparent;\n transition-duration: 0.2s;\n transition-property: background-color, border-color, color;\n}\n.btn.with-icon {\n border-left-width: 48px;\n position: relative;\n}\n.btn.with-icon .ph,\n.btn.with-icon .ph-bold {\n position: absolute;\n color: #0a0a0d;\n left: -48px;\n top: 0;\n font-size: 28px;\n height: 100%;\n display: inline-flex;\n align-items: center;\n width: 48px;\n justify-content: center;\n transition-duration: 0.2s;\n transition-property: color, left;\n}\n.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph,\n.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph-bold {\n left: -28px;\n}\n.btn.btn-primary {\n color: #F8F8F8;\n border-color: #F8F8F8;\n}\n.btn.btn-primary:hover {\n background-color: #F8F8F8;\n color: #0A0A0D;\n}\n.btn.btn-secondary {\n color: #00B3FF;\n border-color: #00B3FF;\n}\n.btn.btn-secondary:hover {\n background-color: #00B3FF;\n color: #F8F8F8;\n}\n.btn.btn-secondary:hover.with-icon .ph,\n.btn.btn-secondary:hover.with-icon .ph-bold {\n color: #F8F8F8;\n}\n.btn.btn-accent {\n color: #ff6f30;\n border-color: #ff6f30;\n}\n.btn.btn-accent:hover {\n background-color: #ff6f30;\n color: #F8F8F8;\n}\n.btn.btn-accent:hover.with-icon .ph,\n.btn.btn-accent:hover.with-icon .ph-bold {\n color: #F8F8F8;\n}\n.btn.btn-danger {\n color: #FF3C00;\n border-color: #FF3C00;\n}\n.btn.btn-danger:hover {\n background-color: #FF3C00;\n color: #0A0A0D;\n}\n.btn.btn-warning {\n color: #FFD900;\n border-color: #FFD900;\n}\n.btn.btn-warning:hover {\n background-color: #FFD900;\n color: #0A0A0D;\n}\n.btn.btn-success {\n color: #00FFAA;\n border-color: #00FFAA;\n}\n.btn.btn-success:hover {\n background-color: #00FFAA;\n color: #0A0A0D;\n}\n.btn.btn-info {\n color: #8A2CE2;\n border-color: #8A2CE2;\n}\n.btn.btn-info:hover {\n background-color: #8A2CE2;\n color: #F8F8F8;\n}\n.btn.btn-info:hover.with-icon .ph,\n.btn.btn-info:hover.with-icon .ph-bold {\n color: #F8F8F8;\n}\n.btn[disabled]:not(.loading-state) {\n color: #AAAEB2;\n border-color: #1A1A23;\n background-color: #1A1A23;\n}\n.btn[disabled]:not(.loading-state).with-icon .ph,\n.btn[disabled]:not(.loading-state).with-icon .ph-bold {\n color: #AAAEB2;\n}\n.btn[disabled]:not(.loading-state):hover {\n background-color: #1A1A23;\n color: #AAAEB2;\n}\n.btn[disabled]:not(.loading-state):hover.with-icon .ph,\n.btn[disabled]:not(.loading-state):hover.with-icon .ph-bold {\n color: #AAAEB2;\n}\n.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph,\n.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph-bold {\n left: -28px;\n}\n.btn.btn-small {\n font-size: 14px;\n font-weight: 500;\n padding: 8px 8px;\n}\n.btn.btn-small.with-icon {\n border-left-width: 32px;\n}\n.btn.btn-small.with-icon .ph,\n.btn.btn-small.with-icon .ph-bold {\n left: -40px;\n font-size: 23px;\n}\n.btn.btn-small.with-icon.loading-state .ph, .btn.btn-small.with-icon.loading-state .ph-bold {\n font-size: 30px;\n}\n.btn.btn-large {\n font-size: 20px;\n font-weight: 700;\n padding: 15px 48px;\n}\n.btn.loading-state {\n color: #0A0A0D !important;\n border-color: #F8F8F8 !important;\n background-color: #F8F8F8 !important;\n}\n.btn.loading-state .ph, .btn.loading-state .ph-bold {\n font-size: 31px;\n transform-origin: 50% 50%;\n animation: icon_spin 1.2s linear infinite;\n}\n\n.btn-icon {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 30px;\n height: 30px;\n background: transparent;\n color: #F8F8F8;\n font-size: 20px;\n border: 0;\n transition-duration: 0.2s;\n transition-property: color;\n}\n.btn-icon .ph {\n transform: rotate(0);\n transition-duration: 0.2s;\n transition-property: transform;\n}\n.btn-icon:not(.without-hover):hover {\n color: #AAAEB2;\n}\n.btn-icon:not(.without-hover):hover .ph {\n transform: rotate(90deg);\n}\n\n.form-group .label {\n display: flex;\n flex-direction: column;\n font-size: 17px;\n width: 100%;\n max-width: 600px;\n position: relative;\n}\n.form-group .label > .ph {\n position: absolute;\n color: #F8F8F8;\n left: 0;\n bottom: 2px;\n font-size: 28px;\n height: 56px;\n display: inline-flex;\n align-items: center;\n width: 48px;\n justify-content: center;\n transition-duration: 0.2s;\n transition-property: color, left;\n}\n.form-group .label .input {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 16px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.04em;\n padding: 12px 22px;\n margin-top: 8px;\n border-radius: 0;\n border-width: 2px;\n border-bottom-width: 6px;\n border-style: solid;\n border-color: #F8F8F8;\n color: #F8F8F8;\n background-color: transparent;\n transition-duration: 0.2s;\n transition-property: background-color, border-color, color;\n}\n.form-group .label .input:hover {\n border-bottom-color: #AAAEB2;\n}\n.form-group .label .input:focus {\n outline: none;\n border-color: #00B3FF;\n}\n.form-group .label .input::placeholder {\n color: #AAAEB2;\n}\n.form-group .label textarea.input {\n height: 120px;\n line-height: 1.25;\n resize: none;\n}\n.form-group .label .ph + .input,\n.form-group .label .ph + .select-wrap .select {\n padding-left: 42px;\n}\n.form-group .label .select-wrap {\n margin-top: 8px;\n}\n.form-group .label .select {\n width: 100%;\n height: 56px;\n margin-top: 0;\n /* убрать нативную стрелку */\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n.form-group .label .select:focus {\n outline: none;\n}\n.form-group .label .select option {\n color: #F8F8F8;\n background: #1A1A23;\n}\n.form-group .label .select-wrap::after {\n content: \"\";\n position: absolute;\n right: 22px;\n bottom: 18px;\n transform: translateY(-50%);\n width: 0;\n height: 0;\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 10px solid #F8F8F8;\n pointer-events: none;\n}\n.form-group .label.error .input:not(:focus) {\n border-color: #FF3C00;\n}\n.form-group .label.error + .input-info {\n color: #FFD900;\n}\n.form-group .input-info {\n font-size: 14px;\n margin-top: 8px;\n}\n.form-group .input-info .ph {\n position: relative;\n top: 1px;\n}\n\n.radio {\n display: inline-flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n}\n.radio input[type=radio] {\n display: none;\n}\n.radio .radio-control {\n display: inline-block;\n border-radius: 100%;\n border: 2px solid #F8F8F8;\n width: 20px;\n height: 20px;\n background: transparent;\n transition-duration: 0.2s;\n transition-property: background, border-color;\n}\n.radio:hover .radio-control {\n background: #4A4A57;\n}\n.radio input[type=radio]:checked + .radio-control {\n background: #F8F8F8;\n}\n.radio input[type=radio]:disabled + .radio-control {\n background: #4A4A57;\n border-color: #4A4A57;\n}\n.radio .radio-label {\n font-size: 17px;\n}\n\n.checkbox {\n display: inline-flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n}\n.checkbox input[type=checkbox] {\n display: none;\n}\n.checkbox .checkbox-control {\n height: 16px;\n width: 30px;\n border: 2px solid #F8F8F8;\n position: relative;\n background: transparent;\n transition-duration: 0.2s;\n transition-property: border-color, background;\n display: block;\n}\n.checkbox .checkbox-control:before {\n content: \"\";\n display: block;\n height: 20px;\n width: 20px;\n background: #F8F8F8;\n position: absolute;\n left: -6px;\n top: -4px;\n transition-duration: 0.2s;\n transition-property: left, background;\n}\n.checkbox:hover .checkbox-control {\n background: #4A4A57;\n}\n.checkbox input[type=checkbox]:checked:not(:disabled) + .checkbox-control {\n background: #00B3FF;\n border-color: #00B3FF;\n}\n.checkbox input[type=checkbox]:checked + .checkbox-control:before {\n left: 12px;\n}\n.checkbox input[type=checkbox]:disabled + .checkbox-control {\n border-color: #4A4A57;\n}\n.checkbox input[type=checkbox]:disabled + .checkbox-control:before {\n background: #4A4A57;\n}\n\n.list {\n display: flex;\n flex-direction: column;\n gap: 5px;\n list-style-type: none;\n padding-left: 0;\n}\n.list .list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n margin-left: 0;\n}\n.list.list-ordered {\n list-style-type: decimal;\n display: list-item;\n margin-left: 30px;\n}\n.list.list-ordered .list-item {\n display: list-item;\n}\n.list.list-definition {\n gap: 15px;\n}\n.list.list-definition .list-row {\n border-left: 2px solid #F8F8F8;\n}\n.list.list-definition .list-row .list-term::before,\n.list.list-definition .list-row .list-desc::before {\n content: \"\";\n height: 2px;\n width: 12px;\n position: absolute;\n top: 50%;\n left: 0;\n margin-top: -1px;\n display: block;\n background: #F8F8F8;\n}\n.list.list-definition .list-row .list-term,\n.list.list-definition .list-row .list-desc {\n position: relative;\n}\n.list.list-definition .list-row .list-term {\n padding-left: 18px;\n font-size: 20px;\n}\n.list.list-definition .list-row .list-desc {\n padding-left: 18px;\n}\n.list.list-nav {\n max-width: 420px;\n width: 100%;\n gap: 0;\n}\n.list.list-nav .list-item {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n height: 50px;\n margin: 0;\n}\n.list.list-nav .list-item .list-action {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n height: 100%;\n padding: 8px 12px;\n border: 0;\n font-size: 17px;\n background: #1A1A23;\n color: inherit;\n transition-duration: 0.2s;\n transition-property: background;\n}\n.list.list-nav .list-item .list-action:hover {\n background: #00B3FF;\n}\n.list.list-nav .list-item .list-action .list-label {\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n letter-spacing: -0.05em;\n font-weight: 400;\n}\n.list.list-nav .list-item .list-action .list-meta {\n padding: 8px;\n background: #00FFAA;\n color: #0A0A0D;\n display: flex;\n}\n.list.list-nav .list-item.list-item-active .list-action {\n background: #00B3FF;\n}\n.list.list-actions {\n width: 100%;\n max-width: 420px;\n gap: 22px;\n}\n.list.list-actions .list-item {\n justify-content: space-between;\n align-items: flex-start;\n}\n.list.list-actions .list-item .list-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.list.list-actions .list-item .list-content .list-title {\n font-size: 20px;\n line-height: 1;\n}\n.badge {\n background: #F8F8F8;\n color: #1A1A23;\n padding: 5px 8px;\n font-size: 16px;\n display: inline-block;\n}\n.badge.badge-success {\n background: #00FFAA;\n}\n.badge.badge-warning {\n background: #FFD900;\n}\n.badge.badge-error, .badge.badge-danger {\n background: #FF3C00;\n}\n.badge.badge-info {\n background: #8A2CE2;\n color: #F8F8F8;\n}\n.badge.badge-secondary {\n background: #00B3FF;\n color: #F8F8F8;\n}\n\n.table {\n text-align: left;\n border: 2px solid #F8F8F8;\n padding: 15px;\n}\n.table .table-caption {\n text-align: left;\n font-size: 20px;\n background: #F8F8F8;\n width: max-content;\n color: #1A1A23;\n padding: 5px 12px;\n margin-bottom: 0;\n}\n.table.table-empty {\n width: 100%;\n}\n.table.table-empty .is-empty {\n width: 100%;\n padding: 15px;\n font-size: 16px;\n color: #AAAEB2;\n text-align: left;\n}\n.table .table-row th,\n.table .table-row td {\n padding: 12px 18px;\n font-size: 16px;\n vertical-align: top;\n}\n.table .table-foot th,\n.table .table-foot td {\n padding-top: 15px;\n}\n\n.toast {\n position: fixed;\n bottom: -100px;\n right: 15px;\n max-width: 420px;\n background: #1A1A23;\n border: 2px solid #F8F8F8;\n padding: 0;\n opacity: 0;\n transition-duration: 0.25s;\n transition-property: opacity, top, bottom;\n}\n.toast.a-show {\n bottom: 15px;\n opacity: 1;\n}\n.toast.a-hide {\n bottom: 115px;\n opacity: 0;\n}\n.toast .toast-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.toast .toast-content .toast-title {\n font-size: 24px;\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n color: #0A0A0D;\n background: #F8F8F8;\n padding: 5px 8px;\n padding-right: 42px;\n}\n.toast .toast-content .toast-text {\n font-size: 16px;\n padding: 22px 15px;\n margin: 0;\n}\n.toast .toast-close {\n position: absolute;\n top: 0;\n right: 0;\n color: #0A0A0D;\n height: 40px;\n width: 40px;\n}\n.toast .toast-close:hover {\n color: #1A1A23;\n}\n.toast.toast-success {\n border-color: #00FFAA;\n}\n.toast.toast-success .toast-title {\n background: #00FFAA;\n}\n.toast.toast-warning {\n border-color: #FFD900;\n}\n.toast.toast-warning .toast-title {\n background: #FFD900;\n}\n.toast.toast-danger {\n border-color: #FF3C00;\n}\n.toast.toast-danger .toast-title {\n background: #FF3C00;\n}\n\n.card {\n max-width: 420px;\n width: 100%;\n border: 2px solid #F8F8F8;\n}\n.card .card-title {\n color: #0A0A0D;\n background: #F8F8F8;\n padding: 8px 12px;\n}\n.card .card-content {\n padding: 15px;\n}\n.card .card-content .card-thumb {\n width: 100%;\n}\n.card .card-content p {\n margin-top: 8px;\n margin-bottom: 0;\n}\n.card .card-footer {\n padding: 8px 15px;\n padding-bottom: 15px;\n}\n.card.device-action {\n max-width: 220px;\n transition-duration: 0.2s;\n transition-property: border-color;\n}\n.card.device-action .device-icon-container {\n position: relative;\n}\n.card.device-action .device-icon-container .device-online-status {\n position: absolute;\n top: -15px;\n left: -5px;\n font-size: 24px;\n color: #FF3C00;\n}\n.card.device-action .device-icon-container .device-online-status.status-online {\n color: #00FFAA;\n}\n.card.device-action .device-icon-container .device-icon {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n font-size: 64px;\n height: 120px;\n width: 100%;\n transition-duration: 0.2s;\n transition-property: color;\n}\n.card.device-action .card-title {\n display: flex;\n width: 100%;\n font-size: 14px;\n font-weight: 700;\n align-items: center;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n transition-duration: 0.2s;\n transition-property: background-color, color;\n}\n.card.device-action .device-name {\n font-size: 14px;\n line-height: 1.4;\n}\n.card.device-action.card-success {\n border-color: #00FFAA;\n}\n.card.device-action.card-success .card-title {\n background: #00FFAA;\n}\n.card.device-action.card-success .device-icon {\n color: #00FFAA;\n}\n.card.device-action.card-warning {\n border-color: #FFD900;\n}\n.card.device-action.card-warning .card-title {\n background: #FFD900;\n}\n.card.device-action.card-warning .device-icon {\n color: #FFD900;\n}\n.card.device-action.card-info {\n border-color: #8A2CE2;\n}\n.card.device-action.card-info .card-title {\n background: #8A2CE2;\n color: #F8F8F8;\n}\n.card.device-action.card-info .device-icon {\n color: #8A2CE2;\n}\n.card.device-action.card-secondary {\n border-color: #00B3FF;\n}\n.card.device-action.card-secondary .card-title {\n background: #00B3FF;\n color: #F8F8F8;\n}\n.card.device-action.card-secondary .device-icon {\n color: #00B3FF;\n}\n.card.device-action.card-danger, .card.device-action.card-error {\n border-color: #FF3C00;\n}\n.card.device-action.card-danger .card-title, .card.device-action.card-error .card-title {\n background: #FF3C00;\n}\n.card.device-action.card-danger .device-icon, .card.device-action.card-error .device-icon {\n color: #FF3C00;\n}\n\n.modal {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n.modal .modal-backdrop {\n position: fixed;\n z-index: 1010;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background: #0A0A0D;\n opacity: 0;\n transition-duration: 0.25s;\n transition-property: opacity;\n}\n.modal .modal-panel {\n position: relative;\n z-index: 1020;\n width: 100%;\n max-width: 960px;\n height: auto;\n min-height: 200px;\n max-height: 800px;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 15px;\n margin-top: 200px;\n background: #0A0A0D;\n border: 2px solid #F8F8F8;\n opacity: 0;\n transition-duration: 0.25s;\n transition-property: opacity, margin-top;\n}\n.modal .modal-panel .modal-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-right: 15px;\n}\n.modal .modal-panel .modal-header .modal-title {\n padding: 12px 15px;\n background: #F8F8F8;\n color: #0A0A0D;\n text-transform: uppercase;\n}\n.modal .modal-panel .modal-body {\n max-height: 700px;\n overflow-y: auto;\n padding: 18px;\n}\n.modal .modal-panel .modal-footer {\n padding: 18px;\n}\n.modal .modal-panel .modal-footer .actions {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n gap: 15px;\n width: 100%;\n}\n.modal.a-show .modal-backdrop {\n opacity: 1;\n}\n.modal.a-show .modal-panel {\n opacity: 1;\n margin-top: 0;\n}\n.modal.a-hide .modal-backdrop {\n opacity: 0;\n}\n.modal.a-hide .modal-panel {\n opacity: 0;\n margin-top: -200px;\n}\n\n.alert {\n padding: 12px 15px;\n border-left-style: solid;\n border-left-width: 4px;\n color: #F8F8F8;\n}\n.alert.alert-primary {\n border-color: #F8F8F8;\n background: rgba(248, 248, 248, 0.1);\n color: #F8F8F8;\n}\n.alert.alert-success {\n border-color: #00FFAA;\n background: rgba(0, 255, 170, 0.1);\n color: #00FFAA;\n}\n.alert.alert-secondary {\n border-color: #00B3FF;\n background: rgba(0, 179, 255, 0.1);\n color: rgb(51, 194.2, 255);\n}\n.alert.alert-info {\n border-color: #8A2CE2;\n background: rgba(138, 44, 226, 0.1);\n color: rgb(187.725, 133.675, 238.325);\n}\n.alert.alert-warning {\n border-color: #FFD900;\n background: rgba(255, 217, 0, 0.1);\n color: #FFD900;\n}\n.alert.alert-error, .alert.alert-danger {\n border-color: #FF3C00;\n background: rgba(255, 60, 0, 0.1);\n color: rgb(255, 118.5, 76.5);\n}\n\n/* =========================\n SPACING UTILITIES\n========================= */\n/* margin */\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n/* padding */\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n/* gap */\n.g-0 {\n gap: 0 !important;\n}\n\n/* margin */\n.m-1 {\n margin: 5px !important;\n}\n\n.mt-1 {\n margin-top: 5px !important;\n}\n\n.mr-1 {\n margin-right: 5px !important;\n}\n\n.mb-1 {\n margin-bottom: 5px !important;\n}\n\n.ml-1 {\n margin-left: 5px !important;\n}\n\n.mx-1 {\n margin-left: 5px !important;\n margin-right: 5px !important;\n}\n\n.my-1 {\n margin-top: 5px !important;\n margin-bottom: 5px !important;\n}\n\n/* padding */\n.p-1 {\n padding: 5px !important;\n}\n\n.pt-1 {\n padding-top: 5px !important;\n}\n\n.pr-1 {\n padding-right: 5px !important;\n}\n\n.pb-1 {\n padding-bottom: 5px !important;\n}\n\n.pl-1 {\n padding-left: 5px !important;\n}\n\n.px-1 {\n padding-left: 5px !important;\n padding-right: 5px !important;\n}\n\n.py-1 {\n padding-top: 5px !important;\n padding-bottom: 5px !important;\n}\n\n/* gap */\n.g-1 {\n gap: 5px !important;\n}\n\n/* margin */\n.m-2 {\n margin: 8px !important;\n}\n\n.mt-2 {\n margin-top: 8px !important;\n}\n\n.mr-2 {\n margin-right: 8px !important;\n}\n\n.mb-2 {\n margin-bottom: 8px !important;\n}\n\n.ml-2 {\n margin-left: 8px !important;\n}\n\n.mx-2 {\n margin-left: 8px !important;\n margin-right: 8px !important;\n}\n\n.my-2 {\n margin-top: 8px !important;\n margin-bottom: 8px !important;\n}\n\n/* padding */\n.p-2 {\n padding: 8px !important;\n}\n\n.pt-2 {\n padding-top: 8px !important;\n}\n\n.pr-2 {\n padding-right: 8px !important;\n}\n\n.pb-2 {\n padding-bottom: 8px !important;\n}\n\n.pl-2 {\n padding-left: 8px !important;\n}\n\n.px-2 {\n padding-left: 8px !important;\n padding-right: 8px !important;\n}\n\n.py-2 {\n padding-top: 8px !important;\n padding-bottom: 8px !important;\n}\n\n/* gap */\n.g-2 {\n gap: 8px !important;\n}\n\n/* margin */\n.m-3 {\n margin: 12px !important;\n}\n\n.mt-3 {\n margin-top: 12px !important;\n}\n\n.mr-3 {\n margin-right: 12px !important;\n}\n\n.mb-3 {\n margin-bottom: 12px !important;\n}\n\n.ml-3 {\n margin-left: 12px !important;\n}\n\n.mx-3 {\n margin-left: 12px !important;\n margin-right: 12px !important;\n}\n\n.my-3 {\n margin-top: 12px !important;\n margin-bottom: 12px !important;\n}\n\n/* padding */\n.p-3 {\n padding: 12px !important;\n}\n\n.pt-3 {\n padding-top: 12px !important;\n}\n\n.pr-3 {\n padding-right: 12px !important;\n}\n\n.pb-3 {\n padding-bottom: 12px !important;\n}\n\n.pl-3 {\n padding-left: 12px !important;\n}\n\n.px-3 {\n padding-left: 12px !important;\n padding-right: 12px !important;\n}\n\n.py-3 {\n padding-top: 12px !important;\n padding-bottom: 12px !important;\n}\n\n/* gap */\n.g-3 {\n gap: 12px !important;\n}\n\n/* margin */\n.m-4 {\n margin: 15px !important;\n}\n\n.mt-4 {\n margin-top: 15px !important;\n}\n\n.mr-4 {\n margin-right: 15px !important;\n}\n\n.mb-4 {\n margin-bottom: 15px !important;\n}\n\n.ml-4 {\n margin-left: 15px !important;\n}\n\n.mx-4 {\n margin-left: 15px !important;\n margin-right: 15px !important;\n}\n\n.my-4 {\n margin-top: 15px !important;\n margin-bottom: 15px !important;\n}\n\n/* padding */\n.p-4 {\n padding: 15px !important;\n}\n\n.pt-4 {\n padding-top: 15px !important;\n}\n\n.pr-4 {\n padding-right: 15px !important;\n}\n\n.pb-4 {\n padding-bottom: 15px !important;\n}\n\n.pl-4 {\n padding-left: 15px !important;\n}\n\n.px-4 {\n padding-left: 15px !important;\n padding-right: 15px !important;\n}\n\n.py-4 {\n padding-top: 15px !important;\n padding-bottom: 15px !important;\n}\n\n/* gap */\n.g-4 {\n gap: 15px !important;\n}\n\n/* margin */\n.m-5 {\n margin: 18px !important;\n}\n\n.mt-5 {\n margin-top: 18px !important;\n}\n\n.mr-5 {\n margin-right: 18px !important;\n}\n\n.mb-5 {\n margin-bottom: 18px !important;\n}\n\n.ml-5 {\n margin-left: 18px !important;\n}\n\n.mx-5 {\n margin-left: 18px !important;\n margin-right: 18px !important;\n}\n\n.my-5 {\n margin-top: 18px !important;\n margin-bottom: 18px !important;\n}\n\n/* padding */\n.p-5 {\n padding: 18px !important;\n}\n\n.pt-5 {\n padding-top: 18px !important;\n}\n\n.pr-5 {\n padding-right: 18px !important;\n}\n\n.pb-5 {\n padding-bottom: 18px !important;\n}\n\n.pl-5 {\n padding-left: 18px !important;\n}\n\n.px-5 {\n padding-left: 18px !important;\n padding-right: 18px !important;\n}\n\n.py-5 {\n padding-top: 18px !important;\n padding-bottom: 18px !important;\n}\n\n/* gap */\n.g-5 {\n gap: 18px !important;\n}\n\n/* margin */\n.m-6 {\n margin: 22px !important;\n}\n\n.mt-6 {\n margin-top: 22px !important;\n}\n\n.mr-6 {\n margin-right: 22px !important;\n}\n\n.mb-6 {\n margin-bottom: 22px !important;\n}\n\n.ml-6 {\n margin-left: 22px !important;\n}\n\n.mx-6 {\n margin-left: 22px !important;\n margin-right: 22px !important;\n}\n\n.my-6 {\n margin-top: 22px !important;\n margin-bottom: 22px !important;\n}\n\n/* padding */\n.p-6 {\n padding: 22px !important;\n}\n\n.pt-6 {\n padding-top: 22px !important;\n}\n\n.pr-6 {\n padding-right: 22px !important;\n}\n\n.pb-6 {\n padding-bottom: 22px !important;\n}\n\n.pl-6 {\n padding-left: 22px !important;\n}\n\n.px-6 {\n padding-left: 22px !important;\n padding-right: 22px !important;\n}\n\n.py-6 {\n padding-top: 22px !important;\n padding-bottom: 22px !important;\n}\n\n/* gap */\n.g-6 {\n gap: 22px !important;\n}\n\n/* margin */\n.m-7 {\n margin: 26px !important;\n}\n\n.mt-7 {\n margin-top: 26px !important;\n}\n\n.mr-7 {\n margin-right: 26px !important;\n}\n\n.mb-7 {\n margin-bottom: 26px !important;\n}\n\n.ml-7 {\n margin-left: 26px !important;\n}\n\n.mx-7 {\n margin-left: 26px !important;\n margin-right: 26px !important;\n}\n\n.my-7 {\n margin-top: 26px !important;\n margin-bottom: 26px !important;\n}\n\n/* padding */\n.p-7 {\n padding: 26px !important;\n}\n\n.pt-7 {\n padding-top: 26px !important;\n}\n\n.pr-7 {\n padding-right: 26px !important;\n}\n\n.pb-7 {\n padding-bottom: 26px !important;\n}\n\n.pl-7 {\n padding-left: 26px !important;\n}\n\n.px-7 {\n padding-left: 26px !important;\n padding-right: 26px !important;\n}\n\n.py-7 {\n padding-top: 26px !important;\n padding-bottom: 26px !important;\n}\n\n/* gap */\n.g-7 {\n gap: 26px !important;\n}\n\n/* margin */\n.m-8 {\n margin: 34px !important;\n}\n\n.mt-8 {\n margin-top: 34px !important;\n}\n\n.mr-8 {\n margin-right: 34px !important;\n}\n\n.mb-8 {\n margin-bottom: 34px !important;\n}\n\n.ml-8 {\n margin-left: 34px !important;\n}\n\n.mx-8 {\n margin-left: 34px !important;\n margin-right: 34px !important;\n}\n\n.my-8 {\n margin-top: 34px !important;\n margin-bottom: 34px !important;\n}\n\n/* padding */\n.p-8 {\n padding: 34px !important;\n}\n\n.pt-8 {\n padding-top: 34px !important;\n}\n\n.pr-8 {\n padding-right: 34px !important;\n}\n\n.pb-8 {\n padding-bottom: 34px !important;\n}\n\n.pl-8 {\n padding-left: 34px !important;\n}\n\n.px-8 {\n padding-left: 34px !important;\n padding-right: 34px !important;\n}\n\n.py-8 {\n padding-top: 34px !important;\n padding-bottom: 34px !important;\n}\n\n/* gap */\n.g-8 {\n gap: 34px !important;\n}\n\n/* margin */\n.m-9 {\n margin: 42px !important;\n}\n\n.mt-9 {\n margin-top: 42px !important;\n}\n\n.mr-9 {\n margin-right: 42px !important;\n}\n\n.mb-9 {\n margin-bottom: 42px !important;\n}\n\n.ml-9 {\n margin-left: 42px !important;\n}\n\n.mx-9 {\n margin-left: 42px !important;\n margin-right: 42px !important;\n}\n\n.my-9 {\n margin-top: 42px !important;\n margin-bottom: 42px !important;\n}\n\n/* padding */\n.p-9 {\n padding: 42px !important;\n}\n\n.pt-9 {\n padding-top: 42px !important;\n}\n\n.pr-9 {\n padding-right: 42px !important;\n}\n\n.pb-9 {\n padding-bottom: 42px !important;\n}\n\n.pl-9 {\n padding-left: 42px !important;\n}\n\n.px-9 {\n padding-left: 42px !important;\n padding-right: 42px !important;\n}\n\n.py-9 {\n padding-top: 42px !important;\n padding-bottom: 42px !important;\n}\n\n/* gap */\n.g-9 {\n gap: 42px !important;\n}\n\n/* margin */\n.m-10 {\n margin: 48px !important;\n}\n\n.mt-10 {\n margin-top: 48px !important;\n}\n\n.mr-10 {\n margin-right: 48px !important;\n}\n\n.mb-10 {\n margin-bottom: 48px !important;\n}\n\n.ml-10 {\n margin-left: 48px !important;\n}\n\n.mx-10 {\n margin-left: 48px !important;\n margin-right: 48px !important;\n}\n\n.my-10 {\n margin-top: 48px !important;\n margin-bottom: 48px !important;\n}\n\n/* padding */\n.p-10 {\n padding: 48px !important;\n}\n\n.pt-10 {\n padding-top: 48px !important;\n}\n\n.pr-10 {\n padding-right: 48px !important;\n}\n\n.pb-10 {\n padding-bottom: 48px !important;\n}\n\n.pl-10 {\n padding-left: 48px !important;\n}\n\n.px-10 {\n padding-left: 48px !important;\n padding-right: 48px !important;\n}\n\n.py-10 {\n padding-top: 48px !important;\n padding-bottom: 48px !important;\n}\n\n/* gap */\n.g-10 {\n gap: 48px !important;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.f-grid {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n\n.w-100 {\n width: 100%;\n}\n\n.w-200 {\n width: 200%;\n}\n\n.fs-xs {\n font-size: 12px;\n}\n\n.fs-sm {\n font-size: 13px;\n}\n\n.fs-md {\n font-size: 14px;\n}\n\n.fs-base {\n font-size: 16px;\n}\n\n.fs-lg {\n font-size: 17px;\n}\n\n.fs-xl {\n font-size: 20px;\n}\n\n* {\n box-sizing: border-box;\n}\n\n*::-webkit-scrollbar {\n width: 10px;\n}\n\n*::-webkit-scrollbar-track {\n width: 10px;\n background: #0A0A0D;\n cursor: pointer;\n}\n\n*::-webkit-scrollbar-thumb {\n width: 10px;\n background: #4A4A57;\n cursor: default;\n}\n\n*::-webkit-scrollbar-corner {\n background: transparent;\n height: 1px;\n}\n\n*::-webkit-scrollbar-button {\n display: none;\n}\n\n.ph.normalize {\n position: relative;\n top: 0.15em;\n}\n\n* {\n padding: 0;\n margin: 0;\n}\n\nhtml, body {\n font-family: \"IBM Plex Mono\", monospace;\n font-weight: 400;\n}\n\nbody {\n background-color: #0A0A0D;\n color: #F8F8F8;\n font-size: 15px;\n line-height: 1.45;\n letter-spacing: 0.01em;\n}\n\n.screen {\n display: none;\n}\n.screen.a-show {\n display: block;\n}\n\n.sidebar {\n width: 100%;\n}\n\n.main-container,\n.main-container {\n width: 100%;\n}\n\n.card.script-action, .card.device-action {\n max-width: 280px;\n}\n.card.script-action .card-content, .card.device-action .card-content {\n cursor: default;\n transition-duration: 0.2s;\n transition-property: color, opacity, background;\n}\n.card.script-action:not(.card-success):not(.card-error):not(.card-danger):hover, .card.device-action:not(.card-success):not(.card-error):not(.card-danger):hover {\n color: #0A0A0D;\n background: #FFD900;\n}\n.card.script-action .action-details-btn, .card.device-action .action-details-btn {\n color: #0A0A0D;\n font-size: 34px;\n position: relative;\n right: -10px;\n}\n.card.script-action.loading-state, .card.device-action.loading-state {\n position: relative;\n border-color: #FFD900;\n}\n.card.script-action.loading-state .device-icon-container, .card.device-action.loading-state .device-icon-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 100%;\n height: 100%;\n background: #FFD900;\n}\n.card.script-action.loading-state .device-icon-container .device-icon, .card.device-action.loading-state .device-icon-container .device-icon {\n color: #0A0A0D;\n}\n.card.script-action.loading-state .device-icon-container .device-icon .ph, .card.script-action.loading-state .device-icon-container .device-icon .ph-bold, .card.device-action.loading-state .device-icon-container .device-icon .ph, .card.device-action.loading-state .device-icon-container .device-icon .ph-bold {\n transform-origin: 50% 50%;\n animation: icon_spin 1.2s linear infinite;\n}\n\n.sidebar-container {\n max-width: 260px;\n width: 100%;\n}\n\n.tree .branch {\n display: flex;\n flex-direction: column;\n padding-left: 66px;\n}\n.tree .branch .title {\n font-size: 20px;\n}\n.tree .branch .branch-container {\n border: 2px solid #F8F8F8;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: max-content;\n margin-bottom: 22px;\n}\n.tree > .branch, .tree > .branch > .branch {\n padding-left: 0;\n}\n\n#area-devices-modal .modal-body {\n position: relative;\n min-height: 300px;\n}\n#area-devices-modal .modal-body .loader {\n margin: auto;\n position: relative;\n top: 120px;\n}\n\n.top-bar {\n width: 100%;\n}\n.top-bar > .row {\n justify-content: space-between;\n align-items: center;\n}\n\n.hud {\n width: 100%;\n padding: 18px;\n}\n.hud > .row {\n justify-content: space-between;\n align-items: center;\n gap: 15px;\n flex-wrap: wrap;\n}\n.hud .hud-btns {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 15px;\n}\n.hud .nav-toggle,\n.hud .reload-screen {\n font-size: 42px;\n width: 50px;\n height: 50px;\n background: #F8F8F8;\n color: #0A0A0D;\n}\n.hud .nav-toggle {\n position: relative;\n z-index: 710;\n}\n.hud .nav-toggle.state-off .icon-state-on {\n display: none;\n}\n.hud .nav-toggle.state-on .icon-state-off {\n display: none;\n}\n.hud .app-title {\n padding: 8px 15px;\n text-transform: uppercase;\n}\n.hud .navigation {\n position: fixed;\n z-index: 700;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: #0A0A0D;\n opacity: 0;\n visibility: hidden;\n transition-duration: 0.2s;\n transition-property: visibility, opacity;\n}\n.hud .navigation .container {\n width: 100%;\n max-width: 600px;\n height: 100vh;\n margin: auto;\n padding: 12px;\n display: flex;\n align-items: center;\n}\n.hud .navigation .nav-items {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 48px;\n align-items: center;\n justify-content: space-between;\n height: max-content;\n margin-top: 100px;\n transition-duration: 0.2s;\n transition-property: margin-top;\n}\n.hud .navigation .nav-link {\n text-decoration: none;\n color: #F8F8F8;\n}\n.hud .navigation .nav-item {\n width: 160px;\n border: 2px solid #F8F8F8;\n padding: 22px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n transition-property: color, background, border-color;\n transition-duration: 0.2s;\n}\n.hud .navigation .nav-item .nav-icon {\n text-align: center;\n}\n.hud .navigation .nav-item .nav-icon .ph, .hud .navigation .nav-item .nav-icon .ph-bold {\n font-size: 64px;\n}\n.hud .navigation .nav-item .nav-text {\n width: 100%;\n text-align: center;\n text-transform: uppercase;\n font-size: 17px;\n}\n.hud .navigation .nav-item:hover {\n background: #00FFAA;\n border-color: #00FFAA;\n color: #0A0A0D;\n}\n.hud .navigation.a-show {\n visibility: visible;\n opacity: 1;\n}\n.hud .navigation.a-show .nav-items {\n margin-top: 0;\n}\n.hud .navigation.a-hide .nav-items {\n margin-top: -100px;\n}\n\n.load-screen {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n visibility: hidden;\n opacity: 0;\n background: #0A0A0D;\n transition-duration: 0.2s;\n transition-property: opacity, visibility;\n}\n.load-screen.a-show {\n visibility: visible;\n opacity: 1;\n z-index: 900;\n transition-duration: 0s;\n}\n\n.error-screen {\n display: none;\n}\n.error-screen .container {\n display: flex;\n align-items: center;\n flex-direction: column;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 15px;\n padding-top: 20%;\n max-width: 420px;\n width: 100%;\n margin: auto;\n}\n.error-screen .icon-container {\n color: #FF3C00;\n}\n.error-screen .icon-container .ph, .error-screen .icon-container .ph-bold {\n font-size: 72px;\n}\n.error-screen .error-title {\n padding: 8px 12px;\n}\n.error-screen .error-text {\n font-size: 16px;\n text-align: center;\n}\n.error-screen.a-show {\n display: block;\n}","/* =========================\n\t FONT FAMILIES\n========================= */\n\n$font-family-base: \"IBM Plex Mono\", monospace;\n$font-family-code: $font-family-base;\n\n/* =========================\n\t FONT WEIGHTS\n========================= */\n\n$font-weight-regular: 400;\n$font-weight-medium: 500;\n$font-weight-semibold: 600;\n$font-weight-bold: 700;\n\n/* =========================\n\t FONT SIZES (scale)\n========================= */\n\n$font-size-xs: 12px;\n$font-size-sm: 13px;\n$font-size-md: 14px;\n$font-size-base: 16px;\n$font-size-lg: 17px;\n$font-size-xl: 20px;\n\n$font-size-h1: 36px;\n$font-size-h2: 28px;\n$font-size-h3: 24px;\n$font-size-h4: 20px;\n$font-size-h5: 18px;\n$font-size-h6: 16px;\n\n/* =========================\n\t LINE HEIGHTS\n========================= */\n\n$line-height-base: 1;\n$line-height-tight: 1.15;\n$line-height-snug: 1.25;\n$line-height-normal: 1.4;\n$line-height-relaxed: 1.6;\n\n/* =========================\n\t LETTER SPACING\n========================= */\n\n$letter-spacing-tight: -0.01em;\n$letter-spacing-normal: 0;\n$letter-spacing-wide: 0.04em;\n\n/* =========================\n\t BASE TYPOGRAPHY\n========================= */\n\nhtml {\n\tfont-size: 100%;\n}\n\nbody {\n\tfont-family: $font-family-base;\n\tfont-size: $font-size-base;\n\tfont-weight: $font-weight-regular;\n\tline-height: $line-height-relaxed;\n\tletter-spacing: $letter-spacing-normal;\n}\n\n/* =========================\n\t HEADINGS\n========================= */\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-family: $font-family-base;\n\tfont-weight: $font-weight-semibold;\n\tline-height: $line-height-snug;\n\tmargin: 0;\n\n\t&.contrast {\n\t\tbackground: $color-text-light;\n\t\tcolor: $color-black;\n\t}\n}\n\nh1 {\n\tfont-size: $font-size-h1;\n\tletter-spacing: $letter-spacing-tight;\n}\n\nh2 {\n\tfont-size: $font-size-h2;\n}\n\nh3 {\n\tfont-size: $font-size-h3;\n}\n\nh4 {\n\tfont-size: $font-size-h4;\n}\n\nh5 {\n\tfont-size: $font-size-h5;\n}\n\nh6 {\n\tfont-size: $font-size-h6;\n\tfont-weight: $font-weight-medium;\n}\n\n/* =========================\n\t TEXT VARIANTS\n========================= */\n\n.text,\np {\n\tfont-size: $font-size-base;\n\tline-height: $line-height-relaxed;\n}\n\n.text-sm {\n\tfont-size: $font-size-sm;\n\tline-height: $line-height-normal;\n}\n\n.text-lg {\n\tfont-size: $font-size-lg;\n\tline-height: $line-height-relaxed;\n}\n\n.text-muted {\n\tfont-size: $font-size-sm;\n\tcolor: $color-text-dark;\n}\n\n.text-strong,\nstrong {\n\tfont-weight: $font-weight-semibold;\n}\n\n.text-bold {\n\tfont-weight: $font-weight-bold;\n}\n\n.text-italic,\nem {\n\tfont-style: italic;\n}\n\n/* =========================\n\t CODE / MONO\n========================= */\n\ncode,\npre,\n.code {\n\tfont-family: $font-family-code;\n\tfont-size: $font-size-base;\n\tline-height: $line-height-normal;\n\tbackground-color: $color-dark;\n}\n\npre {\n\tfont-size: $font-size-base;\n\tline-height: $line-height-relaxed;\n\twhite-space: pre-wrap;\n}\n\npre code,\n.code {\n\ttab-size: 2;\n\t-moz-tab-size: 2;\n}\n\n/* =========================\n\t LINKS\n========================= */\n\na {\n\tfont-weight: $font-weight-medium;\n\ttext-decoration: none;\n}\n\n.link {\n\tfont-size: inherit;\n\tfont-weight: $font-weight-medium;\n}\n\n/* =========================\n\t LABELS / META\n========================= */\n\n.label {\n\tfont-size: $font-size-sm;\n\tfont-weight: $font-weight-medium;\n\tline-height: $line-height-normal;\n}\n\n.hint,\n.meta {\n\tfont-size: $font-size-xs;\n\tline-height: $line-height-normal;\n}\n\n/* =========================\n\t TABLE TEXT\n========================= */\n\n.table {\n\tfont-size: $font-size-sm;\n\tline-height: $line-height-normal;\n\n\tth {\n\t\tfont-weight: $font-weight-semibold;\n\t}\n\n\ttd {\n\t\tfont-weight: $font-weight-regular;\n\t}\n}\n\n/* =========================\n\t LISTS\n========================= */\n\n.list {\n\tfont-size: $font-size-base;\n\tline-height: $line-height-relaxed;\n}\n\n.list-item {\n\tfont-size: inherit;\n}\n\n/* =========================\n\t MODALS\n========================= */\n\n.modal-title {\n\tfont-size: $font-size-h4;\n\tfont-weight: $font-weight-semibold;\n}\n\n.modal-body {\n\tfont-size: $font-size-base;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n\n.toast-title {\n\tfont-size: $font-size-md;\n\tfont-weight: $font-weight-semibold;\n}\n\n.toast-text {\n\tfont-size: $font-size-sm;\n\tline-height: $line-height-normal;\n}\n\n\n",".palette {\n\tdisplay: flex;\n\tflex-direction: row;\n\tgap: $space-sm;\n\n\t.color {\n\t\t.color-box {\n\t\t\twidth: 100px;\n\t\t\theight: 80px;\n\t\t}\n\t}\n}\n\n/* BACKGROUND COLORS */\n\nbody {\n\t.bg-primary {\n\t\tbackground: $color-primary;\n\t}\n\n\t.bg-secondary {\n\t\tbackground: $color-secondary;\n\t}\n\n\t.bg-success {\n\t\tbackground: $color-success;\n\t}\n\n\t.bg-accent {\n\t\tbackground: $color-accent;\n\t}\n\n\t.bg-info {\n\t\tbackground: $color-info;\n\t}\n\n\t.bg-warning {\n\t\tbackground: $color-warning;\n\t}\n\n\t.bg-error {\n\t\tbackground: $color-error;\n\t}\n\n\t/* TEXT COLORS */\n\n\t.text-color-primary {\n\t\tcolor: $color-primary;\n\t}\n\n\t.text-color-secondary {\n\t\tcolor: $color-secondary;\n\t}\n\n\t.text-color-success {\n\t\tcolor: $color-success;\n\t}\n\n\t.text-color-accent {\n\t\tcolor: $color-accent;\n\t}\n\n\t.text-color-info {\n\t\tcolor: $color-info;\n\t}\n\n\t.text-color-warning {\n\t\tcolor: $color-warning;\n\t}\n\n\t.text-color-error {\n\t\tcolor: $color-error;\n\t}\n}","/* HTML:
*/\n.loader {\n width: 45px;\n aspect-ratio: 1;\n --c:no-repeat linear-gradient(#FF3C00 0 0);\n background: \n var(--c) 0 0,\n var(--c) 0 100%, \n var(--c) 50% 0, \n var(--c) 50% 100%, \n var(--c) 100% 0, \n var(--c) 100% 100%;\n animation: l12 1s infinite;\n}\n@keyframes l12 {\n 0%,100%{background-size:20% 50%}\n 16.67% {background-size:20% 30%, 20% 30%, 20% 50%, 20% 50%, 20% 50%, 20% 50%}\n 33.33% {background-size:20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 50%, 20% 50%}\n 50% {background-size:20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%}\n 66.67% {background-size:20% 50%, 20% 50%, 20% 30%, 20% 30%, 20% 30%, 20% 30%}\n 83.33% {background-size:20% 50%, 20% 50%, 20% 50%, 20% 50%, 20% 30%, 20% 30%}\n}","@keyframes icon_spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.btn {\n\tfont-family: $font-family-base;\n\tfont-size: $font-size-lg;\n\tfont-weight: $font-weight-semibold;\n\tline-height: $line-height-base;\n\tletter-spacing: $letter-spacing-wide;\n\tpadding: $space-3 $space-lg;\n\tborder-radius: 0;\n\tborder-width: 2px;\n\tborder-left-width: 6px;\n\tborder-style: solid;\n\tborder-color: $color-primary;\n\ttext-transform: uppercase;\n\tbackground-color: transparent;\n\ttransition-duration: .2s;\n\ttransition-property: background-color, border-color, color;\n\n\t&.with-icon {\n\t\tborder-left-width: 48px;\n\t\tposition: relative;\n\n\t\t.ph,\n\t\t.ph-bold {\n\t\t\tposition: absolute;\n\t\t\tcolor: #0a0a0d;\n\t\t\tleft: -48px;\n\t\t\ttop: 0;\n\t\t\tfont-size: 28px;\n\t\t\theight: 100%;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\twidth: 48px;\n\t\t\tjustify-content: center;\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: color, left;\n\t\t}\n\t}\n\n\t&:hover {\n\t\t&.with-icon:not(.loading-state):not(.btn-small) {\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tleft: -28px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-primary {\n\t\tcolor: $color-primary;\n\t\tborder-color: $color-primary;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-primary;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-secondary {\n\t\tcolor: $color-secondary;\n\t\tborder-color: $color-secondary;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-secondary;\n\t\t\tcolor: $color-text-light;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-light;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-accent {\n\t\tcolor: $color-accent;\n\t\tborder-color: $color-accent;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-accent;\n\t\t\tcolor: $color-text-light;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-light;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-danger {\n\t\tcolor: $color-error;\n\t\tborder-color: $color-error;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-error;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-warning {\n\t\tcolor: $color-warning;\n\t\tborder-color: $color-warning;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-warning;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-success {\n\t\tcolor: $color-success;\n\t\tborder-color: $color-success;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-success;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-info {\n\t\tcolor: $color-info;\n\t\tborder-color: $color-info;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-info;\n\t\t\tcolor: $color-text-light;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-light;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&[disabled]:not(.loading-state) {\n\t\tcolor: $color-text-dark;\n\t\tborder-color: $color-dark;\n\t\tbackground-color: $color-dark;\n\n\t\t&.with-icon {\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tcolor: $color-text-dark;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-dark;\n\t\t\tcolor: $color-text-dark;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-dark;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.with-icon:not(.btn-small) {\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tleft: -28px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-small {\n\t\tfont-size: $font-size-md;\n\t\tfont-weight: $font-weight-medium;\n\t\tpadding: $space-sm $space-sm;\n\n\t\t&.with-icon {\n\t\t\tborder-left-width: 32px;\n\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tleft: -40px;\n\t\t\t\tfont-size: 23px;\n\t\t\t}\n\n\t\t\t&.loading-state {\n\t\t\t\t.ph, .ph-bold {\n\t\t\t\t\tfont-size: 30px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-large {\n\t\tfont-size: $font-size-xl;\n\t\tfont-weight: $font-weight-bold;\n\t\tpadding: $space-md $space-xxl;\n\t}\n\n\t&.loading-state {\n\t\tcolor: $color-black !important;\n\t\tborder-color: $color-primary !important;\n\t\tbackground-color: $color-primary !important;\n\n\t\t.ph, .ph-bold {\n\t\t\tfont-size: 31px;\n\t\t\ttransform-origin: 50% 50%;\n \t\tanimation: icon_spin 1.2s linear infinite;\n\t\t}\n\t}\n}\n\n.btn-icon {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\twidth: 30px;\n\theight: 30px;\n\n\tbackground: transparent;\n\tcolor: $color-text-light;\n\tfont-size: $font-size-xl;\n\tborder: 0;\n\n\ttransition-duration: .2s;\n\ttransition-property: color;\n\n\t\n\t.ph {\n\t\ttransform: rotate(0);\n\t\ttransition-duration: .2s;\n\t\ttransition-property: transform;\n\t}\n\n\t&:not(.without-hover):hover {\n\t\tcolor: $color-text-dark;\n\n\t\t.ph {\n\t\t\ttransform: rotate(90deg);\n\t\t}\n\t}\n}\n",".form-group {\n\t.label {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tfont-size: $font-size-lg;\n\t\twidth: 100%;\n\t\tmax-width: 600px;\n\t\tposition: relative;\n\n\t\t& > .ph {\n\t\t\tposition: absolute;\n\t\t\tcolor: $color-text-light;\n\t\t\tleft: 0;\n\t\t\tbottom: 2px;\n\t\t\tfont-size: 28px;\n\t\t\theight: 56px;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\twidth: 48px;\n\t\t\tjustify-content: center;\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: color, left;\n\t\t}\n\n\t\t.input {\n\t\t\tfont-family: $font-family-base;\n\t\t\tfont-size: $font-size-base;\n\t\t\tfont-weight: $font-weight-medium;\n\t\t\tline-height: $line-height-base;\n\t\t\tletter-spacing: $letter-spacing-wide;\n\t\t\tpadding: $space-3 $space-lg;\n\t\t\tmargin-top: $space-sm;\n\t\t\tborder-radius: 0;\n\t\t\tborder-width: 2px;\n\t\t\tborder-bottom-width: 6px;\n\t\t\tborder-style: solid;\n\t\t\tborder-color: $color-text-light;\n\t\t\tcolor: $color-text-light;\n\t\t\tbackground-color: transparent;\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: background-color, border-color, color;\n\n\t\t\t&:hover {\n\t\t\t\tborder-bottom-color: $color-text-dark;\n\t\t\t}\n\n\t\t\t&:focus {\n\t\t\t\toutline: none;\n\t\t\t\tborder-color: $color-electric-blue;\n\t\t\t}\n\n\t\t\t&::placeholder {\n\t\t\t\tcolor: $color-text-dark;\n\t\t\t}\n\t\t}\n\n\t\ttextarea.input {\n\t\t\theight: 120px;\n\t\t\tline-height: $line-height-snug;\n\t\t\tresize: none;\n\t\t}\n\n\t\t.ph + .input,\n\t\t.ph + .select-wrap .select {\n\t\t\tpadding-left: 42px;\n\t\t}\n\n\t\t.select-wrap {\n\t\t\tmargin-top: $space-sm;\n\t\t}\n\n\t\t.select {\n\t\t\twidth: 100%;\n\t\t\theight: 56px;\n\t\t\tmargin-top: 0;\n\n\t\t\t/* убрать нативную стрелку */\n\t\t\tappearance: none;\n\t\t\t-webkit-appearance: none;\n\t\t\t-moz-appearance: none;\n\n\t\t\t&:focus {\n\t\t\t\toutline: none;\n\t\t\t}\n\n\t\t\toption {\n\t\t\t\tcolor: $color-text-light;\n\t\t\t\tbackground: $color-dark;\n\t\t\t}\n\t\t}\n\n\t\t.select-wrap::after {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\tright: $space-lg;\n\t\t\tbottom: 18px;\n\t\t\ttransform: translateY(-50%);\n\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-left: 8px solid transparent;\n\t\t\tborder-right: 8px solid transparent;\n\t\t\tborder-top: 10px solid $color-text-light;\n\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t&.error {\n\t\t\t.input:not(:focus) {\n\t\t\t\tborder-color: $color-error;\n\t\t\t}\n\n\t\t\t& + .input-info {\n\t\t\t\tcolor: $color-warning;\n\t\t\t}\n\t\t}\n\t}\n\n\t.input-info {\n\t\tfont-size: $font-size-md;\n\t\tmargin-top: $space-2;\n\n\t\t.ph {\n\t\t\tposition: relative;\n\t\t\ttop: 1px;\n\t\t}\n\t}\n}\n\n.radio {\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\tgap: $space-sm;\n\talign-items: center;\n\n\tinput[type=\"radio\"] {\n\t\tdisplay: none;\n\t}\n\n\t.radio-control {\n\t\tdisplay: inline-block;\n\t\tborder-radius: 100%;\n\t\tborder: 2px solid $color-primary;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tbackground: transparent;\n\t\ttransition-duration: .2s;\n\t\ttransition-property: background, border-color;\n\t}\n\n\t&:hover .radio-control {\n\t\tbackground: $color-grey;\n\t}\n\n\tinput[type=\"radio\"]:checked + .radio-control {\n\t\tbackground: $color-primary;\n\t}\n\n\tinput[type=\"radio\"]:disabled + .radio-control {\n\t\tbackground: $color-grey;\n\t\tborder-color: $color-grey;\n\t}\n\n\t.radio-label {\n\t\tfont-size: $font-size-lg;\n\t}\n}\n\n.checkbox {\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\tgap: $space-sm;\n\talign-items: center;\n\n\tinput[type=\"checkbox\"] {\n\t\tdisplay: none;\n\t}\n\n\t.checkbox-control {\n\t\theight: 16px;\n\t\twidth: 30px;\n\t\tborder: 2px solid $color-primary;\n\t\tposition: relative;\n\t\tbackground: transparent;\n\t\ttransition-duration: .2s;\n\t\ttransition-property: border-color, background;\n\t\tdisplay: block;\n\t}\n\n\t.checkbox-control:before {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 20px;\n\t\twidth: 20px;\n\t\tbackground: $color-primary;\n\t\tposition: absolute;\n\t\tleft: -6px;\n\t\ttop: -4px;\n\t\ttransition-duration: .2s;\n\t\ttransition-property: left, background;\n\t}\n\n\t&:hover .checkbox-control {\n\t\tbackground: $color-grey;\n\t}\n\n\tinput[type=\"checkbox\"]:checked:not(:disabled) + .checkbox-control {\n\t\tbackground: $color-secondary;\n\t\tborder-color: $color-secondary;\n\t}\n\n\tinput[type=\"checkbox\"]:checked + .checkbox-control:before {\n\t\tleft: 12px;\n\t}\n\n\tinput[type=\"checkbox\"]:disabled + .checkbox-control {\n\t\tborder-color: $color-grey;\n\t}\n\n\tinput[type=\"checkbox\"]:disabled + .checkbox-control:before {\n\t\tbackground: $color-grey;\n\t}\n}\n",".list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: $space-1;\n\tlist-style-type: none;\n\tpadding-left: 0;\n\n\t.list-item {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: $space-sm;\n\t\tmargin-left: 0;\n\t}\n\n\t&.list-ordered {\n\t\tlist-style-type: decimal;\n\t\tdisplay: list-item;\n\t\tmargin-left: 30px;\n\n\t\t.list-item {\n\t\t\tdisplay: list-item;\n\t\t}\n\t}\n\n\t&.list-definition {\n\t\tgap: $space-md;\n\n\t\t.list-row {\n\t\t\tborder-left: 2px solid $color-primary;\n\n\t\t\t.list-term::before,\n\t\t\t.list-desc::before {\n\t\t\t\tcontent: \"\";\n\t\t\t\theight: 2px;\n\t\t\t\twidth: $space-3;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 0;\n\t\t\t\tmargin-top: -1px;\n\t\t\t\tdisplay: block;\n\t\t\t\tbackground: $color-primary;\n\t\t\t}\n\n\t\t\t.list-term,\n\t\t\t.list-desc {\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.list-term {\n\t\t\t\tpadding-left: $space-5;\n\t\t\t\tfont-size: $font-size-xl;\n\t\t\t}\n\n\t\t\t.list-desc {\n\t\t\t\tpadding-left: $space-5;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.with-icons {\n\t\t.ph {\n\t\t\t// icon styles if needed\n\t\t}\n\t}\n\n\t&.list-nav {\n\t\tmax-width: 420px;\n\t\twidth: 100%;\n\t\tgap: 0;\n\n\t\t.list-item {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\talign-items: flex-start;\n\t\t\theight: 50px;\n\t\t\tmargin: 0;\n\n\t\t\t.list-action {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tpadding: $space-2 $space-3;\n\t\t\t\tborder: 0;\n\n\t\t\t\tfont-size: $font-size-lg;\n\t\t\t\tbackground: $color-dark;\n\t\t\t\tcolor: inherit;\n\n\t\t\t\ttransition-duration: .2s;\n\t\t\t\ttransition-property: background;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: $color-electric-blue;\n\t\t\t\t}\n\n\t\t\t\t.list-label {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: row;\n\t\t\t\t\tgap: $space-2;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tletter-spacing: -0.05em;\n\t\t\t\t\tfont-weight: 400;\n\t\t\t\t}\n\n\t\t\t\t.list-meta {\n\t\t\t\t\tpadding: $space-2;\n\t\t\t\t\tbackground: $color-neon-green;\n\t\t\t\t\tcolor: $color-black;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.list-item-active {\n\t\t\t\t.list-action {\n\t\t\t\t\tbackground: $color-electric-blue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.list-actions {\n\t\twidth: 100%;\n\t\tmax-width: 420px;\n\t\tgap: $space-lg;\n\n\t\t.list-item {\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: flex-start;\n\n\t\t\t.list-content {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: $space-2;\n\n\t\t\t\t.list-title {\n\t\t\t\t\tfont-size: $font-size-xl;\n\t\t\t\t\tline-height: $line-height-base;\n\t\t\t\t}\n\n\t\t\t\t.list-subtitle {\n\t\t\t\t\t// subtitle styles\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.list-controls {\n\t\t\t\t// controls styles\n\t\t\t}\n\t\t}\n\t}\n}\n",".badge {\n\tbackground: $color-primary;\n\tcolor: $color-dark;\n\tpadding: $space-1 $space-2;\n\tfont-size: $font-size-base;\n\tdisplay: inline-block;\n\n\t&.badge-success {\n\t\tbackground: $color-success;\n\t}\n\n\t&.badge-warning {\n\t\tbackground: $color-warning;\n\t}\n\n\t&.badge-error,\n\t&.badge-danger {\n\t\tbackground: $color-error;\n\t}\n\n\t&.badge-info {\n\t\tbackground: $color-info;\n\t\tcolor: $color-text-light;\n\t}\n\n\t&.badge-secondary {\n\t\tbackground: $color-secondary;\n\t\tcolor: $color-text-light;\n\t}\n}\n",".table {\n\ttext-align: left;\n\tborder: 2px solid $color-primary;\n\tpadding: $space-4;\n\n\t.table-caption {\n\t\ttext-align: left;\n\t\tfont-size: $font-size-xl;\n\t\tbackground: $color-primary;\n\t\twidth: max-content;\n\t\tcolor: $color-dark;\n\t\tpadding: $space-1 $space-3;\n\t\tmargin-bottom: 0;\n\t}\n\n\t&.table-empty {\n\t\twidth: 100%;\n\n\t\t.is-empty {\n\t\t\twidth: 100%;\n\t\t\tpadding: $space-4;\n\t\t\tfont-size: $font-size-base;\n\t\t\tcolor: $color-text-dark;\n\t\t\ttext-align: left;\n\t\t}\n\t}\n\n\t.table-row {\n\t\tth,\n\t\ttd {\n\t\t\tpadding: $space-3 $space-5;\n\t\t\tfont-size: $font-size-base;\n\t\t\tvertical-align: top;\n\t\t}\n\n\t\tth {\n\t\t\t// header cell styles if needed\n\t\t}\n\t}\n\n\t.table-head {\n\t\t// thead styles\n\t}\n\n\t.table-body {\n\t\t// tbody styles\n\t}\n\n\t.table-foot {\n\t\tth,\n\t\ttd {\n\t\t\tpadding-top: $space-4;\n\t\t}\n\t}\n}\n",".toast {\n\tposition: fixed;\n\tbottom: -100px;\n\tright: $space-4;\n\tmax-width: 420px;\n\n\tbackground: $color-dark;\n\tborder: 2px solid $color-text-light;\n\tpadding: 0;\n\topacity: 0;\n\n\ttransition-duration: .25s;\n\ttransition-property: opacity, top, bottom;\n\n\t&.a-show {\n\t\tbottom: $space-4;\n\t\topacity: 1;\n\t}\n\n\t&.a-hide {\n\t\tbottom: $space-4 + 100px;\n\t\topacity: 0;\n\t}\n\n\t.toast-content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0;\n\n\t\t.toast-title {\n\t\t\tfont-size: $font-size-h3;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tgap: $space-2;\n\t\t\talign-items: center;\n\t\t\tcolor: $color-black;\n\t\t\tbackground: $color-primary;\n\t\t\tpadding: $space-1 $space-2;\n\t\t\tpadding-right: $space-9;\n\t\t}\n\n\t\t.toast-text {\n\t\t\tfont-size: $font-size-base;\n\t\t\tpadding: $space-6 $space-4;\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\n\t.toast-close {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tcolor: $color-black;\n\t\theight: 40px;\n\t\twidth: 40px;\n\n\t\t&:hover {\n\t\t\tcolor: $color-dark;\n\t\t}\n\t}\n\n\t&.toast-info {\n\t\t// default info styles (inherits primary)\n\t}\n\n\t&.toast-success {\n\t\tborder-color: $color-success;\n\n\t\t.toast-title {\n\t\t\tbackground: $color-success;\n\t\t}\n\t}\n\n\t&.toast-warning {\n\t\tborder-color: $color-warning;\n\n\t\t.toast-title {\n\t\t\tbackground: $color-warning;\n\t\t}\n\t}\n\n\t&.toast-danger {\n\t\tborder-color: $color-error;\n\n\t\t.toast-title {\n\t\t\tbackground: $color-error;\n\t\t}\n\t}\n}\n",".card {\n\tmax-width: 420px;\n\twidth: 100%;\n\tborder: 2px solid $color-text-light;\n\n\t.card-title {\n\t\tcolor: $color-black;\n\t\tbackground: $color-text-light;\n\t\tpadding: $space-2 $space-3;\n\t}\n\n\t.card-content {\n\t\tpadding: $space-4;\n\n\t\t.card-thumb {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\tp {\n\t\t\tmargin-top: $space-2;\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n\n\t.card-footer {\n\t\tpadding: $space-2 $space-4;\n\t\tpadding-bottom: $space-4;\n\t}\n\n\t&.device-action {\n\t\tmax-width: 220px;\n\n\t\ttransition-duration: .2s;\n\t\ttransition-property: border-color;\n\n\t\t.device-icon-container {\n\t\t\tposition: relative;\n\n\t\t\t.device-online-status {\n\t\t\t\tposition: absolute;\n\t\t top: -15px;\n \t\tleft: -5px;\n\t\t\n\t\t\t\tfont-size: 24px;\n\t\t\t\tcolor: $color-error;\n\n\t\t\t\t&.status-online {\n\t\t\t\t\tcolor: $color-success;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\talign-items: center;\n \t\tjustify-content: center;\n\t\t\t\t\n\t\t\t\tfont-size: 64px;\n\t\t\t\theight: 120px;\n\t\t\t\twidth: 100%;\n\n\t\t\t\ttransition-duration: .2s;\n\t\t\t\ttransition-property: color;\n\t\t\t}\n\t\t}\n\n\t\t.card-title {\n\t\t\tdisplay: flex;\n\t\t\twidth: 100%;\n\t\t\tfont-size: $font-size-md;\n\t\t\tfont-weight: $font-weight-bold;\n\n\t\t\talign-items: center;\n\t flex-direction: row;\n\t flex-wrap: nowrap;\n\t justify-content: space-between;\n\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: background-color, color;\n\t\t}\n\n\t\t.device-name {\n\t\t\tfont-size: $font-size-md;\n\t\t\tline-height: $line-height-normal;\n\t\t}\n\n\t\t&.card-success {\n\t\t\tborder-color: $color-success;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-success;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-success;\n\t\t\t}\n\t\t}\n\n\t\t&.card-warning {\n\t\t\tborder-color: $color-warning;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-warning;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-warning;\n\t\t\t}\n\t\t}\n\n\t\t&.card-info {\n\t\t\tborder-color: $color-info;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-info;\n\t\t\t\tcolor: $color-text-light;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-info;\n\t\t\t}\n\t\t}\n\n\t\t&.card-secondary {\n\t\t\tborder-color: $color-secondary;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-secondary;\n\t\t\t\tcolor: $color-text-light;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-secondary;\n\t\t\t}\n\t\t}\n\n\t\t&.card-danger, &.card-error {\n\t\t\tborder-color: $color-error;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-error;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-error;\n\t\t\t}\n\t\t}\n\t}\n}\n",".modal {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tz-index: 1000;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\n\t.modal-backdrop {\n\t\tposition: fixed;\n\t\tz-index: 1010;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\n\t\tbackground: $color-black;\n\t\topacity: 0;\n\n\t\ttransition-duration: .25s;\n\t\ttransition-property: opacity;\n\t}\n\n\t.modal-panel {\n\t\tposition: relative;\n\t\tz-index: 1020;\n\n\t\twidth: 100%;\n\t\tmax-width: 960px;\n\t\theight: auto;\n\t\tmin-height: 200px;\n\t\tmax-height: 800px;\n\n\t\tpadding: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: $space-4;\n\t\tmargin-top: 200px;\n\n\t\tbackground: $color-black;\n\t\tborder: 2px solid $color-text-light;\n\t\topacity: 0;\n\n\t\ttransition-duration: .25s;\n\t\ttransition-property: opacity, margin-top;\n\n\t\t.modal-header {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: center;\n\t\t\tpadding-right: $space-4;\n\n\t\t\t.modal-title {\n\t\t\t\tpadding: $space-3 $space-4;\n\t\t\t\tbackground: $color-text-light;\n\t\t\t\tcolor: $color-black;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t}\n\t\t}\n\n\t\t.modal-body {\n\t\t\tmax-height: 700px;\n\t\t\toverflow-y: auto;\n\t\t\tpadding: $space-5;\n\t\t}\n\n\t\t.modal-footer {\n\t\t\tpadding: $space-5;\n\n\t\t\t.actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\tjustify-content: flex-end;\n\t\t\t\tgap: $space-4;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.a-show {\n\t\t.modal-backdrop {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t.modal-panel {\n\t\t\topacity: 1;\n\t\t\tmargin-top: 0;\n\t\t}\n\t}\n\n\t&.a-hide {\n\t\t.modal-backdrop {\n\t\t\topacity: 0;\n\t\t}\n\n\t\t.modal-panel {\n\t\t\topacity: 0;\n\t\t\tmargin-top: -200px;\n\t\t}\n\t}\n}\n","$alert-bg-alpha: 0.1;\n\n.alert {\n\tpadding: $space-3 $space-4;\n\tborder-left-style: solid;\n\tborder-left-width: 4px;\n\tcolor: $color-text-light;\n\n\t&.alert-primary {\n\t\tborder-color: $color-primary;\n\t\tbackground: rgba($color-primary, $alert-bg-alpha);\n\t\tcolor: $color-primary;\n\t}\n\n\t&.alert-success {\n\t\tborder-color: $color-success;\n\t\tbackground: rgba($color-success, $alert-bg-alpha);\n\t\tcolor: $color-success;\n\t}\n\n\t&.alert-secondary {\n\t\tborder-color: $color-secondary;\n\t\tbackground: rgba($color-secondary, $alert-bg-alpha);\n\t\tcolor: lighten($color-secondary, 10%);\n\t}\n\n\t&.alert-info {\n\t\tborder-color: $color-info;\n\t\tbackground: rgba($color-info, $alert-bg-alpha);\n\t\tcolor: lighten($color-info, 20%);\n\t}\n\n\t&.alert-warning {\n\t\tborder-color: $color-warning;\n\t\tbackground: rgba($color-warning, $alert-bg-alpha);\n\t\tcolor: $color-warning;\n\t}\n\n\t&.alert-error, &.alert-danger {\n\t\tborder-color: $color-error;\n\t\tbackground: rgba($color-error, $alert-bg-alpha);\n\t\tcolor: lighten($color-error, 15%);\n\t}\n}","/* =========================\n SPACING UTILITIES\n========================= */\n\n@each $key, $value in $spaces {\n\n /* margin */\n .m-#{$key} { margin: $value !important; }\n .mt-#{$key} { margin-top: $value !important; }\n .mr-#{$key} { margin-right: $value !important; }\n .mb-#{$key} { margin-bottom: $value !important; }\n .ml-#{$key} { margin-left: $value !important; }\n .mx-#{$key} {\n margin-left: $value !important;\n margin-right: $value !important;\n }\n .my-#{$key} {\n margin-top: $value !important;\n margin-bottom: $value !important;\n }\n\n /* padding */\n .p-#{$key} { padding: $value !important; }\n .pt-#{$key} { padding-top: $value !important; }\n .pr-#{$key} { padding-right: $value !important; }\n .pb-#{$key} { padding-bottom: $value !important; }\n .pl-#{$key} { padding-left: $value !important; }\n .px-#{$key} {\n padding-left: $value !important;\n padding-right: $value !important;\n }\n .py-#{$key} {\n padding-top: $value !important;\n padding-bottom: $value !important;\n }\n\n /* gap */\n .g-#{$key} {\n gap: $value !important;\n }\n}\n\n.row {\n display: flex;\n flex-direction: row;\n} \n\n.f-grid {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n\n.w-100 {\n width: 100%;\n}\n\n.w-200 {\n width: 200%;\n}\n\n$font-sizes: (\n xs: $font-size-xs,\n sm: $font-size-sm,\n md: $font-size-md,\n base: $font-size-base,\n lg: $font-size-lg,\n xl: $font-size-xl\n);\n\n@each $name, $size in $font-sizes {\n .fs-#{$name} {\n font-size: $size;\n }\n}","@import \"_spacing.scss\";\n@import \"ui_components/_typography.scss\";\n@import \"ui_components/_palette.scss\";\n@import \"ui_components/_loader.scss\";\n@import \"ui_components/_buttons.scss\";\n@import \"ui_components/_forms.scss\";\n@import \"ui_components/_lists.scss\";\n@import \"ui_components/_badges.scss\";\n@import \"ui_components/_tables.scss\";\n@import \"ui_components/_toasts.scss\";\n@import \"ui_components/_cards.scss\";\n@import \"ui_components/_modals.scss\";\n@import \"ui_components/_alerts.scss\";\n@import \"_utils.scss\";\n\n* {\n\tbox-sizing: border-box;\n}\n\n*::-webkit-scrollbar {\n\twidth: 10px;\n}\n\n*::-webkit-scrollbar-track {\n\twidth: 10px;\n\tbackground: $color-black;\n\tcursor: pointer;\n}\n\n*::-webkit-scrollbar-thumb {\n\twidth: 10px;\n\tbackground: $color-grey;\n\tcursor: default;\n}\n\n*::-webkit-scrollbar-corner {\n\tbackground: transparent;\n\theight: 1px;\n}\n\n*::-webkit-scrollbar-button {\n\tdisplay: none;\n}\n\n*::-webkit-scrollbar-track-piece {}\n*::-webkit-resizer {}\n\n.ph {\n\t&.normalize {\n\t\tposition: relative;\n top: 0.15em;\n\t}\n}","* {\n\tpadding: 0;\n\tmargin: 0;\n}\n\nhtml, body {\n font-family: \"IBM Plex Mono\", monospace;\n font-weight: 400;\n}\n\nbody {\n\tbackground-color: $color-black;\n\tcolor: $color-text-light;\n\n\tfont-size: 15px;\n line-height: 1.45;\n letter-spacing: 0.01em;\n}\n\n.screen {\n\tdisplay: none;\n\n\t&.a-show {\n\t\tdisplay: block;\n\t}\n}\n\n.sidebar {\n\twidth: 100%;\n}\n\n.main-container,\n.main-container {\n\twidth: 100%;\n}\n\n.card.script-action, .card.device-action {\n\tmax-width: 280px;\n\n\t.card-content {\n\t\tcursor: default;\n\n\t\ttransition-duration: .2s;\n\t\ttransition-property: color, opacity, background;\n\t}\n\n\t&:not(.card-success):not(.card-error):not(.card-danger) {\n\t\t&:hover {\n\t\t\tcolor: $color-black;\n\t\t\tbackground: $color-warning;\n\t\t}\n\t}\n\n\t.action-details-btn {\n color: $color-black;\n font-size: 34px;\n position: relative;\n right: -10px;\n\t}\n\n\t&.loading-state {\n\t\tposition: relative;\n\t\tborder-color: $color-warning;\n\n\t\t.device-icon-container {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tz-index: 1;\n\t\t\tdisplay: flex;\n\t flex-direction: row;\n \talign-items: center;\n\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tbackground: $color-warning;\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-black;\n\n\t\t\t\t.ph, .ph-bold {\n\t\t\t\t\ttransform-origin: 50% 50%;\n \t\t\t\tanimation: icon_spin 1.2s linear infinite;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.sidebar-container {\n\tmax-width: 260px;\n\twidth: 100%;\n}\n\n\n.tree {\n\t.branch {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding-left: $space-10 + $space-5;\n\n\t\t.title {\n\t\t\tfont-size: $font-size-xl;\n\t\t}\n\n\t\t.branch-container {\n\t\t\tborder: 2px solid $color-primary;\n\t\t\tpadding: $space-3;\n\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: $space-3;\n\t\t\twidth: max-content;\n\t\t\tmargin-bottom: $space-6;\n\t\t}\n\t}\n\n\t& > .branch, & > .branch > .branch {\n\t\tpadding-left: 0;\n\t}\n}\n\n#area-devices-modal {\n\t.modal-body {\n\t\tposition: relative;\n\t\tmin-height: 300px;\n\n\t\t.loader {\n\t\t\tmargin: auto;\n\t\t\tposition: relative;\n\t\t\ttop: 120px;\n\t\t}\n\t}\n}\n\n.top-bar {\n\twidth: 100%;\n\n\t& > .row {\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t}\n}\n\n@import \"app/_hud.scss\";\n@import \"app/_load-screen.scss\";\n@import \"app/_error-screen.scss\";",".hud {\n\twidth: 100%;\n\tpadding: $space-5;\n\n\t& > .row {\n\t\tjustify-content: space-between;\n align-items: center;\n gap: $space-4;\n flex-wrap: wrap;\n\t}\n\n\t.hud-btns {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: $space-4;\n\t}\n\n\t.nav-toggle,\n\t.reload-screen {\n\t\tfont-size: 42px;\n\t\twidth: 50px;\n\t\theight: 50px;\n\t\tbackground: $color-text-light;\n\t\tcolor: $color-black;\n\t}\n\n\t.nav-toggle {\n\t\tposition: relative;\n\t\tz-index: 710;\n\n\t\t&.state-off {\n\t\t\t.icon-state-on {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t&.state-on {\n\t\t\t.icon-state-off {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t// &:hover {\n\t\t// \tcolor: $color-success;\n\t\t// }\n\t}\n\n\t.app-title {\n\t\tpadding: $space-2 $space-4;\n\t\ttext-transform: uppercase;\n\t}\n\n\t.navigation {\n\t\tposition: fixed;\n\t\tz-index: 700;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\t\n\t\tbackground: $color-black;\n\t\topacity: 0;\n\t\tvisibility: hidden;\n\n\t\ttransition-duration: .2s;\n\t\ttransition-property: visibility, opacity;\n\n\t\t.container {\n\t\t\twidth: 100%;\n\t\t\tmax-width: 600px;\n\t height: 100vh;\n\n\t\t\tmargin: auto;\n\t\t\tpadding: $space-3;\n\n \tdisplay: flex;\n \talign-items: center;\n\t\t}\n\n\t\t.nav-items {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tgap: $space-10;\n \talign-items: center;\n \tjustify-content: space-between;\n\n \theight: max-content;\n \tmargin-top: 100px;\n\n \ttransition-duration: .2s;\n \ttransition-property: margin-top;\n\t\t}\n\n\t\t.nav-link {\n\t\t\ttext-decoration: none;\n\t\t\tcolor: $color-text-light;\n\t\t}\n\n\t\t.nav-item {\n\t\t\twidth: 160px;\n\t\t\tborder: 2px solid $color-text-light;\n\t\t\tpadding: $space-6;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: $space-3;\n\n\t\t\ttransition-property: color, background, border-color;\n\t\t\ttransition-duration: .2s;\n\n\t\t\t.nav-icon {\n\t\t\t\ttext-align: center;\n\n\t\t\t\t.ph, .ph-bold {\n\t\t\t\t\tfont-size: 64px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.nav-text {\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: $font-size-lg;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground: $color-success;\n\t\t\t\tborder-color: $color-success;\n\t\t\t\tcolor: $color-black;\n\t\t\t}\n\t\t}\n\n\t\t&.a-show {\n\t\t\tvisibility: visible;\n\t\t\topacity: 1;\n\n\t\t\t.nav-items {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t}\n\n\t\t&.a-hide {\n\t\t\t.nav-items {\n\t\t\t\tmargin-top: -100px;\n\t\t\t}\n\t\t}\n\t}\n}",".load-screen {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\n\tdisplay: flex;\n\tflex-direction: row;\n align-items: center;\n justify-content: center;\n\n\tvisibility: hidden;\n\topacity: 0;\n\tbackground: $color-black;\n\n\ttransition-duration: .2s;\n\ttransition-property: opacity, visibility;\n\n\t&.a-show {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t\tz-index: 900;\n\t\ttransition-duration: 0s;\n\t}\n}",".error-screen {\n display: none;\n\n .container {\n\t display: flex;\n\t align-items: center;\n\t flex-direction: column;\n\t justify-content: center;\n\t flex-wrap: nowrap;\n\t gap: $space-4;\n\t padding-top: 20%;\n\t max-width: 420px;\n\t width: 100%;\n\t margin: auto;\n }\n\n .icon-container {\n \tcolor: $color-error;\n\n \t.ph, .ph-bold {\n \t\tfont-size: 72px;\n \t}\n }\n\n .error-title {\n \tpadding: $space-2 $space-3;\n }\n\n .error-text {\n \tfont-size: $font-size-base;\n \ttext-align: center;\n }\n\n\t&.a-show {\n\t\tdisplay: block;\n\t}\n}"]} \ No newline at end of file +{"version":3,"sources":["_fonts.scss","_spacing.scss","main.css","ui_components/_typography.scss","ui_components/_palette.scss","ui_components/_loader.scss","ui_components/_buttons.scss","ui_components/_forms.scss","ui_components/_lists.scss","ui_components/_badges.scss","ui_components/_tables.scss","ui_components/_toasts.scss","ui_components/_cards.scss","ui_components/_modals.scss","ui_components/_alerts.scss","_utils.scss","_ui.scss","_app.scss","app/_hud.scss","app/_load-screen.scss","app/_error-screen.scss"],"names":[],"mappings":"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","file":"main.css","sourcesContent":["@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Regular.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Medium.ttf\") format(\"truetype\");\n font-weight: 500;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf\") format(\"truetype\");\n font-weight: 600;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Bold.ttf\") format(\"truetype\");\n font-weight: 700;\n font-style: normal;\n font-display: swap;\n}\n\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Italic.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: italic;\n font-display: swap;\n}\n","/* =========================\n\t SPACING SCALE\n========================= */\n\n$space-0: 0;\n$space-1: 5px;\n$space-2: 8px;\n$space-3: 12px;\n$space-4: 15px;\n$space-5: 18px;\n$space-6: 22px;\n$space-7: 26px;\n$space-8: 34px;\n$space-9: 42px;\n$space-10: 48px;\n$space-11: 64px;\n$space-12: 80px;\n\n/* aliases for readability */\n$space-xs: $space-1;\n$space-sm: $space-2;\n$space-md: $space-4;\n$space-lg: $space-6;\n$space-xl: $space-8;\n$space-xxl: $space-10;\n\n/* map — for utilities generation */\n$spaces: (\n\t0: $space-0,\n\t1: $space-1,\n\t2: $space-2,\n\t3: $space-3,\n\t4: $space-4,\n\t5: $space-5,\n\t6: $space-6,\n\t7: $space-7,\n\t8: $space-8,\n\t9: $space-9,\n\t10: $space-10\n);\n\n/* =========================\n\t BASE LAYOUT\n========================= */\n\n.container {\n\tpadding: $space-5;\n}\n\n.section {\n\tmargin-bottom: $space-xxl;\n}\n\n.section-title {\n\tmargin-bottom: $space-xl;\n}\n\n.block {\n\tmargin-bottom: $space-xl;\n}\n\n.block-title {\n\tmargin-bottom: $space-lg;\n}\n\n/* =========================\n\t TEXT & CONTENT\n========================= */\n\np,\n.text {\n\tmargin-bottom: $space-md;\n}\n\n.hint {\n\tmargin-top: $space-sm;\n}\n\n/* =========================\n\t LISTS\n========================= */\n\n.list {\n\tpadding-left: $space-lg;\n\tmargin-bottom: $space-md;\n}\n\n.list-item {\n\tmargin-bottom: $space-sm;\n}\n\n.list-nested {\n\tmargin-top: $space-sm;\n}\n\n/* =========================\n\t TABLES\n========================= */\n\n.table {\n\tmargin-bottom: $space-lg;\n}\n\n.table-caption {\n\tmargin-bottom: $space-sm;\n}\n\n/* =========================\n\t FORMS\n========================= */\n\n.form-group {\n\tmargin-bottom: $space-md;\n}\n\n.label {\n\tmargin-bottom: $space-xs;\n\tdisplay: block;\n}\n\n.input,\n.textarea,\n.select {\n\tmargin-top: $space-xs;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n\n.toast {\n\tpadding: $space-md;\n}\n\n.toast-stack {\n\tgap: $space-sm;\n}\n","@charset \"UTF-8\";\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Regular.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Medium.ttf\") format(\"truetype\");\n font-weight: 500;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-SemiBold.ttf\") format(\"truetype\");\n font-weight: 600;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Bold.ttf\") format(\"truetype\");\n font-weight: 700;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"IBM Plex Mono\";\n src: url(\"/assets/fonts/IBM_Plex_Mono/IBMPlexMono-Italic.ttf\") format(\"truetype\");\n font-weight: 400;\n font-style: italic;\n font-display: swap;\n}\n/* =========================\n\t SPACING SCALE\n========================= */\n/* aliases for readability */\n/* map — for utilities generation */\n/* =========================\n\t BASE LAYOUT\n========================= */\n.container {\n padding: 18px;\n}\n\n.section {\n margin-bottom: 48px;\n}\n\n.section-title {\n margin-bottom: 34px;\n}\n\n.block {\n margin-bottom: 34px;\n}\n\n.block-title {\n margin-bottom: 22px;\n}\n\n/* =========================\n\t TEXT & CONTENT\n========================= */\np,\n.text {\n margin-bottom: 15px;\n}\n\n.hint {\n margin-top: 8px;\n}\n\n/* =========================\n\t LISTS\n========================= */\n.list {\n padding-left: 22px;\n margin-bottom: 15px;\n}\n\n.list-item {\n margin-bottom: 8px;\n}\n\n.list-nested {\n margin-top: 8px;\n}\n\n/* =========================\n\t TABLES\n========================= */\n.table {\n margin-bottom: 22px;\n}\n\n.table-caption {\n margin-bottom: 8px;\n}\n\n/* =========================\n\t FORMS\n========================= */\n.form-group {\n margin-bottom: 15px;\n}\n\n.label {\n margin-bottom: 5px;\n display: block;\n}\n\n.input,\n.textarea,\n.select {\n margin-top: 5px;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n.toast {\n padding: 15px;\n}\n\n.toast-stack {\n gap: 8px;\n}\n\n/* =========================\n\t FONT FAMILIES\n========================= */\n/* =========================\n\t FONT WEIGHTS\n========================= */\n/* =========================\n\t FONT SIZES (scale)\n========================= */\n/* =========================\n\t LINE HEIGHTS\n========================= */\n/* =========================\n\t LETTER SPACING\n========================= */\n/* =========================\n\t BASE TYPOGRAPHY\n========================= */\nhtml {\n font-size: 100%;\n}\n\nbody {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 16px;\n font-weight: 400;\n line-height: 1.6;\n letter-spacing: 0;\n}\n\n/* =========================\n\t HEADINGS\n========================= */\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-family: \"IBM Plex Mono\", monospace;\n font-weight: 600;\n line-height: 1.25;\n margin: 0;\n}\nh1.contrast,\nh2.contrast,\nh3.contrast,\nh4.contrast,\nh5.contrast,\nh6.contrast {\n background: #F8F8F8;\n color: #0A0A0D;\n}\n\nh1 {\n font-size: 36px;\n letter-spacing: -0.01em;\n}\n\nh2 {\n font-size: 28px;\n}\n\nh3 {\n font-size: 24px;\n}\n\nh4 {\n font-size: 20px;\n}\n\nh5 {\n font-size: 18px;\n}\n\nh6 {\n font-size: 16px;\n font-weight: 500;\n}\n\n/* =========================\n\t TEXT VARIANTS\n========================= */\n.text,\np {\n font-size: 16px;\n line-height: 1.6;\n}\n\n.text-sm {\n font-size: 13px;\n line-height: 1.4;\n}\n\n.text-lg {\n font-size: 17px;\n line-height: 1.6;\n}\n\n.text-muted {\n font-size: 13px;\n color: #AAAEB2;\n}\n\n.text-strong,\nstrong {\n font-weight: 600;\n}\n\n.text-bold {\n font-weight: 700;\n}\n\n.text-italic,\nem {\n font-style: italic;\n}\n\n/* =========================\n\t CODE / MONO\n========================= */\ncode,\npre,\n.code {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 16px;\n line-height: 1.4;\n background-color: #1A1A23;\n}\n\npre {\n font-size: 16px;\n line-height: 1.6;\n white-space: pre-wrap;\n}\n\npre code,\n.code {\n tab-size: 2;\n -moz-tab-size: 2;\n}\n\n/* =========================\n\t LINKS\n========================= */\na {\n font-weight: 500;\n text-decoration: none;\n}\n\n.link {\n font-size: inherit;\n font-weight: 500;\n}\n\n/* =========================\n\t LABELS / META\n========================= */\n.label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.4;\n}\n\n.hint,\n.meta {\n font-size: 12px;\n line-height: 1.4;\n}\n\n/* =========================\n\t TABLE TEXT\n========================= */\n.table {\n font-size: 13px;\n line-height: 1.4;\n}\n.table th {\n font-weight: 600;\n}\n.table td {\n font-weight: 400;\n}\n\n/* =========================\n\t LISTS\n========================= */\n.list {\n font-size: 16px;\n line-height: 1.6;\n}\n\n.list-item {\n font-size: inherit;\n}\n\n/* =========================\n\t MODALS\n========================= */\n.modal-title {\n font-size: 20px;\n font-weight: 600;\n}\n\n.modal-body {\n font-size: 16px;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n.toast-title {\n font-size: 14px;\n font-weight: 600;\n}\n\n.toast-text {\n font-size: 13px;\n line-height: 1.4;\n}\n\n.palette {\n display: flex;\n flex-direction: row;\n gap: 8px;\n}\n.palette .color .color-box {\n width: 100px;\n height: 80px;\n}\n\n/* BACKGROUND COLORS */\nbody .bg-primary {\n background: #F8F8F8;\n}\nbody .bg-secondary {\n background: #00B3FF;\n}\nbody .bg-success {\n background: #00FFAA;\n}\nbody .bg-accent {\n background: #ff6f30;\n}\nbody .bg-info {\n background: #8A2CE2;\n}\nbody .bg-warning {\n background: #FFD900;\n}\nbody .bg-error {\n background: #FF3C00;\n}\nbody {\n /* TEXT COLORS */\n}\nbody .text-color-primary {\n color: #F8F8F8;\n}\nbody .text-color-secondary {\n color: #00B3FF;\n}\nbody .text-color-success {\n color: #00FFAA;\n}\nbody .text-color-accent {\n color: #ff6f30;\n}\nbody .text-color-info {\n color: #8A2CE2;\n}\nbody .text-color-warning {\n color: #FFD900;\n}\nbody .text-color-error {\n color: #FF3C00;\n}\n\n/* HTML:
*/\n.loader {\n width: 45px;\n aspect-ratio: 1;\n --c:no-repeat linear-gradient(#FF3C00 0 0);\n background: var(--c) 0 0, var(--c) 0 100%, var(--c) 50% 0, var(--c) 50% 100%, var(--c) 100% 0, var(--c) 100% 100%;\n animation: l12 1s infinite;\n}\n\n@keyframes l12 {\n 0%, 100% {\n background-size: 20% 50%;\n }\n 16.67% {\n background-size: 20% 30%, 20% 30%, 20% 50%, 20% 50%, 20% 50%, 20% 50%;\n }\n 33.33% {\n background-size: 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 50%, 20% 50%;\n }\n 50% {\n background-size: 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%;\n }\n 66.67% {\n background-size: 20% 50%, 20% 50%, 20% 30%, 20% 30%, 20% 30%, 20% 30%;\n }\n 83.33% {\n background-size: 20% 50%, 20% 50%, 20% 50%, 20% 50%, 20% 30%, 20% 30%;\n }\n}\n@keyframes icon_spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n.btn {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 17px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.04em;\n padding: 12px 22px;\n border-radius: 0;\n border-width: 2px;\n border-left-width: 6px;\n border-style: solid;\n border-color: #F8F8F8;\n text-transform: uppercase;\n background-color: transparent;\n transition-duration: 0.2s;\n transition-property: background-color, border-color, color;\n}\n.btn.with-icon {\n border-left-width: 48px;\n position: relative;\n}\n.btn.with-icon .ph,\n.btn.with-icon .ph-bold {\n position: absolute;\n color: #0a0a0d;\n left: -48px;\n top: 0;\n font-size: 28px;\n height: 100%;\n display: inline-flex;\n align-items: center;\n width: 48px;\n justify-content: center;\n transition-duration: 0.2s;\n transition-property: color, left;\n}\n.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph,\n.btn:hover.with-icon:not(.loading-state):not(.btn-small) .ph-bold {\n left: -28px;\n}\n.btn.btn-primary {\n color: #F8F8F8;\n border-color: #F8F8F8;\n}\n.btn.btn-primary:hover {\n background-color: #F8F8F8;\n color: #0A0A0D;\n}\n.btn.btn-secondary {\n color: #00B3FF;\n border-color: #00B3FF;\n}\n.btn.btn-secondary:hover {\n background-color: #00B3FF;\n color: #F8F8F8;\n}\n.btn.btn-secondary:hover.with-icon .ph,\n.btn.btn-secondary:hover.with-icon .ph-bold {\n color: #F8F8F8;\n}\n.btn.btn-accent {\n color: #ff6f30;\n border-color: #ff6f30;\n}\n.btn.btn-accent:hover {\n background-color: #ff6f30;\n color: #F8F8F8;\n}\n.btn.btn-accent:hover.with-icon .ph,\n.btn.btn-accent:hover.with-icon .ph-bold {\n color: #F8F8F8;\n}\n.btn.btn-danger {\n color: #FF3C00;\n border-color: #FF3C00;\n}\n.btn.btn-danger:hover {\n background-color: #FF3C00;\n color: #0A0A0D;\n}\n.btn.btn-warning {\n color: #FFD900;\n border-color: #FFD900;\n}\n.btn.btn-warning:hover {\n background-color: #FFD900;\n color: #0A0A0D;\n}\n.btn.btn-success {\n color: #00FFAA;\n border-color: #00FFAA;\n}\n.btn.btn-success:hover {\n background-color: #00FFAA;\n color: #0A0A0D;\n}\n.btn.btn-info {\n color: #8A2CE2;\n border-color: #8A2CE2;\n}\n.btn.btn-info:hover {\n background-color: #8A2CE2;\n color: #F8F8F8;\n}\n.btn.btn-info:hover.with-icon .ph,\n.btn.btn-info:hover.with-icon .ph-bold {\n color: #F8F8F8;\n}\n.btn[disabled]:not(.loading-state) {\n color: #AAAEB2;\n border-color: #1A1A23;\n background-color: #1A1A23;\n}\n.btn[disabled]:not(.loading-state).with-icon .ph,\n.btn[disabled]:not(.loading-state).with-icon .ph-bold {\n color: #AAAEB2;\n}\n.btn[disabled]:not(.loading-state):hover {\n background-color: #1A1A23;\n color: #AAAEB2;\n}\n.btn[disabled]:not(.loading-state):hover.with-icon .ph,\n.btn[disabled]:not(.loading-state):hover.with-icon .ph-bold {\n color: #AAAEB2;\n}\n.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph,\n.btn[disabled]:not(.loading-state).with-icon:not(.btn-small) .ph-bold {\n left: -28px;\n}\n.btn.btn-small {\n font-size: 14px;\n font-weight: 500;\n padding: 8px 8px;\n}\n.btn.btn-small.with-icon {\n border-left-width: 32px;\n}\n.btn.btn-small.with-icon .ph,\n.btn.btn-small.with-icon .ph-bold {\n left: -40px;\n font-size: 23px;\n}\n.btn.btn-small.with-icon.loading-state .ph, .btn.btn-small.with-icon.loading-state .ph-bold {\n font-size: 30px;\n}\n.btn.btn-large {\n font-size: 20px;\n font-weight: 700;\n padding: 15px 48px;\n}\n.btn.loading-state {\n color: #0A0A0D !important;\n border-color: #F8F8F8 !important;\n background-color: #F8F8F8 !important;\n}\n.btn.loading-state .ph, .btn.loading-state .ph-bold {\n font-size: 31px;\n transform-origin: 50% 50%;\n animation: icon_spin 1.2s linear infinite;\n}\n\n.btn-icon {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 30px;\n height: 30px;\n background: transparent;\n color: #F8F8F8;\n font-size: 20px;\n border: 0;\n transition-duration: 0.2s;\n transition-property: color;\n}\n.btn-icon .ph {\n transform: rotate(0);\n transition-duration: 0.2s;\n transition-property: transform;\n}\n.btn-icon:not(.without-hover):hover {\n color: #AAAEB2;\n}\n.btn-icon:not(.without-hover):hover .ph {\n transform: rotate(90deg);\n}\n\n.form-group .label {\n display: flex;\n flex-direction: column;\n font-size: 17px;\n width: 100%;\n max-width: 600px;\n position: relative;\n}\n.form-group .label > .ph {\n position: absolute;\n color: #F8F8F8;\n left: 0;\n bottom: 2px;\n font-size: 28px;\n height: 56px;\n display: inline-flex;\n align-items: center;\n width: 48px;\n justify-content: center;\n transition-duration: 0.2s;\n transition-property: color, left;\n}\n.form-group .label .input {\n font-family: \"IBM Plex Mono\", monospace;\n font-size: 16px;\n font-weight: 500;\n line-height: 1;\n letter-spacing: 0.04em;\n padding: 12px 22px;\n margin-top: 8px;\n border-radius: 0;\n border-width: 2px;\n border-bottom-width: 6px;\n border-style: solid;\n border-color: #F8F8F8;\n color: #F8F8F8;\n background-color: transparent;\n transition-duration: 0.2s;\n transition-property: background-color, border-color, color;\n}\n.form-group .label .input:hover {\n border-bottom-color: #AAAEB2;\n}\n.form-group .label .input:focus {\n outline: none;\n border-color: #00B3FF;\n}\n.form-group .label .input::placeholder {\n color: #AAAEB2;\n}\n.form-group .label textarea.input {\n height: 120px;\n line-height: 1.25;\n resize: none;\n}\n.form-group .label .ph + .input,\n.form-group .label .ph + .select-wrap .select {\n padding-left: 42px;\n}\n.form-group .label .select-wrap {\n margin-top: 8px;\n}\n.form-group .label .select {\n width: 100%;\n height: 56px;\n margin-top: 0;\n /* убрать нативную стрелку */\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n.form-group .label .select:focus {\n outline: none;\n}\n.form-group .label .select option {\n color: #F8F8F8;\n background: #1A1A23;\n}\n.form-group .label .select-wrap::after {\n content: \"\";\n position: absolute;\n right: 22px;\n bottom: 18px;\n transform: translateY(-50%);\n width: 0;\n height: 0;\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 10px solid #F8F8F8;\n pointer-events: none;\n}\n.form-group .label.error .input:not(:focus) {\n border-color: #FF3C00;\n}\n.form-group .label.error + .input-info {\n color: #FFD900;\n}\n.form-group .input-info {\n font-size: 14px;\n margin-top: 8px;\n}\n.form-group .input-info .ph {\n position: relative;\n top: 1px;\n}\n\n.radio {\n display: inline-flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n}\n.radio input[type=radio] {\n display: none;\n}\n.radio .radio-control {\n display: inline-block;\n border-radius: 100%;\n border: 2px solid #F8F8F8;\n width: 20px;\n height: 20px;\n background: transparent;\n transition-duration: 0.2s;\n transition-property: background, border-color;\n}\n.radio:hover .radio-control {\n background: #4A4A57;\n}\n.radio input[type=radio]:checked + .radio-control {\n background: #F8F8F8;\n}\n.radio input[type=radio]:disabled + .radio-control {\n background: #4A4A57;\n border-color: #4A4A57;\n}\n.radio .radio-label {\n font-size: 17px;\n}\n\n.checkbox {\n display: inline-flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n}\n.checkbox input[type=checkbox] {\n display: none;\n}\n.checkbox .checkbox-control {\n height: 16px;\n width: 30px;\n border: 2px solid #F8F8F8;\n position: relative;\n background: transparent;\n transition-duration: 0.2s;\n transition-property: border-color, background;\n display: block;\n}\n.checkbox .checkbox-control:before {\n content: \"\";\n display: block;\n height: 20px;\n width: 20px;\n background: #F8F8F8;\n position: absolute;\n left: -6px;\n top: -4px;\n transition-duration: 0.2s;\n transition-property: left, background;\n}\n.checkbox:hover .checkbox-control {\n background: #4A4A57;\n}\n.checkbox input[type=checkbox]:checked:not(:disabled) + .checkbox-control {\n background: #00B3FF;\n border-color: #00B3FF;\n}\n.checkbox input[type=checkbox]:checked + .checkbox-control:before {\n left: 12px;\n}\n.checkbox input[type=checkbox]:disabled + .checkbox-control {\n border-color: #4A4A57;\n}\n.checkbox input[type=checkbox]:disabled + .checkbox-control:before {\n background: #4A4A57;\n}\n\n.list {\n display: flex;\n flex-direction: column;\n gap: 5px;\n list-style-type: none;\n padding-left: 0;\n}\n.list .list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n margin-left: 0;\n}\n.list.list-ordered {\n list-style-type: decimal;\n display: list-item;\n margin-left: 30px;\n}\n.list.list-ordered .list-item {\n display: list-item;\n}\n.list.list-definition {\n gap: 15px;\n}\n.list.list-definition .list-row {\n border-left: 2px solid #F8F8F8;\n}\n.list.list-definition .list-row .list-term::before,\n.list.list-definition .list-row .list-desc::before {\n content: \"\";\n height: 2px;\n width: 12px;\n position: absolute;\n top: 50%;\n left: 0;\n margin-top: -1px;\n display: block;\n background: #F8F8F8;\n}\n.list.list-definition .list-row .list-term,\n.list.list-definition .list-row .list-desc {\n position: relative;\n}\n.list.list-definition .list-row .list-term {\n padding-left: 18px;\n font-size: 20px;\n}\n.list.list-definition .list-row .list-desc {\n padding-left: 18px;\n}\n.list.list-nav {\n max-width: 420px;\n width: 100%;\n gap: 0;\n}\n.list.list-nav .list-item {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n height: 50px;\n margin: 0;\n}\n.list.list-nav .list-item .list-action {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n height: 100%;\n padding: 8px 12px;\n border: 0;\n font-size: 17px;\n background: #1A1A23;\n color: inherit;\n transition-duration: 0.2s;\n transition-property: background;\n}\n.list.list-nav .list-item .list-action:hover {\n background: #00B3FF;\n}\n.list.list-nav .list-item .list-action .list-label {\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n letter-spacing: -0.05em;\n font-weight: 400;\n}\n.list.list-nav .list-item .list-action .list-meta {\n padding: 8px;\n background: #00FFAA;\n color: #0A0A0D;\n display: flex;\n}\n.list.list-nav .list-item.list-item-active .list-action {\n background: #00B3FF;\n}\n.list.list-actions {\n width: 100%;\n max-width: 420px;\n gap: 22px;\n}\n.list.list-actions .list-item {\n justify-content: space-between;\n align-items: flex-start;\n}\n.list.list-actions .list-item .list-content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.list.list-actions .list-item .list-content .list-title {\n font-size: 20px;\n line-height: 1;\n}\n.badge {\n background: #F8F8F8;\n color: #1A1A23;\n padding: 5px 8px;\n font-size: 16px;\n display: inline-block;\n}\n.badge.badge-success {\n background: #00FFAA;\n}\n.badge.badge-warning {\n background: #FFD900;\n}\n.badge.badge-error, .badge.badge-danger {\n background: #FF3C00;\n}\n.badge.badge-info {\n background: #8A2CE2;\n color: #F8F8F8;\n}\n.badge.badge-secondary {\n background: #00B3FF;\n color: #F8F8F8;\n}\n\n.table {\n text-align: left;\n border: 2px solid #F8F8F8;\n padding: 15px;\n}\n.table .table-caption {\n text-align: left;\n font-size: 20px;\n background: #F8F8F8;\n width: max-content;\n color: #1A1A23;\n padding: 5px 12px;\n margin-bottom: 0;\n}\n.table.table-empty {\n width: 100%;\n}\n.table.table-empty .is-empty {\n width: 100%;\n padding: 15px;\n font-size: 16px;\n color: #AAAEB2;\n text-align: left;\n}\n.table .table-row th,\n.table .table-row td {\n padding: 12px 18px;\n font-size: 16px;\n vertical-align: top;\n}\n.table .table-foot th,\n.table .table-foot td {\n padding-top: 15px;\n}\n\n.toast {\n position: fixed;\n z-index: 1100;\n bottom: -100px;\n right: 15px;\n max-width: 420px;\n background: #1A1A23;\n border: 2px solid #F8F8F8;\n padding: 0;\n opacity: 0;\n transition-duration: 0.25s;\n transition-property: opacity, top, bottom;\n}\n.toast.a-show {\n bottom: 15px;\n opacity: 1;\n}\n.toast.a-hide {\n bottom: 115px;\n opacity: 0;\n}\n.toast .toast-content {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.toast .toast-content .toast-title {\n font-size: 24px;\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n color: #0A0A0D;\n background: #F8F8F8;\n padding: 5px 8px;\n padding-right: 42px;\n}\n.toast .toast-content .toast-text {\n font-size: 16px;\n padding: 22px 15px;\n margin: 0;\n}\n.toast .toast-close {\n position: absolute;\n top: 0;\n right: 0;\n color: #0A0A0D;\n height: 40px;\n width: 40px;\n}\n.toast .toast-close:hover {\n color: #1A1A23;\n}\n.toast.toast-success {\n border-color: #00FFAA;\n}\n.toast.toast-success .toast-title {\n background: #00FFAA;\n}\n.toast.toast-warning {\n border-color: #FFD900;\n}\n.toast.toast-warning .toast-title {\n background: #FFD900;\n}\n.toast.toast-danger {\n border-color: #FF3C00;\n}\n.toast.toast-danger .toast-title {\n background: #FF3C00;\n}\n\n.card {\n max-width: 420px;\n width: 100%;\n border: 2px solid #F8F8F8;\n}\n.card .card-title {\n color: #0A0A0D;\n background: #F8F8F8;\n padding: 8px 12px;\n}\n.card .card-content {\n padding: 15px;\n}\n.card .card-content .card-thumb {\n width: 100%;\n}\n.card .card-content p {\n margin-top: 8px;\n margin-bottom: 0;\n}\n.card .card-footer {\n padding: 8px 15px;\n padding-bottom: 15px;\n}\n.card.device-action {\n max-width: 220px;\n transition-duration: 0.2s;\n transition-property: border-color;\n}\n.card.device-action .device-icon-container {\n position: relative;\n}\n.card.device-action .device-icon-container .device-online-status {\n position: absolute;\n top: -15px;\n left: -5px;\n font-size: 24px;\n color: #FF3C00;\n}\n.card.device-action .device-icon-container .device-online-status.status-online {\n color: #00FFAA;\n}\n.card.device-action .device-icon-container .device-icon {\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n font-size: 64px;\n height: 120px;\n width: 100%;\n transition-duration: 0.2s;\n transition-property: color;\n}\n.card.device-action .card-title {\n display: flex;\n width: 100%;\n font-size: 14px;\n font-weight: 700;\n align-items: center;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n transition-duration: 0.2s;\n transition-property: background-color, color;\n}\n.card.device-action .device-name {\n font-size: 14px;\n line-height: 1.4;\n}\n.card.device-action.card-success {\n border-color: #00FFAA;\n}\n.card.device-action.card-success .card-title {\n background: #00FFAA;\n}\n.card.device-action.card-success .device-icon {\n color: #00FFAA;\n}\n.card.device-action.card-warning {\n border-color: #FFD900;\n}\n.card.device-action.card-warning .card-title {\n background: #FFD900;\n}\n.card.device-action.card-warning .device-icon {\n color: #FFD900;\n}\n.card.device-action.card-info {\n border-color: #8A2CE2;\n}\n.card.device-action.card-info .card-title {\n background: #8A2CE2;\n color: #F8F8F8;\n}\n.card.device-action.card-info .device-icon {\n color: #8A2CE2;\n}\n.card.device-action.card-secondary {\n border-color: #00B3FF;\n}\n.card.device-action.card-secondary .card-title {\n background: #00B3FF;\n color: #F8F8F8;\n}\n.card.device-action.card-secondary .device-icon {\n color: #00B3FF;\n}\n.card.device-action.card-danger, .card.device-action.card-error {\n border-color: #FF3C00;\n}\n.card.device-action.card-danger .card-title, .card.device-action.card-error .card-title {\n background: #FF3C00;\n}\n.card.device-action.card-danger .device-icon, .card.device-action.card-error .device-icon {\n color: #FF3C00;\n}\n\n.modal {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n.modal .modal-backdrop {\n position: fixed;\n z-index: 1010;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background: #0A0A0D;\n opacity: 0;\n transition-duration: 0.25s;\n transition-property: opacity;\n}\n.modal .modal-panel {\n position: relative;\n z-index: 1020;\n width: 100%;\n max-width: 960px;\n height: auto;\n min-height: 200px;\n max-height: 800px;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 15px;\n margin-top: 200px;\n background: #0A0A0D;\n border: 2px solid #F8F8F8;\n opacity: 0;\n transition-duration: 0.25s;\n transition-property: opacity, margin-top;\n}\n.modal .modal-panel .modal-header {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding-right: 15px;\n}\n.modal .modal-panel .modal-header .modal-title {\n padding: 12px 15px;\n background: #F8F8F8;\n color: #0A0A0D;\n text-transform: uppercase;\n}\n.modal .modal-panel .modal-body {\n max-height: 700px;\n overflow-y: auto;\n padding: 18px;\n}\n.modal .modal-panel .modal-footer {\n padding: 18px;\n}\n.modal .modal-panel .modal-footer .actions {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n gap: 15px;\n width: 100%;\n}\n.modal.a-show .modal-backdrop {\n opacity: 1;\n}\n.modal.a-show .modal-panel {\n opacity: 1;\n margin-top: 0;\n}\n.modal.a-hide .modal-backdrop {\n opacity: 0;\n}\n.modal.a-hide .modal-panel {\n opacity: 0;\n margin-top: -200px;\n}\n\n.alert {\n padding: 12px 15px;\n border-left-style: solid;\n border-left-width: 4px;\n color: #F8F8F8;\n}\n.alert.alert-primary {\n border-color: #F8F8F8;\n background: rgba(248, 248, 248, 0.1);\n color: #F8F8F8;\n}\n.alert.alert-success {\n border-color: #00FFAA;\n background: rgba(0, 255, 170, 0.1);\n color: #00FFAA;\n}\n.alert.alert-secondary {\n border-color: #00B3FF;\n background: rgba(0, 179, 255, 0.1);\n color: rgb(51, 194.2, 255);\n}\n.alert.alert-info {\n border-color: #8A2CE2;\n background: rgba(138, 44, 226, 0.1);\n color: rgb(187.725, 133.675, 238.325);\n}\n.alert.alert-warning {\n border-color: #FFD900;\n background: rgba(255, 217, 0, 0.1);\n color: #FFD900;\n}\n.alert.alert-error, .alert.alert-danger {\n border-color: #FF3C00;\n background: rgba(255, 60, 0, 0.1);\n color: rgb(255, 118.5, 76.5);\n}\n\n/* =========================\n SPACING UTILITIES\n========================= */\n/* margin */\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n/* padding */\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n/* gap */\n.g-0 {\n gap: 0 !important;\n}\n\n/* margin */\n.m-1 {\n margin: 5px !important;\n}\n\n.mt-1 {\n margin-top: 5px !important;\n}\n\n.mr-1 {\n margin-right: 5px !important;\n}\n\n.mb-1 {\n margin-bottom: 5px !important;\n}\n\n.ml-1 {\n margin-left: 5px !important;\n}\n\n.mx-1 {\n margin-left: 5px !important;\n margin-right: 5px !important;\n}\n\n.my-1 {\n margin-top: 5px !important;\n margin-bottom: 5px !important;\n}\n\n/* padding */\n.p-1 {\n padding: 5px !important;\n}\n\n.pt-1 {\n padding-top: 5px !important;\n}\n\n.pr-1 {\n padding-right: 5px !important;\n}\n\n.pb-1 {\n padding-bottom: 5px !important;\n}\n\n.pl-1 {\n padding-left: 5px !important;\n}\n\n.px-1 {\n padding-left: 5px !important;\n padding-right: 5px !important;\n}\n\n.py-1 {\n padding-top: 5px !important;\n padding-bottom: 5px !important;\n}\n\n/* gap */\n.g-1 {\n gap: 5px !important;\n}\n\n/* margin */\n.m-2 {\n margin: 8px !important;\n}\n\n.mt-2 {\n margin-top: 8px !important;\n}\n\n.mr-2 {\n margin-right: 8px !important;\n}\n\n.mb-2 {\n margin-bottom: 8px !important;\n}\n\n.ml-2 {\n margin-left: 8px !important;\n}\n\n.mx-2 {\n margin-left: 8px !important;\n margin-right: 8px !important;\n}\n\n.my-2 {\n margin-top: 8px !important;\n margin-bottom: 8px !important;\n}\n\n/* padding */\n.p-2 {\n padding: 8px !important;\n}\n\n.pt-2 {\n padding-top: 8px !important;\n}\n\n.pr-2 {\n padding-right: 8px !important;\n}\n\n.pb-2 {\n padding-bottom: 8px !important;\n}\n\n.pl-2 {\n padding-left: 8px !important;\n}\n\n.px-2 {\n padding-left: 8px !important;\n padding-right: 8px !important;\n}\n\n.py-2 {\n padding-top: 8px !important;\n padding-bottom: 8px !important;\n}\n\n/* gap */\n.g-2 {\n gap: 8px !important;\n}\n\n/* margin */\n.m-3 {\n margin: 12px !important;\n}\n\n.mt-3 {\n margin-top: 12px !important;\n}\n\n.mr-3 {\n margin-right: 12px !important;\n}\n\n.mb-3 {\n margin-bottom: 12px !important;\n}\n\n.ml-3 {\n margin-left: 12px !important;\n}\n\n.mx-3 {\n margin-left: 12px !important;\n margin-right: 12px !important;\n}\n\n.my-3 {\n margin-top: 12px !important;\n margin-bottom: 12px !important;\n}\n\n/* padding */\n.p-3 {\n padding: 12px !important;\n}\n\n.pt-3 {\n padding-top: 12px !important;\n}\n\n.pr-3 {\n padding-right: 12px !important;\n}\n\n.pb-3 {\n padding-bottom: 12px !important;\n}\n\n.pl-3 {\n padding-left: 12px !important;\n}\n\n.px-3 {\n padding-left: 12px !important;\n padding-right: 12px !important;\n}\n\n.py-3 {\n padding-top: 12px !important;\n padding-bottom: 12px !important;\n}\n\n/* gap */\n.g-3 {\n gap: 12px !important;\n}\n\n/* margin */\n.m-4 {\n margin: 15px !important;\n}\n\n.mt-4 {\n margin-top: 15px !important;\n}\n\n.mr-4 {\n margin-right: 15px !important;\n}\n\n.mb-4 {\n margin-bottom: 15px !important;\n}\n\n.ml-4 {\n margin-left: 15px !important;\n}\n\n.mx-4 {\n margin-left: 15px !important;\n margin-right: 15px !important;\n}\n\n.my-4 {\n margin-top: 15px !important;\n margin-bottom: 15px !important;\n}\n\n/* padding */\n.p-4 {\n padding: 15px !important;\n}\n\n.pt-4 {\n padding-top: 15px !important;\n}\n\n.pr-4 {\n padding-right: 15px !important;\n}\n\n.pb-4 {\n padding-bottom: 15px !important;\n}\n\n.pl-4 {\n padding-left: 15px !important;\n}\n\n.px-4 {\n padding-left: 15px !important;\n padding-right: 15px !important;\n}\n\n.py-4 {\n padding-top: 15px !important;\n padding-bottom: 15px !important;\n}\n\n/* gap */\n.g-4 {\n gap: 15px !important;\n}\n\n/* margin */\n.m-5 {\n margin: 18px !important;\n}\n\n.mt-5 {\n margin-top: 18px !important;\n}\n\n.mr-5 {\n margin-right: 18px !important;\n}\n\n.mb-5 {\n margin-bottom: 18px !important;\n}\n\n.ml-5 {\n margin-left: 18px !important;\n}\n\n.mx-5 {\n margin-left: 18px !important;\n margin-right: 18px !important;\n}\n\n.my-5 {\n margin-top: 18px !important;\n margin-bottom: 18px !important;\n}\n\n/* padding */\n.p-5 {\n padding: 18px !important;\n}\n\n.pt-5 {\n padding-top: 18px !important;\n}\n\n.pr-5 {\n padding-right: 18px !important;\n}\n\n.pb-5 {\n padding-bottom: 18px !important;\n}\n\n.pl-5 {\n padding-left: 18px !important;\n}\n\n.px-5 {\n padding-left: 18px !important;\n padding-right: 18px !important;\n}\n\n.py-5 {\n padding-top: 18px !important;\n padding-bottom: 18px !important;\n}\n\n/* gap */\n.g-5 {\n gap: 18px !important;\n}\n\n/* margin */\n.m-6 {\n margin: 22px !important;\n}\n\n.mt-6 {\n margin-top: 22px !important;\n}\n\n.mr-6 {\n margin-right: 22px !important;\n}\n\n.mb-6 {\n margin-bottom: 22px !important;\n}\n\n.ml-6 {\n margin-left: 22px !important;\n}\n\n.mx-6 {\n margin-left: 22px !important;\n margin-right: 22px !important;\n}\n\n.my-6 {\n margin-top: 22px !important;\n margin-bottom: 22px !important;\n}\n\n/* padding */\n.p-6 {\n padding: 22px !important;\n}\n\n.pt-6 {\n padding-top: 22px !important;\n}\n\n.pr-6 {\n padding-right: 22px !important;\n}\n\n.pb-6 {\n padding-bottom: 22px !important;\n}\n\n.pl-6 {\n padding-left: 22px !important;\n}\n\n.px-6 {\n padding-left: 22px !important;\n padding-right: 22px !important;\n}\n\n.py-6 {\n padding-top: 22px !important;\n padding-bottom: 22px !important;\n}\n\n/* gap */\n.g-6 {\n gap: 22px !important;\n}\n\n/* margin */\n.m-7 {\n margin: 26px !important;\n}\n\n.mt-7 {\n margin-top: 26px !important;\n}\n\n.mr-7 {\n margin-right: 26px !important;\n}\n\n.mb-7 {\n margin-bottom: 26px !important;\n}\n\n.ml-7 {\n margin-left: 26px !important;\n}\n\n.mx-7 {\n margin-left: 26px !important;\n margin-right: 26px !important;\n}\n\n.my-7 {\n margin-top: 26px !important;\n margin-bottom: 26px !important;\n}\n\n/* padding */\n.p-7 {\n padding: 26px !important;\n}\n\n.pt-7 {\n padding-top: 26px !important;\n}\n\n.pr-7 {\n padding-right: 26px !important;\n}\n\n.pb-7 {\n padding-bottom: 26px !important;\n}\n\n.pl-7 {\n padding-left: 26px !important;\n}\n\n.px-7 {\n padding-left: 26px !important;\n padding-right: 26px !important;\n}\n\n.py-7 {\n padding-top: 26px !important;\n padding-bottom: 26px !important;\n}\n\n/* gap */\n.g-7 {\n gap: 26px !important;\n}\n\n/* margin */\n.m-8 {\n margin: 34px !important;\n}\n\n.mt-8 {\n margin-top: 34px !important;\n}\n\n.mr-8 {\n margin-right: 34px !important;\n}\n\n.mb-8 {\n margin-bottom: 34px !important;\n}\n\n.ml-8 {\n margin-left: 34px !important;\n}\n\n.mx-8 {\n margin-left: 34px !important;\n margin-right: 34px !important;\n}\n\n.my-8 {\n margin-top: 34px !important;\n margin-bottom: 34px !important;\n}\n\n/* padding */\n.p-8 {\n padding: 34px !important;\n}\n\n.pt-8 {\n padding-top: 34px !important;\n}\n\n.pr-8 {\n padding-right: 34px !important;\n}\n\n.pb-8 {\n padding-bottom: 34px !important;\n}\n\n.pl-8 {\n padding-left: 34px !important;\n}\n\n.px-8 {\n padding-left: 34px !important;\n padding-right: 34px !important;\n}\n\n.py-8 {\n padding-top: 34px !important;\n padding-bottom: 34px !important;\n}\n\n/* gap */\n.g-8 {\n gap: 34px !important;\n}\n\n/* margin */\n.m-9 {\n margin: 42px !important;\n}\n\n.mt-9 {\n margin-top: 42px !important;\n}\n\n.mr-9 {\n margin-right: 42px !important;\n}\n\n.mb-9 {\n margin-bottom: 42px !important;\n}\n\n.ml-9 {\n margin-left: 42px !important;\n}\n\n.mx-9 {\n margin-left: 42px !important;\n margin-right: 42px !important;\n}\n\n.my-9 {\n margin-top: 42px !important;\n margin-bottom: 42px !important;\n}\n\n/* padding */\n.p-9 {\n padding: 42px !important;\n}\n\n.pt-9 {\n padding-top: 42px !important;\n}\n\n.pr-9 {\n padding-right: 42px !important;\n}\n\n.pb-9 {\n padding-bottom: 42px !important;\n}\n\n.pl-9 {\n padding-left: 42px !important;\n}\n\n.px-9 {\n padding-left: 42px !important;\n padding-right: 42px !important;\n}\n\n.py-9 {\n padding-top: 42px !important;\n padding-bottom: 42px !important;\n}\n\n/* gap */\n.g-9 {\n gap: 42px !important;\n}\n\n/* margin */\n.m-10 {\n margin: 48px !important;\n}\n\n.mt-10 {\n margin-top: 48px !important;\n}\n\n.mr-10 {\n margin-right: 48px !important;\n}\n\n.mb-10 {\n margin-bottom: 48px !important;\n}\n\n.ml-10 {\n margin-left: 48px !important;\n}\n\n.mx-10 {\n margin-left: 48px !important;\n margin-right: 48px !important;\n}\n\n.my-10 {\n margin-top: 48px !important;\n margin-bottom: 48px !important;\n}\n\n/* padding */\n.p-10 {\n padding: 48px !important;\n}\n\n.pt-10 {\n padding-top: 48px !important;\n}\n\n.pr-10 {\n padding-right: 48px !important;\n}\n\n.pb-10 {\n padding-bottom: 48px !important;\n}\n\n.pl-10 {\n padding-left: 48px !important;\n}\n\n.px-10 {\n padding-left: 48px !important;\n padding-right: 48px !important;\n}\n\n.py-10 {\n padding-top: 48px !important;\n padding-bottom: 48px !important;\n}\n\n/* gap */\n.g-10 {\n gap: 48px !important;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.f-grid {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n\n.w-100 {\n width: 100%;\n}\n\n.w-200 {\n width: 200%;\n}\n\n.fs-xs {\n font-size: 12px;\n}\n\n.fs-sm {\n font-size: 13px;\n}\n\n.fs-md {\n font-size: 14px;\n}\n\n.fs-base {\n font-size: 16px;\n}\n\n.fs-lg {\n font-size: 17px;\n}\n\n.fs-xl {\n font-size: 20px;\n}\n\n* {\n box-sizing: border-box;\n}\n\n*::-webkit-scrollbar {\n width: 10px;\n}\n\n*::-webkit-scrollbar-track {\n width: 10px;\n background: #0A0A0D;\n cursor: pointer;\n}\n\n*::-webkit-scrollbar-thumb {\n width: 10px;\n background: #4A4A57;\n cursor: default;\n}\n\n*::-webkit-scrollbar-corner {\n background: transparent;\n height: 1px;\n}\n\n*::-webkit-scrollbar-button {\n display: none;\n}\n\n.ph.normalize {\n position: relative;\n top: 0.15em;\n}\n\n* {\n padding: 0;\n margin: 0;\n}\n\nhtml, body {\n font-family: \"IBM Plex Mono\", monospace;\n font-weight: 400;\n}\n\nbody {\n background-color: #0A0A0D;\n color: #F8F8F8;\n font-size: 15px;\n line-height: 1.45;\n letter-spacing: 0.01em;\n}\n\n.screen {\n display: none;\n}\n.screen.a-show {\n display: block;\n}\n\n.sidebar {\n width: 100%;\n}\n\n.main-container,\n.main-container {\n width: 100%;\n}\n\n.card.script-action, .card.device-action {\n max-width: 280px;\n}\n.card.script-action .card-content, .card.device-action .card-content {\n cursor: default;\n transition-duration: 0.2s;\n transition-property: color, opacity, background;\n}\n.card.script-action:not(.card-success):not(.card-error):not(.card-danger):hover, .card.device-action:not(.card-success):not(.card-error):not(.card-danger):hover {\n color: #0A0A0D;\n background: #FFD900;\n}\n.card.script-action .action-details-btn, .card.device-action .action-details-btn {\n color: #0A0A0D;\n font-size: 34px;\n position: relative;\n right: -10px;\n}\n.card.script-action.loading-state, .card.device-action.loading-state {\n position: relative;\n border-color: #FFD900;\n}\n.card.script-action.loading-state .device-icon-container, .card.device-action.loading-state .device-icon-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 100%;\n height: 100%;\n background: #FFD900;\n}\n.card.script-action.loading-state .device-icon-container .device-icon, .card.device-action.loading-state .device-icon-container .device-icon {\n color: #0A0A0D;\n}\n.card.script-action.loading-state .device-icon-container .device-icon .ph, .card.script-action.loading-state .device-icon-container .device-icon .ph-bold, .card.device-action.loading-state .device-icon-container .device-icon .ph, .card.device-action.loading-state .device-icon-container .device-icon .ph-bold {\n transform-origin: 50% 50%;\n animation: icon_spin 1.2s linear infinite;\n}\n\n.sidebar-container {\n max-width: 260px;\n width: 100%;\n}\n\n.tree .branch {\n display: flex;\n flex-direction: column;\n padding-left: 66px;\n}\n.tree .branch .title {\n font-size: 20px;\n}\n.tree .branch .branch-container {\n border: 2px solid #F8F8F8;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: max-content;\n margin-bottom: 22px;\n}\n.tree > .branch, .tree > .branch > .branch {\n padding-left: 0;\n}\n\n#area-devices-modal .modal-body {\n position: relative;\n min-height: 300px;\n}\n#area-devices-modal .modal-body .loader {\n margin: auto;\n position: relative;\n top: 120px;\n}\n\n.top-bar {\n width: 100%;\n}\n.top-bar > .row {\n justify-content: space-between;\n align-items: center;\n}\n\n.hud {\n width: 100%;\n padding: 18px;\n}\n.hud > .row {\n justify-content: space-between;\n align-items: center;\n gap: 15px;\n flex-wrap: wrap;\n}\n.hud .hud-btns {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 15px;\n}\n.hud .nav-toggle,\n.hud .reload-screen {\n font-size: 42px;\n width: 50px;\n height: 50px;\n background: #F8F8F8;\n color: #0A0A0D;\n}\n.hud .nav-toggle {\n position: relative;\n z-index: 710;\n}\n.hud .nav-toggle.state-off .icon-state-on {\n display: none;\n}\n.hud .nav-toggle.state-on .icon-state-off {\n display: none;\n}\n.hud .app-title {\n padding: 8px 15px;\n text-transform: uppercase;\n}\n.hud .navigation {\n position: fixed;\n z-index: 700;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: #0A0A0D;\n opacity: 0;\n visibility: hidden;\n transition-duration: 0.2s;\n transition-property: visibility, opacity;\n}\n.hud .navigation .container {\n width: 100%;\n max-width: 600px;\n height: 100vh;\n margin: auto;\n padding: 12px;\n display: flex;\n align-items: center;\n}\n.hud .navigation .nav-items {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 48px;\n align-items: center;\n justify-content: space-between;\n height: max-content;\n margin-top: 100px;\n transition-duration: 0.2s;\n transition-property: margin-top;\n}\n.hud .navigation .nav-link {\n text-decoration: none;\n color: #F8F8F8;\n}\n.hud .navigation .nav-item {\n width: 160px;\n border: 2px solid #F8F8F8;\n padding: 22px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n transition-property: color, background, border-color;\n transition-duration: 0.2s;\n}\n.hud .navigation .nav-item .nav-icon {\n text-align: center;\n}\n.hud .navigation .nav-item .nav-icon .ph, .hud .navigation .nav-item .nav-icon .ph-bold {\n font-size: 64px;\n}\n.hud .navigation .nav-item .nav-text {\n width: 100%;\n text-align: center;\n text-transform: uppercase;\n font-size: 17px;\n}\n.hud .navigation .nav-item:hover {\n background: #00FFAA;\n border-color: #00FFAA;\n color: #0A0A0D;\n}\n.hud .navigation.a-show {\n visibility: visible;\n opacity: 1;\n}\n.hud .navigation.a-show .nav-items {\n margin-top: 0;\n}\n.hud .navigation.a-hide .nav-items {\n margin-top: -100px;\n}\n\n.load-screen {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n visibility: hidden;\n opacity: 0;\n background: #0A0A0D;\n transition-duration: 0.2s;\n transition-property: opacity, visibility;\n}\n.load-screen.a-show {\n visibility: visible;\n opacity: 1;\n z-index: 900;\n transition-duration: 0s;\n}\n\n.error-screen {\n display: none;\n}\n.error-screen .container {\n display: flex;\n align-items: center;\n flex-direction: column;\n justify-content: center;\n flex-wrap: nowrap;\n gap: 15px;\n padding-top: 20%;\n max-width: 420px;\n width: 100%;\n margin: auto;\n}\n.error-screen .icon-container {\n color: #FF3C00;\n}\n.error-screen .icon-container .ph, .error-screen .icon-container .ph-bold {\n font-size: 72px;\n}\n.error-screen .error-title {\n padding: 8px 12px;\n}\n.error-screen .error-text {\n font-size: 16px;\n text-align: center;\n}\n.error-screen.a-show {\n display: block;\n}","/* =========================\n\t FONT FAMILIES\n========================= */\n\n$font-family-base: \"IBM Plex Mono\", monospace;\n$font-family-code: $font-family-base;\n\n/* =========================\n\t FONT WEIGHTS\n========================= */\n\n$font-weight-regular: 400;\n$font-weight-medium: 500;\n$font-weight-semibold: 600;\n$font-weight-bold: 700;\n\n/* =========================\n\t FONT SIZES (scale)\n========================= */\n\n$font-size-xs: 12px;\n$font-size-sm: 13px;\n$font-size-md: 14px;\n$font-size-base: 16px;\n$font-size-lg: 17px;\n$font-size-xl: 20px;\n\n$font-size-h1: 36px;\n$font-size-h2: 28px;\n$font-size-h3: 24px;\n$font-size-h4: 20px;\n$font-size-h5: 18px;\n$font-size-h6: 16px;\n\n/* =========================\n\t LINE HEIGHTS\n========================= */\n\n$line-height-base: 1;\n$line-height-tight: 1.15;\n$line-height-snug: 1.25;\n$line-height-normal: 1.4;\n$line-height-relaxed: 1.6;\n\n/* =========================\n\t LETTER SPACING\n========================= */\n\n$letter-spacing-tight: -0.01em;\n$letter-spacing-normal: 0;\n$letter-spacing-wide: 0.04em;\n\n/* =========================\n\t BASE TYPOGRAPHY\n========================= */\n\nhtml {\n\tfont-size: 100%;\n}\n\nbody {\n\tfont-family: $font-family-base;\n\tfont-size: $font-size-base;\n\tfont-weight: $font-weight-regular;\n\tline-height: $line-height-relaxed;\n\tletter-spacing: $letter-spacing-normal;\n}\n\n/* =========================\n\t HEADINGS\n========================= */\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-family: $font-family-base;\n\tfont-weight: $font-weight-semibold;\n\tline-height: $line-height-snug;\n\tmargin: 0;\n\n\t&.contrast {\n\t\tbackground: $color-text-light;\n\t\tcolor: $color-black;\n\t}\n}\n\nh1 {\n\tfont-size: $font-size-h1;\n\tletter-spacing: $letter-spacing-tight;\n}\n\nh2 {\n\tfont-size: $font-size-h2;\n}\n\nh3 {\n\tfont-size: $font-size-h3;\n}\n\nh4 {\n\tfont-size: $font-size-h4;\n}\n\nh5 {\n\tfont-size: $font-size-h5;\n}\n\nh6 {\n\tfont-size: $font-size-h6;\n\tfont-weight: $font-weight-medium;\n}\n\n/* =========================\n\t TEXT VARIANTS\n========================= */\n\n.text,\np {\n\tfont-size: $font-size-base;\n\tline-height: $line-height-relaxed;\n}\n\n.text-sm {\n\tfont-size: $font-size-sm;\n\tline-height: $line-height-normal;\n}\n\n.text-lg {\n\tfont-size: $font-size-lg;\n\tline-height: $line-height-relaxed;\n}\n\n.text-muted {\n\tfont-size: $font-size-sm;\n\tcolor: $color-text-dark;\n}\n\n.text-strong,\nstrong {\n\tfont-weight: $font-weight-semibold;\n}\n\n.text-bold {\n\tfont-weight: $font-weight-bold;\n}\n\n.text-italic,\nem {\n\tfont-style: italic;\n}\n\n/* =========================\n\t CODE / MONO\n========================= */\n\ncode,\npre,\n.code {\n\tfont-family: $font-family-code;\n\tfont-size: $font-size-base;\n\tline-height: $line-height-normal;\n\tbackground-color: $color-dark;\n}\n\npre {\n\tfont-size: $font-size-base;\n\tline-height: $line-height-relaxed;\n\twhite-space: pre-wrap;\n}\n\npre code,\n.code {\n\ttab-size: 2;\n\t-moz-tab-size: 2;\n}\n\n/* =========================\n\t LINKS\n========================= */\n\na {\n\tfont-weight: $font-weight-medium;\n\ttext-decoration: none;\n}\n\n.link {\n\tfont-size: inherit;\n\tfont-weight: $font-weight-medium;\n}\n\n/* =========================\n\t LABELS / META\n========================= */\n\n.label {\n\tfont-size: $font-size-sm;\n\tfont-weight: $font-weight-medium;\n\tline-height: $line-height-normal;\n}\n\n.hint,\n.meta {\n\tfont-size: $font-size-xs;\n\tline-height: $line-height-normal;\n}\n\n/* =========================\n\t TABLE TEXT\n========================= */\n\n.table {\n\tfont-size: $font-size-sm;\n\tline-height: $line-height-normal;\n\n\tth {\n\t\tfont-weight: $font-weight-semibold;\n\t}\n\n\ttd {\n\t\tfont-weight: $font-weight-regular;\n\t}\n}\n\n/* =========================\n\t LISTS\n========================= */\n\n.list {\n\tfont-size: $font-size-base;\n\tline-height: $line-height-relaxed;\n}\n\n.list-item {\n\tfont-size: inherit;\n}\n\n/* =========================\n\t MODALS\n========================= */\n\n.modal-title {\n\tfont-size: $font-size-h4;\n\tfont-weight: $font-weight-semibold;\n}\n\n.modal-body {\n\tfont-size: $font-size-base;\n}\n\n/* =========================\n\t TOASTS\n========================= */\n\n.toast-title {\n\tfont-size: $font-size-md;\n\tfont-weight: $font-weight-semibold;\n}\n\n.toast-text {\n\tfont-size: $font-size-sm;\n\tline-height: $line-height-normal;\n}\n\n\n",".palette {\n\tdisplay: flex;\n\tflex-direction: row;\n\tgap: $space-sm;\n\n\t.color {\n\t\t.color-box {\n\t\t\twidth: 100px;\n\t\t\theight: 80px;\n\t\t}\n\t}\n}\n\n/* BACKGROUND COLORS */\n\nbody {\n\t.bg-primary {\n\t\tbackground: $color-primary;\n\t}\n\n\t.bg-secondary {\n\t\tbackground: $color-secondary;\n\t}\n\n\t.bg-success {\n\t\tbackground: $color-success;\n\t}\n\n\t.bg-accent {\n\t\tbackground: $color-accent;\n\t}\n\n\t.bg-info {\n\t\tbackground: $color-info;\n\t}\n\n\t.bg-warning {\n\t\tbackground: $color-warning;\n\t}\n\n\t.bg-error {\n\t\tbackground: $color-error;\n\t}\n\n\t/* TEXT COLORS */\n\n\t.text-color-primary {\n\t\tcolor: $color-primary;\n\t}\n\n\t.text-color-secondary {\n\t\tcolor: $color-secondary;\n\t}\n\n\t.text-color-success {\n\t\tcolor: $color-success;\n\t}\n\n\t.text-color-accent {\n\t\tcolor: $color-accent;\n\t}\n\n\t.text-color-info {\n\t\tcolor: $color-info;\n\t}\n\n\t.text-color-warning {\n\t\tcolor: $color-warning;\n\t}\n\n\t.text-color-error {\n\t\tcolor: $color-error;\n\t}\n}","/* HTML:
*/\n.loader {\n width: 45px;\n aspect-ratio: 1;\n --c:no-repeat linear-gradient(#FF3C00 0 0);\n background: \n var(--c) 0 0,\n var(--c) 0 100%, \n var(--c) 50% 0, \n var(--c) 50% 100%, \n var(--c) 100% 0, \n var(--c) 100% 100%;\n animation: l12 1s infinite;\n}\n@keyframes l12 {\n 0%,100%{background-size:20% 50%}\n 16.67% {background-size:20% 30%, 20% 30%, 20% 50%, 20% 50%, 20% 50%, 20% 50%}\n 33.33% {background-size:20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 50%, 20% 50%}\n 50% {background-size:20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%, 20% 30%}\n 66.67% {background-size:20% 50%, 20% 50%, 20% 30%, 20% 30%, 20% 30%, 20% 30%}\n 83.33% {background-size:20% 50%, 20% 50%, 20% 50%, 20% 50%, 20% 30%, 20% 30%}\n}","@keyframes icon_spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n.btn {\n\tfont-family: $font-family-base;\n\tfont-size: $font-size-lg;\n\tfont-weight: $font-weight-semibold;\n\tline-height: $line-height-base;\n\tletter-spacing: $letter-spacing-wide;\n\tpadding: $space-3 $space-lg;\n\tborder-radius: 0;\n\tborder-width: 2px;\n\tborder-left-width: 6px;\n\tborder-style: solid;\n\tborder-color: $color-primary;\n\ttext-transform: uppercase;\n\tbackground-color: transparent;\n\ttransition-duration: .2s;\n\ttransition-property: background-color, border-color, color;\n\n\t&.with-icon {\n\t\tborder-left-width: 48px;\n\t\tposition: relative;\n\n\t\t.ph,\n\t\t.ph-bold {\n\t\t\tposition: absolute;\n\t\t\tcolor: #0a0a0d;\n\t\t\tleft: -48px;\n\t\t\ttop: 0;\n\t\t\tfont-size: 28px;\n\t\t\theight: 100%;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\twidth: 48px;\n\t\t\tjustify-content: center;\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: color, left;\n\t\t}\n\t}\n\n\t&:hover {\n\t\t&.with-icon:not(.loading-state):not(.btn-small) {\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tleft: -28px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-primary {\n\t\tcolor: $color-primary;\n\t\tborder-color: $color-primary;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-primary;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-secondary {\n\t\tcolor: $color-secondary;\n\t\tborder-color: $color-secondary;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-secondary;\n\t\t\tcolor: $color-text-light;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-light;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-accent {\n\t\tcolor: $color-accent;\n\t\tborder-color: $color-accent;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-accent;\n\t\t\tcolor: $color-text-light;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-light;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-danger {\n\t\tcolor: $color-error;\n\t\tborder-color: $color-error;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-error;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-warning {\n\t\tcolor: $color-warning;\n\t\tborder-color: $color-warning;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-warning;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-success {\n\t\tcolor: $color-success;\n\t\tborder-color: $color-success;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-success;\n\t\t\tcolor: $color-black;\n\t\t}\n\t}\n\n\t&.btn-info {\n\t\tcolor: $color-info;\n\t\tborder-color: $color-info;\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-info;\n\t\t\tcolor: $color-text-light;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-light;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&[disabled]:not(.loading-state) {\n\t\tcolor: $color-text-dark;\n\t\tborder-color: $color-dark;\n\t\tbackground-color: $color-dark;\n\n\t\t&.with-icon {\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tcolor: $color-text-dark;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground-color: $color-dark;\n\t\t\tcolor: $color-text-dark;\n\n\t\t\t&.with-icon {\n\t\t\t\t.ph,\n\t\t\t\t.ph-bold {\n\t\t\t\t\tcolor: $color-text-dark;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.with-icon:not(.btn-small) {\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tleft: -28px;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-small {\n\t\tfont-size: $font-size-md;\n\t\tfont-weight: $font-weight-medium;\n\t\tpadding: $space-sm $space-sm;\n\n\t\t&.with-icon {\n\t\t\tborder-left-width: 32px;\n\n\t\t\t.ph,\n\t\t\t.ph-bold {\n\t\t\t\tleft: -40px;\n\t\t\t\tfont-size: 23px;\n\t\t\t}\n\n\t\t\t&.loading-state {\n\t\t\t\t.ph, .ph-bold {\n\t\t\t\t\tfont-size: 30px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.btn-large {\n\t\tfont-size: $font-size-xl;\n\t\tfont-weight: $font-weight-bold;\n\t\tpadding: $space-md $space-xxl;\n\t}\n\n\t&.loading-state {\n\t\tcolor: $color-black !important;\n\t\tborder-color: $color-primary !important;\n\t\tbackground-color: $color-primary !important;\n\n\t\t.ph, .ph-bold {\n\t\t\tfont-size: 31px;\n\t\t\ttransform-origin: 50% 50%;\n \t\tanimation: icon_spin 1.2s linear infinite;\n\t\t}\n\t}\n}\n\n.btn-icon {\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\twidth: 30px;\n\theight: 30px;\n\n\tbackground: transparent;\n\tcolor: $color-text-light;\n\tfont-size: $font-size-xl;\n\tborder: 0;\n\n\ttransition-duration: .2s;\n\ttransition-property: color;\n\n\t\n\t.ph {\n\t\ttransform: rotate(0);\n\t\ttransition-duration: .2s;\n\t\ttransition-property: transform;\n\t}\n\n\t&:not(.without-hover):hover {\n\t\tcolor: $color-text-dark;\n\n\t\t.ph {\n\t\t\ttransform: rotate(90deg);\n\t\t}\n\t}\n}\n",".form-group {\n\t.label {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tfont-size: $font-size-lg;\n\t\twidth: 100%;\n\t\tmax-width: 600px;\n\t\tposition: relative;\n\n\t\t& > .ph {\n\t\t\tposition: absolute;\n\t\t\tcolor: $color-text-light;\n\t\t\tleft: 0;\n\t\t\tbottom: 2px;\n\t\t\tfont-size: 28px;\n\t\t\theight: 56px;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\twidth: 48px;\n\t\t\tjustify-content: center;\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: color, left;\n\t\t}\n\n\t\t.input {\n\t\t\tfont-family: $font-family-base;\n\t\t\tfont-size: $font-size-base;\n\t\t\tfont-weight: $font-weight-medium;\n\t\t\tline-height: $line-height-base;\n\t\t\tletter-spacing: $letter-spacing-wide;\n\t\t\tpadding: $space-3 $space-lg;\n\t\t\tmargin-top: $space-sm;\n\t\t\tborder-radius: 0;\n\t\t\tborder-width: 2px;\n\t\t\tborder-bottom-width: 6px;\n\t\t\tborder-style: solid;\n\t\t\tborder-color: $color-text-light;\n\t\t\tcolor: $color-text-light;\n\t\t\tbackground-color: transparent;\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: background-color, border-color, color;\n\n\t\t\t&:hover {\n\t\t\t\tborder-bottom-color: $color-text-dark;\n\t\t\t}\n\n\t\t\t&:focus {\n\t\t\t\toutline: none;\n\t\t\t\tborder-color: $color-electric-blue;\n\t\t\t}\n\n\t\t\t&::placeholder {\n\t\t\t\tcolor: $color-text-dark;\n\t\t\t}\n\t\t}\n\n\t\ttextarea.input {\n\t\t\theight: 120px;\n\t\t\tline-height: $line-height-snug;\n\t\t\tresize: none;\n\t\t}\n\n\t\t.ph + .input,\n\t\t.ph + .select-wrap .select {\n\t\t\tpadding-left: 42px;\n\t\t}\n\n\t\t.select-wrap {\n\t\t\tmargin-top: $space-sm;\n\t\t}\n\n\t\t.select {\n\t\t\twidth: 100%;\n\t\t\theight: 56px;\n\t\t\tmargin-top: 0;\n\n\t\t\t/* убрать нативную стрелку */\n\t\t\tappearance: none;\n\t\t\t-webkit-appearance: none;\n\t\t\t-moz-appearance: none;\n\n\t\t\t&:focus {\n\t\t\t\toutline: none;\n\t\t\t}\n\n\t\t\toption {\n\t\t\t\tcolor: $color-text-light;\n\t\t\t\tbackground: $color-dark;\n\t\t\t}\n\t\t}\n\n\t\t.select-wrap::after {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\tright: $space-lg;\n\t\t\tbottom: 18px;\n\t\t\ttransform: translateY(-50%);\n\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-left: 8px solid transparent;\n\t\t\tborder-right: 8px solid transparent;\n\t\t\tborder-top: 10px solid $color-text-light;\n\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t&.error {\n\t\t\t.input:not(:focus) {\n\t\t\t\tborder-color: $color-error;\n\t\t\t}\n\n\t\t\t& + .input-info {\n\t\t\t\tcolor: $color-warning;\n\t\t\t}\n\t\t}\n\t}\n\n\t.input-info {\n\t\tfont-size: $font-size-md;\n\t\tmargin-top: $space-2;\n\n\t\t.ph {\n\t\t\tposition: relative;\n\t\t\ttop: 1px;\n\t\t}\n\t}\n}\n\n.radio {\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\tgap: $space-sm;\n\talign-items: center;\n\n\tinput[type=\"radio\"] {\n\t\tdisplay: none;\n\t}\n\n\t.radio-control {\n\t\tdisplay: inline-block;\n\t\tborder-radius: 100%;\n\t\tborder: 2px solid $color-primary;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tbackground: transparent;\n\t\ttransition-duration: .2s;\n\t\ttransition-property: background, border-color;\n\t}\n\n\t&:hover .radio-control {\n\t\tbackground: $color-grey;\n\t}\n\n\tinput[type=\"radio\"]:checked + .radio-control {\n\t\tbackground: $color-primary;\n\t}\n\n\tinput[type=\"radio\"]:disabled + .radio-control {\n\t\tbackground: $color-grey;\n\t\tborder-color: $color-grey;\n\t}\n\n\t.radio-label {\n\t\tfont-size: $font-size-lg;\n\t}\n}\n\n.checkbox {\n\tdisplay: inline-flex;\n\tflex-direction: row;\n\tgap: $space-sm;\n\talign-items: center;\n\n\tinput[type=\"checkbox\"] {\n\t\tdisplay: none;\n\t}\n\n\t.checkbox-control {\n\t\theight: 16px;\n\t\twidth: 30px;\n\t\tborder: 2px solid $color-primary;\n\t\tposition: relative;\n\t\tbackground: transparent;\n\t\ttransition-duration: .2s;\n\t\ttransition-property: border-color, background;\n\t\tdisplay: block;\n\t}\n\n\t.checkbox-control:before {\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 20px;\n\t\twidth: 20px;\n\t\tbackground: $color-primary;\n\t\tposition: absolute;\n\t\tleft: -6px;\n\t\ttop: -4px;\n\t\ttransition-duration: .2s;\n\t\ttransition-property: left, background;\n\t}\n\n\t&:hover .checkbox-control {\n\t\tbackground: $color-grey;\n\t}\n\n\tinput[type=\"checkbox\"]:checked:not(:disabled) + .checkbox-control {\n\t\tbackground: $color-secondary;\n\t\tborder-color: $color-secondary;\n\t}\n\n\tinput[type=\"checkbox\"]:checked + .checkbox-control:before {\n\t\tleft: 12px;\n\t}\n\n\tinput[type=\"checkbox\"]:disabled + .checkbox-control {\n\t\tborder-color: $color-grey;\n\t}\n\n\tinput[type=\"checkbox\"]:disabled + .checkbox-control:before {\n\t\tbackground: $color-grey;\n\t}\n}\n",".list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: $space-1;\n\tlist-style-type: none;\n\tpadding-left: 0;\n\n\t.list-item {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: $space-sm;\n\t\tmargin-left: 0;\n\t}\n\n\t&.list-ordered {\n\t\tlist-style-type: decimal;\n\t\tdisplay: list-item;\n\t\tmargin-left: 30px;\n\n\t\t.list-item {\n\t\t\tdisplay: list-item;\n\t\t}\n\t}\n\n\t&.list-definition {\n\t\tgap: $space-md;\n\n\t\t.list-row {\n\t\t\tborder-left: 2px solid $color-primary;\n\n\t\t\t.list-term::before,\n\t\t\t.list-desc::before {\n\t\t\t\tcontent: \"\";\n\t\t\t\theight: 2px;\n\t\t\t\twidth: $space-3;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 0;\n\t\t\t\tmargin-top: -1px;\n\t\t\t\tdisplay: block;\n\t\t\t\tbackground: $color-primary;\n\t\t\t}\n\n\t\t\t.list-term,\n\t\t\t.list-desc {\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.list-term {\n\t\t\t\tpadding-left: $space-5;\n\t\t\t\tfont-size: $font-size-xl;\n\t\t\t}\n\n\t\t\t.list-desc {\n\t\t\t\tpadding-left: $space-5;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.with-icons {\n\t\t.ph {\n\t\t\t// icon styles if needed\n\t\t}\n\t}\n\n\t&.list-nav {\n\t\tmax-width: 420px;\n\t\twidth: 100%;\n\t\tgap: 0;\n\n\t\t.list-item {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\talign-items: flex-start;\n\t\t\theight: 50px;\n\t\t\tmargin: 0;\n\n\t\t\t.list-action {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tpadding: $space-2 $space-3;\n\t\t\t\tborder: 0;\n\n\t\t\t\tfont-size: $font-size-lg;\n\t\t\t\tbackground: $color-dark;\n\t\t\t\tcolor: inherit;\n\n\t\t\t\ttransition-duration: .2s;\n\t\t\t\ttransition-property: background;\n\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground: $color-electric-blue;\n\t\t\t\t}\n\n\t\t\t\t.list-label {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: row;\n\t\t\t\t\tgap: $space-2;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tletter-spacing: -0.05em;\n\t\t\t\t\tfont-weight: 400;\n\t\t\t\t}\n\n\t\t\t\t.list-meta {\n\t\t\t\t\tpadding: $space-2;\n\t\t\t\t\tbackground: $color-neon-green;\n\t\t\t\t\tcolor: $color-black;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.list-item-active {\n\t\t\t\t.list-action {\n\t\t\t\t\tbackground: $color-electric-blue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t&.list-actions {\n\t\twidth: 100%;\n\t\tmax-width: 420px;\n\t\tgap: $space-lg;\n\n\t\t.list-item {\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: flex-start;\n\n\t\t\t.list-content {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: $space-2;\n\n\t\t\t\t.list-title {\n\t\t\t\t\tfont-size: $font-size-xl;\n\t\t\t\t\tline-height: $line-height-base;\n\t\t\t\t}\n\n\t\t\t\t.list-subtitle {\n\t\t\t\t\t// subtitle styles\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.list-controls {\n\t\t\t\t// controls styles\n\t\t\t}\n\t\t}\n\t}\n}\n",".badge {\n\tbackground: $color-primary;\n\tcolor: $color-dark;\n\tpadding: $space-1 $space-2;\n\tfont-size: $font-size-base;\n\tdisplay: inline-block;\n\n\t&.badge-success {\n\t\tbackground: $color-success;\n\t}\n\n\t&.badge-warning {\n\t\tbackground: $color-warning;\n\t}\n\n\t&.badge-error,\n\t&.badge-danger {\n\t\tbackground: $color-error;\n\t}\n\n\t&.badge-info {\n\t\tbackground: $color-info;\n\t\tcolor: $color-text-light;\n\t}\n\n\t&.badge-secondary {\n\t\tbackground: $color-secondary;\n\t\tcolor: $color-text-light;\n\t}\n}\n",".table {\n\ttext-align: left;\n\tborder: 2px solid $color-primary;\n\tpadding: $space-4;\n\n\t.table-caption {\n\t\ttext-align: left;\n\t\tfont-size: $font-size-xl;\n\t\tbackground: $color-primary;\n\t\twidth: max-content;\n\t\tcolor: $color-dark;\n\t\tpadding: $space-1 $space-3;\n\t\tmargin-bottom: 0;\n\t}\n\n\t&.table-empty {\n\t\twidth: 100%;\n\n\t\t.is-empty {\n\t\t\twidth: 100%;\n\t\t\tpadding: $space-4;\n\t\t\tfont-size: $font-size-base;\n\t\t\tcolor: $color-text-dark;\n\t\t\ttext-align: left;\n\t\t}\n\t}\n\n\t.table-row {\n\t\tth,\n\t\ttd {\n\t\t\tpadding: $space-3 $space-5;\n\t\t\tfont-size: $font-size-base;\n\t\t\tvertical-align: top;\n\t\t}\n\n\t\tth {\n\t\t\t// header cell styles if needed\n\t\t}\n\t}\n\n\t.table-head {\n\t\t// thead styles\n\t}\n\n\t.table-body {\n\t\t// tbody styles\n\t}\n\n\t.table-foot {\n\t\tth,\n\t\ttd {\n\t\t\tpadding-top: $space-4;\n\t\t}\n\t}\n}\n",".toast {\n\tposition: fixed;\n\tz-index: 1100;\n\tbottom: -100px;\n\tright: $space-4;\n\tmax-width: 420px;\n\n\tbackground: $color-dark;\n\tborder: 2px solid $color-text-light;\n\tpadding: 0;\n\topacity: 0;\n\n\ttransition-duration: .25s;\n\ttransition-property: opacity, top, bottom;\n\n\t&.a-show {\n\t\tbottom: $space-4;\n\t\topacity: 1;\n\t}\n\n\t&.a-hide {\n\t\tbottom: $space-4 + 100px;\n\t\topacity: 0;\n\t}\n\n\t.toast-content {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 0;\n\n\t\t.toast-title {\n\t\t\tfont-size: $font-size-h3;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tgap: $space-2;\n\t\t\talign-items: center;\n\t\t\tcolor: $color-black;\n\t\t\tbackground: $color-primary;\n\t\t\tpadding: $space-1 $space-2;\n\t\t\tpadding-right: $space-9;\n\t\t}\n\n\t\t.toast-text {\n\t\t\tfont-size: $font-size-base;\n\t\t\tpadding: $space-6 $space-4;\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\n\t.toast-close {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tcolor: $color-black;\n\t\theight: 40px;\n\t\twidth: 40px;\n\n\t\t&:hover {\n\t\t\tcolor: $color-dark;\n\t\t}\n\t}\n\n\t&.toast-info {\n\t\t// default info styles (inherits primary)\n\t}\n\n\t&.toast-success {\n\t\tborder-color: $color-success;\n\n\t\t.toast-title {\n\t\t\tbackground: $color-success;\n\t\t}\n\t}\n\n\t&.toast-warning {\n\t\tborder-color: $color-warning;\n\n\t\t.toast-title {\n\t\t\tbackground: $color-warning;\n\t\t}\n\t}\n\n\t&.toast-danger {\n\t\tborder-color: $color-error;\n\n\t\t.toast-title {\n\t\t\tbackground: $color-error;\n\t\t}\n\t}\n}\n",".card {\n\tmax-width: 420px;\n\twidth: 100%;\n\tborder: 2px solid $color-text-light;\n\n\t.card-title {\n\t\tcolor: $color-black;\n\t\tbackground: $color-text-light;\n\t\tpadding: $space-2 $space-3;\n\t}\n\n\t.card-content {\n\t\tpadding: $space-4;\n\n\t\t.card-thumb {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\tp {\n\t\t\tmargin-top: $space-2;\n\t\t\tmargin-bottom: 0;\n\t\t}\n\t}\n\n\t.card-footer {\n\t\tpadding: $space-2 $space-4;\n\t\tpadding-bottom: $space-4;\n\t}\n\n\t&.device-action {\n\t\tmax-width: 220px;\n\n\t\ttransition-duration: .2s;\n\t\ttransition-property: border-color;\n\n\t\t.device-icon-container {\n\t\t\tposition: relative;\n\n\t\t\t.device-online-status {\n\t\t\t\tposition: absolute;\n\t\t top: -15px;\n \t\tleft: -5px;\n\t\t\n\t\t\t\tfont-size: 24px;\n\t\t\t\tcolor: $color-error;\n\n\t\t\t\t&.status-online {\n\t\t\t\t\tcolor: $color-success;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\talign-items: center;\n \t\tjustify-content: center;\n\t\t\t\t\n\t\t\t\tfont-size: 64px;\n\t\t\t\theight: 120px;\n\t\t\t\twidth: 100%;\n\n\t\t\t\ttransition-duration: .2s;\n\t\t\t\ttransition-property: color;\n\t\t\t}\n\t\t}\n\n\t\t.card-title {\n\t\t\tdisplay: flex;\n\t\t\twidth: 100%;\n\t\t\tfont-size: $font-size-md;\n\t\t\tfont-weight: $font-weight-bold;\n\n\t\t\talign-items: center;\n\t flex-direction: row;\n\t flex-wrap: nowrap;\n\t justify-content: space-between;\n\n\t\t\ttransition-duration: .2s;\n\t\t\ttransition-property: background-color, color;\n\t\t}\n\n\t\t.device-name {\n\t\t\tfont-size: $font-size-md;\n\t\t\tline-height: $line-height-normal;\n\t\t}\n\n\t\t&.card-success {\n\t\t\tborder-color: $color-success;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-success;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-success;\n\t\t\t}\n\t\t}\n\n\t\t&.card-warning {\n\t\t\tborder-color: $color-warning;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-warning;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-warning;\n\t\t\t}\n\t\t}\n\n\t\t&.card-info {\n\t\t\tborder-color: $color-info;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-info;\n\t\t\t\tcolor: $color-text-light;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-info;\n\t\t\t}\n\t\t}\n\n\t\t&.card-secondary {\n\t\t\tborder-color: $color-secondary;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-secondary;\n\t\t\t\tcolor: $color-text-light;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-secondary;\n\t\t\t}\n\t\t}\n\n\t\t&.card-danger, &.card-error {\n\t\t\tborder-color: $color-error;\n\n\t\t\t.card-title {\n\t\t\t\tbackground: $color-error;\n\t\t\t}\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-error;\n\t\t\t}\n\t\t}\n\t}\n}\n",".modal {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tz-index: 1000;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\n\t.modal-backdrop {\n\t\tposition: fixed;\n\t\tz-index: 1010;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\n\t\tbackground: $color-black;\n\t\topacity: 0;\n\n\t\ttransition-duration: .25s;\n\t\ttransition-property: opacity;\n\t}\n\n\t.modal-panel {\n\t\tposition: relative;\n\t\tz-index: 1020;\n\n\t\twidth: 100%;\n\t\tmax-width: 960px;\n\t\theight: auto;\n\t\tmin-height: 200px;\n\t\tmax-height: 800px;\n\n\t\tpadding: 0;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: $space-4;\n\t\tmargin-top: 200px;\n\n\t\tbackground: $color-black;\n\t\tborder: 2px solid $color-text-light;\n\t\topacity: 0;\n\n\t\ttransition-duration: .25s;\n\t\ttransition-property: opacity, margin-top;\n\n\t\t.modal-header {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tjustify-content: space-between;\n\t\t\talign-items: center;\n\t\t\tpadding-right: $space-4;\n\n\t\t\t.modal-title {\n\t\t\t\tpadding: $space-3 $space-4;\n\t\t\t\tbackground: $color-text-light;\n\t\t\t\tcolor: $color-black;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t}\n\t\t}\n\n\t\t.modal-body {\n\t\t\tmax-height: 700px;\n\t\t\toverflow-y: auto;\n\t\t\tpadding: $space-5;\n\t\t}\n\n\t\t.modal-footer {\n\t\t\tpadding: $space-5;\n\n\t\t\t.actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: row;\n\t\t\t\tjustify-content: flex-end;\n\t\t\t\tgap: $space-4;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t}\n\n\t&.a-show {\n\t\t.modal-backdrop {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t.modal-panel {\n\t\t\topacity: 1;\n\t\t\tmargin-top: 0;\n\t\t}\n\t}\n\n\t&.a-hide {\n\t\t.modal-backdrop {\n\t\t\topacity: 0;\n\t\t}\n\n\t\t.modal-panel {\n\t\t\topacity: 0;\n\t\t\tmargin-top: -200px;\n\t\t}\n\t}\n}\n","$alert-bg-alpha: 0.1;\n\n.alert {\n\tpadding: $space-3 $space-4;\n\tborder-left-style: solid;\n\tborder-left-width: 4px;\n\tcolor: $color-text-light;\n\n\t&.alert-primary {\n\t\tborder-color: $color-primary;\n\t\tbackground: rgba($color-primary, $alert-bg-alpha);\n\t\tcolor: $color-primary;\n\t}\n\n\t&.alert-success {\n\t\tborder-color: $color-success;\n\t\tbackground: rgba($color-success, $alert-bg-alpha);\n\t\tcolor: $color-success;\n\t}\n\n\t&.alert-secondary {\n\t\tborder-color: $color-secondary;\n\t\tbackground: rgba($color-secondary, $alert-bg-alpha);\n\t\tcolor: lighten($color-secondary, 10%);\n\t}\n\n\t&.alert-info {\n\t\tborder-color: $color-info;\n\t\tbackground: rgba($color-info, $alert-bg-alpha);\n\t\tcolor: lighten($color-info, 20%);\n\t}\n\n\t&.alert-warning {\n\t\tborder-color: $color-warning;\n\t\tbackground: rgba($color-warning, $alert-bg-alpha);\n\t\tcolor: $color-warning;\n\t}\n\n\t&.alert-error, &.alert-danger {\n\t\tborder-color: $color-error;\n\t\tbackground: rgba($color-error, $alert-bg-alpha);\n\t\tcolor: lighten($color-error, 15%);\n\t}\n}","/* =========================\n SPACING UTILITIES\n========================= */\n\n@each $key, $value in $spaces {\n\n /* margin */\n .m-#{$key} { margin: $value !important; }\n .mt-#{$key} { margin-top: $value !important; }\n .mr-#{$key} { margin-right: $value !important; }\n .mb-#{$key} { margin-bottom: $value !important; }\n .ml-#{$key} { margin-left: $value !important; }\n .mx-#{$key} {\n margin-left: $value !important;\n margin-right: $value !important;\n }\n .my-#{$key} {\n margin-top: $value !important;\n margin-bottom: $value !important;\n }\n\n /* padding */\n .p-#{$key} { padding: $value !important; }\n .pt-#{$key} { padding-top: $value !important; }\n .pr-#{$key} { padding-right: $value !important; }\n .pb-#{$key} { padding-bottom: $value !important; }\n .pl-#{$key} { padding-left: $value !important; }\n .px-#{$key} {\n padding-left: $value !important;\n padding-right: $value !important;\n }\n .py-#{$key} {\n padding-top: $value !important;\n padding-bottom: $value !important;\n }\n\n /* gap */\n .g-#{$key} {\n gap: $value !important;\n }\n}\n\n.row {\n display: flex;\n flex-direction: row;\n} \n\n.f-grid {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n}\n\n.w-100 {\n width: 100%;\n}\n\n.w-200 {\n width: 200%;\n}\n\n$font-sizes: (\n xs: $font-size-xs,\n sm: $font-size-sm,\n md: $font-size-md,\n base: $font-size-base,\n lg: $font-size-lg,\n xl: $font-size-xl\n);\n\n@each $name, $size in $font-sizes {\n .fs-#{$name} {\n font-size: $size;\n }\n}","@import \"_spacing.scss\";\n@import \"ui_components/_typography.scss\";\n@import \"ui_components/_palette.scss\";\n@import \"ui_components/_loader.scss\";\n@import \"ui_components/_buttons.scss\";\n@import \"ui_components/_forms.scss\";\n@import \"ui_components/_lists.scss\";\n@import \"ui_components/_badges.scss\";\n@import \"ui_components/_tables.scss\";\n@import \"ui_components/_toasts.scss\";\n@import \"ui_components/_cards.scss\";\n@import \"ui_components/_modals.scss\";\n@import \"ui_components/_alerts.scss\";\n@import \"_utils.scss\";\n\n* {\n\tbox-sizing: border-box;\n}\n\n*::-webkit-scrollbar {\n\twidth: 10px;\n}\n\n*::-webkit-scrollbar-track {\n\twidth: 10px;\n\tbackground: $color-black;\n\tcursor: pointer;\n}\n\n*::-webkit-scrollbar-thumb {\n\twidth: 10px;\n\tbackground: $color-grey;\n\tcursor: default;\n}\n\n*::-webkit-scrollbar-corner {\n\tbackground: transparent;\n\theight: 1px;\n}\n\n*::-webkit-scrollbar-button {\n\tdisplay: none;\n}\n\n*::-webkit-scrollbar-track-piece {}\n*::-webkit-resizer {}\n\n.ph {\n\t&.normalize {\n\t\tposition: relative;\n top: 0.15em;\n\t}\n}","* {\n\tpadding: 0;\n\tmargin: 0;\n}\n\nhtml, body {\n font-family: \"IBM Plex Mono\", monospace;\n font-weight: 400;\n}\n\nbody {\n\tbackground-color: $color-black;\n\tcolor: $color-text-light;\n\n\tfont-size: 15px;\n line-height: 1.45;\n letter-spacing: 0.01em;\n}\n\n.screen {\n\tdisplay: none;\n\n\t&.a-show {\n\t\tdisplay: block;\n\t}\n}\n\n.sidebar {\n\twidth: 100%;\n}\n\n.main-container,\n.main-container {\n\twidth: 100%;\n}\n\n.card.script-action, .card.device-action {\n\tmax-width: 280px;\n\n\t.card-content {\n\t\tcursor: default;\n\n\t\ttransition-duration: .2s;\n\t\ttransition-property: color, opacity, background;\n\t}\n\n\t&:not(.card-success):not(.card-error):not(.card-danger) {\n\t\t&:hover {\n\t\t\tcolor: $color-black;\n\t\t\tbackground: $color-warning;\n\t\t}\n\t}\n\n\t.action-details-btn {\n color: $color-black;\n font-size: 34px;\n position: relative;\n right: -10px;\n\t}\n\n\t&.loading-state {\n\t\tposition: relative;\n\t\tborder-color: $color-warning;\n\n\t\t.device-icon-container {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tz-index: 1;\n\t\t\tdisplay: flex;\n\t flex-direction: row;\n \talign-items: center;\n\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tbackground: $color-warning;\n\n\t\t\t.device-icon {\n\t\t\t\tcolor: $color-black;\n\n\t\t\t\t.ph, .ph-bold {\n\t\t\t\t\ttransform-origin: 50% 50%;\n \t\t\t\tanimation: icon_spin 1.2s linear infinite;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.sidebar-container {\n\tmax-width: 260px;\n\twidth: 100%;\n}\n\n\n.tree {\n\t.branch {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tpadding-left: $space-10 + $space-5;\n\n\t\t.title {\n\t\t\tfont-size: $font-size-xl;\n\t\t}\n\n\t\t.branch-container {\n\t\t\tborder: 2px solid $color-primary;\n\t\t\tpadding: $space-3;\n\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: $space-3;\n\t\t\twidth: max-content;\n\t\t\tmargin-bottom: $space-6;\n\t\t}\n\t}\n\n\t& > .branch, & > .branch > .branch {\n\t\tpadding-left: 0;\n\t}\n}\n\n#area-devices-modal {\n\t.modal-body {\n\t\tposition: relative;\n\t\tmin-height: 300px;\n\n\t\t.loader {\n\t\t\tmargin: auto;\n\t\t\tposition: relative;\n\t\t\ttop: 120px;\n\t\t}\n\t}\n}\n\n.top-bar {\n\twidth: 100%;\n\n\t& > .row {\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t}\n}\n\n@import \"app/_hud.scss\";\n@import \"app/_load-screen.scss\";\n@import \"app/_error-screen.scss\";",".hud {\n\twidth: 100%;\n\tpadding: $space-5;\n\n\t& > .row {\n\t\tjustify-content: space-between;\n align-items: center;\n gap: $space-4;\n flex-wrap: wrap;\n\t}\n\n\t.hud-btns {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: $space-4;\n\t}\n\n\t.nav-toggle,\n\t.reload-screen {\n\t\tfont-size: 42px;\n\t\twidth: 50px;\n\t\theight: 50px;\n\t\tbackground: $color-text-light;\n\t\tcolor: $color-black;\n\t}\n\n\t.nav-toggle {\n\t\tposition: relative;\n\t\tz-index: 710;\n\n\t\t&.state-off {\n\t\t\t.icon-state-on {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t&.state-on {\n\t\t\t.icon-state-off {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t// &:hover {\n\t\t// \tcolor: $color-success;\n\t\t// }\n\t}\n\n\t.app-title {\n\t\tpadding: $space-2 $space-4;\n\t\ttext-transform: uppercase;\n\t}\n\n\t.navigation {\n\t\tposition: fixed;\n\t\tz-index: 700;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\t\n\t\tbackground: $color-black;\n\t\topacity: 0;\n\t\tvisibility: hidden;\n\n\t\ttransition-duration: .2s;\n\t\ttransition-property: visibility, opacity;\n\n\t\t.container {\n\t\t\twidth: 100%;\n\t\t\tmax-width: 600px;\n\t height: 100vh;\n\n\t\t\tmargin: auto;\n\t\t\tpadding: $space-3;\n\n \tdisplay: flex;\n \talign-items: center;\n\t\t}\n\n\t\t.nav-items {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tflex-wrap: wrap;\n\t\t\tgap: $space-10;\n \talign-items: center;\n \tjustify-content: space-between;\n\n \theight: max-content;\n \tmargin-top: 100px;\n\n \ttransition-duration: .2s;\n \ttransition-property: margin-top;\n\t\t}\n\n\t\t.nav-link {\n\t\t\ttext-decoration: none;\n\t\t\tcolor: $color-text-light;\n\t\t}\n\n\t\t.nav-item {\n\t\t\twidth: 160px;\n\t\t\tborder: 2px solid $color-text-light;\n\t\t\tpadding: $space-6;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: $space-3;\n\n\t\t\ttransition-property: color, background, border-color;\n\t\t\ttransition-duration: .2s;\n\n\t\t\t.nav-icon {\n\t\t\t\ttext-align: center;\n\n\t\t\t\t.ph, .ph-bold {\n\t\t\t\t\tfont-size: 64px;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.nav-text {\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: $font-size-lg;\n\t\t\t}\n\n\t\t\t&:hover {\n\t\t\t\tbackground: $color-success;\n\t\t\t\tborder-color: $color-success;\n\t\t\t\tcolor: $color-black;\n\t\t\t}\n\t\t}\n\n\t\t&.a-show {\n\t\t\tvisibility: visible;\n\t\t\topacity: 1;\n\n\t\t\t.nav-items {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t}\n\n\t\t&.a-hide {\n\t\t\t.nav-items {\n\t\t\t\tmargin-top: -100px;\n\t\t\t}\n\t\t}\n\t}\n}",".load-screen {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\n\tdisplay: flex;\n\tflex-direction: row;\n align-items: center;\n justify-content: center;\n\n\tvisibility: hidden;\n\topacity: 0;\n\tbackground: $color-black;\n\n\ttransition-duration: .2s;\n\ttransition-property: opacity, visibility;\n\n\t&.a-show {\n\t\tvisibility: visible;\n\t\topacity: 1;\n\t\tz-index: 900;\n\t\ttransition-duration: 0s;\n\t}\n}",".error-screen {\n display: none;\n\n .container {\n\t display: flex;\n\t align-items: center;\n\t flex-direction: column;\n\t justify-content: center;\n\t flex-wrap: nowrap;\n\t gap: $space-4;\n\t padding-top: 20%;\n\t max-width: 420px;\n\t width: 100%;\n\t margin: auto;\n }\n\n .icon-container {\n \tcolor: $color-error;\n\n \t.ph, .ph-bold {\n \t\tfont-size: 72px;\n \t}\n }\n\n .error-title {\n \tpadding: $space-2 $space-3;\n }\n\n .error-text {\n \tfont-size: $font-size-base;\n \ttext-align: center;\n }\n\n\t&.a-show {\n\t\tdisplay: block;\n\t}\n}"]} \ No newline at end of file diff --git a/webclient/dist/js/main.js b/webclient/dist/js/main.js index 7a957ed..50198d6 100644 --- a/webclient/dist/js/main.js +++ b/webclient/dist/js/main.js @@ -1,14 +1,14 @@ -(()=>{var ue=Object.defineProperty,pe=Object.defineProperties;var me=Object.getOwnPropertyDescriptors;var C=Object.getOwnPropertySymbols;var be=Object.prototype.hasOwnProperty,fe=Object.prototype.propertyIsEnumerable;var x=(a,e,t)=>e in a?ue(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,v=(a,e)=>{for(var t in e||(e={}))be.call(e,t)&&x(a,t,e[t]);if(C)for(var t of C(e))fe.call(e,t)&&x(a,t,e[t]);return a},j=(a,e)=>pe(a,me(e));var P=(a,e,t)=>new Promise((r,s)=>{var n=o=>{try{c(t.next(o))}catch(u){s(u)}},i=o=>{try{c(t.throw(o))}catch(u){s(u)}},c=o=>o.done?r(o.value):Promise.resolve(o.value).then(n,i);c((t=t.apply(a,e)).next())});var g,w,U;function he(){g.dataset.navState="displayed",g.classList.remove("state-off"),g.classList.add("state-on"),w.classList.add("a-show")}function k(){g.dataset.navState="hidden",g.classList.remove("state-on"),g.classList.add("state-off"),w.classList.add("a-hide"),w.classList.remove("a-show"),setTimeout(()=>{w.classList.remove("a-hide")},300)}function F(){console.log("HUD init"),g=document.querySelector(".hud .nav-toggle"),w=document.querySelector(".hud .navigation"),U=document.querySelector(".hud .reload-screen"),g.addEventListener("click",a=>{a.currentTarget.dataset.navState!="displayed"?he():k()}),U.addEventListener("click",a=>{Screens.reload()})}var T=class{constructor(e,t,r){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(r),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=v({route:e},t),this.routesMap[e]=t.alias}switch(e){var r;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(r=this.currentScreen)==null||r.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var r;(r=this.currentScreen)==null||r.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}runSwitchHandlers(e){for(let t of this.eventsHandlers.switch)t(this,e)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}};function ve(a,e,t,r){return` +(()=>{var ue=Object.defineProperty,pe=Object.defineProperties;var me=Object.getOwnPropertyDescriptors;var I=Object.getOwnPropertySymbols;var be=Object.prototype.hasOwnProperty,fe=Object.prototype.propertyIsEnumerable;var x=(a,e,t)=>e in a?ue(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,v=(a,e)=>{for(var t in e||(e={}))be.call(e,t)&&x(a,t,e[t]);if(I)for(var t of I(e))fe.call(e,t)&&x(a,t,e[t]);return a},j=(a,e)=>pe(a,me(e));var P=(a,e,t)=>new Promise((s,r)=>{var n=o=>{try{c(t.next(o))}catch(u){r(u)}},i=o=>{try{c(t.throw(o))}catch(u){r(u)}},c=o=>o.done?s(o.value):Promise.resolve(o.value).then(n,i);c((t=t.apply(a,e)).next())});var g,w,U;function he(){g.dataset.navState="displayed",g.classList.remove("state-off"),g.classList.add("state-on"),w.classList.add("a-show")}function k(){g.dataset.navState="hidden",g.classList.remove("state-on"),g.classList.add("state-off"),w.classList.add("a-hide"),w.classList.remove("a-show"),setTimeout(()=>{w.classList.remove("a-hide")},300)}function F(){console.log("HUD init"),g=document.querySelector(".hud .nav-toggle"),w=document.querySelector(".hud .navigation"),U=document.querySelector(".hud .reload-screen"),g.addEventListener("click",a=>{a.currentTarget.dataset.navState!="displayed"?he():k()}),U.addEventListener("click",a=>{Screens.reload()})}var $=class{constructor(e,t,s){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(s),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=v({route:e},t),this.routesMap[e]=t.alias}switch(e){var s;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(s=this.currentScreen)==null||s.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var s;(s=this.currentScreen)==null||s.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}runSwitchHandlers(e){for(let t of this.eventsHandlers.switch)t(this,e)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}};function ve(a,e,t,s){return` - `}function ge(a,e){if(e!=null&&e.alone&&document.querySelectorAll(".toast").forEach(t=>t.close()),a.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},a.querySelector(".toast-close").addEventListener("click",t=>{a.close()}),a.show=function(){document.querySelector("body").append(a),setTimeout(()=>{a.classList.add("a-show")},10)},Screens.onSwitch((t,r)=>{setTimeout(()=>{a==null||a.close()},1e4)}),a.addEventListener("mouseover",t=>a.ishovered=!0),a.addEventListener("mouseout",t=>a.ishovered=!1),e!=null&&e.lifetime){console.log(e);let t=setInterval(()=>{a.ishovered||(a.close(),clearInterval(t))},e==null?void 0:e.lifetime)}return a}function $(a,e,t,r,s){let n=document.createElement("div");return n.innerHTML=ve(a,e,t,r),ge(n.childNodes[1],s)}function Se(a,e,t){return typeof t=="undefined"&&(t={}),typeof t.lifetime=="undefined"&&(t.lifetime=4e3),typeof t.alone=="undefined"&&(t.alone=!0),$("success",'',a,e,t)}function ye(a,e,t){return $("info",'',a,e,t)}function _e(a,e,t){return $("warning",'',a,e,t)}function B(a,e,t){return $("danger",'',a,e,t)}var z={create:$,createInfo:ye,createSuccess:Se,createWarning:_e,createError:B,createDanger:B};function we(a){let e="";for(let t of a){let r="",s="";t.route&&(r=``,s=""),e+=` + `}function ge(a,e){if(e!=null&&e.alone&&document.querySelectorAll(".toast").forEach(t=>t.close()),a.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},a.querySelector(".toast-close").addEventListener("click",t=>{a.close()}),a.show=function(){document.querySelector("body").append(a),setTimeout(()=>{a.classList.add("a-show")},10)},Screens.onSwitch((t,s)=>{setTimeout(()=>{a==null||a.close()},1e4)}),a.addEventListener("mouseover",t=>a.ishovered=!0),a.addEventListener("mouseout",t=>a.ishovered=!1),e!=null&&e.lifetime){console.log(e);let t=setInterval(()=>{a.ishovered||(a.close(),clearInterval(t))},e==null?void 0:e.lifetime)}return a}function T(a,e,t,s,r){let n=document.createElement("div");return n.innerHTML=ve(a,e,t,s),ge(n.childNodes[1],r)}function Se(a,e,t){return typeof t=="undefined"&&(t={}),typeof t.lifetime=="undefined"&&(t.lifetime=4e3),typeof t.alone=="undefined"&&(t.alone=!0),T("success",'',a,e,t)}function ye(a,e,t){return T("info",'',a,e,t)}function _e(a,e,t){return T("warning",'',a,e,t)}function B(a,e,t){return T("danger",'',a,e,t)}var z={create:T,createInfo:ye,createSuccess:Se,createWarning:_e,createError:B,createDanger:B};function we(a){let e="";for(let t of a){let s="",r="";t.route&&(s=``,r=""),e+=`
  • - ${r}${t.content}${s} + ${s}${t.content}${r}
  • `}return` - `}function $e(a,e,t,r){let s='',n=0;for(let p in e)s+=`${e[p]}`,n++;s+="";let i="";for(let p of t){i+='';for(let m in e)i+=`${p[m]}`;i+=""}let c="";typeof r!="undefined"&&(c=` + `}function Te(a,e,t,s){let r='',n=0;for(let p in e)r+=`${e[p]}`,n++;r+="";let i="";for(let p of t){i+='';for(let m in e)i+=`${p[m]}`;i+=""}let c="";typeof s!="undefined"&&(c=` - ${r} + ${s} - `);let o=a?`${a}`:"",u=t.length?`${s}`:"";return i=t.length?i:'Empty',` + `);let o=a?`${a}`:"",u=t.length?`${r}`:"";return i=t.length?i:'Empty',` ${o} ${u} ${i} ${c}
    - `}function J(a,e,t){let r=document.createElement(a);for(let[s,n]of Object.entries(e))s==="class"?r.className=n:s==="dataset"?Object.assign(r.dataset,n):r.setAttribute(s,n);return r.innerHTML=typeof t!="undefined"?t:"",r}function Te(a,e){return["primary","success","secondary","info","warning","error","danger"].indexOf(a)<0?console.error("createAlert()","Error of type: "+a):J("div",{class:`alert alert-${a}`},e)}function Ee(a){let e={device_name:"name",device_hard_id:"device_id",device_ip:"ip",device_type:"type",ip_address:"ip",mac_address:"mac",device_mac:"mac",core_version:"firmware_core_version"},t={};for(let r in a){if(typeof e[r]!="undefined"){t[e[r]]=a[r];continue}t[r]=a[r]}return t}function Le(a,e){if((a==null?void 0:a.isLoading)==e)return!1;if(e)a.isLoading=!0,a.originalContent=a.innerHTML,a.classList.contains("with-icon")?a.originalWithIcon=!0:a.classList.add("with-icon"),a.classList.add("loading-state"),a.setAttribute("disabled","disabled"),a.innerHTML=' Loading';else{if(a.isLoading=!1,!a.originalContent)return!1;a.removeAttribute("disabled"),a.classList.remove("loading-state"),a.originalWithIcon||a.classList.remove("with-icon"),a.innerHTML=a.originalContent}return a}function He(a,e){if((a==null?void 0:a.isLoading)==e)return!1;let t=a.querySelector(".device-icon");if(e)a.isLoading=!0,a.originalContent=t.innerHTML,a.classList.add("loading-state"),a.setAttribute("disabled","disabled"),t.innerHTML='';else{if(a.isLoading=!1,!a.originalContent)return!1;a.removeAttribute("disabled"),a.classList.remove("loading-state"),t.innerHTML=a.originalContent}return a}function Ae(a,e){return e=e!=null?e:"",` + `}function J(a,e,t){let s=document.createElement(a);for(let[r,n]of Object.entries(e))r==="class"?s.className=n:r==="dataset"?Object.assign(s.dataset,n):s.setAttribute(r,n);return s.innerHTML=typeof t!="undefined"?t:"",s}function $e(a,e){return["primary","success","secondary","info","warning","error","danger"].indexOf(a)<0?console.error("createAlert()","Error of type: "+a):J("div",{class:`alert alert-${a}`},e)}function Ee(a){let e={device_name:"name",device_hard_id:"device_id",device_ip:"ip",device_type:"type",ip_address:"ip",mac_address:"mac",device_mac:"mac",core_version:"firmware_core_version"},t={};for(let s in a){if(typeof e[s]!="undefined"){t[e[s]]=a[s];continue}t[s]=a[s]}return t}function Le(a,e){if((a==null?void 0:a.isLoading)==e)return!1;if(e)a.isLoading=!0,a.originalContent=a.innerHTML,a.classList.contains("with-icon")?a.originalWithIcon=!0:a.classList.add("with-icon"),a.classList.add("loading-state"),a.setAttribute("disabled","disabled"),a.innerHTML=' Loading';else{if(a.isLoading=!1,!a.originalContent)return!1;a.removeAttribute("disabled"),a.classList.remove("loading-state"),a.originalWithIcon||a.classList.remove("with-icon"),a.innerHTML=a.originalContent}return a}function He(a,e){if((a==null?void 0:a.isLoading)==e)return!1;let t=a.querySelector(".device-icon");if(e)a.isLoading=!0,a.originalContent=t.innerHTML,a.classList.add("loading-state"),a.setAttribute("disabled","disabled"),t.innerHTML='';else{if(a.isLoading=!1,!a.originalContent)return!1;a.removeAttribute("disabled"),a.classList.remove("loading-state"),t.innerHTML=a.originalContent}return a}function Ae(a,e){return e=e!=null?e:"",`
    - `}function De(a){return a=="active"?'Online':'Offline'}function Me(a){return a=="enabled"?'Enabled':'Disabled'}var W={template:{sidebarNav:we,table:$e,createElement:J,createAlert:Te,mainTemplate:Ae,connectionStatusBadge:De,toogleStateBadge:Me},unification:{deviceFieldsUnification:Ee},states:{btnLoadingState:Le,cardScriptActionLoadingState:He}};var E=class{constructor(e){this.core=e}actions_list(e){return this.core.api_get("/api/v1/scripts/actions/list",e)}scopes_list(e){return this.core.api_get("/api/v1/scripts/scopes/list",e)}regular_list(e){return this.core.api_get("/api/v1/scripts/regular/list",e)}scope_get_by_filename(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${r}`,t,{})}scope_create(e,t){return this.core.api_post("/api/v1/scripts/scopes/new",e,t)}scope_update(e,t){return this.core.api_post("/api/v1/scripts/scopes/update",e,t)}action_enable(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${r}/enable`,t)}action_disable(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${r}/disable`,t)}regular_enable(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${r}/enable`,t)}regular_disable(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${r}/disable`,t)}scope_enable(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${r}/enable`,t)}scope_disable(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${r}/disable`,t)}scope_remove(e,t){let r=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${r}/remove`,t)}run(e,t){return this.core.api_post("/api/v1/scripts/actions/run",e,t)}};var L=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/devices/list",e)}scanning_setup(e){return this.core.api_get("/api/v1/devices/scanning/setup",e)}scanning_all(e){return this.core.api_get("/api/v1/devices/scanning/all",e)}setup_new_device(e,t){return this.core.api_post("/api/v1/devices/setup/new-device",e,t)}info(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${r}/info`,t)}get(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${r}`,t)}status(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${r}/status`,t)}action(e,t){return this.core.api_post("/api/v1/devices/action",e,t)}remove(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${r}/remove`,t)}reboot(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${r}/reboot`,t)}};var H=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/areas/list",e)}inner_list(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${r}/list`,t)}new_area(e,t){return this.core.api_post("/api/v1/areas/new-area",e,t)}remove(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${r}/remove`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/areas/place-in-area",e,t)}update_display_name(e,t){return this.core.api_post("/api/v1/areas/update-display-name",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/areas/update-alias",e,t)}devices(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${r}/devices`,t)}unassign_from_area(e,t){let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${r}/unassign-from-area`,t)}types_list(e){return this.core.api_get("/api/v1/areas/types/list",e)}reboot_devices(e,t){if(e==null)return this.core.api_get("/api/v1/areas/reboot_devices",t);let r=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${r}/reboot_devices`,t)}};function Y(a){if(!a||typeof a!="object")return"";let e=new URLSearchParams;Object.entries(a).forEach(([r,s])=>{s!=null&&e.append(r,String(s))});let t=e.toString();return t?`?${t}`:""}function Oe(a,e){let t=String(a||"").replace(/\/+$/,""),r=String(e||"").replace(/^\/+/,"");return`${t}/${r}`}function Re(a){try{return{ok:!0,data:JSON.parse(a)}}catch(e){return{ok:!1,error:e}}}var A=class{constructor(e){this.base_url=(e==null?void 0:e.base_url)||"",this.token=(e==null?void 0:e.token)||"",this.timeout_ms=Number.isFinite(e==null?void 0:e.timeout_ms)?e.timeout_ms:15e3,this.default_headers=(e==null?void 0:e.default_headers)||{},this.on_unauthorized=typeof(e==null?void 0:e.on_unauthorized)=="function"?e.on_unauthorized:null,this.proxy_path=(e==null?void 0:e.proxy_path)||"",this.scripts=new E(this),this.devices=new L(this),this.areas=new H(this)}set_base_url(e){this.base_url=e||""}set_token(e){this.token=e||""}set_proxy_path(e){this.proxy_path=e||""}_wrap_path(e,t){if(!this.proxy_path)return t?`${e}${Y(t)}`:e;let r=v({path:e},t||{});return`${this.proxy_path}${Y(r)}`}request(e,t,r,s,n){let i=typeof s=="function"?s:()=>{},c=Oe(this.base_url,t),o=new AbortController,u=Number.isFinite(n==null?void 0:n.timeout_ms)?n.timeout_ms:this.timeout_ms,l=setTimeout(()=>o.abort(),u),p=v(v({},this.default_headers),(n==null?void 0:n.headers)||{});this.token&&(p.Authorization=`Bearer ${this.token}`);let m;r!=null&&(p["Content-Type"]="application/json",m=JSON.stringify(r)),fetch(c,{method:e,headers:p,body:m,signal:o.signal}).then(d=>P(this,null,function*(){clearTimeout(l);let f={url:c,method:e,status_code:d.status,headers:d.headers},b=yield d.text(),R=Re(b),h=R.ok?R.data:b;if(!d.ok){let _={type:"http_error",message:`HTTP ${d.status}`,status_code:d.status,raw:h};if((d.status===401||d.status===403)&&this.on_unauthorized)try{this.on_unauthorized({error:_,meta:f})}catch(I){}return i(_,null,f)}if(R.ok&&h&&typeof h=="object"){let _=h.status;if(_===!1||_==="error"){let I={type:"api_error",message:h.message||"API error",status_code:d.status,raw:h,field:h.field};return i(I,null,f)}}return i(null,h,f)})).catch(d=>{clearTimeout(l);let b=d&&(d.name==="AbortError"||String(d).includes("AbortError"))?{type:"timeout",message:`Timeout after ${u}ms`}:{type:"network_error",message:(d==null?void 0:d.message)||"Network error",details:d};return i(b,null,{url:c,method:e,status_code:0,headers:null})})}get(e,t,r){return this.request("GET",e,null,t,r)}post(e,t,r,s){return this.request("POST",e,t,r,s)}api_get(e,t,r,s){return this.get(this._wrap_path(e,r),t,s)}api_post(e,t,r,s,n){return this.post(this._wrap_path(e,s),t,r,n)}};function D(a){return Helper.template.sidebarNav([{content:' Devices',route:"/#!/devices",is_active:a=="devices"},{content:' Scanning',route:"/#!/devices/scanning",is_active:a=="scanning"},{content:' Actions',route:"/#!/devices/actions",is_active:a=="actions"}])}function S(a,e,t){Helper.states.btnLoadingState(e,!0);let r=e.dataset.deviceId,s=e.dataset.deviceName,n=e.dataset.deviceAlias;a.devices.reboot(r,(i,c,o)=>{Helper.states.btnLoadingState(e,!1),console.log("Reboot done",i,c,o),t==null||t.close(),c?(setTimeout(()=>Screens.reinit(),8e3),Toasts.createSuccess("Reboot successful",`Device: ${s}
    - Alias: ${n}`).show()):Toasts.createError("Reboot failed",`Device: ${s}
    - Alias: ${n}`).show()})}function G(a,e){return console.log(a),Modals.create("device-popup",{title:`Device ${a.name}`,body:t=>{let r="";for(let s in a)r+=` + `}function De(a){return a=="active"?'Online':'Offline'}function Me(a){return a=="enabled"?'Enabled':'Disabled'}var W={template:{sidebarNav:we,table:Te,createElement:J,createAlert:$e,mainTemplate:Ae,connectionStatusBadge:De,toogleStateBadge:Me},unification:{deviceFieldsUnification:Ee},states:{btnLoadingState:Le,cardScriptActionLoadingState:He}};var E=class{constructor(e){this.core=e}actions_list(e){return this.core.api_get("/api/v1/scripts/actions/list",e)}scopes_list(e){return this.core.api_get("/api/v1/scripts/scopes/list",e)}regular_list(e){return this.core.api_get("/api/v1/scripts/regular/list",e)}scope_get_by_filename(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}`,t,{})}scope_create(e,t){return this.core.api_post("/api/v1/scripts/scopes/new",e,t)}scope_update(e,t){return this.core.api_post("/api/v1/scripts/scopes/update",e,t)}action_enable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${s}/enable`,t)}action_disable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${s}/disable`,t)}regular_enable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${s}/enable`,t)}regular_disable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${s}/disable`,t)}scope_enable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}/enable`,t)}scope_disable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}/disable`,t)}scope_remove(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}/remove`,t)}run(e,t){return this.core.api_post("/api/v1/scripts/actions/run",e,t)}};var L=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/devices/list",e)}scanning_setup(e){return this.core.api_get("/api/v1/devices/scanning/setup",e)}scanning_all(e){return this.core.api_get("/api/v1/devices/scanning/all",e)}setup_new_device(e,t){return this.core.api_post("/api/v1/devices/setup/new-device",e,t)}info(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/info`,t)}get(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}`,t)}status(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/status`,t)}action(e,t){return this.core.api_post("/api/v1/devices/action",e,t)}remove(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/remove`,t)}reboot(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/reboot`,t)}};var H=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/areas/list",e)}inner_list(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/list`,t)}new_area(e,t){return this.core.api_post("/api/v1/areas/new-area",e,t)}remove(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/remove`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/areas/place-in-area",e,t)}update_display_name(e,t){return this.core.api_post("/api/v1/areas/update-display-name",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/areas/update-alias",e,t)}devices(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/devices`,t)}unassign_from_area(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/unassign-from-area`,t)}types_list(e){return this.core.api_get("/api/v1/areas/types/list",e)}reboot_devices(e,t){if(e==null)return this.core.api_get("/api/v1/areas/reboot_devices",t);let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/reboot_devices`,t)}};function Y(a){if(!a||typeof a!="object")return"";let e=new URLSearchParams;Object.entries(a).forEach(([s,r])=>{r!=null&&e.append(s,String(r))});let t=e.toString();return t?`?${t}`:""}function Oe(a,e){let t=String(a||"").replace(/\/+$/,""),s=String(e||"").replace(/^\/+/,"");return`${t}/${s}`}function Re(a){try{return{ok:!0,data:JSON.parse(a)}}catch(e){return{ok:!1,error:e}}}var A=class{constructor(e){this.base_url=(e==null?void 0:e.base_url)||"",this.token=(e==null?void 0:e.token)||"",this.timeout_ms=Number.isFinite(e==null?void 0:e.timeout_ms)?e.timeout_ms:15e3,this.default_headers=(e==null?void 0:e.default_headers)||{},this.on_unauthorized=typeof(e==null?void 0:e.on_unauthorized)=="function"?e.on_unauthorized:null,this.proxy_path=(e==null?void 0:e.proxy_path)||"",this.scripts=new E(this),this.devices=new L(this),this.areas=new H(this)}set_base_url(e){this.base_url=e||""}set_token(e){this.token=e||""}set_proxy_path(e){this.proxy_path=e||""}_wrap_path(e,t){if(!this.proxy_path)return t?`${e}${Y(t)}`:e;let s=v({path:e},t||{});return`${this.proxy_path}${Y(s)}`}request(e,t,s,r,n){let i=typeof r=="function"?r:()=>{},c=Oe(this.base_url,t),o=new AbortController,u=Number.isFinite(n==null?void 0:n.timeout_ms)?n.timeout_ms:this.timeout_ms,l=setTimeout(()=>o.abort(),u),p=v(v({},this.default_headers),(n==null?void 0:n.headers)||{});this.token&&(p.Authorization=`Bearer ${this.token}`);let m;s!=null&&(p["Content-Type"]="application/json",m=JSON.stringify(s)),fetch(c,{method:e,headers:p,body:m,signal:o.signal}).then(d=>P(this,null,function*(){clearTimeout(l);let f={url:c,method:e,status_code:d.status,headers:d.headers},b=yield d.text(),R=Re(b),h=R.ok?R.data:b;if(!d.ok){let _={type:"http_error",message:`HTTP ${d.status}`,status_code:d.status,raw:h};if((d.status===401||d.status===403)&&this.on_unauthorized)try{this.on_unauthorized({error:_,meta:f})}catch(C){}return i(_,null,f)}if(R.ok&&h&&typeof h=="object"){let _=h.status;if(_===!1||_==="error"){let C={type:"api_error",message:h.message||"API error",status_code:d.status,raw:h,field:h.field};return i(C,null,f)}}return i(null,h,f)})).catch(d=>{clearTimeout(l);let b=d&&(d.name==="AbortError"||String(d).includes("AbortError"))?{type:"timeout",message:`Timeout after ${u}ms`}:{type:"network_error",message:(d==null?void 0:d.message)||"Network error",details:d};return i(b,null,{url:c,method:e,status_code:0,headers:null})})}get(e,t,s){return this.request("GET",e,null,t,s)}post(e,t,s,r){return this.request("POST",e,t,s,r)}api_get(e,t,s,r){return this.get(this._wrap_path(e,s),t,r)}api_post(e,t,s,r,n){return this.post(this._wrap_path(e,r),t,s,n)}};function D(a){return Helper.template.sidebarNav([{content:' Devices',route:"/#!/devices",is_active:a=="devices"},{content:' Scanning',route:"/#!/devices/scanning",is_active:a=="scanning"},{content:' Actions',route:"/#!/devices/actions",is_active:a=="actions"}])}function S(a,e,t){Helper.states.btnLoadingState(e,!0);let s=e.dataset.deviceId,r=e.dataset.deviceName,n=e.dataset.deviceAlias;a.devices.reboot(s,(i,c,o)=>{Helper.states.btnLoadingState(e,!1),console.log("Reboot done",i,c,o),t==null||t.close(),c?(setTimeout(()=>Screens.reinit(),8e3),Toasts.createSuccess("Reboot successful",`Device: ${r}
    + Alias: ${n}`).show()):Toasts.createError("Reboot failed",`Device: ${r}
    + Alias: ${n}`).show()})}function G(a,e){return console.log(a),Modals.create("device-popup",{title:`Device ${a.name}`,body:t=>{let s="";for(let r in a)s+=` - ${s}: - ${a[s]} + ${r}: + ${a[r]} `;return`
    - ${r} + ${s}
    - `},actions:t=>{let r=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-warning with-icon"},' Reboot'),n=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},' Remove');return r.addEventListener("click",i=>{t.close()}),s.dataset.deviceId=a.id,s.dataset.deviceName=a.name,s.dataset.deviceAlias=a.alias,s.addEventListener("click",i=>{s.getAttribute("disabled")||S(e,i.currentTarget,t)}),n.addEventListener("click",i=>{n.getAttribute("disabled")||(Helper.states.btnLoadingState(n,!0),confirmPopup("Are you sure you want to remove this device?",()=>{e.devices.remove(a.id,(c,o,u)=>{Helper.states.btnLoadingState(n,!1),console.log("Was removed"),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",` + `},actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),r=Helper.template.createElement("button",{class:"btn btn-warning with-icon"},' Reboot'),n=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},' Remove');return s.addEventListener("click",i=>{t.close()}),r.dataset.deviceId=a.id,r.dataset.deviceName=a.name,r.dataset.deviceAlias=a.alias,r.addEventListener("click",i=>{r.getAttribute("disabled")||S(e,i.currentTarget,t)}),n.addEventListener("click",i=>{n.getAttribute("disabled")||(Helper.states.btnLoadingState(n,!0),confirmPopup("Are you sure you want to remove this device?",()=>{e.devices.remove(a.id,(c,o,u)=>{Helper.states.btnLoadingState(n,!1),console.log("Was removed"),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",` Device: ${a.name}
    Alias: ${a.alias}
    IP: ${a.ip} - `).show()},300)})},()=>{Helper.states.btnLoadingState(n,!1),console.log("CANCELED")}))}),[r,s,n]}})}function ke(a){let e=[];for(let t of a.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceName:t.name,alias:t.alias,status:Helper.template.connectionStatusBadge(t.connection_state),ip:`${t.ip}`,actions:` + `).show()},300)})},()=>{Helper.states.btnLoadingState(n,!1),console.log("CANCELED")}))}),[s,r,n]}})}function ke(a){let e=[];for(let t of a.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceName:t.name,alias:t.alias,status:Helper.template.connectionStatusBadge(t.connection_state),ip:`${t.ip}`,actions:` - `});return e}function qe(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",alias:"Device alias",status:"Status",ip:"IP",actions:"Actions"},e,`Total: ${t} devices`)}function Ne(a,e){a.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",r=>{r.currentTarget.getAttribute("disabled")||S(e,r.currentTarget)})}),a.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",r=>{let s=JSON.parse(r.currentTarget.dataset.device);G(s,e).show()})})}function K(a){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(D("devices")),initer:e=>{a.devices.list((t,r,s)=>{if(console.log("sh_api.devices.list",t,r,s),s.status_code!=200)return e.error("Server API ERROR","");qe(e,ke(r.data),r.data.total),Ne(e,a),e.ready()})}}}function Q(a,e){return a=Helper.unification.deviceFieldsUnification(a),Modals.create("device-setup",{title:`Setup new device ${a.ip}`,body:t=>{let r="";for(let n in a)n[0]!="_"&&(r+=` + `});return e}function qe(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",alias:"Device alias",status:"Status",ip:"IP",actions:"Actions"},e,`Total: ${t} devices`)}function Ne(a,e){a.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",s=>{s.currentTarget.getAttribute("disabled")||S(e,s.currentTarget)})}),a.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",s=>{let r=JSON.parse(s.currentTarget.dataset.device);G(r,e).show()})})}function K(a){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(D("devices")),initer:e=>{a.devices.list((t,s,r)=>{if(console.log("sh_api.devices.list",t,s,r),r.status_code!=200)return e.error("Server API ERROR","");qe(e,ke(s.data),s.data.total),Ne(e,a),e.ready()})}}}function Q(a,e){return a=Helper.unification.deviceFieldsUnification(a),Modals.create("device-setup",{title:`Setup new device ${a.ip}`,body:t=>{let s="";for(let n in a)n[0]!="_"&&(s+=` ${n}: ${a[n]} @@ -87,7 +87,7 @@
    - ${r} + ${s}
    @@ -122,13 +122,13 @@
    - `},actions:t=>{let r=Helper.template.createElement("button",{class:"btn btn-primary"},"Cancel");r.addEventListener("click",n=>{t.close()});let s=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Setup');return s.addEventListener("click",n=>{if(n.currentTarget.getAttribute("disabled"))return!1;let i={device_ip:a.ip},c=document.querySelector("#device-setup .setup-form");if(c.querySelectorAll("input[type='text']").forEach(l=>{l.dispatchEvent(new Event("input",{bubbles:!0}))}),c.querySelectorAll(".label.error").length)return!1;let o=c.querySelectorAll("input"),u=c.querySelector("textarea");for(let l of o)i[l.getAttribute("name")]=l.value;i[u.getAttribute("name")]=u.value,Helper.states.btnLoadingState(s,!0),e.devices.setup_new_device(i,(l,p,m)=>{var d,f;if(Helper.states.btnLoadingState(s,!1),(l==null?void 0:l.type)=="api_error"){if(console.error("ERR! sh_api.devices.setup_new_device",l.raw),(d=l.raw)!=null&&d.failed_fields)for(let b of l.raw.failed_fields)t.querySelector(`[name="${b}"]`).parentNode.classList.add("error");if((f=l.raw)!=null&&f.msg){let b=t.querySelector(".setup-form .alert-container");b.innerHTML="",b==null||b.append(Helper.template.createAlert("error",l.raw.msg))}return!1}if(!p)return!1;o.forEach(b=>b.value=""),u.value="",t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Setup successful",`Added new device ID ${a.device_id}`).show()},300)})}),[r,s]},onready:t=>{t.querySelector(".setup-form").querySelectorAll("input").forEach(s=>{s.addEventListener("input",n=>{var i;n.currentTarget.value.length?(n.currentTarget.parentNode.classList.remove("error"),(i=n.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||i.remove()):(n.currentTarget.parentNode.classList.add("error"),n.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||n.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})})}})}function Ie(a){let e=[];for(let t of a.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceId:t.device_id,deviceName:t.name,deviceType:t.type,status:`${t.status}`,ip:`${t.ip}`,mac:`${t.mac}`,wifiSignal:t.wifi_signal,actions:t.status=="setup"?` + `},actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Cancel");s.addEventListener("click",n=>{t.close()});let r=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Setup');return r.addEventListener("click",n=>{if(n.currentTarget.getAttribute("disabled"))return!1;let i={device_ip:a.ip},c=document.querySelector("#device-setup .setup-form");if(c.querySelectorAll("input[type='text']").forEach(l=>{l.dispatchEvent(new Event("input",{bubbles:!0}))}),c.querySelectorAll(".label.error").length)return!1;let o=c.querySelectorAll("input"),u=c.querySelector("textarea");for(let l of o)i[l.getAttribute("name")]=l.value;i[u.getAttribute("name")]=u.value,Helper.states.btnLoadingState(r,!0),e.devices.setup_new_device(i,(l,p,m)=>{var d,f;if(Helper.states.btnLoadingState(r,!1),(l==null?void 0:l.type)=="api_error"){if(console.error("ERR! sh_api.devices.setup_new_device",l.raw),(d=l.raw)!=null&&d.failed_fields)for(let b of l.raw.failed_fields)t.querySelector(`[name="${b}"]`).parentNode.classList.add("error");if((f=l.raw)!=null&&f.msg){let b=t.querySelector(".setup-form .alert-container");b.innerHTML="",b==null||b.append(Helper.template.createAlert("error",l.raw.msg))}return!1}if(!p)return!1;o.forEach(b=>b.value=""),u.value="",t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Setup successful",`Added new device ID ${a.device_id}`).show()},300)})}),[s,r]},onready:t=>{t.querySelector(".setup-form").querySelectorAll("input").forEach(r=>{r.addEventListener("input",n=>{var i;n.currentTarget.value.length?(n.currentTarget.parentNode.classList.remove("error"),(i=n.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||i.remove()):(n.currentTarget.parentNode.classList.add("error"),n.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||n.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})})}})}function Ce(a){let e=[];for(let t of a.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceId:t.device_id,deviceName:t.name,deviceType:t.type,status:`${t.status}`,ip:`${t.ip}`,mac:`${t.mac}`,wifiSignal:t.wifi_signal,actions:t.status=="setup"?` - `:""});return e}function Ce(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Found devices",{deviceId:"Device ID",deviceName:"Device name",deviceType:"Type",status:"Status",ip:"IP",mac:"Mac",wifiSignal:"Signal",actions:"Actions"},e,`Total: ${t} devices`)}function xe(a,e){a.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",r=>{let s=JSON.parse(r.currentTarget.dataset.device);Q(s,e).show()})})}function V(a){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(D("scanning")),initer:e=>{a.devices.scanning_all((t,r,s)=>{if(console.log("sh_api.devices.scanning_all",t,r),s.status_code!=200)return e.error("Server API ERROR","");Ce(e,Ie(r.data),r.data.devices.length),xe(e,a),e.ready()})}}}var q={list:K,scanning:V};function y(a){return Helper.template.sidebarNav([{content:' Scopes',route:"/#!/scripts/scopes",is_active:a=="scopes"},{content:' Actions',route:"/#!/scripts/actions",is_active:a=="actions"},{content:' Regular',route:"/#!/scripts/regular",is_active:a=="regular"}])}function M(a,e,t){a.scripts.run({alias:e,params:{}},(r,s,n)=>{s?(t(!0),setTimeout(()=>Screens.reinit(),1e3),setTimeout(()=>Toasts.createSuccess(`${e} running`,`${e} running success`).show(),300)):(t(!1),setTimeout(()=>Toasts.createError(`${e} failed`,`${e} running failed`).show(),300))})}function je(a){let e=[];for(let t of a.scopes){let r=t.state=="disabled"?``;e.push({name:t.name,filename:`${t.filename}
    ${t.path}`,state:Helper.template.toogleStateBadge(t.state),actions:` - ${r} - `})}return e}function Pe(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Scopes list",{name:"Scope name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scopes`)}function Ue(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",r=>{let s=r.currentTarget;if(s.getAttribute("disabled"))return;let n=s.dataset.value=="enable"?"scope_enable":"scope_disable",i=JSON.parse(s.dataset.scope);Helper.states.btnLoadingState(s,!0),e.scripts[n](i.name,(c,o,u)=>{Helper.states.btnLoadingState(s,!1),o?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${i.name} was changed`).show()):Toasts.createError("Request failed","Scope state not changed").show()})})})}function X(a){return{title:"Scripts Scopes",alias:"scripts-scopes",renderer:()=>Helper.template.mainTemplate(y("scopes")),initer:e=>{a.scripts.scopes_list((t,r,s)=>{if(console.log("sh_api.scripts.scopes_list",t,r,s),s.status_code!=200)return e.error("Server API ERROR","");Pe(e,je(r.data),r.data.total),Ue(e,a),e.ready()})}}}function Fe(a){let e=[];for(let t of a.scripts){let r=t.state=="disabled"?``;e.push({alias:`${t.alias}
    by ${t.created_by}`,name:`${t.name}
    ${t.description}
    `,filename:`${t.filename}
    ${t.path}`,state:Helper.template.toogleStateBadge(t.state),actions:` - ${r} - `})}return e}function Be(a,e,t){let r={};for(let s in e)r[e[s].alias]=e[s],e[s].code="";a.currentScreen.DOMObject.provideSciptsData=r,a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scripts`)}function ze(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",r=>{var c;let s=r.currentTarget;if(s.getAttribute("disabled"))return;let n=s.dataset.value=="enable"?"regular_enable":"regular_disable",i=(c=a.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?c:{};Helper.states.btnLoadingState(s,!0),e.scripts[n](i.alias,(o,u,l)=>{Helper.states.btnLoadingState(s,!1),u?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${i.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Z(a){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate(y("regular")),initer:e=>{a.scripts.regular_list((t,r,s)=>{if(console.log("sh_api.scripts.regular_list",t,r,s),s.status_code!=200)return e.error("Server API ERROR","");Be(e,Fe(r.data),r.data.total),ze(e,a),e.ready()})}}}function ee(a,e){return console.log("actionDetailsPopup",a),Modals.create("action-script-popup",{title:`${a.name}`,body:t=>` + ${s} + `})}return e}function Be(a,e,t){let s={};for(let r in e)s[e[r].alias]=e[r],e[r].code="";a.currentScreen.DOMObject.provideSciptsData=s,a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scripts`)}function ze(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",s=>{var c;let r=s.currentTarget;if(r.getAttribute("disabled"))return;let n=r.dataset.value=="enable"?"regular_enable":"regular_disable",i=(c=a.currentScreen.DOMObject.provideSciptsData[r.dataset.alias])!=null?c:{};Helper.states.btnLoadingState(r,!0),e.scripts[n](i.alias,(o,u,l)=>{Helper.states.btnLoadingState(r,!1),u?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${i.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Z(a){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate(y("regular")),initer:e=>{a.scripts.regular_list((t,s,r)=>{if(console.log("sh_api.scripts.regular_list",t,s,r),r.status_code!=200)return e.error("Server API ERROR","");Be(e,Fe(s.data),s.data.total),ze(e,a),e.ready()})}}}function ee(a,e){return console.log("actionDetailsPopup",a),Modals.create("action-script-popup",{title:`${a.name}`,body:t=>`
    @@ -169,7 +169,7 @@
    - `,actions:t=>{let r=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:a.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":a.state=="enabled"?"disable":"enable"},a.state=="enabled"?"Disable":"Enable"),n=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},' Run');return r.addEventListener("click",i=>{t.close()}),s.addEventListener("click",i=>{let c=i.currentTarget;if(c.getAttribute("disabled"))return;let o=c.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(c,!0),e.scripts[o](a.alias,(u,l,p)=>{Helper.states.btnLoadingState(c,!1),t.close(),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${a.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),n.addEventListener("click",i=>{let c=i.currentTarget;Helper.states.btnLoadingState(c,!0),M(e,a.alias,o=>{Helper.states.btnLoadingState(c,!1),o&&t.close()})}),[r,s,n]},onready:t=>{hljs.highlightElement(t.querySelector(".code-viewer"))}})}function Je(a){var t;let e=[];for(let r of a.scripts)e.push({alias:r.alias,author:r.created_by,name:r.name,icon:(t=r.icon)!=null?t:'',description:r.description,filename:`${r.filename}
    ${r.path}`,state:r.state,code:r.code});return e}function We(a,e,t){let r='
    ',s={};for(let i of e){s[i.alias]=i;let c=i.state=="enabled"?"primary":"warning";r+=` + `,actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),r=Helper.template.createElement("button",{class:a.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":a.state=="enabled"?"disable":"enable"},a.state=="enabled"?"Disable":"Enable"),n=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},' Run');return s.addEventListener("click",i=>{t.close()}),r.addEventListener("click",i=>{let c=i.currentTarget;if(c.getAttribute("disabled"))return;let o=c.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(c,!0),e.scripts[o](a.alias,(u,l,p)=>{Helper.states.btnLoadingState(c,!1),t.close(),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${a.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),n.addEventListener("click",i=>{let c=i.currentTarget;Helper.states.btnLoadingState(c,!0),M(e,a.alias,o=>{Helper.states.btnLoadingState(c,!1),o&&t.close()})}),[s,r,n]},onready:t=>{hljs.highlightElement(t.querySelector(".code-viewer"))}})}function Je(a){var t;let e=[];for(let s of a.scripts)e.push({alias:s.alias,author:s.created_by,name:s.name,icon:(t=s.icon)!=null?t:'',description:s.description,filename:`${s.filename}
    ${s.path}`,state:s.state,code:s.code});return e}function We(a,e,t){let s='
    ',r={};for(let i of e){r[i.alias]=i;let c=i.state=="enabled"?"primary":"warning";s+=`
    ${i.description}
    - `}r+="";let n=a.currentScreen.DOMObject.querySelector(".main-container");n.innerHTML=r,a.currentScreen.DOMObject.provideSciptsData=s}function Ye(a,e){a.currentScreen.DOMObject.querySelectorAll(".script-action .card-content").forEach(t=>{t.addEventListener("click",r=>{let s=r.currentTarget.parentNode;if(s.getAttribute("disabled"))return;Helper.states.cardScriptActionLoadingState(s,!0);let n=s.dataset.alias;M(e,n,i=>{Helper.states.cardScriptActionLoadingState(s,!1),i&&(s.classList.add("card-success"),setTimeout(()=>s.classList.remove("card-success"),1e3))})})}),a.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",r=>{var i;let s=r.currentTarget,n=(i=a.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?i:{};console.log("SCRIPT",n),ee(n,e).show()})})}function te(a){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate(y("actions")),initer:e=>{a.scripts.actions_list((t,r,s)=>{if(console.log("sh_api.scripts.regular_list",t,r,s),s.status_code!=200)return e.error("Server API ERROR","");We(e,Je(r.data),r.data.total),Ye(e,a),e.ready()})}}}var O={scopes:X,regular:Z,actions:te};function ae(a){return Helper.template.sidebarNav([{content:' Areas Tree',route:"/#!/areas/tree",is_active:a=="areas-tree"},{content:' Actions',route:"/#!/scripts/actions",is_active:a=="actions"}])}function re(a,e){return console.log("areaDevicesModal",a),Modals.create("area-devices-modal",{title:` ${a.name}`,body:t=>` + `}s+="";let n=a.currentScreen.DOMObject.querySelector(".main-container");n.innerHTML=s,a.currentScreen.DOMObject.provideSciptsData=r}function Ye(a,e){a.currentScreen.DOMObject.querySelectorAll(".script-action .card-content").forEach(t=>{t.addEventListener("click",s=>{let r=s.currentTarget.parentNode;if(r.getAttribute("disabled"))return;Helper.states.cardScriptActionLoadingState(r,!0);let n=r.dataset.alias;M(e,n,i=>{Helper.states.cardScriptActionLoadingState(r,!1),i&&(r.classList.add("card-success"),setTimeout(()=>r.classList.remove("card-success"),1e3))})})}),a.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",s=>{var i;let r=s.currentTarget,n=(i=a.currentScreen.DOMObject.provideSciptsData[r.dataset.alias])!=null?i:{};console.log("SCRIPT",n),ee(n,e).show()})})}function te(a){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate(y("actions")),initer:e=>{a.scripts.actions_list((t,s,r)=>{if(console.log("sh_api.scripts.regular_list",t,s,r),r.status_code!=200)return e.error("Server API ERROR","");We(e,Je(s.data),s.data.total),Ye(e,a),e.ready()})}}}var O={scopes:X,regular:Z,actions:te};function ae(a){return Helper.template.sidebarNav([{content:' Areas Tree',route:"/#!/areas/tree",is_active:a=="areas-tree"},{content:' Actions',route:"/#!/scripts/actions",is_active:a=="actions"}])}function se(a,e){return console.log("areaDevicesModal",a),Modals.create("area-devices-modal",{title:` ${a.display_name}`,body:t=>`
    - `,actions:t=>{let r=Helper.template.createElement("button",{class:"btn btn-primary"},"Close");return r.addEventListener("click",s=>{t.close()}),[r]},onready:t=>{let r=t.querySelector(".devices-container"),s=t.querySelector(".loader");e.areas.devices(a.id,(n,i,c)=>{console.log("sh_api.areas.devices",i);function o(l){if(!l)return[];let p=[];for(let m of l.devices)m=Helper.unification.deviceFieldsUnification(m),p.push({deviceName:m.name,alias:m.alias,status:Helper.template.connectionStatusBadge(m.connection_state),ip:`${m.ip}`,actions:` + `,actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),r=Helper.template.createElement("button",{class:"btn btn-warning with-icon"},' Reboot All');return s.addEventListener("click",n=>{t.close()}),r.addEventListener("click",n=>{r.getAttribute("disabled")||(Helper.states.btnLoadingState(r,!0),confirmPopup(`Are you sure you want to reboot all devices from ${a.display_name}?`,()=>{e.areas.reboot_devices(a.id,(i,c,o)=>{Helper.states.btnLoadingState(r,!1),c?(console.log("Was rebooted all devices"),Toasts.createSuccess("Rebooted all devices",`Area: ${a.display_name}`).show()):Toasts.createDanger("Rebooted fail",`Area: ${a.display_name}`).show()})},()=>{Helper.states.btnLoadingState(r,!1),console.log("CANCELED")}))}),[s,r]},onready:t=>{let s=t.querySelector(".devices-container"),r=t.querySelector(".loader");e.areas.devices(a.id,(n,i,c)=>{console.log("sh_api.areas.devices",i);function o(l){if(!l)return[];let p=[];for(let m of l.devices)m=Helper.unification.deviceFieldsUnification(m),p.push({deviceName:m.name,alias:m.alias,status:Helper.template.connectionStatusBadge(m.connection_state),ip:`${m.ip}`,actions:` - `});return p}let u=o(i==null?void 0:i.data);r.innerHTML=Helper.template.table("",{deviceName:"Device name",alias:"Device alias",status:"Status",ip:"IP",actions:"Actions"},u,`Total: ${u.length} devices`),r.querySelectorAll(".reboot-btn").forEach(l=>{l.addEventListener("click",p=>{l.getAttribute("disabled")||S(e,p.currentTarget,t)})}),s.remove(),console.log("devices",u)})}})}function se(a){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:' Create new Area',body:e=>` + `});return p}let u=o(i==null?void 0:i.data);s.innerHTML=Helper.template.table("",{deviceName:"Device name",alias:"Device alias",status:"Status",ip:"IP",actions:"Actions"},u,`Total: ${u.length} devices`),s.querySelectorAll(".reboot-btn").forEach(l=>{l.addEventListener("click",p=>{l.getAttribute("disabled")||S(e,p.currentTarget,t)})}),r.remove(),console.log("devices",u)})}})}function re(a){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:' Create new Area',body:e=>`
    - `,actions:e=>{let t=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),r=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Create');return t.addEventListener("click",s=>{e.close()}),r.addEventListener("click",s=>{let n=e.querySelector(".create-area-form");if(n.querySelectorAll("input[type='text']").forEach(o=>{o.dispatchEvent(new Event("input",{bubbles:!0}))}),n.querySelectorAll(".label.error").length)return!1;let i=n.querySelectorAll("input"),c={};for(let o of i)c[o.getAttribute("name")]=o.value;Helper.states.btnLoadingState(r,!0),a.areas.new_area(c,(o,u,l)=>{var p,m;if(Helper.states.btnLoadingState(r,!1),(o==null?void 0:o.type)=="api_error"){if(console.error("ERR! sh_api.areas.new_area",o.raw),(p=o.raw)!=null&&p.failed_fields)for(let d of o.raw.failed_fields)e.querySelector(`[name="${d}"]`).parentNode.classList.add("error");if((m=o.raw)!=null&&m.msg){let d=e.querySelector(".alert-container");d.innerHTML="",d==null||d.append(Helper.template.createAlert("error",o.raw.msg))}return!1}if(!u)return!1;i.forEach(d=>d.value=""),e.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Creating successful",`Added new area ID ${c.alias}`).show()},300)})}),[t,r]},onready:e=>{e.querySelector(".create-area-form").querySelectorAll(".input").forEach(r=>{r.addEventListener("input",s=>{var n;s.currentTarget.value.length?(s.currentTarget.parentNode.classList.remove("error"),(n=s.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||n.remove()):(s.currentTarget.parentNode.classList.add("error"),s.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||s.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})})}})}function ne(a,e){return console.log("areaDetailsModal",a),Modals.create("create-area-modal",{title:` ${a.display_name}`,body:t=>` + `,actions:e=>{let t=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Create');return t.addEventListener("click",r=>{e.close()}),s.addEventListener("click",r=>{let n=e.querySelector(".create-area-form");if(n.querySelectorAll("input[type='text']").forEach(o=>{o.dispatchEvent(new Event("input",{bubbles:!0}))}),n.querySelectorAll(".label.error").length)return!1;let i=n.querySelectorAll("input"),c={};for(let o of i)c[o.getAttribute("name")]=o.value;Helper.states.btnLoadingState(s,!0),a.areas.new_area(c,(o,u,l)=>{var p,m;if(Helper.states.btnLoadingState(s,!1),(o==null?void 0:o.type)=="api_error"){if(console.error("ERR! sh_api.areas.new_area",o.raw),(p=o.raw)!=null&&p.failed_fields)for(let d of o.raw.failed_fields)e.querySelector(`[name="${d}"]`).parentNode.classList.add("error");if((m=o.raw)!=null&&m.msg){let d=e.querySelector(".alert-container");d.innerHTML="",d==null||d.append(Helper.template.createAlert("error",o.raw.msg))}return!1}if(!u)return!1;i.forEach(d=>d.value=""),e.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Creating successful",`Added new area ID ${c.alias}`).show()},300)})}),[t,s]},onready:e=>{e.querySelector(".create-area-form").querySelectorAll(".input").forEach(s=>{s.addEventListener("input",r=>{var n;r.currentTarget.value.length?(r.currentTarget.parentNode.classList.remove("error"),(n=r.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||n.remove()):(r.currentTarget.parentNode.classList.add("error"),r.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||r.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})})}})}function ne(a,e){return console.log("areaDetailsModal",a),Modals.create("create-area-modal",{title:` ${a.display_name}`,body:t=>` // Details - `,actions:t=>{let r=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},' Remove');return r.addEventListener("click",n=>{t.close()}),s.addEventListener("click",n=>{Helper.states.btnLoadingState(s,!0),confirmPopup(`Are you sure you want to remove this area? ${a.display_name}`,()=>{e.areas.remove(a.id,(i,c,o)=>{Helper.states.btnLoadingState(s,!1),console.log("Was removed"),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",` - Area: ${a.display_name} `).show()},300)})},()=>{Helper.states.btnLoadingState(s,!1),console.log("CANCELED")})}),[r,s]},onready:t=>{}})}function Ge(a){let e=a.areas,t={},r=[];for(let s of e)t[s.id]=j(v({},s),{children:[]});for(let s of e){let n=t[s.id];s.parent_id&&t[s.parent_id]?t[s.parent_id].children.push(n):r.push(n)}return r}function Ke(a){return Ge(a)}function ie(a){var t;let e='
    ';if(e+=` + `,actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),r=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},' Remove');return s.addEventListener("click",n=>{t.close()}),r.addEventListener("click",n=>{Helper.states.btnLoadingState(r,!0),confirmPopup(`Are you sure you want to remove this area? ${a.display_name}`,()=>{e.areas.remove(a.id,(i,c,o)=>{Helper.states.btnLoadingState(r,!1),console.log("Was removed"),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",` + Area: ${a.display_name} `).show()},300)})},()=>{Helper.states.btnLoadingState(r,!1),console.log("CANCELED")})}),[s,r]},onready:t=>{}})}function Ge(a){let e=a.areas,t={},s=[];for(let r of e)t[r.id]=j(v({},r),{children:[]});for(let r of e){let n=t[r.id];r.parent_id&&t[r.parent_id]?t[r.parent_id].children.push(n):s.push(n)}return s}function Ke(a){return Ge(a)}function ie(a){var t;let e='
    ';if(e+=`
    @@ -264,7 +264,7 @@
    - `,(t=a.children)!=null&&t.length)for(let r of a.children)e+=ie(r);return e+="
    ",e}function Qe(a,e){console.log("TREE",e);let t='
    ';for(let r of e)t+=ie(r);t+="
    ",a.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Ve(a,e){a.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",r=>{let s=r.currentTarget,n=s.dataset.areaId,i=s.dataset.areaName;re({id:n,name:i},e).show()})}),a.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",r=>{let s=r.currentTarget,n={id:s.dataset.areaId,display_name:s.dataset.areaName};ne(n,e).show()})}),a.ready()}function oe(a){return{title:"Areas Tree",alias:"areas-tree",renderer:()=>Helper.template.mainTemplate(ae("areas-tree"),`
    + `,(t=a.children)!=null&&t.length)for(let s of a.children)e+=ie(s);return e+="
    ",e}function Qe(a,e){console.log("TREE",e);let t='
    ';for(let s of e)t+=ie(s);t+="
    ",a.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Ve(a,e){a.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",s=>{se({id:s.currentTarget.dataset.areaId,display_name:s.currentTarget.dataset.areaName},e).show()})}),a.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",s=>{ne({id:s.currentTarget.dataset.areaId,display_name:s.currentTarget.dataset.areaName},e).show()})}),a.ready()}function oe(a){return{title:"Areas Tree",alias:"areas-tree",renderer:()=>Helper.template.mainTemplate(ae("areas-tree"),`

    Areas Tree

    @@ -278,7 +278,7 @@
    - `),initer:e=>{a.areas.list((t,r,s)=>{if(console.log("sh_api.areas.list",t,r,s),s.status_code!=200)return e.error("Server API ERROR","");Qe(e,Ke(r.data)),Ve(e,a),e.currentScreen.DOMObject.querySelector(".create-new-area-modal").addEventListener("click",n=>{se(a).show()}),e.ready()})}}}var ce={areasTree:oe};function le(a,e){a.add("/",{alias:"home",renderer:()=>'

    Hello world

    ',initer:t=>{setTimeout(()=>t.ready(),1e3),setTimeout(()=>t.error("Error","Just testing"),2e3)}}),a.add("-",{alias:"not-found-screen",renderer:()=>'

    404 NOT FOUND

    ',initer:t=>{t.ready()}}),a.add("/devices",q.list(e)),a.add("/devices/scanning",q.scanning(e)),a.add("/scripts/scopes",O.scopes(e)),a.add("/scripts/regular",O.regular(e)),a.add("/scripts/actions",O.actions(e)),a.add("/areas/tree",ce.areasTree(e))}function Xe(a,e,t){return` + `),initer:e=>{a.areas.list((t,s,r)=>{if(console.log("sh_api.areas.list",t,s,r),r.status_code!=200)return e.error("Server API ERROR","");Qe(e,Ke(s.data)),Ve(e,a),e.currentScreen.DOMObject.querySelector(".create-new-area-modal").addEventListener("click",n=>{re(a).show()}),e.ready()})}}}var ce={areasTree:oe};function le(a,e){a.add("/",{alias:"home",renderer:()=>'

    Hello world

    ',initer:t=>{setTimeout(()=>t.ready(),1e3),setTimeout(()=>t.error("Error","Just testing"),2e3)}}),a.add("-",{alias:"not-found-screen",renderer:()=>'

    404 NOT FOUND

    ',initer:t=>{t.ready()}}),a.add("/devices",q.list(e)),a.add("/devices/scanning",q.scanning(e)),a.add("/scripts/scopes",O.scopes(e)),a.add("/scripts/regular",O.regular(e)),a.add("/scripts/actions",O.actions(e)),a.add("/areas/tree",ce.areasTree(e))}function Xe(a,e,t){return`
    - `}function Ze(a,e){return a.show=function(){document.querySelector("body").append(a),setTimeout(()=>{this.classList.add("a-show")},10)},a.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},a.querySelector(".modal-close").addEventListener("click",t=>{a.close()}),typeof e=="function"&&e(a),a}function et(a,e){let t=e.title||"",r=e.footer||"",s=document.createElement("div");s.innerHTML=Xe(a,t,r);let n=s.childNodes[1],i=n.querySelector(".modal-body"),c=n.querySelector(".modal-footer");if(typeof e.actions=="function"){let o=e.actions(n);if(typeof o[0]=="object"){let u=document.createElement("div");u.classList.add("actions");for(let l of o)u.append(l);c.append(u)}}if(typeof e.body=="function"){let o=e.body(n);typeof o=="object"?i.append(o):typeof o=="string"&&(i.innerHTML=o)}return Ze(n,e==null?void 0:e.onready)}var de={create:et};function N(a,e,t){Modals.create("confirm-popup",{title:"Requires confirmation",body:r=>` + `}function Ze(a,e){return a.show=function(){document.querySelector("body").append(a),setTimeout(()=>{this.classList.add("a-show")},10)},a.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},a.querySelector(".modal-close").addEventListener("click",t=>{a.close()}),typeof e=="function"&&e(a),a}function et(a,e){let t=e.title||"",s=e.footer||"",r=document.createElement("div");r.innerHTML=Xe(a,t,s);let n=r.childNodes[1],i=n.querySelector(".modal-body"),c=n.querySelector(".modal-footer");if(typeof e.actions=="function"){let o=e.actions(n);if(typeof o[0]=="object"){let u=document.createElement("div");u.classList.add("actions");for(let l of o)u.append(l);c.append(u)}}if(typeof e.body=="function"){let o=e.body(n);typeof o=="object"?i.append(o):typeof o=="string"&&(i.innerHTML=o)}return Ze(n,e==null?void 0:e.onready)}var de={create:et};function N(a,e,t){Modals.create("confirm-popup",{title:"Requires confirmation",body:s=>`

    ${a}

    - `,actions:r=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"NO"),n=Helper.template.createElement("button",{class:"btn btn-warning"},"YES");return s.addEventListener("click",i=>{r.close(),t()}),n.addEventListener("click",i=>{r.close(),e()}),[s,n]}}).show()}document.addEventListener("DOMContentLoaded",a=>{console.log("App init"),window.Toasts=z,window.Helper=W,window.Modals=de,window.confirmPopup=N,F();let e=new A({base_url:"http://shswebclient.local",token:"YOUR_TOKEN",timeout_ms:3e3,on_unauthorized:({error:r})=>console.log("auth problem:",r),proxy_path:"/proxy.php"}),t=new T(".screens",".load-screen",".error-screen");le(t,e),console.log(t.getScreens()),t.onSwitch((r,s)=>{k()}),t.routing(),window.Screens=t});})(); + `,actions:s=>{let r=Helper.template.createElement("button",{class:"btn btn-primary"},"NO"),n=Helper.template.createElement("button",{class:"btn btn-warning"},"YES");return r.addEventListener("click",i=>{s.close(),t()}),n.addEventListener("click",i=>{s.close(),e()}),[r,n]}}).show()}document.addEventListener("DOMContentLoaded",a=>{console.log("App init"),window.Toasts=z,window.Helper=W,window.Modals=de,window.confirmPopup=N,F();let e=new A({base_url:"http://shswebclient.local",token:"YOUR_TOKEN",timeout_ms:3e3,on_unauthorized:({error:s})=>console.log("auth problem:",s),proxy_path:"/proxy.php"}),t=new $(".screens",".load-screen",".error-screen");le(t,e),console.log(t.getScreens()),t.onSwitch((s,r)=>{k()}),t.routing(),window.Screens=t});})(); //# sourceMappingURL=main.js.map diff --git a/webclient/dist/js/main.js.map b/webclient/dist/js/main.js.map index 86233fa..2533fc5 100644 --- a/webclient/dist/js/main.js.map +++ b/webclient/dist/js/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/js/components/hud.js", "../../src/js/components/Screens.js", "../../src/js/components/toasts.js", "../../src/js/components/helper.js", "../../src/js/sh/modules/ScriptsApi.js", "../../src/js/sh/modules/DevicesApi.js", "../../src/js/sh/modules/AreasApi.js", "../../src/js/sh/SmartHomeApi.js", "../../src/js/components/screens/devices/devices-funcs.js", "../../src/js/components/screens/devices/device-details-popup.js", "../../src/js/components/screens/devices/devices-list-screen.js", "../../src/js/components/screens/devices/device-setup-form-popup.js", "../../src/js/components/screens/devices/devices-scanning-screen.js", "../../src/js/components/screens/devices/devices.js", "../../src/js/components/screens/scripts/scripts-funcs.js", "../../src/js/components/screens/scripts/scripts-scopes-screen.js", "../../src/js/components/screens/scripts/scripts-regular-screen.js", "../../src/js/components/screens/scripts/scripts-action-popup.js", "../../src/js/components/screens/scripts/scripts-actions-screen.js", "../../src/js/components/screens/scripts/scripts.js", "../../src/js/components/screens/areas/areas-funcs.js", "../../src/js/components/screens/areas/areas-devices-modal.js", "../../src/js/components/screens/areas/areas-create-new-modal.js", "../../src/js/components/screens/areas/areas-details-modal.js", "../../src/js/components/screens/areas/areas-tree-screen.js", "../../src/js/components/screens/areas/areas.js", "../../src/js/routes.js", "../../src/js/components/modals.js", "../../src/js/components/confirm-popup.js", "../../src/js/index.js"], - "sourcesContent": ["let navToggleBtn;\nlet navigation;\nlet reloadScreenBtn;\n\nfunction navigationShow() {\n\tnavToggleBtn.dataset.navState = \"displayed\";\n\tnavToggleBtn.classList.remove(\"state-off\");\n\tnavToggleBtn.classList.add(\"state-on\");\n\n\tnavigation.classList.add(\"a-show\");\n}\n\nfunction navigationHide() {\n\tnavToggleBtn.dataset.navState = \"hidden\";\n\tnavToggleBtn.classList.remove(\"state-on\");\n\tnavToggleBtn.classList.add(\"state-off\");\n\n\tnavigation.classList.add(\"a-hide\");\n\tnavigation.classList.remove(\"a-show\");\n\n\tsetTimeout(() => {\n\t\tnavigation.classList.remove(\"a-hide\");\n\t}, 300);\n}\n\nfunction hud() {\n\tconsole.log(\"HUD init\");\n\n\tnavToggleBtn = document.querySelector(\".hud .nav-toggle\");\n\tnavigation = document.querySelector(\".hud .navigation\");\n\treloadScreenBtn = document.querySelector(\".hud .reload-screen\");\n\n\tnavToggleBtn.addEventListener(\"click\", e => {\n\t\tif(e.currentTarget.dataset.navState != \"displayed\") {\n\t\t\tnavigationShow();\n\t\t} else {\n\t\t\tnavigationHide();\n\t\t}\n\t});\n\n\treloadScreenBtn.addEventListener(\"click\", e => {\n\t\tScreens.reload();\n\t});\n}\n\nexport {\n\thud,\n\tnavigationShow,\n\tnavigationHide\n}", "export class Screens {\n\tconstructor(screensContainerSelector, loaderSelector, errorScreenSelector) {\n\t\tthis.screens = {};\n\t\tthis.routesMap = {};\n\t\tthis.currentScreen = null;\n\t\tthis.eventsHandlers = {\n\t\t\tswitch: [],\n\t\t\treload: [],\n\t\t\treinit: []\n\t\t};\n\n\t\tthis.screensContainer = document.querySelector(screensContainerSelector);\n\t\tthis.loader = document.querySelector(loaderSelector);\n\t\tthis.errorScreen = document.querySelector(errorScreenSelector);\n\t\tconsole.log(\"Screens Init\");\n\t}\n\n\t/**\n\t * \u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0438 \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C\u0438 \u044D\u043A\u0440\u0430\u043D\u0430\n\t * @param {string} route Like `/path/name`\n\t * @param {void} screen {alias, renderer, initer}\n\t */\n\tadd(route, screen) {\n\t\tif(typeof screen != \"object\") {\n\t\t\treturn console.error(\"Screens: screens must be object\");\n\t\t}\n\t\t\n\t\tif(typeof screen?.alias == \"undefined\") {\n\t\t\treturn console.error(\"Screens: undefined alias\");\n\t\t}\n\n\t\tif(typeof screen?.renderer != \"function\") {\n\t\t\treturn console.error(\"Screens: renderer must be function\");\n\t\t}\n\n\t\tthis.screens[screen.alias] = {\n\t\t\troute: route,\n\t\t\t...screen\n\t\t};\n\n\t\tthis.routesMap[route] = screen.alias;\n\t}\n\n\tswitch(alias) {\t\t\n\t\tthis.runSwitchHandlers(alias);\n\t\tthis.hideErrorScreen();\n\t\tthis.showLoader();\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\t\n\t\tif(typeof this.screens[alias] == \"undefined\") {\n\t\t\tconsole.error(`Screens: \"${alias}\" not found`);\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen = this.screens[alias];\n\t\t\n\t\tconst screenContainer = document.createElement(\"div\");\n\t\tscreenContainer.classList.add(\"screen\");\n\t\tscreenContainer.id = alias;\n\t\tscreenContainer.dataset.alias = alias;\n\t\tscreenContainer.innerHTML = this.currentScreen.renderer();\n\t\tthis.currentScreen.DOMObject = screenContainer;\n\t\tthis.screensContainer.append(this.currentScreen.DOMObject);\n\n\t\tthis.currentScreen.initer(this);\n\t}\n\n\treload() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.runReloadHandlers(this.currentScreen.alias);\n\t\tthis.switch(this.currentScreen.alias);\n\t}\n\n\treinit() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen.initer(this);\n\t\tthis.runReinitHandlers();\n\t}\n\n\trouting() {\n\t\tsetInterval(() => {\n\t\t\tconst route = document.location.hash.split(\"#!\")[1];\n\t\t\tif(typeof route == \"undefined\" || route == \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst alias = (typeof this.routesMap[route] == \"undefined\") \n\t\t\t\t? \"not-found-screen\"\n\t\t\t\t: this.routesMap[route];\n\n\t\t\tif(!this.currentScreen || this.currentScreen.alias != alias) {\n\t\t\t\tthis.switch(alias);\n\t\t\t}\n\t\t}, 50);\n\t}\n\n\tready() {\n\t\tif(this.currentScreen == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!this.currentScreen.DOMObject) {\n\t\t\tthis.currentScreen.DOMObject = document.getElementsById(this.currentScreen.alias);\n\t\t}\n\n\t\tthis.hideLoader();\n\t\tthis.currentScreen.DOMObject.classList.add(\"a-show\");\n\t}\n\n\terror(title, text) {\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\tthis.errorScreen.querySelector(\".error-title\").innerHTML = title;\n\t\tthis.errorScreen.querySelector(\".error-text\").innerHTML = text;\n\t\tthis.showErrorScreen();\n\t}\n\n\thideLoader() {\n\t\tthis.loader.classList.remove(\"a-show\");\n\t}\n\n\tshowLoader() {\n\t\tthis.loader.classList.add(\"a-show\");\n\t}\n\n\tshowErrorScreen() {\n\t\tthis.errorScreen.classList.add(\"a-show\");\n\t}\n\n\thideErrorScreen() {\n\t\tthis.errorScreen.classList.remove(\"a-show\");\n\t}\n\n\tgetScreens() {\n\t\treturn this.screens;\n\t}\n\n\tgetRoutesMap() {\n\t\treturn this.routesMap;\n\t}\n\n\tonSwitch(cb) {\n\t\tthis.eventsHandlers.switch.push(cb);\n\t}\n\n\tonReaload(cb) {\n\t\tthis.eventsHandlers.reload.push(cb);\n\t}\n\n\tonReinit(cb) {\n\t\tthis.eventsHandlers.reinit.push(cb);\n\t}\n\n\trunSwitchHandlers(alias) {\n\t\tfor(let handler of this.eventsHandlers.switch) {\n\t\t\thandler(this, alias);\n\t\t}\n\t}\n\n\trunReloadHandlers(alias) {\n\t\tfor(let handler of this.eventsHandlers.reload) {\n\t\t\thandler(this, alias);\n\t\t}\n\t}\n\n\trunReinitHandlers() {\n\t\tfor(let handler of this.eventsHandlers.reinit) {\n\t\t\thandler(this);\n\t\t}\n\t}\n}", "function template(type, icon, title, text) {\n\treturn `\n\t\t
    \n\t
    \n\t

    ${icon} ${title}

    \n\t

    ${text}

    \n\t
    \n\t \n\t
    \n\t`;\n}\n\nfunction init(toast, props) {\n\tif(props?.alone) {\n\t\tdocument.querySelectorAll(\".toast\").forEach(i => i.close());\n\t}\n\n\ttoast.close = function() {\n\t\tthis.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n\n\ttoast.querySelector(\".toast-close\").addEventListener(\"click\", e => {\n\t\ttoast.close();\n\t});\n\n\ttoast.show = function() {\n\t\tdocument.querySelector(\"body\").append(toast);\n\n\t\tsetTimeout(() => {\n\t\t\ttoast.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tScreens.onSwitch((scr, alias) => {\n\t\tsetTimeout(() => {\n\t\t\ttoast?.close();\n\t\t}, 10000);\n\t});\n\n\ttoast.addEventListener(\"mouseover\", e => toast.ishovered = true);\n\ttoast.addEventListener(\"mouseout\", e => toast.ishovered = false);\n\n\tif(props?.lifetime) {\n\t\tconsole.log(props);\n\t\tconst lifetimeInterval = setInterval(() => {\n\t\t\tif(!toast.ishovered) {\n\t\t\t\ttoast.close();\n\t\t\t\tclearInterval(lifetimeInterval);\n\t\t\t}\n\t\t}, props?.lifetime);\n\t}\n\n\treturn toast;\n}\n\nfunction create(type, icon, title, text, props) {\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(type, icon, title, text);\n\n\treturn init(div.childNodes[1], props);\n}\n\nfunction createSuccess(title, text, props) {\n\tif(typeof props == \"undefined\") {\n\t\tprops = {};\n\t}\n\n\tif(typeof props.lifetime == \"undefined\") {\n\t\tprops.lifetime = 4000;\n\t}\n\n\tif(typeof props.alone == \"undefined\") {\n\t\tprops.alone = true;\n\t}\n\n\treturn create(\n\t\t\"success\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createInfo(title, text, props) {\n\treturn create(\n\t\t\"info\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createWarning(title, text, props) {\n\treturn create(\n\t\t\"warning\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createError(title, text, props) {\n\treturn create(\n\t\t\"danger\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nexport default {\n create,\n createInfo,\n createSuccess,\n createWarning,\n createError,\n \"createDanger\": createError\n};", "function sidebarNav(items) {\n\tlet listItems = \"\";\n\n\tfor(let item of items) {\n\t\tlet aOpen = \"\";\n\t\tlet aClose = \"\";\n\t\tif(item.route) {\n\t\t\taOpen = ``;\n\t\t\taClose = ``;\n\t\t}\n\n\t\tlistItems += `\n\t\t\t
  • \n\t\t\t\t${aOpen}${item.content}${aClose}\n\t\t\t
  • \n\t\t`;\n\t}\n\n\treturn `\n\t\t
    \n\t\t\t
      \n\t\t\t\t${listItems} \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction table(caption, columns, data, tfoot) {\n\tlet head = ``;\n\tlet totalColumns = 0;\n\tfor(let key in columns) {\n\t\thead += `${columns[key]}`;\n\t\ttotalColumns++;\n\t}\n\thead += \"\";\n\n\tlet body = ``;\n\tfor(let item of data) {\n\t\tbody += ``;\n\t\tfor(let column in columns) {\n\t\t\tbody += `${item[column]}`;\n\t\t}\n\t\tbody += ``;\n\t}\n\n\tlet foot = \"\";\n\tif(typeof tfoot != \"undefined\") {\n\t\tfoot = `\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t${tfoot}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`\n\t}\n\n\tconst tableCaption = caption \n\t\t? `${caption}`\n\t\t: '';\n\n\tconst tableHead = data.length \n\t\t? `${head}`\n\t\t: '';\n\n\tbody = data.length\n\t\t? body\n\t\t: `Empty`;\n\n\tconst tableEmptyClass = !data.length \n\t\t? \"table-empty\"\n\t\t: \"\";\n\n\treturn `\n\t\t\n\t\t\t${tableCaption}\n\t\t\t${tableHead}\n\t\t\t${body}\n\t\t\t${foot}\n\t\t
    \n\t`;\n}\n\nfunction createElement(type, props, content) {\n\tconst node = document.createElement(type);\n\n\tfor (const [key, value] of Object.entries(props)) {\n\t\tif (key === \"class\") {\n\t\t\tnode.className = value;\n\t\t} else if (key === \"dataset\") {\n\t\t\tObject.assign(node.dataset, value);\n\t\t} else {\n\t\t\tnode.setAttribute(key, value);\n\t\t}\n\t}\n\n\tnode.innerHTML = (typeof content != \"undefined\") ? content : \"\";\n\treturn node; \n}\n\nfunction createAlert(type, content) {\n\tif([\"primary\", \"success\", \"secondary\", \"info\", \"warning\", \"error\", \"danger\"].indexOf(type) < 0) {\n\t\treturn console.error(\"createAlert()\", \"Error of type: \" + type);\n\t}\n\n\treturn createElement(\"div\", {\n\t\tclass: `alert alert-${type}`,\n\t}, content);\n}\n\nfunction deviceFieldsUnification(data) {\n\tconst map = {\n\t\t\"device_name\": \"name\",\n\t\t\"device_hard_id\": \"device_id\",\n\t\t\"device_ip\": \"ip\",\n\t\t\"device_type\": \"type\",\n\t\t\"ip_address\": \"ip\",\n\t\t\"mac_address\": \"mac\",\n\t\t\"device_mac\": \"mac\",\n\t\t\"core_version\": \"firmware_core_version\"\n\t};\n\n\tconst dataObj = {};\n\n\tfor(let field in data) {\n\t\tif(typeof map[field] != \"undefined\") {\n\t\t\tdataObj[ map[field] ] = data[field];\n\t\t\tcontinue;\n\t\t}\n\n\t\tdataObj[field] = data[field];\n\t}\n\n\treturn dataObj;\n}\n\nfunction btnLoadingState(btn, isLoading) {\n\tif(btn?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tif(isLoading) {\n\t\tbtn.isLoading = true;\n\t\tbtn.originalContent = btn.innerHTML;\n\t\tif(btn.classList.contains(\"with-icon\")) {\n\t\t\tbtn.originalWithIcon = true;\n\t\t} else {\n\t\t\tbtn.classList.add(\"with-icon\");\n\t\t}\n\n\t\tbtn.classList.add(\"loading-state\");\n\t\tbtn.setAttribute(\"disabled\", \"disabled\");\n\t\tbtn.innerHTML = ` Loading`;\n\t} else {\n\t\tbtn.isLoading = false;\n\t\tif(!btn.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tbtn.removeAttribute(\"disabled\");\n\t\tbtn.classList.remove(\"loading-state\");\n\t\tif(!btn.originalWithIcon) {\n\t\t\tbtn.classList.remove(\"with-icon\");\n\t\t}\n\t\tbtn.innerHTML = btn.originalContent;\n\t}\n\n\treturn btn;\n}\n\nfunction cardScriptActionLoadingState(card, isLoading) {\n\tif(card?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tconst iconContainer = card.querySelector(\".device-icon\");\n\n\tif(isLoading) {\n\t\tcard.isLoading = true;\n\t\tcard.originalContent = iconContainer.innerHTML;\n\t\tcard.classList.add(\"loading-state\");\n\t\tcard.setAttribute(\"disabled\", \"disabled\");\n\t\ticonContainer.innerHTML = ``;\n\t} else {\n\t\tcard.isLoading = false;\n\t\tif(!card.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tcard.removeAttribute(\"disabled\");\n\t\tcard.classList.remove(\"loading-state\");\n\t\ticonContainer.innerHTML = card.originalContent;\n\t}\n\n\treturn card;\n}\n\nfunction mainTemplate(sidebar, content) {\n\tcontent = content ?? \"\";\n\treturn `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${sidebar}\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${content}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction connectionStatusBadge(status) {\n\treturn status == \"active\"\n\t\t? `Online`\n\t\t: `Offline`;\n}\n\nfunction toogleStateBadge(state) {\n\treturn state == \"enabled\"\n\t\t? `Enabled`\n\t\t: `Disabled`;\n}\n\nexport default {\n\ttemplate: {\n\t\tsidebarNav,\n\t\ttable,\n\t\tcreateElement,\n\t\tcreateAlert,\n\t\tmainTemplate,\n\t\tconnectionStatusBadge,\n\t\ttoogleStateBadge\n\t},\n\tunification: {\n\t\tdeviceFieldsUnification\n\t},\n\tstates: {\n\t\tbtnLoadingState,\n\t\tcardScriptActionLoadingState\n\t}\n}", "/* =========================\n Scripts module\n========================= */\n\nexport class ScriptsApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/scripts/actions/list\n\tactions_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/actions/list\", cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/list\n\tscopes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/scopes/list\", cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/list\n\tregular_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/regular/list\", cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{filename}}\n\tscope_get_by_filename(filename, cb) {\n\t\tconst safe = encodeURIComponent(String(filename || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}`, cb, {\n\t\t\t// \u0442\u0443\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043C\u043E\u0436\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u044C PHP-\u043A\u043E\u0434 \u0442\u0435\u043A\u0441\u0442\u043E\u043C; request \u0443\u043C\u0435\u0435\u0442 \u044D\u0442\u043E \u043F\u0435\u0440\u0435\u0436\u0438\u0442\u044C\n\t\t});\n\t}\n\n\t// POST /api/v1/scripts/scopes/new\n\tscope_create(payload, cb) {\n\t\t// payload: { alias, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/new\", payload, cb);\n\t}\n\n\t// POST /api/v1/scripts/scopes/update\n\tscope_update(payload, cb) {\n\t\t// payload: { name, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/update\", payload, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/enable\n\taction_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/disable\n\taction_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/enable\n\tregular_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/disable\n\tregular_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scope/name/{{name}}/enable\n\tscope_enable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/scope/name/{{name}}/disable\n\tscope_disable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{name}}/remove\n\tscope_remove(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/scripts/actions/run\n\trun(payload, cb) {\n\t\t// payload: { alias, params: {...} }\n\t\treturn this.core.api_post(\"/api/v1/scripts/actions/run\", payload, cb);\n\t}\n}", "/* =========================\n Devices module\n========================= */\n\nexport class DevicesApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/devices/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/list\", cb);\n\t}\n\n\t// GET /api/v1/devices/scanning/setup\n\tscanning_setup(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/setup\", cb);\n\t}\n\n\t// GET /api/v1/devices/scanning/all\n\tscanning_all(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/all\", cb);\n\t}\n\n\t// POST /api/v1/devices/setup/new-device\n\tsetup_new_device(payload, cb) {\n\t\t// payload: { device_ip, alias, name, description }\n\t\treturn this.core.api_post(\"/api/v1/devices/setup/new-device\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/info\n\tinfo(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/info`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}\n\tget(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/status\n\tstatus(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/status`, cb);\n\t}\n\n\t// POST /api/v1/devices/action\n\taction(payload, cb) {\n\t\t// payload: { device_id, action, params }\n\t\treturn this.core.api_post(\"/api/v1/devices/action\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/remove\n\tremove(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/remove`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/reboot\n\treboot(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/reboot`, cb);\n\t}\n}\n", "export class AreasApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/areas/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/list\", cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/list\n\tinner_list(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/list`, cb);\n\t}\n\n\t// POST /api/v1/areas/new-area\n\tnew_area(payload, cb) {\n\t\t// payload: { type, alias, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/new-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/remove\n\tremove(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/areas/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_area_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/areas/place-in-area\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-display-name\n\tupdate_display_name(payload, cb) {\n\t\t// payload: { area_id, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-display-name\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-alias\n\tupdate_alias(payload, cb) {\n\t\t// payload: { area_id, new_alias }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-alias\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/devices\n\tdevices(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/devices`, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/unassign-from-area\n\tunassign_from_area(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/unassign-from-area`, cb);\n\t}\n\n\t// GET /api/v1/areas/types/list\n\ttypes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/types/list\", cb);\n\t}\n\n\t// GET /api/v1/areas/reboot_devices\n\t// GET /api/v1/areas/id/{{area_id}}/reboot_devices\n\treboot_devices(area_id, cb) {\n\t\tif (area_id === undefined || area_id === null) {\n\t\t\treturn this.core.api_get(\"/api/v1/areas/reboot_devices\", cb);\n\t\t}\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/reboot_devices`, cb);\n\t}\n}", "/**\n * smart_home_api.js\n *\n * \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F JS-\u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u0434\u043B\u044F REST-\u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (callback-style).\n * - \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F: Bearer token (\u0438\u043B\u0438 \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u0435\u0441\u043B\u0438 \u043F\u043E\u043C\u0435\u043D\u044F\u0435\u0448\u044C)\n * - \u0415\u0434\u0438\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A: \u0441\u0435\u0442\u0435\u0432\u044B\u0435, \u0442\u0430\u0439\u043C\u0430\u0443\u0442, \u043D\u0435-JSON, \u0441\u0442\u0430\u0442\u0443\u0441=false/error\n * - \u041C\u043E\u0434\u0443\u043B\u0438: \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043E\u043B\u044C\u043A\u043E Scripts, \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0438\n */\n\nimport { ScriptsApi } from \"./modules/ScriptsApi.js\";\nimport { DevicesApi } from \"./modules/DevicesApi.js\";\nimport { AreasApi } from \"./modules/AreasApi.js\";\n\n/* =========================\n Utils\n========================= */\n\nfunction build_query(params) {\n\tif (!params || typeof params !== \"object\") return \"\";\n\tconst usp = new URLSearchParams();\n\tObject.entries(params).forEach(([k, v]) => {\n\t\tif (v === undefined || v === null) return;\n\t\tusp.append(k, String(v));\n\t});\n\tconst s = usp.toString();\n\treturn s ? `?${s}` : \"\";\n}\n\nfunction join_url(base_url, path) {\n\tconst b = String(base_url || \"\").replace(/\\/+$/, \"\");\n\tconst p = String(path || \"\").replace(/^\\/+/, \"\");\n\treturn `${b}/${p}`;\n}\n\nfunction safe_json_parse(text) {\n\ttry {\n\t\treturn { ok: true, data: JSON.parse(text) };\n\t} catch (e) {\n\t\treturn { ok: false, error: e };\n\t}\n}\n\n/* =========================\n Core client\n========================= */\n\nexport class SmartHomeApi {\n\t/**\n\t * @param {Object} opts\n\t * @param {string} opts.base_url - \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: http://192.168.2.101\n\t * @param {string} [opts.token] - \u0442\u043E\u043A\u0435\u043D \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0438\n\t * @param {number} [opts.timeout_ms=15000]\n\t * @param {Object} [opts.default_headers]\n\t * @param {Function} [opts.on_unauthorized] - cb(details)\n\t * @param {string} [opts.proxy_path] \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \"/proxy.php\" (\u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u043A\u0441\u0438)\n\t */\n\tconstructor(opts) {\n\t\tthis.base_url = opts?.base_url || \"\";\n\t\tthis.token = opts?.token || \"\";\n\t\tthis.timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : 15000;\n\t\tthis.default_headers = opts?.default_headers || {};\n\t\tthis.on_unauthorized = typeof opts?.on_unauthorized === \"function\" ? opts.on_unauthorized : null;\n\t\tthis.proxy_path = opts?.proxy_path || \"\"; // \"\" => \u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0441\u0438\n\n\t\t// modules\n\t\tthis.scripts = new ScriptsApi(this);\n\t\tthis.devices = new DevicesApi(this);\n\t\tthis.areas = new AreasApi(this);\n\t}\n\n\tset_base_url(base_url) {\n\t\tthis.base_url = base_url || \"\";\n\t}\n\n\tset_token(token) {\n\t\tthis.token = token || \"\";\n\t}\n\n\tset_proxy_path(proxy_path) {\n\t\tthis.proxy_path = proxy_path || \"\";\n\t}\n\n\t_wrap_path(path, extra_query) {\n\t\t// \u0415\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0451\u043D \u043F\u0440\u043E\u043A\u0441\u0438 \u2014 \u0445\u043E\u0434\u0438\u043C \u043D\u0430 /proxy.php?path=&...\n\t\tif (!this.proxy_path) {\n\t\t\tif (!extra_query) return path;\n\t\t\treturn `${path}${build_query(extra_query)}`;\n\t\t}\n\n\t\tconst q = { path, ...(extra_query || {}) };\n\t\treturn `${this.proxy_path}${build_query(q)}`;\n\t}\n\n\t/**\n\t * \u0423\u043D\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441.\n\t *\n\t * cb(err, data, meta)\n\t * - err: { type, message, status_code?, raw?, details? }\n\t * - data: \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u0439 json (\u0438\u043B\u0438 string, \u0435\u0441\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0432\u0435\u0440\u043D\u0443\u043B json)\n\t * - meta: { url, method, status_code, headers }\n\t */\n\trequest(method, path, body, cb, opts) {\n\t\tconst callback = typeof cb === \"function\" ? cb : () => {};\n\t\tconst url = join_url(this.base_url, path);\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : this.timeout_ms;\n\n\t\tconst t = setTimeout(() => controller.abort(), timeout_ms);\n\n\t\tconst headers = {\n\t\t\t...this.default_headers,\n\t\t\t...(opts?.headers || {}),\n\t\t};\n\n\t\t// \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F (\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u0439, \u0435\u0441\u043B\u0438 \u0443 \u0442\u0435\u0431\u044F \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442)\n\t\tif (this.token) headers[\"Authorization\"] = `Bearer ${this.token}`;\n\n\t\tlet payload = undefined;\n\t\tif (body !== undefined && body !== null) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tpayload = JSON.stringify(body);\n\t\t}\n\n\t\tfetch(url, {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody: payload,\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst meta = {\n\t\t\t\t\turl,\n\t\t\t\t\tmethod,\n\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\theaders: res.headers,\n\t\t\t\t};\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tconst parsed = safe_json_parse(text);\n\t\t\t\tconst data = parsed.ok ? parsed.data : text;\n\n\t\t\t\t// HTTP-level \u043E\u0448\u0438\u0431\u043A\u0438\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst err = {\n\t\t\t\t\t\ttype: \"http_error\",\n\t\t\t\t\t\tmessage: `HTTP ${res.status}`,\n\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\traw: data,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (res.status === 401 || res.status === 403) {\n\t\t\t\t\t\tif (this.on_unauthorized) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.on_unauthorized({ error: err, meta });\n\t\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t}\n\n\t\t\t\t// API-level \u043E\u0448\u0438\u0431\u043A\u0438 (\u043F\u043E \u0442\u0432\u043E\u0438\u043C \u043F\u0440\u0438\u043C\u0435\u0440\u0430\u043C \u0431\u044B\u0432\u0430\u0435\u0442 status:false \u0438\u043B\u0438 status:\"error\")\n\t\t\t\tif (parsed.ok && data && typeof data === \"object\") {\n\t\t\t\t\tconst st = data.status;\n\t\t\t\t\tif (st === false || st === \"error\") {\n\t\t\t\t\t\tconst err = {\n\t\t\t\t\t\t\ttype: \"api_error\",\n\t\t\t\t\t\t\tmessage: data.message || \"API error\",\n\t\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\t\traw: data,\n\t\t\t\t\t\t\tfield: data.field,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn callback(null, data, meta);\n\t\t\t})\n\t\t\t.catch((e) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst is_abort = e && (e.name === \"AbortError\" || String(e).includes(\"AbortError\"));\n\t\t\t\tconst err = is_abort\n\t\t\t\t\t? { type: \"timeout\", message: `Timeout after ${timeout_ms}ms` }\n\t\t\t\t\t: { type: \"network_error\", message: e?.message || \"Network error\", details: e };\n\n\t\t\t\treturn callback(err, null, { url, method, status_code: 0, headers: null });\n\t\t\t});\n\t}\n\n\tget(path, cb, opts) {\n\t\treturn this.request(\"GET\", path, null, cb, opts);\n\t}\n\n\tpost(path, body, cb, opts) {\n\t\treturn this.request(\"POST\", path, body, cb, opts);\n\t}\n\n\tapi_get(api_path, cb, extra_query, opts) {\n\t\treturn this.get(this._wrap_path(api_path, extra_query), cb, opts);\n\t}\n\n\tapi_post(api_path, body, cb, extra_query, opts) {\n\t\treturn this.post(this._wrap_path(api_path, extra_query), body, cb, opts);\n\t}\n}\n\n/* =========================\n Example usage\n========================= */\n\n// import { SmartHomeApi } from \"./smart_home_api.js\";\n//\n// const api = new SmartHomeApi({\n// base_url: \"http://192.168.2.101\",\n// token: \"YOUR_TOKEN\",\n// timeout_ms: 20000,\n// on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n// });\n//\n// api.scripts.actions_list((err, res) => {\n// if (err) return console.error(\"actions_list error:\", err);\n// console.log(\"actions:\", res);\n// });\n//\n// api.scripts.run({ alias: \"script_alias\", params: { x: 1 } }, (err, res) => {\n// if (err) return console.error(\"run error:\", err);\n// console.log(\"run result:\", res);\n// });\n", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Devices`,\n\t\t\troute: \"/#!/devices\",\n\t\t\tis_active: active == \"devices\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Scanning`,\n\t\t\troute: \"/#!/devices/scanning\",\n\t\t\tis_active: active == \"scanning\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/devices/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t}\n\t]);\n}\n\nfunction rebootDeviceBtnHandler(sh_api, btn, modal) {\n\tHelper.states.btnLoadingState(btn, true);\n\n\tconst deviceId = btn.dataset.deviceId;\n\tconst deviceName = btn.dataset.deviceName;\n\tconst deviceAlias = btn.dataset.deviceAlias;\n\t\n\tsh_api.devices.reboot(\n\t\tdeviceId,\n\t\t(err, data, meta) => {\n\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\tconsole.log(\"Reboot done\", err, data, meta);\n\n\t\t\tmodal?.close();\n\n\t\t\tif(data) {\n\t\t\t\tsetTimeout(() => Screens.reinit(), 8000);\n\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\"Reboot successful\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t} else {\n\t\t\t\tToasts.createError(\n\t\t\t\t\t\"Reboot failed\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t}\n\t\t}\n\t);\n}\n\nexport {\n\tsidebarTemplate,\n\trebootDeviceBtnHandler\n}", "import { rebootDeviceBtnHandler } from \"./devices-funcs.js\";\n\nexport function deviceDetailsPopup(device, sh_api) {\n\tconsole.log(device);\n\n\treturn Modals.create(\"device-popup\", {\n\t\ttitle: `Device ${device.name}`,\n\t\tbody: modal => {\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${device[field]}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst buttonReboot = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon\"\n\t\t\t}, ' Reboot');\n\n\t\t\tconst buttonRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ' Remove');\n\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbuttonReboot.dataset.deviceId = device.id;\n\t\t\tbuttonReboot.dataset.deviceName = device.name;\n\t\t\tbuttonReboot.dataset.deviceAlias = device.alias;\n\n\t\t\tbuttonReboot.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonReboot.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t});\n\n\t\t\tbuttonRemove.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonRemove.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(buttonRemove, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to remove this device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.remove(\n\t\t\t\t\t\t\tdevice.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\tDevice: ${device.name}
    \n\t\t\t\t\t\t\t\t\t\tAlias: ${device.alias}
    \n\t\t\t\t\t\t\t\t\t\tIP: ${device.ip}\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonReboot, buttonRemove ];\n\t\t}\n\t});\n}", "import { sidebarTemplate, rebootDeviceBtnHandler } from \"./devices-funcs.js\";\nimport { deviceDetailsPopup } from \"./device-details-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceName: device.name,\n\t\t\talias: device.alias,\n\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_state),\n\t\t\tip: `${device.ip}`,\n\t\t\tactions: `\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Devices list\", \n\t\t{\n\t\t\tdeviceName: \"Device name\", \n\t\t\talias: \"Device alias\", \n\t\t\tstatus: \"Status\", \n\t\t\tip: \"IP\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".reboot-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget);\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = JSON.parse(e.currentTarget.dataset.device);\n\t\t\tdeviceDetailsPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction list(sh_api) {\n\treturn {\n\t\talias: \"devices\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"devices\"));\n\t\t},\n\n\t\tiniter: scr => {\n\t\t\tsh_api.devices.list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\n\t\t}\n\t};\n}\n\nexport {\n\tlist\n}", "export function deviceSetupFormPopup(device, sh_api) {\n\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\treturn Modals.create(\"device-setup\", {\n\t\ttitle: `Setup new device ${device.ip}`,\n\t\tbody: modal => {\n\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tif(field[0] == \"_\") continue;\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${device[field]}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\tconst deviceInfo = `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t${deviceInfo}\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"Cancel\");\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tconst buttonSubmit = Helper.template.createElement(\"button\", \n\t\t\t\t{ class: \"btn btn-success with-icon\" }, \n\t\t\t\t` Setup`\n\t\t\t);\n\n\t\t\tbuttonSubmit.addEventListener(\"click\", e => {\n\t\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputs = {\n\t\t\t\t\tdevice_ip: device.ip\n\t\t\t\t};\n\n\t\t\t\tconst setupForm = document.querySelector(\"#device-setup .setup-form\");\n\t\t\t\tsetupForm.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(setupForm.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = setupForm.querySelectorAll(\"input\");\n\t\t\t\tconst textareaElement = setupForm.querySelector(\"textarea\");\n\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tinputs[textareaElement.getAttribute(\"name\")] = textareaElement.value;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, true);\n\t\t\t\t\n\t\t\t\tsh_api.devices.setup_new_device(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.devices.setup_new_device\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".setup-form .alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\ttextareaElement.value = \"\";\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Setup successful\", `Added new device ID ${device.device_id}`).show();\n\t\t\t\t\t}, 300);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonSubmit ];\n\t\t},\n\n\t\tonready: modal => {\n\t\t\tconst setupForm = modal.querySelector(\".setup-form\");\n\t\t\tsetupForm.querySelectorAll(\"input\").forEach(i => {\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t})\n}", "import { sidebarTemplate } from \"./devices-funcs.js\";\nimport { deviceSetupFormPopup } from \"./device-setup-form-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceId: device.device_id,\n\t\t\tdeviceName: device.name,\n\t\t\tdeviceType: device.type,\n\t\t\tstatus: `${device.status}`,\n\t\t\tip: `${device.ip}`,\n\t\t\tmac: `${device.mac}`,\n\t\t\twifiSignal: device.wifi_signal,\n\t\t\tactions: device.status == \"setup\" ? `\n\t\t\t\t\n\t\t\t` : \"\"\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Found devices\", \n\t\t{\n\t\t\tdeviceId: \"Device ID\",\n\t\t\tdeviceName: \"Device name\", \n\t\t\tdeviceType: \"Type\", \n\t\t\tstatus: \"Status\", \n\t\t\tip: \"IP\", \n\t\t\tmac: \"Mac\",\n\t\t\twifiSignal: \"Signal\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".setup-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = JSON.parse(e.currentTarget.dataset.device);\n\t\t\tdeviceSetupFormPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction scanning(sh_api) {\n\treturn {\n\t\talias: \"devices-scanning\",\n\t\trenderer: () => {\t\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scanning\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.devices.scanning_all((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.scanning_all\", err, resp);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.devices.length);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\n\t\t}\n\t};\n}\n\nexport {\n\tscanning\n}", "import { list } from \"./devices-list-screen.js\";\nimport { scanning } from \"./devices-scanning-screen.js\";\n\nexport default {\n\tlist,\n\tscanning\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Scopes`,\n\t\t\troute: \"/#!/scripts/scopes\",\n\t\t\tis_active: active == \"scopes\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/scripts/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Regular`,\n\t\t\troute: \"/#!/scripts/regular\",\n\t\t\tis_active: active == \"regular\"\n\t\t}\n\t]);\n}\n\nfunction runActionScript(sh_api, alias, cb) {\n\tsh_api.scripts.run({\n\t\talias: alias,\n\t\tparams: {}\n\t}, (err, data, meta) => {\n\t\tif(data) {\n\t\t\tcb(true);\n\n\t\t\tsetTimeout(() => Screens.reinit(), 1000);\n\n\t\t\tsetTimeout(() => Toasts.createSuccess(\n\t\t\t\t`${alias} running`,\n\t\t\t\t`${alias} running success`\n\t\t\t).show(), 300);\n\t\t} else {\n\t\t\tcb(false);\n\n\t\t\tsetTimeout(() => Toasts.createError(\n\t\t\t\t`${alias} failed`,\n\t\t\t\t`${alias} running failed`\n\t\t\t).show(), 300);\n\t\t}\n\t});\n}\n\nexport {\n\tsidebarTemplate,\n\trunActionScript\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let scope of data.scopes) {\n\t\tconst btnSwitch = scope.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\tname: scope.name,\n\t\t\tfilename: `${scope.filename}
    ${scope.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(scope.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Scopes list\", \n\t\t{\n\t\t\tname: \"Scope name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scopes`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"scope_enable\"\n\t\t\t\t: \"scope_disable\"\n\n\t\t\tconst scope = JSON.parse(btn.dataset.scope);\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](scope.name, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${scope.name} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Scope state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction scopes(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Scopes\",\n\t\talias: \"scripts-scopes\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scopes\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.scopes_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.scopes_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tscopes\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tconst btnSwitch = script.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\talias: `${script.alias}
    by ${script.created_by}`,\n\t\t\tname: `${script.name}
    ${script.description}
    `,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(script.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tconst provideSciptsData = {};\n\tfor(let i in data) {\n\t\tprovideSciptsData[data[i].alias] = data[i];\n\t\tdata[i][\"code\"] = \"\";\n\t}\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Regular scripts list\", \n\t\t{\n\t\t\talias: \"Alias\", \n\t\t\tname: \"Script name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scripts`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"regular_enable\"\n\t\t\t\t: \"regular_disable\"\n\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction regular(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Regular\",\n\t\talias: \"scripts-regular\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"regular\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.regular_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.regular_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tregular\n}", "import { runActionScript } from \"./scripts-funcs.js\";\n\nexport function actionDetailsPopup(script, sh_api) {\n\tconsole.log(\"actionDetailsPopup\", script);\n\n\treturn Modals.create(\"action-script-popup\", {\n\t\ttitle: `${script.name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    ${script.alias}

    \n\t\t\t\t\t\t\t
    ${script.description}
    \n\t\t\t\t\t\t\t
    ${Helper.template.toogleStateBadge(script.state)}
    \n\t\t\t\t\t\t\t
    ${script.filename}
    \n\t\t\t\t\t\t\t
    By ${script.author}
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    ${script.code}
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnChangeState = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: script.state == \"enabled\" ? \"btn btn-warning\" : \"btn btn-success\",\n\t\t\t\t\"data-value\": script.state == \"enabled\" ? \"disable\" : \"enable\"\n\t\t\t}, script.state == \"enabled\" ? `Disable` : \"Enable\");\n\n\n\t\t\tconst btnRun = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-secondary with-icon\"\n\t\t\t}, ` Run`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnChangeState.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t\t? \"action_enable\"\n\t\t\t\t\t: \"action_disable\"\n\n\t\t\t\t// const script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tif(data) {\n\t\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbtnRun.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\n\t\t\t\trunActionScript(sh_api, script.alias, resultFlag => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tif(resultFlag) {\n\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnChangeState, btnRun ];\n\t\t},\n\t\tonready: modal => {\n\t\t\thljs.highlightElement(modal.querySelector(\".code-viewer\"));\n\t\t}\n\t});\n}", "import { sidebarTemplate, runActionScript } from \"./scripts-funcs.js\";\nimport { actionDetailsPopup } from \"./scripts-action-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tpreparedData.push({\n\t\t\talias: script.alias,\n\t\t\tauthor: script.created_by,\n\t\t\tname: script.name,\n\t\t\ticon: script.icon ?? '',\n\t\t\tdescription: script.description,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: script.state,\n\t\t\tcode: script.code\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainGrid(scr, data, total) {\n\tlet grid = `
    `;\n\n\tconst provideSciptsData = {};\n\n\tfor(let item of data) {\n\t\tprovideSciptsData[item.alias] = item;\n\n\t\tconst cardColor = item.state == \"enabled\" ? \"primary\" : \"warning\";\n\t\tgrid += `\n\t\t\t
    \n\t\t\t\t${item.name} \n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t${item.icon}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    ${item.description}
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t`;\n\t}\n\tgrid += `
    `;\n\n\tconst mainContainer = scr.currentScreen.DOMObject.querySelector(\".main-container\");\n\tmainContainer.innerHTML = grid;\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".script-action .card-content\").forEach(actionCard => {\n\t\tactionCard.addEventListener(\"click\", e => {\n\t\t\tconst actionCard = e.currentTarget.parentNode;\n\t\t\tif(actionCard.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tHelper.states.cardScriptActionLoadingState(actionCard, true);\n\n\t\t\tconst alias = actionCard.dataset.alias;\n\t\t\trunActionScript(sh_api, alias, resultFlag => {\n\t\t\t\tHelper.states.cardScriptActionLoadingState(actionCard, false);\n\n\t\t\t\tif(resultFlag) {\n\t\t\t\t\tactionCard.classList.add(\"card-success\");\n\t\t\t\t\tsetTimeout(() => actionCard.classList.remove(\"card-success\"), 1000);\n\t\t\t\t}\n\t\t\t});\n\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".action-details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\tconsole.log(\"SCRIPT\", script);\n\t\t\tactionDetailsPopup(script, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction actions(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Actions\",\n\t\talias: \"scripts-actions\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"actions\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.actions_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.regular_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainGrid(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tactions\n}", "import { scopes } from \"./scripts-scopes-screen.js\";\nimport { regular } from \"./scripts-regular-screen.js\";\nimport { actions } from \"./scripts-actions-screen.js\";\n\nexport default {\n\tscopes,\n\tregular,\n\tactions\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Areas Tree`,\n\t\t\troute: \"/#!/areas/tree\",\n\t\t\tis_active: active == \"areas-tree\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/scripts/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t}\n\t]);\n}\n\nexport {\n\tsidebarTemplate\n}", "import { rebootDeviceBtnHandler } from \"../devices/devices-funcs.js\";\n\nexport function areaDevicesModal(area, sh_api) {\n\tconsole.log(\"areaDevicesModal\", area);\n\n\treturn Modals.create(\"area-devices-modal\", {\n\t\ttitle: ` ${area.name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\treturn [ btnCancel ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst devicesContainer = modal.querySelector(\".devices-container\");\n\t\t\tconst loader = modal.querySelector(\".loader\");\n\n\t\t\tsh_api.areas.devices(area.id, (err, data, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.devices\", data);\n\n\t\t\t\tfunction prepareDevicesData(data) {\n\t\t\t\t\tif(!data) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst preparedData = [];\n\t\t\t\t\tfor(let device of data.devices) {\n\t\t\t\t\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\t\t\t\t\tpreparedData.push({\n\t\t\t\t\t\t\tdeviceName: device.name,\n\t\t\t\t\t\t\talias: device.alias,\n\t\t\t\t\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_state),\n\t\t\t\t\t\t\tip: `${device.ip}`,\n\t\t\t\t\t\t\tactions: `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn preparedData;\n\t\t\t\t}\n\n\t\t\t\tconst devices = prepareDevicesData(data?.data);\n\n\t\t\t\tdevicesContainer.innerHTML = Helper.template.table(\n\t\t\t\t\t\"\", \n\t\t\t\t\t{\n\t\t\t\t\t\tdeviceName: \"Device name\", \n\t\t\t\t\t\talias: \"Device alias\", \n\t\t\t\t\t\tstatus: \"Status\", \n\t\t\t\t\t\tip: \"IP\", \n\t\t\t\t\t\tactions: \"Actions\"\n\t\t\t\t\t},\n\t\t\t\t\tdevices,\n\t\t\t\t\t`Total: ${devices.length} devices`\n\t\t\t\t);\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".reboot-btn\").forEach(rebootBtn => {\n\t\t\t\t\trebootBtn.addEventListener(\"click\", e => {\n\t\t\t\t\t\tif(rebootBtn.getAttribute(\"disabled\")) {\n\t\t\t\t\t\t\treturn ;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tloader.remove();\n\n\t\t\t\tconsole.log(\"devices\", devices);\n\t\t\t});\n\t\t}\n\t});\n}", "\nexport function createNewAreaModal(sh_api) {\n\tconsole.log(\"createNewAreaModal\");\n\n\treturn Modals.create(\"create-area-modal\", {\n\t\ttitle: ` Create new Area`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnSubmit = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-success with-icon\"\n\t\t\t}, ` Create`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnSubmit.addEventListener(\"click\", e => {\n\t\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\t\tform.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(form.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = form.querySelectorAll(\"input\");\n\n\t\t\t\tconst inputs = {};\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnSubmit, true);\n\n\t\t\t\tsh_api.areas.new_area(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.areas.new_area\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Creating successful\", `Added new area ID ${inputs.alias}`).show();\n\t\t\t\t\t}, 300);\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnSubmit ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\tform.querySelectorAll(\".input\").forEach(i => {\n\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t});\n\t\t}\n\t});\n}", "export function areaDetailsModal(area, sh_api) {\n\tconsole.log(\"areaDetailsModal\", area);\n\n\treturn Modals.create(\"create-area-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t// Details\n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ` Remove`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRemove.addEventListener(\"click\", e => {\n\t\t\t\tHelper.states.btnLoadingState(btnRemove, true);\n\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to remove this area? ${area.display_name}`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.remove(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\tArea: ${area.display_name}\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRemove ];\n\t\t},\n\t\tonready: modal => {\n\t\t\t\n\t\t}\n\t});\n}", "import { sidebarTemplate } from \"./areas-funcs.js\";\nimport { areaDevicesModal } from \"./areas-devices-modal.js\";\nimport { createNewAreaModal } from \"./areas-create-new-modal.js\";\nimport { areaDetailsModal } from \"./areas-details-modal.js\";\n\nfunction makeTree(data) {\n\tconst items = data.areas;\n\n\tconst map = {};\n const roots = [];\n\n for (const item of items) {\n map[item.id] = { ...item, children: [] };\n }\n\n for (const item of items) {\n const node = map[item.id];\n\n if (item.parent_id && map[item.parent_id]) {\n map[item.parent_id].children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\nfunction prepareData(data) {\n\tconst tree = makeTree(data);\n\treturn tree;\n}\n\nfunction renderingBranch(branch) {\n\tlet html = `
    `;\n\thtml += `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t ${branch.display_name}\n\t\t\t\t\t[\n\t\t\t\t\t${branch.type}\n\t\t\t\t\t ${branch.alias}\n\t\t\t\t\t]\n\t\t\t\t
    \n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n\n\tif(branch.children?.length) {\n\t\tfor(let childBranch of branch.children) {\n\t\t\thtml += renderingBranch(childBranch);\n\t\t}\n\t}\n\n\thtml += \"
    \";\n\treturn html;\n}\n\nfunction renderingAreasTree(scr, tree) {\n\tconsole.log(\"TREE\", tree);\n\tlet html = `
    `;\n\tfor(let branch of tree) {\n\t\thtml += renderingBranch(branch);\n\t}\n\thtml += \"
    \";\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container .tree-container\").innerHTML = html;\n}\n\nfunction initAreasTree(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.devices\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst areaId = btn.dataset.areaId;\n\t\t\tconst name = btn.dataset.areaName;\n\n\t\t\tareaDevicesModal({ id: areaId, name }, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.details\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst currentBtn = e.currentTarget;\n\t\t\tconst area = {\n\t\t\t\tid: currentBtn.dataset.areaId,\n\t\t\t\tdisplay_name: currentBtn.dataset.areaName\n\t\t\t};\n\n\t\t\tareaDetailsModal(area, sh_api).show();\n\t\t});\n\t});\n\n\tscr.ready();\n}\n\nfunction areasTree(sh_api) {\n\treturn {\n\t\ttitle: \"Areas Tree\",\n\t\talias: \"areas-tree\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(\n\t\t\t\tsidebarTemplate(\"areas-tree\"), \n\t\t\t\t`
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    Areas Tree

    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t`\n\t\t\t);\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.areas.list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingAreasTree(scr, prepareData(resp.data));\n\t\t\t\tinitAreasTree(scr, sh_api);\n\n\t\t\t\tscr.currentScreen.DOMObject.querySelector(\".create-new-area-modal\").addEventListener(\"click\", e => {\n\t\t\t\t\tcreateNewAreaModal(sh_api).show();\n\t\t\t\t});\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tareasTree\n}", "import { areasTree } from \"./areas-tree-screen.js\";\n\nexport default {\n\tareasTree\n}", "import devices from \"./components/screens/devices/devices.js\";\nimport scripts from \"./components/screens/scripts/scripts.js\";\nimport areas from \"./components/screens/areas/areas.js\";\n\nfunction routes(screens, sh_api) {\n\tscreens.add(\"/\", {\n\t\talias: \"home\",\n\t\trenderer: () => {\n\t\t\treturn `

    Hello world

    `;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsetTimeout(() => scr.ready(), 1000);\n\t\t\tsetTimeout(() => scr.error(\"Error\", \"Just testing\"), 2000);\n\t\t}\n\t});\n\n\tscreens.add(\"-\", {\n\t\talias: \"not-found-screen\",\n\t\trenderer: () => {\n\t\t\treturn `

    404 NOT FOUND

    `;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tscr.ready();\n\t\t}\n\t});\n\n\tscreens.add(\"/devices\", devices.list(sh_api));\n\tscreens.add(\"/devices/scanning\", devices.scanning(sh_api));\n\tscreens.add(\"/scripts/scopes\", scripts.scopes(sh_api));\n\tscreens.add(\"/scripts/regular\", scripts.regular(sh_api));\n\tscreens.add(\"/scripts/actions\", scripts.actions(sh_api));\n\tscreens.add(\"/areas/tree\", areas.areasTree(sh_api));\n}\n\nexport {\n\troutes\n}", "function template(id, title, footer) {\n\treturn `\n\t\t
    \n
    \n\n
    \n
    \n

    ${title}

    \n \n
    \n\n
    \n
    ${footer}
    \n
    \n
    \n\t`;\n}\n\nfunction init(modal, onready) {\n\tmodal.show = function() {\n\t\tdocument.querySelector(\"body\").append(modal);\n\n\t\tsetTimeout(() => {\n\t\t\tthis.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tmodal.close = function() {\n\t\tthis.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n\n\tmodal.querySelector(\".modal-close\").addEventListener(\"click\", e => {\n\t\tmodal.close();\n\t});\n\n\tif(typeof onready == \"function\") {\n\t\tonready(modal);\n\t}\n\n\treturn modal;\n}\n\n\t/**\n\t * Create new modal window;\n\t * @param {string} id Uniq id (selector)\n\t * @param {string} title Display title\n\t * @param {object} props { body: modal => {}, actions => modal => {} }\n\t * @return {object} DOM object\n\t */\nfunction create(id, props) {\n\tconst title = props.title || \"\";\n\tconst footer = props.footer || \"\";\n\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(id, title, footer);\n\tconst modal = div.childNodes[1];\n\n\tconst modalBody = modal.querySelector(\".modal-body\");\n\tconst modalFooter = modal.querySelector(\".modal-footer\");\n\n\tif(typeof props.actions == \"function\") {\n\t\tconst actionsResult = props.actions(modal);\n\n\t\tif(typeof actionsResult[0] == \"object\") {\n\t\t\tconst actions = document.createElement(\"div\");\n\t\t\tactions.classList.add(\"actions\");\n\t\t\tfor(let actionElement of actionsResult) {\n\t\t\t\tactions.append(actionElement);\n\t\t\t}\n\n\t\t\tmodalFooter.append(actions);\n\t\t}\n\t}\n\n\tif(typeof props.body == \"function\") {\n\t\tconst bodyResult = props.body(modal);\n\n\t\tif(typeof bodyResult == \"object\") {\n\t\t\tmodalBody.append(bodyResult);\n\t\t} else if(typeof bodyResult == \"string\") {\n\t\t\tmodalBody.innerHTML = bodyResult;\n\t\t}\n\t}\n\n\treturn init(modal, props?.onready);\n}\n\nexport default {\n\tcreate\n}", "export default function confirmPopup(text, confirmedCb, canceledCb) {\n\tModals.create(\"confirm-popup\", {\n\t\ttitle: `Requires confirmation`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t

    ${text}

    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonNO = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"NO\");\n\t\t\tconst buttonYES = Helper.template.createElement(\"button\", { class: \"btn btn-warning\" }, \"YES\");\n\n\t\t\tbuttonNO.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tcanceledCb();\n\t\t\t});\n\n\t\t\tbuttonYES.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tconfirmedCb();\n\t\t\t});\n\n\t\t\treturn [ buttonNO, buttonYES ];\n\t\t}\n\t}).show();\n}", "import { hud, navigationShow, navigationHide } from \"./components/hud.js\";\nimport { Screens } from \"./components/Screens.js\";\nimport Toasts from \"./components/toasts.js\"\nimport Helper from \"./components/helper.js\"\nimport { SmartHomeApi } from \"./sh/SmartHomeApi.js\";\nimport { routes } from \"./routes.js\";\nimport Modals from \"./components/modals.js\";\nimport confirmPopup from \"./components/confirm-popup.js\";\n\ndocument.addEventListener(\"DOMContentLoaded\", e => {\n\tconsole.log(\"App init\");\n\n\twindow.Toasts = Toasts;\n\twindow.Helper = Helper;\n\twindow.Modals = Modals;\n\twindow.confirmPopup = confirmPopup;\n\n\thud();\n\tconst sh_api = new SmartHomeApi({\n\t base_url: \"http://shswebclient.local\",\n\t token: \"YOUR_TOKEN\",\n\t timeout_ms: 3000,\n\t on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n\t proxy_path: \"/proxy.php\",\n\t});\n\n\t// api.scripts.actions_list((err, data, meta) => console.log(data));\n\t// api.scripts.scopes_list((err, data, meta) => console.log(data));\n\t// api.devices.info(4, (err, data, meta) => console.log(data));\n\n\tconst screens = new Screens(\".screens\", \".load-screen\", \".error-screen\");\n\t\n\troutes(screens, sh_api);\n\n\tconsole.log(screens.getScreens());\n\n\tscreens.onSwitch((scr, alias) => {\n\t\tnavigationHide();\n\t});\n\n\tscreens.routing();\n\n\twindow.Screens = screens;\n});"], - "mappings": "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", - "names": ["navToggleBtn", "navigation", "reloadScreenBtn", "navigationShow", "navigationHide", "hud", "e", "Screens", "screensContainerSelector", "loaderSelector", "errorScreenSelector", "route", "screen", "__spreadValues", "alias", "_a", "screenContainer", "title", "text", "cb", "handler", "template", "type", "icon", "title", "text", "init", "toast", "props", "i", "e", "scr", "alias", "lifetimeInterval", "create", "div", "createSuccess", "createInfo", "createWarning", "createError", "toasts_default", "sidebarNav", "items", "listItems", "item", "aOpen", "aClose", "table", "caption", "columns", "data", "tfoot", "head", "totalColumns", "key", "body", "column", "foot", "tableCaption", "tableHead", "createElement", "type", "props", "content", "node", "value", "createAlert", "deviceFieldsUnification", "map", "dataObj", "field", "btnLoadingState", "btn", "isLoading", "cardScriptActionLoadingState", "card", "iconContainer", "mainTemplate", "sidebar", "connectionStatusBadge", "status", "toogleStateBadge", "state", "helper_default", "ScriptsApi", "core", "cb", "filename", "safe", "payload", "alias", "name", "DevicesApi", "core", "cb", "payload", "id", "safe", "AreasApi", "core", "cb", "area_id", "safe", "payload", "build_query", "params", "usp", "k", "v", "s", "join_url", "base_url", "path", "b", "p", "safe_json_parse", "text", "SmartHomeApi", "opts", "ScriptsApi", "DevicesApi", "AreasApi", "token", "proxy_path", "extra_query", "q", "__spreadValues", "method", "body", "cb", "callback", "url", "controller", "timeout_ms", "t", "headers", "payload", "res", "__async", "meta", "parsed", "data", "err", "_", "st", "e", "api_path", "sidebarTemplate", "active", "rebootDeviceBtnHandler", "sh_api", "btn", "modal", "deviceId", "deviceName", "deviceAlias", "err", "data", "meta", "deviceDetailsPopup", "device", "sh_api", "modal", "deviceProperties", "field", "buttonCancel", "buttonReboot", "buttonRemove", "e", "rebootDeviceBtnHandler", "err", "data", "meta", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "rebootDeviceBtnHandler", "deviceDetailsPopup", "list", "sidebarTemplate", "err", "resp", "meta", "deviceSetupFormPopup", "device", "sh_api", "modal", "deviceProperties", "field", "buttonCancel", "e", "buttonSubmit", "inputs", "setupForm", "i", "inputElements", "textareaElement", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "deviceSetupFormPopup", "scanning", "sidebarTemplate", "err", "resp", "meta", "devices_default", "list", "scanning", "sidebarTemplate", "active", "runActionScript", "sh_api", "alias", "cb", "err", "data", "meta", "prepareData", "data", "preparedData", "scope", "btnSwitch", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "methName", "err", "meta", "scopes", "sidebarTemplate", "resp", "prepareData", "data", "preparedData", "script", "btnSwitch", "renderingMainTable", "scr", "total", "provideSciptsData", "i", "initMainTableInteractiveElements", "sh_api", "btn", "e", "_a", "methName", "err", "meta", "regular", "sidebarTemplate", "resp", "actionDetailsPopup", "script", "sh_api", "modal", "btnCancel", "btnChangeState", "btnRun", "e", "btn", "methName", "err", "data", "meta", "runActionScript", "resultFlag", "prepareData", "data", "_a", "preparedData", "script", "renderingMainGrid", "scr", "total", "grid", "provideSciptsData", "item", "cardColor", "mainContainer", "initMainTableInteractiveElements", "sh_api", "actionCard", "e", "alias", "runActionScript", "resultFlag", "btn", "actionDetailsPopup", "actions", "sidebarTemplate", "err", "resp", "meta", "scripts_default", "scopes", "regular", "actions", "sidebarTemplate", "active", "areaDevicesModal", "area", "sh_api", "modal", "btnCancel", "e", "devicesContainer", "loader", "err", "data", "meta", "prepareDevicesData", "preparedData", "device", "devices", "rebootBtn", "rebootDeviceBtnHandler", "createNewAreaModal", "sh_api", "modal", "btnCancel", "btnSubmit", "e", "form", "i", "inputElements", "inputs", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "areaDetailsModal", "area", "sh_api", "modal", "btnCancel", "btnRemove", "e", "err", "data", "meta", "makeTree", "data", "items", "map", "roots", "item", "__spreadProps", "__spreadValues", "node", "prepareData", "renderingBranch", "branch", "_a", "html", "childBranch", "renderingAreasTree", "scr", "tree", "initAreasTree", "sh_api", "btn", "e", "areaId", "name", "areaDevicesModal", "currentBtn", "area", "areaDetailsModal", "areasTree", "sidebarTemplate", "err", "resp", "meta", "createNewAreaModal", "areas_default", "areasTree", "routes", "screens", "sh_api", "scr", "devices_default", "scripts_default", "areas_default", "template", "id", "title", "footer", "init", "modal", "onready", "e", "create", "props", "div", "modalBody", "modalFooter", "actionsResult", "actions", "actionElement", "bodyResult", "modals_default", "confirmPopup", "text", "confirmedCb", "canceledCb", "modal", "buttonNO", "buttonYES", "e", "e", "toasts_default", "helper_default", "modals_default", "confirmPopup", "hud", "sh_api", "SmartHomeApi", "error", "screens", "Screens", "routes", "scr", "alias", "navigationHide"] + "sourcesContent": ["let navToggleBtn;\nlet navigation;\nlet reloadScreenBtn;\n\nfunction navigationShow() {\n\tnavToggleBtn.dataset.navState = \"displayed\";\n\tnavToggleBtn.classList.remove(\"state-off\");\n\tnavToggleBtn.classList.add(\"state-on\");\n\n\tnavigation.classList.add(\"a-show\");\n}\n\nfunction navigationHide() {\n\tnavToggleBtn.dataset.navState = \"hidden\";\n\tnavToggleBtn.classList.remove(\"state-on\");\n\tnavToggleBtn.classList.add(\"state-off\");\n\n\tnavigation.classList.add(\"a-hide\");\n\tnavigation.classList.remove(\"a-show\");\n\n\tsetTimeout(() => {\n\t\tnavigation.classList.remove(\"a-hide\");\n\t}, 300);\n}\n\nfunction hud() {\n\tconsole.log(\"HUD init\");\n\n\tnavToggleBtn = document.querySelector(\".hud .nav-toggle\");\n\tnavigation = document.querySelector(\".hud .navigation\");\n\treloadScreenBtn = document.querySelector(\".hud .reload-screen\");\n\n\tnavToggleBtn.addEventListener(\"click\", e => {\n\t\tif(e.currentTarget.dataset.navState != \"displayed\") {\n\t\t\tnavigationShow();\n\t\t} else {\n\t\t\tnavigationHide();\n\t\t}\n\t});\n\n\treloadScreenBtn.addEventListener(\"click\", e => {\n\t\tScreens.reload();\n\t});\n}\n\nexport {\n\thud,\n\tnavigationShow,\n\tnavigationHide\n}", "export class Screens {\n\tconstructor(screensContainerSelector, loaderSelector, errorScreenSelector) {\n\t\tthis.screens = {};\n\t\tthis.routesMap = {};\n\t\tthis.currentScreen = null;\n\t\tthis.eventsHandlers = {\n\t\t\tswitch: [],\n\t\t\treload: [],\n\t\t\treinit: []\n\t\t};\n\n\t\tthis.screensContainer = document.querySelector(screensContainerSelector);\n\t\tthis.loader = document.querySelector(loaderSelector);\n\t\tthis.errorScreen = document.querySelector(errorScreenSelector);\n\t\tconsole.log(\"Screens Init\");\n\t}\n\n\t/**\n\t * \u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0438 \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C\u0438 \u044D\u043A\u0440\u0430\u043D\u0430\n\t * @param {string} route Like `/path/name`\n\t * @param {void} screen {alias, renderer, initer}\n\t */\n\tadd(route, screen) {\n\t\tif(typeof screen != \"object\") {\n\t\t\treturn console.error(\"Screens: screens must be object\");\n\t\t}\n\t\t\n\t\tif(typeof screen?.alias == \"undefined\") {\n\t\t\treturn console.error(\"Screens: undefined alias\");\n\t\t}\n\n\t\tif(typeof screen?.renderer != \"function\") {\n\t\t\treturn console.error(\"Screens: renderer must be function\");\n\t\t}\n\n\t\tthis.screens[screen.alias] = {\n\t\t\troute: route,\n\t\t\t...screen\n\t\t};\n\n\t\tthis.routesMap[route] = screen.alias;\n\t}\n\n\tswitch(alias) {\t\t\n\t\tthis.runSwitchHandlers(alias);\n\t\tthis.hideErrorScreen();\n\t\tthis.showLoader();\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\t\n\t\tif(typeof this.screens[alias] == \"undefined\") {\n\t\t\tconsole.error(`Screens: \"${alias}\" not found`);\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen = this.screens[alias];\n\t\t\n\t\tconst screenContainer = document.createElement(\"div\");\n\t\tscreenContainer.classList.add(\"screen\");\n\t\tscreenContainer.id = alias;\n\t\tscreenContainer.dataset.alias = alias;\n\t\tscreenContainer.innerHTML = this.currentScreen.renderer();\n\t\tthis.currentScreen.DOMObject = screenContainer;\n\t\tthis.screensContainer.append(this.currentScreen.DOMObject);\n\n\t\tthis.currentScreen.initer(this);\n\t}\n\n\treload() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.runReloadHandlers(this.currentScreen.alias);\n\t\tthis.switch(this.currentScreen.alias);\n\t}\n\n\treinit() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen.initer(this);\n\t\tthis.runReinitHandlers();\n\t}\n\n\trouting() {\n\t\tsetInterval(() => {\n\t\t\tconst route = document.location.hash.split(\"#!\")[1];\n\t\t\tif(typeof route == \"undefined\" || route == \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst alias = (typeof this.routesMap[route] == \"undefined\") \n\t\t\t\t? \"not-found-screen\"\n\t\t\t\t: this.routesMap[route];\n\n\t\t\tif(!this.currentScreen || this.currentScreen.alias != alias) {\n\t\t\t\tthis.switch(alias);\n\t\t\t}\n\t\t}, 50);\n\t}\n\n\tready() {\n\t\tif(this.currentScreen == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!this.currentScreen.DOMObject) {\n\t\t\tthis.currentScreen.DOMObject = document.getElementsById(this.currentScreen.alias);\n\t\t}\n\n\t\tthis.hideLoader();\n\t\tthis.currentScreen.DOMObject.classList.add(\"a-show\");\n\t}\n\n\terror(title, text) {\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\tthis.errorScreen.querySelector(\".error-title\").innerHTML = title;\n\t\tthis.errorScreen.querySelector(\".error-text\").innerHTML = text;\n\t\tthis.showErrorScreen();\n\t}\n\n\thideLoader() {\n\t\tthis.loader.classList.remove(\"a-show\");\n\t}\n\n\tshowLoader() {\n\t\tthis.loader.classList.add(\"a-show\");\n\t}\n\n\tshowErrorScreen() {\n\t\tthis.errorScreen.classList.add(\"a-show\");\n\t}\n\n\thideErrorScreen() {\n\t\tthis.errorScreen.classList.remove(\"a-show\");\n\t}\n\n\tgetScreens() {\n\t\treturn this.screens;\n\t}\n\n\tgetRoutesMap() {\n\t\treturn this.routesMap;\n\t}\n\n\tonSwitch(cb) {\n\t\tthis.eventsHandlers.switch.push(cb);\n\t}\n\n\tonReaload(cb) {\n\t\tthis.eventsHandlers.reload.push(cb);\n\t}\n\n\tonReinit(cb) {\n\t\tthis.eventsHandlers.reinit.push(cb);\n\t}\n\n\trunSwitchHandlers(alias) {\n\t\tfor(let handler of this.eventsHandlers.switch) {\n\t\t\thandler(this, alias);\n\t\t}\n\t}\n\n\trunReloadHandlers(alias) {\n\t\tfor(let handler of this.eventsHandlers.reload) {\n\t\t\thandler(this, alias);\n\t\t}\n\t}\n\n\trunReinitHandlers() {\n\t\tfor(let handler of this.eventsHandlers.reinit) {\n\t\t\thandler(this);\n\t\t}\n\t}\n}", "function template(type, icon, title, text) {\n\treturn `\n\t\t
    \n\t
    \n\t

    ${icon} ${title}

    \n\t

    ${text}

    \n\t
    \n\t \n\t
    \n\t`;\n}\n\nfunction init(toast, props) {\n\tif(props?.alone) {\n\t\tdocument.querySelectorAll(\".toast\").forEach(i => i.close());\n\t}\n\n\ttoast.close = function() {\n\t\tthis.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n\n\ttoast.querySelector(\".toast-close\").addEventListener(\"click\", e => {\n\t\ttoast.close();\n\t});\n\n\ttoast.show = function() {\n\t\tdocument.querySelector(\"body\").append(toast);\n\n\t\tsetTimeout(() => {\n\t\t\ttoast.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tScreens.onSwitch((scr, alias) => {\n\t\tsetTimeout(() => {\n\t\t\ttoast?.close();\n\t\t}, 10000);\n\t});\n\n\ttoast.addEventListener(\"mouseover\", e => toast.ishovered = true);\n\ttoast.addEventListener(\"mouseout\", e => toast.ishovered = false);\n\n\tif(props?.lifetime) {\n\t\tconsole.log(props);\n\t\tconst lifetimeInterval = setInterval(() => {\n\t\t\tif(!toast.ishovered) {\n\t\t\t\ttoast.close();\n\t\t\t\tclearInterval(lifetimeInterval);\n\t\t\t}\n\t\t}, props?.lifetime);\n\t}\n\n\treturn toast;\n}\n\nfunction create(type, icon, title, text, props) {\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(type, icon, title, text);\n\n\treturn init(div.childNodes[1], props);\n}\n\nfunction createSuccess(title, text, props) {\n\tif(typeof props == \"undefined\") {\n\t\tprops = {};\n\t}\n\n\tif(typeof props.lifetime == \"undefined\") {\n\t\tprops.lifetime = 4000;\n\t}\n\n\tif(typeof props.alone == \"undefined\") {\n\t\tprops.alone = true;\n\t}\n\n\treturn create(\n\t\t\"success\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createInfo(title, text, props) {\n\treturn create(\n\t\t\"info\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createWarning(title, text, props) {\n\treturn create(\n\t\t\"warning\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createError(title, text, props) {\n\treturn create(\n\t\t\"danger\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nexport default {\n create,\n createInfo,\n createSuccess,\n createWarning,\n createError,\n \"createDanger\": createError\n};", "function sidebarNav(items) {\n\tlet listItems = \"\";\n\n\tfor(let item of items) {\n\t\tlet aOpen = \"\";\n\t\tlet aClose = \"\";\n\t\tif(item.route) {\n\t\t\taOpen = ``;\n\t\t\taClose = ``;\n\t\t}\n\n\t\tlistItems += `\n\t\t\t
  • \n\t\t\t\t${aOpen}${item.content}${aClose}\n\t\t\t
  • \n\t\t`;\n\t}\n\n\treturn `\n\t\t
    \n\t\t\t
      \n\t\t\t\t${listItems} \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction table(caption, columns, data, tfoot) {\n\tlet head = ``;\n\tlet totalColumns = 0;\n\tfor(let key in columns) {\n\t\thead += `${columns[key]}`;\n\t\ttotalColumns++;\n\t}\n\thead += \"\";\n\n\tlet body = ``;\n\tfor(let item of data) {\n\t\tbody += ``;\n\t\tfor(let column in columns) {\n\t\t\tbody += `${item[column]}`;\n\t\t}\n\t\tbody += ``;\n\t}\n\n\tlet foot = \"\";\n\tif(typeof tfoot != \"undefined\") {\n\t\tfoot = `\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t${tfoot}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`\n\t}\n\n\tconst tableCaption = caption \n\t\t? `${caption}`\n\t\t: '';\n\n\tconst tableHead = data.length \n\t\t? `${head}`\n\t\t: '';\n\n\tbody = data.length\n\t\t? body\n\t\t: `Empty`;\n\n\tconst tableEmptyClass = !data.length \n\t\t? \"table-empty\"\n\t\t: \"\";\n\n\treturn `\n\t\t\n\t\t\t${tableCaption}\n\t\t\t${tableHead}\n\t\t\t${body}\n\t\t\t${foot}\n\t\t
    \n\t`;\n}\n\nfunction createElement(type, props, content) {\n\tconst node = document.createElement(type);\n\n\tfor (const [key, value] of Object.entries(props)) {\n\t\tif (key === \"class\") {\n\t\t\tnode.className = value;\n\t\t} else if (key === \"dataset\") {\n\t\t\tObject.assign(node.dataset, value);\n\t\t} else {\n\t\t\tnode.setAttribute(key, value);\n\t\t}\n\t}\n\n\tnode.innerHTML = (typeof content != \"undefined\") ? content : \"\";\n\treturn node; \n}\n\nfunction createAlert(type, content) {\n\tif([\"primary\", \"success\", \"secondary\", \"info\", \"warning\", \"error\", \"danger\"].indexOf(type) < 0) {\n\t\treturn console.error(\"createAlert()\", \"Error of type: \" + type);\n\t}\n\n\treturn createElement(\"div\", {\n\t\tclass: `alert alert-${type}`,\n\t}, content);\n}\n\nfunction deviceFieldsUnification(data) {\n\tconst map = {\n\t\t\"device_name\": \"name\",\n\t\t\"device_hard_id\": \"device_id\",\n\t\t\"device_ip\": \"ip\",\n\t\t\"device_type\": \"type\",\n\t\t\"ip_address\": \"ip\",\n\t\t\"mac_address\": \"mac\",\n\t\t\"device_mac\": \"mac\",\n\t\t\"core_version\": \"firmware_core_version\"\n\t};\n\n\tconst dataObj = {};\n\n\tfor(let field in data) {\n\t\tif(typeof map[field] != \"undefined\") {\n\t\t\tdataObj[ map[field] ] = data[field];\n\t\t\tcontinue;\n\t\t}\n\n\t\tdataObj[field] = data[field];\n\t}\n\n\treturn dataObj;\n}\n\nfunction btnLoadingState(btn, isLoading) {\n\tif(btn?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tif(isLoading) {\n\t\tbtn.isLoading = true;\n\t\tbtn.originalContent = btn.innerHTML;\n\t\tif(btn.classList.contains(\"with-icon\")) {\n\t\t\tbtn.originalWithIcon = true;\n\t\t} else {\n\t\t\tbtn.classList.add(\"with-icon\");\n\t\t}\n\n\t\tbtn.classList.add(\"loading-state\");\n\t\tbtn.setAttribute(\"disabled\", \"disabled\");\n\t\tbtn.innerHTML = ` Loading`;\n\t} else {\n\t\tbtn.isLoading = false;\n\t\tif(!btn.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tbtn.removeAttribute(\"disabled\");\n\t\tbtn.classList.remove(\"loading-state\");\n\t\tif(!btn.originalWithIcon) {\n\t\t\tbtn.classList.remove(\"with-icon\");\n\t\t}\n\t\tbtn.innerHTML = btn.originalContent;\n\t}\n\n\treturn btn;\n}\n\nfunction cardScriptActionLoadingState(card, isLoading) {\n\tif(card?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tconst iconContainer = card.querySelector(\".device-icon\");\n\n\tif(isLoading) {\n\t\tcard.isLoading = true;\n\t\tcard.originalContent = iconContainer.innerHTML;\n\t\tcard.classList.add(\"loading-state\");\n\t\tcard.setAttribute(\"disabled\", \"disabled\");\n\t\ticonContainer.innerHTML = ``;\n\t} else {\n\t\tcard.isLoading = false;\n\t\tif(!card.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tcard.removeAttribute(\"disabled\");\n\t\tcard.classList.remove(\"loading-state\");\n\t\ticonContainer.innerHTML = card.originalContent;\n\t}\n\n\treturn card;\n}\n\nfunction mainTemplate(sidebar, content) {\n\tcontent = content ?? \"\";\n\treturn `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${sidebar}\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${content}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction connectionStatusBadge(status) {\n\treturn status == \"active\"\n\t\t? `Online`\n\t\t: `Offline`;\n}\n\nfunction toogleStateBadge(state) {\n\treturn state == \"enabled\"\n\t\t? `Enabled`\n\t\t: `Disabled`;\n}\n\nexport default {\n\ttemplate: {\n\t\tsidebarNav,\n\t\ttable,\n\t\tcreateElement,\n\t\tcreateAlert,\n\t\tmainTemplate,\n\t\tconnectionStatusBadge,\n\t\ttoogleStateBadge\n\t},\n\tunification: {\n\t\tdeviceFieldsUnification\n\t},\n\tstates: {\n\t\tbtnLoadingState,\n\t\tcardScriptActionLoadingState\n\t}\n}", "/* =========================\n Scripts module\n========================= */\n\nexport class ScriptsApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/scripts/actions/list\n\tactions_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/actions/list\", cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/list\n\tscopes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/scopes/list\", cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/list\n\tregular_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/regular/list\", cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{filename}}\n\tscope_get_by_filename(filename, cb) {\n\t\tconst safe = encodeURIComponent(String(filename || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}`, cb, {\n\t\t\t// \u0442\u0443\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043C\u043E\u0436\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u044C PHP-\u043A\u043E\u0434 \u0442\u0435\u043A\u0441\u0442\u043E\u043C; request \u0443\u043C\u0435\u0435\u0442 \u044D\u0442\u043E \u043F\u0435\u0440\u0435\u0436\u0438\u0442\u044C\n\t\t});\n\t}\n\n\t// POST /api/v1/scripts/scopes/new\n\tscope_create(payload, cb) {\n\t\t// payload: { alias, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/new\", payload, cb);\n\t}\n\n\t// POST /api/v1/scripts/scopes/update\n\tscope_update(payload, cb) {\n\t\t// payload: { name, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/update\", payload, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/enable\n\taction_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/disable\n\taction_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/enable\n\tregular_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/disable\n\tregular_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scope/name/{{name}}/enable\n\tscope_enable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/scope/name/{{name}}/disable\n\tscope_disable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{name}}/remove\n\tscope_remove(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/scripts/actions/run\n\trun(payload, cb) {\n\t\t// payload: { alias, params: {...} }\n\t\treturn this.core.api_post(\"/api/v1/scripts/actions/run\", payload, cb);\n\t}\n}", "/* =========================\n Devices module\n========================= */\n\nexport class DevicesApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/devices/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/list\", cb);\n\t}\n\n\t// GET /api/v1/devices/scanning/setup\n\tscanning_setup(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/setup\", cb);\n\t}\n\n\t// GET /api/v1/devices/scanning/all\n\tscanning_all(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/all\", cb);\n\t}\n\n\t// POST /api/v1/devices/setup/new-device\n\tsetup_new_device(payload, cb) {\n\t\t// payload: { device_ip, alias, name, description }\n\t\treturn this.core.api_post(\"/api/v1/devices/setup/new-device\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/info\n\tinfo(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/info`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}\n\tget(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/status\n\tstatus(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/status`, cb);\n\t}\n\n\t// POST /api/v1/devices/action\n\taction(payload, cb) {\n\t\t// payload: { device_id, action, params }\n\t\treturn this.core.api_post(\"/api/v1/devices/action\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/remove\n\tremove(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/remove`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/reboot\n\treboot(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/reboot`, cb);\n\t}\n}\n", "export class AreasApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/areas/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/list\", cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/list\n\tinner_list(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/list`, cb);\n\t}\n\n\t// POST /api/v1/areas/new-area\n\tnew_area(payload, cb) {\n\t\t// payload: { type, alias, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/new-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/remove\n\tremove(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/areas/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_area_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/areas/place-in-area\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-display-name\n\tupdate_display_name(payload, cb) {\n\t\t// payload: { area_id, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-display-name\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-alias\n\tupdate_alias(payload, cb) {\n\t\t// payload: { area_id, new_alias }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-alias\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/devices\n\tdevices(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/devices`, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/unassign-from-area\n\tunassign_from_area(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/unassign-from-area`, cb);\n\t}\n\n\t// GET /api/v1/areas/types/list\n\ttypes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/types/list\", cb);\n\t}\n\n\t// GET /api/v1/areas/reboot_devices\n\t// GET /api/v1/areas/id/{{area_id}}/reboot_devices\n\treboot_devices(area_id, cb) {\n\t\tif (area_id === undefined || area_id === null) {\n\t\t\treturn this.core.api_get(\"/api/v1/areas/reboot_devices\", cb);\n\t\t}\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/reboot_devices`, cb);\n\t}\n}", "/**\n * smart_home_api.js\n *\n * \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F JS-\u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u0434\u043B\u044F REST-\u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (callback-style).\n * - \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F: Bearer token (\u0438\u043B\u0438 \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u0435\u0441\u043B\u0438 \u043F\u043E\u043C\u0435\u043D\u044F\u0435\u0448\u044C)\n * - \u0415\u0434\u0438\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A: \u0441\u0435\u0442\u0435\u0432\u044B\u0435, \u0442\u0430\u0439\u043C\u0430\u0443\u0442, \u043D\u0435-JSON, \u0441\u0442\u0430\u0442\u0443\u0441=false/error\n * - \u041C\u043E\u0434\u0443\u043B\u0438: \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043E\u043B\u044C\u043A\u043E Scripts, \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0438\n */\n\nimport { ScriptsApi } from \"./modules/ScriptsApi.js\";\nimport { DevicesApi } from \"./modules/DevicesApi.js\";\nimport { AreasApi } from \"./modules/AreasApi.js\";\n\n/* =========================\n Utils\n========================= */\n\nfunction build_query(params) {\n\tif (!params || typeof params !== \"object\") return \"\";\n\tconst usp = new URLSearchParams();\n\tObject.entries(params).forEach(([k, v]) => {\n\t\tif (v === undefined || v === null) return;\n\t\tusp.append(k, String(v));\n\t});\n\tconst s = usp.toString();\n\treturn s ? `?${s}` : \"\";\n}\n\nfunction join_url(base_url, path) {\n\tconst b = String(base_url || \"\").replace(/\\/+$/, \"\");\n\tconst p = String(path || \"\").replace(/^\\/+/, \"\");\n\treturn `${b}/${p}`;\n}\n\nfunction safe_json_parse(text) {\n\ttry {\n\t\treturn { ok: true, data: JSON.parse(text) };\n\t} catch (e) {\n\t\treturn { ok: false, error: e };\n\t}\n}\n\n/* =========================\n Core client\n========================= */\n\nexport class SmartHomeApi {\n\t/**\n\t * @param {Object} opts\n\t * @param {string} opts.base_url - \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: http://192.168.2.101\n\t * @param {string} [opts.token] - \u0442\u043E\u043A\u0435\u043D \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0438\n\t * @param {number} [opts.timeout_ms=15000]\n\t * @param {Object} [opts.default_headers]\n\t * @param {Function} [opts.on_unauthorized] - cb(details)\n\t * @param {string} [opts.proxy_path] \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \"/proxy.php\" (\u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u043A\u0441\u0438)\n\t */\n\tconstructor(opts) {\n\t\tthis.base_url = opts?.base_url || \"\";\n\t\tthis.token = opts?.token || \"\";\n\t\tthis.timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : 15000;\n\t\tthis.default_headers = opts?.default_headers || {};\n\t\tthis.on_unauthorized = typeof opts?.on_unauthorized === \"function\" ? opts.on_unauthorized : null;\n\t\tthis.proxy_path = opts?.proxy_path || \"\"; // \"\" => \u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0441\u0438\n\n\t\t// modules\n\t\tthis.scripts = new ScriptsApi(this);\n\t\tthis.devices = new DevicesApi(this);\n\t\tthis.areas = new AreasApi(this);\n\t}\n\n\tset_base_url(base_url) {\n\t\tthis.base_url = base_url || \"\";\n\t}\n\n\tset_token(token) {\n\t\tthis.token = token || \"\";\n\t}\n\n\tset_proxy_path(proxy_path) {\n\t\tthis.proxy_path = proxy_path || \"\";\n\t}\n\n\t_wrap_path(path, extra_query) {\n\t\t// \u0415\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0451\u043D \u043F\u0440\u043E\u043A\u0441\u0438 \u2014 \u0445\u043E\u0434\u0438\u043C \u043D\u0430 /proxy.php?path=&...\n\t\tif (!this.proxy_path) {\n\t\t\tif (!extra_query) return path;\n\t\t\treturn `${path}${build_query(extra_query)}`;\n\t\t}\n\n\t\tconst q = { path, ...(extra_query || {}) };\n\t\treturn `${this.proxy_path}${build_query(q)}`;\n\t}\n\n\t/**\n\t * \u0423\u043D\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441.\n\t *\n\t * cb(err, data, meta)\n\t * - err: { type, message, status_code?, raw?, details? }\n\t * - data: \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u0439 json (\u0438\u043B\u0438 string, \u0435\u0441\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0432\u0435\u0440\u043D\u0443\u043B json)\n\t * - meta: { url, method, status_code, headers }\n\t */\n\trequest(method, path, body, cb, opts) {\n\t\tconst callback = typeof cb === \"function\" ? cb : () => {};\n\t\tconst url = join_url(this.base_url, path);\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : this.timeout_ms;\n\n\t\tconst t = setTimeout(() => controller.abort(), timeout_ms);\n\n\t\tconst headers = {\n\t\t\t...this.default_headers,\n\t\t\t...(opts?.headers || {}),\n\t\t};\n\n\t\t// \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F (\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u0439, \u0435\u0441\u043B\u0438 \u0443 \u0442\u0435\u0431\u044F \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442)\n\t\tif (this.token) headers[\"Authorization\"] = `Bearer ${this.token}`;\n\n\t\tlet payload = undefined;\n\t\tif (body !== undefined && body !== null) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tpayload = JSON.stringify(body);\n\t\t}\n\n\t\tfetch(url, {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody: payload,\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst meta = {\n\t\t\t\t\turl,\n\t\t\t\t\tmethod,\n\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\theaders: res.headers,\n\t\t\t\t};\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tconst parsed = safe_json_parse(text);\n\t\t\t\tconst data = parsed.ok ? parsed.data : text;\n\n\t\t\t\t// HTTP-level \u043E\u0448\u0438\u0431\u043A\u0438\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst err = {\n\t\t\t\t\t\ttype: \"http_error\",\n\t\t\t\t\t\tmessage: `HTTP ${res.status}`,\n\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\traw: data,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (res.status === 401 || res.status === 403) {\n\t\t\t\t\t\tif (this.on_unauthorized) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.on_unauthorized({ error: err, meta });\n\t\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t}\n\n\t\t\t\t// API-level \u043E\u0448\u0438\u0431\u043A\u0438 (\u043F\u043E \u0442\u0432\u043E\u0438\u043C \u043F\u0440\u0438\u043C\u0435\u0440\u0430\u043C \u0431\u044B\u0432\u0430\u0435\u0442 status:false \u0438\u043B\u0438 status:\"error\")\n\t\t\t\tif (parsed.ok && data && typeof data === \"object\") {\n\t\t\t\t\tconst st = data.status;\n\t\t\t\t\tif (st === false || st === \"error\") {\n\t\t\t\t\t\tconst err = {\n\t\t\t\t\t\t\ttype: \"api_error\",\n\t\t\t\t\t\t\tmessage: data.message || \"API error\",\n\t\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\t\traw: data,\n\t\t\t\t\t\t\tfield: data.field,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn callback(null, data, meta);\n\t\t\t})\n\t\t\t.catch((e) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst is_abort = e && (e.name === \"AbortError\" || String(e).includes(\"AbortError\"));\n\t\t\t\tconst err = is_abort\n\t\t\t\t\t? { type: \"timeout\", message: `Timeout after ${timeout_ms}ms` }\n\t\t\t\t\t: { type: \"network_error\", message: e?.message || \"Network error\", details: e };\n\n\t\t\t\treturn callback(err, null, { url, method, status_code: 0, headers: null });\n\t\t\t});\n\t}\n\n\tget(path, cb, opts) {\n\t\treturn this.request(\"GET\", path, null, cb, opts);\n\t}\n\n\tpost(path, body, cb, opts) {\n\t\treturn this.request(\"POST\", path, body, cb, opts);\n\t}\n\n\tapi_get(api_path, cb, extra_query, opts) {\n\t\treturn this.get(this._wrap_path(api_path, extra_query), cb, opts);\n\t}\n\n\tapi_post(api_path, body, cb, extra_query, opts) {\n\t\treturn this.post(this._wrap_path(api_path, extra_query), body, cb, opts);\n\t}\n}\n\n/* =========================\n Example usage\n========================= */\n\n// import { SmartHomeApi } from \"./smart_home_api.js\";\n//\n// const api = new SmartHomeApi({\n// base_url: \"http://192.168.2.101\",\n// token: \"YOUR_TOKEN\",\n// timeout_ms: 20000,\n// on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n// });\n//\n// api.scripts.actions_list((err, res) => {\n// if (err) return console.error(\"actions_list error:\", err);\n// console.log(\"actions:\", res);\n// });\n//\n// api.scripts.run({ alias: \"script_alias\", params: { x: 1 } }, (err, res) => {\n// if (err) return console.error(\"run error:\", err);\n// console.log(\"run result:\", res);\n// });\n", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Devices`,\n\t\t\troute: \"/#!/devices\",\n\t\t\tis_active: active == \"devices\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Scanning`,\n\t\t\troute: \"/#!/devices/scanning\",\n\t\t\tis_active: active == \"scanning\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/devices/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t}\n\t]);\n}\n\nfunction rebootDeviceBtnHandler(sh_api, btn, modal) {\n\tHelper.states.btnLoadingState(btn, true);\n\n\tconst deviceId = btn.dataset.deviceId;\n\tconst deviceName = btn.dataset.deviceName;\n\tconst deviceAlias = btn.dataset.deviceAlias;\n\t\n\tsh_api.devices.reboot(\n\t\tdeviceId,\n\t\t(err, data, meta) => {\n\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\tconsole.log(\"Reboot done\", err, data, meta);\n\n\t\t\tmodal?.close();\n\n\t\t\tif(data) {\n\t\t\t\tsetTimeout(() => Screens.reinit(), 8000);\n\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\"Reboot successful\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t} else {\n\t\t\t\tToasts.createError(\n\t\t\t\t\t\"Reboot failed\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t}\n\t\t}\n\t);\n}\n\nexport {\n\tsidebarTemplate,\n\trebootDeviceBtnHandler\n}", "import { rebootDeviceBtnHandler } from \"./devices-funcs.js\";\n\nexport function deviceDetailsPopup(device, sh_api) {\n\tconsole.log(device);\n\n\treturn Modals.create(\"device-popup\", {\n\t\ttitle: `Device ${device.name}`,\n\t\tbody: modal => {\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${device[field]}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst buttonReboot = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon\"\n\t\t\t}, ' Reboot');\n\n\t\t\tconst buttonRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ' Remove');\n\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbuttonReboot.dataset.deviceId = device.id;\n\t\t\tbuttonReboot.dataset.deviceName = device.name;\n\t\t\tbuttonReboot.dataset.deviceAlias = device.alias;\n\n\t\t\tbuttonReboot.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonReboot.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t});\n\n\t\t\tbuttonRemove.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonRemove.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(buttonRemove, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to remove this device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.remove(\n\t\t\t\t\t\t\tdevice.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\tDevice: ${device.name}
    \n\t\t\t\t\t\t\t\t\t\tAlias: ${device.alias}
    \n\t\t\t\t\t\t\t\t\t\tIP: ${device.ip}\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonReboot, buttonRemove ];\n\t\t}\n\t});\n}", "import { sidebarTemplate, rebootDeviceBtnHandler } from \"./devices-funcs.js\";\nimport { deviceDetailsPopup } from \"./device-details-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceName: device.name,\n\t\t\talias: device.alias,\n\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_state),\n\t\t\tip: `${device.ip}`,\n\t\t\tactions: `\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Devices list\", \n\t\t{\n\t\t\tdeviceName: \"Device name\", \n\t\t\talias: \"Device alias\", \n\t\t\tstatus: \"Status\", \n\t\t\tip: \"IP\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".reboot-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget);\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = JSON.parse(e.currentTarget.dataset.device);\n\t\t\tdeviceDetailsPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction list(sh_api) {\n\treturn {\n\t\talias: \"devices\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"devices\"));\n\t\t},\n\n\t\tiniter: scr => {\n\t\t\tsh_api.devices.list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\n\t\t}\n\t};\n}\n\nexport {\n\tlist\n}", "export function deviceSetupFormPopup(device, sh_api) {\n\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\treturn Modals.create(\"device-setup\", {\n\t\ttitle: `Setup new device ${device.ip}`,\n\t\tbody: modal => {\n\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tif(field[0] == \"_\") continue;\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${device[field]}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\tconst deviceInfo = `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t${deviceInfo}\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"Cancel\");\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tconst buttonSubmit = Helper.template.createElement(\"button\", \n\t\t\t\t{ class: \"btn btn-success with-icon\" }, \n\t\t\t\t` Setup`\n\t\t\t);\n\n\t\t\tbuttonSubmit.addEventListener(\"click\", e => {\n\t\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputs = {\n\t\t\t\t\tdevice_ip: device.ip\n\t\t\t\t};\n\n\t\t\t\tconst setupForm = document.querySelector(\"#device-setup .setup-form\");\n\t\t\t\tsetupForm.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(setupForm.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = setupForm.querySelectorAll(\"input\");\n\t\t\t\tconst textareaElement = setupForm.querySelector(\"textarea\");\n\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tinputs[textareaElement.getAttribute(\"name\")] = textareaElement.value;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, true);\n\t\t\t\t\n\t\t\t\tsh_api.devices.setup_new_device(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.devices.setup_new_device\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".setup-form .alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\ttextareaElement.value = \"\";\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Setup successful\", `Added new device ID ${device.device_id}`).show();\n\t\t\t\t\t}, 300);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonSubmit ];\n\t\t},\n\n\t\tonready: modal => {\n\t\t\tconst setupForm = modal.querySelector(\".setup-form\");\n\t\t\tsetupForm.querySelectorAll(\"input\").forEach(i => {\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t})\n}", "import { sidebarTemplate } from \"./devices-funcs.js\";\nimport { deviceSetupFormPopup } from \"./device-setup-form-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceId: device.device_id,\n\t\t\tdeviceName: device.name,\n\t\t\tdeviceType: device.type,\n\t\t\tstatus: `${device.status}`,\n\t\t\tip: `${device.ip}`,\n\t\t\tmac: `${device.mac}`,\n\t\t\twifiSignal: device.wifi_signal,\n\t\t\tactions: device.status == \"setup\" ? `\n\t\t\t\t\n\t\t\t` : \"\"\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Found devices\", \n\t\t{\n\t\t\tdeviceId: \"Device ID\",\n\t\t\tdeviceName: \"Device name\", \n\t\t\tdeviceType: \"Type\", \n\t\t\tstatus: \"Status\", \n\t\t\tip: \"IP\", \n\t\t\tmac: \"Mac\",\n\t\t\twifiSignal: \"Signal\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".setup-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = JSON.parse(e.currentTarget.dataset.device);\n\t\t\tdeviceSetupFormPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction scanning(sh_api) {\n\treturn {\n\t\talias: \"devices-scanning\",\n\t\trenderer: () => {\t\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scanning\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.devices.scanning_all((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.scanning_all\", err, resp);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.devices.length);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\n\t\t}\n\t};\n}\n\nexport {\n\tscanning\n}", "import { list } from \"./devices-list-screen.js\";\nimport { scanning } from \"./devices-scanning-screen.js\";\n\nexport default {\n\tlist,\n\tscanning\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Scopes`,\n\t\t\troute: \"/#!/scripts/scopes\",\n\t\t\tis_active: active == \"scopes\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/scripts/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Regular`,\n\t\t\troute: \"/#!/scripts/regular\",\n\t\t\tis_active: active == \"regular\"\n\t\t}\n\t]);\n}\n\nfunction runActionScript(sh_api, alias, cb) {\n\tsh_api.scripts.run({\n\t\talias: alias,\n\t\tparams: {}\n\t}, (err, data, meta) => {\n\t\tif(data) {\n\t\t\tcb(true);\n\n\t\t\tsetTimeout(() => Screens.reinit(), 1000);\n\n\t\t\tsetTimeout(() => Toasts.createSuccess(\n\t\t\t\t`${alias} running`,\n\t\t\t\t`${alias} running success`\n\t\t\t).show(), 300);\n\t\t} else {\n\t\t\tcb(false);\n\n\t\t\tsetTimeout(() => Toasts.createError(\n\t\t\t\t`${alias} failed`,\n\t\t\t\t`${alias} running failed`\n\t\t\t).show(), 300);\n\t\t}\n\t});\n}\n\nexport {\n\tsidebarTemplate,\n\trunActionScript\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let scope of data.scopes) {\n\t\tconst btnSwitch = scope.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\tname: scope.name,\n\t\t\tfilename: `${scope.filename}
    ${scope.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(scope.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Scopes list\", \n\t\t{\n\t\t\tname: \"Scope name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scopes`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"scope_enable\"\n\t\t\t\t: \"scope_disable\"\n\n\t\t\tconst scope = JSON.parse(btn.dataset.scope);\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](scope.name, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${scope.name} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Scope state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction scopes(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Scopes\",\n\t\talias: \"scripts-scopes\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scopes\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.scopes_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.scopes_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tscopes\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tconst btnSwitch = script.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\talias: `${script.alias}
    by ${script.created_by}`,\n\t\t\tname: `${script.name}
    ${script.description}
    `,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(script.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tconst provideSciptsData = {};\n\tfor(let i in data) {\n\t\tprovideSciptsData[data[i].alias] = data[i];\n\t\tdata[i][\"code\"] = \"\";\n\t}\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Regular scripts list\", \n\t\t{\n\t\t\talias: \"Alias\", \n\t\t\tname: \"Script name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scripts`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"regular_enable\"\n\t\t\t\t: \"regular_disable\"\n\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction regular(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Regular\",\n\t\talias: \"scripts-regular\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"regular\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.regular_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.regular_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tregular\n}", "import { runActionScript } from \"./scripts-funcs.js\";\n\nexport function actionDetailsPopup(script, sh_api) {\n\tconsole.log(\"actionDetailsPopup\", script);\n\n\treturn Modals.create(\"action-script-popup\", {\n\t\ttitle: `${script.name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    ${script.alias}

    \n\t\t\t\t\t\t\t
    ${script.description}
    \n\t\t\t\t\t\t\t
    ${Helper.template.toogleStateBadge(script.state)}
    \n\t\t\t\t\t\t\t
    ${script.filename}
    \n\t\t\t\t\t\t\t
    By ${script.author}
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    ${script.code}
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnChangeState = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: script.state == \"enabled\" ? \"btn btn-warning\" : \"btn btn-success\",\n\t\t\t\t\"data-value\": script.state == \"enabled\" ? \"disable\" : \"enable\"\n\t\t\t}, script.state == \"enabled\" ? `Disable` : \"Enable\");\n\n\n\t\t\tconst btnRun = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-secondary with-icon\"\n\t\t\t}, ` Run`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnChangeState.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t\t? \"action_enable\"\n\t\t\t\t\t: \"action_disable\"\n\n\t\t\t\t// const script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tif(data) {\n\t\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbtnRun.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\n\t\t\t\trunActionScript(sh_api, script.alias, resultFlag => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tif(resultFlag) {\n\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnChangeState, btnRun ];\n\t\t},\n\t\tonready: modal => {\n\t\t\thljs.highlightElement(modal.querySelector(\".code-viewer\"));\n\t\t}\n\t});\n}", "import { sidebarTemplate, runActionScript } from \"./scripts-funcs.js\";\nimport { actionDetailsPopup } from \"./scripts-action-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tpreparedData.push({\n\t\t\talias: script.alias,\n\t\t\tauthor: script.created_by,\n\t\t\tname: script.name,\n\t\t\ticon: script.icon ?? '',\n\t\t\tdescription: script.description,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: script.state,\n\t\t\tcode: script.code\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainGrid(scr, data, total) {\n\tlet grid = `
    `;\n\n\tconst provideSciptsData = {};\n\n\tfor(let item of data) {\n\t\tprovideSciptsData[item.alias] = item;\n\n\t\tconst cardColor = item.state == \"enabled\" ? \"primary\" : \"warning\";\n\t\tgrid += `\n\t\t\t
    \n\t\t\t\t${item.name} \n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t${item.icon}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    ${item.description}
    \n\t\t\t\t
    \n\t\t\t
    \n\t\t`;\n\t}\n\tgrid += `
    `;\n\n\tconst mainContainer = scr.currentScreen.DOMObject.querySelector(\".main-container\");\n\tmainContainer.innerHTML = grid;\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".script-action .card-content\").forEach(actionCard => {\n\t\tactionCard.addEventListener(\"click\", e => {\n\t\t\tconst actionCard = e.currentTarget.parentNode;\n\t\t\tif(actionCard.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tHelper.states.cardScriptActionLoadingState(actionCard, true);\n\n\t\t\tconst alias = actionCard.dataset.alias;\n\t\t\trunActionScript(sh_api, alias, resultFlag => {\n\t\t\t\tHelper.states.cardScriptActionLoadingState(actionCard, false);\n\n\t\t\t\tif(resultFlag) {\n\t\t\t\t\tactionCard.classList.add(\"card-success\");\n\t\t\t\t\tsetTimeout(() => actionCard.classList.remove(\"card-success\"), 1000);\n\t\t\t\t}\n\t\t\t});\n\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".action-details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\tconsole.log(\"SCRIPT\", script);\n\t\t\tactionDetailsPopup(script, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction actions(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Actions\",\n\t\talias: \"scripts-actions\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"actions\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.actions_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.regular_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainGrid(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tactions\n}", "import { scopes } from \"./scripts-scopes-screen.js\";\nimport { regular } from \"./scripts-regular-screen.js\";\nimport { actions } from \"./scripts-actions-screen.js\";\n\nexport default {\n\tscopes,\n\tregular,\n\tactions\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Areas Tree`,\n\t\t\troute: \"/#!/areas/tree\",\n\t\t\tis_active: active == \"areas-tree\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/scripts/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t}\n\t]);\n}\n\nexport {\n\tsidebarTemplate\n}", "import { rebootDeviceBtnHandler } from \"../devices/devices-funcs.js\";\n\nexport function areaDevicesModal(area, sh_api) {\n\tconsole.log(\"areaDevicesModal\", area);\n\n\treturn Modals.create(\"area-devices-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRebootAll = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon\"\n\t\t\t}, ` Reboot All`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRebootAll.addEventListener(\"click\", e => {\n\t\t\t\tif(btnRebootAll.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to reboot all devices from ${area.display_name}?`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.reboot_devices(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, false);\n\n\t\t\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\t\t\tconsole.log(\"Was rebooted all devices\");\n\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Rebooted all devices\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tToasts.createDanger(\n\t\t\t\t\t\t\t\t\t\t\"Rebooted fail\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRebootAll ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst devicesContainer = modal.querySelector(\".devices-container\");\n\t\t\tconst loader = modal.querySelector(\".loader\");\n\n\t\t\tsh_api.areas.devices(area.id, (err, data, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.devices\", data);\n\n\t\t\t\tfunction prepareDevicesData(data) {\n\t\t\t\t\tif(!data) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst preparedData = [];\n\t\t\t\t\tfor(let device of data.devices) {\n\t\t\t\t\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\t\t\t\t\tpreparedData.push({\n\t\t\t\t\t\t\tdeviceName: device.name,\n\t\t\t\t\t\t\talias: device.alias,\n\t\t\t\t\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_state),\n\t\t\t\t\t\t\tip: `${device.ip}`,\n\t\t\t\t\t\t\tactions: `\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn preparedData;\n\t\t\t\t}\n\n\t\t\t\tconst devices = prepareDevicesData(data?.data);\n\n\t\t\t\tdevicesContainer.innerHTML = Helper.template.table(\n\t\t\t\t\t\"\", \n\t\t\t\t\t{\n\t\t\t\t\t\tdeviceName: \"Device name\", \n\t\t\t\t\t\talias: \"Device alias\", \n\t\t\t\t\t\tstatus: \"Status\", \n\t\t\t\t\t\tip: \"IP\", \n\t\t\t\t\t\tactions: \"Actions\"\n\t\t\t\t\t},\n\t\t\t\t\tdevices,\n\t\t\t\t\t`Total: ${devices.length} devices`\n\t\t\t\t);\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".reboot-btn\").forEach(rebootBtn => {\n\t\t\t\t\trebootBtn.addEventListener(\"click\", e => {\n\t\t\t\t\t\tif(rebootBtn.getAttribute(\"disabled\")) {\n\t\t\t\t\t\t\treturn ;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tloader.remove();\n\n\t\t\t\tconsole.log(\"devices\", devices);\n\t\t\t});\n\t\t}\n\t});\n}", "\nexport function createNewAreaModal(sh_api) {\n\tconsole.log(\"createNewAreaModal\");\n\n\treturn Modals.create(\"create-area-modal\", {\n\t\ttitle: ` Create new Area`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnSubmit = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-success with-icon\"\n\t\t\t}, ` Create`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnSubmit.addEventListener(\"click\", e => {\n\t\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\t\tform.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(form.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = form.querySelectorAll(\"input\");\n\n\t\t\t\tconst inputs = {};\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnSubmit, true);\n\n\t\t\t\tsh_api.areas.new_area(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.areas.new_area\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Creating successful\", `Added new area ID ${inputs.alias}`).show();\n\t\t\t\t\t}, 300);\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnSubmit ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\tform.querySelectorAll(\".input\").forEach(i => {\n\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t});\n\t\t}\n\t});\n}", "export function areaDetailsModal(area, sh_api) {\n\tconsole.log(\"areaDetailsModal\", area);\n\n\treturn Modals.create(\"create-area-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t// Details\n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ` Remove`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRemove.addEventListener(\"click\", e => {\n\t\t\t\tHelper.states.btnLoadingState(btnRemove, true);\n\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to remove this area? ${area.display_name}`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.remove(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\tArea: ${area.display_name}\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRemove ];\n\t\t},\n\t\tonready: modal => {\n\t\t\t\n\t\t}\n\t});\n}", "import { sidebarTemplate } from \"./areas-funcs.js\";\nimport { areaDevicesModal } from \"./areas-devices-modal.js\";\nimport { createNewAreaModal } from \"./areas-create-new-modal.js\";\nimport { areaDetailsModal } from \"./areas-details-modal.js\";\n\nfunction makeTree(data) {\n\tconst items = data.areas;\n\n\tconst map = {};\n const roots = [];\n\n for (const item of items) {\n map[item.id] = { ...item, children: [] };\n }\n\n for (const item of items) {\n const node = map[item.id];\n\n if (item.parent_id && map[item.parent_id]) {\n map[item.parent_id].children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\nfunction prepareData(data) {\n\tconst tree = makeTree(data);\n\treturn tree;\n}\n\nfunction renderingBranch(branch) {\n\tlet html = `
    `;\n\thtml += `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t ${branch.display_name}\n\t\t\t\t\t[\n\t\t\t\t\t${branch.type}\n\t\t\t\t\t ${branch.alias}\n\t\t\t\t\t]\n\t\t\t\t
    \n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n\n\tif(branch.children?.length) {\n\t\tfor(let childBranch of branch.children) {\n\t\t\thtml += renderingBranch(childBranch);\n\t\t}\n\t}\n\n\thtml += \"
    \";\n\treturn html;\n}\n\nfunction renderingAreasTree(scr, tree) {\n\tconsole.log(\"TREE\", tree);\n\tlet html = `
    `;\n\tfor(let branch of tree) {\n\t\thtml += renderingBranch(branch);\n\t}\n\thtml += \"
    \";\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container .tree-container\").innerHTML = html;\n}\n\nfunction initAreasTree(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.devices\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaDevicesModal({ \n\t\t\t\tid: e.currentTarget.dataset.areaId, \n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName \n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.details\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaDetailsModal({\n\t\t\t\tid: e.currentTarget.dataset.areaId,\n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName\n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.ready();\n}\n\nfunction areasTree(sh_api) {\n\treturn {\n\t\ttitle: \"Areas Tree\",\n\t\talias: \"areas-tree\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(\n\t\t\t\tsidebarTemplate(\"areas-tree\"), \n\t\t\t\t`
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    Areas Tree

    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t`\n\t\t\t);\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.areas.list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingAreasTree(scr, prepareData(resp.data));\n\t\t\t\tinitAreasTree(scr, sh_api);\n\n\t\t\t\tscr.currentScreen.DOMObject.querySelector(\".create-new-area-modal\").addEventListener(\"click\", e => {\n\t\t\t\t\tcreateNewAreaModal(sh_api).show();\n\t\t\t\t});\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tareasTree\n}", "import { areasTree } from \"./areas-tree-screen.js\";\n\nexport default {\n\tareasTree\n}", "import devices from \"./components/screens/devices/devices.js\";\nimport scripts from \"./components/screens/scripts/scripts.js\";\nimport areas from \"./components/screens/areas/areas.js\";\n\nfunction routes(screens, sh_api) {\n\tscreens.add(\"/\", {\n\t\talias: \"home\",\n\t\trenderer: () => {\n\t\t\treturn `

    Hello world

    `;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsetTimeout(() => scr.ready(), 1000);\n\t\t\tsetTimeout(() => scr.error(\"Error\", \"Just testing\"), 2000);\n\t\t}\n\t});\n\n\tscreens.add(\"-\", {\n\t\talias: \"not-found-screen\",\n\t\trenderer: () => {\n\t\t\treturn `

    404 NOT FOUND

    `;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tscr.ready();\n\t\t}\n\t});\n\n\tscreens.add(\"/devices\", devices.list(sh_api));\n\tscreens.add(\"/devices/scanning\", devices.scanning(sh_api));\n\tscreens.add(\"/scripts/scopes\", scripts.scopes(sh_api));\n\tscreens.add(\"/scripts/regular\", scripts.regular(sh_api));\n\tscreens.add(\"/scripts/actions\", scripts.actions(sh_api));\n\tscreens.add(\"/areas/tree\", areas.areasTree(sh_api));\n}\n\nexport {\n\troutes\n}", "function template(id, title, footer) {\n\treturn `\n\t\t
    \n
    \n\n
    \n
    \n

    ${title}

    \n \n
    \n\n
    \n
    ${footer}
    \n
    \n
    \n\t`;\n}\n\nfunction init(modal, onready) {\n\tmodal.show = function() {\n\t\tdocument.querySelector(\"body\").append(modal);\n\n\t\tsetTimeout(() => {\n\t\t\tthis.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tmodal.close = function() {\n\t\tthis.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n\n\tmodal.querySelector(\".modal-close\").addEventListener(\"click\", e => {\n\t\tmodal.close();\n\t});\n\n\tif(typeof onready == \"function\") {\n\t\tonready(modal);\n\t}\n\n\treturn modal;\n}\n\n\t/**\n\t * Create new modal window;\n\t * @param {string} id Uniq id (selector)\n\t * @param {string} title Display title\n\t * @param {object} props { body: modal => {}, actions => modal => {} }\n\t * @return {object} DOM object\n\t */\nfunction create(id, props) {\n\tconst title = props.title || \"\";\n\tconst footer = props.footer || \"\";\n\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(id, title, footer);\n\tconst modal = div.childNodes[1];\n\n\tconst modalBody = modal.querySelector(\".modal-body\");\n\tconst modalFooter = modal.querySelector(\".modal-footer\");\n\n\tif(typeof props.actions == \"function\") {\n\t\tconst actionsResult = props.actions(modal);\n\n\t\tif(typeof actionsResult[0] == \"object\") {\n\t\t\tconst actions = document.createElement(\"div\");\n\t\t\tactions.classList.add(\"actions\");\n\t\t\tfor(let actionElement of actionsResult) {\n\t\t\t\tactions.append(actionElement);\n\t\t\t}\n\n\t\t\tmodalFooter.append(actions);\n\t\t}\n\t}\n\n\tif(typeof props.body == \"function\") {\n\t\tconst bodyResult = props.body(modal);\n\n\t\tif(typeof bodyResult == \"object\") {\n\t\t\tmodalBody.append(bodyResult);\n\t\t} else if(typeof bodyResult == \"string\") {\n\t\t\tmodalBody.innerHTML = bodyResult;\n\t\t}\n\t}\n\n\treturn init(modal, props?.onready);\n}\n\nexport default {\n\tcreate\n}", "export default function confirmPopup(text, confirmedCb, canceledCb) {\n\tModals.create(\"confirm-popup\", {\n\t\ttitle: `Requires confirmation`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t

    ${text}

    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonNO = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"NO\");\n\t\t\tconst buttonYES = Helper.template.createElement(\"button\", { class: \"btn btn-warning\" }, \"YES\");\n\n\t\t\tbuttonNO.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tcanceledCb();\n\t\t\t});\n\n\t\t\tbuttonYES.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tconfirmedCb();\n\t\t\t});\n\n\t\t\treturn [ buttonNO, buttonYES ];\n\t\t}\n\t}).show();\n}", "import { hud, navigationShow, navigationHide } from \"./components/hud.js\";\nimport { Screens } from \"./components/Screens.js\";\nimport Toasts from \"./components/toasts.js\"\nimport Helper from \"./components/helper.js\"\nimport { SmartHomeApi } from \"./sh/SmartHomeApi.js\";\nimport { routes } from \"./routes.js\";\nimport Modals from \"./components/modals.js\";\nimport confirmPopup from \"./components/confirm-popup.js\";\n\ndocument.addEventListener(\"DOMContentLoaded\", e => {\n\tconsole.log(\"App init\");\n\n\twindow.Toasts = Toasts;\n\twindow.Helper = Helper;\n\twindow.Modals = Modals;\n\twindow.confirmPopup = confirmPopup;\n\n\thud();\n\tconst sh_api = new SmartHomeApi({\n\t base_url: \"http://shswebclient.local\",\n\t token: \"YOUR_TOKEN\",\n\t timeout_ms: 3000,\n\t on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n\t proxy_path: \"/proxy.php\",\n\t});\n\n\t// api.scripts.actions_list((err, data, meta) => console.log(data));\n\t// api.scripts.scopes_list((err, data, meta) => console.log(data));\n\t// api.devices.info(4, (err, data, meta) => console.log(data));\n\n\tconst screens = new Screens(\".screens\", \".load-screen\", \".error-screen\");\n\t\n\troutes(screens, sh_api);\n\n\tconsole.log(screens.getScreens());\n\n\tscreens.onSwitch((scr, alias) => {\n\t\tnavigationHide();\n\t});\n\n\tscreens.routing();\n\n\twindow.Screens = screens;\n});"], + "mappings": "0oBAAA,IAAIA,EACAC,EACAC,EAEJ,SAASC,IAAiB,CACzBH,EAAa,QAAQ,SAAW,YAChCA,EAAa,UAAU,OAAO,WAAW,EACzCA,EAAa,UAAU,IAAI,UAAU,EAErCC,EAAW,UAAU,IAAI,QAAQ,CAClC,CAEA,SAASG,GAAiB,CACzBJ,EAAa,QAAQ,SAAW,SAChCA,EAAa,UAAU,OAAO,UAAU,EACxCA,EAAa,UAAU,IAAI,WAAW,EAEtCC,EAAW,UAAU,IAAI,QAAQ,EACjCA,EAAW,UAAU,OAAO,QAAQ,EAEpC,WAAW,IAAM,CAChBA,EAAW,UAAU,OAAO,QAAQ,CACrC,EAAG,GAAG,CACP,CAEA,SAASI,GAAM,CACd,QAAQ,IAAI,UAAU,EAEtBL,EAAe,SAAS,cAAc,kBAAkB,EACxDC,EAAa,SAAS,cAAc,kBAAkB,EACtDC,EAAkB,SAAS,cAAc,qBAAqB,EAE9DF,EAAa,iBAAiB,QAASM,GAAK,CACxCA,EAAE,cAAc,QAAQ,UAAY,YACtCH,GAAe,EAEfC,EAAe,CAEjB,CAAC,EAEDF,EAAgB,iBAAiB,QAASI,GAAK,CAC9C,QAAQ,OAAO,CAChB,CAAC,CACF,CC3CO,IAAMC,EAAN,KAAc,CACpB,YAAYC,EAA0BC,EAAgBC,EAAqB,CAC1E,KAAK,QAAU,CAAC,EAChB,KAAK,UAAY,CAAC,EAClB,KAAK,cAAgB,KACrB,KAAK,eAAiB,CACrB,OAAQ,CAAC,EACT,OAAQ,CAAC,EACT,OAAQ,CAAC,CACV,EAEA,KAAK,iBAAmB,SAAS,cAAcF,CAAwB,EACvE,KAAK,OAAS,SAAS,cAAcC,CAAc,EACnD,KAAK,YAAc,SAAS,cAAcC,CAAmB,EAC7D,QAAQ,IAAI,cAAc,CAC3B,CAOA,IAAIC,EAAOC,EAAQ,CAClB,GAAG,OAAOA,GAAU,SACnB,OAAO,QAAQ,MAAM,iCAAiC,EAGvD,GAAG,OAAOA,GAAA,YAAAA,EAAQ,QAAS,YAC1B,OAAO,QAAQ,MAAM,0BAA0B,EAGhD,GAAG,OAAOA,GAAA,YAAAA,EAAQ,WAAY,WAC7B,OAAO,QAAQ,MAAM,oCAAoC,EAG1D,KAAK,QAAQA,EAAO,KAAK,EAAIC,EAAA,CAC5B,MAAOF,GACJC,GAGJ,KAAK,UAAUD,CAAK,EAAIC,EAAO,KAChC,CAEA,OAAOE,EAAO,CA3Cf,IAAAC,EAiDE,GALA,KAAK,kBAAkBD,CAAK,EAC5B,KAAK,gBAAgB,EACrB,KAAK,WAAW,GAChBC,EAAA,KAAK,gBAAL,MAAAA,EAAoB,UAAU,SAE3B,OAAO,KAAK,QAAQD,CAAK,GAAK,YAAa,CAC7C,QAAQ,MAAM,aAAaA,CAAK,aAAa,EAC7C,MACD,CAEA,KAAK,cAAgB,KAAK,QAAQA,CAAK,EAEvC,IAAME,EAAkB,SAAS,cAAc,KAAK,EACpDA,EAAgB,UAAU,IAAI,QAAQ,EACtCA,EAAgB,GAAKF,EACrBE,EAAgB,QAAQ,MAAQF,EAChCE,EAAgB,UAAY,KAAK,cAAc,SAAS,EACxD,KAAK,cAAc,UAAYA,EAC/B,KAAK,iBAAiB,OAAO,KAAK,cAAc,SAAS,EAEzD,KAAK,cAAc,OAAO,IAAI,CAC/B,CAEA,QAAS,CACJ,KAAK,gBAIT,KAAK,kBAAkB,KAAK,cAAc,KAAK,EAC/C,KAAK,OAAO,KAAK,cAAc,KAAK,EACrC,CAEA,QAAS,CACJ,KAAK,gBAIT,KAAK,cAAc,OAAO,IAAI,EAC9B,KAAK,kBAAkB,EACxB,CAEA,SAAU,CACT,YAAY,IAAM,CACjB,IAAML,EAAQ,SAAS,SAAS,KAAK,MAAM,IAAI,EAAE,CAAC,EAClD,GAAG,OAAOA,GAAS,aAAeA,GAAS,GAC1C,OAGD,IAAMG,EAAS,OAAO,KAAK,UAAUH,CAAK,GAAK,YAC5C,mBACA,KAAK,UAAUA,CAAK,GAEpB,CAAC,KAAK,eAAiB,KAAK,cAAc,OAASG,IACrD,KAAK,OAAOA,CAAK,CAEnB,EAAG,EAAE,CACN,CAEA,OAAQ,CACJ,KAAK,eAAiB,OAIrB,KAAK,cAAc,YACtB,KAAK,cAAc,UAAY,SAAS,gBAAgB,KAAK,cAAc,KAAK,GAGjF,KAAK,WAAW,EAChB,KAAK,cAAc,UAAU,UAAU,IAAI,QAAQ,EACpD,CAEA,MAAMG,EAAOC,EAAM,CAnHpB,IAAAH,GAoHEA,EAAA,KAAK,gBAAL,MAAAA,EAAoB,UAAU,SAC9B,KAAK,YAAY,cAAc,cAAc,EAAE,UAAYE,EAC3D,KAAK,YAAY,cAAc,aAAa,EAAE,UAAYC,EAC1D,KAAK,gBAAgB,CACtB,CAEA,YAAa,CACZ,KAAK,OAAO,UAAU,OAAO,QAAQ,CACtC,CAEA,YAAa,CACZ,KAAK,OAAO,UAAU,IAAI,QAAQ,CACnC,CAEA,iBAAkB,CACjB,KAAK,YAAY,UAAU,IAAI,QAAQ,CACxC,CAEA,iBAAkB,CACjB,KAAK,YAAY,UAAU,OAAO,QAAQ,CAC3C,CAEA,YAAa,CACZ,OAAO,KAAK,OACb,CAEA,cAAe,CACd,OAAO,KAAK,SACb,CAEA,SAASC,EAAI,CACZ,KAAK,eAAe,OAAO,KAAKA,CAAE,CACnC,CAEA,UAAUA,EAAI,CACb,KAAK,eAAe,OAAO,KAAKA,CAAE,CACnC,CAEA,SAASA,EAAI,CACZ,KAAK,eAAe,OAAO,KAAKA,CAAE,CACnC,CAEA,kBAAkBL,EAAO,CACxB,QAAQM,KAAW,KAAK,eAAe,OACtCA,EAAQ,KAAMN,CAAK,CAErB,CAEA,kBAAkBA,EAAO,CACxB,QAAQM,KAAW,KAAK,eAAe,OACtCA,EAAQ,KAAMN,CAAK,CAErB,CAEA,mBAAoB,CACnB,QAAQM,KAAW,KAAK,eAAe,OACtCA,EAAQ,IAAI,CAEd,CACD,EC/KA,SAASC,GAASC,EAAMC,EAAMC,EAAOC,EAAM,CAC1C,MAAO;AAAA,4BACoBH,CAAI;AAAA;AAAA,iCAECC,CAAI,IAAIC,CAAK;AAAA,+BACfC,CAAI;AAAA;AAAA;AAAA;AAAA,EAKnC,CAEA,SAASC,GAAKC,EAAOC,EAAO,CAiC3B,GAhCGA,GAAA,MAAAA,EAAO,OACT,SAAS,iBAAiB,QAAQ,EAAE,QAAQC,GAAKA,EAAE,MAAM,CAAC,EAG3DF,EAAM,MAAQ,UAAW,CACxB,KAAK,UAAU,IAAI,QAAQ,EAC3B,WAAW,IAAM,CAChB,KAAK,OAAO,CACb,EAAG,GAAG,CACP,EAEAA,EAAM,cAAc,cAAc,EAAE,iBAAiB,QAASG,GAAK,CAClEH,EAAM,MAAM,CACb,CAAC,EAEDA,EAAM,KAAO,UAAW,CACvB,SAAS,cAAc,MAAM,EAAE,OAAOA,CAAK,EAE3C,WAAW,IAAM,CAChBA,EAAM,UAAU,IAAI,QAAQ,CAC7B,EAAG,EAAE,CACN,EAEA,QAAQ,SAAS,CAACI,EAAKC,IAAU,CAChC,WAAW,IAAM,CAChBL,GAAA,MAAAA,EAAO,OACR,EAAG,GAAK,CACT,CAAC,EAEDA,EAAM,iBAAiB,YAAaG,GAAKH,EAAM,UAAY,EAAI,EAC/DA,EAAM,iBAAiB,WAAYG,GAAKH,EAAM,UAAY,EAAK,EAE5DC,GAAA,MAAAA,EAAO,SAAU,CACnB,QAAQ,IAAIA,CAAK,EACjB,IAAMK,EAAmB,YAAY,IAAM,CACtCN,EAAM,YACTA,EAAM,MAAM,EACZ,cAAcM,CAAgB,EAEhC,EAAGL,GAAA,YAAAA,EAAO,QAAQ,CACnB,CAEA,OAAOD,CACR,CAEA,SAASO,EAAOZ,EAAMC,EAAMC,EAAOC,EAAMG,EAAO,CAC/C,IAAMO,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,UAAYd,GAASC,EAAMC,EAAMC,EAAOC,CAAI,EAEzCC,GAAKS,EAAI,WAAW,CAAC,EAAGP,CAAK,CACrC,CAEA,SAASQ,GAAcZ,EAAOC,EAAMG,EAAO,CAC1C,OAAG,OAAOA,GAAS,cAClBA,EAAQ,CAAC,GAGP,OAAOA,EAAM,UAAY,cAC3BA,EAAM,SAAW,KAGf,OAAOA,EAAM,OAAS,cACxBA,EAAM,MAAQ,IAGRM,EACN,UACA,qCACAV,EACAC,EACAG,CACD,CACD,CAEA,SAASS,GAAWb,EAAOC,EAAMG,EAAO,CACvC,OAAOM,EACN,OACA,6BACAV,EACAC,EACAG,CACD,CACD,CAEA,SAASU,GAAcd,EAAOC,EAAMG,EAAO,CAC1C,OAAOM,EACN,UACA,gCACAV,EACAC,EACAG,CACD,CACD,CAEA,SAASW,EAAYf,EAAOC,EAAMG,EAAO,CACxC,OAAOM,EACN,SACA,wCACAV,EACAC,EACAG,CACD,CACD,CAEA,IAAOY,EAAQ,CACb,OAAAN,EACA,WAAAG,GACA,cAAAD,GACA,cAAAE,GACA,YAAAC,EACA,aAAgBA,CAClB,EC5HA,SAASE,GAAWC,EAAO,CAC1B,IAAIC,EAAY,GAEhB,QAAQC,KAAQF,EAAO,CACtB,IAAIG,EAAQ,GACRC,EAAS,GACVF,EAAK,QACPC,EAAQ,gCAAgCD,EAAK,KAAK,KAClDE,EAAS,QAGVH,GAAa;AAAA,0BACWC,EAAK,UAAY,mBAAqB,EAAE;AAAA,MAC5DC,CAAK,GAAGD,EAAK,OAAO,GAAGE,CAAM;AAAA;AAAA,GAGlC,CAEA,MAAO;AAAA;AAAA;AAAA,MAGFH,CAAS;AAAA;AAAA;AAAA,EAIf,CAEA,SAASI,GAAMC,EAASC,EAASC,EAAMC,EAAO,CAC7C,IAAIC,EAAO,yBACPC,EAAe,EACnB,QAAQC,KAAOL,EACdG,GAAQ,mBAAmBH,EAAQK,CAAG,CAAC,QACvCD,IAEDD,GAAQ,QAER,IAAIG,EAAO,GACX,QAAQX,KAAQM,EAAM,CACrBK,GAAQ,yBACR,QAAQC,KAAUP,EACjBM,GAAQ,OAAOX,EAAKY,CAAM,CAAC,QAE5BD,GAAQ,OACT,CAEA,IAAIE,EAAO,GACR,OAAON,GAAS,cAClBM,EAAO;AAAA;AAAA;AAAA,oBAGWJ,CAAY;AAAA,QACxBF,CAAK;AAAA;AAAA;AAAA;AAAA,KAOZ,IAAMO,EAAeV,EAClB,kCAAkCA,CAAO,aACzC,GAEGW,EAAYT,EAAK,OACpB,6BAA6BE,CAAI,WACjC,GAEH,OAAAG,EAAOL,EAAK,OACTK,EACA,2CAMI;AAAA,sCAJkBL,EAAK,OAE3B,GADA,aAIiD;AAAA,KAChDQ,CAAY;AAAA,KACZC,CAAS;AAAA,+BACiBJ,CAAI;AAAA,KAC9BE,CAAI;AAAA;AAAA,EAGT,CAEA,SAASG,EAAcC,EAAMC,EAAOC,EAAS,CAC5C,IAAMC,EAAO,SAAS,cAAcH,CAAI,EAExC,OAAW,CAACP,EAAKW,CAAK,IAAK,OAAO,QAAQH,CAAK,EAC1CR,IAAQ,QACXU,EAAK,UAAYC,EACPX,IAAQ,UAClB,OAAO,OAAOU,EAAK,QAASC,CAAK,EAEjCD,EAAK,aAAaV,EAAKW,CAAK,EAI9B,OAAAD,EAAK,UAAa,OAAOD,GAAW,YAAeA,EAAU,GACtDC,CACR,CAEA,SAASE,GAAYL,EAAME,EAAS,CACnC,MAAG,CAAC,UAAW,UAAW,YAAa,OAAQ,UAAW,QAAS,QAAQ,EAAE,QAAQF,CAAI,EAAI,EACrF,QAAQ,MAAM,gBAAiB,kBAAoBA,CAAI,EAGxDD,EAAc,MAAO,CAC3B,MAAO,eAAeC,CAAI,EAC3B,EAAGE,CAAO,CACX,CAEA,SAASI,GAAwBjB,EAAM,CACtC,IAAMkB,EAAM,CACX,YAAe,OACf,eAAkB,YAClB,UAAa,KACb,YAAe,OACf,WAAc,KACd,YAAe,MACf,WAAc,MACd,aAAgB,uBACjB,EAEMC,EAAU,CAAC,EAEjB,QAAQC,KAASpB,EAAM,CACtB,GAAG,OAAOkB,EAAIE,CAAK,GAAK,YAAa,CACpCD,EAASD,EAAIE,CAAK,CAAE,EAAIpB,EAAKoB,CAAK,EAClC,QACD,CAEAD,EAAQC,CAAK,EAAIpB,EAAKoB,CAAK,CAC5B,CAEA,OAAOD,CACR,CAEA,SAASE,GAAgBC,EAAKC,EAAW,CACxC,IAAGD,GAAA,YAAAA,EAAK,YAAaC,EACpB,MAAO,GAGR,GAAGA,EACFD,EAAI,UAAY,GAChBA,EAAI,gBAAkBA,EAAI,UACvBA,EAAI,UAAU,SAAS,WAAW,EACpCA,EAAI,iBAAmB,GAEvBA,EAAI,UAAU,IAAI,WAAW,EAG9BA,EAAI,UAAU,IAAI,eAAe,EACjCA,EAAI,aAAa,WAAY,UAAU,EACvCA,EAAI,UAAY,iDACV,CAEN,GADAA,EAAI,UAAY,GACb,CAACA,EAAI,gBACP,MAAO,GAERA,EAAI,gBAAgB,UAAU,EAC9BA,EAAI,UAAU,OAAO,eAAe,EAChCA,EAAI,kBACPA,EAAI,UAAU,OAAO,WAAW,EAEjCA,EAAI,UAAYA,EAAI,eACrB,CAEA,OAAOA,CACR,CAEA,SAASE,GAA6BC,EAAMF,EAAW,CACtD,IAAGE,GAAA,YAAAA,EAAM,YAAaF,EACrB,MAAO,GAGR,IAAMG,EAAgBD,EAAK,cAAc,cAAc,EAEvD,GAAGF,EACFE,EAAK,UAAY,GACjBA,EAAK,gBAAkBC,EAAc,UACrCD,EAAK,UAAU,IAAI,eAAe,EAClCA,EAAK,aAAa,WAAY,UAAU,EACxCC,EAAc,UAAY,yCACpB,CAEN,GADAD,EAAK,UAAY,GACd,CAACA,EAAK,gBACR,MAAO,GAERA,EAAK,gBAAgB,UAAU,EAC/BA,EAAK,UAAU,OAAO,eAAe,EACrCC,EAAc,UAAYD,EAAK,eAChC,CAEA,OAAOA,CACR,CAEA,SAASE,GAAaC,EAASf,EAAS,CACvC,OAAAA,EAAUA,GAAA,KAAAA,EAAW,GACd;AAAA;AAAA;AAAA;AAAA,OAIDe,CAAO;AAAA;AAAA;AAAA,OAGPf,CAAO;AAAA;AAAA;AAAA;AAAA,EAKd,CAEA,SAASgB,GAAsBC,EAAQ,CACtC,OAAOA,GAAU,SACd,kDACA,kDACJ,CAEA,SAASC,GAAiBC,EAAO,CAChC,OAAOA,GAAS,UACb,mDACA,mDACJ,CAEA,IAAOC,EAAQ,CACd,SAAU,CACT,WAAA1C,GACA,MAAAM,GACA,cAAAa,EACA,YAAAM,GACA,aAAAW,GACA,sBAAAE,GACA,iBAAAE,EACD,EACA,YAAa,CACZ,wBAAAd,EACD,EACA,OAAQ,CACP,gBAAAI,GACA,6BAAAG,EACD,CACD,EC7OO,IAAMU,EAAN,KAAiB,CACvB,YAAYC,EAAM,CACjB,KAAK,KAAOA,CACb,CAGA,aAAaC,EAAI,CAChB,OAAO,KAAK,KAAK,QAAQ,+BAAgCA,CAAE,CAC5D,CAGA,YAAYA,EAAI,CACf,OAAO,KAAK,KAAK,QAAQ,8BAA+BA,CAAE,CAC3D,CAGA,aAAaA,EAAI,CAChB,OAAO,KAAK,KAAK,QAAQ,+BAAgCA,CAAE,CAC5D,CAGA,sBAAsBC,EAAUD,EAAI,CACnC,IAAME,EAAO,mBAAmB,OAAOD,GAAY,EAAE,CAAC,EACtD,OAAO,KAAK,KAAK,QAAQ,+BAA+BC,CAAI,GAAIF,EAAI,CAEpE,CAAC,CACF,CAGA,aAAaG,EAASH,EAAI,CAEzB,OAAO,KAAK,KAAK,SAAS,6BAA8BG,EAASH,CAAE,CACpE,CAGA,aAAaG,EAASH,EAAI,CAEzB,OAAO,KAAK,KAAK,SAAS,gCAAiCG,EAASH,CAAE,CACvE,CAGA,cAAcI,EAAOJ,EAAI,CACxB,IAAME,EAAO,mBAAmB,OAAOE,GAAS,EAAE,CAAC,EACnD,OAAO,KAAK,KAAK,QAAQ,iCAAiCF,CAAI,UAAWF,CAAE,CAC5E,CAGA,eAAeI,EAAOJ,EAAI,CACzB,IAAME,EAAO,mBAAmB,OAAOE,GAAS,EAAE,CAAC,EACnD,OAAO,KAAK,KAAK,QAAQ,iCAAiCF,CAAI,WAAYF,CAAE,CAC7E,CAGA,eAAeI,EAAOJ,EAAI,CACzB,IAAME,EAAO,mBAAmB,OAAOE,GAAS,EAAE,CAAC,EACnD,OAAO,KAAK,KAAK,QAAQ,iCAAiCF,CAAI,UAAWF,CAAE,CAC5E,CAGA,gBAAgBI,EAAOJ,EAAI,CAC1B,IAAME,EAAO,mBAAmB,OAAOE,GAAS,EAAE,CAAC,EACnD,OAAO,KAAK,KAAK,QAAQ,iCAAiCF,CAAI,WAAYF,CAAE,CAC7E,CAGA,aAAaK,EAAML,EAAI,CACtB,IAAME,EAAO,mBAAmB,OAAOG,GAAQ,EAAE,CAAC,EAClD,OAAO,KAAK,KAAK,QAAQ,+BAA+BH,CAAI,UAAWF,CAAE,CAC1E,CAGA,cAAcK,EAAML,EAAI,CACvB,IAAME,EAAO,mBAAmB,OAAOG,GAAQ,EAAE,CAAC,EAClD,OAAO,KAAK,KAAK,QAAQ,+BAA+BH,CAAI,WAAYF,CAAE,CAC3E,CAGA,aAAaK,EAAML,EAAI,CACtB,IAAME,EAAO,mBAAmB,OAAOG,GAAQ,EAAE,CAAC,EAClD,OAAO,KAAK,KAAK,QAAQ,+BAA+BH,CAAI,UAAWF,CAAE,CAC1E,CAGA,IAAIG,EAASH,EAAI,CAEhB,OAAO,KAAK,KAAK,SAAS,8BAA+BG,EAASH,CAAE,CACrE,CACD,ECvFO,IAAMM,EAAN,KAAiB,CACvB,YAAYC,EAAM,CACjB,KAAK,KAAOA,CACb,CAGA,KAAKC,EAAI,CACR,OAAO,KAAK,KAAK,QAAQ,uBAAwBA,CAAE,CACpD,CAGA,eAAeA,EAAI,CAClB,OAAO,KAAK,KAAK,QAAQ,iCAAkCA,CAAE,CAC9D,CAGA,aAAaA,EAAI,CAChB,OAAO,KAAK,KAAK,QAAQ,+BAAgCA,CAAE,CAC5D,CAGA,iBAAiBC,EAASD,EAAI,CAE7B,OAAO,KAAK,KAAK,SAAS,mCAAoCC,EAASD,CAAE,CAC1E,CAGA,KAAKE,EAAIF,EAAI,CACZ,IAAMG,EAAO,mBAAmB,OAAOD,CAAE,CAAC,EAC1C,OAAO,KAAK,KAAK,QAAQ,sBAAsBC,CAAI,QAASH,CAAE,CAC/D,CAGA,IAAIE,EAAIF,EAAI,CACX,IAAMG,EAAO,mBAAmB,OAAOD,CAAE,CAAC,EAC1C,OAAO,KAAK,KAAK,QAAQ,sBAAsBC,CAAI,GAAIH,CAAE,CAC1D,CAGA,OAAOE,EAAIF,EAAI,CACd,IAAMG,EAAO,mBAAmB,OAAOD,CAAE,CAAC,EAC1C,OAAO,KAAK,KAAK,QAAQ,sBAAsBC,CAAI,UAAWH,CAAE,CACjE,CAGA,OAAOC,EAASD,EAAI,CAEnB,OAAO,KAAK,KAAK,SAAS,yBAA0BC,EAASD,CAAE,CAChE,CAGA,OAAOE,EAAIF,EAAI,CACd,IAAMG,EAAO,mBAAmB,OAAOD,CAAE,CAAC,EAC1C,OAAO,KAAK,KAAK,QAAQ,sBAAsBC,CAAI,UAAWH,CAAE,CACjE,CAGA,OAAOE,EAAIF,EAAI,CACd,IAAMG,EAAO,mBAAmB,OAAOD,CAAE,CAAC,EAC1C,OAAO,KAAK,KAAK,QAAQ,sBAAsBC,CAAI,UAAWH,CAAE,CACjE,CACD,ECjEO,IAAMI,EAAN,KAAe,CACrB,YAAYC,EAAM,CACjB,KAAK,KAAOA,CACb,CAGA,KAAKC,EAAI,CACR,OAAO,KAAK,KAAK,QAAQ,qBAAsBA,CAAE,CAClD,CAGA,WAAWC,EAASD,EAAI,CACvB,IAAME,EAAO,mBAAmB,OAAOD,CAAO,CAAC,EAC/C,OAAO,KAAK,KAAK,QAAQ,oBAAoBC,CAAI,QAASF,CAAE,CAC7D,CAGA,SAASG,EAASH,EAAI,CAErB,OAAO,KAAK,KAAK,SAAS,yBAA0BG,EAASH,CAAE,CAChE,CAGA,OAAOC,EAASD,EAAI,CACnB,IAAME,EAAO,mBAAmB,OAAOD,CAAO,CAAC,EAC/C,OAAO,KAAK,KAAK,QAAQ,oBAAoBC,CAAI,UAAWF,CAAE,CAC/D,CAGA,cAAcG,EAASH,EAAI,CAE1B,OAAO,KAAK,KAAK,SAAS,8BAA+BG,EAASH,CAAE,CACrE,CAGA,oBAAoBG,EAASH,EAAI,CAEhC,OAAO,KAAK,KAAK,SAAS,oCAAqCG,EAASH,CAAE,CAC3E,CAGA,aAAaG,EAASH,EAAI,CAEzB,OAAO,KAAK,KAAK,SAAS,6BAA8BG,EAASH,CAAE,CACpE,CAGA,QAAQC,EAASD,EAAI,CACpB,IAAME,EAAO,mBAAmB,OAAOD,CAAO,CAAC,EAC/C,OAAO,KAAK,KAAK,QAAQ,oBAAoBC,CAAI,WAAYF,CAAE,CAChE,CAGA,mBAAmBC,EAASD,EAAI,CAC/B,IAAME,EAAO,mBAAmB,OAAOD,CAAO,CAAC,EAC/C,OAAO,KAAK,KAAK,QAAQ,oBAAoBC,CAAI,sBAAuBF,CAAE,CAC3E,CAGA,WAAWA,EAAI,CACd,OAAO,KAAK,KAAK,QAAQ,2BAA4BA,CAAE,CACxD,CAIA,eAAeC,EAASD,EAAI,CAC3B,GAA6BC,GAAY,KACxC,OAAO,KAAK,KAAK,QAAQ,+BAAgCD,CAAE,EAE5D,IAAME,EAAO,mBAAmB,OAAOD,CAAO,CAAC,EAC/C,OAAO,KAAK,KAAK,QAAQ,oBAAoBC,CAAI,kBAAmBF,CAAE,CACvE,CACD,ECvDA,SAASI,EAAYC,EAAQ,CAC5B,GAAI,CAACA,GAAU,OAAOA,GAAW,SAAU,MAAO,GAClD,IAAMC,EAAM,IAAI,gBAChB,OAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAGC,CAAC,IAAM,CACnBA,GAAM,MAC7BF,EAAI,OAAOC,EAAG,OAAOC,CAAC,CAAC,CACxB,CAAC,EACD,IAAMC,EAAIH,EAAI,SAAS,EACvB,OAAOG,EAAI,IAAIA,CAAC,GAAK,EACtB,CAEA,SAASC,GAASC,EAAUC,EAAM,CACjC,IAAMC,EAAI,OAAOF,GAAY,EAAE,EAAE,QAAQ,OAAQ,EAAE,EAC7CG,EAAI,OAAOF,GAAQ,EAAE,EAAE,QAAQ,OAAQ,EAAE,EAC/C,MAAO,GAAGC,CAAC,IAAIC,CAAC,EACjB,CAEA,SAASC,GAAgBC,EAAM,CAC9B,GAAI,CACH,MAAO,CAAE,GAAI,GAAM,KAAM,KAAK,MAAMA,CAAI,CAAE,CAC3C,OAAS,EAAG,CACX,MAAO,CAAE,GAAI,GAAO,MAAO,CAAE,CAC9B,CACD,CAMO,IAAMC,EAAN,KAAmB,CAUzB,YAAYC,EAAM,CACjB,KAAK,UAAWA,GAAA,YAAAA,EAAM,WAAY,GAClC,KAAK,OAAQA,GAAA,YAAAA,EAAM,QAAS,GAC5B,KAAK,WAAa,OAAO,SAASA,GAAA,YAAAA,EAAM,UAAU,EAAIA,EAAK,WAAa,KACxE,KAAK,iBAAkBA,GAAA,YAAAA,EAAM,kBAAmB,CAAC,EACjD,KAAK,gBAAkB,OAAOA,GAAA,YAAAA,EAAM,kBAAoB,WAAaA,EAAK,gBAAkB,KAC5F,KAAK,YAAaA,GAAA,YAAAA,EAAM,aAAc,GAGtC,KAAK,QAAU,IAAIC,EAAW,IAAI,EAClC,KAAK,QAAU,IAAIC,EAAW,IAAI,EAClC,KAAK,MAAQ,IAAIC,EAAS,IAAI,CAC/B,CAEA,aAAaV,EAAU,CACtB,KAAK,SAAWA,GAAY,EAC7B,CAEA,UAAUW,EAAO,CAChB,KAAK,MAAQA,GAAS,EACvB,CAEA,eAAeC,EAAY,CAC1B,KAAK,WAAaA,GAAc,EACjC,CAEA,WAAWX,EAAMY,EAAa,CAE7B,GAAI,CAAC,KAAK,WACT,OAAKA,EACE,GAAGZ,CAAI,GAAGR,EAAYoB,CAAW,CAAC,GADhBZ,EAI1B,IAAMa,EAAIC,EAAA,CAAE,KAAAd,GAAUY,GAAe,CAAC,GACtC,MAAO,GAAG,KAAK,UAAU,GAAGpB,EAAYqB,CAAC,CAAC,EAC3C,CAUA,QAAQE,EAAQf,EAAMgB,EAAMC,EAAIX,EAAM,CACrC,IAAMY,EAAW,OAAOD,GAAO,WAAaA,EAAK,IAAM,CAAC,EAClDE,EAAMrB,GAAS,KAAK,SAAUE,CAAI,EAElCoB,EAAa,IAAI,gBACjBC,EAAa,OAAO,SAASf,GAAA,YAAAA,EAAM,UAAU,EAAIA,EAAK,WAAa,KAAK,WAExEgB,EAAI,WAAW,IAAMF,EAAW,MAAM,EAAGC,CAAU,EAEnDE,EAAUT,IAAA,GACZ,KAAK,kBACJR,GAAA,YAAAA,EAAM,UAAW,CAAC,GAInB,KAAK,QAAOiB,EAAQ,cAAmB,UAAU,KAAK,KAAK,IAE/D,IAAIC,EACsBR,GAAS,OAClCO,EAAQ,cAAc,EAAI,mBAC1BC,EAAU,KAAK,UAAUR,CAAI,GAG9B,MAAMG,EAAK,CACV,OAAAJ,EACA,QAAAQ,EACA,KAAMC,EACN,OAAQJ,EAAW,MACpB,CAAC,EACC,KAAYK,GAAQC,EAAA,sBACpB,aAAaJ,CAAC,EAEd,IAAMK,EAAO,CACZ,IAAAR,EACA,OAAAJ,EACA,YAAaU,EAAI,OACjB,QAASA,EAAI,OACd,EAEMrB,EAAO,MAAMqB,EAAI,KAAK,EACtBG,EAASzB,GAAgBC,CAAI,EAC7ByB,EAAOD,EAAO,GAAKA,EAAO,KAAOxB,EAGvC,GAAI,CAACqB,EAAI,GAAI,CACZ,IAAMK,EAAM,CACX,KAAM,aACN,QAAS,QAAQL,EAAI,MAAM,GAC3B,YAAaA,EAAI,OACjB,IAAKI,CACN,EAEA,IAAIJ,EAAI,SAAW,KAAOA,EAAI,SAAW,MACpC,KAAK,gBACR,GAAI,CACH,KAAK,gBAAgB,CAAE,MAAOK,EAAK,KAAAH,CAAK,CAAC,CAC1C,OAASI,EAAG,CAAC,CAIf,OAAOb,EAASY,EAAK,KAAMH,CAAI,CAChC,CAGA,GAAIC,EAAO,IAAMC,GAAQ,OAAOA,GAAS,SAAU,CAClD,IAAMG,EAAKH,EAAK,OAChB,GAAIG,IAAO,IAASA,IAAO,QAAS,CACnC,IAAMF,EAAM,CACX,KAAM,YACN,QAASD,EAAK,SAAW,YACzB,YAAaJ,EAAI,OACjB,IAAKI,EACL,MAAOA,EAAK,KACb,EACA,OAAOX,EAASY,EAAK,KAAMH,CAAI,CAChC,CACD,CAEA,OAAOT,EAAS,KAAMW,EAAMF,CAAI,CACjC,EAAC,EACA,MAAOM,GAAM,CACb,aAAaX,CAAC,EAGd,IAAMQ,EADWG,IAAMA,EAAE,OAAS,cAAgB,OAAOA,CAAC,EAAE,SAAS,YAAY,GAE9E,CAAE,KAAM,UAAW,QAAS,iBAAiBZ,CAAU,IAAK,EAC5D,CAAE,KAAM,gBAAiB,SAASY,GAAA,YAAAA,EAAG,UAAW,gBAAiB,QAASA,CAAE,EAE/E,OAAOf,EAASY,EAAK,KAAM,CAAE,IAAAX,EAAK,OAAAJ,EAAQ,YAAa,EAAG,QAAS,IAAK,CAAC,CAC1E,CAAC,CACH,CAEA,IAAIf,EAAMiB,EAAIX,EAAM,CACnB,OAAO,KAAK,QAAQ,MAAON,EAAM,KAAMiB,EAAIX,CAAI,CAChD,CAEA,KAAKN,EAAMgB,EAAMC,EAAIX,EAAM,CAC1B,OAAO,KAAK,QAAQ,OAAQN,EAAMgB,EAAMC,EAAIX,CAAI,CACjD,CAEA,QAAQ4B,EAAUjB,EAAIL,EAAaN,EAAM,CACxC,OAAO,KAAK,IAAI,KAAK,WAAW4B,EAAUtB,CAAW,EAAGK,EAAIX,CAAI,CACjE,CAEA,SAAS4B,EAAUlB,EAAMC,EAAIL,EAAaN,EAAM,CAC/C,OAAO,KAAK,KAAK,KAAK,WAAW4B,EAAUtB,CAAW,EAAGI,EAAMC,EAAIX,CAAI,CACxE,CACD,EChNA,SAAS6B,EAAgBC,EAAQ,CAChC,OAAO,OAAO,SAAS,WAAW,CACjC,CACC,QAAS,oEACT,MAAO,cACP,UAAWA,GAAU,SACtB,EACA,CACC,QAAS,kFACT,MAAO,uBACP,UAAWA,GAAU,UACtB,EACA,CACC,QAAS,qEACT,MAAO,sBACP,UAAWA,GAAU,SACtB,CACD,CAAC,CACF,CAEA,SAASC,EAAuBC,EAAQC,EAAKC,EAAO,CACnD,OAAO,OAAO,gBAAgBD,EAAK,EAAI,EAEvC,IAAME,EAAWF,EAAI,QAAQ,SACvBG,EAAaH,EAAI,QAAQ,WACzBI,EAAcJ,EAAI,QAAQ,YAEhCD,EAAO,QAAQ,OACdG,EACA,CAACG,EAAKC,EAAMC,IAAS,CACpB,OAAO,OAAO,gBAAgBP,EAAK,EAAK,EACxC,QAAQ,IAAI,cAAeK,EAAKC,EAAMC,CAAI,EAE1CN,GAAA,MAAAA,EAAO,QAEJK,GACF,WAAW,IAAM,QAAQ,OAAO,EAAG,GAAI,EACvC,OAAO,cACN,oBACA,WAAWH,CAAU;AAAA,iBACTC,CAAW,MACxB,EAAE,KAAK,GAEP,OAAO,YACN,gBACA,WAAWD,CAAU;AAAA,iBACTC,CAAW,MACxB,EAAE,KAAK,CAET,CACD,CACD,CCjDO,SAASI,EAAmBC,EAAQC,EAAQ,CAClD,eAAQ,IAAID,CAAM,EAEX,OAAO,OAAO,eAAgB,CACpC,MAAO,UAAUA,EAAO,IAAI,GAC5B,KAAME,GAAS,CACd,IAAIC,EAAmB,GACvB,QAAQC,KAASJ,EAChBG,GAAoB;AAAA;AAAA,YAEZC,CAAK;AAAA,YACLJ,EAAOI,CAAK,CAAC;AAAA;AAAA,MAKtB,MAAO;AAAA;AAAA;AAAA;AAAA,SAIDD,CAAgB;AAAA;AAAA;AAAA;AAAA,IAKvB,EACA,QAASD,GAAS,CACjB,IAAMG,EAAe,OAAO,SAAS,cAAc,SAAU,CAC5D,MAAO,iBACR,EAAG,OAAO,EAEJC,EAAe,OAAO,SAAS,cAAc,SAAU,CAC5D,MAAO,2BACR,EAAG,8CAA8C,EAE3CC,EAAe,OAAO,SAAS,cAAc,SAAU,CAC5D,MAAO,0BACR,EAAG,oCAAoC,EAEvC,OAAAF,EAAa,iBAAiB,QAASG,GAAK,CAC3CN,EAAM,MAAM,CACb,CAAC,EAEDI,EAAa,QAAQ,SAAWN,EAAO,GACvCM,EAAa,QAAQ,WAAaN,EAAO,KACzCM,EAAa,QAAQ,YAAcN,EAAO,MAE1CM,EAAa,iBAAiB,QAASE,GAAK,CACxCF,EAAa,aAAa,UAAU,GAIvCG,EAAuBR,EAAQO,EAAE,cAAeN,CAAK,CACtD,CAAC,EAEDK,EAAa,iBAAiB,QAASC,GAAK,CACxCD,EAAa,aAAa,UAAU,IAIvC,OAAO,OAAO,gBAAgBA,EAAc,EAAI,EAChD,aACC,+CACA,IAAM,CACLN,EAAO,QAAQ,OACdD,EAAO,GACP,CAACU,EAAKC,EAAMC,IAAS,CAEpB,OAAO,OAAO,gBAAgBL,EAAc,EAAK,EACjD,QAAQ,IAAI,aAAa,EAEzBL,EAAM,MAAM,EACZ,QAAQ,OAAO,EAEf,WAAW,IAAM,CAChB,OAAO,cACN,UACA;AAAA,oBACUF,EAAO,IAAI;AAAA,sBACTA,EAAO,KAAK;AAAA,mBACfA,EAAO,EAAE;AAAA,WAEnB,EAAE,KAAK,CACR,EAAG,GAAG,CACP,CACD,CACF,EACA,IAAM,CACL,OAAO,OAAO,gBAAgBO,EAAc,EAAK,EACjD,QAAQ,IAAI,UAAU,CACvB,CAAC,EACF,CAAC,EAEM,CAAEF,EAAcC,EAAcC,CAAa,CACnD,CACD,CAAC,CACF,CC/FA,SAASM,GAAYC,EAAM,CAC1B,IAAMC,EAAe,CAAC,EACtB,QAAQC,KAAUF,EAAK,QACtBE,EAAS,OAAO,YAAY,wBAAwBA,CAAM,EAE1DD,EAAa,KAAK,CACjB,WAAYC,EAAO,KACnB,MAAOA,EAAO,MACd,OAAQ,OAAO,SAAS,sBAAsBA,EAAO,gBAAgB,EACrE,GAAI,sBAAsBA,EAAO,EAAE,UACnC,QAAS;AAAA;AAAA;AAAA,oBAGQ,KAAK,UAAUA,CAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMnBA,EAAO,EAAE;AAAA,yBACPA,EAAO,IAAI;AAAA,0BACVA,EAAO,KAAK;AAAA;AAAA;AAAA,IAIpC,CAAC,EAGF,OAAOD,CACR,CAEA,SAASE,GAAmBC,EAAKJ,EAAMK,EAAO,CAC7CD,EAAI,cAAc,UAAU,cAAc,iBAAiB,EAAE,UAAY,OAAO,SAAS,MACxF,eACA,CACC,WAAY,cACZ,MAAO,eACP,OAAQ,SACR,GAAI,KACJ,QAAS,SACV,EACAJ,EACA,uDAAuDK,CAAK,wBAC7D,CACD,CAEA,SAASC,GAAiCF,EAAKG,EAAQ,CACtDH,EAAI,cAAc,UAAU,iBAAiB,aAAa,EAAE,QAAQI,GAAO,CAC1EA,EAAI,iBAAiB,QAASC,GAAK,CAC/BA,EAAE,cAAc,aAAa,UAAU,GAI1CC,EAAuBH,EAAQE,EAAE,aAAa,CAC/C,CAAC,CACF,CAAC,EAEDL,EAAI,cAAc,UAAU,iBAAiB,cAAc,EAAE,QAAQI,GAAO,CAC3EA,EAAI,iBAAiB,QAASC,GAAK,CAClC,IAAMP,EAAS,KAAK,MAAMO,EAAE,cAAc,QAAQ,MAAM,EACxDE,EAAmBT,EAAQK,CAAM,EAAE,KAAK,CACzC,CAAC,CACF,CAAC,CACF,CAEA,SAASK,EAAKL,EAAQ,CACrB,MAAO,CACN,MAAO,UACP,SAAU,IACF,OAAO,SAAS,aAAaM,EAAgB,SAAS,CAAC,EAG/D,OAAQT,GAAO,CACdG,EAAO,QAAQ,KAAK,CAACO,EAAKC,EAAMC,IAAS,CAGxC,GAFA,QAAQ,IAAI,sBAAuBF,EAAKC,EAAMC,CAAI,EAE/CA,EAAK,aAAe,IACtB,OAAOZ,EAAI,MAAM,mBAAoB,EAAE,EAGxCD,GAAmBC,EAAKL,GAAYgB,EAAK,IAAI,EAAGA,EAAK,KAAK,KAAK,EAC/DT,GAAiCF,EAAKG,CAAM,EAE5CH,EAAI,MAAM,CACX,CAAC,CACF,CACD,CACD,CC1FO,SAASa,EAAqBC,EAAQC,EAAQ,CACpD,OAAAD,EAAS,OAAO,YAAY,wBAAwBA,CAAM,EAEnD,OAAO,OAAO,eAAgB,CACpC,MAAO,oBAAoBA,EAAO,EAAE,GACpC,KAAME,GAAS,CAEd,IAAIC,EAAmB,GACvB,QAAQC,KAASJ,EACbI,EAAM,CAAC,GAAK,MACfD,GAAoB;AAAA;AAAA,YAEZC,CAAK;AAAA,YACLJ,EAAOI,CAAK,CAAC;AAAA;AAAA,OAetB,MAAO;AAAA;AAAA;AAAA,QAVY;AAAA;AAAA;AAAA;AAAA,SAIbD,CAAgB;AAAA;AAAA;AAAA;AAAA,IASP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgChB,EACA,QAASD,GAAS,CACjB,IAAMG,EAAe,OAAO,SAAS,cAAc,SAAU,CAAE,MAAO,iBAAkB,EAAG,QAAQ,EACnGA,EAAa,iBAAiB,QAASC,GAAK,CAC3CJ,EAAM,MAAM,CACb,CAAC,EAED,IAAMK,EAAe,OAAO,SAAS,cAAc,SAClD,CAAE,MAAO,2BAA4B,EACrC,kCACD,EAEA,OAAAA,EAAa,iBAAiB,QAASD,GAAK,CAC3C,GAAGA,EAAE,cAAc,aAAa,UAAU,EACzC,MAAO,GAGR,IAAME,EAAS,CACd,UAAWR,EAAO,EACnB,EAEMS,EAAY,SAAS,cAAc,2BAA2B,EAOpE,GANAA,EAAU,iBAAiB,oBAAoB,EAAE,QAAQC,GAAK,CAC7DA,EAAE,cACD,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CACrC,CACD,CAAC,EAEED,EAAU,iBAAiB,cAAc,EAAE,OAC7C,MAAO,GAGR,IAAME,EAAgBF,EAAU,iBAAiB,OAAO,EAClDG,EAAkBH,EAAU,cAAc,UAAU,EAE1D,QAAQI,KAASF,EAChBH,EAAOK,EAAM,aAAa,MAAM,CAAC,EAAIA,EAAM,MAG5CL,EAAOI,EAAgB,aAAa,MAAM,CAAC,EAAIA,EAAgB,MAE/D,OAAO,OAAO,gBAAgBL,EAAc,EAAI,EAEhDN,EAAO,QAAQ,iBAAiBO,EAAQ,CAACM,EAAKC,EAAMC,IAAS,CA1GjE,IAAAC,EAAAC,EA6GK,GAFA,OAAO,OAAO,gBAAgBX,EAAc,EAAK,GAE9CO,GAAA,YAAAA,EAAK,OAAQ,YAAa,CAG5B,GAFA,QAAQ,MAAM,uCAAwCA,EAAI,GAAG,GAE1DG,EAAAH,EAAI,MAAJ,MAAAG,EAAS,cACX,QAAQE,KAAgBL,EAAI,IAAI,cAC/BZ,EAAM,cAAc,UAAUiB,CAAY,IAAI,EAAE,WAAW,UAAU,IAAI,OAAO,EAIlF,IAAGD,EAAAJ,EAAI,MAAJ,MAAAI,EAAS,IAAK,CAChB,IAAME,EAAiBlB,EAAM,cAAc,8BAA8B,EACzEkB,EAAe,UAAY,GAC3BA,GAAA,MAAAA,EAAgB,OAAO,OAAO,SAAS,YAAa,QAASN,EAAI,IAAI,GAAI,EAC1E,CAEA,MAAO,EACR,CAEA,GAAG,CAACC,EACH,MAAO,GAGRJ,EAAc,QAAQD,GAAKA,EAAE,MAAQ,EAAE,EACvCE,EAAgB,MAAQ,GACxBV,EAAM,MAAM,EAEZ,QAAQ,OAAO,EAEf,WAAW,IAAM,CAChB,OAAO,cAAc,mBAAoB,0BAA0BF,EAAO,SAAS,MAAM,EAAE,KAAK,CACjG,EAAG,GAAG,CACP,CAAC,CACF,CAAC,EAEM,CAAEK,EAAcE,CAAa,CACrC,EAEA,QAASL,GAAS,CACCA,EAAM,cAAc,aAAa,EACzC,iBAAiB,OAAO,EAAE,QAAQQ,GAAK,CAChDA,EAAE,iBAAiB,QAASJ,GAAK,CArJrC,IAAAW,EAsJSX,EAAE,cAAc,MAAM,QAQzBA,EAAE,cAAc,WAAW,UAAU,OAAO,OAAO,GACnDW,EAAAX,EAAE,cAAc,WAAW,WAAW,cAAc,mBAAmB,IAAvE,MAAAW,EAA0E,WAR1EX,EAAE,cAAc,WAAW,UAAU,IAAI,OAAO,EAC5CA,EAAE,cAAc,WAAW,WAAW,cAAc,mBAAmB,GAC1EA,EAAE,cAAc,WAAW,WAAW,OAAO,OAAO,SAAS,cAAc,MAAO,CACjF,MAAO,kBACR,EAAG,4DAA4D,CAAC,EAMnE,CAAC,CACF,CAAC,CACF,CACD,CAAC,CACF,CClKA,SAASe,GAAYC,EAAM,CAC1B,IAAMC,EAAe,CAAC,EACtB,QAAQC,KAAUF,EAAK,QACtBE,EAAS,OAAO,YAAY,wBAAwBA,CAAM,EAE1DD,EAAa,KAAK,CACjB,SAAUC,EAAO,UACjB,WAAYA,EAAO,KACnB,WAAYA,EAAO,KACnB,OAAQ,qCAAqCA,EAAO,MAAM,UAC1D,GAAI,sBAAsBA,EAAO,EAAE,UACnC,IAAK,sBAAsBA,EAAO,GAAG,UACrC,WAAYA,EAAO,YACnB,QAASA,EAAO,QAAU,QAAU;AAAA;AAAA;AAAA,oBAGnB,KAAK,UAAUA,CAAM,CAAC;AAAA;AAAA;AAAA,KAGnC,EACL,CAAC,EAGF,OAAOD,CACR,CAEA,SAASE,GAAmBC,EAAKJ,EAAMK,EAAO,CAC7CD,EAAI,cAAc,UAAU,cAAc,iBAAiB,EAAE,UAAY,OAAO,SAAS,MACxF,gBACA,CACC,SAAU,YACV,WAAY,cACZ,WAAY,OACZ,OAAQ,SACR,GAAI,KACJ,IAAK,MACL,WAAY,SACZ,QAAS,SACV,EACAJ,EACA,uDAAuDK,CAAK,wBAC7D,CACD,CAEA,SAASC,GAAiCF,EAAKG,EAAQ,CACtDH,EAAI,cAAc,UAAU,iBAAiB,YAAY,EAAE,QAAQI,GAAO,CACzEA,EAAI,iBAAiB,QAASC,GAAK,CAClC,IAAMP,EAAS,KAAK,MAAMO,EAAE,cAAc,QAAQ,MAAM,EACxDC,EAAqBR,EAAQK,CAAM,EAAE,KAAK,CAC3C,CAAC,CACF,CAAC,CACF,CAEA,SAASI,EAASJ,EAAQ,CACzB,MAAO,CACN,MAAO,mBACP,SAAU,IACF,OAAO,SAAS,aAAaK,EAAgB,UAAU,CAAC,EAEhE,OAAQR,GAAO,CACdG,EAAO,QAAQ,aAAa,CAACM,EAAKC,EAAMC,IAAS,CAGhD,GAFA,QAAQ,IAAI,8BAA+BF,EAAKC,CAAI,EAEjDC,EAAK,aAAe,IACtB,OAAOX,EAAI,MAAM,mBAAoB,EAAE,EAGxCD,GAAmBC,EAAKL,GAAYe,EAAK,IAAI,EAAGA,EAAK,KAAK,QAAQ,MAAM,EACxER,GAAiCF,EAAKG,CAAM,EAE5CH,EAAI,MAAM,CACX,CAAC,CACF,CACD,CACD,CC1EA,IAAOY,EAAQ,CACd,KAAAC,EACA,SAAAC,CACD,ECNA,SAASC,EAAgBC,EAAQ,CAChC,OAAO,OAAO,SAAS,WAAW,CACjC,CACC,QAAS,mEACT,MAAO,qBACP,UAAWA,GAAU,QACtB,EACA,CACC,QAAS,qEACT,MAAO,sBACP,UAAWA,GAAU,SACtB,EACA,CACC,QAAS,iFACT,MAAO,sBACP,UAAWA,GAAU,SACtB,CACD,CAAC,CACF,CAEA,SAASC,EAAgBC,EAAQC,EAAOC,EAAI,CAC3CF,EAAO,QAAQ,IAAI,CAClB,MAAOC,EACP,OAAQ,CAAC,CACV,EAAG,CAACE,EAAKC,EAAMC,IAAS,CACpBD,GACFF,EAAG,EAAI,EAEP,WAAW,IAAM,QAAQ,OAAO,EAAG,GAAI,EAEvC,WAAW,IAAM,OAAO,cACvB,GAAGD,CAAK,WACR,MAAMA,CAAK,sBACZ,EAAE,KAAK,EAAG,GAAG,IAEbC,EAAG,EAAK,EAER,WAAW,IAAM,OAAO,YACvB,GAAGD,CAAK,UACR,MAAMA,CAAK,qBACZ,EAAE,KAAK,EAAG,GAAG,EAEf,CAAC,CACF,CCzCA,SAASK,GAAYC,EAAM,CAC1B,IAAMC,EAAe,CAAC,EAEtB,QAAQC,KAASF,EAAK,OAAQ,CAC7B,IAAMG,EAAYD,EAAM,OAAS,WAC9B;AAAA;AAAA,mBAEc,KAAK,UAAUA,CAAK,CAAC;AAAA;AAAA;AAAA,sBAInC;AAAA;AAAA,mBAEc,KAAK,UAAUA,CAAK,CAAC;AAAA;AAAA;AAAA,uBAKtCD,EAAa,KAAK,CACjB,KAAMC,EAAM,KACZ,SAAU,GAAGA,EAAM,QAAQ,oBAAoBA,EAAM,IAAI,kBACzD,MAAO,OAAO,SAAS,iBAAiBA,EAAM,KAAK,EACnD,QAAS;AAAA,MACNC,CAAS;AAAA,IAEb,CAAC,CACF,CAEA,OAAOF,CACR,CAEA,SAASG,GAAmBC,EAAKL,EAAMM,EAAO,CAC7CD,EAAI,cAAc,UAAU,cAAc,iBAAiB,EAAE,UAAY,OAAO,SAAS,MACxF,cACA,CACC,KAAM,aACN,SAAU,WACV,MAAO,QACP,QAAS,SACV,EACAL,EACA,uDAAuDM,CAAK,uBAC7D,CACD,CAEA,SAASC,GAAiCF,EAAKG,EAAQ,CACtDH,EAAI,cAAc,UAAU,iBAAiB,mBAAmB,EAAE,QAAQI,GAAO,CAChFA,EAAI,iBAAiB,QAASC,GAAK,CAClC,IAAMD,EAAMC,EAAE,cACd,GAAGD,EAAI,aAAa,UAAU,EAC7B,OAGD,IAAME,EAAWF,EAAI,QAAQ,OAAS,SACnC,eACA,gBAEGP,EAAQ,KAAK,MAAMO,EAAI,QAAQ,KAAK,EAC1C,OAAO,OAAO,gBAAgBA,EAAK,EAAI,EACvCD,EAAO,QAAQG,CAAQ,EAAET,EAAM,KAAM,CAACU,EAAKZ,EAAMa,IAAS,CACzD,OAAO,OAAO,gBAAgBJ,EAAK,EAAK,EAErCT,GACF,WAAW,IAAM,QAAQ,OAAO,EAAG,GAAG,EACtC,OAAO,cACN,kBACA,eAAeE,EAAM,IAAI,kBAC1B,EAAE,KAAK,GAEP,OAAO,YACN,iBACA,yBACD,EAAE,KAAK,CAGT,CAAC,CACF,CAAC,CACF,CAAC,CACF,CAEA,SAASY,EAAON,EAAQ,CACvB,MAAO,CACN,MAAO,iBACP,MAAO,iBACP,SAAU,IACF,OAAO,SAAS,aAAaO,EAAgB,QAAQ,CAAC,EAE9D,OAAQV,GAAO,CACdG,EAAO,QAAQ,YAAY,CAACI,EAAKI,EAAMH,IAAS,CAG/C,GAFA,QAAQ,IAAI,6BAA8BD,EAAKI,EAAMH,CAAI,EAEtDA,EAAK,aAAe,IACtB,OAAOR,EAAI,MAAM,mBAAoB,EAAE,EAGxCD,GAAmBC,EAAKN,GAAYiB,EAAK,IAAI,EAAGA,EAAK,KAAK,KAAK,EAC/DT,GAAiCF,EAAKG,CAAM,EAE5CH,EAAI,MAAM,CACX,CAAC,CACF,CACD,CACD,CCtGA,SAASY,GAAYC,EAAM,CAC1B,IAAMC,EAAe,CAAC,EAEtB,QAAQC,KAAUF,EAAK,QAAS,CAC/B,IAAMG,EAAYD,EAAO,OAAS,WAC/B;AAAA;AAAA,mBAEcA,EAAO,KAAK;AAAA;AAAA;AAAA,sBAI1B;AAAA;AAAA,mBAEcA,EAAO,KAAK;AAAA;AAAA;AAAA,uBAK7BD,EAAa,KAAK,CACjB,MAAO,GAAGC,EAAO,KAAK,oCAAoCA,EAAO,UAAU,WAC3E,KAAM,GAAGA,EAAO,IAAI,4BAA4BA,EAAO,WAAW,iBAClE,SAAU,GAAGA,EAAO,QAAQ,oBAAoBA,EAAO,IAAI,kBAC3D,MAAO,OAAO,SAAS,iBAAiBA,EAAO,KAAK,EACpD,QAAS;AAAA,MACNC,CAAS;AAAA,IAEb,CAAC,CACF,CAEA,OAAOF,CACR,CAEA,SAASG,GAAmBC,EAAKL,EAAMM,EAAO,CAC7C,IAAMC,EAAoB,CAAC,EAC3B,QAAQC,KAAKR,EACZO,EAAkBP,EAAKQ,CAAC,EAAE,KAAK,EAAIR,EAAKQ,CAAC,EACzCR,EAAKQ,CAAC,EAAE,KAAU,GAEnBH,EAAI,cAAc,UAAU,kBAAoBE,EAEhDF,EAAI,cAAc,UAAU,cAAc,iBAAiB,EAAE,UAAY,OAAO,SAAS,MACxF,uBACA,CACC,MAAO,QACP,KAAM,cACN,SAAU,WACV,MAAO,QACP,QAAS,SACV,EACAL,EACA,uDAAuDM,CAAK,wBAC7D,CACD,CAEA,SAASG,GAAiCJ,EAAKK,EAAQ,CACtDL,EAAI,cAAc,UAAU,iBAAiB,mBAAmB,EAAE,QAAQM,GAAO,CAChFA,EAAI,iBAAiB,QAASC,GAAK,CA1DrC,IAAAC,EA2DG,IAAMF,EAAMC,EAAE,cACd,GAAGD,EAAI,aAAa,UAAU,EAC7B,OAGD,IAAMG,EAAWH,EAAI,QAAQ,OAAS,SACnC,iBACA,kBAEGT,GAASW,EAAAR,EAAI,cAAc,UAAU,kBAAkBM,EAAI,QAAQ,KAAK,IAA/D,KAAAE,EAAoE,CAAC,EAEpF,OAAO,OAAO,gBAAgBF,EAAK,EAAI,EACvCD,EAAO,QAAQI,CAAQ,EAAEZ,EAAO,MAAO,CAACa,EAAKf,EAAMgB,IAAS,CAC3D,OAAO,OAAO,gBAAgBL,EAAK,EAAK,EAErCX,GACF,WAAW,IAAM,QAAQ,OAAO,EAAG,GAAG,EACtC,OAAO,cACN,kBACA,eAAeE,EAAO,KAAK,kBAC5B,EAAE,KAAK,GAEP,OAAO,YACN,iBACA,kCACD,EAAE,KAAK,CAGT,CAAC,CACF,CAAC,CACF,CAAC,CACF,CAEA,SAASe,EAAQP,EAAQ,CACxB,MAAO,CACN,MAAO,kBACP,MAAO,kBACP,SAAU,IACF,OAAO,SAAS,aAAaQ,EAAgB,SAAS,CAAC,EAE/D,OAAQb,GAAO,CACdK,EAAO,QAAQ,aAAa,CAACK,EAAKI,EAAMH,IAAS,CAGhD,GAFA,QAAQ,IAAI,8BAA+BD,EAAKI,EAAMH,CAAI,EAEvDA,EAAK,aAAe,IACtB,OAAOX,EAAI,MAAM,mBAAoB,EAAE,EAGxCD,GAAmBC,EAAKN,GAAYoB,EAAK,IAAI,EAAGA,EAAK,KAAK,KAAK,EAC/DV,GAAiCJ,EAAKK,CAAM,EAE5CL,EAAI,MAAM,CACX,CAAC,CACF,CACD,CACD,CChHO,SAASe,GAAmBC,EAAQC,EAAQ,CAClD,eAAQ,IAAI,qBAAsBD,CAAM,EAEjC,OAAO,OAAO,sBAAuB,CAC3C,MAAO,GAAGA,EAAO,IAAI,GACrB,KAAME,GACE;AAAA;AAAA;AAAA;AAAA,mFAIyEF,EAAO,KAAK;AAAA,uCACxDA,EAAO,WAAW;AAAA,kCACvB,OAAO,SAAS,iBAAiBA,EAAO,KAAK,CAAC;AAAA,8EACFA,EAAO,QAAQ;AAAA,qFACRA,EAAO,MAAM;AAAA;AAAA;AAAA;AAAA,4DAItCA,EAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,KAOrE,QAASE,GAAS,CACjB,IAAMC,EAAY,OAAO,SAAS,cAAc,SAAU,CACzD,MAAO,iBACR,EAAG,OAAO,EAEJC,EAAiB,OAAO,SAAS,cAAc,SAAU,CAC9D,MAAOJ,EAAO,OAAS,UAAY,kBAAoB,kBACvD,aAAcA,EAAO,OAAS,UAAY,UAAY,QACvD,EAAGA,EAAO,OAAS,UAAY,UAAY,QAAQ,EAG7CK,EAAS,OAAO,SAAS,cAAc,SAAU,CACtD,MAAO,6BACR,EAAG,gCAAgC,EAEnC,OAAAF,EAAU,iBAAiB,QAASG,GAAK,CACxCJ,EAAM,MAAM,CACb,CAAC,EAEDE,EAAe,iBAAiB,QAASE,GAAK,CAC7C,IAAMC,EAAMD,EAAE,cACd,GAAGC,EAAI,aAAa,UAAU,EAC7B,OAGD,IAAMC,EAAWD,EAAI,QAAQ,OAAS,SACnC,gBACA,iBAIH,OAAO,OAAO,gBAAgBA,EAAK,EAAI,EACvCN,EAAO,QAAQO,CAAQ,EAAER,EAAO,MAAO,CAACS,EAAKC,EAAMC,IAAS,CAC3D,OAAO,OAAO,gBAAgBJ,EAAK,EAAK,EACxCL,EAAM,MAAM,EAETQ,GACF,WAAW,IAAM,QAAQ,OAAO,EAAG,GAAG,EACtC,OAAO,cACN,kBACA,eAAeV,EAAO,KAAK,kBAC5B,EAAE,KAAK,GAEP,OAAO,YACN,iBACA,kCACD,EAAE,KAAK,CAGT,CAAC,CACF,CAAC,EAEDK,EAAO,iBAAiB,QAASC,GAAK,CACrC,IAAMC,EAAMD,EAAE,cACd,OAAO,OAAO,gBAAgBC,EAAK,EAAI,EAEvCK,EAAgBX,EAAQD,EAAO,MAAOa,GAAc,CACnD,OAAO,OAAO,gBAAgBN,EAAK,EAAK,EACrCM,GACFX,EAAM,MAAM,CAEd,CAAC,CACF,CAAC,EAEM,CAAEC,EAAWC,EAAgBC,CAAO,CAC5C,EACA,QAASH,GAAS,CACjB,KAAK,iBAAiBA,EAAM,cAAc,cAAc,CAAC,CAC1D,CACD,CAAC,CACF,CC9FA,SAASY,GAAYC,EAAM,CAH3B,IAAAC,EAIC,IAAMC,EAAe,CAAC,EAEtB,QAAQC,KAAUH,EAAK,QACtBE,EAAa,KAAK,CACjB,MAAOC,EAAO,MACd,OAAQA,EAAO,WACf,KAAMA,EAAO,KACb,MAAMF,EAAAE,EAAO,OAAP,KAAAF,EAAe,6BACrB,YAAaE,EAAO,YACpB,SAAU,GAAGA,EAAO,QAAQ,oBAAoBA,EAAO,IAAI,kBAC3D,MAAOA,EAAO,MACd,KAAMA,EAAO,IACd,CAAC,EAGF,OAAOD,CACR,CAEA,SAASE,GAAkBC,EAAKL,EAAMM,EAAO,CAC5C,IAAIC,EAAO,iCAELC,EAAoB,CAAC,EAE3B,QAAQC,KAAQT,EAAM,CACrBQ,EAAkBC,EAAK,KAAK,EAAIA,EAEhC,IAAMC,EAAYD,EAAK,OAAS,UAAY,UAAY,UACxDF,GAAQ;AAAA;AAAA,qCAE2BG,CAAS;AAAA,kBAC5BD,EAAK,KAAK;AAAA;AAAA,+BAEGA,EAAK,IAAI;AAAA;AAAA;AAAA,oBAGpBA,EAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SASrBA,EAAK,IAAI;AAAA;AAAA;AAAA;AAAA,qCAImBA,EAAK,WAAW;AAAA;AAAA;AAAA,GAIpD,CACAF,GAAQ,SAER,IAAMI,EAAgBN,EAAI,cAAc,UAAU,cAAc,iBAAiB,EACjFM,EAAc,UAAYJ,EAC1BF,EAAI,cAAc,UAAU,kBAAoBG,CACjD,CAEA,SAASI,GAAiCP,EAAKQ,EAAQ,CACtDR,EAAI,cAAc,UAAU,iBAAiB,8BAA8B,EAAE,QAAQS,GAAc,CAClGA,EAAW,iBAAiB,QAASC,GAAK,CACzC,IAAMD,EAAaC,EAAE,cAAc,WACnC,GAAGD,EAAW,aAAa,UAAU,EACpC,OAGD,OAAO,OAAO,6BAA6BA,EAAY,EAAI,EAE3D,IAAME,EAAQF,EAAW,QAAQ,MACjCG,EAAgBJ,EAAQG,EAAOE,GAAc,CAC5C,OAAO,OAAO,6BAA6BJ,EAAY,EAAK,EAEzDI,IACFJ,EAAW,UAAU,IAAI,cAAc,EACvC,WAAW,IAAMA,EAAW,UAAU,OAAO,cAAc,EAAG,GAAI,EAEpE,CAAC,CAEF,CAAC,CACF,CAAC,EAEDT,EAAI,cAAc,UAAU,iBAAiB,qBAAqB,EAAE,QAAQc,GAAO,CAClFA,EAAI,iBAAiB,QAASJ,GAAK,CAxFrC,IAAAd,EAyFG,IAAMkB,EAAMJ,EAAE,cACRZ,GAASF,EAAAI,EAAI,cAAc,UAAU,kBAAkBc,EAAI,QAAQ,KAAK,IAA/D,KAAAlB,EAAoE,CAAC,EAEpF,QAAQ,IAAI,SAAUE,CAAM,EAC5BiB,GAAmBjB,EAAQU,CAAM,EAAE,KAAK,CACzC,CAAC,CACF,CAAC,CACF,CAEA,SAASQ,GAAQR,EAAQ,CACxB,MAAO,CACN,MAAO,kBACP,MAAO,kBACP,SAAU,IACF,OAAO,SAAS,aAAaS,EAAgB,SAAS,CAAC,EAE/D,OAAQjB,GAAO,CACdQ,EAAO,QAAQ,aAAa,CAACU,EAAKC,EAAMC,IAAS,CAGhD,GAFA,QAAQ,IAAI,8BAA+BF,EAAKC,EAAMC,CAAI,EAEvDA,EAAK,aAAe,IACtB,OAAOpB,EAAI,MAAM,mBAAoB,EAAE,EAGxCD,GAAkBC,EAAKN,GAAYyB,EAAK,IAAI,EAAGA,EAAK,KAAK,KAAK,EAC9DZ,GAAiCP,EAAKQ,CAAM,EAE5CR,EAAI,MAAM,CACX,CAAC,CACF,CACD,CACD,CCpHA,IAAOqB,EAAQ,CACd,OAAAC,EACA,QAAAC,EACA,QAAAC,EACD,ECRA,SAASC,GAAgBC,EAAQ,CAChC,OAAO,OAAO,SAAS,WAAW,CACjC,CACC,QAAS,kFACT,MAAO,iBACP,UAAWA,GAAU,YACtB,EACA,CACC,QAAS,qEACT,MAAO,sBACP,UAAWA,GAAU,SACtB,CACD,CAAC,CACF,CCXO,SAASC,GAAiBC,EAAMC,EAAQ,CAC9C,eAAQ,IAAI,mBAAoBD,CAAI,EAE7B,OAAO,OAAO,qBAAsB,CAC1C,MAAO,+CAA+CA,EAAK,YAAY,GACvE,KAAME,GACE;AAAA;AAAA;AAAA,KAKR,QAASA,GAAS,CACjB,IAAMC,EAAY,OAAO,SAAS,cAAc,SAAU,CACzD,MAAO,iBACR,EAAG,OAAO,EAEJC,EAAe,OAAO,SAAS,cAAc,SAAU,CAC5D,MAAO,2BACR,EAAG,kDAAkD,EAErD,OAAAD,EAAU,iBAAiB,QAASE,GAAK,CACxCH,EAAM,MAAM,CACb,CAAC,EAEDE,EAAa,iBAAiB,QAASC,GAAK,CACxCD,EAAa,aAAa,UAAU,IAIvC,OAAO,OAAO,gBAAgBA,EAAc,EAAI,EAChD,aACC,uDAAuDJ,EAAK,YAAY,QACxE,IAAM,CACLC,EAAO,MAAM,eACZD,EAAK,GACL,CAACM,EAAKC,EAAMC,IAAS,CAEpB,OAAO,OAAO,gBAAgBJ,EAAc,EAAK,EAE9CG,GACF,QAAQ,IAAI,0BAA0B,EAEtC,OAAO,cACN,uBACA,YAAYP,EAAK,YAAY,MAC9B,EAAE,KAAK,GAEP,OAAO,aACN,gBACA,YAAYA,EAAK,YAAY,MAC9B,EAAE,KAAK,CAET,CACD,CACF,EACA,IAAM,CACL,OAAO,OAAO,gBAAgBI,EAAc,EAAK,EACjD,QAAQ,IAAI,UAAU,CACvB,CAAC,EACF,CAAC,EAEM,CAAED,EAAWC,CAAa,CAClC,EACA,QAASF,GAAS,CACjB,IAAMO,EAAmBP,EAAM,cAAc,oBAAoB,EAC3DQ,EAASR,EAAM,cAAc,SAAS,EAE5CD,EAAO,MAAM,QAAQD,EAAK,GAAI,CAACM,EAAKC,EAAMC,IAAS,CAClD,QAAQ,IAAI,uBAAwBD,CAAI,EAExC,SAASI,EAAmBJ,EAAM,CACjC,GAAG,CAACA,EACH,MAAO,CAAC,EAGT,IAAMK,EAAe,CAAC,EACtB,QAAQC,KAAUN,EAAK,QACtBM,EAAS,OAAO,YAAY,wBAAwBA,CAAM,EAE1DD,EAAa,KAAK,CACjB,WAAYC,EAAO,KACnB,MAAOA,EAAO,MACd,OAAQ,OAAO,SAAS,sBAAsBA,EAAO,gBAAgB,EACrE,GAAI,sBAAsBA,EAAO,EAAE,UACnC,QAAS;AAAA;AAAA;AAAA,2BAGWA,EAAO,EAAE;AAAA,6BACPA,EAAO,IAAI;AAAA,8BACVA,EAAO,KAAK;AAAA;AAAA;AAAA,QAIpC,CAAC,EAGF,OAAOD,CACR,CAEA,IAAME,EAAUH,EAAmBJ,GAAA,YAAAA,EAAM,IAAI,EAE7CE,EAAiB,UAAY,OAAO,SAAS,MAC5C,GACA,CACC,WAAY,cACZ,MAAO,eACP,OAAQ,SACR,GAAI,KACJ,QAAS,SACV,EACAK,EACA,uDAAuDA,EAAQ,MAAM,wBACtE,EAEAL,EAAiB,iBAAiB,aAAa,EAAE,QAAQM,GAAa,CACrEA,EAAU,iBAAiB,QAASV,GAAK,CACrCU,EAAU,aAAa,UAAU,GAIpCC,EAAuBf,EAAQI,EAAE,cAAeH,CAAK,CACtD,CAAC,CACF,CAAC,EAEDQ,EAAO,OAAO,EAEd,QAAQ,IAAI,UAAWI,CAAO,CAC/B,CAAC,CACF,CACD,CAAC,CACF,CCnIO,SAASG,GAAmBC,EAAQ,CAC1C,eAAQ,IAAI,oBAAoB,EAEzB,OAAO,OAAO,oBAAqB,CACzC,MAAO,uDACP,KAAMC,GACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA6BR,QAASA,GAAS,CACjB,IAAMC,EAAY,OAAO,SAAS,cAAc,SAAU,CACzD,MAAO,iBACR,EAAG,OAAO,EAEJC,EAAY,OAAO,SAAS,cAAc,SAAU,CACzD,MAAO,2BACR,EAAG,mCAAmC,EAEtC,OAAAD,EAAU,iBAAiB,QAASE,GAAK,CACxCH,EAAM,MAAM,CACb,CAAC,EAEDE,EAAU,iBAAiB,QAASC,GAAK,CACxC,IAAMC,EAAOJ,EAAM,cAAc,mBAAmB,EAOpD,GANAI,EAAK,iBAAiB,oBAAoB,EAAE,QAAQC,GAAK,CACxDA,EAAE,cACD,IAAI,MAAM,QAAS,CAAE,QAAS,EAAK,CAAC,CACrC,CACD,CAAC,EAEED,EAAK,iBAAiB,cAAc,EAAE,OACxC,MAAO,GAGR,IAAME,EAAgBF,EAAK,iBAAiB,OAAO,EAE7CG,EAAS,CAAC,EAChB,QAAQC,KAASF,EAChBC,EAAOC,EAAM,aAAa,MAAM,CAAC,EAAIA,EAAM,MAG5C,OAAO,OAAO,gBAAgBN,EAAW,EAAI,EAE7CH,EAAO,MAAM,SAASQ,EAAQ,CAACE,EAAKC,EAAMC,IAAS,CAtEvD,IAAAC,EAAAC,EAyEK,GAFA,OAAO,OAAO,gBAAgBX,EAAW,EAAK,GAE3CO,GAAA,YAAAA,EAAK,OAAQ,YAAa,CAG5B,GAFA,QAAQ,MAAM,6BAA8BA,EAAI,GAAG,GAEhDG,EAAAH,EAAI,MAAJ,MAAAG,EAAS,cACX,QAAQE,KAAgBL,EAAI,IAAI,cAC/BT,EAAM,cAAc,UAAUc,CAAY,IAAI,EAAE,WAAW,UAAU,IAAI,OAAO,EAIlF,IAAGD,EAAAJ,EAAI,MAAJ,MAAAI,EAAS,IAAK,CAChB,IAAME,EAAiBf,EAAM,cAAc,kBAAkB,EAC7De,EAAe,UAAY,GAC3BA,GAAA,MAAAA,EAAgB,OAAO,OAAO,SAAS,YAAa,QAASN,EAAI,IAAI,GAAI,EAC1E,CAEA,MAAO,EACR,CAEA,GAAG,CAACC,EACH,MAAO,GAGRJ,EAAc,QAAQD,GAAKA,EAAE,MAAQ,EAAE,EACvCL,EAAM,MAAM,EAEZ,QAAQ,OAAO,EAEf,WAAW,IAAM,CAChB,OAAO,cAAc,sBAAuB,wBAAwBO,EAAO,KAAK,MAAM,EAAE,KAAK,CAC9F,EAAG,GAAG,CAEP,CAAC,CACF,CAAC,EAEM,CAAEN,EAAWC,CAAU,CAC/B,EACA,QAASF,GAAS,CACJA,EAAM,cAAc,mBAAmB,EAC/C,iBAAiB,QAAQ,EAAE,QAAQK,GAAK,CAE5CA,EAAE,iBAAiB,QAASF,GAAK,CAjHrC,IAAAS,EAkHST,EAAE,cAAc,MAAM,QAQzBA,EAAE,cAAc,WAAW,UAAU,OAAO,OAAO,GACnDS,EAAAT,EAAE,cAAc,WAAW,WAAW,cAAc,mBAAmB,IAAvE,MAAAS,EAA0E,WAR1ET,EAAE,cAAc,WAAW,UAAU,IAAI,OAAO,EAC5CA,EAAE,cAAc,WAAW,WAAW,cAAc,mBAAmB,GAC1EA,EAAE,cAAc,WAAW,WAAW,OAAO,OAAO,SAAS,cAAc,MAAO,CACjF,MAAO,kBACR,EAAG,4DAA4D,CAAC,EAMnE,CAAC,CAEF,CAAC,CACF,CACD,CAAC,CACF,CClIO,SAASa,GAAiBC,EAAMC,EAAQ,CAC9C,eAAQ,IAAI,mBAAoBD,CAAI,EAE7B,OAAO,OAAO,oBAAqB,CACzC,MAAO,+CAA+CA,EAAK,YAAY,GACvE,KAAME,GACE;AAAA;AAAA,KAIR,QAASA,GAAS,CACjB,IAAMC,EAAY,OAAO,SAAS,cAAc,SAAU,CACzD,MAAO,iBACR,EAAG,OAAO,EAEJC,EAAY,OAAO,SAAS,cAAc,SAAU,CACzD,MAAO,0BACR,EAAG,oCAAoC,EAEvC,OAAAD,EAAU,iBAAiB,QAASE,GAAK,CACxCH,EAAM,MAAM,CACb,CAAC,EAEDE,EAAU,iBAAiB,QAASC,GAAK,CACxC,OAAO,OAAO,gBAAgBD,EAAW,EAAI,EAE7C,aACC,iDAAiDJ,EAAK,YAAY,OAClE,IAAM,CACLC,EAAO,MAAM,OACZD,EAAK,GACL,CAACM,EAAKC,EAAMC,IAAS,CAEpB,OAAO,OAAO,gBAAgBJ,EAAW,EAAK,EAC9C,QAAQ,IAAI,aAAa,EAEzBF,EAAM,MAAM,EACZ,QAAQ,OAAO,EAEf,WAAW,IAAM,CAChB,OAAO,cACN,UACA;AAAA,kBACQF,EAAK,YAAY,YAC1B,EAAE,KAAK,CACR,EAAG,GAAG,CACP,CACD,CACF,EACA,IAAM,CACL,OAAO,OAAO,gBAAgBI,EAAW,EAAK,EAC9C,QAAQ,IAAI,UAAU,CACvB,CAAC,CACF,CAAC,EAEM,CAAED,EAAWC,CAAU,CAC/B,EACA,QAASF,GAAS,CAElB,CACD,CAAC,CACF,CCxDA,SAASO,GAASC,EAAM,CACvB,IAAMC,EAAQD,EAAK,MAEbE,EAAM,CAAC,EACNC,EAAQ,CAAC,EAEf,QAAWC,KAAQH,EACjBC,EAAIE,EAAK,EAAE,EAAIC,EAAAC,EAAA,GAAKF,GAAL,CAAW,SAAU,CAAC,CAAE,GAGzC,QAAWA,KAAQH,EAAO,CACxB,IAAMM,EAAOL,EAAIE,EAAK,EAAE,EAEpBA,EAAK,WAAaF,EAAIE,EAAK,SAAS,EACtCF,EAAIE,EAAK,SAAS,EAAE,SAAS,KAAKG,CAAI,EAEtCJ,EAAM,KAAKI,CAAI,CAEnB,CAEA,OAAOJ,CACT,CAEA,SAASK,GAAYR,EAAM,CAE1B,OADaD,GAASC,CAAI,CAE3B,CAEA,SAASS,GAAgBC,EAAQ,CAjCjC,IAAAC,EAkCC,IAAIC,EAAO,uBAiCX,GAhCAA,GAAQ;AAAA;AAAA;AAAA;AAAA,uEAI8DF,EAAO,YAAY;AAAA;AAAA,0CAEhDA,EAAO,IAAI;AAAA,+DACUA,EAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAOrDA,EAAO,EAAE;AAAA,wBACPA,EAAO,YAAY;AAAA;AAAA;AAAA;AAAA,sBAIrBA,EAAO,EAAE;AAAA,wBACPA,EAAO,YAAY;AAAA;AAAA;AAAA;AAAA,sBAIrBA,EAAO,EAAE;AAAA,wBACPA,EAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvCC,EAAAD,EAAO,WAAP,MAAAC,EAAiB,OACnB,QAAQE,KAAeH,EAAO,SAC7BE,GAAQH,GAAgBI,CAAW,EAIrC,OAAAD,GAAQ,SACDA,CACR,CAEA,SAASE,GAAmBC,EAAKC,EAAM,CACtC,QAAQ,IAAI,OAAQA,CAAI,EACxB,IAAIJ,EAAO,qBACX,QAAQF,KAAUM,EACjBJ,GAAQH,GAAgBC,CAAM,EAE/BE,GAAQ,SAERG,EAAI,cAAc,UAAU,cAAc,iCAAiC,EAAE,UAAYH,CAC1F,CAEA,SAASK,GAAcF,EAAKG,EAAQ,CACnCH,EAAI,cAAc,UAAU,iBAAiB,cAAc,EAAE,QAAQI,GAAO,CAC3EA,EAAI,iBAAiB,QAASC,GAAK,CAClCC,GAAiB,CAChB,GAAID,EAAE,cAAc,QAAQ,OAC5B,aAAcA,EAAE,cAAc,QAAQ,QACvC,EAAGF,CAAM,EAAE,KAAK,CACjB,CAAC,CACF,CAAC,EAEDH,EAAI,cAAc,UAAU,iBAAiB,cAAc,EAAE,QAAQI,GAAO,CAC3EA,EAAI,iBAAiB,QAASC,GAAK,CAClCE,GAAiB,CAChB,GAAIF,EAAE,cAAc,QAAQ,OAC5B,aAAcA,EAAE,cAAc,QAAQ,QACvC,EAAGF,CAAM,EAAE,KAAK,CACjB,CAAC,CACF,CAAC,EAEDH,EAAI,MAAM,CACX,CAEA,SAASQ,GAAUL,EAAQ,CAC1B,MAAO,CACN,MAAO,aACP,MAAO,aACP,SAAU,IACF,OAAO,SAAS,aACtBM,GAAgB,YAAY,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAeD,EAED,OAAQT,GAAO,CACdG,EAAO,MAAM,KAAK,CAACO,EAAKC,EAAMC,IAAS,CAGtC,GAFA,QAAQ,IAAI,oBAAqBF,EAAKC,EAAMC,CAAI,EAE7CA,EAAK,aAAe,IACtB,OAAOZ,EAAI,MAAM,mBAAoB,EAAE,EAGxCD,GAAmBC,EAAKP,GAAYkB,EAAK,IAAI,CAAC,EAC9CT,GAAcF,EAAKG,CAAM,EAEzBH,EAAI,cAAc,UAAU,cAAc,wBAAwB,EAAE,iBAAiB,QAASK,GAAK,CAClGQ,GAAmBV,CAAM,EAAE,KAAK,CACjC,CAAC,EAEDH,EAAI,MAAM,CACX,CAAC,CACF,CACD,CACD,CCvJA,IAAOc,GAAQ,CACd,UAAAC,EACD,ECAA,SAASC,GAAOC,EAASC,EAAQ,CAChCD,EAAQ,IAAI,IAAK,CAChB,MAAO,OACP,SAAU,IACF,oCAER,OAAQE,GAAO,CACd,WAAW,IAAMA,EAAI,MAAM,EAAG,GAAI,EAClC,WAAW,IAAMA,EAAI,MAAM,QAAS,cAAc,EAAG,GAAI,CAC1D,CACD,CAAC,EAEDF,EAAQ,IAAI,IAAK,CAChB,MAAO,mBACP,SAAU,IACF,sCAER,OAAQE,GAAO,CACdA,EAAI,MAAM,CACX,CACD,CAAC,EAEDF,EAAQ,IAAI,WAAYG,EAAQ,KAAKF,CAAM,CAAC,EAC5CD,EAAQ,IAAI,oBAAqBG,EAAQ,SAASF,CAAM,CAAC,EACzDD,EAAQ,IAAI,kBAAmBI,EAAQ,OAAOH,CAAM,CAAC,EACrDD,EAAQ,IAAI,mBAAoBI,EAAQ,QAAQH,CAAM,CAAC,EACvDD,EAAQ,IAAI,mBAAoBI,EAAQ,QAAQH,CAAM,CAAC,EACvDD,EAAQ,IAAI,cAAeK,GAAM,UAAUJ,CAAM,CAAC,CACnD,CChCA,SAASK,GAASC,EAAIC,EAAOC,EAAQ,CACpC,MAAO;AAAA,8CACsCF,CAAE;AAAA;AAAA;AAAA;AAAA;AAAA,2DAKWC,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKzBC,CAAM;AAAA;AAAA;AAAA,EAI7C,CAEA,SAASC,GAAKC,EAAOC,EAAS,CAC7B,OAAAD,EAAM,KAAO,UAAW,CACvB,SAAS,cAAc,MAAM,EAAE,OAAOA,CAAK,EAE3C,WAAW,IAAM,CAChB,KAAK,UAAU,IAAI,QAAQ,CAC5B,EAAG,EAAE,CACN,EAEAA,EAAM,MAAQ,UAAW,CACxB,KAAK,UAAU,IAAI,QAAQ,EAC3B,WAAW,IAAM,CAChB,KAAK,OAAO,CACb,EAAG,GAAG,CACP,EAEAA,EAAM,cAAc,cAAc,EAAE,iBAAiB,QAASE,GAAK,CAClEF,EAAM,MAAM,CACb,CAAC,EAEE,OAAOC,GAAW,YACpBA,EAAQD,CAAK,EAGPA,CACR,CASA,SAASG,GAAOP,EAAIQ,EAAO,CAC1B,IAAMP,EAAQO,EAAM,OAAS,GACvBN,EAASM,EAAM,QAAU,GAEzBC,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,UAAYV,GAASC,EAAIC,EAAOC,CAAM,EAC1C,IAAME,EAAQK,EAAI,WAAW,CAAC,EAExBC,EAAYN,EAAM,cAAc,aAAa,EAC7CO,EAAcP,EAAM,cAAc,eAAe,EAEvD,GAAG,OAAOI,EAAM,SAAW,WAAY,CACtC,IAAMI,EAAgBJ,EAAM,QAAQJ,CAAK,EAEzC,GAAG,OAAOQ,EAAc,CAAC,GAAK,SAAU,CACvC,IAAMC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAU,IAAI,SAAS,EAC/B,QAAQC,KAAiBF,EACxBC,EAAQ,OAAOC,CAAa,EAG7BH,EAAY,OAAOE,CAAO,CAC3B,CACD,CAEA,GAAG,OAAOL,EAAM,MAAQ,WAAY,CACnC,IAAMO,EAAaP,EAAM,KAAKJ,CAAK,EAEhC,OAAOW,GAAc,SACvBL,EAAU,OAAOK,CAAU,EAClB,OAAOA,GAAc,WAC9BL,EAAU,UAAYK,EAExB,CAEA,OAAOZ,GAAKC,EAAOI,GAAA,YAAAA,EAAO,OAAO,CAClC,CAEA,IAAOQ,GAAQ,CACd,OAAAT,EACD,EC5Fe,SAARU,EAA8BC,EAAMC,EAAaC,EAAY,CACnE,OAAO,OAAO,gBAAiB,CAC9B,MAAO,wBACP,KAAMC,GACE;AAAA,SACDH,CAAI;AAAA,KAGX,QAASG,GAAS,CACjB,IAAMC,EAAW,OAAO,SAAS,cAAc,SAAU,CAAE,MAAO,iBAAkB,EAAG,IAAI,EACrFC,EAAY,OAAO,SAAS,cAAc,SAAU,CAAE,MAAO,iBAAkB,EAAG,KAAK,EAE7F,OAAAD,EAAS,iBAAiB,QAASE,GAAK,CACvCH,EAAM,MAAM,EACZD,EAAW,CACZ,CAAC,EAEDG,EAAU,iBAAiB,QAASC,GAAK,CACxCH,EAAM,MAAM,EACZF,EAAY,CACb,CAAC,EAEM,CAAEG,EAAUC,CAAU,CAC9B,CACD,CAAC,EAAE,KAAK,CACT,CChBA,SAAS,iBAAiB,mBAAoBE,GAAK,CAClD,QAAQ,IAAI,UAAU,EAEtB,OAAO,OAASC,EAChB,OAAO,OAASC,EAChB,OAAO,OAASC,GAChB,OAAO,aAAeC,EAEtBC,EAAI,EACJ,IAAMC,EAAS,IAAIC,EAAa,CAC9B,SAAU,4BACV,MAAO,aACP,WAAY,IACZ,gBAAiB,CAAC,CAAE,MAAAC,CAAM,IAAM,QAAQ,IAAI,gBAAiBA,CAAK,EAClE,WAAY,YACd,CAAC,EAMKC,EAAU,IAAIC,EAAQ,WAAY,eAAgB,eAAe,EAEvEC,GAAOF,EAASH,CAAM,EAEtB,QAAQ,IAAIG,EAAQ,WAAW,CAAC,EAEhCA,EAAQ,SAAS,CAACG,EAAKC,IAAU,CAChCC,EAAe,CAChB,CAAC,EAEDL,EAAQ,QAAQ,EAEhB,OAAO,QAAUA,CAClB,CAAC", + "names": ["navToggleBtn", "navigation", "reloadScreenBtn", "navigationShow", "navigationHide", "hud", "e", "Screens", "screensContainerSelector", "loaderSelector", "errorScreenSelector", "route", "screen", "__spreadValues", "alias", "_a", "screenContainer", "title", "text", "cb", "handler", "template", "type", "icon", "title", "text", "init", "toast", "props", "i", "e", "scr", "alias", "lifetimeInterval", "create", "div", "createSuccess", "createInfo", "createWarning", "createError", "toasts_default", "sidebarNav", "items", "listItems", "item", "aOpen", "aClose", "table", "caption", "columns", "data", "tfoot", "head", "totalColumns", "key", "body", "column", "foot", "tableCaption", "tableHead", "createElement", "type", "props", "content", "node", "value", "createAlert", "deviceFieldsUnification", "map", "dataObj", "field", "btnLoadingState", "btn", "isLoading", "cardScriptActionLoadingState", "card", "iconContainer", "mainTemplate", "sidebar", "connectionStatusBadge", "status", "toogleStateBadge", "state", "helper_default", "ScriptsApi", "core", "cb", "filename", "safe", "payload", "alias", "name", "DevicesApi", "core", "cb", "payload", "id", "safe", "AreasApi", "core", "cb", "area_id", "safe", "payload", "build_query", "params", "usp", "k", "v", "s", "join_url", "base_url", "path", "b", "p", "safe_json_parse", "text", "SmartHomeApi", "opts", "ScriptsApi", "DevicesApi", "AreasApi", "token", "proxy_path", "extra_query", "q", "__spreadValues", "method", "body", "cb", "callback", "url", "controller", "timeout_ms", "t", "headers", "payload", "res", "__async", "meta", "parsed", "data", "err", "_", "st", "e", "api_path", "sidebarTemplate", "active", "rebootDeviceBtnHandler", "sh_api", "btn", "modal", "deviceId", "deviceName", "deviceAlias", "err", "data", "meta", "deviceDetailsPopup", "device", "sh_api", "modal", "deviceProperties", "field", "buttonCancel", "buttonReboot", "buttonRemove", "e", "rebootDeviceBtnHandler", "err", "data", "meta", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "rebootDeviceBtnHandler", "deviceDetailsPopup", "list", "sidebarTemplate", "err", "resp", "meta", "deviceSetupFormPopup", "device", "sh_api", "modal", "deviceProperties", "field", "buttonCancel", "e", "buttonSubmit", "inputs", "setupForm", "i", "inputElements", "textareaElement", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "deviceSetupFormPopup", "scanning", "sidebarTemplate", "err", "resp", "meta", "devices_default", "list", "scanning", "sidebarTemplate", "active", "runActionScript", "sh_api", "alias", "cb", "err", "data", "meta", "prepareData", "data", "preparedData", "scope", "btnSwitch", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "methName", "err", "meta", "scopes", "sidebarTemplate", "resp", "prepareData", "data", "preparedData", "script", "btnSwitch", "renderingMainTable", "scr", "total", "provideSciptsData", "i", "initMainTableInteractiveElements", "sh_api", "btn", "e", "_a", "methName", "err", "meta", "regular", "sidebarTemplate", "resp", "actionDetailsPopup", "script", "sh_api", "modal", "btnCancel", "btnChangeState", "btnRun", "e", "btn", "methName", "err", "data", "meta", "runActionScript", "resultFlag", "prepareData", "data", "_a", "preparedData", "script", "renderingMainGrid", "scr", "total", "grid", "provideSciptsData", "item", "cardColor", "mainContainer", "initMainTableInteractiveElements", "sh_api", "actionCard", "e", "alias", "runActionScript", "resultFlag", "btn", "actionDetailsPopup", "actions", "sidebarTemplate", "err", "resp", "meta", "scripts_default", "scopes", "regular", "actions", "sidebarTemplate", "active", "areaDevicesModal", "area", "sh_api", "modal", "btnCancel", "btnRebootAll", "e", "err", "data", "meta", "devicesContainer", "loader", "prepareDevicesData", "preparedData", "device", "devices", "rebootBtn", "rebootDeviceBtnHandler", "createNewAreaModal", "sh_api", "modal", "btnCancel", "btnSubmit", "e", "form", "i", "inputElements", "inputs", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "areaDetailsModal", "area", "sh_api", "modal", "btnCancel", "btnRemove", "e", "err", "data", "meta", "makeTree", "data", "items", "map", "roots", "item", "__spreadProps", "__spreadValues", "node", "prepareData", "renderingBranch", "branch", "_a", "html", "childBranch", "renderingAreasTree", "scr", "tree", "initAreasTree", "sh_api", "btn", "e", "areaDevicesModal", "areaDetailsModal", "areasTree", "sidebarTemplate", "err", "resp", "meta", "createNewAreaModal", "areas_default", "areasTree", "routes", "screens", "sh_api", "scr", "devices_default", "scripts_default", "areas_default", "template", "id", "title", "footer", "init", "modal", "onready", "e", "create", "props", "div", "modalBody", "modalFooter", "actionsResult", "actions", "actionElement", "bodyResult", "modals_default", "confirmPopup", "text", "confirmedCb", "canceledCb", "modal", "buttonNO", "buttonYES", "e", "e", "toasts_default", "helper_default", "modals_default", "confirmPopup", "hud", "sh_api", "SmartHomeApi", "error", "screens", "Screens", "routes", "scr", "alias", "navigationHide"] } diff --git a/webclient/src/js/components/screens/areas/areas-devices-modal.js b/webclient/src/js/components/screens/areas/areas-devices-modal.js index d7766b7..8bc5dbb 100644 --- a/webclient/src/js/components/screens/areas/areas-devices-modal.js +++ b/webclient/src/js/components/screens/areas/areas-devices-modal.js @@ -4,7 +4,7 @@ console.log("areaDevicesModal", area); return Modals.create("area-devices-modal", { - title: ` ${area.name}`, + title: ` ${area.display_name}`, body: modal => { return `
    @@ -16,11 +16,52 @@ class: "btn btn-primary" }, "Close"); + const btnRebootAll = Helper.template.createElement("button", { + class: "btn btn-warning with-icon" + }, ` Reboot All`); + btnCancel.addEventListener("click", e => { modal.close(); }); - return [ btnCancel ]; + btnRebootAll.addEventListener("click", e => { + if(btnRebootAll.getAttribute("disabled")) { + return; + } + + Helper.states.btnLoadingState(btnRebootAll, true); + confirmPopup( + `Are you sure you want to reboot all devices from ${area.display_name}?`, + () => { + sh_api.areas.reboot_devices( + area.id, + (err, data, meta) => { + + Helper.states.btnLoadingState(btnRebootAll, false); + + if(data) { + console.log("Was rebooted all devices"); + + Toasts.createSuccess( + "Rebooted all devices", + `Area: ${area.display_name}` + ).show(); + } else { + Toasts.createDanger( + "Rebooted fail", + `Area: ${area.display_name}` + ).show(); + } + } + ); + }, + () => { + Helper.states.btnLoadingState(btnRebootAll, false); + console.log("CANCELED"); + }); + }); + + return [ btnCancel, btnRebootAll ]; }, onready: modal => { const devicesContainer = modal.querySelector(".devices-container"); diff --git a/webclient/src/js/components/screens/areas/areas-tree-screen.js b/webclient/src/js/components/screens/areas/areas-tree-screen.js index d5534d7..a87e322 100644 --- a/webclient/src/js/components/screens/areas/areas-tree-screen.js +++ b/webclient/src/js/components/screens/areas/areas-tree-screen.js @@ -89,23 +89,19 @@ function initAreasTree(scr, sh_api) { scr.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(btn => { btn.addEventListener("click", e => { - const btn = e.currentTarget; - const areaId = btn.dataset.areaId; - const name = btn.dataset.areaName; - - areaDevicesModal({ id: areaId, name }, sh_api).show(); + areaDevicesModal({ + id: e.currentTarget.dataset.areaId, + display_name: e.currentTarget.dataset.areaName + }, sh_api).show(); }); }); scr.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(btn => { btn.addEventListener("click", e => { - const currentBtn = e.currentTarget; - const area = { - id: currentBtn.dataset.areaId, - display_name: currentBtn.dataset.areaName - }; - - areaDetailsModal(area, sh_api).show(); + areaDetailsModal({ + id: e.currentTarget.dataset.areaId, + display_name: e.currentTarget.dataset.areaName + }, sh_api).show(); }); }); diff --git a/webclient/src/scss/ui_components/_toasts.scss b/webclient/src/scss/ui_components/_toasts.scss index 3126d58..270e8d4 100644 --- a/webclient/src/scss/ui_components/_toasts.scss +++ b/webclient/src/scss/ui_components/_toasts.scss @@ -1,5 +1,6 @@ .toast { position: fixed; + z-index: 1100; bottom: -100px; right: $space-4; max-width: 420px;