<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
  <link rel="apple-touch-icon" href="/pwa-__DIST_ICON_SUFFIX__-512x512.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
  <meta name="format-detection" content="telephone=no, email=no, address=no" />
  <title>NodeAuth - A Secure 2FA Management Tool.</title>
  <meta name="description" content="NodeAuth is a secure, self-hosted 2FA management tool." />
  <meta name="keywords" content="nodeauth, 2fa, 2fauth, 2fa manager, totp, hotp, passkey, self-hosted, security" />
  <meta name="author" content="NodeAuth" />
  <meta property="og:type" content="website" />
  <meta property="og:url" content="https://nodeauth.io/" />
  <meta property="og:title" content="NodeAuth - Secure 2FA Management Tool" />
  <meta property="og:description" content="NodeAuth is a secure, self-hosted 2FA management tool and authenticator." />
  <meta property="og:site_name" content="NodeAuth" />

  <script>
    (function () {
      try {
        const savedTheme = localStorage.getItem('app_theme_mode')
        const systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches
        const isDark = savedTheme ? (savedTheme === 'dark') : systemDark

        if (isDark) {
          document.documentElement.classList.add('dark')
          document.documentElement.style.backgroundColor = '#121212'
        } else {
          document.documentElement.classList.remove('dark')
          document.documentElement.style.backgroundColor = '#f5f7fa'
        }
      } catch (e) { }
    })()
  </script>

  <style>
    :root {
      --bg-color: #f5f7fa;
      --logo-shadow-color: rgba(63, 159, 255, 0.3);
      color-scheme: light dark;
    }

    /* 🛡️ 架构师优化：增加媒体查询兜底，消除 JS 执行前的“白色闪烁” */
    @media (prefers-color-scheme: dark) {
      :root {
        --bg-color: #121212;
        --logo-shadow-color: rgba(0, 0, 0, 0.5);
      }
    }

    /* 确保 html.dark 类能强制覆盖媒体查询（当用户手动切换主题时） */
    html.dark {
      --bg-color: #121212;
      --logo-shadow-color: rgba(0, 0, 0, 0.5);
    }

    html.light {
      --bg-color: #f5f7fa;
      --logo-shadow-color: rgba(63, 159, 255, 0.3);
    }

    html,
    body {
      margin: 0;
      padding: 0;
      background-color: var(--bg-color);
      overflow: hidden;
      height: 100%;
      width: 100%;
    }

    .splash-logo-container {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      background-color: var(--bg-color);
      z-index: 9999;
      animation: splash-pulse 2s ease-in-out infinite;
      padding-bottom: 8dvh;
      box-sizing: border-box;
    }

    .splash-logo {
      width: 72px;
      height: 72px;
      filter: drop-shadow(0 0 12px var(--logo-shadow-color));
    }

    @keyframes splash-pulse {

      0%,
      100% {
        transform: scale(1);
        opacity: 0.6;
      }

      50% {
        transform: scale(1.08);
        opacity: 1;
      }
    }
  </style>
  <script type="module" crossorigin src="/assets/index-ByZhGvIT.js"></script>
  <link rel="modulepreload" crossorigin href="/assets/compression-utils-BzBbrBKd.js">
  <link rel="modulepreload" crossorigin href="/assets/pdf-utils-D3SLYqmy.js">
  <link rel="modulepreload" crossorigin href="/assets/vue-core-DHcoxuim.js">
  <link rel="modulepreload" crossorigin href="/assets/element-plus-BHS6vjDl.js">
  <link rel="modulepreload" crossorigin href="/assets/simplewebauthn-3qpiAaRi.js">
  <link rel="modulepreload" crossorigin href="/assets/tanstack-query-CY07rioj.js">
  <link rel="stylesheet" crossorigin href="/assets/element-plus-CqJ-3YyC.css">
  <link rel="stylesheet" crossorigin href="/assets/index-DzR9Uw-u.css">
<link rel="manifest" href="/manifest.webmanifest"></head>

<body>
  <div id="app">
    <noscript>
      <div
        style="padding: 20px; text-align: center; font-family: sans-serif; background: #fff; color: #333; position: absolute; z-index: 99999; width: 100%; height: 100%;">
        <h1>NodeAuth - A Secure 2FA Management Tool</h1>
        <p>Your browser does not support JavaScript, or it is disabled. Please enable JavaScript to use NodeAuth.</p>
        <p>Learn more at our official documentation:</p>
        <a href="https://wiki.nodeauth.io" style="color: #3f9fff; text-decoration: underline;">NodeAuth Wiki &
          Documentation</a>
      </div>
    </noscript>

    <div class="splash-logo-container">
      <svg class="splash-logo" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
        <g fill="none" fill-rule="evenodd">
          <path
            d="M727.786 812.49c31.45-30.81 60.182-63.298 83.695-99.63 18.633-28.792 34.86-59.312 50.03-90.113 10.489-21.298 18.294-44.08 25.536-66.762 5.547-17.38 8.81-35.552 12.228-53.534 3.773-19.85 6.628-39.878 9.732-59.852.708-4.558 1.11-9.211 1.124-13.822.327-103.48.353-206.96.994-310.439.177-28.656-15.314-34.942-35.529-34.774-44.788.37-89.581.071-134.372.132-30.579.042-49.67 19.073-49.674 49.668-.027 168.043-.026 336.086.108 504.128.008 10.818-2.399 20-10.175 28.13-11.989 12.535-36.138 15.843-49.725.609-14.777-16.57-28.69-33.934-42.526-51.312-15.453-19.41-30.453-39.182-45.548-58.875-19.108-24.928-38.07-49.968-57.176-74.896-13.444-17.538-27.024-34.97-40.546-52.449-15.766-20.382-31.604-40.709-47.228-61.2-2.48-3.252-4-7.238-5.964-10.885l-5.128 3.533c.605 8.049 1.188 16.102 1.825 24.15.264 3.35.922 6.691.923 10.037.038 118.928.16 237.856-.114 356.782-.052 22.415.283 45.14-3.18 67.151-3.647 23.17-18.438 40.835-40.004 50.494-30.182 13.516-57.769 7.584-82.35-14.423-40.838-36.564-75.218-78.303-104.474-124.706-20.145-31.951-38.93-64.567-52.83-99.557-10.793-27.175-18.799-55.489-27.4-83.495-8.248-26.853-13.382-54.39-15.162-82.47-1.715-27.022-4.325-54.043-4.636-81.086-.99-85.84-1.406-171.69-1.383-257.536.013-37.007 11.576-69.083 47.123-86.62 10.65-5.253 23.415-8.267 35.31-8.586 42.91-1.152 85.863-.749 128.8-.873 113.976-.333 227.95-.634 341.924-.945 3.909-.011 7.818-.002 12.408-.002-8.117 12.669-15.552 24.15-22.836 35.726-2.052 3.261-4.855 6.67-5.247 10.238-1.082 9.847-7.541 9.306-14.658 9.317-144.563.228-289.128.561-433.69.908-3.689.007-7.499-.112-11.041.724-17.946 4.236-22.388 8.7-22.845 31.97-1.042 53.11-.353 106.255-.219 159.386.094 37.37-.335 74.765.908 112.1.983 29.506 2.236 59.242 6.823 88.332 6.281 39.841 14.791 79.464 31.8 116.549 12.314 26.847 22.89 54.722 37.663 80.152 16.474 28.36 35.741 55.304 55.822 81.297 15.863 20.532 34.501 38.976 52.478 57.8 10.614 11.113 25.66 11.112 31.229.113 3.175-6.273 4.4-14.12 4.462-21.277.24-28.092-.415-56.191-.548-84.288-.044-9.561.743-19.126.69-28.687-.67-119.718-1.5-239.436-2.024-359.156-.046-10.356-.017-21.348 3.315-30.876 2.528-7.232 9.285-14.427 16.056-18.452 17.197-10.222 33.866-5.32 46.469 10.713 16.666 21.197 34.154 41.75 50.752 63 19.356 24.783 37.985 50.133 57.205 75.022 14.791 19.153 30.161 37.858 45.001 56.973 19.628 25.28 38.964 50.786 58.48 76.154 7.855 10.213 15.853 20.317 25.038 32.074.33-51.86.802-9.155.803-13.127.047-146.727-.577-293.46.457-440.181.298-42.321 20.17-75.558 60.272-92.85 13.497-5.82 29.118-8.856 43.868-9.23 45.688-1.158 91.427-.71 137.14-.335 39.033.322 67.291 17.99 82.493 54.455 2.99 7.174 5.013 15.352 5.026 23.071.189 109.347.539 218.7-.646 328.034-.253 23.324-5.787 46.709-10.105 69.838-4.406 23.59-9.33 47.176-15.784 70.273-10.344 37.028-26.207 71.947-43.684 106.154-21.413 41.907-48.346 80.114-78.096 116.343-29.44 35.853-63.393 67.178-99.94 95.675-40.794 31.81-84.748 58.52-131.861 79.85-17.225 7.798-34.828 14.971-52.749 20.961-16.644 5.563-33.545 2.58-49.638-3.567-43.992-16.807-86.131-37.402-125.786-62.897-2.528-1.624-4.271-4.466-6.38-6.741 2.574-1.21 5.233-2.269 7.707-3.658 10.84-6.084 22.482-11.169 32.166-18.749 8.067-6.313 14.21-7.173 22.626-1.776 26.808 17.196 55.542 30.477 85.474 41.325 12.783 4.635 25.297 3.254 36.728-2.392 32.756-16.18 65.62-32.295 97.368-50.328 34.467-19.579 64.563-45.435 94.823-71.93"
            stroke="#3f9fff" stroke-width="15" fill="#3f9fff" fill-rule="nonzero" stroke-linecap="round"
            stroke-linejoin="round" />
        </g>
      </svg>
    </div>
  </div>
</body>

</html>