10 changed files with 1344 additions and 0 deletions
			
			
		| 
		 After Width: | Height: | Size: 340 KiB  | 
@ -0,0 +1,21 @@
					 | 
				
			||||
The MIT License (MIT) | 
				
			||||
 | 
				
			||||
Copyright (c) 2016 Dracula Theme | 
				
			||||
 | 
				
			||||
Permission is hereby granted, free of charge, to any person obtaining a copy | 
				
			||||
of this software and associated documentation files (the "Software"), to deal | 
				
			||||
in the Software without restriction, including without limitation the rights | 
				
			||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
				
			||||
copies of the Software, and to permit persons to whom the Software is | 
				
			||||
furnished to do so, subject to the following conditions: | 
				
			||||
 | 
				
			||||
The above copyright notice and this permission notice shall be included in all | 
				
			||||
copies or substantial portions of the Software. | 
				
			||||
 | 
				
			||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
				
			||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
				
			||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
				
			||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
				
			||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
				
			||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
				
			||||
SOFTWARE. | 
				
			||||
@ -0,0 +1,546 @@
					 | 
				
			||||
:root { | 
				
			||||
 | 
				
			||||
  --bg0: #282A36; | 
				
			||||
  --bg1: #44475A; | 
				
			||||
  --bg2: #585C74; | 
				
			||||
  --bg3: #666e99; | 
				
			||||
 | 
				
			||||
  --alt0: #6272A4; | 
				
			||||
  --alt1: #7A88B3; | 
				
			||||
 | 
				
			||||
  --fg0: #F8F8F2; | 
				
			||||
  --fg1: #EAEAE0; | 
				
			||||
  --fg2: #DEDED2; | 
				
			||||
 | 
				
			||||
  --cyan: #8BE9fD; | 
				
			||||
  --green: #50FA7B; | 
				
			||||
  --orange: #FFb86C; | 
				
			||||
  --pink: #FF79C6; | 
				
			||||
  --purple: #BD93F9; | 
				
			||||
  --red: #FF5555; | 
				
			||||
  --yellow: #F1FA8C; | 
				
			||||
 | 
				
			||||
  --animation-duration: 300ms; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* High DPI */ | 
				
			||||
 | 
				
			||||
@media screen and (min-width: 3000px) and (min-height: 1200px) { | 
				
			||||
  html { | 
				
			||||
    zoom: 2.0; | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Basic */ | 
				
			||||
 | 
				
			||||
html { | 
				
			||||
  height: 100vh; | 
				
			||||
  width: 100vw; | 
				
			||||
  background-color: black; | 
				
			||||
  font-size: 16px; | 
				
			||||
} | 
				
			||||
html * { | 
				
			||||
  font-family: system-ui; | 
				
			||||
  font-size: 16px; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
  color: var(--fg0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
body { | 
				
			||||
  height: 100vh; | 
				
			||||
  width: 100vw; | 
				
			||||
  margin: 0; | 
				
			||||
  overflow-x: hidden; | 
				
			||||
  background-color: var(--bg0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.hide { | 
				
			||||
  opacity: 0; | 
				
			||||
  visibility: hidden; | 
				
			||||
  max-height: 0; | 
				
			||||
  max-width: 0; | 
				
			||||
  display: none; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Scrollbar */ | 
				
			||||
 | 
				
			||||
::-webkit-scrollbar { | 
				
			||||
  width: 6px; | 
				
			||||
} | 
				
			||||
::-webkit-scrollbar-thumb { | 
				
			||||
  background-color: var(--fg2); | 
				
			||||
} | 
				
			||||
::-webkit-scrollbar-thumb:hover { | 
				
			||||
	background-color: var(--fg0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Background */ | 
				
			||||
 | 
				
			||||
#background { | 
				
			||||
  height: 100vh; | 
				
			||||
  width: 100vw; | 
				
			||||
  position: absolute; | 
				
			||||
 | 
				
			||||
  background-color: var(--bg0); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#background img { | 
				
			||||
  width: inherit; | 
				
			||||
  height: inherit; | 
				
			||||
  object-fit: cover; | 
				
			||||
  object-position: center; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#bg-cover { | 
				
			||||
  backdrop-filter: blur(4px); | 
				
			||||
  position: absolute; | 
				
			||||
  height: inherit; | 
				
			||||
  width: inherit; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#screen { | 
				
			||||
  height: 100vh; | 
				
			||||
  width: 100vw; | 
				
			||||
  position: relative; | 
				
			||||
  display: flex; | 
				
			||||
  align-items: center; | 
				
			||||
  justify-content: center; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#cover { | 
				
			||||
  height: 100vh; | 
				
			||||
  width: 100vw; | 
				
			||||
  position: absolute; | 
				
			||||
  z-index: 10; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
 | 
				
			||||
  display: flex; | 
				
			||||
  align-items: center; | 
				
			||||
  justify-content: center; | 
				
			||||
 | 
				
			||||
  background-color: #282A36aa; | 
				
			||||
  backdrop-filter: blur(5px); | 
				
			||||
} | 
				
			||||
#cover > #message { | 
				
			||||
  font-size: 4em; | 
				
			||||
  font-weight: bold; | 
				
			||||
  cursor: default; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Login form */ | 
				
			||||
 | 
				
			||||
#login-wrapper { | 
				
			||||
  position: relative; | 
				
			||||
  background: var(--bg1); | 
				
			||||
  border-radius: 2px; | 
				
			||||
  max-height: 90vh; | 
				
			||||
  width: 30em; | 
				
			||||
  box-sizing: border-box; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
 | 
				
			||||
  /*display: flex;*/ | 
				
			||||
  /*justify-content: center;*/ | 
				
			||||
  /*align-items: flex-start;*/ | 
				
			||||
} | 
				
			||||
body.success #login-wrapper { | 
				
			||||
  background-color: #79d28f; | 
				
			||||
} | 
				
			||||
body.failed #login-wrapper { | 
				
			||||
  background-color: #dd7878; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#login-wrapper-box { | 
				
			||||
  display: flex; | 
				
			||||
  justify-content: center; | 
				
			||||
  align-items: center; | 
				
			||||
  padding: 1.8em 3em; | 
				
			||||
  height: 8em; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#login-form { | 
				
			||||
  display: flex; | 
				
			||||
  align-items: center; | 
				
			||||
  justify-content: space-around; | 
				
			||||
  flex-direction: column; | 
				
			||||
  height: 10em; | 
				
			||||
  max-width: fit-content; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
input { | 
				
			||||
  background-color: var(--bg2); | 
				
			||||
  color: var(--fg0); | 
				
			||||
  border: 0; | 
				
			||||
  border-radius: 2px; | 
				
			||||
  padding: 1em; | 
				
			||||
  margin: 0.5em; | 
				
			||||
  font-size: inherit; | 
				
			||||
  font-family: inherit; | 
				
			||||
} | 
				
			||||
input:focus, input:focus-visible { | 
				
			||||
  border: 0; | 
				
			||||
  outline: auto var(--fg0); | 
				
			||||
} | 
				
			||||
:focus { | 
				
			||||
  outline: auto var(--fg0) !important; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#pass-form.hide { | 
				
			||||
  visibility: hidden; | 
				
			||||
  max-height: initial; | 
				
			||||
  max-width: initial; | 
				
			||||
  display: flex; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#input-password { | 
				
			||||
  box-shadow: 0 2px var(--cyan); | 
				
			||||
  box-sizing: border-box; | 
				
			||||
  margin: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#input-username { | 
				
			||||
  box-sizing: border-box; | 
				
			||||
  width: 100%; | 
				
			||||
  margin: 0; | 
				
			||||
  box-shadow: 0 2px var(--orange); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
::placeholder { | 
				
			||||
  color: var(--fg2); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#pass-wrapper { | 
				
			||||
  display: flex; | 
				
			||||
  width: 100%; | 
				
			||||
  flex-direction: row; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#user-wrapper { | 
				
			||||
  display: flex; | 
				
			||||
  width: 100%; | 
				
			||||
  flex-direction: row; | 
				
			||||
  position: relative; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#submit-button { | 
				
			||||
  background-color: #72bece; | 
				
			||||
} | 
				
			||||
#submit-button:hover, #submit-button:focus { | 
				
			||||
  background-color: var(--purple); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#users-button-wrapper { | 
				
			||||
  display: flex; | 
				
			||||
  flex-direction: column; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#users-button { | 
				
			||||
  background-color: var(--orange); | 
				
			||||
  height: 100%; | 
				
			||||
} | 
				
			||||
#users-button:hover, #users-button:focus { | 
				
			||||
  background-color: var(--red); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#users-dropdown { | 
				
			||||
  height: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#users-dropdown .dropdown { | 
				
			||||
  background-color: var(--bg2); | 
				
			||||
  right: 0; | 
				
			||||
  z-index: 2; | 
				
			||||
} | 
				
			||||
#users-dropdown .dropdown button:hover, #users-dropdown .dropdown button:focus { | 
				
			||||
  background-color: var(--orange); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Time and date */ | 
				
			||||
 | 
				
			||||
#time-date { | 
				
			||||
  position: absolute; | 
				
			||||
  display: flex; | 
				
			||||
  flex-direction: column; | 
				
			||||
  align-items: center; | 
				
			||||
  background-color: transparent; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
  overflow: hidden; | 
				
			||||
  cursor: pointer; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#time-date:hover, #time-date:focus { | 
				
			||||
  filter: drop-shadow(2px 2px 6px black); | 
				
			||||
  /*animation-name: shake;*/ | 
				
			||||
  animation-duration: 1s; | 
				
			||||
  animation-direction: normal; | 
				
			||||
  animation-iteration-count: 1; | 
				
			||||
  animation-timing-function: ease-in-out; | 
				
			||||
} | 
				
			||||
#time-date:hover *, #time-date:focus * { | 
				
			||||
  /*color: var(--cyan);*/ | 
				
			||||
} | 
				
			||||
#time-date.hide { | 
				
			||||
  display: flex; | 
				
			||||
  max-height: initial; | 
				
			||||
  max-width: initial; | 
				
			||||
  opacity: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#time-label { | 
				
			||||
  font-size: 4em; | 
				
			||||
  margin: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Buttons */ | 
				
			||||
button { | 
				
			||||
  /*color: var(--fg0);*/ | 
				
			||||
  border: 0; | 
				
			||||
  /*font-size: inherit;*/ | 
				
			||||
  /*font-family: inherit;*/ | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.button { | 
				
			||||
  background: var(--purple); | 
				
			||||
  border: 0; | 
				
			||||
  padding: 0.5em; | 
				
			||||
  font-size: inherit; | 
				
			||||
  cursor: pointer; | 
				
			||||
  border-radius: 2px; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.button-group { | 
				
			||||
  background: var(--purple); | 
				
			||||
  border: 0; | 
				
			||||
  padding: 0; | 
				
			||||
  font-size: inherit; | 
				
			||||
  border-radius: 2px; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
} | 
				
			||||
.button-group > * { | 
				
			||||
  background-color: transparent; | 
				
			||||
  cursor: pointer; | 
				
			||||
  padding: 0.5em 0.8em; | 
				
			||||
  transition: inherit; | 
				
			||||
} | 
				
			||||
.button-group > *:hover, .button-group > *:focus { | 
				
			||||
  background-color: var(--orange); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Auth message */ | 
				
			||||
 | 
				
			||||
#auth-message { | 
				
			||||
  position: absolute; | 
				
			||||
  font-size: 4em; | 
				
			||||
  font-weight: bold; | 
				
			||||
} | 
				
			||||
#auth-message.hide { | 
				
			||||
  display: block; | 
				
			||||
  max-width: initial; | 
				
			||||
  max-height: initial; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Bottom bar */ | 
				
			||||
#bottom-bar { | 
				
			||||
  background-color: #585c7480; | 
				
			||||
  backdrop-filter: blur(10px); | 
				
			||||
  width: -webkit-fill-available; | 
				
			||||
  min-height: 2em; | 
				
			||||
 | 
				
			||||
  display: flex; | 
				
			||||
  align-items: stretch; | 
				
			||||
  padding: 0.5em; | 
				
			||||
} | 
				
			||||
#bottom-bar * { | 
				
			||||
  font-weight: bold; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#bottom-bar .button { | 
				
			||||
  display: flex; | 
				
			||||
  align-items: center; | 
				
			||||
  padding: 0.5em 0.75em; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#sessions-button { | 
				
			||||
  background-color: var(--bg3); | 
				
			||||
} | 
				
			||||
#sessions-button > span { | 
				
			||||
  margin-left: 0.3em; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#sessions-button:hover, #sessions-button:focus { | 
				
			||||
  background-color: var(--purple); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#sessions-dropdown { | 
				
			||||
  max-height: 25vh; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#bottom-right { | 
				
			||||
  background-color: var(--bg3); | 
				
			||||
  margin-left: auto; | 
				
			||||
  display: flex; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Top bar */ | 
				
			||||
#top-bar { | 
				
			||||
  background-color: transparent; | 
				
			||||
  width: -webkit-fill-available; | 
				
			||||
  min-height: 2em; | 
				
			||||
  padding: 1em; | 
				
			||||
  padding-bottom: 0; | 
				
			||||
  font-weight: bold; | 
				
			||||
 | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
 | 
				
			||||
  display: flex; | 
				
			||||
  align-items: center; | 
				
			||||
  justify-content: center; | 
				
			||||
} | 
				
			||||
#bottom-bar.hide, #top-bar.hide { | 
				
			||||
  min-height: 0; | 
				
			||||
  max-height: 0; | 
				
			||||
  max-width: initial; | 
				
			||||
  display: flex; | 
				
			||||
  overflow: hidden; | 
				
			||||
  padding: 0; | 
				
			||||
  margin: 0; | 
				
			||||
  opacity: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Panel */ | 
				
			||||
 | 
				
			||||
#panel-button { | 
				
			||||
  position: absolute; | 
				
			||||
  top: 0; | 
				
			||||
  right: 0; | 
				
			||||
  margin: 1em; | 
				
			||||
 | 
				
			||||
  background-color: var(--bg1); | 
				
			||||
} | 
				
			||||
#panel-button:hover, #panel-button:focus { | 
				
			||||
  background-color: var(--green); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.panel { | 
				
			||||
  position: fixed; | 
				
			||||
  width: 350px; | 
				
			||||
  height: -webkit-fill-available; | 
				
			||||
  background: var(--bg2); | 
				
			||||
  right: 0; | 
				
			||||
 | 
				
			||||
  display: flex; | 
				
			||||
  flex-direction: row; | 
				
			||||
  flex-wrap: wrap; | 
				
			||||
  justify-content: space-between; | 
				
			||||
  align-content: flex-start; | 
				
			||||
  padding: 1.5em; | 
				
			||||
 | 
				
			||||
  overflow-y: auto; | 
				
			||||
  overflow-x: hidden; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.panel.hide { | 
				
			||||
  transform: translateX(100%); | 
				
			||||
  display: flex; | 
				
			||||
  visibility: hidden; | 
				
			||||
  opacity: 100%; | 
				
			||||
  max-width: 100vw; | 
				
			||||
  max-height: 100vh; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.panel .image { | 
				
			||||
  display: flex; | 
				
			||||
  flex-direction: column; | 
				
			||||
  width: 48%; | 
				
			||||
  background-color: transparent; | 
				
			||||
  margin-top: 1em; | 
				
			||||
  padding: 0; | 
				
			||||
  cursor: pointer; | 
				
			||||
  border-color: var(--fg0); | 
				
			||||
  border-width: 1px; | 
				
			||||
  border-style: solid; | 
				
			||||
  border-radius: 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.panel .image > img { | 
				
			||||
  background-color: var(--alt1); | 
				
			||||
  width: -webkit-fill-available; | 
				
			||||
  max-height: 200px; | 
				
			||||
  object-fit: cover; | 
				
			||||
  filter: brightness(0.8); | 
				
			||||
} | 
				
			||||
.panel .image:hover, .panel .image:focus { | 
				
			||||
  filter: drop-shadow(2px 2px 6px black); | 
				
			||||
} | 
				
			||||
.panel .image:hover > img, .panel .image:focus > img { | 
				
			||||
  filter: brightness(1); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.panel h3 { | 
				
			||||
  width: 80%; | 
				
			||||
  margin-top: 0; | 
				
			||||
  margin-bottom: 0; | 
				
			||||
  font-size: 1.2em; | 
				
			||||
  align-self: center; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#close-panel-button { | 
				
			||||
  background-color: var(--alt1); | 
				
			||||
  height: fit-content; | 
				
			||||
  align-self: center; | 
				
			||||
} | 
				
			||||
#close-panel-button:hover, #close-panel-button:focus { | 
				
			||||
  background-color: var(--red); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Dropdown */ | 
				
			||||
.dropdown { | 
				
			||||
  position: absolute; | 
				
			||||
  background-color: var(--bg2); | 
				
			||||
  min-width: 8em; | 
				
			||||
  max-height: 60vh; | 
				
			||||
  overflow-y: auto; | 
				
			||||
  margin: 0; | 
				
			||||
  padding: 0; | 
				
			||||
  transition: var(--animation-duration); | 
				
			||||
} | 
				
			||||
.dropdown button { | 
				
			||||
  background-color: transparent; | 
				
			||||
  color: var(--fg0); | 
				
			||||
  padding: 0.8em; | 
				
			||||
  width: -webkit-fill-available; | 
				
			||||
  cursor: pointer; | 
				
			||||
} | 
				
			||||
.dropdown button:hover, .dropdown button:focus { | 
				
			||||
  background-color: var(--purple); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.dropdown li { | 
				
			||||
  text-decoration: none; | 
				
			||||
  display: block; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
.dropdown.hide { | 
				
			||||
  visibility: hidden; | 
				
			||||
  opacity: 100%; | 
				
			||||
  display: block; | 
				
			||||
  max-height: 0 !important; | 
				
			||||
  overflow-y: hidden; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Animations */ | 
				
			||||
 | 
				
			||||
@keyframes shake { | 
				
			||||
  0% { | 
				
			||||
    transform: rotateZ(0deg); | 
				
			||||
  } | 
				
			||||
  25% { | 
				
			||||
    transform: rotateZ(10deg); | 
				
			||||
  } | 
				
			||||
  75% { | 
				
			||||
    transform: rotateZ(-10deg); | 
				
			||||
  } | 
				
			||||
  100% { | 
				
			||||
    transform: rotateZ(0deg); | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,135 @@
					 | 
				
			||||
<!DOCTYPE html> | 
				
			||||
<html lang="en"> | 
				
			||||
<head> | 
				
			||||
  <meta charset="UTF-8"> | 
				
			||||
  <meta name="viewport" content="width=device-width, viewport-fit=cover, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> | 
				
			||||
  <title>Dracula theme</title> | 
				
			||||
 | 
				
			||||
  <link rel="stylesheet" href="css/style.css" class="style"> | 
				
			||||
  <link rel="stylesheet" href="../../_vendor/material-icons/css/materialdesignicons.min.css" onerror="this.href='../_vendor/material-icons/css/materialdesignicons.min.css'" class="style"> | 
				
			||||
 | 
				
			||||
  <script src="../_vendor/js/mock.js"></script> | 
				
			||||
 | 
				
			||||
</head> | 
				
			||||
<body> | 
				
			||||
 | 
				
			||||
  <div id="background"> | 
				
			||||
    <div id="bg-cover"></div> | 
				
			||||
    <img src="./assets/dracula.png" alt=""> | 
				
			||||
  </div> | 
				
			||||
 | 
				
			||||
  <div id="cover" class="hide"> | 
				
			||||
    <div id="message"></div> | 
				
			||||
  </div> | 
				
			||||
 | 
				
			||||
  <div id="screen"> | 
				
			||||
 | 
				
			||||
    <div id="login-wrapper"> | 
				
			||||
 | 
				
			||||
      <div id="top-bar"> | 
				
			||||
        Welcome! | 
				
			||||
      </div> | 
				
			||||
 | 
				
			||||
      <div id="login-wrapper-box"> | 
				
			||||
        <button id="time-date"> | 
				
			||||
          <h2 id="time-label">20:00</h2> | 
				
			||||
          <h4 id="date-label">20-05-2021</h2> | 
				
			||||
        </button> | 
				
			||||
 | 
				
			||||
        <div id="auth-message" class="hide"></div> | 
				
			||||
 | 
				
			||||
        <div id="pass-form" class="hide"> | 
				
			||||
          <form action="POST" id="login-form"> | 
				
			||||
            <div id="user-wrapper"> | 
				
			||||
              <input id="input-username" name="username" type="text" autocomplete="off" autofocus="true" placeholder="Enter your username"> | 
				
			||||
 | 
				
			||||
              <div id="users-button-wrapper"> | 
				
			||||
                <button id="users-button" class="button hide" type="button"> | 
				
			||||
                  <span class="mdi mdi-chevron-down mdi-24px"></span> | 
				
			||||
                </button> | 
				
			||||
                <div id="users-dropdown"> | 
				
			||||
                  <ul class="dropdown hide"> | 
				
			||||
                    <li><button type="button">Vlad Tepes</button></li> | 
				
			||||
                    <li><button type="button">Belmont</button></li> | 
				
			||||
                  </ul> | 
				
			||||
                </div> | 
				
			||||
              </div> | 
				
			||||
 | 
				
			||||
            </div> | 
				
			||||
 | 
				
			||||
            <div id="pass-wrapper"> | 
				
			||||
              <input id="input-password" name="password" type="password" autocomplete="off" autofocus="true" placeholder="Enter your password"> | 
				
			||||
              <button id="submit-button" class="button" type="submit"> | 
				
			||||
                <span class="mdi mdi-chevron-right mdi-24px"></span> | 
				
			||||
              </button> | 
				
			||||
            </div> | 
				
			||||
 | 
				
			||||
          </form> | 
				
			||||
        </div> | 
				
			||||
 | 
				
			||||
      </div> | 
				
			||||
 | 
				
			||||
      <div id="bottom-bar"> | 
				
			||||
        <div id="sessions-button-wrapper"> | 
				
			||||
          <button id="sessions-button" class="button"> | 
				
			||||
            <span class="text">Awesome</span> <span class="mdi mdi-chevron-down mdi-24px"></span> | 
				
			||||
          </button> | 
				
			||||
          <ul id="sessions-dropdown" class="dropdown hide"> | 
				
			||||
            <li><button>Awesome</button></li> | 
				
			||||
            <li><button>Ubuntu</button></li> | 
				
			||||
          </ul> | 
				
			||||
        </div> | 
				
			||||
 | 
				
			||||
        <div id="bottom-right" class="button-group"> | 
				
			||||
          <button id="shutdown-button"> | 
				
			||||
            <span class="mdi mdi-power"></span> | 
				
			||||
          </button> | 
				
			||||
 | 
				
			||||
          <button id="restart-button"> | 
				
			||||
            <span class="mdi mdi-restart"></span> | 
				
			||||
          </button> | 
				
			||||
 | 
				
			||||
          <button id="suspend-button"> | 
				
			||||
            <span class="mdi mdi-power-sleep"></span> | 
				
			||||
          </button> | 
				
			||||
 | 
				
			||||
          <button id="hibernate-button"> | 
				
			||||
            <span class="mdi mdi-power-cycle"></span> | 
				
			||||
          </button> | 
				
			||||
        </div> | 
				
			||||
 | 
				
			||||
      </div> | 
				
			||||
 | 
				
			||||
    </div> | 
				
			||||
 | 
				
			||||
    <button id="panel-button" class="button"> | 
				
			||||
      <span class="mdi mdi-menu mdi-24px"></span> | 
				
			||||
    </button> | 
				
			||||
 | 
				
			||||
    <div id="sidebar" class="panel hide"> | 
				
			||||
      <h3>Background selector</h3> | 
				
			||||
      <button id="close-panel-button" class="button"> | 
				
			||||
        <span class="mdi mdi-close-thick mdi-24px"></span> | 
				
			||||
      </button> | 
				
			||||
 | 
				
			||||
      <button class="image" tabindex="0"> | 
				
			||||
        <img src="./assets/dracula.png" alt=""> | 
				
			||||
      </button> | 
				
			||||
      <button class="image" tabindex="0"> | 
				
			||||
        <img src="./assets/dracula.png" alt=""> | 
				
			||||
      </button> | 
				
			||||
      <button class="image" tabindex="0"> | 
				
			||||
        <img src="./assets/dracula.png" alt=""> | 
				
			||||
      </button> | 
				
			||||
    </div> | 
				
			||||
 | 
				
			||||
  </div> | 
				
			||||
 | 
				
			||||
  <script src="js/debug.js"></script> | 
				
			||||
  <script src="js/accounts.js"></script> | 
				
			||||
  <script src="js/sessions.js"></script> | 
				
			||||
  <script src="js/authenticate.js"></script> | 
				
			||||
  <script src="js/sidebar.js"></script> | 
				
			||||
  <script src="js/index.js"></script> | 
				
			||||
</body> | 
				
			||||
</html> | 
				
			||||
@ -0,0 +1,89 @@
					 | 
				
			||||
class Accounts { | 
				
			||||
	constructor() { | 
				
			||||
		this._localStorage = window.localStorage | 
				
			||||
		this._userWrapper = document.querySelector("#user-wrapper") | 
				
			||||
		this._accountsList = document.querySelector("#users-dropdown") | 
				
			||||
		this._accountsButton = document.querySelector("#users-button") | 
				
			||||
		this._defaultUser = null | 
				
			||||
		this._usersObject = null | 
				
			||||
		this._init() | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	getDefaultUserName() { | 
				
			||||
		return this._defaultUser.username | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setAccountDefault() { | 
				
			||||
		let input = this._userWrapper.querySelector("input") | 
				
			||||
		if (this._defaultUser.username != "") { | 
				
			||||
			//input.classList.add("hide")
 | 
				
			||||
			input.value = this._defaultUser.username | 
				
			||||
		} else { | 
				
			||||
			input.value = "" | 
				
			||||
		} | 
				
			||||
		if (this._usersObject.length > 0) { | 
				
			||||
			this._accountsButton.classList.remove("hide") | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_updateOnStartup() { | 
				
			||||
		var username = "" | 
				
			||||
		if (this._usersObject.length > 0) { | 
				
			||||
			username = this._localStorage.getItem("defaultUser") || this._usersObject[0].username | 
				
			||||
		} | 
				
			||||
		var user = this._usersObject.find((val) => {return val.username === username}) | 
				
			||||
		if (user === undefined) { | 
				
			||||
			this._defaultUser = {username: "", display_name: ""} | 
				
			||||
		} else { | 
				
			||||
			this._defaultUser = user | 
				
			||||
		} | 
				
			||||
		this._setAccountDefault() | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setAccountList() { | 
				
			||||
		var dropdown = this._accountsList.querySelector(".dropdown") | 
				
			||||
		dropdown.innerHTML = "" | 
				
			||||
 | 
				
			||||
		for (let i = 0; i < this._usersObject.length; i++) { | 
				
			||||
			var name = this._usersObject[i].display_name | 
				
			||||
			var li = document.createElement("li") | 
				
			||||
			var button = document.createElement("button") | 
				
			||||
			button.type = "button" | 
				
			||||
			button.innerText = name | 
				
			||||
			button.addEventListener("click", () => { | 
				
			||||
				this._updateDefaults(this._usersObject[i]) | 
				
			||||
				this._setAccountDefault() | 
				
			||||
				//authenticate.startAuthentication()
 | 
				
			||||
			}) | 
				
			||||
 | 
				
			||||
			li.appendChild(button) | 
				
			||||
			dropdown.appendChild(li) | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setButton() { | 
				
			||||
		var dropdown = this._accountsList.querySelector(".dropdown") | 
				
			||||
		document.querySelector("#screen").addEventListener("click", (ev) => { | 
				
			||||
			if (ev.target == this._accountsButton || ev.target.parentElement == this._accountsButton) { | 
				
			||||
				dropdown.classList.toggle("hide") | 
				
			||||
			} else | 
				
			||||
			if (ev.target != this._accountsList && ev.target.closest(".dropdown") == null) { | 
				
			||||
				dropdown.classList.add("hide") | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_updateDefaults(userObject) { | 
				
			||||
		if (!userObject) return | 
				
			||||
		this._defaultUser = userObject | 
				
			||||
 | 
				
			||||
		this._localStorage.setItem("defaultUser", this._defaultUser.username) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_init() { | 
				
			||||
		this._usersObject = lightdm.users | 
				
			||||
		this._updateOnStartup() | 
				
			||||
		this._setAccountList() | 
				
			||||
		this._setButton() | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,112 @@
					 | 
				
			||||
class Authenticate { | 
				
			||||
	constructor() { | 
				
			||||
		this._form = document.querySelector("#login-form") | 
				
			||||
		this._username = "" | 
				
			||||
		this._password = "" | 
				
			||||
		this._init() | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setForm() { | 
				
			||||
		this._form.addEventListener("submit", (ev) => { | 
				
			||||
			ev.preventDefault() | 
				
			||||
			var inputs = this._form.querySelectorAll("input") | 
				
			||||
			var data = getArrayForm(inputs) | 
				
			||||
			if (!data) return false | 
				
			||||
			this._username = data.username | 
				
			||||
			this._password = data.password | 
				
			||||
			this._respond() | 
				
			||||
		}) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_respond() { | 
				
			||||
		let inputUser = document.querySelector("#input-username") | 
				
			||||
		let inputPass = document.querySelector("#input-password") | 
				
			||||
		inputUser.blur(); inputUser.disabled = true; | 
				
			||||
		inputPass.blur(); inputPass.disabled = true; | 
				
			||||
 | 
				
			||||
		lightdm.cancel_authentication() | 
				
			||||
		lightdm.authenticate(String(this._username)) | 
				
			||||
		lightdm.respond(this._password) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_showMessage(msg) { | 
				
			||||
		let message = document.querySelector("#auth-message") | 
				
			||||
		message.innerText = msg | 
				
			||||
		message.classList.remove("hide") | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_hideMessage() { | 
				
			||||
		let message = document.querySelector("#auth-message") | 
				
			||||
		message.classList.add("hide") | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	async _authentication_done() { | 
				
			||||
		let body = document.querySelector("body") | 
				
			||||
		body.classList.add("success") | 
				
			||||
 | 
				
			||||
		this._showMessage("Welcome!") | 
				
			||||
 | 
				
			||||
		let form = document.querySelector("#pass-form") | 
				
			||||
		let topbar = document.querySelector("#top-bar") | 
				
			||||
		let bottombar = document.querySelector("#bottom-bar") | 
				
			||||
		form.style.transition = "0ms" | 
				
			||||
		form.classList.add("hide") | 
				
			||||
		topbar.classList.add("hide") | 
				
			||||
		bottombar.classList.add("hide") | 
				
			||||
 | 
				
			||||
		await wait(1000) | 
				
			||||
		let defSession = String(sessions.getDefaultSession()) | 
				
			||||
		document.querySelector("body").style.opacity = 0 | 
				
			||||
 | 
				
			||||
		await wait(1000) | 
				
			||||
		console.log("Session started with", defSession) | 
				
			||||
		lightdm.start_session(defSession) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	async _authentication_failed() { | 
				
			||||
		lightdm.cancel_authentication() | 
				
			||||
		let body = document.querySelector("body") | 
				
			||||
		body.classList.add("failed") | 
				
			||||
 | 
				
			||||
		this._showMessage("Try again") | 
				
			||||
 | 
				
			||||
		let form = document.querySelector("#pass-form") | 
				
			||||
		let topbar = document.querySelector("#top-bar") | 
				
			||||
		let bottombar = document.querySelector("#bottom-bar") | 
				
			||||
		form.style.transition = "0ms" | 
				
			||||
		form.classList.add("hide") | 
				
			||||
		topbar.classList.add("hide") | 
				
			||||
		bottombar.classList.add("hide") | 
				
			||||
 | 
				
			||||
		await wait(1500) | 
				
			||||
 | 
				
			||||
		this._hideMessage() | 
				
			||||
		form.style.transition = "" | 
				
			||||
		form.classList.remove("hide") | 
				
			||||
		topbar.classList.remove("hide") | 
				
			||||
		bottombar.classList.remove("hide") | 
				
			||||
 | 
				
			||||
		let inputUser = document.querySelector("#input-username") | 
				
			||||
		let inputPass = document.querySelector("#input-password") | 
				
			||||
		inputUser.blur(); inputUser.disabled = false; | 
				
			||||
		inputPass.blur(); inputPass.disabled = false; | 
				
			||||
		inputPass.value = "" | 
				
			||||
 | 
				
			||||
		body.classList.remove("failed") | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setAuthentication_done() { | 
				
			||||
		window.authentication_done = () => { | 
				
			||||
			if (lightdm.is_authenticated) { | 
				
			||||
				this._authentication_done() | 
				
			||||
			} else { | 
				
			||||
				this._authentication_failed() | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_init() { | 
				
			||||
		this._setForm() | 
				
			||||
		this._setAuthentication_done() | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,155 @@
					 | 
				
			||||
class Debug { | 
				
			||||
  constructor() { | 
				
			||||
    this._debugPass = "tepes" | 
				
			||||
    this._init() | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  _init() { | 
				
			||||
    console.log("DEBUG") | 
				
			||||
 | 
				
			||||
		if (!window.greeter_config) { | 
				
			||||
			window.greeter_config = { | 
				
			||||
				greeter: { | 
				
			||||
					debug_mode: true, | 
				
			||||
				}, | 
				
			||||
				branding: { | 
				
			||||
					background_images_dir: "", | 
				
			||||
				} | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		if (!window.theme_utils) { | 
				
			||||
			window.theme_utils = {} | 
				
			||||
			window.theme_utils.dirlist = function(path, mode, callback) { | 
				
			||||
				var result = [] | 
				
			||||
				callback(result) | 
				
			||||
			}; | 
				
			||||
			window.theme_utils.bind_this = function(context) {return context} | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
    if (!window.lightdm) { | 
				
			||||
      window.lightdm =  {} | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    var local_lightdm = { | 
				
			||||
      default_password: "tepes", | 
				
			||||
      is_authenticated: false, | 
				
			||||
      authentication_user: null, | 
				
			||||
      default_session: "awesome", | 
				
			||||
      can_suspend: true, | 
				
			||||
      can_hibernate: true, | 
				
			||||
      can_shutdown: true, | 
				
			||||
      can_restart: true, | 
				
			||||
      can_access_battery: true, | 
				
			||||
      can_access_brightness: true, | 
				
			||||
      sessions: [ | 
				
			||||
        { | 
				
			||||
          name: "awesome wm", | 
				
			||||
          key: "awesome" | 
				
			||||
        }, | 
				
			||||
        { | 
				
			||||
          name: "Ubuntu", | 
				
			||||
          key: "ubuntu" | 
				
			||||
        }, | 
				
			||||
        { | 
				
			||||
          name: "i3wm", | 
				
			||||
          key: "i3" | 
				
			||||
        }, | 
				
			||||
        { | 
				
			||||
          name: "bspwm", | 
				
			||||
          key: "bspwm" | 
				
			||||
        } | 
				
			||||
      ], | 
				
			||||
      users: [ | 
				
			||||
        { | 
				
			||||
          display_name: "Vlad Tepes", | 
				
			||||
          username: "dracula", | 
				
			||||
          image: "" | 
				
			||||
        }, | 
				
			||||
        { | 
				
			||||
          display_name: "Trevor Belmont", | 
				
			||||
          username: "treffy", | 
				
			||||
          image: "" | 
				
			||||
        }, | 
				
			||||
        { | 
				
			||||
          display_name: "Sypha Belnades", | 
				
			||||
          username: "speaker", | 
				
			||||
          image: "" | 
				
			||||
        } | 
				
			||||
      ], | 
				
			||||
      languages: [ | 
				
			||||
        { | 
				
			||||
          name: 'American English', | 
				
			||||
          code: 'en_US.utf8' | 
				
			||||
        } | 
				
			||||
      ], | 
				
			||||
      language: 'American English', | 
				
			||||
      authenticate: username => { | 
				
			||||
        console.log(`Starting authentication with user: "${username}"`) | 
				
			||||
      }, | 
				
			||||
      cancel_authentication: () => { | 
				
			||||
        console.log(`Authentication cancelled`) | 
				
			||||
      }, | 
				
			||||
      respond: async (password) => { | 
				
			||||
        console.log(`Password provided: "${password}"`) | 
				
			||||
        if (password == this._debugPass) { | 
				
			||||
          lightdm.is_authenticated = true | 
				
			||||
        } else { | 
				
			||||
          await wait(2000) | 
				
			||||
        } | 
				
			||||
        authentication_done() | 
				
			||||
      }, | 
				
			||||
      start_session: session => { | 
				
			||||
        alert(`Logged with session: "${session}"`) | 
				
			||||
        location.reload() | 
				
			||||
      }, | 
				
			||||
      shutdown: () => { | 
				
			||||
        console.log("System is shutting down...") | 
				
			||||
        setTimeout(() => location.reload(), 2000) | 
				
			||||
      }, | 
				
			||||
      restart: () => { | 
				
			||||
        console.log("System is rebooting...") | 
				
			||||
        setTimeout(() => location.reload(), 2000) | 
				
			||||
      }, | 
				
			||||
      hibernate: () => { | 
				
			||||
        console.log("System is hibernating") | 
				
			||||
        setTimeout(() => location.reload(), 2000) | 
				
			||||
      }, | 
				
			||||
      suspend: () => { | 
				
			||||
        console.log("System is suspending") | 
				
			||||
        setTimeout(() => location.reload(), 2000) | 
				
			||||
      }, | 
				
			||||
      batteryData: { | 
				
			||||
        name: "Battery 0", | 
				
			||||
        level: 85, | 
				
			||||
        state: "Discharging" | 
				
			||||
      }, | 
				
			||||
      batteryUpdate: () => { | 
				
			||||
        console.log("Battery updated") | 
				
			||||
      }, | 
				
			||||
      brightness: 50, | 
				
			||||
      brightnessSet: (quantity) => { | 
				
			||||
        lightdm.brightness = quantity | 
				
			||||
      }, | 
				
			||||
      brightnessIncrease: (quantity) => { | 
				
			||||
        lightdm.brightness += quantity | 
				
			||||
        if (lightdm.brightness > 100) lightdm.brightness = 100 | 
				
			||||
      }, | 
				
			||||
      brightnessDecrease: (quantity) => { | 
				
			||||
        lightdm.brightness -= quantity | 
				
			||||
        if (lightdm.brightness < 0) lightdm.brightness = 0 | 
				
			||||
      } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    if (lightdm.mock == undefined) { | 
				
			||||
      window.lightdm = {} | 
				
			||||
      Object.assign(window.lightdm, local_lightdm) | 
				
			||||
    } else { | 
				
			||||
      Object.keys(local_lightdm).forEach((key) => { | 
				
			||||
        var realKey = `_${key}` | 
				
			||||
        lightdm[realKey] = local_lightdm[key] | 
				
			||||
      }) | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,130 @@
					 | 
				
			||||
 | 
				
			||||
function getArrayForm(inputs) { | 
				
			||||
	if (!inputs) return false | 
				
			||||
	var data = {} | 
				
			||||
	inputs.forEach((x) => { | 
				
			||||
		data[x.name] = x.value | 
				
			||||
	}) | 
				
			||||
	return data | 
				
			||||
} | 
				
			||||
 | 
				
			||||
async function wait(ms) { | 
				
			||||
  return new Promise( resolve => { | 
				
			||||
    setTimeout(() => { | 
				
			||||
      resolve() | 
				
			||||
    }, ms) | 
				
			||||
  }) | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
async function initGreeter() { | 
				
			||||
 | 
				
			||||
  if (greeter_config.greeter.debug_mode) { | 
				
			||||
    debug = new Debug() | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  lightdm.authentication_complete?.connect(() => authentication_done()) | 
				
			||||
 | 
				
			||||
  lightdm.brightness_update?.connect(() => brightness._updateData()) | 
				
			||||
 | 
				
			||||
  accounts = new Accounts() | 
				
			||||
 | 
				
			||||
  sessions = new Sessions() | 
				
			||||
 | 
				
			||||
  authenticate = new Authenticate() | 
				
			||||
 | 
				
			||||
  sidebar = new Sidebar() | 
				
			||||
 | 
				
			||||
  //power = new Power()
 | 
				
			||||
 | 
				
			||||
  //battery = new Battery()
 | 
				
			||||
 | 
				
			||||
  //brightness = new Brightness()
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
 | 
				
			||||
window.addEventListener("GreeterReady", initGreeter) | 
				
			||||
 | 
				
			||||
//const panel_button = document.querySelector("#panel-button")
 | 
				
			||||
//const close_panel_button = document.querySelector("#close-panel-button")
 | 
				
			||||
const panel = document.querySelector(".panel") | 
				
			||||
const screen = document.querySelector("#screen") | 
				
			||||
 | 
				
			||||
const sessions_button = document.querySelector("#sessions-button") | 
				
			||||
const sessions_dropdown = document.querySelector("#sessions-dropdown") | 
				
			||||
 | 
				
			||||
const time_date_button = document.querySelector("#time-date") | 
				
			||||
const pass_form = document.querySelector("#pass-form") | 
				
			||||
 | 
				
			||||
//screen.addEventListener("click", (ev) => {
 | 
				
			||||
  //if (ev.target == panel_button || ev.target.parentElement == panel_button) {
 | 
				
			||||
    //panel.classList.toggle("hide")
 | 
				
			||||
    //panel_button.blur()
 | 
				
			||||
    //wait(100).then(() => {close_panel_button.focus()})
 | 
				
			||||
  //} else
 | 
				
			||||
  //if (ev.target != panel && ev.target.closest(".panel") == null) {
 | 
				
			||||
    //panel.classList.add("hide")
 | 
				
			||||
  //}
 | 
				
			||||
 | 
				
			||||
  //if (ev.target == close_panel_button || ev.target.parentElement == close_panel_button) {
 | 
				
			||||
    //panel.classList.toggle("hide")
 | 
				
			||||
    //panel_button.focus()
 | 
				
			||||
  //}
 | 
				
			||||
 | 
				
			||||
  //if (ev.target == sessions_button || ev.target.parentElement == sessions_button) {
 | 
				
			||||
    //sessions_dropdown.classList.toggle("hide")
 | 
				
			||||
  //} else
 | 
				
			||||
  //if (ev.target != sessions_dropdown && ev.target.closest(".dropdown") == null) {
 | 
				
			||||
    //sessions_dropdown.classList.add("hide")
 | 
				
			||||
  //}
 | 
				
			||||
//})
 | 
				
			||||
 | 
				
			||||
async function toggleTimeDate() { | 
				
			||||
  time_date_button.blur() | 
				
			||||
  pass_form.blur() | 
				
			||||
  if (time_date_button.classList.contains("hide")) { | 
				
			||||
    pass_form.classList.add("hide") | 
				
			||||
    await wait(300) | 
				
			||||
    time_date_button.classList.remove("hide") | 
				
			||||
    await wait(100) | 
				
			||||
    time_date_button.focus() | 
				
			||||
  } else { | 
				
			||||
    time_date_button.classList.add("hide") | 
				
			||||
    await wait(300) | 
				
			||||
    pass_form.classList.remove("hide") | 
				
			||||
  } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
time_date_button.addEventListener("click", async (ev) => { | 
				
			||||
  toggleTimeDate() | 
				
			||||
}) | 
				
			||||
 | 
				
			||||
pass_form.addEventListener("keydown", (ev) => { | 
				
			||||
  if (ev.keyCode == 27) { | 
				
			||||
    toggleTimeDate() | 
				
			||||
  } | 
				
			||||
}) | 
				
			||||
 | 
				
			||||
//sessions_dropdown.addEventListener("keydown", (ev) => {
 | 
				
			||||
  //if (ev.keyCode == 27) {
 | 
				
			||||
    //sessions_dropdown.classList.toggle("hide")
 | 
				
			||||
    //sessions_button.focus()
 | 
				
			||||
  //}
 | 
				
			||||
//})
 | 
				
			||||
 | 
				
			||||
//panel.addEventListener("keydown", (ev) => {
 | 
				
			||||
  //if (ev.keyCode == 27) {
 | 
				
			||||
    //panel.classList.toggle("hide")
 | 
				
			||||
    //panel_button.focus()
 | 
				
			||||
  //}
 | 
				
			||||
//})
 | 
				
			||||
 | 
				
			||||
//const time_label = document.querySelector("#time-label")
 | 
				
			||||
//const date_label = document.querySelector("#date-label")
 | 
				
			||||
 | 
				
			||||
//function updateTimeDate() {
 | 
				
			||||
  //time_label.innerText = theme_utils.get_current_localized_time()
 | 
				
			||||
  //date_label.innerText = theme_utils.get_current_localized_date()
 | 
				
			||||
//}
 | 
				
			||||
 | 
				
			||||
//setInterval(updateTimeDate, 1000)
 | 
				
			||||
@ -0,0 +1,91 @@
					 | 
				
			||||
class Sessions { | 
				
			||||
	constructor() { | 
				
			||||
		this._localStorage = window.localStorage | 
				
			||||
		this._sessionsButton = document.querySelector("#sessions-button") | 
				
			||||
		this._sessionList = document.querySelector("#sessions-dropdown") | 
				
			||||
		this._sessionLabel = document.querySelector("#sessions-button > .text") | 
				
			||||
		this._defaultSession = null | 
				
			||||
		this._sessionsObject = null | 
				
			||||
		this._init() | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
  getDefaultSession() { | 
				
			||||
    return this._defaultSession.key | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
	_setSessionDefault() { | 
				
			||||
		this._sessionLabel.innerText = this._defaultSession.name | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_updateOnStartup() { | 
				
			||||
		var key = this._localStorage.getItem("defaultSession") || this._sessionsObject[0].key || lightdm.default_session | 
				
			||||
 | 
				
			||||
		var session = this._sessionsObject.find((val) => {return val.key === key}) | 
				
			||||
		if (session === undefined) { | 
				
			||||
			// This should never happen
 | 
				
			||||
			this._defaultSession = {key: "awesome", name: "Awesome WM"} | 
				
			||||
		} else { | 
				
			||||
			this._defaultSession = session | 
				
			||||
		} | 
				
			||||
		this._setSessionDefault() | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_updateDefaults(sessionObj) { | 
				
			||||
		if (!sessionObj) return | 
				
			||||
		this._defaultSession = sessionObj | 
				
			||||
		this._localStorage.setItem("defaultSession", this._defaultSession.key) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setSessionList() { | 
				
			||||
		var dropdown = this._sessionList | 
				
			||||
		dropdown.innerHTML = "" | 
				
			||||
		for (let i = 0; i < this._sessionsObject.length; i++) { | 
				
			||||
			var name = this._sessionsObject[i].name | 
				
			||||
			var li = document.createElement("li") | 
				
			||||
			var button = document.createElement("button") | 
				
			||||
			button.innerText = name | 
				
			||||
			button.addEventListener("click", () => { | 
				
			||||
				this._updateDefaults(this._sessionsObject[i]) | 
				
			||||
				this._setSessionDefault() | 
				
			||||
			}) | 
				
			||||
 | 
				
			||||
			li.appendChild(button) | 
				
			||||
			dropdown.appendChild(li) | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setKeydown() { | 
				
			||||
		var dropdown = this._sessionList | 
				
			||||
		dropdown.addEventListener("keydown", (ev) => { | 
				
			||||
			if (ev.keyCode == 27) { | 
				
			||||
				sessions_dropdown.classList.add("hide") | 
				
			||||
				this._sessionsButton.focus() | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setButton() { | 
				
			||||
		var dropdown = this._sessionList | 
				
			||||
		document.querySelector("#screen").addEventListener("click", (ev) => { | 
				
			||||
			if (ev.target == this._sessionsButton || ev.target.parentElement == this._sessionsButton) { | 
				
			||||
				dropdown.classList.toggle("hide") | 
				
			||||
			} else | 
				
			||||
			if (ev.target != this._sessionList && ev.target.closest(".dropdown") == null) { | 
				
			||||
				dropdown.classList.add("hide") | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
		document.querySelector("#screen").addEventListener("focusin", (ev) => { | 
				
			||||
			if (!dropdown.contains(document.activeElement) && document.activeElement != this._sessionsButton) { | 
				
			||||
				dropdown.classList.add("hide") | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_init() { | 
				
			||||
		this._sessionsObject = lightdm.sessions | 
				
			||||
		this._updateOnStartup() | 
				
			||||
		this._setSessionList() | 
				
			||||
		this._setButton() | 
				
			||||
		this._setKeydown() | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,65 @@
					 | 
				
			||||
class Sidebar { | 
				
			||||
	constructor() { | 
				
			||||
		this._sidebar = document.querySelector("#sidebar") | 
				
			||||
		this._sidebarButton = document.querySelector("#panel-button") | 
				
			||||
		this._closeButton = document.querySelector("#close-panel-button") | 
				
			||||
		this._visible = false | 
				
			||||
		this._init() | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	showSidebar() { | 
				
			||||
		this._sidebar.classList.remove("hide") | 
				
			||||
		wait(100).then(() => {this._closeButton.focus()}) | 
				
			||||
		this._visible = true | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	hideSidebar() { | 
				
			||||
		this._sidebar.classList.add("hide") | 
				
			||||
		this._sidebarButton.focus() | 
				
			||||
		this._visible = false | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	toggleSidebar() { | 
				
			||||
		if (this._visible) { | 
				
			||||
			this.hideSidebar() | 
				
			||||
		} else { | 
				
			||||
			this.showSidebar() | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setKeydown() { | 
				
			||||
		this._sidebar.addEventListener("keydown", (ev) => { | 
				
			||||
			if (ev.keyCode == 27) { | 
				
			||||
				this.hideSidebar() | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_setSidebar() { | 
				
			||||
		document.querySelector("#screen").addEventListener("click", (ev) => { | 
				
			||||
			if (ev.target == this._sidebarButton || ev.target.parentElement == this._sidebarButton) { | 
				
			||||
				this.toggleSidebar() | 
				
			||||
			} else | 
				
			||||
			if (ev.target != this._sidebar && ev.target.closest(".panel") == null) { | 
				
			||||
				this._sidebar.classList.add("hide") | 
				
			||||
				this._visible = false | 
				
			||||
			} | 
				
			||||
 | 
				
			||||
			if (ev.target == this._closeButton || ev.target.parentElement == this._closeButton) { | 
				
			||||
				this.hideSidebar() | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
 | 
				
			||||
		document.querySelector("#screen").addEventListener("focusin", (ev) => { | 
				
			||||
			if (!this._sidebar.contains(document.activeElement)) { | 
				
			||||
				this._sidebar.classList.add("hide") | 
				
			||||
				this._visible = false | 
				
			||||
			} | 
				
			||||
		}) | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	_init() { | 
				
			||||
		this._setSidebar() | 
				
			||||
		this._setKeydown() | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue