diff --git a/ui/css/style.css b/ui/css/style.css index 0305281..55a41b2 100644 --- a/ui/css/style.css +++ b/ui/css/style.css @@ -117,6 +117,18 @@ body { .table tbody { animation: tbodyIn 0.15s ease-out; } .muted { color: var(--text-mute); } +/* 小标签 / 图标按钮(原型 .eyebrow / .icon-btn,PR2 起供登录页与侧边栏使用) */ +.eyebrow { + font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; + text-transform: uppercase; color: var(--accent); +} +.icon-btn { + width: 34px; height: 34px; border-radius: 8px; display: grid; place-items: center; + color: var(--muted); border: 1px solid var(--border); background: transparent; cursor: pointer; +} +.icon-btn:hover { color: var(--fg); border-color: color-mix(in oklch, var(--accent) 50%, var(--border)); } +.icon-btn svg { width: 16px; height: 16px; } + /* ---------- 通用组件 ---------- */ .btn { @@ -630,77 +642,75 @@ mark { .empty-cell { padding: 0 !important; } .empty-cell .empty-state { padding: 36px 16px; } -/* ---------- 登录页 ---------- */ +/* ---------- 登录页(rant 2026-09-11T16:23:43:单卡片 → 左右分栏) ---------- */ .login-view { - min-height: 100vh; - display: flex; align-items: center; justify-content: center; - padding: 24px; - position: relative; overflow: hidden; - background: - radial-gradient(600px 300px at 20% 0%, color-mix(in oklch, var(--accent) 8%, transparent), transparent 60%), - radial-gradient(600px 400px at 90% 100%, color-mix(in oklch, var(--accent) 6%, transparent), transparent 60%), - var(--bg); + display: grid; grid-template-columns: 1.15fr 0.85fr; + height: 100vh; position: relative; overflow: hidden; + background: var(--bg); } -/* 品牌氛围(rant 20:46:57 G:渐变网格 + 微光浮动;reduced-motion 下静止由全局规则覆盖) */ -.login-view::before { - content: ""; position: absolute; inset: 0; +/* 主题切换(毛玻璃,右上角浮于两栏之上) */ +.login-theme { + position: absolute; top: 20px; right: 24px; z-index: 5; + background: color-mix(in oklch, var(--surface) 70%, transparent); + -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); +} +.login-theme .ico-moon { display: none; } +:root[data-theme="light"] .login-theme .ico-sun { display: none; } +:root[data-theme="light"] .login-theme .ico-moon { display: block; } + +/* 左栏:品牌叙事(原型 .login-brand) */ +.login-brand { + position: relative; overflow-y: auto; overflow-x: hidden; + scrollbar-width: none; -ms-overflow-style: none; + padding: clamp(26px, 5vh, 56px) clamp(30px, 4vw, 60px); + display: flex; flex-direction: column; justify-content: safe center; background: - linear-gradient(color-mix(in oklch, var(--accent) 5%, transparent) 1px, transparent 1px), - linear-gradient(90deg, color-mix(in oklch, var(--accent) 5%, transparent) 1px, transparent 1px); - background-size: 44px 44px; - -webkit-mask-image: radial-gradient(ellipse 85% 75% at 50% 42%, #000 25%, transparent 72%); - mask-image: radial-gradient(ellipse 85% 75% at 50% 42%, #000 25%, transparent 72%); - pointer-events: none; -} -.login-view::after { - content: ""; position: absolute; - width: 440px; height: 440px; border-radius: 50%; - top: -140px; right: -110px; - background: radial-gradient(circle, color-mix(in oklch, var(--accent) 16%, transparent), transparent 65%); - animation: login-float 10s ease-in-out infinite alternate; - pointer-events: none; -} -@keyframes login-float { - from { transform: translate(0, 0) scale(1); } - to { transform: translate(-48px, 36px) scale(1.12); } -} -.login-card { - position: relative; z-index: 1; /* 浮在网格/微光伪元素之上 */ - width: 100%; max-width: 400px; - background: var(--bg-card); - border: 1px solid var(--border); - border-radius: 16px; - padding: 32px; - box-shadow: var(--shadow); + radial-gradient(120% 90% at 8% 0%, color-mix(in oklch, var(--accent) 12%, transparent), transparent 60%), + var(--bg); + border-right: 1px solid var(--border); } -.login-brand { display: flex; align-items: center; gap: 14px; margin-bottom: 22px; } -.login-brand h1 { font-size: 20px; } -.login-brand p { color: var(--text-mute); font-size: 12px; } - -.logo { - width: 40px; height: 40px; border-radius: 10px; +.login-brand::-webkit-scrollbar { width: 0; height: 0; } +.lb-top { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 17px; } +.logo-tile { + width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center; flex: none; background: linear-gradient(135deg, color-mix(in oklch, var(--accent) 92%, var(--fg)), color-mix(in oklch, var(--accent) 62%, var(--bg))); - color: var(--accent-ink); font-weight: 800; - display: flex; align-items: center; justify-content: center; - font-size: 16px; flex-shrink: 0; - position: relative; - box-shadow: 0 0 0 1.5px color-mix(in oklch, var(--accent) 45%, transparent), 0 0 14px color-mix(in oklch, var(--accent) 35%, transparent); -} -/* 渐变描边质感(rant 20:46:57 G:顶部内高光 + 底部内阴影) */ -.logo::after { - content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; - box-shadow: inset 0 1px 0 rgba(255,255,255,.30), inset 0 -1px 0 rgba(0,0,0,.14); -} -/* 登录页 logo 加大 + 微光(rant 20:39:30 G) */ -.login-card .logo { - width: 52px; height: 52px; border-radius: 13px; font-size: 20px; - box-shadow: 0 0 0 1px color-mix(in oklch, var(--accent) 35%, transparent), 0 0 18px color-mix(in oklch, var(--accent) 35%, transparent); -} -.login-brand h1 { font-size: 22px; line-height: 1.25; } -.login-brand p { font-size: 12px; line-height: 1.5; } - -.mode-switch { display: none; } + color: var(--accent-ink); font-weight: 800; font-size: 16px; letter-spacing: -0.02em; +} +.lb-headline { + font-family: var(--font-serif); font-size: clamp(30px, min(4.4vw, 6.2vh), 54px); line-height: 1.06; + letter-spacing: -0.02em; margin: clamp(14px, 3vh, 30px) 0 clamp(9px, 1.6vh, 16px); max-width: 15ch; +} +.lb-sub { color: var(--muted); font-size: 15.5px; max-width: 52ch; } +.lb-points { list-style: none; display: flex; flex-wrap: wrap; gap: 8px; margin-top: clamp(12px, 2.4vh, 26px); } +.lb-points li { font-family: var(--font-mono); font-size: 11.5px; color: var(--muted); border: 1px solid var(--border); border-radius: 999px; padding: 4px 11px; } +.gw { margin-top: clamp(14px, 2.8vh, 34px); border: 1px solid var(--border); background: color-mix(in oklch, var(--surface) 82%, transparent); border-radius: var(--r-lg); padding: 18px; max-width: 520px; } +.gw-lead { font-family: var(--font-mono); font-size: 11px; color: var(--muted); margin-bottom: 12px; } +.gw-ep { display: grid; grid-template-columns: 138px 1fr; gap: 12px; align-items: center; padding: 9px 12px; border-radius: var(--r-sm); background: var(--fg-soft); border: 1px solid var(--border); } +.gw-ep + .gw-ep { margin-top: 7px; } +.gw-chip { font-family: var(--font-mono); font-size: 11px; padding: 4px 9px; border-radius: 6px; background: var(--surface); color: var(--fg); border: 1px solid var(--border); text-align: center; } +.gw-ep code { font-family: var(--font-mono); font-size: 11.5px; color: var(--accent); min-width: 0; overflow-wrap: anywhere; } +.gw-mid { display: flex; align-items: center; gap: 10px; margin: 12px 0; color: var(--muted); font-family: var(--font-mono); font-size: 11px; } +.gw-mid .line { flex: 1; height: 1px; background: var(--border); } +.gw-models { display: flex; flex-wrap: wrap; gap: 6px; } +.gw-models span { font-size: 11px; color: color-mix(in oklch, var(--muted) 88%, transparent); } +.lb-meta { margin-top: clamp(12px, 2.4vh, 26px); font-family: var(--font-mono); font-size: 11px; color: color-mix(in oklch, var(--muted) 80%, transparent); } + +/* 右栏:表单面板(原型 .login-panel) */ +.login-panel { + display: grid; place-items: center; align-content: safe center; + padding: clamp(22px, 4vh, 40px) 32px; background: var(--surface); overflow-y: auto; +} +.login-card { width: 100%; max-width: 380px; } +.login-card h2 { font-size: 24px; letter-spacing: -0.01em; } +.login-card > p.sub { color: var(--muted); margin: 6px 0 22px; } +/* 登录 / 注册 tab(rant 2026-09-11T16:23:43) */ +.auth-tabs { + display: flex; gap: 4px; background: var(--bg); border: 1px solid var(--border); + border-radius: 999px; padding: 4px; margin-bottom: 20px; +} +.auth-tabs button { flex: 1; padding: 8px 0; border-radius: 999px; font-size: 13px; color: var(--muted); font-weight: 600; } +.auth-tabs button.active { background: var(--accent); color: var(--accent-ink); } .login-form { display: flex; flex-direction: column; gap: 12px; } .login-form label { display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: var(--text-dim); } @@ -713,7 +723,7 @@ mark { .checkbox-line { display: flex; align-items: center; gap: 6px; flex-direction: row !important; color: var(--text-dim); cursor: pointer; } .checkbox-line input { accent-color: var(--accent); width: 14px; height: 14px; } .demo-hint { color: var(--text-mute); font-size: 11px; } -.login-divider { display: flex; align-items: center; gap: 12px; margin: 16px 0; color: var(--text-mute); font-size: 12px; } +.login-divider { display: flex; align-items: center; gap: 12px; margin: 16px 0; color: var(--muted); font-size: 11px; } .login-divider::before, .login-divider::after { content: ""; flex: 1; height: 1px; background: var(--border); } .login-foot { margin-top: 16px; text-align: center; font-size: 13px; color: var(--text-dim); } .login-foot a { color: var(--accent-text); text-decoration: none; } @@ -726,49 +736,56 @@ mark { .sidebar { width: var(--sidebar-w); flex-shrink: 0; - background: var(--bg-soft); + background: var(--surface); border-right: 1px solid var(--border); display: flex; flex-direction: column; - padding: 14px 12px; + padding: 18px 14px; } -.sidebar-top { display: flex; align-items: center; gap: 10px; padding: 2px 6px 14px; border-bottom: 1px solid var(--border); } +/* 品牌区(原型 .sb-brand) */ +.sb-brand { display: flex; align-items: center; gap: 10px; padding: 4px 6px 16px; } +.sb-brand .logo-tile { width: 34px; height: 34px; font-size: 14px; border-radius: 9px; } .brand-text { flex: 1; min-width: 0; } .brand-text strong { font-size: 15px; display: block; } -.brand-text span { color: var(--text-mute); font-size: 11px; } +.brand-text span { color: var(--muted); font-size: 11px; } /* 主题切换按钮(rant 18:06:09 B:日/月 SVG 图标,按当前主题显隐) */ .theme-toggle { flex-shrink: 0; - width: 30px; height: 30px; + width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--border); - background: var(--bg-soft); - color: var(--text-dim); - border-radius: var(--radius-sm); + background: transparent; + color: var(--muted); + border-radius: 8px; cursor: pointer; transition: all .15s; } -.theme-toggle:hover { color: var(--accent-text); border-color: var(--accent); } -.theme-toggle svg { width: 15px; height: 15px; } +.theme-toggle:hover { color: var(--fg); border-color: color-mix(in oklch, var(--accent) 50%, var(--border)); } +.theme-toggle svg { width: 16px; height: 16px; } .theme-toggle .ico-moon { display: none; } :root[data-theme="light"] .theme-toggle .ico-sun { display: none; } :root[data-theme="light"] .theme-toggle .ico-moon { display: block; } .brand-text { display: flex; flex-direction: column; line-height: 1.3; } .brand-text strong { font-size: 14px; } -.brand-text span { color: var(--text-mute); font-size: 11px; } +.brand-text span { color: var(--muted); font-size: 11px; } -.nav { flex: 1; padding: 14px 0; display: flex; flex-direction: column; gap: 2px; overflow-y: auto; } -.nav-group { color: var(--text-mute); font-size: 11px; padding: 10px 8px 4px; } +.nav { flex: 1; padding: 0; display: flex; flex-direction: column; gap: 2px; overflow-y: auto; } +/* 分组标题(原型 .nav-group:等宽大写带字距) */ +.nav-group { + font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; + color: color-mix(in oklch, var(--muted) 72%, transparent); padding: 14px 10px 6px; +} .nav-item { display: flex; align-items: center; gap: 10px; - padding: 9px 10px; border-radius: var(--radius-sm); - color: var(--text-dim); cursor: pointer; font-size: 13.5px; + padding: 9px 11px; border-radius: var(--r-sm); + color: var(--muted); cursor: pointer; font-size: 13.5px; font-weight: 500; border: none; background: transparent; text-align: left; width: 100%; } -.nav-item .ico { width: 18px; text-align: center; font-size: 15px; display: inline-flex; align-items: center; justify-content: center; } -.nav-item .ico svg { width: 18px; height: 18px; display: block; } +.nav-item .ico { width: 16px; text-align: center; display: inline-flex; align-items: center; justify-content: center; } +.nav-item .ico svg { width: 16px; height: 16px; display: block; } .nav-tag { margin-left: auto; - font-size: 10px; + font-family: var(--font-mono); + font-size: 10.5px; padding: 1px 7px; border-radius: 999px; border: 1px solid color-mix(in oklch, var(--accent) 40%, transparent); @@ -788,9 +805,14 @@ mark { background: var(--bg-soft); font-family: var(--mono); } +/* 模型市场 badge(原型 .nav button .badge:模型数量) */ +.nav-count { + margin-left: auto; + font-family: var(--font-mono); font-size: 10.5px; color: var(--muted); +} .nav-item:hover .nav-key { color: var(--accent-text); border-color: var(--accent); } -.nav-item:hover { background: var(--bg-hover); color: var(--text); } -.nav-item.active { background: var(--accent-soft); color: var(--accent-text); font-weight: 600; } +.nav-item:hover { background: var(--fg-soft); color: var(--fg); } +.nav-item.active { background: var(--accent-soft); color: var(--accent); font-weight: 600; } /* 市场行展开按钮(rant 20:39:30 F:+/- 切换详情行) */ .row-expand { @@ -811,21 +833,23 @@ mark { .mkd-label { color: var(--text-mute); font-size: 12px; } .mkd-val { color: var(--text); line-height: 1.55; } -.sidebar-bottom { border-top: 1px solid var(--border); padding-top: 12px; display: flex; flex-direction: column; gap: 8px; } -.user-chip { - display: flex; align-items: center; gap: 10px; - background: var(--bg-card); border: 1px solid var(--border); - border-radius: var(--radius-sm); padding: 10px; +/* 侧边栏底部(原型 .sb-foot:用户 chip + 主题切换 + 退出按钮) */ +.sb-foot { + border-top: 1px solid var(--border); padding-top: 12px; margin-top: 8px; + display: flex; flex-direction: column; gap: 10px; } +.user-chip { display: flex; align-items: center; gap: 10px; padding: 8px 6px; } +.user-chip .chip-text { flex: 1; min-width: 0; } .user-chip .avatar { - width: 32px; height: 32px; border-radius: 50%; - background: linear-gradient(135deg, color-mix(in oklch, var(--accent) 92%, var(--fg)), color-mix(in oklch, var(--accent) 62%, var(--bg))); - color: var(--accent-ink); font-weight: 700; + width: 34px; height: 34px; border-radius: 50%; flex: none; + background: var(--accent-soft); color: var(--accent); + font-size: 13px; + font-weight: 700; display: flex; align-items: center; justify-content: center; } .user-chip strong { font-size: 13px; display: block; } -.user-chip span { color: var(--text-mute); font-size: 11px; } -.user-chip b { color: var(--accent-text); } +.user-chip span { color: var(--muted); font-size: 11.5px; } +.user-chip b { color: var(--accent); } .main { flex: 1; overflow-y: auto; padding: 28px 32px 48px; } @@ -1009,17 +1033,23 @@ mark { @media (max-width: 900px) { .sidebar { width: 64px; padding: 12px 8px; } - .sidebar .brand-text, .sidebar .nav-item .label, .sidebar .user-chip > div:last-child, + .sidebar .brand-text, .sidebar .nav-item .label, .sidebar .user-chip .chip-text, .sidebar #toggle-mode-btn, .sidebar #logout-btn { display: none; } .nav-item { justify-content: center; } .main { padding: 20px 16px 40px; } .form-row { grid-template-columns: 1fr; } + /* 登录页窄屏:收起品牌叙事栏,仅保留表单(原型 responsive 规则) */ + .login-view { grid-template-columns: 1fr; } + .login-brand { display: none; } } @media (max-width: 560px) { .stat-grid { grid-template-columns: 1fr 1fr; } .card-grid { grid-template-columns: 1fr; } .api-key-card { margin-top: 12px; } + /* 网关端点卡片窄屏:chip 与 URL 上下排(原型 responsive 规则) */ + .gw-ep { grid-template-columns: 1fr; gap: 6px; } + .gw-chip { justify-self: start; } /* 交易汇总条窄屏(rant 20:39:30 B) */ .tx-summary { gap: 18px; padding: 10px 12px 8px; } .tx-summary .ts-value { font-size: 16px; } diff --git a/ui/index.html b/ui/index.html index 8af20cf..41ba974 100644 --- a/ui/index.html +++ b/ui/index.html @@ -5,20 +5,61 @@ AITokenPool - + - +
-
-
- - - - + + + + diff --git a/ui/js/app.js b/ui/js/app.js index 2a295ed..b172a0d 100644 --- a/ui/js/app.js +++ b/ui/js/app.js @@ -499,6 +499,16 @@ tag.textContent = item.role === "ops" ? T("nav.tag.ops") : T("nav.tag.admin"); b.appendChild(tag); } + // 模型市场 badge:模型数量(rant 2026-09-11T16:23:43)——与列表同源:登录态 /api/models,游客用兜底市场 + if (item.id === "marketplace") { + const n = Live.models ? Live.models.length : (isGuest ? (D.MARKET || []).length : (D.MODELS || []).length); + if (n > 0) { + const bg = document.createElement("span"); + bg.className = "nav-count"; + bg.textContent = String(n); + b.appendChild(bg); + } + } b.addEventListener("click", () => switchView(item.id)); nav.appendChild(b); }); @@ -2659,13 +2669,21 @@ /* ---------------- 游客模式(US-1:未登录浏览市场) ---------------- */ + // 游客模式:只隐藏账号相关控件(用户 chip + 退出登录),主题切换保持可用(原位于顶栏,PR2 迁入底栏) + function setGuestSidebar(on) { + const chip = document.querySelector(".user-chip"); + const out = $("#logout-btn"); + if (chip) chip.classList.toggle("hidden", on); + if (out) out.classList.toggle("hidden", on); + } + function enterGuest() { isGuest = true; pendingHashView = null; activeView = "marketplace"; $("#login-view").classList.add("hidden"); $("#app").classList.remove("hidden"); - document.querySelector(".user-chip").classList.add("hidden"); + setGuestSidebar(true); renderNav(); switchView("marketplace"); toast(T("guest.enter"), "info"); @@ -2674,7 +2692,7 @@ function exitGuest() { isGuest = false; $("#app").classList.add("hidden"); - document.querySelector(".user-chip").classList.remove("hidden"); + setGuestSidebar(false); $("#login-view").classList.remove("hidden"); } @@ -2711,7 +2729,7 @@ function enterApp() { isGuest = false; pendingHashView = null; - document.querySelector(".user-chip").classList.remove("hidden"); + setGuestSidebar(false); $("#login-view").classList.add("hidden"); $("#app").classList.remove("hidden"); $("#side-balance").textContent = D.fmt(D.USER.balance); @@ -2966,6 +2984,30 @@ registerFormEl.classList.toggle("hidden", which !== "register"); verifyFormEl.classList.toggle("hidden", which !== "verify"); if (forgotFormEl) forgotFormEl.classList.toggle("hidden", which !== "forgot"); + // 登录专属附加项(分隔线/游客入口/底部提示)随登录表单一起显隐 + const extrasEl = $("#auth-login-extras"); + if (extrasEl) extrasEl.classList.toggle("hidden", which !== "login"); + // 登录/注册 tab 高亮同步(rant 2026-09-11T16:23:43);验证码/找回页 tab 全部取消高亮 + const tabs = document.querySelectorAll("#auth-tabs button"); + for (let i = 0; i < tabs.length; i++) { + tabs[i].classList.toggle("active", tabs[i].dataset.auth === which); + } + // 标题固定为「进入平台」(原型 .login-card h2;tab 只切换表单区) + const tabBar = $("#auth-tabs"); + if (tabBar) tabBar.classList.toggle("hidden", which === "verify" || which === "forgot"); + } + + // tab 点击 → 复用既有 showAuthForm(注册流程零改动) + const authTabsEl = $("#auth-tabs"); + if (authTabsEl) { + authTabsEl.addEventListener("click", (e) => { + const b = e.target.closest("button[data-auth]"); + if (!b) return; + const which = b.dataset.auth; + showAuthForm(which); + const focusEl = which === "register" ? $("#reg-email") : $("#login-email"); + if (focusEl) focusEl.focus(); + }); } document.addEventListener("click", (e) => { @@ -3570,12 +3612,16 @@ if (tourStep >= 0) renderTourStep(); // 引导中的按钮/文案随语言更新 }); - $("#theme-toggle").addEventListener("click", () => { + // 主题切换(rant 18:06:09 B):登录页右上角 + 侧边栏底部两处共用同一逻辑 + function toggleTheme() { const next = document.documentElement.dataset.theme === "light" ? "dark" : "light"; document.documentElement.dataset.theme = next; try { localStorage.setItem("atp-theme", next); } catch (e) { /* 隐私模式忽略 */ } toast(T("theme.switched", { theme: next === "light" ? T("theme.light") : T("theme.dark") }), "info"); - }); + } + $("#theme-toggle").addEventListener("click", toggleTheme); + const loginThemeBtn = $("#login-theme-toggle"); + if (loginThemeBtn) loginThemeBtn.addEventListener("click", toggleTheme); // 全局快捷键(rant 16:57:17 D):/ 聚焦市场搜索;数字 1-7 切换侧边栏视图;Esc 关闭行内新建 key // rant 20:39:30 E:? / Shift+/ 开合快捷键帮助面板(Esc 优先关帮助) diff --git a/ui/js/i18n.js b/ui/js/i18n.js index e6c6b93..9981124 100644 --- a/ui/js/i18n.js +++ b/ui/js/i18n.js @@ -31,6 +31,25 @@ "nav.shortcut": "快捷键 {n} · {label}", /* ---- 登录页 ---- */ + "login.title": "进入平台", + "login.panel.sub": "登录后使用真实网关数据 · 管理员可见管理视图", + "login.tab.login": "登录", + "login.tab.register": "注册", + "login.brand.eyebrow": "AI TOKEN 共享池 · 多模型网关", + "login.brand.headline": "不要让 token plan 白白浪费。", + "login.brand.sub": "把闲置额度共享出去赚点数,需要时也能用别人的。三种 API 类型各一个统一端点,每类端点都能调用全部厂商模型。", + "login.brand.p1": "多协议网关互转", + "login.brand.p2": "输入 / 缓存 / 输出 三档透明计费", + "login.brand.p3": "共享分成 90 / 10", + "login.brand.p4": "企业点数管控", + "login.brand.meta": "单 Rust 二进制 + SQLite · Docker 一键启动 · 中英双语前端", + "login.gw.lead": "三种 API 类型 · 每类一个统一端点 · 每类均可用全部模型", + "login.gw.chat": "OpenAI Chat", + "login.gw.responses": "OpenAI Responses", + "login.gw.anthropic": "Anthropic Messages", + "login.gw.any": "任意端点 · 全部厂商模型", + "login.gw.modes": "SSE / 非流式", + "login.gw.zhipu": "智谱 GLM", "login.subtitle": "AI Token 共享平台 · 一套产品,两种部署场景", "login.email": "邮箱 / 账号", "login.email.ph": "you@company.com", @@ -753,6 +772,25 @@ "nav.mode.guest": "Guest mode · browse only", "nav.shortcut": "Shortcut {n} · {label}", + "login.title": "Sign in", + "login.panel.sub": "Real gateway data after sign-in · admins see the Admin view", + "login.tab.login": "Sign in", + "login.tab.register": "Register", + "login.brand.eyebrow": "AI TOKEN SHARING POOL · MULTI-MODEL GATEWAY", + "login.brand.headline": "Don't let your token plan go to waste.", + "login.brand.sub": "Share idle quota to earn points, and use others' when you need them. One unified endpoint per API type — every endpoint can call every vendor's models.", + "login.brand.p1": "Multi-protocol gateway translation", + "login.brand.p2": "Transparent billing on input / cached / output", + "login.brand.p3": "90 / 10 sharing split", + "login.brand.p4": "Enterprise point controls", + "login.brand.meta": "Single Rust binary + SQLite · one-command Docker start · bilingual UI", + "login.gw.lead": "Three API types · one unified endpoint each · all models reachable from every endpoint", + "login.gw.chat": "OpenAI Chat", + "login.gw.responses": "OpenAI Responses", + "login.gw.anthropic": "Anthropic Messages", + "login.gw.any": "any endpoint · all vendor models", + "login.gw.modes": "SSE / non-streaming", + "login.gw.zhipu": "Zhipu GLM", "login.subtitle": "AI Token Sharing Platform · One product, two deployments", "login.email": "Email / Account", "login.email.ph": "you@company.com",