<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>宝尼佳人脉 - 管理后台</title>
    <!-- 微信/企微分享默认封面（会被 BrandSync 动态覆盖为当前门店 logo / 用户头像） -->
    <meta property="og:title" content="宝尼佳人脉 - 管理后台" />
    <meta property="og:description" content="宝尼佳人脉服务管理后台" />
    <meta property="og:image" content="http://gzmayibj.cn/default-studio-logo.png" />
    <link
      rel="icon"
      type="image/svg+xml"
      href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📷</text></svg>"
    />
    <style>
      :root {
        --preload-primary: #c9a96e;
        --preload-primary-dark: #9b7a3f;
        --preload-primary-light: #f4e7c9;
        --preload-bg: #050608;
        --preload-surface: rgba(255, 255, 255, 0.92);
        --preload-text: #1f2328;
        --preload-text-secondary: #667085;
        --preload-border: rgba(201, 169, 110, 0.28);
      }
      .pre-react {
        min-height: 100vh;
        padding: 36px;
        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
        color: var(--preload-text);
        background:
          radial-gradient(circle at 18% 16%, rgba(201, 169, 110, 0.22), transparent 30%),
          linear-gradient(135deg, #050608 0%, #101217 58%, #050608 100%);
        box-sizing: border-box;
      }
      .pre-react h2 {
        width: fit-content;
        margin: 0 0 14px;
        padding: 10px 14px;
        color: #fff;
        background: linear-gradient(135deg, var(--preload-primary), var(--preload-primary-dark));
        border: 1px solid rgba(255, 255, 255, 0.16);
        border-radius: 14px;
        box-shadow:
          0 18px 44px rgba(0, 0, 0, 0.28),
          0 8px 24px rgba(201, 169, 110, 0.18);
        letter-spacing: 1px;
      }
      .pre-react p {
        display: inline-flex;
        align-items: center;
        min-height: 32px;
        margin: 4px 0 14px;
        padding: 8px 12px;
        color: rgba(255, 255, 255, 0.82);
        background: rgba(255, 255, 255, 0.08);
        border: 1px solid rgba(255, 255, 255, 0.12);
        border-radius: 999px;
        backdrop-filter: blur(12px);
      }
      .pre-react button {
        display: block;
        margin-top: 8px;
        padding: 9px 18px;
        background: linear-gradient(135deg, var(--preload-primary), var(--preload-primary-dark));
        color: #fff;
        border: 1px solid rgba(255, 255, 255, 0.18);
        border-radius: 999px;
        cursor: pointer;
        font-weight: 700;
        box-shadow: 0 10px 26px rgba(201, 169, 110, 0.22);
      }
      .pre-react button:hover {
        filter: brightness(1.05);
        transform: translateY(-1px);
      }
      .err-box {
        margin-top: 18px;
        padding: 14px 16px;
        background: rgba(28, 6, 9, 0.82);
        border: 1px solid color-mix(in srgb, var(--preload-primary) 50%, #ff6b6b);
        border-left: 4px solid var(--preload-primary);
        border-radius: 14px;
        font-family: Consolas, ui-monospace, monospace;
        font-size: 12px;
        line-height: 1.6;
        white-space: pre-wrap;
        color: #ffd6d6;
        max-height: 70vh;
        overflow: auto;
        box-shadow: 0 16px 42px rgba(0, 0, 0, 0.24);
      }
    </style>
    <script>
      ;(function () {
        var themes = {
          'blue-classic': {
            primary: '#2563EB',
            dark: '#1D4ED8',
            light: '#DBEAFE',
            bg: '#07111F',
            border: 'rgba(37, 99, 235, 0.30)',
          },
          'blue-deep': {
            primary: '#0F4C81',
            dark: '#0B355D',
            light: '#D6E9F7',
            bg: '#06111C',
            border: 'rgba(15, 76, 129, 0.32)',
          },
          'green-fresh': {
            primary: '#16A34A',
            dark: '#15803D',
            light: '#DCFCE7',
            bg: '#06160C',
            border: 'rgba(22, 163, 74, 0.30)',
          },
          'green-forest': {
            primary: '#2F6B45',
            dark: '#245236',
            light: '#DDEBDD',
            bg: '#07140D',
            border: 'rgba(47, 107, 69, 0.34)',
          },
          black: {
            primary: '#111827',
            dark: '#030712',
            light: '#E5E7EB',
            bg: '#030406',
            border: 'rgba(17, 24, 39, 0.36)',
          },
          white: {
            primary: '#64748B',
            dark: '#475569',
            light: '#F8FAFC',
            bg: '#10141B',
            border: 'rgba(100, 116, 139, 0.32)',
          },
          gray: {
            primary: '#6B7280',
            dark: '#4B5563',
            light: '#E5E7EB',
            bg: '#0E1014',
            border: 'rgba(107, 114, 128, 0.32)',
          },
          gold: {
            primary: '#C9A96E',
            dark: '#9B7A3F',
            light: '#F4E7C9',
            bg: '#050608',
            border: 'rgba(201, 169, 110, 0.28)',
          },
          magenta: {
            primary: '#C026D3',
            dark: '#A21CAF',
            light: '#FAE8FF',
            bg: '#17051A',
            border: 'rgba(192, 38, 211, 0.30)',
          },
          'pink-sakura': {
            primary: '#EC4899',
            dark: '#DB2777',
            light: '#FCE7F3',
            bg: '#190711',
            border: 'rgba(236, 72, 153, 0.30)',
          },
          'pink-rose': {
            primary: '#E11D48',
            dark: '#BE123C',
            light: '#FFE4E9',
            bg: '#19070B',
            border: 'rgba(225, 29, 72, 0.30)',
          },
        }
        var saved = localStorage.getItem('admin_ui_theme') || 'gold'
        var theme = themes[saved] || themes.gold
        var root = document.documentElement
        root.setAttribute('data-theme', saved)
        root.style.setProperty('--preload-primary', theme.primary)
        root.style.setProperty('--preload-primary-dark', theme.dark)
        root.style.setProperty('--preload-primary-light', theme.light)
        root.style.setProperty('--preload-bg', theme.bg)
        root.style.setProperty('--preload-border', theme.border)
      })()
    </script>
    <script type="module" crossorigin src="/assets/index-CPlnfIW4.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/react-vendor-Ck9IDfsf.js">
    <link rel="modulepreload" crossorigin href="/assets/vendor-BwyBStx5.js">
    <link rel="stylesheet" crossorigin href="/assets/index-BfMrpFMQ.css">
  </head>
  <body>
    <div id="root">
      <div class="pre-react" id="pre-react-fallback">
        <h2>宝尼佳人脉 · 管理后台</h2>
        <p>正在加载 React 应用...</p>
        <button onclick="location.reload(true)">重新加载</button>
        <div id="err-list"></div>
      </div>
    </div>

    <!-- 早期错误捕获：必须先于 main.tsx 执行 -->
    <script>
      window.__errors = []
      function addErr(label, e) {
        var msg = '[' + label + '] '
        if (e && e.message) msg += e.message
        else msg += String(e)
        if (e && e.stack) msg += '\n' + e.stack
        if (e && e.filename) msg += '\nFile: ' + e.filename + ':' + e.lineno + ':' + e.colno
        window.__errors.push(msg)
        var box = document.getElementById('err-list')
        if (box) {
          var div = document.createElement('div')
          div.className = 'err-box'
          div.textContent = msg
          box.appendChild(div)
        }
        console.error(label, e)
      }
      window.addEventListener('error', function (e) {
        addErr('window.error', e.error || e.message)
      })
      window.addEventListener('unhandledrejection', function (e) {
        addErr('unhandledrejection', e.reason)
      })
      console.log('[index.html] bootstrap OK')
    </script>

    <!-- 代码包加载失败自动整刷兜底（2026-09-14）：
         发布空窗期旧 index.html 引用已消失的 chunk 时，页面会白屏/点击无响应。
         命中 chunk 加载失败特征时自动整页刷新一次（60 秒窗口防循环），
         刷新后拿到新 index.html 即自愈，用户无需手动重新登录。 -->
    <script>
      ;(function () {
        var KEY = 'admin_chunk_reload_at'
        function isChunkErr(s) {
          return /Failed to fetch dynamically imported module|Importing a module script failed|error loading dynamically imported module|Loading CSS chunk|Loading chunk/i.test(s)
        }
        function tryReload(reason) {
          try {
            var now = Date.now()
            var last = parseInt(sessionStorage.getItem(KEY) || '0', 10) || 0
            if (now - last > 60000) {
              sessionStorage.setItem(KEY, String(now))
              console.warn('[index.html] 代码包加载失败，自动整页刷新一次：', reason)
              window.location.reload()
            }
          } catch (err) {
            window.location.reload()
          }
        }
        window.addEventListener('error', function (e) {
          var t = e.target
          if (t && (t.tagName === 'SCRIPT' || t.tagName === 'LINK')) {
            tryReload('资源加载失败: ' + (t.src || t.href || ''))
            return
          }
          var msg = (e.error && e.error.message) || e.message || ''
          if (isChunkErr(msg)) tryReload(msg)
        }, true)
        window.addEventListener('unhandledrejection', function (e) {
          var r = e.reason
          var msg = r && r.message ? r.message : String(r || '')
          if (isChunkErr(msg)) tryReload(msg)
        })
      })()
    </script>

    <!-- 标准模块入口：Vite 构建时静态分析并打包此入口。
         ⚠️ 勿改为动态拼接 import('/src/main.tsx?t='+Date.now())——那是 dev-only 写法，
         生产构建时 Vite 无法静态分析，会产出空 bundle（只有 modulepreload polyfill）。 -->
  </body>
</html>
