Browse Source

Themes got prettier. Added eye password reveal

sisyphus
JezerM 4 years ago
parent
commit
f706acc369
No known key found for this signature in database
GPG Key ID: 66BBC5D01388C6B5
  1. 1
      themes/dracula/.prettierignore
  2. 3
      themes/dracula/README.md
  3. 107
      themes/dracula/css/style.css
  4. 277
      themes/dracula/index.html
  5. 163
      themes/dracula/js/accounts.js
  6. 235
      themes/dracula/js/authenticate.js
  7. 141
      themes/dracula/js/backgrounds.js
  8. 44
      themes/dracula/js/battery.js
  9. 24
      themes/dracula/js/brightness.js
  10. 137
      themes/dracula/js/debug.js
  11. 58
      themes/dracula/js/index.js
  12. 144
      themes/dracula/js/layouts.js
  13. 98
      themes/dracula/js/power.js
  14. 167
      themes/dracula/js/sessions.js
  15. 120
      themes/dracula/js/sidebar.js
  16. 98
      themes/dracula/js/time-date.js
  17. 3
      themes/gruvbox/README.md
  18. 60
      themes/gruvbox/css/style.css
  19. 208
      themes/gruvbox/index.html
  20. 157
      themes/gruvbox/js/accounts.js
  21. 101
      themes/gruvbox/js/authenticate.js
  22. 44
      themes/gruvbox/js/battery.js
  23. 25
      themes/gruvbox/js/brightness.js
  24. 137
      themes/gruvbox/js/debug.js
  25. 60
      themes/gruvbox/js/index.js
  26. 144
      themes/gruvbox/js/layouts.js
  27. 98
      themes/gruvbox/js/power.js
  28. 130
      themes/gruvbox/js/sessions.js
  29. 42
      themes/gruvbox/js/time-date.js

1
themes/dracula/.prettierignore vendored

@ -0,0 +1 @@
css/DRACULA

3
themes/dracula/README.md vendored

@ -1,6 +1,7 @@
# Web Greeter dracula theme # Web Greeter dracula theme
## Overview ## Overview
This is a web-greeter theme based on [dracula color scheme][dracula], included with [web-greeter][web-greeter]. This is a web-greeter theme based on [dracula color scheme][dracula], included with [web-greeter][web-greeter].
Based also on [glorious-theme][glorious] by manilarome. Based also on [glorious-theme][glorious] by manilarome.
@ -21,6 +22,7 @@ Based also on [glorious-theme][glorious] by manilarome.
</center> </center>
## Installation ## Installation
This theme is shipped with `web-greeter`. To use it, set the `theme` as `dracula` inside `/etc/lightdm/web-greeter.yml` This theme is shipped with `web-greeter`. To use it, set the `theme` as `dracula` inside `/etc/lightdm/web-greeter.yml`
## Credits ## Credits
@ -30,6 +32,7 @@ Dracula theme wallpaper found [here](https://draculatheme.com/wallpaper)
Window blurred background image by [Riley Briggs](https://unsplash.com/photos/cSe3oKQ03OQ) on [Unsplash](https://unsplash.com/) Window blurred background image by [Riley Briggs](https://unsplash.com/photos/cSe3oKQ03OQ) on [Unsplash](https://unsplash.com/)
## TODO ## TODO
- Battery and brightness support - Battery and brightness support
- Lock indicator - Lock indicator
- Translations support - Translations support

107
themes/dracula/css/style.css vendored

@ -1,24 +1,23 @@
:root { :root {
--bg0: #282a36;
--bg0: #282A36; --bg1: #44475a;
--bg1: #44475A; --bg2: #585c74;
--bg2: #585C74;
--bg3: #666e99; --bg3: #666e99;
--alt0: #6272A4; --alt0: #6272a4;
--alt1: #7A88B3; --alt1: #7a88b3;
--fg0: #F8F8F2; --fg0: #f8f8f2;
--fg1: #EAEAE0; --fg1: #eaeae0;
--fg2: #DEDED2; --fg2: #deded2;
--cyan: #8BE9fD; --cyan: #8be9fd;
--green: #50FA7B; --green: #50fa7b;
--orange: #FFb86C; --orange: #ffb86c;
--pink: #FF79C6; --pink: #ff79c6;
--purple: #BD93F9; --purple: #bd93f9;
--red: #FF5555; --red: #ff5555;
--yellow: #F1FA8C; --yellow: #f1fa8c;
--animation-duration: 300ms; --animation-duration: 300ms;
@ -29,7 +28,7 @@
@media screen and (min-width: 3000px) and (min-height: 1200px) { @media screen and (min-width: 3000px) and (min-height: 1200px) {
#screen { #screen {
zoom: 2.0; zoom: 2;
} }
} }
@ -37,7 +36,7 @@
html { html {
color: var(--fg0); color: var(--fg0);
background-color: black; background-color: black;
font-family: system-ui; font-family: system-ui;
min-height: 100%; min-height: 100%;
@ -76,7 +75,7 @@ body {
background-color: var(--fg2); background-color: var(--fg2);
} }
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background-color: var(--fg0); background-color: var(--fg0);
} }
/* Background */ /* Background */
@ -122,7 +121,7 @@ body {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background-color: #282A36aa; background-color: #282a36aa;
backdrop-filter: blur(5px); backdrop-filter: blur(5px);
} }
#cover > #message { #cover > #message {
@ -146,7 +145,7 @@ body {
transition: var(--animation-duration); transition: var(--animation-duration);
} }
/*#login-wrapper:hover, #login-wrapper:focus, #login-wrapper:focus-within {*/ /*#login-wrapper:hover, #login-wrapper:focus, #login-wrapper:focus-within {*/
/*filter: drop-shadow(2px 4px 6px black);*/ /*filter: drop-shadow(2px 4px 6px black);*/
/*}*/ /*}*/
body.success #login-wrapper { body.success #login-wrapper {
background-color: #79d28f; background-color: #79d28f;
@ -182,10 +181,15 @@ input {
font-size: inherit; font-size: inherit;
font-family: inherit; font-family: inherit;
} }
input:focus, input:focus-visible { input:focus,
input:focus-visible {
border: 0; border: 0;
outline: auto var(--fg0); outline: auto var(--fg0);
} }
input::-ms-reveal,
input::-ms-clear {
display: none;
}
:focus { :focus {
outline: auto var(--fg0) !important; outline: auto var(--fg0) !important;
} }
@ -202,6 +206,23 @@ input:focus, input:focus-visible {
box-sizing: border-box; box-sizing: border-box;
margin: 0; margin: 0;
} }
#input {
position: relative;
}
#input #pass-eye {
position: absolute;
right: 15px;
top: 0;
bottom: 0;
margin-top: auto;
margin-bottom: auto;
height: fit-content;
background-color: var(--bg2);
}
#input #pass-eye:hover,
#input #pass-eye:focus {
background-color: var(--bg3);
}
#input-username { #input-username {
box-sizing: border-box; box-sizing: border-box;
@ -230,7 +251,8 @@ input:focus, input:focus-visible {
#submit-button { #submit-button {
background-color: #72bece; background-color: #72bece;
} }
#submit-button:hover, #submit-button:focus { #submit-button:hover,
#submit-button:focus {
background-color: var(--purple); background-color: var(--purple);
} }
@ -243,7 +265,8 @@ input:focus, input:focus-visible {
background-color: var(--orange); background-color: var(--orange);
height: 100%; height: 100%;
} }
#users-button:hover, #users-button:focus { #users-button:hover,
#users-button:focus {
background-color: var(--red); background-color: var(--red);
} }
@ -256,7 +279,8 @@ input:focus, input:focus-visible {
right: 0; right: 0;
z-index: 2; z-index: 2;
} }
#users-dropdown .dropdown button:hover, #users-dropdown .dropdown button:focus { #users-dropdown .dropdown button:hover,
#users-dropdown .dropdown button:focus {
background-color: var(--orange); background-color: var(--orange);
} }
@ -273,7 +297,8 @@ input:focus, input:focus-visible {
cursor: pointer; cursor: pointer;
} }
#time-date:hover, #time-date:focus { #time-date:hover,
#time-date:focus {
filter: drop-shadow(2px 2px 6px black); filter: drop-shadow(2px 2px 6px black);
/*animation-name: shake;*/ /*animation-name: shake;*/
animation-duration: 1s; animation-duration: 1s;
@ -281,7 +306,8 @@ input:focus, input:focus-visible {
animation-iteration-count: 1; animation-iteration-count: 1;
animation-timing-function: ease-in-out; animation-timing-function: ease-in-out;
} }
#time-date:hover *, #time-date:focus * { #time-date:hover *,
#time-date:focus * {
/*color: var(--cyan);*/ /*color: var(--cyan);*/
} }
#time-date.hide { #time-date.hide {
@ -328,7 +354,8 @@ button {
padding: 0.5em 0.8em; padding: 0.5em 0.8em;
transition: inherit; transition: inherit;
} }
.button-group > *:hover, .button-group > *:focus { .button-group > *:hover,
.button-group > *:focus {
background-color: var(--orange); background-color: var(--orange);
} }
@ -377,7 +404,8 @@ button {
margin-left: 0.3em; margin-left: 0.3em;
} }
#sessions-button:hover, #sessions-button:focus { #sessions-button:hover,
#sessions-button:focus {
background-color: var(--purple); background-color: var(--purple);
} }
@ -406,7 +434,8 @@ button {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
#bottom-bar.hide, #top-bar.hide { #bottom-bar.hide,
#top-bar.hide {
min-height: 0; min-height: 0;
max-height: 0; max-height: 0;
max-width: initial; max-width: initial;
@ -427,7 +456,8 @@ button {
background-color: var(--bg1); background-color: var(--bg1);
} }
#panel-button:hover, #panel-button:focus { #panel-button:hover,
#panel-button:focus {
background-color: var(--green); background-color: var(--green);
} }
@ -489,10 +519,12 @@ button {
object-fit: cover; object-fit: cover;
filter: brightness(0.8); filter: brightness(0.8);
} }
#background-selector .image:hover, #background-selector .image:focus { #background-selector .image:hover,
#background-selector .image:focus {
filter: drop-shadow(2px 2px 6px black); filter: drop-shadow(2px 2px 6px black);
} }
#background-selector .image:hover > img, #background-selector .image:focus > img { #background-selector .image:hover > img,
#background-selector .image:focus > img {
filter: brightness(1); filter: brightness(1);
} }
@ -509,7 +541,8 @@ button {
height: fit-content; height: fit-content;
align-self: center; align-self: center;
} }
#close-panel-button:hover, #close-panel-button:focus { #close-panel-button:hover,
#close-panel-button:focus {
background-color: var(--red); background-color: var(--red);
} }
@ -531,7 +564,8 @@ button {
width: -webkit-fill-available; width: -webkit-fill-available;
cursor: pointer; cursor: pointer;
} }
.dropdown button:hover, .dropdown button:focus { .dropdown button:hover,
.dropdown button:focus {
background-color: var(--purple); background-color: var(--purple);
} }
@ -570,7 +604,8 @@ button {
backdrop-filter: blur(20px); backdrop-filter: blur(20px);
border-radius: 2px; border-radius: 2px;
} }
#system-bar > *:hover, #system-bar > *:focus { #system-bar > *:hover,
#system-bar > *:focus {
background-color: #2828280e; background-color: #2828280e;
backdrop-filter: blur(50px); backdrop-filter: blur(50px);
} }

277
themes/dracula/index.html vendored

@ -1,156 +1,171 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <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"> <meta
<title>Dracula theme</title> name="viewport"
content="width=device-width, viewport-fit=cover, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
<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"> <title>Dracula theme</title>
<!--<script src="..//js/mock.js"></script>--> <link rel="stylesheet" href="css/style.css" class="style" />
<link
</head> rel="stylesheet"
<body> href="../../_vendor/material-icons/css/materialdesignicons.min.css"
onerror="this.href='../_vendor/material-icons/css/materialdesignicons.min.css'"
<div id="background"> class="style"
<div id="bg-cover"></div> />
</div>
<!--<script src="..//js/mock.js"></script>-->
<button id="cover" class="hide"> </head>
<div id="message"></div> <body>
</button> <div id="background">
<div id="bg-cover"></div>
<div id="screen"> </div>
<div id="login-wrapper">
<div id="top-bar">
Welcome!
</div>
<div id="login-wrapper-box"> <button id="cover" class="hide">
<button id="time-date"> <div id="message"></div>
<h2 id="time-label">20:00</h2> </button>
<h4 id="date-label">20-05-2021</h2>
</button>
<div id="auth-message" class="hide"></div> <div id="screen">
<div id="login-wrapper">
<div id="top-bar">Welcome!</div>
<div id="pass-form" class="hide"> <div id="login-wrapper-box">
<form action="POST" id="login-form"> <button id="time-date">
<div id="user-wrapper"> <h2 id="time-label">20:00</h2>
<input id="input-username" name="username" type="text" autocomplete="off" autofocus="true" placeholder="Enter your username"> <h2 id="date-label">20-05-2021</h2>
</button>
<div id="users-button-wrapper"> <div id="auth-message" class="hide"></div>
<button id="users-button" class="button hide" type="button">
<span class="mdi mdi-chevron-down mdi-24px"></span> <div id="pass-form" class="hide">
</button> <form action="POST" id="login-form">
<div id="users-dropdown"> <div id="user-wrapper">
<ul class="dropdown hide"> <input
<li><button type="button">Vlad Tepes</button></li> id="input-username"
<li><button type="button">Belmont</button></li> name="username"
</ul> 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> </div>
</div> <div id="pass-wrapper">
<div id="input">
<div id="pass-wrapper"> <input
<input id="input-password" name="password" type="password" autocomplete="off" autofocus="true" placeholder="Enter your password"> id="input-password"
<button id="submit-button" class="button" type="submit"> name="password"
<span class="mdi mdi-chevron-right mdi-24px"></span> type="password"
</button> autocomplete="off"
</div> autofocus="true"
placeholder="Enter your password"
</form> />
<button id="pass-eye" type="button" class="button">
<i class="mdi mdi-eye"></i>
</button>
</div>
<button id="submit-button" class="button" type="submit">
<span class="mdi mdi-chevron-right mdi-24px"></span>
</button>
</div>
</form>
</div>
</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" class="hide">
<span class="mdi mdi-power"></span>
</button>
<button id="restart-button" class="hide">
<span class="mdi mdi-restart"></span>
</button>
<button id="suspend-button" class="hide">
<span class="mdi mdi-power-sleep"></span>
</button>
<button id="hibernate-button" class="hide">
<span class="mdi mdi-power-cycle"></span>
</button>
</div>
</div>
</div> </div>
<div id="bottom-bar"> <div id="system-bar">
<div id="sessions-button-wrapper"> <div id="layouts-list">
<button id="sessions-button" class="button"> <button id="layouts-button" class="">LATAM</button>
<span class="text">Awesome</span> <span class="mdi mdi-chevron-down mdi-24px"></span> <ul id="layouts-dropdown" class="dropdown hide">
</button> <li><button>Latam</button></li>
<ul id="sessions-dropdown" class="dropdown hide"> <li><button>English</button></li>
<li><button>Awesome</button></li>
<li><button>Ubuntu</button></li>
</ul> </ul>
</div> </div>
<div id="bottom-right" class="button-group"> <div id="brightness-label"></div>
<button id="shutdown-button" class="hide"> <div id="battery-label"></div>
<span class="mdi mdi-power"></span> </div>
</button>
<button id="restart-button" class="hide"> <button id="panel-button" class="button">
<span class="mdi mdi-restart"></span> <span class="mdi mdi-menu mdi-24px"></span>
</button> </button>
<button id="suspend-button" class="hide"> <div id="sidebar" class="panel hide">
<span class="mdi mdi-power-sleep"></span> <h3>Background selector</h3>
</button> <button id="close-panel-button" class="button">
<span class="mdi mdi-close-thick mdi-24px"></span>
</button>
<button id="hibernate-button" class="hide"> <div id="background-selector">
<span class="mdi mdi-power-cycle"></span> <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> </button>
</div> </div>
</div>
</div>
<div id="system-bar">
<div id="layouts-list">
<button id="layouts-button" class="">
LATAM
</button>
<ul id="layouts-dropdown" class="dropdown hide">
<li><button>Latam</button></li>
<li><button>English</button></li>
</ul>
</div> </div>
<div id="brightness-label"></div>
<div id="battery-label"></div>
</div> </div>
<button id="panel-button" class="button"> <script src="js/debug.js"></script>
<span class="mdi mdi-menu mdi-24px"></span> <script src="js/accounts.js"></script>
</button> <script src="js/sessions.js"></script>
<script src="js/authenticate.js"></script>
<div id="sidebar" class="panel hide"> <script src="js/sidebar.js"></script>
<h3>Background selector</h3> <script src="js/backgrounds.js"></script>
<button id="close-panel-button" class="button"> <script src="js/time-date.js"></script>
<span class="mdi mdi-close-thick mdi-24px"></span> <script src="js/layouts.js"></script>
</button> <script src="js/power.js"></script>
<script src="js/battery.js"></script>
<div id="background-selector"> <script src="js/brightness.js"></script>
<button class="image" tabindex="0"> <script src="js/index.js"></script>
<img src="./assets/dracula.png" alt=""> </body>
</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>
</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/backgrounds.js"></script>
<script src="js/time-date.js"></script>
<script src="js/layouts.js"></script>
<script src="js/power.js"></script>
<script src="js/battery.js"></script>
<script src="js/brightness.js"></script>
<script src="js/index.js"></script>
</body>
</html> </html>

163
themes/dracula/js/accounts.js vendored

@ -1,89 +1,98 @@
class Accounts { class Accounts {
constructor() { constructor() {
this._localStorage = window.localStorage this._localStorage = window.localStorage;
this._userWrapper = document.querySelector("#user-wrapper") this._userWrapper = document.querySelector("#user-wrapper");
this._accountsList = document.querySelector("#users-dropdown") this._accountsList = document.querySelector("#users-dropdown");
this._accountsButton = document.querySelector("#users-button") this._accountsButton = document.querySelector("#users-button");
this._defaultUser = null this._defaultUser = null;
this._usersObject = null this._usersObject = null;
this._init() this._init();
} }
getDefaultUserName() { getDefaultUserName() {
return this._defaultUser.username return this._defaultUser.username;
} }
_setAccountDefault() { _setAccountDefault() {
let input = this._userWrapper.querySelector("input") let input = this._userWrapper.querySelector("input");
if (this._defaultUser.username != "") { if (this._defaultUser.username != "") {
//input.classList.add("hide") //input.classList.add("hide")
input.value = this._defaultUser.username input.value = this._defaultUser.username;
} else { } else {
input.value = "" input.value = "";
} }
if (this._usersObject.length > 0) { if (this._usersObject.length > 0) {
this._accountsButton.classList.remove("hide") this._accountsButton.classList.remove("hide");
} }
} }
_updateOnStartup() { _updateOnStartup() {
var username = "" var username = "";
if (this._usersObject.length > 0) { if (this._usersObject.length > 0) {
username = this._localStorage.getItem("defaultUser") || this._usersObject[0].username username =
} this._localStorage.getItem("defaultUser") ||
var user = this._usersObject.find((val) => {return val.username === username}) this._usersObject[0].username;
if (user === undefined) { }
this._defaultUser = {username: "", display_name: ""} var user = this._usersObject.find((val) => {
} else { return val.username === username;
this._defaultUser = user });
} if (user === undefined) {
this._setAccountDefault() this._defaultUser = { username: "", display_name: "" };
} } else {
this._defaultUser = user;
}
this._setAccountDefault();
}
_setAccountList() { _setAccountList() {
var dropdown = this._accountsList.querySelector(".dropdown") var dropdown = this._accountsList.querySelector(".dropdown");
dropdown.innerHTML = "" dropdown.innerHTML = "";
for (let i = 0; i < this._usersObject.length; i++) { for (let i = 0; i < this._usersObject.length; i++) {
var name = this._usersObject[i].display_name var name = this._usersObject[i].display_name;
var li = document.createElement("li") var li = document.createElement("li");
var button = document.createElement("button") var button = document.createElement("button");
button.type = "button" button.type = "button";
button.innerText = name button.innerText = name;
button.addEventListener("click", () => { button.addEventListener("click", () => {
this._updateDefaults(this._usersObject[i]) this._updateDefaults(this._usersObject[i]);
this._setAccountDefault() this._setAccountDefault();
//authenticate.startAuthentication() //authenticate.startAuthentication()
}) });
li.appendChild(button) li.appendChild(button);
dropdown.appendChild(li) dropdown.appendChild(li);
} }
} }
_setButton() { _setButton() {
var dropdown = this._accountsList.querySelector(".dropdown") var dropdown = this._accountsList.querySelector(".dropdown");
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._accountsButton || ev.target.parentElement == this._accountsButton) { if (
dropdown.classList.toggle("hide") ev.target == this._accountsButton ||
} else ev.target.parentElement == this._accountsButton
if (ev.target != this._accountsList && ev.target.closest(".dropdown") == null) { ) {
dropdown.classList.add("hide") dropdown.classList.toggle("hide");
} } else if (
}) ev.target != this._accountsList &&
} ev.target.closest(".dropdown") == null
) {
dropdown.classList.add("hide");
}
});
}
_updateDefaults(userObject) { _updateDefaults(userObject) {
if (!userObject) return if (!userObject) return;
this._defaultUser = userObject this._defaultUser = userObject;
this._localStorage.setItem("defaultUser", this._defaultUser.username) this._localStorage.setItem("defaultUser", this._defaultUser.username);
} }
_init() { _init() {
this._usersObject = lightdm.users this._usersObject = lightdm.users;
this._updateOnStartup() this._updateOnStartup();
this._setAccountList() this._setAccountList();
this._setButton() this._setButton();
} }
} }

235
themes/dracula/js/authenticate.js vendored

@ -1,113 +1,126 @@
class Authenticate { class Authenticate {
constructor() { constructor() {
this._form = document.querySelector("#login-form") this._form = document.querySelector("#login-form");
this._username = "" this._inputUser = document.querySelector("#input-username");
this._password = "" this._inputPass = document.querySelector("#input-password");
this._init() this._input_eye = document.querySelector("#pass-eye");
} this._username = "";
this._password = "";
_setForm() { this._init();
this._form.addEventListener("submit", (ev) => { }
ev.preventDefault()
var inputs = this._form.querySelectorAll("input") _setForm() {
var data = getArrayForm(inputs) this._form.addEventListener("submit", (ev) => {
if (!data) return false ev.preventDefault();
this._username = data.username var inputs = this._form.querySelectorAll("input");
this._password = data.password var data = getArrayForm(inputs);
this._respond() if (!data) return false;
}) this._username = data.username;
} this._password = data.password;
this._respond();
async _respond() { });
let inputUser = document.querySelector("#input-username") }
let inputPass = document.querySelector("#input-password") _setPasswordEye() {
inputUser.blur(); inputUser.disabled = true; this._input_eye.addEventListener("click", () => {
inputPass.blur(); inputPass.disabled = true; if (this._inputPass.type === "password") {
this._inputPass.type = "text";
lightdm.cancel_authentication() } else {
lightdm.authenticate(String(this._username)) this._inputPass.type = "password";
await wait(1000) }
lightdm.respond(this._password) });
} }
_showMessage(msg) { async _respond() {
let message = document.querySelector("#auth-message") this._inputUser.blur();
message.innerText = msg this._inputUser.disabled = true;
message.classList.remove("hide") this._inputPass.blur();
} this._inputPass.disabled = true;
_hideMessage() { lightdm.cancel_authentication();
let message = document.querySelector("#auth-message") lightdm.authenticate(String(this._username));
message.classList.add("hide") await wait(1000);
} lightdm.respond(this._password);
}
async _authentication_done() {
let body = document.querySelector("body") _showMessage(msg) {
body.classList.add("success") let message = document.querySelector("#auth-message");
message.innerText = msg;
this._showMessage("Welcome!") message.classList.remove("hide");
}
let form = document.querySelector("#pass-form")
let topbar = document.querySelector("#top-bar") _hideMessage() {
let bottombar = document.querySelector("#bottom-bar") let message = document.querySelector("#auth-message");
form.style.transition = "0ms" message.classList.add("hide");
form.classList.add("hide") }
topbar.classList.add("hide")
bottombar.classList.add("hide") async _authentication_done() {
let body = document.querySelector("body");
await wait(1000) body.classList.add("success");
let defSession = String(sessions.getDefaultSession())
document.querySelector("body").style.opacity = 0 this._showMessage("Welcome!");
await wait(1000) let form = document.querySelector("#pass-form");
console.log("Session started with", defSession) let topbar = document.querySelector("#top-bar");
lightdm.start_session(defSession) let bottombar = document.querySelector("#bottom-bar");
} form.style.transition = "0ms";
form.classList.add("hide");
async _authentication_failed() { topbar.classList.add("hide");
lightdm.cancel_authentication() bottombar.classList.add("hide");
let body = document.querySelector("body")
body.classList.add("failed") await wait(1000);
let defSession = String(sessions.getDefaultSession());
this._showMessage("Try again") document.querySelector("body").style.opacity = 0;
let form = document.querySelector("#pass-form") await wait(1000);
let topbar = document.querySelector("#top-bar") console.log("Session started with", defSession);
let bottombar = document.querySelector("#bottom-bar") lightdm.start_session(defSession);
form.style.transition = "0ms" }
form.classList.add("hide")
topbar.classList.add("hide") async _authentication_failed() {
bottombar.classList.add("hide") lightdm.cancel_authentication();
let body = document.querySelector("body");
await wait(1500) body.classList.add("failed");
this._hideMessage() this._showMessage("Try again");
form.style.transition = ""
form.classList.remove("hide") let form = document.querySelector("#pass-form");
topbar.classList.remove("hide") let topbar = document.querySelector("#top-bar");
bottombar.classList.remove("hide") let bottombar = document.querySelector("#bottom-bar");
form.style.transition = "0ms";
let inputUser = document.querySelector("#input-username") form.classList.add("hide");
let inputPass = document.querySelector("#input-password") topbar.classList.add("hide");
inputUser.blur(); inputUser.disabled = false; bottombar.classList.add("hide");
inputPass.blur(); inputPass.disabled = false;
inputPass.value = "" await wait(1500);
body.classList.remove("failed") this._hideMessage();
} form.style.transition = "";
form.classList.remove("hide");
_setAuthentication_done() { topbar.classList.remove("hide");
window.authentication_done = () => { bottombar.classList.remove("hide");
if (lightdm.is_authenticated) {
this._authentication_done() this._inputUser.blur();
} else { this._inputUser.disabled = false;
this._authentication_failed() this._inputPass.blur();
} this._inputPass.disabled = false;
} this._inputPass.value = "";
}
body.classList.remove("failed");
_init() { }
this._setForm()
this._setAuthentication_done() _setAuthentication_done() {
} window.authentication_done = () => {
if (lightdm.is_authenticated) {
this._authentication_done();
} else {
this._authentication_failed();
}
};
}
_init() {
this._setForm();
this._setAuthentication_done();
this._setPasswordEye();
}
} }

141
themes/dracula/js/backgrounds.js vendored

@ -1,74 +1,87 @@
class Backgrounds { class Backgrounds {
constructor() { constructor() {
this._localStorage = window.localStorage this._localStorage = window.localStorage;
this._defaultBackgroundArr = ["assets/dracula.png", "assets/window-blurred.png"] this._defaultBackgroundArr = [
this._sidebar = document.querySelector("#sidebar") "assets/dracula.png",
this._backgroundsList = document.querySelector("#background-selector") "assets/window-blurred.png",
this._background = document.querySelector("#background") ];
this._backgroundImages = null this._sidebar = document.querySelector("#sidebar");
this._backgroundImagesDir = null this._backgroundsList = document.querySelector("#background-selector");
this._backgroundPath = "" this._background = document.querySelector("#background");
} this._backgroundImages = null;
this._backgroundImagesDir = null;
this._backgroundPath = "";
}
_createImage(path) { _createImage(path) {
let image = document.createElement("img") let image = document.createElement("img");
let button = document.createElement("button") let button = document.createElement("button");
let imageName = path.replace(/^.*[\\\/]/, '') let imageName = path.replace(/^.*[\\\/]/, "");
button.classList.add("image") button.classList.add("image");
image.src = path image.src = path;
image.alt = imageName image.alt = imageName;
button.appendChild(image) button.appendChild(image);
return button return button;
} }
async _createBackgroundArray() { async _createBackgroundArray() {
let images = await this._getImages() let images = await this._getImages();
this._backgroundImages = this._defaultBackgroundArr.concat(images) this._backgroundImages = this._defaultBackgroundArr.concat(images);
this._setBackgroundImages() this._setBackgroundImages();
return new Promise((resolve) => resolve()) return new Promise((resolve) => resolve());
} }
_updateOnStartup() { _updateOnStartup() {
this._backgroundPath = this._localStorage.getItem("defaultBackgroundImage") || this._backgroundImages[0] this._backgroundPath =
this._updateBackgroundImages() this._localStorage.getItem("defaultBackgroundImage") ||
} this._backgroundImages[0];
this._updateBackgroundImages();
}
_updateBackgroundImages() { _updateBackgroundImages() {
let img = this._background.querySelector("img") let img = this._background.querySelector("img");
if (!img) { if (!img) {
img = document.createElement("img") img = document.createElement("img");
this._background.appendChild(img) this._background.appendChild(img);
} }
img.src = this._backgroundPath img.src = this._backgroundPath;
this._localStorage.setItem("defaultBackgroundImage", String(this._backgroundPath)) this._localStorage.setItem(
} "defaultBackgroundImage",
String(this._backgroundPath)
);
}
_setBackgroundImages() { _setBackgroundImages() {
this._backgroundsList.innerHTML = "" this._backgroundsList.innerHTML = "";
for (let i = 0; i < this._backgroundImages.length; i++) { for (let i = 0; i < this._backgroundImages.length; i++) {
const path = this._backgroundImages[i] const path = this._backgroundImages[i];
let button = this._createImage(path) let button = this._createImage(path);
button.addEventListener("click", () => { button.addEventListener("click", () => {
this._backgroundPath = path this._backgroundPath = path;
this._updateBackgroundImages() this._updateBackgroundImages();
}) });
this._backgroundsList.appendChild(button) this._backgroundsList.appendChild(button);
} }
} }
_getImages(path) { _getImages(path) {
this._backgroundImagesDir = greeter_config.branding.background_images_dir || '/usr/share/backgrounds' this._backgroundImagesDir =
return new Promise( (resolve) => { greeter_config.branding.background_images_dir || "/usr/share/backgrounds";
theme_utils.dirlist(path ? path : this._backgroundImagesDir, true, result => { return new Promise((resolve) => {
resolve(result) theme_utils.dirlist(
}) path ? path : this._backgroundImagesDir,
}) true,
} (result) => {
resolve(result);
}
);
});
}
async _init() { async _init() {
await this._createBackgroundArray() await this._createBackgroundArray();
this._updateOnStartup() this._updateOnStartup();
return new Promise( resolve => resolve() ) return new Promise((resolve) => resolve());
} }
} }

44
themes/dracula/js/battery.js vendored

@ -1,38 +1,40 @@
class Battery { class Battery {
constructor() { constructor() {
this._battery = document.querySelector("#battery-label") this._battery = document.querySelector("#battery-label");
this._info = {} this._info = {};
this._init() this._init();
} }
_updateData() { _updateData() {
this._info = lightdm.batteryData this._info = lightdm.batteryData;
var level = this._info.level var level = this._info.level;
var state = this._info.state var state = this._info.state;
var ac = this._info.ac_status var ac = this._info.ac_status;
var icon = 0 var icon = 0;
var charging = "" var charging = "";
var blevel = Math.floor(level / 10) * 10 var blevel = Math.floor(level / 10) * 10;
icon = `-${blevel}` icon = `-${blevel}`;
charging = ac == 1 ? "-charging" : "" charging = ac == 1 ? "-charging" : "";
if (blevel < 10) icon = "-outline" if (blevel < 10) icon = "-outline";
if (level == 100 && ac == 0) {icon = ""} if (level == 100 && ac == 0) {
icon = "";
}
if (level >= 0) { if (level >= 0) {
this._battery.style.visibility = "visible" this._battery.style.visibility = "visible";
this._battery.innerHTML = `<span class="mdi mdi-battery${charging}${icon}"></span> ${level}%` this._battery.innerHTML = `<span class="mdi mdi-battery${charging}${icon}"></span> ${level}%`;
} else { } else {
this._battery.innerHTML = "" this._battery.innerHTML = "";
this._battery.style.visibility = "hidden" this._battery.style.visibility = "hidden";
} }
} }
_setTimer() { _setTimer() {
if (!lightdm.can_access_battery) return if (!lightdm.can_access_battery) return;
this._updateData() this._updateData();
} }
_init() { _init() {
this._setTimer() this._setTimer();
} }
} }

24
themes/dracula/js/brightness.js vendored

@ -1,28 +1,28 @@
class Brightness { class Brightness {
constructor() { constructor() {
this._brightness = document.querySelector("#brightness-label") this._brightness = document.querySelector("#brightness-label");
this._level = 0 this._level = 0;
this._init() this._init();
} }
_updateData() { _updateData() {
this._level = lightdm.brightness this._level = lightdm.brightness;
if (this._level >= 0) { if (this._level >= 0) {
this._brightness.style.visibility = "visible" this._brightness.style.visibility = "visible";
var icon = this._level > 50 ? 7: this._level > 10 ? 6 : 5 var icon = this._level > 50 ? 7 : this._level > 10 ? 6 : 5;
this._brightness.innerHTML = `<span class="mdi mdi-brightness-${icon}"></span> ${this._level}%` this._brightness.innerHTML = `<span class="mdi mdi-brightness-${icon}"></span> ${this._level}%`;
} else { } else {
this._brightness.innerHTML = "" this._brightness.innerHTML = "";
this._brightness.style.visibility = "hidden" this._brightness.style.visibility = "hidden";
} }
} }
_setTimer() { _setTimer() {
if (!lightdm.can_access_brightness) return if (!lightdm.can_access_brightness) return;
this._updateData() this._updateData();
} }
_init() { _init() {
this._setTimer() this._setTimer();
} }
} }

137
themes/dracula/js/debug.js vendored

@ -1,34 +1,36 @@
class Debug { class Debug {
constructor() { constructor() {
this._debugPass = "tepes" this._debugPass = "tepes";
this._init() this._init();
} }
_init() { _init() {
console.log("DEBUG") console.log("DEBUG");
if (!window.greeter_config) { if (!window.greeter_config) {
window.greeter_config = { window.greeter_config = {
greeter: { greeter: {
debug_mode: true, debug_mode: true,
}, },
branding: { branding: {
background_images_dir: "", background_images_dir: "",
} },
} };
} }
if (!window.theme_utils) { if (!window.theme_utils) {
window.theme_utils = {} window.theme_utils = {};
window.theme_utils.dirlist = function(path, mode, callback) { window.theme_utils.dirlist = function (path, mode, callback) {
var result = [] var result = [];
callback(result) callback(result);
}; };
window.theme_utils.bind_this = function(context) {return context} window.theme_utils.bind_this = function (context) {
} return context;
};
}
if (!window.lightdm) { if (!window.lightdm) {
window.lightdm = {} window.lightdm = {};
} }
var local_lightdm = { var local_lightdm = {
@ -45,111 +47,110 @@ class Debug {
sessions: [ sessions: [
{ {
name: "awesome wm", name: "awesome wm",
key: "awesome" key: "awesome",
}, },
{ {
name: "Ubuntu", name: "Ubuntu",
key: "ubuntu" key: "ubuntu",
}, },
{ {
name: "i3wm", name: "i3wm",
key: "i3" key: "i3",
}, },
{ {
name: "bspwm", name: "bspwm",
key: "bspwm" key: "bspwm",
} },
], ],
users: [ users: [
{ {
display_name: "Vlad Tepes", display_name: "Vlad Tepes",
username: "dracula", username: "dracula",
image: "" image: "",
}, },
{ {
display_name: "Trevor Belmont", display_name: "Trevor Belmont",
username: "treffy", username: "treffy",
image: "" image: "",
}, },
{ {
display_name: "Sypha Belnades", display_name: "Sypha Belnades",
username: "speaker", username: "speaker",
image: "" image: "",
} },
], ],
languages: [ languages: [
{ {
name: 'American English', name: "American English",
code: 'en_US.utf8' code: "en_US.utf8",
} },
], ],
language: 'American English', language: "American English",
authenticate: username => { authenticate: (username) => {
console.log(`Starting authentication with user: "${username}"`) console.log(`Starting authentication with user: "${username}"`);
}, },
cancel_authentication: () => { cancel_authentication: () => {
console.log(`Authentication cancelled`) console.log(`Authentication cancelled`);
}, },
respond: async (password) => { respond: async (password) => {
console.log(`Password provided: "${password}"`) console.log(`Password provided: "${password}"`);
if (password == this._debugPass) { if (password == this._debugPass) {
lightdm.is_authenticated = true lightdm.is_authenticated = true;
} else { } else {
await wait(2000) await wait(2000);
} }
authentication_done() authentication_done();
}, },
start_session: session => { start_session: (session) => {
alert(`Logged with session: "${session}"`) alert(`Logged with session: "${session}"`);
location.reload() location.reload();
}, },
shutdown: () => { shutdown: () => {
console.log("System is shutting down...") console.log("System is shutting down...");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
restart: () => { restart: () => {
console.log("System is rebooting...") console.log("System is rebooting...");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
hibernate: () => { hibernate: () => {
console.log("System is hibernating") console.log("System is hibernating");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
suspend: () => { suspend: () => {
console.log("System is suspending") console.log("System is suspending");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
batteryData: { batteryData: {
name: "Battery 0", name: "Battery 0",
level: 85, level: 85,
state: "Discharging" state: "Discharging",
}, },
batteryUpdate: () => { batteryUpdate: () => {
console.log("Battery updated") console.log("Battery updated");
}, },
brightness: 50, brightness: 50,
brightnessSet: (quantity) => { brightnessSet: (quantity) => {
lightdm.brightness = quantity lightdm.brightness = quantity;
}, },
brightnessIncrease: (quantity) => { brightnessIncrease: (quantity) => {
lightdm.brightness += quantity lightdm.brightness += quantity;
if (lightdm.brightness > 100) lightdm.brightness = 100 if (lightdm.brightness > 100) lightdm.brightness = 100;
}, },
brightnessDecrease: (quantity) => { brightnessDecrease: (quantity) => {
lightdm.brightness -= quantity lightdm.brightness -= quantity;
if (lightdm.brightness < 0) lightdm.brightness = 0 if (lightdm.brightness < 0) lightdm.brightness = 0;
} },
} };
if (lightdm.mock == undefined) { if (lightdm.mock == undefined) {
window.lightdm = {} window.lightdm = {};
Object.assign(window.lightdm, local_lightdm) Object.assign(window.lightdm, local_lightdm);
} else { } else {
Object.keys(local_lightdm).forEach((key) => { Object.keys(local_lightdm).forEach((key) => {
var realKey = `_${key}` var realKey = `_${key}`;
lightdm[realKey] = local_lightdm[key] lightdm[realKey] = local_lightdm[key];
}) });
} }
} }
} }

58
themes/dracula/js/index.js vendored

@ -1,60 +1,56 @@
function getArrayForm(inputs) { function getArrayForm(inputs) {
if (!inputs) return false if (!inputs) return false;
var data = {} var data = {};
inputs.forEach((x) => { inputs.forEach((x) => {
data[x.name] = x.value data[x.name] = x.value;
}) });
return data return data;
} }
async function wait(ms) { async function wait(ms) {
return new Promise( resolve => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve() resolve();
}, ms) }, ms);
}) });
} }
async function initGreeter() { async function initGreeter() {
if (greeter_config.greeter.debug_mode) { if (greeter_config.greeter.debug_mode) {
//debug = new Debug() //debug = new Debug()
} }
lightdm.authentication_complete?.connect(() => authentication_done()) lightdm.authentication_complete?.connect(() => authentication_done());
lightdm.brightness_update?.connect(() => brightness._updateData())
lightdm.battery_update?.connect(() => battery._updateData()) lightdm.brightness_update?.connect(() => brightness._updateData());
accounts = new Accounts() lightdm.battery_update?.connect(() => battery._updateData());
sessions = new Sessions() accounts = new Accounts();
authenticate = new Authenticate() sessions = new Sessions();
sidebar = new Sidebar() authenticate = new Authenticate();
time_date = new TimeDate() sidebar = new Sidebar();
layouts = new Layouts() time_date = new TimeDate();
backgrounds = new Backgrounds() layouts = new Layouts();
backgrounds._init()
power = new Power() backgrounds = new Backgrounds();
backgrounds._init();
battery = new Battery() power = new Power();
brightness = new Brightness() battery = new Battery();
brightness = new Brightness();
} }
if (window._ready_event === undefined) { if (window._ready_event === undefined) {
_ready_event = new Event("GreeterReady") _ready_event = new Event("GreeterReady");
window.dispatchEvent(_ready_event) window.dispatchEvent(_ready_event);
} }
window.addEventListener("GreeterReady", initGreeter) window.addEventListener("GreeterReady", initGreeter);

144
themes/dracula/js/layouts.js vendored

@ -1,77 +1,85 @@
class Layouts { class Layouts {
constructor() { constructor() {
this._layoutList = document.querySelector("#layouts-list") this._layoutList = document.querySelector("#layouts-list");
this._dropdown = document.querySelector("#layouts-dropdown") this._dropdown = document.querySelector("#layouts-dropdown");
this._button = document.querySelector("#layouts-button") this._button = document.querySelector("#layouts-button");
this._layouts = [] this._layouts = [];
this.layout = {} this.layout = {};
this._init() this._init();
} }
_setDefault() { _setDefault() {
let name = this.layout.name let name = this.layout.name;
let description = this.layout.description let description = this.layout.description;
let short = this.layout.short_description let short = this.layout.short_description;
this._button.innerHTML = name.toUpperCase() + (short ? ` (${short})` : "") this._button.innerHTML = name.toUpperCase() + (short ? ` (${short})` : "");
//this._button.name = description //this._button.name = description
} }
_setLayoutList() { _setLayoutList() {
let dropdown = this._dropdown let dropdown = this._dropdown;
dropdown.innerHTML = "" dropdown.innerHTML = "";
for (let i = 0; i < this._layouts.length; i++) { for (let i = 0; i < this._layouts.length; i++) {
let name = this._layouts[i].name let name = this._layouts[i].name;
let description = this._layouts[i].description let description = this._layouts[i].description;
let short = this._layouts[i].short_description let short = this._layouts[i].short_description;
let li = document.createElement("li") let li = document.createElement("li");
let button = document.createElement("button") let button = document.createElement("button");
button.innerHTML = name + (short ? ` (${short})` : "") button.innerHTML = name + (short ? ` (${short})` : "");
button.name = description button.name = description;
button.addEventListener("click", () => { button.addEventListener("click", () => {
this.layout = this._layouts[i] this.layout = this._layouts[i];
this._setDefault() this._setDefault();
lightdm.layout = this.layout lightdm.layout = this.layout;
}) });
li.appendChild(button) li.appendChild(button);
dropdown.appendChild(li) dropdown.appendChild(li);
} }
} }
_setKeydown() { _setKeydown() {
let dropdown = this._dropdown let dropdown = this._dropdown;
dropdown.addEventListener("keydown", (ev) => { dropdown.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
this._button.focus() this._button.focus();
} }
}) });
} }
_setButton() { _setButton() {
let dropdown = this._dropdown let dropdown = this._dropdown;
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._button || ev.target.parentElement == this._button) { if (
dropdown.classList.toggle("hide") ev.target == this._button ||
} else ev.target.parentElement == this._button
if (ev.target != dropdown && ev.target.closest(".dropdown") == null) { ) {
dropdown.classList.add("hide") dropdown.classList.toggle("hide");
} } else if (
}) ev.target != dropdown &&
document.querySelector("#screen").addEventListener("focusin", (ev) => { ev.target.closest(".dropdown") == null
if (!dropdown.contains(document.activeElement) && document.activeElement != this._button) { ) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
} }
}) });
} document.querySelector("#screen").addEventListener("focusin", (ev) => {
if (
!dropdown.contains(document.activeElement) &&
document.activeElement != this._button
) {
dropdown.classList.add("hide");
}
});
}
_init() { _init() {
this.layout = lightdm.layout this.layout = lightdm.layout;
this._layouts = greeter_config.layouts this._layouts = greeter_config.layouts;
this._setDefault() this._setDefault();
this._setLayoutList() this._setLayoutList();
this._setButton() this._setButton();
this._setKeydown() this._setKeydown();
} }
} }

98
themes/dracula/js/power.js vendored

@ -1,89 +1,89 @@
class Power { class Power {
constructor() { constructor() {
this._shutdown = document.querySelector("#shutdown-button") this._shutdown = document.querySelector("#shutdown-button");
this._restart = document.querySelector("#restart-button") this._restart = document.querySelector("#restart-button");
this._hibernate = document.querySelector("#hibernate-button") this._hibernate = document.querySelector("#hibernate-button");
this._suspend = document.querySelector("#suspend-button") this._suspend = document.querySelector("#suspend-button");
this._cover = document.querySelector("#cover") this._cover = document.querySelector("#cover");
this._covermsg = document.querySelector("#cover > #message") this._covermsg = document.querySelector("#cover > #message");
this._init() this._init();
} }
_show_message(text) { _show_message(text) {
this._covermsg.innerHTML = text this._covermsg.innerHTML = text;
this._cover.classList.remove("hide") this._cover.classList.remove("hide");
wait(500).then(() => { wait(500).then(() => {
this._cover.focus() this._cover.focus();
}) });
} }
async _do_shutdown() { async _do_shutdown() {
this._show_message("Shutting down") this._show_message("Shutting down");
await wait(1000) await wait(1000);
lightdm.shutdown() lightdm.shutdown();
} }
async _do_restart() { async _do_restart() {
this._show_message("Restarting") this._show_message("Restarting");
await wait(1000) await wait(1000);
lightdm.restart() lightdm.restart();
} }
async _do_hibernate() { async _do_hibernate() {
this._show_message("Hibernating") this._show_message("Hibernating");
await wait(1000) await wait(1000);
lightdm.hibernate() lightdm.hibernate();
} }
async _do_suspend() { async _do_suspend() {
this._show_message("Suspending") this._show_message("Suspending");
await wait(1000) await wait(1000);
lightdm.suspend() lightdm.suspend();
} }
_setShutdown() { _setShutdown() {
if (!lightdm.can_shutdown) return if (!lightdm.can_shutdown) return;
this._shutdown.addEventListener("click", () => { this._shutdown.addEventListener("click", () => {
this._do_shutdown() this._do_shutdown();
}) });
this._shutdown.classList.remove("hide") this._shutdown.classList.remove("hide");
} }
_setRestart() { _setRestart() {
if (!lightdm.can_restart) return if (!lightdm.can_restart) return;
this._restart.addEventListener("click", () => { this._restart.addEventListener("click", () => {
this._do_restart() this._do_restart();
}) });
this._restart.classList.remove("hide") this._restart.classList.remove("hide");
} }
_setHibernate() { _setHibernate() {
if (!lightdm.can_hibernate) return if (!lightdm.can_hibernate) return;
this._hibernate.addEventListener("click", () => { this._hibernate.addEventListener("click", () => {
this._do_hibernate() this._do_hibernate();
}) });
this._hibernate.classList.remove("hide") this._hibernate.classList.remove("hide");
} }
_setSuspend() { _setSuspend() {
if (!lightdm.can_suspend) return if (!lightdm.can_suspend) return;
this._suspend.addEventListener("click", () => { this._suspend.addEventListener("click", () => {
this._do_suspend() this._do_suspend();
}) });
this._suspend.classList.remove("hide") this._suspend.classList.remove("hide");
} }
_setCover() { _setCover() {
this._cover.addEventListener("click", () => { this._cover.addEventListener("click", () => {
this._cover.classList.add("hide") this._cover.classList.add("hide");
}) });
this._cover.addEventListener("keydown", () => { this._cover.addEventListener("keydown", () => {
this._cover.classList.add("hide") this._cover.classList.add("hide");
}) });
} }
_setButtons() { _setButtons() {
this._setShutdown() this._setShutdown();
this._setRestart() this._setRestart();
this._setHibernate() this._setHibernate();
this._setSuspend() this._setSuspend();
this._setCover() this._setCover();
} }
_init() { _init() {
this._setButtons() this._setButtons();
} }
} }

167
themes/dracula/js/sessions.js vendored

@ -1,91 +1,104 @@
class Sessions { class Sessions {
constructor() { constructor() {
this._localStorage = window.localStorage this._localStorage = window.localStorage;
this._sessionsButton = document.querySelector("#sessions-button") this._sessionsButton = document.querySelector("#sessions-button");
this._sessionList = document.querySelector("#sessions-dropdown") this._sessionList = document.querySelector("#sessions-dropdown");
this._sessionLabel = document.querySelector("#sessions-button > .text") this._sessionLabel = document.querySelector("#sessions-button > .text");
this._defaultSession = null this._defaultSession = null;
this._sessionsObject = null this._sessionsObject = null;
this._init() this._init();
} }
getDefaultSession() { getDefaultSession() {
return this._defaultSession.key return this._defaultSession.key;
} }
_setSessionDefault() { _setSessionDefault() {
this._sessionLabel.innerText = this._defaultSession.name this._sessionLabel.innerText = this._defaultSession.name;
} }
_updateOnStartup() { _updateOnStartup() {
var key = this._localStorage.getItem("defaultSession") || this._sessionsObject[0].key || lightdm.default_session var key =
this._localStorage.getItem("defaultSession") ||
this._sessionsObject[0].key ||
lightdm.default_session;
var session = this._sessionsObject.find((val) => {return val.key === key}) var session = this._sessionsObject.find((val) => {
if (session === undefined) { return val.key === key;
// This should never happen });
this._defaultSession = {key: "awesome", name: "Awesome WM"} if (session === undefined) {
} else { // This should never happen
this._defaultSession = session this._defaultSession = { key: "awesome", name: "Awesome WM" };
} } else {
this._setSessionDefault() this._defaultSession = session;
} }
this._setSessionDefault();
}
_updateDefaults(sessionObj) { _updateDefaults(sessionObj) {
if (!sessionObj) return if (!sessionObj) return;
this._defaultSession = sessionObj this._defaultSession = sessionObj;
this._localStorage.setItem("defaultSession", this._defaultSession.key) this._localStorage.setItem("defaultSession", this._defaultSession.key);
} }
_setSessionList() { _setSessionList() {
var dropdown = this._sessionList var dropdown = this._sessionList;
dropdown.innerHTML = "" dropdown.innerHTML = "";
for (let i = 0; i < this._sessionsObject.length; i++) { for (let i = 0; i < this._sessionsObject.length; i++) {
var name = this._sessionsObject[i].name var name = this._sessionsObject[i].name;
var li = document.createElement("li") var li = document.createElement("li");
var button = document.createElement("button") var button = document.createElement("button");
button.innerText = name button.innerText = name;
button.addEventListener("click", () => { button.addEventListener("click", () => {
this._updateDefaults(this._sessionsObject[i]) this._updateDefaults(this._sessionsObject[i]);
this._setSessionDefault() this._setSessionDefault();
}) });
li.appendChild(button) li.appendChild(button);
dropdown.appendChild(li) dropdown.appendChild(li);
} }
} }
_setKeydown() { _setKeydown() {
var dropdown = this._sessionList var dropdown = this._sessionList;
dropdown.addEventListener("keydown", (ev) => { dropdown.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
sessions_dropdown.classList.add("hide") sessions_dropdown.classList.add("hide");
this._sessionsButton.focus() this._sessionsButton.focus();
} }
}) });
} }
_setButton() { _setButton() {
var dropdown = this._sessionList var dropdown = this._sessionList;
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._sessionsButton || ev.target.parentElement == this._sessionsButton) { if (
dropdown.classList.toggle("hide") ev.target == this._sessionsButton ||
} else ev.target.parentElement == this._sessionsButton
if (ev.target != this._sessionList && ev.target.closest(".dropdown") == null) { ) {
dropdown.classList.add("hide") dropdown.classList.toggle("hide");
} } else if (
}) ev.target != this._sessionList &&
document.querySelector("#screen").addEventListener("focusin", (ev) => { ev.target.closest(".dropdown") == null
if (!dropdown.contains(document.activeElement) && document.activeElement != this._sessionsButton) { ) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
} }
}) });
} document.querySelector("#screen").addEventListener("focusin", (ev) => {
if (
!dropdown.contains(document.activeElement) &&
document.activeElement != this._sessionsButton
) {
dropdown.classList.add("hide");
}
});
}
_init() { _init() {
this._sessionsObject = lightdm.sessions this._sessionsObject = lightdm.sessions;
this._updateOnStartup() this._updateOnStartup();
this._setSessionList() this._setSessionList();
this._setButton() this._setButton();
this._setKeydown() this._setKeydown();
} }
} }

120
themes/dracula/js/sidebar.js vendored

@ -1,65 +1,75 @@
class Sidebar { class Sidebar {
constructor() { constructor() {
this._sidebar = document.querySelector("#sidebar") this._sidebar = document.querySelector("#sidebar");
this._sidebarButton = document.querySelector("#panel-button") this._sidebarButton = document.querySelector("#panel-button");
this._closeButton = document.querySelector("#close-panel-button") this._closeButton = document.querySelector("#close-panel-button");
this._visible = false this._visible = false;
this._init() this._init();
} }
showSidebar() { showSidebar() {
this._sidebar.classList.remove("hide") this._sidebar.classList.remove("hide");
wait(100).then(() => {this._closeButton.focus()}) wait(100).then(() => {
this._visible = true this._closeButton.focus();
} });
this._visible = true;
}
hideSidebar() { hideSidebar() {
this._sidebar.classList.add("hide") this._sidebar.classList.add("hide");
this._sidebarButton.focus() this._sidebarButton.focus();
this._visible = false this._visible = false;
} }
toggleSidebar() { toggleSidebar() {
if (this._visible) { if (this._visible) {
this.hideSidebar() this.hideSidebar();
} else { } else {
this.showSidebar() this.showSidebar();
} }
} }
_setKeydown() { _setKeydown() {
this._sidebar.addEventListener("keydown", (ev) => { this._sidebar.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
this.hideSidebar() this.hideSidebar();
} }
}) });
} }
_setSidebar() { _setSidebar() {
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._sidebarButton || ev.target.parentElement == this._sidebarButton) { if (
this.toggleSidebar() ev.target == this._sidebarButton ||
} else ev.target.parentElement == this._sidebarButton
if (ev.target != this._sidebar && ev.target.closest(".panel") == null) { ) {
this._sidebar.classList.add("hide") this.toggleSidebar();
this._visible = false } 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) { if (
this.hideSidebar() ev.target == this._closeButton ||
} ev.target.parentElement == this._closeButton
}) ) {
this.hideSidebar();
}
});
document.querySelector("#screen").addEventListener("focusin", (ev) => { document.querySelector("#screen").addEventListener("focusin", (ev) => {
if (!this._sidebar.contains(document.activeElement)) { if (!this._sidebar.contains(document.activeElement)) {
this._sidebar.classList.add("hide") this._sidebar.classList.add("hide");
this._visible = false this._visible = false;
} }
}) });
} }
_init() { _init() {
this._setSidebar() this._setSidebar();
this._setKeydown() this._setKeydown();
} }
} }

98
themes/dracula/js/time-date.js vendored

@ -1,56 +1,56 @@
class TimeDate { class TimeDate {
constructor() { constructor() {
this._timeDateButton = document.querySelector("#time-date") this._timeDateButton = document.querySelector("#time-date");
this._timeLabel = document.querySelector("#time-date #time-label") this._timeLabel = document.querySelector("#time-date #time-label");
this._dateLabel = document.querySelector("#time-date #date-label") this._dateLabel = document.querySelector("#time-date #date-label");
this._passForm = document.querySelector("#pass-form") this._passForm = document.querySelector("#pass-form");
this._init() this._init();
} }
_updateTimeDate() { _updateTimeDate() {
let date = theme_utils.get_current_localized_date() let date = theme_utils.get_current_localized_date();
let time = theme_utils.get_current_localized_time() let time = theme_utils.get_current_localized_time();
this._dateLabel.innerText = date this._dateLabel.innerText = date;
this._timeLabel.innerText = time this._timeLabel.innerText = time;
} }
_setTimer() { _setTimer() {
this._updateTimeDate() this._updateTimeDate();
setInterval(() => { setInterval(() => {
this._updateTimeDate() this._updateTimeDate();
}, 1000) }, 1000);
} }
_setButtons() { _setButtons() {
this._timeDateButton.addEventListener("click", (ev) => { this._timeDateButton.addEventListener("click", (ev) => {
this.toggleTimeDate() this.toggleTimeDate();
}) });
this._passForm.addEventListener("keydown", (ev) => { this._passForm.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
this.toggleTimeDate() this.toggleTimeDate();
} }
}) });
} }
async toggleTimeDate() { async toggleTimeDate() {
this._timeDateButton.blur() this._timeDateButton.blur();
this._passForm.blur() this._passForm.blur();
if (this._timeDateButton.classList.contains("hide")) { if (this._timeDateButton.classList.contains("hide")) {
this._passForm.classList.add("hide") this._passForm.classList.add("hide");
await wait(300) await wait(300);
this._timeDateButton.classList.remove("hide") this._timeDateButton.classList.remove("hide");
await wait(100) await wait(100);
this._timeDateButton.focus() this._timeDateButton.focus();
} else { } else {
this._timeDateButton.classList.add("hide") this._timeDateButton.classList.add("hide");
await wait(300) await wait(300);
this._passForm.classList.remove("hide") this._passForm.classList.remove("hide");
} }
} }
_init() { _init() {
this._setTimer() this._setTimer();
this._setButtons() this._setButtons();
} }
} }

3
themes/gruvbox/README.md vendored

@ -1,6 +1,7 @@
# Web Greeter gruvbox theme # Web Greeter gruvbox theme
## Overview ## Overview
This is a web-greeter theme with gruvbox color scheme, included with [web-greeter][web-greeter]. This is a web-greeter theme with gruvbox color scheme, included with [web-greeter][web-greeter].
Based on [glorious-theme][glorious] by manilarome. Based on [glorious-theme][glorious] by manilarome.
@ -20,9 +21,11 @@ Based on [glorious-theme][glorious] by manilarome.
</center> </center>
## Installation ## Installation
This theme is shipped with `web-greeter`. To use it, set the `theme` as `gruvbox` inside `/etc/lightdm/web-greeter.yml` This theme is shipped with `web-greeter`. To use it, set the `theme` as `gruvbox` inside `/etc/lightdm/web-greeter.yml`
## TODO ## TODO
- Background selector - Background selector
- Translations support - Translations support

60
themes/gruvbox/css/style.css vendored

@ -49,7 +49,7 @@
@media screen and (min-width: 3000px) and (min-height: 1200px) { @media screen and (min-width: 3000px) and (min-height: 1200px) {
#screen { #screen {
zoom: 2.0; zoom: 2;
} }
} }
@ -72,7 +72,7 @@ html > * {
body { body {
display: flex; display: flex;
min-height: 100vh; min-height: 100vh;
margin: 0; margin: 0;
transition: var(--animation-duration); transition: var(--animation-duration);
} }
@ -115,7 +115,7 @@ button {
position: absolute; position: absolute;
background-color: var(--bg); background-color: var(--bg);
background-image: url("../assets/bubbles.svg") background-image: url("../assets/bubbles.svg");
} }
#cover { #cover {
@ -162,8 +162,9 @@ button {
transition: var(--animation-duration); transition: var(--animation-duration);
} }
#login-form:focus-within, #login-form:hover { #login-form:focus-within,
filter: drop-shadow(2px 6px 10px rgba(0,0,0,0.8)); #login-form:hover {
filter: drop-shadow(2px 6px 10px rgba(0, 0, 0, 0.8));
} }
#login-form-box { #login-form-box {
@ -189,10 +190,32 @@ input {
font-family: inherit; font-family: inherit;
font-size: inherit; font-size: inherit;
} }
input:focus, input:focus-visible { input:focus,
input:focus-visible {
border: 0; border: 0;
outline: auto var(--fg); outline: auto var(--fg);
} }
#input {
position: relative;
}
#input #pass-eye {
position: absolute;
right: 15px;
top: 0;
bottom: 0;
margin-top: auto;
margin-bottom: auto;
height: fit-content;
background-color: var(--bg1);
}
#input #pass-eye:hover,
#input #pass-eye:focus {
background-color: var(--bg2);
}
input::-ms-reveal,
input::-ms-clear {
display: none;
}
:focus { :focus {
outline: auto var(--fg) !important; outline: auto var(--fg) !important;
@ -254,7 +277,8 @@ input:focus, input:focus-visible {
#submit-button { #submit-button {
background: var(--aqua); background: var(--aqua);
} }
#submit-button:hover, #submit-button:focus { #submit-button:hover,
#submit-button:focus {
background: var(--light_aqua); background: var(--light_aqua);
} }
@ -302,7 +326,8 @@ input:focus, input:focus-visible {
display: none; display: none;
} }
.label-bar > *:hover, .label-bar > *:focus-within { .label-bar > *:hover,
.label-bar > *:focus-within {
background: #3c3836aa; background: #3c3836aa;
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
} }
@ -320,7 +345,6 @@ input:focus, input:focus-visible {
margin: 2px; margin: 2px;
} }
#system-status { #system-status {
top: 0; top: 0;
right: 0; right: 0;
@ -335,12 +359,12 @@ input:focus, input:focus-visible {
font-size: 2em; font-size: 2em;
cursor: pointer; cursor: pointer;
} }
#system-power > *:hover, #system-power > *:focus { #system-power > *:hover,
#system-power > *:focus {
background: #3c3836aa; background: #3c3836aa;
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
} }
#sessions-list { #sessions-list {
position: absolute; position: absolute;
left: 0; left: 0;
@ -389,7 +413,8 @@ input:focus, input:focus-visible {
padding: 0.8em; padding: 0.8em;
width: -webkit-fill-available; width: -webkit-fill-available;
} }
.dropdown button:hover, .dropdown button:focus { .dropdown button:hover,
.dropdown button:focus {
background: var(--bg4); background: var(--bg4);
} }
.dropdown.hide { .dropdown.hide {
@ -406,13 +431,16 @@ li {
display: block; display: block;
} }
#users-button:hover, #users-button:focus { #users-button:hover,
#users-button:focus {
background: var(--light_purple); background: var(--light_purple);
} }
#sessions-button:hover, #sessions-button:focus { #sessions-button:hover,
#sessions-button:focus {
background: var(--light_blue); background: var(--light_blue);
} }
.button:hover span::before, .button:focus span::before { .button:hover span::before,
.button:focus span::before {
transform: rotate(180deg); transform: rotate(180deg);
} }
.button span::before { .button span::before {
@ -431,5 +459,5 @@ li {
background: var(--blue); background: var(--blue);
} }
::-webkit-scrollbar-thumb:hover { ::-webkit-scrollbar-thumb:hover {
background: var(--light_blue) background: var(--light_blue);
} }

208
themes/gruvbox/index.html vendored

@ -1,116 +1,128 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <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"> <meta
name="viewport"
content="width=device-width, viewport-fit=cover, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<link rel="stylesheet" href="css/style.css" class="style"> <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"> <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>--> <!--<script src="../_vendor/js/mock.js"></script>-->
<title>Gruvbox theme</title> <title>Gruvbox theme</title>
</head> </head>
<body> <body>
<div id="background"></div> <div id="background"></div>
<button id="cover" class="hide"> <button id="cover" class="hide">
<div id="message"></div> <div id="message"></div>
</button> </button>
<div id="screen"> <div id="screen">
<div id="login-form"> <div id="login-form">
<div id="login-form-box"> <div id="login-form-box">
<div id="user-image"> <div id="user-image">
<div id="background-image"> <div id="background-image">
<i class="mdi mdi-account"></i> <i class="mdi mdi-account"></i>
</div>
<img src="" alt="" />
</div>
<div id="user-label">
<b>User</b>
</div> </div>
<img src="" alt="">
</div>
<div id="user-label">
<b>User</b>
</div>
<div id="pass-form"> <div id="pass-form">
<form action="POST"> <form action="POST">
<div id="input"> <div id="input">
<input id="input-password" name="password" type="password" autocomplete="off" autofocus="true" placeholder="Enter your password"> <input
</div> id="input-password"
<div> name="password"
<button id="submit-button" type="submit" class="button"> type="password"
<i class="mdi mdi-chevron-right mdi-24px"></i> autocomplete="off"
</button> autofocus="true"
</div> placeholder="Enter your password"
</form> />
</div> <button id="pass-eye" type="button" class="button">
<i class="mdi mdi-eye"></i>
</button>
</div>
<div>
<button id="submit-button" type="submit" class="button">
<i class="mdi mdi-chevron-right mdi-24px"></i>
</button>
</div>
</form>
</div>
<div id="sessions-list"> <div id="sessions-list">
<button id="sessions-button" class="button"> <button id="sessions-button" class="button">
<span class="mdi mdi-chevron-down mdi-24px"></span> <span class="mdi mdi-chevron-down mdi-24px"></span>
</button> </button>
<ul id="sessions-dropdown" class="dropdown hide"> <ul id="sessions-dropdown" class="dropdown hide">
<li><button>Awesome</button></li> <li><button>Awesome</button></li>
<li><button>Ubuntu</button></li> <li><button>Ubuntu</button></li>
</ul> </ul>
</div>
<div id="users-list">
<button id="users-button" class="button">
<span class="mdi mdi-chevron-down mdi-24px"></span>
</button>
<ul id="users-dropdown" class="dropdown hide">
<li><button>Normal sheer</button></li>
</ul>
</div>
</div> </div>
<div id="users-list"> </div>
<button id="users-button" class="button"> <div id="session-label" class="info"></div>
<span class="mdi mdi-chevron-down mdi-24px"></span> <div id="lock-label" class="info hide">Lock</div>
</button> <div id="time-date" class="info">
<ul id="users-dropdown" class="dropdown hide"> <span id="time-label">20:00</span>
<li><button>Normal sheer</button></li> <span id="date-label">12-07-21</span>
</div>
<div id="system-status" class="label-bar">
<div id="layouts-list">
<button id="layouts-button" class="">LATAM</button>
<ul id="layouts-dropdown" class="dropdown hide">
<li><button>Latam</button></li>
<li><button>English</button></li>
</ul> </ul>
</div> </div>
<div id="brightness-label"></div>
<div id="battery-label"></div>
</div> </div>
</div> <div id="system-power" class="label-bar">
<div id="session-label" class="info"> <button id="shutdown-btn" class="hide">
</div> <span class="mdi mdi-power"></span>
<div id="lock-label" class="info hide"> </button>
Lock <button id="restart-btn" class="hide">
</div> <span class="mdi mdi-restart"></span>
<div id="time-date" class="info"> </button>
<span id="time-label">20:00</span> <button id="suspend-btn" class="hide">
<span id="date-label">12-07-21</span> <span class="mdi mdi-power-sleep"></span>
</div> </button>
<button id="hibernate-btn" class="hide">
<div id="system-status" class="label-bar"> <span class="mdi mdi-power-cycle"></span>
<div id="layouts-list">
<button id="layouts-button" class="">
LATAM
</button> </button>
<ul id="layouts-dropdown" class="dropdown hide">
<li><button>Latam</button></li>
<li><button>English</button></li>
</ul>
</div> </div>
<div id="brightness-label"></div>
<div id="battery-label"></div>
</div>
<div id="system-power" class="label-bar">
<button id="shutdown-btn" class="hide">
<span class="mdi mdi-power"></span>
</button>
<button id="restart-btn" class="hide">
<span class="mdi mdi-restart"></span>
</button>
<button id="suspend-btn" class="hide">
<span class="mdi mdi-power-sleep"></span>
</button>
<button id="hibernate-btn" class="hide">
<span class="mdi mdi-power-cycle"></span>
</button>
</div> </div>
</div>
<script src="js/debug.js"></script> <script src="js/debug.js"></script>
<script src="js/authenticate.js"></script> <script src="js/authenticate.js"></script>
<script src="js/accounts.js"></script> <script src="js/accounts.js"></script>
<script src="js/sessions.js"></script> <script src="js/sessions.js"></script>
<script src="js/time-date.js"></script> <script src="js/time-date.js"></script>
<script src="js/layouts.js"></script> <script src="js/layouts.js"></script>
<script src="js/power.js"></script> <script src="js/power.js"></script>
<script src="js/battery.js"></script> <script src="js/battery.js"></script>
<script src="js/brightness.js"></script> <script src="js/brightness.js"></script>
<script src="js/index.js"></script> <script src="js/index.js"></script>
</body> </body>
</html> </html>

157
themes/gruvbox/js/accounts.js vendored

@ -1,112 +1,131 @@
class Accounts { class Accounts {
constructor() { constructor() {
this._localStorage = window.localStorage this._localStorage = window.localStorage;
this._userImage = document.querySelector("#user-image") this._userImage = document.querySelector("#user-image");
this._userLabel = document.querySelector("#user-label") this._userLabel = document.querySelector("#user-label");
this._accountsList = document.querySelector("#users-list") this._accountsList = document.querySelector("#users-list");
this._accountsButton = document.querySelector("#users-button") this._accountsButton = document.querySelector("#users-button");
this._defaultUser = null this._defaultUser = null;
this._usersObject = null this._usersObject = null;
this._init() this._init();
} }
getDefaultUserName() { getDefaultUserName() {
return this._defaultUser.username return this._defaultUser.username;
} }
_setAccountDefault() { _setAccountDefault() {
var img = this._userImage.querySelector("img") var img = this._userImage.querySelector("img");
img.src = this._defaultUser.image img.src = this._defaultUser.image;
img.onerror = function() { img.onerror = function () {
img.src = "" img.src = "";
} };
this._userLabel.innerHTML = `<b>${this._defaultUser.display_name}</b>` this._userLabel.innerHTML = `<b>${this._defaultUser.display_name}</b>`;
} }
_updateOnStartup() { _updateOnStartup() {
var username = this._localStorage.getItem('defaultUser') || this._usersObject[0].username var username =
var display_name = this._localStorage.getItem('defaultUserDisplayName') || this._usersObject[0].display_name this._localStorage.getItem("defaultUser") ||
var image = this._localStorage.getItem("defaultUserProfileImage") || this._usersObject[0].image this._usersObject[0].username;
var display_name =
this._localStorage.getItem("defaultUserDisplayName") ||
this._usersObject[0].display_name;
var image =
this._localStorage.getItem("defaultUserProfileImage") ||
this._usersObject[0].image;
this._defaultUser = { this._defaultUser = {
username, username,
display_name, display_name,
image, image,
} };
this._setAccountDefault() this._setAccountDefault();
} }
_setGuestAccount() { _setGuestAccount() {
if (lightdm.has_guest_account) { if (lightdm.has_guest_account) {
this._guestAccount = `guest-account-${Math.floor(Math.random() * 1000)}` this._guestAccount = `guest-account-${Math.floor(Math.random() * 1000)}`;
this._usersObject.push({ this._usersObject.push({
username: this._guestAccount, username: this._guestAccount,
display_name: "Guest", display_name: "Guest",
image: "" image: "",
}) });
} }
} }
_setAccountList() { _setAccountList() {
var dropdown = this._accountsList.querySelector(".dropdown") var dropdown = this._accountsList.querySelector(".dropdown");
dropdown.innerHTML = "" dropdown.innerHTML = "";
for (let i = 0; i < this._usersObject.length; i++) { for (let i = 0; i < this._usersObject.length; i++) {
var name = this._usersObject[i].display_name var name = this._usersObject[i].display_name;
var li = document.createElement("li") var li = document.createElement("li");
var button = document.createElement("button") var button = document.createElement("button");
button.innerHTML = name button.innerHTML = name;
button.addEventListener("click", () => { button.addEventListener("click", () => {
this._updateDefaults(this._usersObject[i]) this._updateDefaults(this._usersObject[i]);
this._setAccountDefault() this._setAccountDefault();
authenticate.startAuthentication() authenticate.startAuthentication();
}) });
li.appendChild(button) li.appendChild(button);
dropdown.appendChild(li) dropdown.appendChild(li);
} }
} }
_setKeydown() { _setKeydown() {
var dropdown = this._accountsList.querySelector(".dropdown") var dropdown = this._accountsList.querySelector(".dropdown");
dropdown.addEventListener("keydown", (ev) => { dropdown.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
this._accountsButton.focus() this._accountsButton.focus();
} }
}) });
} }
_setButton() { _setButton() {
var dropdown = this._accountsList.querySelector(".dropdown") var dropdown = this._accountsList.querySelector(".dropdown");
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._accountsButton || ev.target.parentElement == this._accountsButton) { if (
dropdown.classList.toggle("hide") ev.target == this._accountsButton ||
} else ev.target.parentElement == this._accountsButton
if (ev.target != this._accountsList && ev.target.closest(".dropdown") == null) { ) {
dropdown.classList.add("hide") dropdown.classList.toggle("hide");
} } else if (
}) ev.target != this._accountsList &&
document.querySelector("#screen").addEventListener("focusin", (ev) => { ev.target.closest(".dropdown") == null
if (!dropdown.contains(document.activeElement) && document.activeElement != this._accountsButton) { ) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
} }
}) });
document.querySelector("#screen").addEventListener("focusin", (ev) => {
if (
!dropdown.contains(document.activeElement) &&
document.activeElement != this._accountsButton
) {
dropdown.classList.add("hide");
}
});
} }
_updateDefaults(userObject) { _updateDefaults(userObject) {
if (!userObject) return if (!userObject) return;
this._defaultUser = userObject this._defaultUser = userObject;
this._localStorage.setItem("defaultUser", this._defaultUser.username) this._localStorage.setItem("defaultUser", this._defaultUser.username);
this._localStorage.setItem("defaultUserDisplayName", this._defaultUser.display_name) this._localStorage.setItem(
this._localStorage.setItem("defaultUserProfileImage", this._defaultUser.image) "defaultUserDisplayName",
this._defaultUser.display_name
);
this._localStorage.setItem(
"defaultUserProfileImage",
this._defaultUser.image
);
} }
_init() { _init() {
this._usersObject = lightdm.users this._usersObject = lightdm.users;
this._updateOnStartup() this._updateOnStartup();
this._setAccountList() this._setAccountList();
this._setButton() this._setButton();
this._setKeydown() this._setKeydown();
} }
} }

101
themes/gruvbox/js/authenticate.js vendored

@ -1,80 +1,91 @@
class Authenticate { class Authenticate {
constructor() { constructor() {
this._input = document.querySelector("#input-password") this._input = document.querySelector("#input-password");
this._form = document.querySelector("#pass-form > form") this._form = document.querySelector("#pass-form > form");
this._password = "" this._input_eye = document.querySelector("#pass-eye");
this._init() this._password = "";
this._init();
} }
_setForm() { _setForm() {
this._form.addEventListener("submit", (e) => { this._form.addEventListener("submit", (e) => {
e.preventDefault() e.preventDefault();
var inputs = this._form.querySelectorAll('input') var inputs = this._form.querySelectorAll("input");
var data = getArrayForm(inputs) var data = getArrayForm(inputs);
if (!data) return false if (!data) return false;
this._password = data.password this._password = data.password;
this._respond() this._respond();
}) });
} }
_setAuthentication_done() { _setAuthentication_done() {
window.authentication_done = () => { window.authentication_done = () => {
if (lightdm.is_authenticated) { if (lightdm.is_authenticated) {
this._authentication_done() this._authentication_done();
} else { } else {
this._authentication_failed() this._authentication_failed();
} }
} };
}
_setPasswordEye() {
this._input_eye.addEventListener("click", () => {
if (this._input.type === "password") {
this._input.type = "text";
} else {
this._input.type = "password";
}
});
} }
_respond() { _respond() {
var input = document.querySelector("#input-password") var input = document.querySelector("#input-password");
let username = accounts.getDefaultUserName() let username = accounts.getDefaultUserName();
input.blur() input.blur();
input.disabled = true input.disabled = true;
if (username == accounts._guestAccount && lightdm.has_guest_account) { if (username == accounts._guestAccount && lightdm.has_guest_account) {
lightdm.authenticate_as_guest() lightdm.authenticate_as_guest();
} else { } else {
lightdm.respond(this._password) lightdm.respond(this._password);
} }
} }
startAuthentication() { startAuthentication() {
lightdm.cancel_authentication() lightdm.cancel_authentication();
let username = accounts.getDefaultUserName() let username = accounts.getDefaultUserName();
if (username == accounts._guestAccount && lightdm.has_guest_account) return if (username == accounts._guestAccount && lightdm.has_guest_account) return;
lightdm.authenticate(String(accounts.getDefaultUserName())) lightdm.authenticate(String(accounts.getDefaultUserName()));
} }
async _authentication_done() { async _authentication_done() {
var form = document.querySelector("#login-form") var form = document.querySelector("#login-form");
form.classList.add("success") form.classList.add("success");
await wait(500) await wait(500);
var defSession = String(sessions.getDefaultSession()) var defSession = String(sessions.getDefaultSession());
var body = document.querySelector("body") var body = document.querySelector("body");
body.style.opacity = 0 body.style.opacity = 0;
await wait(1000) await wait(1000);
console.log("Session started with", defSession) console.log("Session started with", defSession);
lightdm.start_session(defSession) lightdm.start_session(defSession);
} }
async _authentication_failed() { async _authentication_failed() {
this.startAuthentication() this.startAuthentication();
var input = document.querySelector("#input-password") var input = document.querySelector("#input-password");
document.querySelector("#login-form").classList.add("failed") document.querySelector("#login-form").classList.add("failed");
input.blur() input.blur();
input.value = "" input.value = "";
input.disabled = false input.disabled = false;
await wait(2000) await wait(2000);
document.querySelector("#login-form").classList.remove("failed") document.querySelector("#login-form").classList.remove("failed");
} }
_init() { _init() {
this._setForm() this._setForm();
this._setAuthentication_done() this._setAuthentication_done();
console.log("Start authentication") this._setPasswordEye();
this.startAuthentication() console.log("Start authentication");
this.startAuthentication();
} }
} }

44
themes/gruvbox/js/battery.js vendored

@ -1,38 +1,40 @@
class Battery { class Battery {
constructor() { constructor() {
this._battery = document.querySelector("#battery-label") this._battery = document.querySelector("#battery-label");
this._info = {} this._info = {};
this._init() this._init();
} }
_updateData() { _updateData() {
this._info = lightdm.batteryData this._info = lightdm.batteryData;
var level = this._info.level var level = this._info.level;
var state = this._info.state var state = this._info.state;
var ac = this._info.ac_status var ac = this._info.ac_status;
var icon = 0 var icon = 0;
var charging = "" var charging = "";
var blevel = Math.floor(level / 10) * 10 var blevel = Math.floor(level / 10) * 10;
icon = `-${blevel}` icon = `-${blevel}`;
charging = ac == 1 ? "-charging" : "" charging = ac == 1 ? "-charging" : "";
if (blevel < 10) icon = "-outline" if (blevel < 10) icon = "-outline";
if (level == 100 && ac == 0) {icon = ""} if (level == 100 && ac == 0) {
icon = "";
}
if (level >= 0) { if (level >= 0) {
this._battery.style.visibility = "visible" this._battery.style.visibility = "visible";
this._battery.innerHTML = `<span class="mdi mdi-battery${charging}${icon}"></span> ${level}%` this._battery.innerHTML = `<span class="mdi mdi-battery${charging}${icon}"></span> ${level}%`;
} else { } else {
this._battery.innerHTML = "" this._battery.innerHTML = "";
this._battery.style.visibility = "hidden" this._battery.style.visibility = "hidden";
} }
} }
_setTimer() { _setTimer() {
if (!lightdm.can_access_battery) return if (!lightdm.can_access_battery) return;
this._updateData() this._updateData();
} }
_init() { _init() {
this._setTimer() this._setTimer();
} }
} }

25
themes/gruvbox/js/brightness.js vendored

@ -1,29 +1,28 @@
class Brightness { class Brightness {
constructor() { constructor() {
this._brightness = document.querySelector("#brightness-label") this._brightness = document.querySelector("#brightness-label");
this._level = 0 this._level = 0;
this._init() this._init();
} }
_updateData() { _updateData() {
this._level = lightdm.brightness this._level = lightdm.brightness;
if (this._level >= 0) { if (this._level >= 0) {
this._brightness.style.visibility = "visible" this._brightness.style.visibility = "visible";
var icon = this._level > 50 ? 7: this._level > 10 ? 6 : 5 var icon = this._level > 50 ? 7 : this._level > 10 ? 6 : 5;
this._brightness.innerHTML = `<span class="mdi mdi-brightness-${icon}"></span> ${this._level}%` this._brightness.innerHTML = `<span class="mdi mdi-brightness-${icon}"></span> ${this._level}%`;
} else { } else {
this._brightness.innerHTML = "" this._brightness.innerHTML = "";
this._brightness.style.visibility = "hidden" this._brightness.style.visibility = "hidden";
} }
} }
_setTimer() { _setTimer() {
if (!lightdm.can_access_brightness) return if (!lightdm.can_access_brightness) return;
this._updateData() this._updateData();
} }
_init() { _init() {
this._setTimer() this._setTimer();
} }
} }

137
themes/gruvbox/js/debug.js vendored

@ -1,33 +1,39 @@
class Debug { class Debug {
constructor() { constructor() {
this._debugPass = "pes" this._debugPass = "pes";
this._init() this._init();
} }
_init() { _init() {
console.log("DEBUG") console.log("DEBUG");
if (!window.theme_utils) { if (!window.theme_utils) {
window.theme_utils = {} window.theme_utils = {};
window.theme_utils.dirlist = function(path, mode, callback) { window.theme_utils.dirlist = function (path, mode, callback) {
callback([]) callback([]);
} };
window.theme_utils.bind_this = function(context) {return context} window.theme_utils.bind_this = function (context) {
return context;
};
} }
if (!window.greeter_config) { if (!window.greeter_config) {
window.greeter_config = { window.greeter_config = {
greeter: { greeter: {
debug_mode: true, debug_mode: true,
}, },
branding: { branding: {
background_images_dir: "", background_images_dir: "",
} },
} layouts: [
{ name: "latam", description: "", short_description: "es" },
{ name: "us", description: "", short_description: "en" },
],
};
} }
if (!window.lightdm) { if (!window.lightdm) {
window.lightdm = {} window.lightdm = {};
} }
var local_lightdm = { var local_lightdm = {
@ -44,111 +50,108 @@ class Debug {
sessions: [ sessions: [
{ {
name: "awesome wm", name: "awesome wm",
key: "awesome" key: "awesome",
}, },
{ {
name: "Ubuntu", name: "Ubuntu",
key: "ubuntu" key: "ubuntu",
}, },
{ {
name: "i3wm", name: "i3wm",
key: "i3" key: "i3",
}, },
{ {
name: "bspwm", name: "bspwm",
key: "bspwm" key: "bspwm",
} },
], ],
users: [ users: [
{ {
display_name: "Miyuki Shirogane", display_name: "Miyuki Shirogane",
username: "Arsène", username: "Arsène",
image: "./assets/users/Arsene.jpg" image: "./assets/users/Arsene.jpg",
}, },
{ {
display_name: "Kaguya Shinomiya", display_name: "Kaguya Shinomiya",
username: "Ice princess", username: "Ice princess",
image: "./assets/users/Ice princess.jpg" image: "./assets/users/Ice princess.jpg",
}, },
{ {
display_name: "Easper", display_name: "Easper",
username: "espaiar", username: "espaiar",
image: "" image: "",
} },
], ],
languages: [ languages: [
{ {
name: 'American English', name: "American English",
code: 'en_US.utf8' code: "en_US.utf8",
} },
], ],
language: 'American English', language: "American English",
authenticate: username => { layout: { name: "latam", description: "", short_description: "es" },
console.log(`Starting authentication with user: "${username}"`) authenticate: (username) => {
console.log(`Starting authentication with user: "${username}"`);
}, },
cancel_authentication: () => { cancel_authentication: () => {
console.log(`Authentication cancelled`) console.log(`Authentication cancelled`);
}, },
respond: async (password) => { respond: async (password) => {
console.log(`Password provided: "${password}"`) console.log(`Password provided: "${password}"`);
if (password == this._debugPass) { if (password == this._debugPass) {
lightdm.is_authenticated = true lightdm.is_authenticated = true;
} else { } else {
await wait(2000) await wait(2000);
} }
authentication_done() authentication_done();
}, },
start_session: session => { start_session: (session) => {
alert(`Logged with session: "${session}"`) alert(`Logged with session: "${session}"`);
location.reload() location.reload();
}, },
shutdown: () => { shutdown: () => {
console.log("System is shutting down...") console.log("System is shutting down...");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
restart: () => { restart: () => {
console.log("System is rebooting...") console.log("System is rebooting...");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
hibernate: () => { hibernate: () => {
console.log("System is hibernating") console.log("System is hibernating");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
suspend: () => { suspend: () => {
console.log("System is suspending") console.log("System is suspending");
setTimeout(() => location.reload(), 2000) setTimeout(() => location.reload(), 2000);
}, },
batteryData: { batteryData: {
name: "Battery 0", name: "Battery 0",
level: 85, level: 85,
state: "Discharging" state: "Discharging",
},
batteryUpdate: () => {
console.log("Battery updated")
}, },
brightness: 50, brightness: 50,
brightnessSet: (quantity) => { brightnessSet: (quantity) => {
lightdm.brightness = quantity lightdm.brightness = quantity;
}, },
brightnessIncrease: (quantity) => { brightnessIncrease: (quantity) => {
lightdm.brightness += quantity lightdm.brightness += quantity;
if (lightdm.brightness > 100) lightdm.brightness = 100 if (lightdm.brightness > 100) lightdm.brightness = 100;
}, },
brightnessDecrease: (quantity) => { brightnessDecrease: (quantity) => {
lightdm.brightness -= quantity lightdm.brightness -= quantity;
if (lightdm.brightness < 0) lightdm.brightness = 0 if (lightdm.brightness < 0) lightdm.brightness = 0;
} },
} };
if (lightdm.mock == undefined) { if (lightdm.mock == undefined) {
window.lightdm = {} window.lightdm = {};
Object.assign(window.lightdm, local_lightdm) Object.assign(window.lightdm, local_lightdm);
} else { } else {
Object.keys(local_lightdm).forEach((key) => { Object.keys(local_lightdm).forEach((key) => {
var realKey = `_${key}` var realKey = `_${key}`;
lightdm[realKey] = local_lightdm[key] lightdm[realKey] = local_lightdm[key];
}) });
} }
} }
} }

60
themes/gruvbox/js/index.js vendored

@ -1,62 +1,60 @@
form = document.querySelector("#form > form");
form = document.querySelector("#form > form")
function getArrayForm(inputs) { function getArrayForm(inputs) {
if (!inputs) return false if (!inputs) return false;
var data = {} var data = {};
inputs.forEach((x) => { inputs.forEach((x) => {
data[x.name] = x.value data[x.name] = x.value;
}) });
return data return data;
} }
async function wait(ms) { async function wait(ms) {
return new Promise( resolve => { return new Promise((resolve) => {
setTimeout(() => { setTimeout(() => {
resolve() resolve();
}, ms) }, ms);
}) });
} }
async function initGreeter() { async function initGreeter() {
if (greeter_config.greeter.debug_mode) { if (greeter_config.greeter.debug_mode) {
//debug = new Debug() //debug = new Debug()
} }
lightdm.authentication_complete?.connect(() => authentication_done()) lightdm.authentication_complete?.connect(() => authentication_done());
lightdm.brightness_update?.connect(() => brightness._updateData());
lightdm.brightness_update?.connect(() => brightness._updateData()) lightdm.battery_update?.connect(() => battery._updateData());
lightdm.battery_update?.connect(() => battery._updateData()) accounts = new Accounts();
accounts = new Accounts() sessions = new Sessions();
sessions = new Sessions() authenticate = new Authenticate();
authenticate = new Authenticate() time_date = new TimeDate();
time_date = new TimeDate() layouts = new Layouts();
layouts = new Layouts() power = new Power();
power = new Power() battery = new Battery();
battery = new Battery() brightness = new Brightness();
brightness = new Brightness()
var lock = lightdm.lock_hint var lock = lightdm.lock_hint;
if (lock) { if (lock) {
document.querySelector("#lock-label").classList.remove("hide") document.querySelector("#lock-label").classList.remove("hide");
} }
} }
const notGreeter = false const notGreeter = false;
if (window._ready_event === undefined) { if (window._ready_event === undefined) {
_ready_event = new Event("GreeterReady") _ready_event = new Event("GreeterReady");
window.dispatchEvent(_ready_event) window.dispatchEvent(_ready_event);
} }
window.addEventListener("GreeterReady", initGreeter) window.addEventListener("GreeterReady", initGreeter);

144
themes/gruvbox/js/layouts.js vendored

@ -1,77 +1,85 @@
class Layouts { class Layouts {
constructor() { constructor() {
this._layoutList = document.querySelector("#layouts-list") this._layoutList = document.querySelector("#layouts-list");
this._dropdown = document.querySelector("#layouts-dropdown") this._dropdown = document.querySelector("#layouts-dropdown");
this._button = document.querySelector("#layouts-button") this._button = document.querySelector("#layouts-button");
this._layouts = [] this._layouts = [];
this.layout = {} this.layout = {};
this._init() this._init();
} }
_setDefault() { _setDefault() {
let name = this.layout.name let name = this.layout.name;
let description = this.layout.description let description = this.layout.description;
let short = this.layout.short_description let short = this.layout.short_description;
this._button.innerHTML = name.toUpperCase() + (short ? ` (${short})` : "") this._button.innerHTML = name.toUpperCase() + (short ? ` (${short})` : "");
//this._button.name = description //this._button.name = description
} }
_setLayoutList() { _setLayoutList() {
let dropdown = this._dropdown let dropdown = this._dropdown;
dropdown.innerHTML = "" dropdown.innerHTML = "";
for (let i = 0; i < this._layouts.length; i++) { for (let i = 0; i < this._layouts.length; i++) {
let name = this._layouts[i].name let name = this._layouts[i].name;
let description = this._layouts[i].description let description = this._layouts[i].description;
let short = this._layouts[i].short_description let short = this._layouts[i].short_description;
let li = document.createElement("li") let li = document.createElement("li");
let button = document.createElement("button") let button = document.createElement("button");
button.innerHTML = name + (short ? ` (${short})` : "") button.innerHTML = name + (short ? ` (${short})` : "");
button.name = description button.name = description;
button.addEventListener("click", () => { button.addEventListener("click", () => {
this.layout = this._layouts[i] this.layout = this._layouts[i];
this._setDefault() this._setDefault();
lightdm.layout = this.layout lightdm.layout = this.layout;
}) });
li.appendChild(button) li.appendChild(button);
dropdown.appendChild(li) dropdown.appendChild(li);
} }
} }
_setKeydown() { _setKeydown() {
let dropdown = this._dropdown let dropdown = this._dropdown;
dropdown.addEventListener("keydown", (ev) => { dropdown.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
this._button.focus() this._button.focus();
} }
}) });
} }
_setButton() { _setButton() {
let dropdown = this._dropdown let dropdown = this._dropdown;
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._button || ev.target.parentElement == this._button) { if (
dropdown.classList.toggle("hide") ev.target == this._button ||
} else ev.target.parentElement == this._button
if (ev.target != dropdown && ev.target.closest(".dropdown") == null) { ) {
dropdown.classList.add("hide") dropdown.classList.toggle("hide");
} } else if (
}) ev.target != dropdown &&
document.querySelector("#screen").addEventListener("focusin", (ev) => { ev.target.closest(".dropdown") == null
if (!dropdown.contains(document.activeElement) && document.activeElement != this._button) { ) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
} }
}) });
} document.querySelector("#screen").addEventListener("focusin", (ev) => {
if (
!dropdown.contains(document.activeElement) &&
document.activeElement != this._button
) {
dropdown.classList.add("hide");
}
});
}
_init() { _init() {
this.layout = lightdm.layout this.layout = lightdm.layout;
this._layouts = greeter_config.layouts this._layouts = greeter_config.layouts;
this._setDefault() this._setDefault();
this._setLayoutList() this._setLayoutList();
this._setButton() this._setButton();
this._setKeydown() this._setKeydown();
} }
} }

98
themes/gruvbox/js/power.js vendored

@ -1,89 +1,89 @@
class Power { class Power {
constructor() { constructor() {
this._shutdown = document.querySelector("#shutdown-btn") this._shutdown = document.querySelector("#shutdown-btn");
this._restart = document.querySelector("#restart-btn") this._restart = document.querySelector("#restart-btn");
this._hibernate = document.querySelector("#hibernate-btn") this._hibernate = document.querySelector("#hibernate-btn");
this._suspend = document.querySelector("#suspend-btn") this._suspend = document.querySelector("#suspend-btn");
this._cover = document.querySelector("#cover") this._cover = document.querySelector("#cover");
this._covermsg = document.querySelector("#cover > #message") this._covermsg = document.querySelector("#cover > #message");
this._init() this._init();
} }
_show_message(text) { _show_message(text) {
this._covermsg.innerHTML = text this._covermsg.innerHTML = text;
this._cover.classList.remove("hide") this._cover.classList.remove("hide");
wait(500).then(() => { wait(500).then(() => {
this._cover.focus() this._cover.focus();
}) });
} }
async _do_shutdown() { async _do_shutdown() {
this._show_message("Shutting down") this._show_message("Shutting down");
await wait(1000) await wait(1000);
lightdm.shutdown() lightdm.shutdown();
} }
async _do_restart() { async _do_restart() {
this._show_message("Restarting") this._show_message("Restarting");
await wait(1000) await wait(1000);
lightdm.restart() lightdm.restart();
} }
async _do_hibernate() { async _do_hibernate() {
this._show_message("Hibernating") this._show_message("Hibernating");
await wait(1000) await wait(1000);
lightdm.hibernate() lightdm.hibernate();
} }
async _do_suspend() { async _do_suspend() {
this._show_message("Suspending") this._show_message("Suspending");
await wait(1000) await wait(1000);
lightdm.suspend() lightdm.suspend();
} }
_setShutdown() { _setShutdown() {
if (!lightdm.can_shutdown) return if (!lightdm.can_shutdown) return;
this._shutdown.addEventListener("click", () => { this._shutdown.addEventListener("click", () => {
this._do_shutdown() this._do_shutdown();
}) });
this._shutdown.classList.remove("hide") this._shutdown.classList.remove("hide");
} }
_setRestart() { _setRestart() {
if (!lightdm.can_restart) return if (!lightdm.can_restart) return;
this._restart.addEventListener("click", () => { this._restart.addEventListener("click", () => {
this._do_restart() this._do_restart();
}) });
this._restart.classList.remove("hide") this._restart.classList.remove("hide");
} }
_setHibernate() { _setHibernate() {
if (!lightdm.can_hibernate) return if (!lightdm.can_hibernate) return;
this._hibernate.addEventListener("click", () => { this._hibernate.addEventListener("click", () => {
this._do_hibernate() this._do_hibernate();
}) });
this._hibernate.classList.remove("hide") this._hibernate.classList.remove("hide");
} }
_setSuspend() { _setSuspend() {
if (!lightdm.can_suspend) return if (!lightdm.can_suspend) return;
this._suspend.addEventListener("click", () => { this._suspend.addEventListener("click", () => {
this._do_suspend() this._do_suspend();
}) });
this._suspend.classList.remove("hide") this._suspend.classList.remove("hide");
} }
_setCover() { _setCover() {
this._cover.addEventListener("click", () => { this._cover.addEventListener("click", () => {
this._cover.classList.add("hide") this._cover.classList.add("hide");
}) });
this._cover.addEventListener("keydown", () => { this._cover.addEventListener("keydown", () => {
this._cover.classList.add("hide") this._cover.classList.add("hide");
}) });
} }
_setButtons() { _setButtons() {
this._setShutdown() this._setShutdown();
this._setRestart() this._setRestart();
this._setHibernate() this._setHibernate();
this._setSuspend() this._setSuspend();
this._setCover() this._setCover();
} }
_init() { _init() {
this._setButtons() this._setButtons();
} }
} }

130
themes/gruvbox/js/sessions.js vendored

@ -1,94 +1,106 @@
class Sessions { class Sessions {
constructor() { constructor() {
this._localStorage = window.localStorage this._localStorage = window.localStorage;
this._sessionLabel = document.querySelector("#session-label") this._sessionLabel = document.querySelector("#session-label");
this._sessionList = document.querySelector("#sessions-list") this._sessionList = document.querySelector("#sessions-list");
this._sessionsButton = document.querySelector("#sessions-button") this._sessionsButton = document.querySelector("#sessions-button");
this._defaultSession = null this._defaultSession = null;
this._sessionsObject = null this._sessionsObject = null;
this._init() this._init();
} }
getDefaultSession() { getDefaultSession() {
return this._defaultSession.key return this._defaultSession.key;
} }
_setSessionDefault() { _setSessionDefault() {
this._sessionLabel.innerHTML = `<b>${this._defaultSession.name}</b>` this._sessionLabel.innerHTML = `<b>${this._defaultSession.name}</b>`;
} }
_updateOnStartup() { _updateOnStartup() {
var session_key = this._localStorage.getItem("defaultSession") || this._sessionsObject[0].key || lightdm.default_session var session_key =
this._localStorage.getItem("defaultSession") ||
this._sessionsObject[0].key ||
lightdm.default_session;
var defaultSession = this._sessionsObject.find(el => el.key == session_key) var defaultSession = this._sessionsObject.find(
(el) => el.key == session_key
);
var session_name = defaultSession ? defaultSession.name : "awesome wm" var session_name = defaultSession ? defaultSession.name : "awesome wm";
session_key = defaultSession ? defaultSession.key : "awesome" session_key = defaultSession ? defaultSession.key : "awesome";
this._defaultSession = { this._defaultSession = {
key: session_key, key: session_key,
name: session_name name: session_name,
} };
this._setSessionDefault() this._setSessionDefault();
} }
_setSessionList() { _setSessionList() {
var dropdown = this._sessionList.querySelector(".dropdown") var dropdown = this._sessionList.querySelector(".dropdown");
dropdown.innerHTML = "" dropdown.innerHTML = "";
for (let i = 0; i < this._sessionsObject.length; i++) { for (let i = 0; i < this._sessionsObject.length; i++) {
var name = this._sessionsObject[i].name var name = this._sessionsObject[i].name;
var li = document.createElement("li") var li = document.createElement("li");
var button = document.createElement("button") var button = document.createElement("button");
button.innerHTML = name button.innerHTML = name;
button.addEventListener("click", () => { button.addEventListener("click", () => {
this._updateDefaults(this._sessionsObject[i]) this._updateDefaults(this._sessionsObject[i]);
this._setSessionDefault() this._setSessionDefault();
}) });
li.appendChild(button) li.appendChild(button);
dropdown.appendChild(li) dropdown.appendChild(li);
} }
} }
_setKeydown() { _setKeydown() {
var dropdown = this._sessionList.querySelector(".dropdown") var dropdown = this._sessionList.querySelector(".dropdown");
dropdown.addEventListener("keydown", (ev) => { dropdown.addEventListener("keydown", (ev) => {
if (ev.keyCode == 27) { if (ev.keyCode == 27) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
this._sessionsButton.focus() this._sessionsButton.focus();
} }
}) });
} }
_setButton() { _setButton() {
var dropdown = this._sessionList.querySelector(".dropdown") var dropdown = this._sessionList.querySelector(".dropdown");
document.querySelector("#screen").addEventListener("click", (ev) => { document.querySelector("#screen").addEventListener("click", (ev) => {
if (ev.target == this._sessionsButton || ev.target.parentElement == this._sessionsButton) { if (
dropdown.classList.toggle("hide") ev.target == this._sessionsButton ||
} else ev.target.parentElement == this._sessionsButton
if (ev.target != dropdown && ev.target.closest(".dropdown") == null) { ) {
dropdown.classList.add("hide") dropdown.classList.toggle("hide");
} } else if (
}) ev.target != dropdown &&
document.querySelector("#screen").addEventListener("focusin", (ev) => { ev.target.closest(".dropdown") == null
if (!dropdown.contains(document.activeElement) && document.activeElement != this._sessionsButton) { ) {
dropdown.classList.add("hide") dropdown.classList.add("hide");
} }
}) });
document.querySelector("#screen").addEventListener("focusin", (ev) => {
if (
!dropdown.contains(document.activeElement) &&
document.activeElement != this._sessionsButton
) {
dropdown.classList.add("hide");
}
});
} }
_updateDefaults(sessionObj) { _updateDefaults(sessionObj) {
if (!sessionObj) return if (!sessionObj) return;
this._defaultSession = sessionObj this._defaultSession = sessionObj;
this._localStorage.setItem("defaultSession", this._defaultSession.key) this._localStorage.setItem("defaultSession", this._defaultSession.key);
} }
_init() { _init() {
this._sessionsObject = lightdm.sessions this._sessionsObject = lightdm.sessions;
this._updateOnStartup() this._updateOnStartup();
this._setSessionList() this._setSessionList();
this._setButton() this._setButton();
this._setKeydown() this._setKeydown();
} }
} }

42
themes/gruvbox/js/time-date.js vendored

@ -1,26 +1,26 @@
class TimeDate { class TimeDate {
constructor() { constructor() {
this._timeLabel = document.querySelector("#time-date #time-label") this._timeLabel = document.querySelector("#time-date #time-label");
this._dateLabel = document.querySelector("#time-date #date-label") this._dateLabel = document.querySelector("#time-date #date-label");
this._init() this._init();
} }
_updateTimeDate() { _updateTimeDate() {
let date = theme_utils.get_current_localized_date() let date = theme_utils.get_current_localized_date();
let time = theme_utils.get_current_localized_time() let time = theme_utils.get_current_localized_time();
this._dateLabel.innerText = date this._dateLabel.innerText = date;
this._timeLabel.innerText = time this._timeLabel.innerText = time;
} }
_setTimer() { _setTimer() {
this._updateTimeDate() this._updateTimeDate();
setInterval(() => { setInterval(() => {
this._updateTimeDate() this._updateTimeDate();
}, 1000) }, 1000);
} }
_init() { _init() {
this._setTimer() this._setTimer();
} }
} }

Loading…
Cancel
Save