JezerM
4 years ago
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