feat: merge upstream master - version 4.94

Merge upstream PiKVM master branch updates:

- Bump version from 4.93 to 4.94
- HID: improved jiggler pattern for better compatibility
- Streamer: major refactoring for improved performance and maintainability
- Prometheus: tidying GPIO channel name formatting
- Web: added __gpio-label class for custom styling
- HID: customizable /api/hid/print delay configuration
- ATX: independent power/reset regions for better control
- OLED: added --fill option for display testing
- Web: improved keyboard handling in modal dialogs
- Web: enhanced login error messages
- Switch: added heartbeat functionality
- Web: mouse touch code simplification and refactoring
- Configs: use systemd-networkd-wait-online --any by default
- PKGBUILD: use cp -r to install systemd units properly
- Various bug fixes and performance improvements
This commit is contained in:
mofeng-git
2025-08-21 11:21:41 +08:00
205 changed files with 9359 additions and 4653 deletions

View File

@@ -27,23 +27,26 @@
<head>
<meta charset="utf-8">
<title>One-KVM Login</title>
<link rel="apple-touch-icon" sizes="180x180" href="/share/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/share/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/share/favicon-16x16.png">
<link rel="manifest" href="/share/site.webmanifest">
<link rel="mask-icon" href="/share/safari-pinned-tab.svg" color="#5bbad5">
<link rel="apple-touch-icon" sizes="180x180" href="../share/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="../share/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="../share/favicon-16x16.png">
<link rel="manifest" href="../share/site.webmanifest">
<link rel="mask-icon" href="../share/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#2b5797">
<meta name="theme-color" content="#ffffff">
<link rel="stylesheet" href="/share/css/vars.css">
<link rel="stylesheet" href="/share/css/main.css">
<link rel="stylesheet" href="/share/css/window.css">
<link rel="stylesheet" href="/share/css/modal.css">
<link rel="stylesheet" href="/share/css/login/login.css">
<link rel="stylesheet" href="/share/css/user.css">
<script src="/share/js/i18n/jquery-3.7.1.min.js"></script>
<script src="/share/js/i18n/jquery.i18n.min.js"></script>
<script src="/share/js/i18n/i18n.js"></script>
<script type="module">import {main} from "/share/js/login/main.js";
<link rel="stylesheet" href="../share/css/vars.css">
<link rel="stylesheet" href="../share/css/main.css">
<link rel="stylesheet" href="../share/css/window.css">
<link rel="stylesheet" href="../share/css/modal.css">
<link rel="stylesheet" href="../share/css/radio.css">
<link rel="stylesheet" href="../share/css/login/login.css">
<link rel="stylesheet" href="../share/css/user.css">
<script src="../share/js/i18n/jquery-3.7.1.min.js"></script>
<script src="../share/js/i18n/jquery.i18n.min.js"></script>
<script src="../share/js/i18n/i18n.js"></script>
<script type="module">import {setRootPrefix} from "../share/js/vars.js";
setRootPrefix("../");
import {main} from "../share/js/login/main.js";
main();
</script>
</head>
@@ -52,22 +55,49 @@
<div id="login-box">
<div id="login">
<table>
<tr>
<td><img class="svg-gray" id="login-logo" src="../share/svg/logo.svg" alt="&amp;pi;-kvm"></td>
<td></td>
</tr>
<tr>
<td colspan="2">
<hr>
</td>
</tr>
<tr>
<td i18n="username">Username:&nbsp;</td>
<td>
<input type="text" id="user-input" autocapitalize="off">
<input id="user-input" type="text" autocapitalize="off">
</td>
</tr>
<tr>
<td i18n="password">Password:&nbsp;</td>
<td>
<input type="password" id="passwd-input" autocapitalize="off">
<input id="passwd-input" type="password" autocapitalize="off">
</td>
</tr>
<tr>
<td i18n="2fa_code">2FA code:&nbsp;</td>
<td>
<input type="text" id="code-input" placeholder="if enabled" i18n="if_enabled">
<input id="code-input" type="text" placeholder="if enabled" autocomplete="off" i18n="if_enabled">
</td>
</tr>
<tr>
<td colspan="2">
<hr>
</td>
</tr>
<tr>
<td><a target="_blank" href="https://docs.pikvm.org/auth/#session-expiration">Remember me</a>:&nbsp;</td>
<td>
<div class="radio-box">
<input type="radio" id="expire-radio-3600" name="expire-radio" value="3600"/>
<label for="expire-radio-3600">1h</label>
<input type="radio" id="expire-radio-43200" name="expire-radio" value="43200"/>
<label for="expire-radio-43200">12h</label>
<input type="radio" id="expire-radio-0" name="expire-radio" value="0" checked="checked"/>
<label for="expire-radio-0">Forever</label>
</div>
</td>
</tr>
<tr>