1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
import AccountsService from "gi://AccountsService?version=1.0"
import GLib from "gi://GLib?version=2.0"
import icons from "lib/icons"
const { iconFile, realName, userName } = AccountsService.UserManager
.get_default().list_users()[0]
const loggingin = Variable(false)
const CMD = GLib.getenv("ASZTAL_DM_CMD")
|| "Hyprland"
const ENV = GLib.getenv("ASZTAL_DM_ENV")
|| "WLR_NO_HARDWARE_CURSORS=1 _JAVA_AWT_WM_NONREPARENTING=1"
async function login(pw: string) {
loggingin.value = true
const greetd = await Service.import("greetd")
return greetd.login(userName, pw, CMD, ENV.split(/\s+/))
.catch(res => {
loggingin.value = false
response.label = res?.description || JSON.stringify(res)
password.text = ""
revealer.reveal_child = true
})
}
const avatar = Widget.Box({
class_name: "avatar",
hpack: "center",
css: `background-image: url('${iconFile}')`,
})
const password = Widget.Entry({
placeholder_text: "Password",
hexpand: true,
visibility: false,
on_accept: ({ text }) => { login(text || "") },
})
const response = Widget.Label({
class_name: "response",
wrap: true,
max_width_chars: 35,
hpack: "center",
hexpand: true,
xalign: .5,
})
const revealer = Widget.Revealer({
transition: "slide_down",
child: response,
})
export default Widget.Box({
class_name: "auth",
attribute: { password },
vertical: true,
children: [
Widget.Overlay({
child: Widget.Box(
{
css: "min-width: 200px; min-height: 200px;",
vertical: true,
},
Widget.Box({
class_name: "wallpaper",
css: `background-image: url('${WALLPAPER}')`,
}),
Widget.Box({
class_name: "wallpaper-contrast",
vexpand: true,
}),
),
overlay: Widget.Box(
{
vpack: "end",
vertical: true,
},
avatar,
Widget.Box({
hpack: "center",
children: [
Widget.Icon(icons.ui.avatar),
Widget.Label(realName || userName),
],
}),
Widget.Box(
{
class_name: "password",
},
Widget.Spinner({
visible: loggingin.bind(),
active: true,
}),
Widget.Icon({
visible: loggingin.bind().as(b => !b),
icon: icons.ui.lock,
}),
password,
),
),
}),
Widget.Box(
{ class_name: "response-box" },
revealer,
),
],
})
|