diff --git a/.gitignore b/.gitignore
index 4b53c4c..2c1c2aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,4 @@ var/run/*
*.swp
.env
venv/
+node_modules
diff --git a/data/www/browserconfig.xml b/data/www/browserconfig.xml
index ff8704a..f4cc73a 100755
--- a/data/www/browserconfig.xml
+++ b/data/www/browserconfig.xml
@@ -1,2 +1,2 @@
-#692fbd
\ No newline at end of file
+$spicyPurple
\ No newline at end of file
diff --git a/data/www/css/compiled/fleet-studio.css b/data/www/css/compiled/fleet-studio.css
new file mode 100644
index 0000000..092124c
--- /dev/null
+++ b/data/www/css/compiled/fleet-studio.css
@@ -0,0 +1 @@
+.invisible{visibility:hidden!important}.hidden{display:none!important}.tac{text-align:center}a{text-decoration:none}ul.pagetab{list-style:none;margin:0;padding:0;display:flex;flex-direction:row;border-bottom:1px solid rgb(14,239,95)}ul.pagetab li{flex:1;display:flex;flex-direction:row;justify-content:center;align-items:center;border-right:1px solid rgb(14,239,95)}ul.pagetab li a{flex:1;display:flex;flex-direction:row;justify-content:center;align-items:center;padding:20px 5px;color:#0eef5f;font-weight:700;text-decoration:none}ul.pagetab li.active a{background:#0eef5f;color:#fff}html{margin:0;padding:0;display:flex;flex:1;background:#0f0035;font-family:Arial,"sans-serif";color:#fff;height:100vh}body{margin:0;padding:0;display:flex;flex:1;flex-direction:column}main{display:flex;flex:1}main .studio-frame{display:flex;flex:1}main .studio-frame iframe{display:flex;flex:1}
diff --git a/data/www/css/compiled/main-studio.css b/data/www/css/compiled/main-studio.css
new file mode 100644
index 0000000..1211f3d
--- /dev/null
+++ b/data/www/css/compiled/main-studio.css
@@ -0,0 +1 @@
+*{font-family:Roboto,Arial,"sans-serif"}html{height:100vh;margin:0;padding:0;display:flex;background-color:#0f0035;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}body{margin:0;padding:0;flex:1;background-color:#0f0035;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}.invisible{visibility:hidden!important}.hidden{display:none!important}.tac{text-align:center}a{text-decoration:none}header{text-align:center;display:flex;justify-content:flex-start;align-items:center;align-self:stretch;padding:0 25px}header .logo{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}header .logo a{color:inherit;display:flex;justify-content:center;align-items:center}header .logo img{width:32px;height:32px;margin-right:10px}header nav{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex:1}header nav ul{list-style:none;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}header nav ul li{margin:0 15px}header nav ul li.user-menu{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;border:1px solid rgb(14,239,95);padding:5px 15px;border-radius:4px;background:#0eef5f33}header nav ul li.user-menu .logout{color:#fff}header nav ul li.user-menu .username{margin-right:20px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;font-weight:700;color:#0eef5f}header nav ul li.user-menu .username i{margin-right:5px;font-size:12px}header nav ul li a{color:#fff9;text-decoration:none}header nav ul li a:hover,header nav ul li.active a{color:#fff}footer{align-self:stretch;justify-content:center;align-items:center;flex-direction:column;display:flex;padding:20px}footer .version{opacity:.3}.container{background:#0000001a;margin:auto;display:flex;align-self:stretch;flex-direction:column;justify-content:flex-start;align-items:center;flex:1;min-width:70%}@media only screen and (max-width: 1200px){.container{min-width:95%}}.container.expand{min-width:100%}@media only screen and (max-width: 1200px){.container.expand{min-width:100%}}select.select-item-picker,a.btn,button{background-color:#fff;border-radius:5px;border:1px solid rgb(188,72,255);color:#251142;padding:10px 30px;text-decoration:none;margin:10px;cursor:pointer;display:flex;flex-direction:row;justify-content:center;align-items:center;font-weight:400;font-size:14px;transition:.2s linear all}a.btn:hover,button:hover{color:#bc48ff}select.select-item-picker,button.purple{font-weight:700;border:1px solid rgb(105,47,189);color:#fff;background:#692fbd;background:linear-gradient(90deg,#bc48ff,#692fbd)}button.green{font-weight:700;color:#fff;border:1px solid rgb(14,239,95);background:linear-gradient(90deg,#3cf47e,#0bbf4c)}button.normal:hover{color:#fff;border-color:#692fbd;background:#692fbd;background:linear-gradient(90deg,#bc48ff,#692fbd)}button.green:hover,button.purple:hover{border:1px solid rgb(255,255,255)}.alert{margin:10px 30px 20px;padding:20px 50px;align-self:stretch;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:4px}.alert-info{color:#464646;border:1px solid rgb(70,70,70);background:#46464633}.alert-success{color:#0eef5f;border:1px solid rgb(14,239,95);background:#0eef5f33}.alert-error{color:#ef0e5d;border:1px solid rgb(239,14,93);background:#ef0e5d33}.alert-icon{border-radius:4px;padding:3px 4px;min-width:18px;text-align:center}.modals{position:fixed;background:#0006;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.modals-outer{min-width:30%;display:flex;flex-direction:column;overflow:auto}.modals-outer .modal-close{color:#fff;font-size:30px;display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-bottom:20px;margin-top:0}.modals-inner{background:#fff;border-radius:10px;color:#333}.modals-inner .modal h2{border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}.modals-inner .modal h3{align-self:stretch;border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}.panel{background:#ffffff26;border-radius:5px;padding:0 25px 80px;margin:10px 25px;border-left:5px solid rgb(14,239,95);align-self:stretch}.panel.no-border{border:none}.panel h3{color:#fff}.panel-inactive{background:#fff;color:#999;border-color:#999}.panel-inactive h3{color:#1a1a1a}.panel table{width:100%;margin-top:30px;border-collapse:collapse;text-align:left;font-weight:400}.panel th{border-bottom:1px solid rgb(255,255,255);border-collapse:collapse;padding:10px;font-weight:400}.panel-inactive th{border-color:#999}.panel td{border-collapse:collapse;padding:10px}.panel td a.item.sort{cursor:move}.panel td a.item-name{color:#fff}.panel-inactive td a.item-name{color:#999}.panel td a.item-name:hover{text-decoration:underline}.panel td.actions a{background:#fff;color:#333;border:1px solid rgb(153,153,153);border-radius:4px;padding:2px;width:35px;display:inline-block;text-align:center;margin:0 2px}.panel td.actions a:hover{color:#0eef5f;border-color:#0eef5f}.panel td.actions a.item-edit:hover{color:#bc48ff;border-color:#bc48ff}.panel td.actions a.item-delete:hover{color:#ef0e5d;border-color:#ef0e5d}.panel td.infos{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start}.panel td .inner{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.panel td div.badge{margin-right:5px;font-size:10px;font-weight:700}.panel a{color:#0eef5f;text-decoration:none}.panel a:hover{color:#0bbf4c}.panel.panel-menu{display:flex;flex:1;flex-direction:column;align-self:stretch;margin-right:0;border-color:#692fbd}.panel.panel-menu ul{flex:1;max-width:250px;display:flex;flex-direction:column;align-self:stretch;list-style:none;margin:0;padding:0}.panel.panel-menu ul li{margin:3px 0}.panel.panel-menu ul li a{padding:5px 15px;color:inherit;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex:1}.panel.panel-menu ul li:hover{color:#464646;font-weight:700}.panel.panel-menu ul li.active{color:#692fbd;background:#692fbd57;border-radius:4px;font-weight:700;border:1px solid rgb(105,47,189)}.panel.panel-menu ul li.active a{color:inherit}.pure-material-switch{z-index:0;position:relative;display:inline-block}.pure-material-switch>input{appearance:none;-moz-appearance:none;-webkit-appearance:none;z-index:-1;position:absolute;right:6px;top:-8px;display:block;margin:0;border-radius:50%;width:40px;height:40px;background-color:#00000061;outline:none;opacity:0;transform:scale(1);pointer-events:none;transition:opacity .3s .1s,transform .2s .1s}.pure-material-switch>span{display:inline-block;width:100%;cursor:pointer}.pure-material-switch>span:before{content:"";float:right;display:inline-block;margin:5px 0 5px 10px;border-radius:7px;width:36px;height:14px;background-color:#00000061;vertical-align:top;transition:background-color .2s,opacity .2s}.pure-material-switch>span:after{content:"";position:absolute;top:2px;right:16px;border-radius:50%;width:20px;height:20px;background-color:#fff;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:background-color .2s,transform .2s}.pure-material-switch>input:checked{right:-10px;background-color:#0eef5f}.pure-material-switch>input:checked+span:before{background-color:#0eef5f99}.pure-material-switch>input:checked+span:after{background-color:#0eef5f;transform:translate(16px)}.pure-material-switch:hover>input{opacity:.04}.pure-material-switch>input:focus{opacity:.12}.pure-material-switch:hover>input:focus{opacity:.16}.pure-material-switch>input:active{opacity:1;transform:scale(0);transition:transform 0s,opacity 0s}.pure-material-switch>input:active+span:before{background-color:#0eef5f99}.pure-material-switch>input:checked:active+span:before{background-color:#00000061}.pure-material-switch>input:disabled{opacity:0}.pure-material-switch>input:disabled+span{color:#000;opacity:.38;cursor:default}.pure-material-switch>input:disabled+span:before{background-color:#00000061}.pure-material-switch>input:checked:disabled+span:before{background-color:#0eef5f99}.login-page{max-width:600px;padding-top:50px}.card{background:#fff;border-radius:6px;padding:50px;color:#333}.card .form{padding:0}.card .form .form-group{margin:0 0 30px;padding:0}.card .form .form-group .widget{flex:1}.card .form .form-group label{text-align:left}.card button[type=submit]{margin:0 auto}.card h3{text-align:center;font-size:36px;margin:0 0 40px}span.empty{text-transform:uppercase;opacity:.5;color:#999}a.badge,.badge{display:flex;flex-direction:row;justify-content:center;align-items:center;padding:5px;border-radius:4px;font-size:12px;background:#ffffff1a;border:1px solid transparent;color:#fff}a.badge:hover{color:#fff;border:1px solid rgba(255,255,255,.4)}.panel-inactive .badge{background:#9999991a;color:#999}.panel-inactive a.badge:hover{color:#999;border:1px solid rgba(153,153,153,.2)}.badge.anonymous{opacity:.2}.explorer{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;align-self:stretch}.explorer .left{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;flex:1}.explorer .right{flex:3;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.explorer .panel-active{background:#fff;color:#999;border-color:#999}.explorer .panel-active h3{color:#0eef5f}.explorer .panel-inactive{background:#fff;color:#999;border-color:#999}.toolbar{display:flex;flex-direction:row;padding:0 25px;align-self:stretch}.toolbar h2{padding:0 25px 0 0}.toolbar .toolbar-actions{flex:1;display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.icon-right{margin:0 0 0 10px}.icon-left{margin:0 10px 0 0}.form{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:20px}.form .form-group{margin:10px 20px 5px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1}.form .form-group label{flex:1;padding:10px;text-align:right;margin-right:20px}.form .form-group .widget{flex:3;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch}.form .form-group input,.form .form-group select,.form .form-group textarea{flex:1;padding:10px 5px;border:1px solid #e6e6e6;border-radius:4px;width:auto}.form .form-group input[type=checkbox]{flex:0}.form .form-group .trigger{margin-right:10px}.form .form-group select.trigger{max-width:120px}.form .form-group span{margin-left:10px}.form .actions{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-top:10px;align-self:stretch}.form .actions button.green,.form .actions button{font-size:18px}.form .actions button.green:hover{background:#fff;color:#0eef5f;border-color:#0eef5f}.form .actions button.btn-normal{color:#999;border-color:#999;font-size:18px;margin:0}.form .actions button.btn-normal:hover{color:#464646;border-color:#464646}.plugin-description{font-size:14px;margin-left:34px;color:#999}.panel-logs{padding-bottom:20px}.panel-logs pre{background:#000000e6;border:1px solid rgb(70,70,70);border-radius:4px;font-family:monospace;color:#f2f2f2;padding:20px;min-height:200px;max-height:500px;overflow:auto}
diff --git a/data/www/css/lib/flatpickr.min.css b/data/www/css/lib/flatpickr.min.css
index a10acc6..17f0910 100755
--- a/data/www/css/lib/flatpickr.min.css
+++ b/data/www/css/lib/flatpickr.min.css
@@ -1,4 +1,4 @@
-.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
+.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:$white;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:$white}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:$white}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
/*rtl:begin:ignore*/left:0/*
/*rtl:end:ignore*/}/*
/*rtl:begin:ignore*/
@@ -10,4 +10,4 @@
/*rtl:begin:ignore*/
/*
/*rtl:end:ignore*/
-.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}
\ No newline at end of file
+.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:$white}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:$white;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}
\ No newline at end of file
diff --git a/data/www/css/main.css b/data/www/css/main.css
deleted file mode 100644
index ed251b3..0000000
--- a/data/www/css/main.css
+++ /dev/null
@@ -1,857 +0,0 @@
-* {
- font-family: Roboto;
-}
-
-html {
- height: 100vh;
- margin: 0;
- padding: 0;
- display: flex;
- background-color: #0f0035;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
- align-self: stretch;
-}
-
-body {
- margin: 0;
- padding: 0;
- flex: 1;
- background-color: #0f0035;
- color: #fff;
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
- align-self: stretch;
-}
-
-.invisible {
- visibility: hidden !important;
-}
-
-.hidden {
- display: none !important;
-}
-
-.tac {
- text-align: center;
-}
-
-a {
- text-decoration: none;
-}
-
-.container {
- background: rgba(0, 0, 0, 0.1);
- margin: auto;
- display: flex;
- align-self: stretch;
- flex-direction: column;
- justify-content: flex-start;
- align-items: center;
- flex: 1;
- min-width: 70%;
-
- @media only screen and (max-width: 1200px) {
- min-width: 95%;
- }
-}
-
-.container.expand {
- min-width: 100%;
-
- @media only screen and (max-width: 1200px) {
- min-width: 100%;
- }
-}
-
-header {
- text-align: center;
- display: flex;
- justify-content: flex-start;
- align-items: center;
- align-self: stretch;
- padding: 0 25px 0 25px;
-}
-
-header .logo {
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
-}
-
-header .logo a {
- color: inherit;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-header .logo img {
- width: 32px;
- height: 32px;
- margin-right: 10px;
-}
-
-header nav {
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- align-items: center;
- flex: 1;
-}
-
-header nav ul {
- list-style: none;
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
-}
-
-header nav ul li {
- margin: 0 15px;
-}
-
-header nav ul li.user-menu {
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- align-items: center;
- border: 1px solid #0bc44e;
- padding: 5px 15px;
- border-radius: 4px;
- background: rgba(14, 239, 95, .2);
-}
-
-header nav ul li.user-menu .logout {
- color: rgb(255, 255, 255);
-}
-
-header nav ul li.user-menu .username {
- margin-right: 20px;
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
- font-weight: bold;
- color: #0bc44e;
-}
-
-header nav ul li.user-menu .username i {
- margin-right: 5px;
- font-size: 12px;
-}
-
-header nav ul li a {
- color: rgba(255, 255, 255, 0.6);
- text-decoration: none;
-}
-
-header nav ul li a:hover,
-header nav ul li.active a {
- color: white;
-}
-
-.toolbar {
- display: flex;
- flex-direction: row;
- padding: 0 25px 0 25px;
- align-self: stretch;
-}
-
-.toolbar h2 {
- padding: 0 25px 0 0;
-}
-
-.toolbar .toolbar-actions {
- flex: 1;
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- align-items: center;
-}
-
-select.select-item-picker,
-a.btn,
-button {
- background-color: #fff;
- border-radius: 5px;
- border: 1px solid #bc48ff;
- color: #270035;
- padding: 10px 30px;
- text-decoration: none;
- margin: 10px;
- cursor: pointer;
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- font-weight: 400;
- font-size: 14px;
- transition: .2s linear all;
-}
-
-a.btn:hover,
-button:hover {
- color: #bc48ff;
-}
-
-select.select-item-picker,
-button.purple {
- font-weight: bold;
- border: 1px solid #692fbd;
- color: white;
- background: #692fbd;
- background: linear-gradient(90deg, #bc48ff 0%, #692fbd 100%);
-}
-
-button.green {
- font-weight: bold;
- color: white;
- border: 1px solid #0eef5f;
- background: linear-gradient(90deg, #2fde6f 0%, #13c251 100%);
-}
-
-button.normal:hover {
- color: white;
- border-color: #692fbd;
- background: #692fbd;
- background: linear-gradient(90deg, #bc48ff 0%, #692fbd 100%);
-}
-
-button.green:hover,
-button.purple:hover {
- border: 1px solid #fff;
-}
-
-.alert {
- margin: 10px 30px 20px 30px;
- padding: 20px 50px;
- align-self: stretch;
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- border-radius: 4px;
-}
-
-.alert-info {
- color: rgb(70, 70, 70);
- border: 1px solid rgb(70, 70, 70);
- background: rgba(70, 70, 70, .2);
-}
-
-.alert-success {
- color: rgb(14, 239, 95);
- border: 1px solid rgb(14, 239, 95);
- background: rgba(14, 239, 95, .2);
-}
-
-.alert-error {
- color: rgb(239, 14, 93);
- border: 1px solid rgb(239, 14, 93);
- background: rgba(239, 14, 93, .2);
-}
-
-
-.panel {
- background: rgba(255, 255, 255, 0.15);
- border-radius: 5px;
- padding: 0 25px 80px 25px;
- margin: 10px 25px;
- border-left: 5px solid #0eef5f;
- align-self: stretch;
-}
-
-.panel.no-border {
- border: none;
-}
-
-.panel h3 {
- color: #fff;
-}
-
-.panel-inactive {
- background: white;
- color: #AAA;
- border-color: #BBB;
-}
-
-.panel-inactive h3 {
- color: #333;
-}
-
-.panel table {
- width: 100%;
- margin-top: 30px;
- border-collapse: collapse;
- text-align: left;
- font-weight: normal;
-}
-
-.panel th {
- border-bottom: 1px solid #fff;
- border-collapse: collapse;
- padding: 10px;
- font-weight: normal;
-}
-
-.panel-inactive th {
- border-color: #EEE;
-
-}
-
-.panel td {
- border-collapse: collapse;
- padding: 10px;
-}
-
-.panel td a.item.sort {
- cursor: move;
-}
-
-.panel td a.item-name {
- color: white;
-}
-
-.panel-inactive td a.item-name {
- color: #AAA;
-}
-
-.panel td a.item-name:hover {
- text-decoration: underline;
-}
-
-.panel td.actions a {
- background: white;
- color: #333;
- border: 1px solid #AAA;
- border-radius: 4px;
- padding: 2px;
- width: 35px;
- display: inline-block;
- text-align: center;
- margin: 0 2px;
-}
-
-.panel td.actions a:hover {
- color: #0eef5f;
- border-color: #0eef5f;
-}
-
-.panel td.actions a.item-edit:hover {
- color: #bc48ff;
- border-color: #bc48ff;
-}
-
-.panel td.actions a.item-delete:hover {
- color: #ef0e0e;
- border-color: #ef0e0e;
-}
-
-.panel td.infos {
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: flex-start;
-}
-
-.panel td .inner {
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
-}
-
-.panel td div.badge {
- margin-right: 5px;
- font-size: 10px;
- font-weight: bold;
-}
-
-.panel a {
- color: #0eef5f;
- text-decoration: none;
-}
-
-.panel a:hover {
- color: #0bc44e;
-}
-
-.icon-right {
- margin: 0 0 0 10px;
-}
-
-.icon-left {
- margin: 0 10px 0 0;
-}
-
-.pure-material-switch {
- z-index: 0;
- position: relative;
- display: inline-block;
-}
-
-.pure-material-switch > input {
- appearance: none;
- -moz-appearance: none;
- -webkit-appearance: none;
- z-index: -1;
- position: absolute;
- right: 6px;
- top: -8px;
- display: block;
- margin: 0;
- border-radius: 50%;
- width: 40px;
- height: 40px;
- background-color: rgba(0, 0, 0, 0.38);
- outline: none;
- opacity: 0;
- transform: scale(1);
- pointer-events: none;
- transition: opacity 0.3s 0.1s, transform 0.2s 0.1s;
-}
-
-.pure-material-switch > span {
- display: inline-block;
- width: 100%;
- cursor: pointer;
-}
-
-.pure-material-switch > span::before {
- content: "";
- float: right;
- display: inline-block;
- margin: 5px 0 5px 10px;
- border-radius: 7px;
- width: 36px;
- height: 14px;
- background-color: rgba(0, 0, 0, 0.38);
- vertical-align: top;
- transition: background-color 0.2s, opacity 0.2s;
-}
-
-.pure-material-switch > span::after {
- content: "";
- position: absolute;
- top: 2px;
- right: 16px;
- border-radius: 50%;
- width: 20px;
- height: 20px;
- background-color: rgb(255, 255, 255);
- box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- transition: background-color 0.2s, transform 0.2s;
-}
-
-.pure-material-switch > input:checked {
- right: -10px;
- background-color: rgb(14, 239, 95);
-}
-
-.pure-material-switch > input:checked + span::before {
- background-color: rgba(14, 239, 95, 0.6);
-}
-
-.pure-material-switch > input:checked + span::after {
- background-color: rgb(14, 239, 95);
- transform: translateX(16px);
-}
-
-.pure-material-switch:hover > input {
- opacity: 0.04;
-}
-
-.pure-material-switch > input:focus {
- opacity: 0.12;
-}
-
-.pure-material-switch:hover > input:focus {
- opacity: 0.16;
-}
-
-.pure-material-switch > input:active {
- opacity: 1;
- transform: scale(0);
- transition: transform 0s, opacity 0s;
-}
-
-.pure-material-switch > input:active + span::before {
- background-color: rgba(14, 239, 95, 0.6);
-}
-
-.pure-material-switch > input:checked:active + span::before {
- background-color: rgba(0, 0, 0, 0.38);
-}
-
-.pure-material-switch > input:disabled {
- opacity: 0;
-}
-
-.pure-material-switch > input:disabled + span {
- color: rgb(0, 0, 0);
- opacity: 0.38;
- cursor: default;
-}
-
-.pure-material-switch > input:disabled + span::before {
- background-color: rgba(0, 0, 0, 0.38);
-}
-
-.pure-material-switch > input:checked:disabled + span::before {
- background-color: rgba(14, 239, 95, 0.6);
-}
-
-.modals {
- position: fixed;
- background: rgba(0, 0, 0, 0.4);
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
-
-.modals-outer {
- min-width: 30%;
- display: flex;
- flex-direction: column;
- overflow: auto;
-}
-
-.modals-outer .modal-close {
- color: white;
- font-size: 30px;
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- align-items: center;
- margin-bottom: 20px;
- margin-top: 0px;
-}
-
-.modals-inner {
- background: white;
- border-radius: 10px;
- color: #333;
-}
-
-.modals-inner .modal h2 {
- border-bottom: 1px solid #DDD;
- padding: 15px 15px;
- margin: 0;
-}
-
-
-.modals-inner .modal h3 {
- align-self: stretch;
- border-bottom: 1px solid #DDD;
- padding: 15px 15px;
- margin: 0;
-}
-
-.form {
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
- padding: 20px;
-}
-
-.form .form-group {
- margin: 10px 20px 5px 20px;
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
- align-self: stretch;
- flex: 1;
-}
-
-.form .form-group label {
- flex: 1;
- padding: 10px;
- text-align: right;
- margin-right: 20px;
-}
-
-.form .form-group .widget {
- flex: 3;
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
- align-self: stretch;
-}
-
-.form .form-group input,
-.form .form-group select,
-.form .form-group textarea {
- flex: 1;
- padding: 10px 5px 10px 5px;
- border: 1px solid #EEE;
- border-radius: 4px;
- width: auto;
-}
-
-.form .form-group input[type=checkbox] {
- flex: 0;
-}
-
-.form .form-group .trigger {
- margin-right: 10px;
-}
-
-.form .form-group select.trigger {
- max-width: 120px;
-}
-
-.form .form-group span {
- margin-left: 10px;
-}
-
-.form .actions {
- display: flex;
- flex-direction: row;
- justify-content: flex-end;
- align-items: center;
- margin-top: 10px;
- align-self: stretch;
-}
-
-.form .actions button.green,
-.form .actions button {
- font-size: 18px;
-}
-
-.form .actions button.green:hover {
- background: white;
- color: rgb(14, 239, 95);
- border-color: rgb(14, 239, 95);
-}
-
-.form .actions button.btn-normal {
- color: #999;
- border-color: #999;
- font-size: 18px;
- margin: 0;
-}
-
-.form .actions button.btn-normal:hover {
- color: #555;
- border-color: #555;
-}
-
-span.empty {
- text-transform: uppercase;
- opacity: 0.5;
- color: #999;
-}
-
-footer {
- align-self: stretch;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- display: flex;
- padding: 20px;
-}
-
-footer .version {
- opacity: 0.3;
-}
-
-.login-page {
- max-width: 600px;
- padding-top: 50px;
-}
-
-.card {
- background: white;
- border-radius: 6px;
- padding: 50px 50px;
- color: #333;
-}
-
-.card .form {
- padding: 0;
-}
-
-.card .form .form-group {
- margin: 0 0 30px 0;
- padding: 0;
-}
-.card .form .form-group .widget {
- flex: 1;
-}
-
-.card .form .form-group label {
- text-align: left;
-}
-
-.card button[type=submit] {
- margin: 0 auto;
-}
-
-.card h3 {
- text-align: center;
- font-size: 36px;
- margin: 0 0 40px 0;
-}
-
-a.badge,
-.badge {
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- padding: 5px 5px;
- border-radius: 4px;
- font-size: 12px;
- background: rgba(255, 255, 255, .1);
- border: 1px solid transparent;
- color: #ffffff;
-}
-
-a.badge:hover {
- color: #FFFFFF;
- border: 1px solid rgba(255,255,255,.4);
-}
-
-.panel-inactive .badge {
- background: rgba(200, 200, 200, .1);
- color: #999999;
-}
-
-.panel-inactive a.badge:hover {
- color: #999999;
- border: 1px solid rgba(180,180,180,.4);
-}
-
-.badge.anonymous {
- opacity: .2;
-}
-
-.panel-logs {
- padding-bottom: 20px;
-}
-
-.panel-logs pre {
- background: rgba(0,0,0,0.9);
- border: 1px solid #555;
- border-radius: 4px;
- font-family: monospace;
- color: #BBB;
- padding: 20px;
- min-height: 200px;
- max-height: 500px;
- overflow: auto;
-}
-
-.plugin-description {
- font-size: 14px;
- margin-left: 34px;
- color: #999;
-
-}
-
-.explorer {
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: flex-start;
- align-self: stretch;
-}
-
-
-.explorer .left {
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
- align-self: stretch;
- flex: 1;
-}
-
-.explorer .right {
- flex: 3;
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
-}
-
-.panel.panel-menu {
- display: flex;
- flex: 1;
- flex-direction: column;
- align-self: stretch;
- margin-right: 0;
- border-color: #692fbd;
-}
-
-.panel.panel-menu ul {
- flex: 1;
- max-width: 250px;
- display: flex;
- flex-direction: column;
- align-self: stretch;
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-.panel.panel-menu ul li {
- margin: 3px 0;
-}
-
-.panel.panel-menu ul li a {
- padding: 5px 15px 5px 15px;
- color: inherit;
- display: flex;
- flex-direction: row;
- justify-content: flex-start;
- align-items: center;
- flex: 1;
-}
-
-
-
-.panel.panel-menu ul li:hover {
- color: #555;
- font-weight: bold;
-}
-
-.panel.panel-menu ul li.active {
- color: #692fbd;
- background: #692fbd22;
- border-radius: 4px;
- font-weight: bold;
- border: 1px solid #692fbd;
-}
-
-
-
-.explorer .panel-active {
- background: white;
- color: #AAA;
- border-color: #BBB;
-}
-.explorer .panel-active h3 {
- color: #0bc44e;
-}
-
-
-.explorer .panel-inactive {
- background: white;
- color: #AAA;
- border-color: #BBB;
-}
diff --git a/data/www/scss/base/_html.scss b/data/www/scss/base/_html.scss
new file mode 100644
index 0000000..1225eb0
--- /dev/null
+++ b/data/www/scss/base/_html.scss
@@ -0,0 +1,29 @@
+* {
+ font-family: 'Roboto', 'Arial', 'sans-serif';
+}
+
+html {
+ height: 100vh;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ background-color: $blueDark;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-start;
+ align-self: stretch;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ flex: 1;
+ background-color: $blueDark;
+ color: $white;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-start;
+ align-self: stretch;
+}
+
diff --git a/data/www/scss/base/_tachyons.scss b/data/www/scss/base/_tachyons.scss
new file mode 100644
index 0000000..c3858e7
--- /dev/null
+++ b/data/www/scss/base/_tachyons.scss
@@ -0,0 +1,16 @@
+
+.invisible {
+ visibility: hidden !important;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.tac {
+ text-align: center;
+}
+
+a {
+ text-decoration: none;
+}
diff --git a/data/www/scss/components/_alerts.scss b/data/www/scss/components/_alerts.scss
new file mode 100644
index 0000000..8967ca7
--- /dev/null
+++ b/data/www/scss/components/_alerts.scss
@@ -0,0 +1,35 @@
+.alert {
+ margin: 10px 30px 20px 30px;
+ padding: 20px 50px;
+ align-self: stretch;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ border-radius: 4px;
+}
+
+.alert-info {
+ color: $neutralGrey;
+ border: 1px solid $neutralGrey;
+ background: rgba($neutralGrey, .2);
+}
+
+.alert-success {
+ color: $success;
+ border: 1px solid $success;
+ background: rgba($success, .2);
+}
+
+.alert-error {
+ color: $danger;
+ border: 1px solid $danger;
+ background: rgba($danger, .2);
+}
+
+.alert-icon {
+ border-radius: 4px;
+ padding: 3px 4px;
+ min-width: 18px;
+ text-align: center;
+}
\ No newline at end of file
diff --git a/data/www/scss/components/_badges.scss b/data/www/scss/components/_badges.scss
new file mode 100644
index 0000000..9ece039
--- /dev/null
+++ b/data/www/scss/components/_badges.scss
@@ -0,0 +1,32 @@
+a.badge,
+.badge {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ padding: 5px 5px;
+ border-radius: 4px;
+ font-size: 12px;
+ background: rgba($white, .1);
+ border: 1px solid transparent;
+ color: $white;
+}
+
+a.badge:hover {
+ color: $white;
+ border: 1px solid rgba($white, .4);
+}
+
+.panel-inactive .badge {
+ background: rgba($lightGrey, .1);
+ color: $lightGrey;
+}
+
+.panel-inactive a.badge:hover {
+ color: $lightGrey;
+ border: 1px solid rgba($lightGrey,.2);
+}
+
+.badge.anonymous {
+ opacity: .2;
+}
diff --git a/data/www/scss/components/_buttons.scss b/data/www/scss/components/_buttons.scss
new file mode 100644
index 0000000..d95d78f
--- /dev/null
+++ b/data/www/scss/components/_buttons.scss
@@ -0,0 +1,52 @@
+select.select-item-picker,
+a.btn,
+button {
+ background-color: $white;
+ border-radius: 5px;
+ border: 1px solid $sweetPurple;
+ color: darken($bitterPurple, 30%);
+ padding: 10px 30px;
+ text-decoration: none;
+ margin: 10px;
+ cursor: pointer;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ font-weight: 400;
+ font-size: 14px;
+ transition: .2s linear all;
+}
+
+a.btn:hover,
+button:hover {
+ color: $sweetPurple;
+}
+
+select.select-item-picker,
+button.purple {
+ font-weight: bold;
+ border: 1px solid $bitterPurple;
+ color: white;
+ background: $bitterPurple;
+ background: linear-gradient(90deg, $sweetPurple 0%, $bitterPurple 100%);
+}
+
+button.green {
+ font-weight: bold;
+ color: white;
+ border: 1px solid $limeGreen;
+ background: linear-gradient(90deg, lighten($limeGreen, 10%) 0%, darken($limeGreen, 10%) 100%);
+}
+
+button.normal:hover {
+ color: white;
+ border-color: $bitterPurple;
+ background: $bitterPurple;
+ background: linear-gradient(90deg, $sweetPurple 0%, $bitterPurple 100%);
+}
+
+button.green:hover,
+button.purple:hover {
+ border: 1px solid $white;
+}
diff --git a/data/www/scss/components/_cards.scss b/data/www/scss/components/_cards.scss
new file mode 100644
index 0000000..669e2c5
--- /dev/null
+++ b/data/www/scss/components/_cards.scss
@@ -0,0 +1,38 @@
+.login-page {
+ max-width: 600px;
+ padding-top: 50px;
+}
+
+.card {
+ background: $white;
+ border-radius: 6px;
+ padding: 50px 50px;
+ color: lighten($black, 20%);
+}
+
+.card .form {
+ padding: 0;
+}
+
+.card .form .form-group {
+ margin: 0 0 30px 0;
+ padding: 0;
+}
+
+.card .form .form-group .widget {
+ flex: 1;
+}
+
+.card .form .form-group label {
+ text-align: left;
+}
+
+.card button[type=submit] {
+ margin: 0 auto;
+}
+
+.card h3 {
+ text-align: center;
+ font-size: 36px;
+ margin: 0 0 40px 0;
+}
diff --git a/data/www/scss/components/_empty.scss b/data/www/scss/components/_empty.scss
new file mode 100644
index 0000000..4e39276
--- /dev/null
+++ b/data/www/scss/components/_empty.scss
@@ -0,0 +1,5 @@
+span.empty {
+ text-transform: uppercase;
+ opacity: 0.5;
+ color: $lightGrey;
+}
diff --git a/data/www/scss/components/_explorer.scss b/data/www/scss/components/_explorer.scss
new file mode 100644
index 0000000..c86d081
--- /dev/null
+++ b/data/www/scss/components/_explorer.scss
@@ -0,0 +1,41 @@
+.explorer {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: flex-start;
+ align-self: stretch;
+}
+
+.explorer .left {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-start;
+ align-self: stretch;
+ flex: 1;
+}
+
+.explorer .right {
+ flex: 3;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-start;
+}
+
+
+.explorer .panel-active {
+ background: $white;
+ color: $lightGrey;
+ border-color: $lightGrey;
+}
+
+.explorer .panel-active h3 {
+ color: $limeGreen;
+}
+
+.explorer .panel-inactive {
+ background: $white;
+ color: $lightGrey;
+ border-color: $lightGrey;
+}
diff --git a/data/www/scss/components/_icons.scss b/data/www/scss/components/_icons.scss
new file mode 100644
index 0000000..3898e1b
--- /dev/null
+++ b/data/www/scss/components/_icons.scss
@@ -0,0 +1,7 @@
+.icon-right {
+ margin: 0 0 0 10px;
+}
+
+.icon-left {
+ margin: 0 10px 0 0;
+}
diff --git a/data/www/scss/components/_modals.scss b/data/www/scss/components/_modals.scss
new file mode 100644
index 0000000..0a99d22
--- /dev/null
+++ b/data/www/scss/components/_modals.scss
@@ -0,0 +1,49 @@
+.modals {
+ position: fixed;
+ background: rgba($black, 0.4);
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+.modals-outer {
+ min-width: 30%;
+ display: flex;
+ flex-direction: column;
+ overflow: auto;
+}
+
+.modals-outer .modal-close {
+ color: $white;
+ font-size: 30px;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: center;
+ margin-bottom: 20px;
+ margin-top: 0px;
+}
+
+.modals-inner {
+ background: $white;
+ border-radius: 10px;
+ color: lighten($black, 20%);
+}
+
+.modals-inner .modal h2 {
+ border-bottom: 1px solid $lightGrey;
+ padding: 15px 15px;
+ margin: 0;
+}
+
+.modals-inner .modal h3 {
+ align-self: stretch;
+ border-bottom: 1px solid $lightGrey;
+ padding: 15px 15px;
+ margin: 0;
+}
diff --git a/data/www/scss/components/_pagetab.scss b/data/www/scss/components/_pagetab.scss
new file mode 100644
index 0000000..1032062
--- /dev/null
+++ b/data/www/scss/components/_pagetab.scss
@@ -0,0 +1,35 @@
+
+ul.pagetab {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: row;
+ border-bottom: 1px solid $limeGreen;
+}
+
+ul.pagetab li {
+ flex: 1;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ border-right: 1px solid $limeGreen;
+}
+
+ul.pagetab li a {
+ flex: 1;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ padding: 20px 5px;
+ color: $limeGreen;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+ul.pagetab li.active a {
+ background: $limeGreen;
+ color: $white;
+}
diff --git a/data/www/scss/components/_panels.scss b/data/www/scss/components/_panels.scss
new file mode 100644
index 0000000..f3d2443
--- /dev/null
+++ b/data/www/scss/components/_panels.scss
@@ -0,0 +1,173 @@
+.panel {
+ background: rgba($white, 0.15);
+ border-radius: 5px;
+ padding: 0 25px 80px 25px;
+ margin: 10px 25px;
+ border-left: 5px solid $limeGreen;
+ align-self: stretch;
+}
+
+.panel.no-border {
+ border: none;
+}
+
+.panel h3 {
+ color: $white;
+}
+
+.panel-inactive {
+ background: $white;
+ color: $lightGrey;
+ border-color: $lightGrey;
+}
+
+.panel-inactive h3 {
+ color: lighten($black, 10%);
+}
+
+.panel table {
+ width: 100%;
+ margin-top: 30px;
+ border-collapse: collapse;
+ text-align: left;
+ font-weight: normal;
+}
+
+.panel th {
+ border-bottom: 1px solid $white;
+ border-collapse: collapse;
+ padding: 10px;
+ font-weight: normal;
+}
+
+.panel-inactive th {
+ border-color: $lightGrey;
+}
+
+.panel td {
+ border-collapse: collapse;
+ padding: 10px;
+}
+
+.panel td a.item.sort {
+ cursor: move;
+}
+
+.panel td a.item-name {
+ color: $white;
+}
+
+.panel-inactive td a.item-name {
+ color: $lightGrey;
+}
+
+.panel td a.item-name:hover {
+ text-decoration: underline;
+}
+
+.panel td.actions a {
+ background: $white;
+ color: lighten($black, 20%);
+ border: 1px solid $lightGrey;
+ border-radius: 4px;
+ padding: 2px;
+ width: 35px;
+ display: inline-block;
+ text-align: center;
+ margin: 0 2px;
+}
+
+.panel td.actions a:hover {
+ color: $limeGreen;
+ border-color: $limeGreen;
+}
+
+.panel td.actions a.item-edit:hover {
+ color: $sweetPurple;
+ border-color: $sweetPurple;
+}
+
+.panel td.actions a.item-delete:hover {
+ color: $danger;
+ border-color: $danger;
+}
+
+.panel td.infos {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: flex-start;
+}
+
+.panel td .inner {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+.panel td div.badge {
+ margin-right: 5px;
+ font-size: 10px;
+ font-weight: bold;
+}
+
+.panel a {
+ color: $limeGreen;
+ text-decoration: none;
+}
+
+.panel a:hover {
+ color: darken($limeGreen, 10%);
+}
+
+.panel.panel-menu {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ align-self: stretch;
+ margin-right: 0;
+ border-color: $bitterPurple;
+}
+
+.panel.panel-menu ul {
+ flex: 1;
+ max-width: 250px;
+ display: flex;
+ flex-direction: column;
+ align-self: stretch;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.panel.panel-menu ul li {
+ margin: 3px 0;
+}
+
+.panel.panel-menu ul li a {
+ padding: 5px 15px;
+ color: inherit;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ flex: 1;
+}
+
+.panel.panel-menu ul li:hover {
+ color: $neutralGrey;
+ font-weight: bold;
+}
+
+.panel.panel-menu ul li.active {
+ color: $bitterPurple;
+ background: rgba($bitterPurple, 0.34);
+ border-radius: 4px;
+ font-weight: bold;
+ border: 1px solid $bitterPurple;
+}
+
+.panel.panel-menu ul li.active a {
+ color: inherit;
+}
diff --git a/data/www/scss/components/_switches.scss b/data/www/scss/components/_switches.scss
new file mode 100644
index 0000000..997b3c8
--- /dev/null
+++ b/data/www/scss/components/_switches.scss
@@ -0,0 +1,116 @@
+.pure-material-switch {
+ z-index: 0;
+ position: relative;
+ display: inline-block;
+}
+
+.pure-material-switch > input {
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ z-index: -1;
+ position: absolute;
+ right: 6px;
+ top: -8px;
+ display: block;
+ margin: 0;
+ border-radius: 50%;
+ width: 40px;
+ height: 40px;
+ background-color: rgba($black, 0.38);
+ outline: none;
+ opacity: 0;
+ transform: scale(1);
+ pointer-events: none;
+ transition: opacity 0.3s 0.1s, transform 0.2s 0.1s;
+}
+
+.pure-material-switch > span {
+ display: inline-block;
+ width: 100%;
+ cursor: pointer;
+}
+
+.pure-material-switch > span::before {
+ content: "";
+ float: right;
+ display: inline-block;
+ margin: 5px 0 5px 10px;
+ border-radius: 7px;
+ width: 36px;
+ height: 14px;
+ background-color: rgba($black, 0.38);
+ vertical-align: top;
+ transition: background-color 0.2s, opacity 0.2s;
+}
+
+.pure-material-switch > span::after {
+ content: "";
+ position: absolute;
+ top: 2px;
+ right: 16px;
+ border-radius: 50%;
+ width: 20px;
+ height: 20px;
+ background-color: $white;
+ box-shadow: 0 3px 1px -2px rgba($black, 0.2), 0 2px 2px 0 rgba($black, 0.14), 0 1px 5px 0 rgba($black, 0.12);
+ transition: background-color 0.2s, transform 0.2s;
+}
+
+.pure-material-switch > input:checked {
+ right: -10px;
+ background-color: $limeGreen;
+}
+
+.pure-material-switch > input:checked + span::before {
+ background-color: rgba($limeGreen, 0.6);
+}
+
+.pure-material-switch > input:checked + span::after {
+ background-color: $limeGreen;
+ transform: translateX(16px);
+}
+
+.pure-material-switch:hover > input {
+ opacity: 0.04;
+}
+
+.pure-material-switch > input:focus {
+ opacity: 0.12;
+}
+
+.pure-material-switch:hover > input:focus {
+ opacity: 0.16;
+}
+
+.pure-material-switch > input:active {
+ opacity: 1;
+ transform: scale(0);
+ transition: transform 0s, opacity 0s;
+}
+
+.pure-material-switch > input:active + span::before {
+ background-color: rgba($limeGreen, 0.6);
+}
+
+.pure-material-switch > input:checked:active + span::before {
+ background-color: rgba($black, 0.38);
+}
+
+.pure-material-switch > input:disabled {
+ opacity: 0;
+}
+
+.pure-material-switch > input:disabled + span {
+ color: $black;
+ opacity: 0.38;
+ cursor: default;
+}
+
+.pure-material-switch > input:disabled + span::before {
+ background-color: rgba($black, 0.38);
+}
+
+.pure-material-switch > input:checked:disabled + span::before {
+ background-color: rgba($limeGreen, 0.6);
+}
diff --git a/data/www/scss/components/_toolbar.scss b/data/www/scss/components/_toolbar.scss
new file mode 100644
index 0000000..f607cbb
--- /dev/null
+++ b/data/www/scss/components/_toolbar.scss
@@ -0,0 +1,18 @@
+.toolbar {
+ display: flex;
+ flex-direction: row;
+ padding: 0 25px;
+ align-self: stretch;
+}
+
+.toolbar h2 {
+ padding: 0 25px 0 0;
+}
+
+.toolbar .toolbar-actions {
+ flex: 1;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: center;
+}
diff --git a/data/www/scss/fleet-studio.scss b/data/www/scss/fleet-studio.scss
new file mode 100644
index 0000000..6531036
--- /dev/null
+++ b/data/www/scss/fleet-studio.scss
@@ -0,0 +1,16 @@
+// Import utility styles
+@import 'utils/variables';
+@import 'utils/mixins';
+
+// Import base styles
+@import 'base/tachyons';
+
+// Import component styles
+@import 'components/pagetab';
+
+// Import pages styles
+@import 'pages/fleet-studio';
+
+
+
+
diff --git a/data/www/scss/forms/_forms.scss b/data/www/scss/forms/_forms.scss
new file mode 100644
index 0000000..7d38aab
--- /dev/null
+++ b/data/www/scss/forms/_forms.scss
@@ -0,0 +1,91 @@
+.form {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-start;
+ padding: 20px;
+}
+
+.form .form-group {
+ margin: 10px 20px 5px 20px;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ align-self: stretch;
+ flex: 1;
+}
+
+.form .form-group label {
+ flex: 1;
+ padding: 10px;
+ text-align: right;
+ margin-right: 20px;
+}
+
+.form .form-group .widget {
+ flex: 3;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ align-self: stretch;
+}
+
+.form .form-group input,
+.form .form-group select,
+.form .form-group textarea {
+ flex: 1;
+ padding: 10px 5px 10px 5px;
+ border: 1px solid darken($white, 10%);
+ border-radius: 4px;
+ width: auto;
+}
+
+.form .form-group input[type=checkbox] {
+ flex: 0;
+}
+
+.form .form-group .trigger {
+ margin-right: 10px;
+}
+
+.form .form-group select.trigger {
+ max-width: 120px;
+}
+
+.form .form-group span {
+ margin-left: 10px;
+}
+
+.form .actions {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: center;
+ margin-top: 10px;
+ align-self: stretch;
+}
+
+.form .actions button.green,
+.form .actions button {
+ font-size: 18px;
+}
+
+.form .actions button.green:hover {
+ background: white;
+ color: $limeGreen;
+ border-color: $limeGreen;
+}
+
+.form .actions button.btn-normal {
+ color: $lightGrey;
+ border-color: $lightGrey;
+ font-size: 18px;
+ margin: 0;
+}
+
+.form .actions button.btn-normal:hover {
+ color: $neutralGrey;
+ border-color: $neutralGrey;
+}
diff --git a/data/www/scss/layout/_container.scss b/data/www/scss/layout/_container.scss
new file mode 100644
index 0000000..a0db3ec
--- /dev/null
+++ b/data/www/scss/layout/_container.scss
@@ -0,0 +1,23 @@
+.container {
+ background: rgba($black, 0.1);
+ margin: auto;
+ display: flex;
+ align-self: stretch;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ flex: 1;
+ min-width: 70%;
+
+ @media only screen and (max-width: 1200px) {
+ min-width: 95%;
+ }
+}
+
+.container.expand {
+ min-width: 100%;
+
+ @media only screen and (max-width: 1200px) {
+ min-width: 100%;
+ }
+}
diff --git a/data/www/scss/layout/_footer.scss b/data/www/scss/layout/_footer.scss
new file mode 100644
index 0000000..24408ee
--- /dev/null
+++ b/data/www/scss/layout/_footer.scss
@@ -0,0 +1,12 @@
+footer {
+ align-self: stretch;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ display: flex;
+ padding: 20px;
+}
+
+footer .version {
+ opacity: 0.3;
+}
diff --git a/data/www/scss/layout/_header.scss b/data/www/scss/layout/_header.scss
new file mode 100644
index 0000000..531a807
--- /dev/null
+++ b/data/www/scss/layout/_header.scss
@@ -0,0 +1,88 @@
+header {
+ text-align: center;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ align-self: stretch;
+ padding: 0 25px;
+}
+
+header .logo {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+header .logo a {
+ color: inherit;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+header .logo img {
+ width: 32px;
+ height: 32px;
+ margin-right: 10px;
+}
+
+header nav {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: center;
+ flex: 1;
+}
+
+header nav ul {
+ list-style: none;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+header nav ul li {
+ margin: 0 15px;
+}
+
+header nav ul li.user-menu {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: center;
+ border: 1px solid $limeGreen;
+ padding: 5px 15px;
+ border-radius: 4px;
+ background: rgba($limeGreen, .2);
+}
+
+header nav ul li.user-menu .logout {
+ color: $white;
+}
+
+header nav ul li.user-menu .username {
+ margin-right: 20px;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ font-weight: bold;
+ color: $limeGreen;
+}
+
+header nav ul li.user-menu .username i {
+ margin-right: 5px;
+ font-size: 12px;
+}
+
+header nav ul li a {
+ color: rgba($white, 0.6);
+ text-decoration: none;
+}
+
+header nav ul li a:hover,
+header nav ul li.active a {
+ color: white;
+}
diff --git a/data/www/scss/main-studio.scss b/data/www/scss/main-studio.scss
new file mode 100644
index 0000000..a21bfd7
--- /dev/null
+++ b/data/www/scss/main-studio.scss
@@ -0,0 +1,32 @@
+// Import utility styles
+@import 'utils/variables';
+@import 'utils/mixins';
+
+// Import base styles
+@import 'base/html';
+@import 'base/tachyons';
+
+// Import layout styles
+@import 'layout/header';
+@import 'layout/footer';
+@import 'layout/container';
+
+// Import component styles
+@import 'components/buttons';
+@import 'components/alerts';
+@import 'components/modals';
+@import 'components/panels';
+@import 'components/switches';
+@import 'components/cards';
+@import 'components/empty';
+@import 'components/badges';
+@import 'components/explorer';
+@import 'components/toolbar';
+@import 'components/icons';
+
+// Import form styles
+@import 'forms/forms';
+
+// Import pages styles
+@import 'pages/settings';
+@import 'pages/sysinfo';
diff --git a/data/www/scss/pages/_fleet-studio.scss b/data/www/scss/pages/_fleet-studio.scss
new file mode 100644
index 0000000..1051337
--- /dev/null
+++ b/data/www/scss/pages/_fleet-studio.scss
@@ -0,0 +1,33 @@
+html {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex: 1;
+ background: $blueDark;
+ font-family: 'Arial', 'sans-serif';
+ color: white;
+ height: 100vh;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex: 1;
+ flex-direction: column
+}
+
+main {
+ display: flex;
+ flex: 1;
+}
+
+main .studio-frame {
+ display: flex;
+ flex: 1;
+}
+
+main .studio-frame iframe {
+ display: flex;
+ flex: 1;
+}
diff --git a/data/www/scss/pages/_settings.scss b/data/www/scss/pages/_settings.scss
new file mode 100644
index 0000000..d062db3
--- /dev/null
+++ b/data/www/scss/pages/_settings.scss
@@ -0,0 +1,5 @@
+.plugin-description {
+ font-size: 14px;
+ margin-left: 34px;
+ color: $lightGrey;
+}
\ No newline at end of file
diff --git a/data/www/scss/pages/_sysinfo.scss b/data/www/scss/pages/_sysinfo.scss
new file mode 100644
index 0000000..3448ac5
--- /dev/null
+++ b/data/www/scss/pages/_sysinfo.scss
@@ -0,0 +1,16 @@
+
+.panel-logs {
+ padding-bottom: 20px;
+}
+
+.panel-logs pre {
+ background: rgba($black, 0.9);
+ border: 1px solid $neutralGrey;
+ border-radius: 4px;
+ font-family: monospace;
+ color: darken($white, 5%);
+ padding: 20px;
+ min-height: 200px;
+ max-height: 500px;
+ overflow: auto;
+}
\ No newline at end of file
diff --git a/data/www/scss/utils/_mixins.scss b/data/www/scss/utils/_mixins.scss
new file mode 100644
index 0000000..e69de29
diff --git a/data/www/scss/utils/_variables.scss b/data/www/scss/utils/_variables.scss
new file mode 100644
index 0000000..eae82c2
--- /dev/null
+++ b/data/www/scss/utils/_variables.scss
@@ -0,0 +1,14 @@
+// Raw Colors
+$blueDark: rgb(15, 0, 53);
+$pinkyRed: rgb(239, 14, 93);
+$limeGreen: rgb(14, 239, 95);
+$bitterPurple: rgb(105, 47, 189);
+$sweetPurple: rgb(188, 72, 255);
+$neutralGrey: rgb(70, 70, 70);
+$lightGrey: rgb(153, 153, 153);
+$white: rgb(255, 255, 255);
+$black: rgb(0, 0, 0);
+
+// Type Colors
+$success: $limeGreen;
+$danger: $pinkyRed;
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..2bcaf9e
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,996 @@
+{
+ "name": "obscreen-frontend",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "obscreen-frontend",
+ "version": "1.0.0",
+ "devDependencies": {
+ "sass": "^1.77.6",
+ "vite": "^5.3.1"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
+ "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
+ "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
+ "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
+ "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
+ "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
+ "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
+ "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
+ "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
+ "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
+ "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
+ "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
+ "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
+ "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
+ "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
+ "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
+ "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
+ "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz",
+ "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.18.0",
+ "@rollup/rollup-android-arm64": "4.18.0",
+ "@rollup/rollup-darwin-arm64": "4.18.0",
+ "@rollup/rollup-darwin-x64": "4.18.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.18.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.18.0",
+ "@rollup/rollup-linux-arm64-musl": "4.18.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.18.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.18.0",
+ "@rollup/rollup-linux-x64-gnu": "4.18.0",
+ "@rollup/rollup-linux-x64-musl": "4.18.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.18.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.18.0",
+ "@rollup/rollup-win32-x64-msvc": "4.18.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.77.6",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz",
+ "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz",
+ "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.38",
+ "rollup": "^4.13.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..ef4f761
--- /dev/null
+++ b/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "obscreen-frontend",
+ "version": "1.0.0",
+ "scripts": {
+ "build": "vite build",
+ "watch": "vite"
+ },
+ "devDependencies": {
+ "vite": "^5.3.1",
+ "sass": "^1.77.6"
+ }
+}
+
diff --git a/src/controller/FleetNodeStudioController.py b/src/controller/FleetNodeStudioController.py
index ed74457..457ae89 100644
--- a/src/controller/FleetNodeStudioController.py
+++ b/src/controller/FleetNodeStudioController.py
@@ -27,7 +27,7 @@ class FleetNodeStudioController(ObController):
def fleet(self):
return render_template(
- 'fleet/studio/fleet.jinja.html',
+ 'fleet/studio/fleet-studio.jinja.html',
node_studios=self._model_store.node_studio().get_enabled_node_studios(),
)
diff --git a/views/base.jinja.html b/views/base.jinja.html
index b713194..cf245e6 100755
--- a/views/base.jinja.html
+++ b/views/base.jinja.html
@@ -21,15 +21,15 @@
-
+
-
+
-
+
{% block add_css %}{% endblock %}
{{ HOOK(H_ROOT_CSS) }}
diff --git a/views/fleet/studio/fleet.jinja.html b/views/fleet/studio/fleet-studio.jinja.html
similarity index 60%
rename from views/fleet/studio/fleet.jinja.html
rename to views/fleet/studio/fleet-studio.jinja.html
index 3cbb6f2..5d82084 100644
--- a/views/fleet/studio/fleet.jinja.html
+++ b/views/fleet/studio/fleet-studio.jinja.html
@@ -1,21 +1,10 @@
- Obscreen - Fleet View
-
+ Obscreen - Fleet Studio
+
-
+
{% for node_studio in node_studios %}
-
diff --git a/views/player/default.jinja.html b/views/player/default.jinja.html
index 2d90edc..8db43d0 100755
--- a/views/player/default.jinja.html
+++ b/views/player/default.jinja.html
@@ -44,7 +44,7 @@
#time { font-size: 10em; }
#date { font-size: 3em; }
#ipaddr { font-size: 1.25em; color: #888888; }
- #ipaddr a { color: #FFFFFF; text-decoration: none; font-weight: bold; }
+ #ipaddr a { color: $white; text-decoration: none; font-weight: bold; }
#hidden-container { display: none; }
diff --git a/views/playlist/component/table.jinja.html b/views/playlist/component/table.jinja.html
index 24b5b17..939ae2f 100644
--- a/views/playlist/component/table.jinja.html
+++ b/views/playlist/component/table.jinja.html
@@ -50,9 +50,9 @@
{% endif %}
|
{% if playlist.time_sync %}
- ✅
+
{% else %}
- ❌
+
{% endif %}
|
diff --git a/views/settings/component/table.jinja.html b/views/settings/component/table.jinja.html
index d13dfba..1ad10bd 100644
--- a/views/settings/component/table.jinja.html
+++ b/views/settings/component/table.jinja.html
@@ -38,9 +38,9 @@
{% if variable.value %}
{% if variable.type.value == 'bool' %}
{% if variable.display() %}
- ✅
+
{% else %}
- ❌
+
{% endif %}
{% else %}
{{ variable.display() }}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..ef3303e
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,29 @@
+import { defineConfig } from 'vite';
+import path from 'path';
+
+export default defineConfig({
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, 'data/www/scss/')
+ }
+ },
+ build: {
+ rollupOptions: {
+ input: {
+ 'main-studio': path.resolve(__dirname, 'data/www/scss/main-studio.scss'),
+ 'fleet-studio': path.resolve(__dirname, 'data/www/scss/fleet-studio.scss'),
+ },
+ output: {
+ dir: path.resolve(__dirname, 'data/www/css/compiled'),
+ assetFileNames: '[name].css',
+ entryFileNames: '[name]_entry.css',
+ chunkFileNames: '[name]_chunk[extname]'
+ }
+ }
+ },
+ css: {
+ preprocessorOptions: {
+ scss: {}
+ }
+ }
+});
|