diff --git a/static/hub.css b/static/hub.css index a3c23c4..4040eba 100644 --- a/static/hub.css +++ b/static/hub.css @@ -174,6 +174,18 @@ body.page-login .main { filter: brightness(1.05); } +.login-card .login-honeypot { + position: absolute !important; + left: -10000px !important; + top: auto !important; + width: 1px !important; + height: 1px !important; + opacity: 0 !important; + pointer-events: none !important; + overflow: hidden !important; +} +.login-card .login-form { position: relative; } + .stack label, .form-grid label { display: block; margin: 8px 0; } input[type="text"], input[type="password"], input[type="number"], input:not([type]), select { width: 100%; @@ -399,43 +411,231 @@ button, .btn { box-shadow: var(--shadow); } .empty { padding: 40px; color: var(--muted); } + +/* —— 系统设置 —— */ +.settings-head { + margin-bottom: 8px; + align-items: flex-start; +} +.settings-eyebrow { + margin: 0 0 4px; + font-size: 0.72rem; + letter-spacing: 0.16em; + text-transform: uppercase; + color: var(--accent); + font-weight: 600; +} +.settings-lead { margin: 6px 0 0; max-width: 520px; line-height: 1.45; } .settings-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(320px, 480px)); - gap: 20px; - align-items: start; + grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); + gap: 18px; + align-items: stretch; + max-width: 980px; } -.settings-card { max-width: 480px; } -.settings-form { max-width: 420px; } -.settings-form .check-row { - display: flex; +.settings-card { + max-width: none; + margin: 0; + padding: 0; + overflow: hidden; + background: + linear-gradient(165deg, rgba(20, 36, 58, 0.92), rgba(10, 16, 28, 0.96)); + border: 1px solid var(--line-strong); + box-shadow: var(--shadow), inset 0 1px 0 rgba(255, 255, 255, 0.04); +} +.settings-card-head { + padding: 18px 20px 14px; + border-bottom: 1px solid rgba(56, 189, 248, 0.12); + background: linear-gradient(180deg, rgba(34, 211, 238, 0.06), transparent); +} +.settings-card-head h2 { + margin: 8px 0 6px; + font-family: var(--font-display); + font-size: 1.05rem; + font-weight: 600; + letter-spacing: 0.04em; +} +.settings-card-head .muted { + margin: 0; + line-height: 1.45; + font-size: 0.86rem; +} +.settings-badge { + display: inline-flex; align-items: center; - gap: 8px; + padding: 3px 8px; + border-radius: 999px; + font-size: 0.68rem; + font-weight: 600; + letter-spacing: 0.1em; + text-transform: uppercase; + color: #041018; + background: linear-gradient(90deg, var(--accent-deep), var(--accent)); +} +.settings-badge--alert { + background: linear-gradient(90deg, #0d9488, #34d399); +} +.settings-form { + max-width: none; + padding: 16px 20px 20px; +} +.settings-field { + display: block; + margin: 0 0 14px; + font-size: 0.82rem; + color: #b6c7da; font-weight: 500; } -.settings-form .check-row input { width: auto; margin: 0; } -.settings-form .field-hint { +.settings-label { + display: block; + margin-bottom: 6px; + font-size: 0.82rem; + color: #b6c7da; + font-weight: 500; +} +.settings-form input[type="text"], +.settings-form input[type="password"], +.settings-form input[type="number"], +.settings-form input[type="url"] { + margin-top: 6px; + padding: 11px 12px; + border-radius: 10px; + border: 1px solid var(--line); + background: rgba(5, 10, 18, 0.85); + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} +.settings-form input:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px rgba(34, 211, 238, 0.15); +} +.settings-readonly { + margin-top: 6px; + padding: 11px 12px; + border-radius: 10px; + border: 1px solid rgba(56, 189, 248, 0.14); + background: rgba(8, 14, 24, 0.55); + color: var(--text); + font-weight: 600; + letter-spacing: 0.02em; +} +.settings-divider { + height: 1px; + margin: 4px 0 16px; + background: linear-gradient(90deg, transparent, rgba(56, 189, 248, 0.28), transparent); +} +.settings-row-2 { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; +} +.settings-hint { + margin: -4px 0 14px; + line-height: 1.4; +} +.settings-switch { + display: flex !important; + align-items: flex-start; + gap: 12px; + margin: 0 0 16px !important; + padding: 12px 14px; + border-radius: 12px; + border: 1px solid rgba(56, 189, 248, 0.16); + background: rgba(5, 12, 22, 0.55); + cursor: pointer; +} +.settings-switch input { + position: absolute; + opacity: 0; + width: 0; + height: 0; +} +.settings-switch-ui { + flex: 0 0 auto; + width: 42px; + height: 24px; + margin-top: 2px; + border-radius: 999px; + background: #1a2738; + border: 1px solid var(--line); + position: relative; + transition: background 0.18s ease, border-color 0.18s ease; +} +.settings-switch-ui::after { + content: ""; + position: absolute; + top: 2px; + left: 2px; + width: 18px; + height: 18px; + border-radius: 50%; + background: #8aa0b8; + transition: transform 0.18s ease, background 0.18s ease; +} +.settings-switch input:checked + .settings-switch-ui { + background: rgba(34, 211, 238, 0.25); + border-color: var(--accent); +} +.settings-switch input:checked + .settings-switch-ui::after { + transform: translateX(18px); + background: var(--accent); +} +.settings-switch-text { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} +.settings-switch-text strong { + color: var(--text); + font-size: 0.9rem; +} +.settings-switch-text small { + color: var(--muted); + font-size: 0.78rem; + line-height: 1.35; +} +.settings-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 2px; +} +.settings-primary, +.settings-form button.settings-primary { + margin-top: 0; + padding: 11px 16px; + border-radius: 10px; + letter-spacing: 0.04em; + background: linear-gradient(90deg, var(--accent-deep), var(--accent)); + color: #041018; + box-shadow: 0 8px 22px rgba(14, 165, 233, 0.22); +} +.settings-actions .btn-secondary, +button.btn-secondary { + margin-top: 0; + padding: 10px 14px; + border-radius: 10px; + background: transparent; + color: var(--text); + border: 1px solid var(--line); + box-shadow: none; +} +.settings-actions .btn-secondary:hover, +button.btn-secondary:hover { + border-color: var(--accent); + filter: none; +} +.field-hint { display: block; margin-top: 4px; font-size: 12px; color: var(--muted); font-weight: 400; } -.settings-actions { - display: flex; - flex-wrap: wrap; - gap: 10px; - margin-top: 4px; -} -.settings-actions .btn-secondary, -button.btn-secondary { - background: transparent; - color: var(--text); - border: 1px solid var(--line); -} -.settings-actions .btn-secondary:hover, -button.btn-secondary:hover { - border-color: var(--accent, #60a5fa); +@media (max-width: 720px) { + .settings-row-2 { grid-template-columns: 1fr; } + .settings-grid { grid-template-columns: 1fr; } } input.readonly { opacity: 0.75; diff --git a/templates/login.html b/templates/login.html index 6320986..26b4e90 100644 --- a/templates/login.html +++ b/templates/login.html @@ -1,19 +1,63 @@ -{% extends "base.html" %} -{% block title %}登录 · 期权中控{% endblock %} -{% block body %} -
多机期权持仓总览 · 内嵌打开客户端 · 本仓不下单
- -多机期权持仓总览 · 内嵌打开客户端 · 本仓不下单
+ {# 诱饵字段 + readonly/聚焦解锁,避免浏览器自动填入用户名密码 #} + +Hub Settings
+账号与中控告警在此维护,保存后立即生效。
+修改后立即生效,并写入服务器 .env(HUB_USERNAME / HUB_PASSWORD).
中控专用:客户端离线/故障与恢复时推送。与各交易机自身通知分开配置。
-