esp-wifi-provisioning 0.1.1

Captive-portal WiFi provisioning for ESP32 targets via esp-idf-svc
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <title>WiFi Setup</title>
    <link rel="stylesheet" href="style.css" />
</head>

<body>
    <div class="card">
        <h1>WiFi Setup</h1>
        <div id="last-error" class="last-error" hidden>
            <span class="last-error-icon" aria-hidden="true"></span>
            <span id="last-error-msg"></span>
        </div>
        <div class="networks-header">
            <span class="networks-label">Available networks</span>
            <button type="button" id="rescan-btn" class="rescan-btn" aria-label="Rescan for networks">
                ↺ Rescan
            </button>
        </div>
        <div class="networks-scroll-wrap">
            <div class="networks" id="networks" role="listbox" aria-label="Available WiFi networks" tabindex="-1"
                aria-activedescendant=""></div>
        </div>
        <div id="network-announce" aria-live="polite" class="visually-hidden"></div>
        <form id="wifi-form">
            <div>
                <label for="ssid">Network name (SSID)</label>
                <input id="ssid" type="text" placeholder="e.g. MyHomeNetwork" autocomplete="off" autocorrect="off"
                    spellcheck="false" aria-describedby="ssid-hint status" />
                <span id="ssid-hint" class="pass-hint" aria-live="polite"></span>
                <label for="pass">Password</label>
                <div class="pass-wrap">
                    <input id="pass" type="password" placeholder="Leave blank for open networks"
                        autocomplete="current-password" minlength="8" aria-describedby="pass-hint status" />
                    <button type="button" id="toggle-pass" class="eye-btn" aria-label="Show password"
                        aria-pressed="false">
                        <span class="eye-icon">👁</span>
                    </button>
                </div>
                <span id="pass-hint" class="pass-hint" aria-live="polite"></span>
            </div>
            <div class="spinner" id="spinner"></div>
            <button class="btn" id="btn" type="submit">Connect</button>
        </form>
        <div id="status" aria-live="polite"></div>
    </div>
    <script src="app.js"></script>
</body>

</html>