popiart-server
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1109 lines
35 KiB

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Popi.art SkillHub</title>
<style>
:root {
--bg: #f5f5f7;
--panel: #ffffff;
--panel-soft: #fbfbfd;
--line: rgba(33, 35, 41, 0.08);
--ink: #202229;
--muted: #6e7485;
--primary: #6447f8;
--primary-deep: #2d243f;
--primary-soft: rgba(100, 71, 248, 0.1);
--success: #1ab37a;
--danger: #ef5a57;
--shadow: 0 20px 60px rgba(28, 30, 37, 0.08);
--radius-xl: 32px;
--radius-lg: 24px;
--radius-md: 18px;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
color: var(--ink);
font-family: "Inter", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
background:
radial-gradient(circle at top right, rgba(100, 71, 248, 0.08), transparent 26%),
linear-gradient(180deg, #f7f7fa 0%, #f0f1f5 100%);
}
a {
color: inherit;
text-decoration: none;
}
button {
font: inherit;
}
.page-shell {
min-height: 100vh;
padding: 20px;
}
.layout {
display: grid;
grid-template-columns: 250px minmax(0, 1fr);
gap: 18px;
}
.sidebar {
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - 40px);
padding: 18px 16px 18px;
border: 1px solid var(--line);
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
box-shadow: var(--shadow);
backdrop-filter: blur(18px);
}
.brand {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 8px 20px;
font-size: 18px;
font-weight: 800;
}
.brand-mark {
display: grid;
place-items: center;
width: 38px;
height: 38px;
border-radius: 14px;
background: linear-gradient(135deg, #120f1d 0%, #6447f8 100%);
color: #fff;
font-size: 14px;
letter-spacing: 0.08em;
}
.brand-wordmark {
font-size: 20px;
}
.brand-wordmark span {
color: var(--primary);
}
.nav-list {
display: grid;
gap: 8px;
}
.nav-item {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
border-radius: 18px;
color: var(--muted);
transition: 160ms ease;
}
.nav-item:hover,
.nav-item.is-active {
background: #f0f1f4;
color: var(--ink);
}
.nav-item.is-active {
box-shadow: inset 0 0 0 1px rgba(100, 71, 248, 0.08);
}
.nav-icon {
display: grid;
place-items: center;
width: 22px;
height: 22px;
}
.sidebar-footer {
display: grid;
gap: 12px;
}
.download-card,
.profile-card {
padding: 16px;
border-radius: 20px;
background: linear-gradient(145deg, #ffffff 0%, #f7f7fc 100%);
border: 1px solid var(--line);
}
.download-card h3,
.profile-card h3 {
margin: 0 0 6px;
font-size: 15px;
}
.download-card p,
.profile-card p {
margin: 0;
color: var(--muted);
font-size: 13px;
line-height: 1.6;
}
.download-card button {
margin-top: 14px;
}
.main {
display: grid;
gap: 18px;
}
.topbar,
.hero,
.content-card,
.stats-row article,
.table-card,
.spotlight-card,
.cta-card {
border: 1px solid var(--line);
border-radius: 28px;
background: rgba(255, 255, 255, 0.86);
box-shadow: var(--shadow);
}
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
padding: 16px 22px;
}
.crumbs {
display: flex;
align-items: center;
gap: 14px;
color: var(--muted);
font-size: 14px;
}
.crumbs strong {
color: var(--ink);
}
.topbar-actions {
display: flex;
align-items: center;
gap: 10px;
}
.pill {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 12px 16px;
border-radius: 16px;
background: #f7f8fb;
color: var(--muted);
font-size: 14px;
}
.hero {
padding: 24px;
}
.hero-stage {
display: grid;
grid-template-columns: 1.2fr 0.8fr;
gap: 22px;
align-items: stretch;
padding: 24px;
border-radius: var(--radius-xl);
background:
radial-gradient(circle at top left, rgba(100, 71, 248, 0.14), transparent 28%),
radial-gradient(circle at bottom right, rgba(255, 209, 178, 0.2), transparent 30%),
linear-gradient(180deg, #ffffff 0%, #f7f5ff 100%);
}
.hero-visual {
position: relative;
overflow: hidden;
border-radius: 24px;
min-height: 360px;
background:
linear-gradient(180deg, rgba(220, 202, 255, 0.38), rgba(255, 255, 255, 0.06)),
linear-gradient(145deg, #f6ebff 0%, #fff8f0 100%);
}
.hero-copy {
display: flex;
flex-direction: column;
justify-content: center;
padding: 20px 6px 20px 8px;
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
margin-bottom: 12px;
color: var(--primary);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.14em;
}
.hero-copy h1 {
margin: 0;
font-size: clamp(2.6rem, 5vw, 4.5rem);
line-height: 1;
letter-spacing: -0.03em;
}
.hero-copy h1 span {
color: var(--primary);
}
.hero-copy p {
margin: 20px 0 0;
max-width: 460px;
color: var(--muted);
font-size: 18px;
line-height: 1.7;
}
.hero-actions {
display: flex;
gap: 12px;
margin-top: 30px;
flex-wrap: wrap;
}
.hero-meta {
display: flex;
gap: 14px;
margin-top: 22px;
flex-wrap: wrap;
}
.hero-meta .pill {
background: #fff;
}
.hero-dots {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 14px;
}
.hero-dot {
width: 9px;
height: 9px;
border-radius: 999px;
background: rgba(32, 34, 41, 0.18);
transition: 160ms ease;
}
.hero-dot.is-active {
width: 24px;
background: var(--primary);
}
.stats-row {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 18px;
}
.stats-row article {
padding: 20px 22px;
}
.stats-row strong {
display: block;
font-size: 30px;
letter-spacing: -0.04em;
}
.stats-row span {
display: block;
margin-top: 8px;
color: var(--muted);
font-size: 14px;
}
.content-grid {
display: grid;
grid-template-columns: 1.2fr 0.8fr;
gap: 18px;
}
.content-card {
padding: 22px;
}
.content-head {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 16px;
margin-bottom: 18px;
}
.content-head h2 {
margin: 8px 0 0;
font-size: 28px;
letter-spacing: -0.03em;
}
.content-head p {
margin: 8px 0 0;
color: var(--muted);
line-height: 1.7;
}
.button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 46px;
padding: 0 18px;
border: 0;
border-radius: 16px;
cursor: pointer;
font-weight: 700;
transition: transform 160ms ease, box-shadow 160ms ease;
}
.button:hover {
transform: translateY(-1px);
}
.button-primary {
color: #fff;
background: linear-gradient(90deg, #16131d 0%, var(--primary) 100%);
box-shadow: 0 12px 28px rgba(100, 71, 248, 0.24);
}
.button-secondary {
color: var(--ink);
background: #f1f2f7;
}
.skill-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
.skill-card {
padding: 18px;
border: 1px solid var(--line);
border-radius: 22px;
background: linear-gradient(145deg, #ffffff 0%, #fafaff 100%);
}
.skill-card-top {
display: flex;
justify-content: space-between;
gap: 12px;
align-items: center;
}
.skill-card h3 {
margin: 12px 0 8px;
font-size: 18px;
}
.skill-card p {
margin: 0;
color: var(--muted);
font-size: 14px;
line-height: 1.7;
}
.badge {
display: inline-flex;
align-items: center;
padding: 8px 10px;
border-radius: 999px;
font-size: 12px;
font-weight: 700;
}
.badge-official {
color: var(--primary);
background: var(--primary-soft);
}
.badge-live {
color: var(--success);
background: rgba(26, 179, 122, 0.12);
}
.badge-beta {
color: #ef8e25;
background: rgba(239, 142, 37, 0.14);
}
.skill-meta {
display: flex;
gap: 12px;
margin-top: 16px;
flex-wrap: wrap;
color: var(--muted);
font-size: 13px;
}
.table-card {
padding: 22px;
}
.table-list {
display: grid;
gap: 14px;
}
.table-row {
display: flex;
justify-content: space-between;
gap: 14px;
padding: 14px 0;
border-bottom: 1px solid rgba(33, 35, 41, 0.08);
}
.table-row:last-child {
border-bottom: 0;
}
.table-row strong {
display: block;
margin-bottom: 4px;
}
.table-row span,
.table-row p {
margin: 0;
color: var(--muted);
font-size: 13px;
}
.stack {
display: grid;
gap: 18px;
}
.spotlight-card {
padding: 22px;
background:
radial-gradient(circle at top right, rgba(100, 71, 248, 0.14), transparent 26%),
linear-gradient(145deg, #ffffff 0%, #f7f4ff 100%);
}
.spotlight-card h2,
.cta-card h2 {
margin: 10px 0 8px;
font-size: 26px;
letter-spacing: -0.03em;
}
.spotlight-card p,
.cta-card p {
margin: 0;
color: var(--muted);
line-height: 1.7;
}
.price-box {
display: flex;
align-items: flex-end;
gap: 8px;
margin-top: 18px;
}
.price-box strong {
font-size: 42px;
letter-spacing: -0.05em;
}
.benefit-list {
display: grid;
gap: 10px;
margin-top: 18px;
}
.benefit-item {
display: flex;
align-items: flex-start;
gap: 10px;
color: var(--muted);
font-size: 14px;
line-height: 1.6;
}
.benefit-item svg {
flex-shrink: 0;
margin-top: 2px;
color: var(--primary);
}
.cta-card {
padding: 22px;
background: linear-gradient(145deg, #14111d 0%, #433085 100%);
color: #fff;
}
.cta-card p {
color: rgba(255, 255, 255, 0.72);
}
.cta-card .button-secondary {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.footer-note {
margin-top: 10px;
color: var(--muted);
font-size: 13px;
}
.illustration {
width: 100%;
height: 100%;
}
@media (max-width: 1200px) {
.layout,
.hero-stage,
.content-grid {
grid-template-columns: 1fr;
}
.sidebar {
min-height: auto;
}
}
@media (max-width: 900px) {
.page-shell {
padding: 14px;
}
.stats-row,
.skill-grid {
grid-template-columns: 1fr;
}
.topbar {
flex-direction: column;
align-items: stretch;
}
.topbar-actions {
flex-wrap: wrap;
}
}
</style>
</head>
<body>
<div class="page-shell">
<div class="layout">
<aside class="sidebar">
<div>
<div class="brand">
<div class="brand-mark">PA</div>
<div class="brand-wordmark">Popi<span>.art</span></div>
</div>
<nav class="nav-list" aria-label="主导航">
<a class="nav-item is-active" href="#home">
<span class="nav-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M4 10.5 12 4l8 6.5V20a1 1 0 0 1-1 1h-4.5v-6h-5v6H5a1 1 0 0 1-1-1v-9.5Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>
</svg>
</span>
<strong>首页</strong>
</a>
<a class="nav-item" href="#skills">
<span class="nav-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<rect x="4" y="4" width="7" height="7" rx="2" stroke="currentColor" stroke-width="1.8"/>
<rect x="13" y="4" width="7" height="7" rx="2" stroke="currentColor" stroke-width="1.8"/>
<rect x="4" y="13" width="7" height="7" rx="2" stroke="currentColor" stroke-width="1.8"/>
<rect x="13" y="13" width="7" height="7" rx="2" stroke="currentColor" stroke-width="1.8"/>
</svg>
</span>
<strong>SkillHub 技能</strong>
</a>
<a class="nav-item" href="#keys">
<span class="nav-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M13.5 7.5a4.5 4.5 0 1 0 0 9h1.5l2 2h2l1.5-1.5-1.5-1.5 1.5-1.5-2-2h-1a4.5 4.5 0 0 0-4-4.5Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>
</svg>
</span>
<strong>API 密钥</strong>
</a>
<a class="nav-item" href="#billing">
<span class="nav-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M7 4h10l3 3v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h2Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>
<path d="M8 11h8M8 15h8" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
</svg>
</span>
<strong>账单</strong>
</a>
<a class="nav-item" href="#docs">
<span class="nav-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M6 5.5A2.5 2.5 0 0 1 8.5 3H20v17H8.5A2.5 2.5 0 0 0 6 22V5.5Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>
<path d="M6 6h10" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
</svg>
</span>
<strong>文档</strong>
</a>
<a class="nav-item" href="#pricing">
<span class="nav-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M6 8c0-2.2 2.7-4 6-4s6 1.8 6 4-2.7 4-6 4-6-1.8-6-4Zm0 8c0-2.2 2.7-4 6-4s6 1.8 6 4-2.7 4-6 4-6-1.8-6-4Z" stroke="currentColor" stroke-width="1.8"/>
</svg>
</span>
<strong>定价</strong>
</a>
</nav>
</div>
<div class="sidebar-footer">
<div class="download-card">
<h3>PopiStudio Desktop</h3>
<p>下载 PC 客户端后,可以直接复制官方 Skills 一键使用。</p>
<button class="button button-primary" type="button">立即下载</button>
</div>
<div class="profile-card">
<h3>本地静态预览</h3>
<p>这是独立版 `skillhub_index.html`,不依赖测试站和后端接口。</p>
</div>
</div>
</aside>
<main class="main">
<header class="topbar">
<div class="crumbs">
<span>Popi.art 控制台</span>
<span>/</span>
<strong>首页</strong>
</div>
<div class="topbar-actions">
<span class="pill">官方 Skill 平台</span>
<span class="pill">中 / EN</span>
<button class="button button-secondary" type="button">查看文档</button>
<button class="button button-primary" type="button">登录/注册</button>
</div>
</header>
<section class="hero" id="home">
<div class="hero-stage">
<div class="hero-visual">
<svg class="illustration" viewBox="0 0 760 480" preserveAspectRatio="xMidYMid slice">
<defs>
<linearGradient id="sky" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#d5cbff" />
<stop offset="45%" stop-color="#ffe5d8" />
<stop offset="100%" stop-color="#f6f8ff" />
</linearGradient>
<linearGradient id="coat" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#e6d6ca" />
<stop offset="100%" stop-color="#c3ab9e" />
</linearGradient>
</defs>
<rect width="760" height="480" fill="url(#sky)" />
<circle cx="590" cy="112" r="62" fill="rgba(255,223,185,0.8)" />
<rect x="0" y="360" width="760" height="120" fill="#f5f7fb" />
<g opacity="0.85">
<rect x="58" y="170" width="68" height="190" rx="18" fill="#8d7e8d" />
<rect x="72" y="130" width="42" height="46" rx="21" fill="#66545e" />
<rect x="170" y="140" width="92" height="220" rx="22" fill="#9b8791" />
<rect x="194" y="96" width="48" height="52" rx="24" fill="#735f66" />
<rect x="632" y="176" width="58" height="186" rx="18" fill="#7a6f7f" />
<rect x="646" y="138" width="32" height="44" rx="16" fill="#5f5464" />
</g>
<g opacity="0.18" stroke="#ffffff">
<path d="M0 220 C180 180 280 320 460 260 S640 180 760 212" stroke-width="14" fill="none" />
<path d="M0 290 C160 250 340 360 500 310 S650 250 760 286" stroke-width="12" fill="none" />
</g>
<g transform="translate(232 142)">
<circle cx="88" cy="68" r="34" fill="#f0d6c8" />
<path d="M60 56c12-24 56-24 64 4v18H58V56Z" fill="#2d243f" />
<path d="M40 130c18-34 102-34 122 0l10 108H30l10-108Z" fill="url(#coat)" />
<rect x="66" y="238" width="24" height="80" rx="12" fill="#f2e7dc" />
<rect x="102" y="238" width="24" height="80" rx="12" fill="#f2e7dc" />
</g>
<g transform="translate(392 114)">
<circle cx="92" cy="62" r="34" fill="#efd1bd" />
<path d="M58 44c14-20 64-16 70 16l-2 16H58V44Z" fill="#241f28" />
<path d="M36 118c18-34 112-34 136 0l18 128H18l18-128Z" fill="url(#coat)" />
<rect x="76" y="246" width="26" height="94" rx="12" fill="#fafafa" />
<rect x="114" y="246" width="26" height="94" rx="12" fill="#fafafa" />
</g>
<g fill="#ffffff" opacity="0.92">
<circle cx="62" cy="56" r="5" />
<circle cx="118" cy="112" r="3" />
<circle cx="162" cy="72" r="4" />
<circle cx="214" cy="124" r="6" />
<circle cx="268" cy="76" r="3" />
<circle cx="312" cy="102" r="4" />
<circle cx="366" cy="62" r="5" />
<circle cx="426" cy="126" r="3" />
<circle cx="472" cy="78" r="4" />
<circle cx="516" cy="110" r="5" />
<circle cx="586" cy="58" r="4" />
<circle cx="636" cy="120" r="3" />
<circle cx="694" cy="84" r="5" />
<circle cx="730" cy="138" r="4" />
<circle cx="84" cy="208" r="4" />
<circle cx="154" cy="228" r="5" />
<circle cx="226" cy="194" r="4" />
<circle cx="286" cy="258" r="6" />
<circle cx="354" cy="214" r="4" />
<circle cx="422" cy="242" r="3" />
<circle cx="474" cy="208" r="4" />
<circle cx="548" cy="234" r="6" />
<circle cx="602" cy="186" r="4" />
<circle cx="674" cy="238" r="3" />
<circle cx="726" cy="216" r="5" />
<circle cx="98" cy="324" r="4" />
<circle cx="184" cy="298" r="5" />
<circle cx="264" cy="346" r="3" />
<circle cx="352" cy="320" r="4" />
<circle cx="436" cy="334" r="6" />
<circle cx="514" cy="312" r="4" />
<circle cx="604" cy="344" r="5" />
<circle cx="704" cy="306" r="4" />
</g>
</svg>
</div>
<div class="hero-copy">
<div class="eyebrow">POP I . STUDIO LAUNCH</div>
<h1 id="hero-title"><span>Popi.Studio</span> 已上线</h1>
<p id="hero-description">下载 PC 客户端后,可复制官方 Skills 一键使用,并在统一控制台管理 API 密钥、订阅和账单。</p>
<div class="hero-actions">
<button class="button button-primary" id="hero-button" type="button">立即下载</button>
<button class="button button-secondary" type="button">查看控制台</button>
</div>
<div class="hero-meta">
<span class="pill">24+ 官方技能</span>
<span class="pill">统一账号与计费</span>
<span class="pill">支持创作者与团队</span>
</div>
</div>
</div>
<div class="hero-dots" aria-label="轮播切换">
<span class="hero-dot is-active" data-dot="0"></span>
<span class="hero-dot" data-dot="1"></span>
<span class="hero-dot" data-dot="2"></span>
</div>
</section>
<section class="stats-row">
<article>
<strong>24+</strong>
<span>官方 Skill 数量</span>
</article>
<article>
<strong>12,480</strong>
<span>本月可用 Credits</span>
</article>
<article>
<strong>6</strong>
<span>活跃项目</span>
</article>
<article>
<strong>¥412.60</strong>
<span>当前账单周期支出</span>
</article>
</section>
<section class="content-grid">
<div class="content-card" id="skills">
<div class="content-head">
<div>
<div class="eyebrow">OFFICIAL SKILLS</div>
<h2>SkillHub 技能一览</h2>
<p>这里展示的是主页上的精选能力卡片,后续可以接真实 skill 列表、标签筛选、搜索和详情页。</p>
</div>
<button class="button button-secondary" type="button">查看全部技能</button>
</div>
<div class="skill-grid">
<article class="skill-card">
<div class="skill-card-top">
<span class="badge badge-official">OFFICIAL</span>
<span class="badge badge-live">LIVE</span>
</div>
<h3>文生图</h3>
<p>从简短 prompt 生成高质量图像,适合概念草图、封面与品牌 KV 初稿。</p>
<div class="skill-meta">
<span>Route: image.text2image</span>
<span>10 Credits / 次</span>
</div>
</article>
<article class="skill-card">
<div class="skill-card-top">
<span class="badge badge-official">OFFICIAL</span>
<span class="badge badge-live">LIVE</span>
</div>
<h3>图像编辑</h3>
<p>支持参考图编辑、局部重绘、风格转换和多轮修图工作流。</p>
<div class="skill-meta">
<span>Route: image.img2img</span>
<span>18 Credits / 次</span>
</div>
</article>
<article class="skill-card">
<div class="skill-card-top">
<span class="badge badge-official">OFFICIAL</span>
<span class="badge badge-beta">BETA</span>
</div>
<h3>图生视频</h3>
<p>将静态首帧转为短视频,适合商品动效、角色展示与营销内容。</p>
<div class="skill-meta">
<span>Route: video.image2video</span>
<span>120 Credits / 任务</span>
</div>
</article>
<article class="skill-card">
<div class="skill-card-top">
<span class="badge badge-official">OFFICIAL</span>
<span class="badge badge-beta">BETA</span>
</div>
<h3>抠图与超清</h3>
<p>面向电商、内容和工作室场景的高频工具类 Skill,适合批量化处理。</p>
<div class="skill-meta">
<span>Route: image.utility</span>
<span>6 Credits / 次</span>
</div>
</article>
</div>
</div>
<div class="stack">
<div class="table-card" id="keys">
<div class="content-head">
<div>
<div class="eyebrow">API KEYS</div>
<h2>密钥管理</h2>
</div>
</div>
<div class="table-list">
<div class="table-row">
<div>
<strong>Primary App Key</strong>
<span>pk_live_****9f2d</span>
</div>
<p>skills:read jobs:write</p>
</div>
<div class="table-row">
<div>
<strong>Automation Key</strong>
<span>pk_live_****1a70</span>
</div>
<p>artifacts:read</p>
</div>
<div class="table-row">
<div>
<strong>Rotation Status</strong>
<span>上次更新:2026-03-24</span>
</div>
<p style="color: var(--success);">安全</p>
</div>
</div>
</div>
<div class="spotlight-card" id="pricing">
<div class="eyebrow">SUBSCRIPTION</div>
<h2>Pro Subscription</h2>
<p>适合个人创作者和小团队的标准套餐,统一获得官方 Skills、用量统计和控制台能力。</p>
<div class="price-box">
<strong>¥69.99</strong>
<span>/ 月</span>
</div>
<div class="benefit-list">
<div class="benefit-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="m5 13 4 4L19 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>每月 12,000 Credits</span>
</div>
<div class="benefit-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="m5 13 4 4L19 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>项目级路由与账单视图</span>
</div>
<div class="benefit-item">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="m5 13 4 4L19 7" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>支持叠加充值包</span>
</div>
</div>
</div>
</div>
</section>
<section class="content-grid">
<div class="table-card" id="billing">
<div class="content-head">
<div>
<div class="eyebrow">BILLING</div>
<h2>近期账单与用量</h2>
<p>这部分可以直接演进成正式账单页,包括套餐、充值、Credits 消费和发票记录。</p>
</div>
</div>
<div class="table-list">
<div class="table-row">
<div>
<strong>文生图</strong>
<span>682 calls</span>
</div>
<p>¥118.20</p>
</div>
<div class="table-row">
<div>
<strong>图像编辑</strong>
<span>391 calls</span>
</div>
<p>¥94.60</p>
</div>
<div class="table-row">
<div>
<strong>图生视频</strong>
<span>77 jobs</span>
</div>
<p>¥199.80</p>
</div>
</div>
<div class="footer-note">有效期剩余 18 天,可随时追加 Credits Top-up。</div>
</div>
<div class="stack">
<div class="table-card" id="docs">
<div class="content-head">
<div>
<div class="eyebrow">DOCS</div>
<h2>快速开始</h2>
</div>
</div>
<div class="table-list">
<div class="table-row">
<div>
<strong>1. 登录账号</strong>
<span>获取产品层 token</span>
</div>
<p>Auth</p>
</div>
<div class="table-row">
<div>
<strong>2. 配置 CLI / API</strong>
<span>统一指向产品后端</span>
</div>
<p>Setup</p>
</div>
<div class="table-row">
<div>
<strong>3. 调用官方 Skills</strong>
<span>查看 jobs 与 artifacts</span>
</div>
<p>Run</p>
</div>
</div>
</div>
<div class="cta-card">
<div class="eyebrow" style="color: rgba(255,255,255,0.72);">NEXT STEP</div>
<h2>继续扩成完整官网</h2>
<p>这个独立 HTML 已经把首页、技能、API 密钥、账单、文档和订阅的核心模块收在一个页面里,下一步可以拆成正式多页站点。</p>
<div class="hero-actions">
<button class="button button-secondary" type="button">拆分为多页</button>
<button class="button button-primary" type="button">接入真实 API</button>
</div>
</div>
</div>
</section>
</main>
</div>
</div>
<script>
(function () {
const slides = [
{
title: "<span>Popi.Studio</span> 已上线",
description:
"下载 PC 客户端后,可复制官方 Skills 一键使用,并在统一控制台管理 API 密钥、订阅和账单。",
button: "立即下载",
},
{
title: "官方 <span>SkillHub</span> 控制台",
description:
"把技能目录、项目级路由、Credits 消费和账单都放在同一个产品层界面中管理。",
button: "查看技能",
},
{
title: "<span>Billing</span> 与充值一体化",
description:
"适合个人创作者和团队的订阅、充值、用量归因视图,为后续正式账单页提供本地稿。",
button: "管理订阅",
},
];
const title = document.getElementById("hero-title");
const description = document.getElementById("hero-description");
const button = document.getElementById("hero-button");
const dots = Array.from(document.querySelectorAll(".hero-dot"));
let index = 0;
function renderSlide(nextIndex) {
index = nextIndex;
title.innerHTML = slides[index].title;
description.textContent = slides[index].description;
button.textContent = slides[index].button;
dots.forEach(function (dot, dotIndex) {
dot.classList.toggle("is-active", dotIndex === index);
});
}
dots.forEach(function (dot) {
dot.addEventListener("click", function () {
renderSlide(Number(dot.dataset.dot || 0));
});
});
setInterval(function () {
renderSlide((index + 1) % slides.length);
}, 4200);
})();
</script>
</body>
</html>