Files
opsxapi/homepage/assets/site.css
T
Logan.Li 3cb9545121 refactor(homepage): 官网/文档/定价源码迁出程序 + 新增独立授权与激活页 /license
- 官网源码归拢到 homepage/(index/pricing/terms/license + content/ + assets/ + docs-assets/),
  删除程序内 go:embed 的 server/internal/{site,docs},后端仅静态托管 homepage/dist 做本地预览
- 新增独立静态页 /license(授权与激活):交付与激活四步(邮件交付授权码)、
  在线授权码 LIC- 与离线许可证 LICOFF- 对比、授权服务器 licence.rlwj.cn 通信范围说明、
  授权类型与价格、10 条授权 FAQ
- tools/homepage-build 支持可选单页,产出 <name>.html 与 <name>/index.html
- 导航/页脚接入 /license,跨页锚点补 / 前缀,页脚底栏文案同步为静态站口径
2026-10-16 04:16:16 +08:00

283 lines
15 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* OpsxAPI 官网 —— 营销单页样式 */
:root {
--blue: #2563eb;
--blue-dark: #1d4ed8;
--blue-soft: rgba(37, 99, 235, 0.08);
--bg: #ffffff;
--bg-alt: #f6f8fc;
--border: #e4e9f1;
--text: #111827;
--text-2: #5b6880;
--text-3: #98a2b3;
--green: #059669;
--amber: #d97706;
--radius: 14px;
--shadow: 0 1px 3px rgba(16,24,40,.06), 0 12px 32px rgba(16,24,40,.07);
--mono: "JetBrains Mono", SFMono-Regular, Menlo, monospace;
}
* { box-sizing: border-box; scroll-behavior: smooth; }
body {
margin: 0; font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif;
color: var(--text); background: var(--bg); font-size: 15px; line-height: 1.75;
}
a { color: var(--blue); text-decoration: none; }
h1,h2,h3 { letter-spacing: -0.015em; }
section[id] { scroll-margin-top: 76px; }
.wrap { max-width: 1120px; margin: 0 auto; padding: 0 24px; }
.wrap.narrow { max-width: 820px; }
/* ---------- SVG 图标(lucide sprite) ---------- */
.i { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; vertical-align: -2px; }
.i-lg { width: 28px; height: 28px; vertical-align: middle; }
code { font-family: var(--mono); font-size: 13px; background: var(--blue-soft); color: var(--blue-dark); border-radius: 5px; padding: 1px 6px; }
/* ---------- 按钮 ---------- */
.btn {
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
border-radius: 10px; padding: 9px 20px; font-size: 14.5px; font-weight: 600; cursor: pointer;
transition: all .18s; border: 1px solid transparent; white-space: nowrap;
}
.btn-lg { padding: 12px 26px; font-size: 15.5px; }
.btn-primary { background: var(--blue); color: #fff !important; box-shadow: 0 6px 18px rgba(37,99,235,.28); }
.btn-primary:hover { background: var(--blue-dark); transform: translateY(-1px); }
.btn-ghost { border-color: var(--border); color: var(--text) !important; background: #fff; }
.btn-ghost:hover { border-color: var(--blue); color: var(--blue) !important; }
.btn-inverse { background: #fff; color: var(--blue) !important; }
.btn-inverse:hover { transform: translateY(-1px); }
.btn-outline { border-color: rgba(255,255,255,.5); color: #fff !important; }
.btn-outline:hover { border-color: #fff; background: rgba(255,255,255,.1); }
/* ---------- 导航 ---------- */
.nav {
position: sticky; top: 0; z-index: 50; background: rgba(255,255,255,.9);
backdrop-filter: blur(10px); border-bottom: 1px solid var(--border);
}
.nav-inner { max-width: 1120px; margin: 0 auto; padding: 0 24px; height: 60px; display: flex; align-items: center; gap: 28px; }
.brand { display: flex; align-items: center; gap: 9px; }
.brand-logo { display: inline-flex; }
.brand-logo svg { display: block; border-radius: 8px; }
.brand-name { font-size: 17px; font-weight: 800; color: var(--text) !important; }
.nav-links { display: flex; gap: 22px; }
.nav-links a { font-size: 14px; font-weight: 500; color: var(--text-2) !important; }
.nav-links a:hover { color: var(--blue) !important; }
.nav-cta { margin-left: auto; }
/* ---------- Hero ---------- */
.hero {
position: relative; overflow: hidden;
background:
radial-gradient(1200px 500px at 85% -10%, rgba(37,99,235,.14), transparent 60%),
radial-gradient(800px 400px at -10% 10%, rgba(5,150,105,.08), transparent 55%),
linear-gradient(180deg, #f8faff 0%, #fff 100%);
border-bottom: 1px solid var(--border);
}
.hero-inner {
max-width: 1120px; margin: 0 auto; padding: 72px 24px 64px;
display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: 48px; align-items: center;
}
.hero-badge {
display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 600; color: var(--blue-dark);
background: #fff; border: 1px solid rgba(37,99,235,.25); border-radius: 999px; padding: 4px 14px;
box-shadow: 0 2px 8px rgba(37,99,235,.1); margin-bottom: 18px;
}
.hero h1 { font-size: 44px; line-height: 1.22; font-weight: 800; margin: 0 0 16px; }
.hero h1 em { font-style: normal; color: var(--blue); }
.hero-sub { color: var(--text-2); font-size: 16px; margin: 0 0 26px; }
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; }
.hero-actions.center { justify-content: center; }
.hero-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
.hero-pills span {
font-size: 12px; color: var(--text-2); background: #fff; border: 1px solid var(--border);
padding: 3px 12px; border-radius: 999px;
}
/* ---------- Mock 界面 ---------- */
.mock {
border-radius: 14px; overflow: hidden; box-shadow: var(--shadow); border: 1px solid #1e2b45;
background: #0d1526; transform: perspective(1400px) rotateY(-4deg) rotateX(1.5deg);
}
.mock-titlebar {
display: flex; align-items: center; gap: 7px; height: 34px; padding: 0 12px;
background: #101a30; border-bottom: 1px solid #1e2b45;
}
.mock-titlebar i { width: 11px; height: 11px; border-radius: 50%; background: #3a4a6b; }
.mock-titlebar i:nth-child(1) { background: #f87171; } .mock-titlebar i:nth-child(2) { background: #fbbf24; } .mock-titlebar i:nth-child(3) { background: #34d399; }
.mock-titlebar span { margin-left: 8px; color: #8b99b0; font-size: 11px; }
.mock-body { display: grid; grid-template-columns: 158px minmax(0,1fr); min-height: 320px; }
.mock-side { border-right: 1px solid #1e2b45; padding: 10px 8px; background: #0c1322; }
.mock-search { height: 22px; border-radius: 6px; background: #16213a; margin-bottom: 10px; }
.mock-group { color: #8b99b0; font-size: 11px; padding: 6px 6px 3px; }
.mock-item { display: flex; align-items: center; gap: 6px; color: #aab8d0; font-size: 11.5px; padding: 4px 6px; border-radius: 6px; }
.mock-item.active { background: rgba(37,99,235,.18); color: #93c5fd; }
.mi { width: 11px; height: 11px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; opacity: .8; }
.m-get { color: #34d399; font-style: normal; font-size: 9.5px; min-width: 30px; }
.m-post { color: #fbbf24; font-style: normal; font-size: 9.5px; min-width: 30px; }
.mock-main { padding: 10px 12px; display: flex; flex-direction: column; gap: 9px; }
.mock-urlbar { display: flex; align-items: center; gap: 8px; }
.mock-url {
flex: 1; background: #0a1120; border: 1px solid #22304f; border-radius: 7px; color: #cbd5e1;
font-family: var(--mono); font-size: 11px; padding: 6px 10px;
}
.mock-send {
background: var(--blue); color: #fff; font-size: 11px; font-weight: 600;
border-radius: 7px; padding: 6px 14px;
}
.mock-req, .mock-resp { border: 1px solid #1e2b45; border-radius: 9px; padding: 8px 10px; background: #0c1322; }
.mock-req .tab, .mock-resp .tab { color: #5c6a83; font-size: 10.5px; margin-right: 12px; }
.mock-req .tab.on { color: #93c5fd; border-bottom: 2px solid var(--blue); padding-bottom: 2px; }
.mock-resp .tab.on { color: #6ee7b7; border-bottom: 2px solid var(--green); padding-bottom: 2px; }
.mock-status { float: right; color: #34d399; font-size: 10px; font-family: var(--mono); }
.mock pre {
margin: 8px 0 2px; font-family: var(--mono); font-size: 11px; line-height: 1.6; color: #cbd5e1;
white-space: pre-wrap;
}
.mock pre i { font-style: normal; color: #7dd3fc; }
.mock pre u { text-decoration: none; color: #86efac; }
/* ---------- 通用 Section ---------- */
.section { padding: 72px 0; }
.section.alt { background: var(--bg-alt); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.sec-title { font-size: 30px; font-weight: 800; text-align: center; margin: 0 0 8px; }
.sec-sub { text-align: center; color: var(--text-2); margin: 0 0 40px; }
.grid { display: grid; gap: 18px; }
.g3 { grid-template-columns: repeat(3, minmax(0,1fr)); }
.g4 { grid-template-columns: repeat(4, minmax(0,1fr)); }
/* ---------- 卡片 ---------- */
.card {
background: #fff; border: 1px solid var(--border); border-radius: var(--radius);
padding: 22px; box-shadow: 0 1px 2px rgba(16,24,40,.04); transition: all .18s;
}
.card:hover { transform: translateY(-3px); box-shadow: var(--shadow); border-color: rgba(37,99,235,.35); }
.card h3 { font-size: 16px; margin: 0 0 6px; }
.card p { color: var(--text-2); font-size: 13.5px; margin: 0; }
.card-icon { color: var(--blue); margin-bottom: 10px; }
.card-icon .i-lg { width: 30px; height: 30px; }
.card.row { display: flex; gap: 14px; align-items: flex-start; }
.card.row .card-icon { margin: 2px 0 0; }
.card.mini h3 { font-size: 15px; display: flex; align-items: center; gap: 8px; }
.card.mini h3 .i-lg { width: 20px; height: 20px; color: var(--blue); }
.card.mini p { font-size: 13px; }
/* ---------- 协议 ---------- */
.proto {
background: #fff; border: 1px solid var(--border); border-left: 3px solid var(--blue);
border-radius: 12px; padding: 18px 20px;
}
.proto h3 { margin: 0 0 6px; font-size: 15.5px; display: flex; align-items: center; gap: 8px; }
.proto h3 .i { color: var(--blue); width: 17px; height: 17px; }
.proto p { margin: 0; color: var(--text-2); font-size: 13.5px; }
/* ---------- 导入导出 ---------- */
.badges { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; margin-bottom: 18px; }
.badges span {
background: #fff; border: 1px solid var(--border); border-radius: 999px;
padding: 6px 16px; font-size: 13px; font-weight: 500; color: var(--text);
}
.badges span.more { border-style: dashed; color: var(--text-2); }
.footnote { text-align: center; color: var(--text-3); font-size: 12.5px; margin: 10px 0 0; }
.exchange-actions { display: flex; align-items: center; justify-content: center; gap: 12px; flex-wrap: wrap; margin-top: 26px; }
.chip {
display: inline-flex; align-items: center; gap: 6px;
background: #fff; border: 1px solid var(--border); border-radius: 10px; padding: 8px 16px;
font-size: 13px; font-weight: 600; color: var(--text-2);
}
.chip.big { background: var(--blue); border-color: var(--blue); color: #fff; padding: 10px 22px; }
.exchange-arrow { color: var(--text-3); font-size: 15px; }
/* ---------- 对比表 ---------- */
.table-wrap { overflow-x: auto; }
.cmp { border-collapse: collapse; width: 100%; background: #fff; border-radius: 12px; overflow: hidden; box-shadow: 0 0 0 1px var(--border); font-size: 14px; }
.cmp th, .cmp td { padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border); }
.cmp th { background: #f9fbfe; font-size: 13.5px; }
.cmp tr:last-child td { border-bottom: none; }
.cmp td.hl { background: rgba(37,99,235,.05); color: var(--blue-dark); }
.cmp th.hl { background: var(--blue); color: #fff; }
/* ---------- 定价 ---------- */
.pricing { display: grid; grid-template-columns: repeat(2, minmax(0, 380px)); gap: 22px; justify-content: center; }
.pricing.three { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 1080px; margin: 0 auto; }
.price-card {
position: relative; background: #fff; border: 1px solid var(--border); border-radius: 16px;
padding: 30px 28px 26px; box-shadow: 0 1px 2px rgba(16,24,40,.04); display: flex; flex-direction: column;
}
.price-card.featured { border: 2px solid var(--blue); box-shadow: 0 12px 36px rgba(37,99,235,.16); }
.price-card.enterprise {
background: linear-gradient(160deg, #101a30 0%, #0d1526 70%);
border: 1px solid #2a3b5e; box-shadow: 0 14px 40px rgba(13,21,38,.4);
}
.price-card.enterprise .plan { color: #8b99b0; }
.price-card.enterprise .price b { color: #fff; font-size: 36px; }
.price-card.enterprise .price span { color: #8b99b0; }
.price-card.enterprise .plan-sub { color: #8b99b0; }
.price-card.enterprise li { color: #aab8d0; border-bottom-color: #22304f; }
.price-card.enterprise .deal-note {
margin-top: 14px; font-size: 11.5px; line-height: 1.7; color: #8b99b0;
background: rgba(255,255,255,.05); border: 1px dashed #2a3b5e; border-radius: 9px; padding: 9px 12px;
}
.price-card.enterprise .deal-note b { color: #93c5fd; }
.btn-dark { background: #fff; color: #0d1526 !important; }
.btn-dark:hover { transform: translateY(-1px); background: #e8eefc; }
.plan-tag {
position: absolute; top: -13px; left: 50%; transform: translateX(-50%);
background: var(--blue); color: #fff; font-size: 12px; font-weight: 700;
padding: 3px 14px; border-radius: 999px; white-space: nowrap;
}
.plan-tag.dark { background: #0d1526; border: 1px solid #2a3b5e; }
.plan { font-size: 16px; font-weight: 700; color: var(--text-2); }
.price { margin: 8px 0 2px; }
.price b { font-size: 44px; font-weight: 800; letter-spacing: -.02em; color: var(--text); }
.price span { color: var(--text-3); font-size: 14px; margin-left: 4px; }
.plan-sub { color: var(--text-3); font-size: 13px; margin-bottom: 18px; }
.price-card ul { list-style: none; padding: 0; margin: 0 0 22px; flex: 1; }
.price-card li { font-size: 13.5px; color: var(--text-2); padding: 6px 0; border-bottom: 1px dashed var(--border); }
.price-card li:last-child { border-bottom: none; }
.price-card .btn { width: 100%; }
.growth-title { text-align: center; font-size: 20px; font-weight: 700; margin: 52px 0 22px; }
/* ---------- FAQ ---------- */
.faq details {
background: #fff; border: 1px solid var(--border); border-radius: 12px;
padding: 16px 20px; margin-bottom: 12px;
}
.faq summary { font-weight: 600; cursor: pointer; font-size: 15px; list-style: none; display: flex; justify-content: space-between; }
.faq summary::after { content: "+"; color: var(--text-3); font-weight: 400; }
.faq details[open] summary::after { content: "-"; }
.faq details p { margin: 10px 0 0; color: var(--text-2); font-size: 14px; }
/* ---------- CTA ---------- */
.cta {
background: linear-gradient(135deg, #1d4ed8 0%, #2563eb 55%, #3b82f6 100%);
color: #fff; text-align: center; padding: 72px 24px;
}
.cta h2 { font-size: 32px; font-weight: 800; margin: 0 0 10px; }
.cta p { color: rgba(255,255,255,.85); margin: 0 0 28px; }
/* ---------- Footer ---------- */
.footer { background: #0d1526; color: #8b99b0; padding: 52px 0 0; font-size: 13.5px; }
.footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 32px; padding-bottom: 36px; }
.footer .brand-name { color: #fff !important; }
.footer .f-logo { display: block; border-radius: 8px; }
.footer .brand { display: flex; align-items: center; gap: 9px; }
.footer-desc { margin: 12px 0 0; font-size: 13px; line-height: 1.8; }
.footer h4 { color: #fff; font-size: 13.5px; margin: 4px 0 12px; }
.footer a { display: block; color: #8b99b0 !important; padding: 4px 0; font-size: 13px; }
.footer a:hover { color: #fff !important; }
.footer-bar { border-top: 1px solid #1e2b45; text-align: center; padding: 18px; font-size: 12px; color: #5c6a83; }
/* ---------- 响应式 ---------- */
@media (max-width: 1020px) {
.hero-inner { grid-template-columns: 1fr; padding-top: 52px; }
.mock { transform: none; }
.g4 { grid-template-columns: repeat(2, minmax(0,1fr)); }
.g3 { grid-template-columns: repeat(2, minmax(0,1fr)); }
.pricing, .pricing.three { grid-template-columns: minmax(0, 420px); }
.footer-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 680px) {
.nav-links { display: none; }
.hero h1 { font-size: 32px; }
.sec-title { font-size: 24px; }
.g3, .g4 { grid-template-columns: 1fr; }
.footer-grid { grid-template-columns: 1fr; }
}