Complete rewrite of the Wayland lockscreen from Python/PyGObject to Rust/gtk4-rs for memory safety in security-critical PAM code and consistency with the moonset/moongreet Rust ecosystem. Modules: main, lockscreen, auth (PAM FFI), fingerprint (fprintd D-Bus), config, i18n, users, power. 37 unit tests. Security: PAM conversation callback with Zeroizing password, panic hook that never unlocks, root check, ext-session-lock-v1 compositor policy, absolute loginctl path, avatar symlink rejection.
115 lines
2.1 KiB
CSS
115 lines
2.1 KiB
CSS
/* ABOUTME: GTK4 CSS stylesheet for the Moonlock lockscreen. */
|
|
/* ABOUTME: Dark theme styling matching the Moonarch ecosystem. */
|
|
|
|
/* Main window background */
|
|
window.lockscreen {
|
|
background-color: #1a1a2e;
|
|
background-size: cover;
|
|
background-position: center;
|
|
opacity: 0;
|
|
transition: opacity 350ms ease-in;
|
|
}
|
|
|
|
window.lockscreen.visible {
|
|
opacity: 1;
|
|
}
|
|
|
|
/* Central login area */
|
|
.login-box {
|
|
padding: 40px;
|
|
border-radius: 12px;
|
|
background-color: transparent;
|
|
}
|
|
|
|
/* Round avatar image */
|
|
.avatar {
|
|
border-radius: 50%;
|
|
min-width: 128px;
|
|
min-height: 128px;
|
|
background-color: @theme_selected_bg_color;
|
|
border: 3px solid alpha(white, 0.3);
|
|
}
|
|
|
|
/* Username label */
|
|
.username-label {
|
|
font-size: 24px;
|
|
font-weight: bold;
|
|
color: white;
|
|
margin-top: 12px;
|
|
margin-bottom: 40px;
|
|
}
|
|
|
|
/* Password entry field */
|
|
.password-entry {
|
|
min-width: 280px;
|
|
}
|
|
|
|
/* Error message label */
|
|
.error-label {
|
|
color: #ff6b6b;
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* Fingerprint status indicator */
|
|
.fingerprint-label {
|
|
color: alpha(white, 0.6);
|
|
font-size: 13px;
|
|
margin-top: 8px;
|
|
}
|
|
|
|
.fingerprint-label.success {
|
|
color: #51cf66;
|
|
}
|
|
|
|
.fingerprint-label.failed {
|
|
color: #ff6b6b;
|
|
}
|
|
|
|
/* Confirmation prompt */
|
|
.confirm-label {
|
|
font-size: 16px;
|
|
color: white;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.confirm-yes {
|
|
padding: 8px 24px;
|
|
border-radius: 8px;
|
|
background-color: @error_color;
|
|
color: @theme_bg_color;
|
|
border: none;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.confirm-yes:hover {
|
|
background-color: lighter(@error_color);
|
|
}
|
|
|
|
.confirm-no {
|
|
padding: 8px 24px;
|
|
border-radius: 8px;
|
|
background-color: @theme_unfocused_bg_color;
|
|
color: @theme_fg_color;
|
|
border: none;
|
|
}
|
|
|
|
.confirm-no:hover {
|
|
background-color: @theme_selected_bg_color;
|
|
}
|
|
|
|
/* Power buttons on the bottom right */
|
|
.power-button {
|
|
min-width: 48px;
|
|
min-height: 48px;
|
|
padding: 0px;
|
|
border-radius: 24px;
|
|
background-color: alpha(white, 0.1);
|
|
color: white;
|
|
border: none;
|
|
margin: 4px;
|
|
}
|
|
|
|
.power-button:hover {
|
|
background-color: alpha(white, 0.25);
|
|
}
|