feat(home): 首页改为 portrait 真实布局,放弃重卡片网格
- 新增三句价值主张:「不会?我们提供标准的业务陪跑/没地?一键申请入驻园区/没单?我们开放接单生态」(居中段落) - 特征分栏:左「发光渐变面板 + 单个悬浮UI窗口(近期活动/接单)」+ 右「kicker胶囊 + 大标题(内联强调色词) + 副文 + 头像墙」 - 移除原多卡片网格:统计卡×4 / 快捷入口卡×4 / 前后对比卡×2 / 三档定价卡 - 三步上手改细步骤栏;近期场次改倒计时+行列表;FAQ/报名CTA/多栏页脚保留 - 像素彩虹大标题保留
This commit is contained in:
+80
-207
@@ -1,242 +1,115 @@
|
||||
/* ============================================================
|
||||
首页营销落地页 · portrait.so 风格(浅色,明暗双模走 token)
|
||||
首页 · portrait.so 风格(浅色,明暗双模走 token)
|
||||
布局:特征分栏(发光面板+悬浮窗口+文案) / 居中主张 / 细步骤 / 倒计时+行列表 / FAQ
|
||||
============================================================ */
|
||||
.page-marketing {
|
||||
position: relative; z-index: 1;
|
||||
min-height: 100vh; min-height: 100dvh;
|
||||
display: flex; flex-direction: column;
|
||||
overflow-x: clip;
|
||||
}
|
||||
.marketing-main { flex: 1; width: 100%; max-width: 1080px; margin: 0 auto; padding: clamp(16px, 3vw, 32px) clamp(16px, 3vw, 32px) 70px; }
|
||||
.mk-section { margin-top: clamp(60px, 9vh, 104px); }
|
||||
.page-marketing { position: relative; z-index: 1; min-height: 100vh; min-height: 100dvh; display: flex; flex-direction: column; overflow-x: clip; }
|
||||
.marketing-main { flex: 1; width: 100%; max-width: 1160px; margin: 0 auto; padding: clamp(16px, 3vw, 32px) clamp(16px, 3vw, 32px) 80px; }
|
||||
|
||||
/* ---------- Hero ---------- */
|
||||
.mk-hero {
|
||||
min-height: 74vh; display: flex; flex-direction: column; align-items: center; justify-content: center;
|
||||
text-align: center; padding: clamp(40px, 8vh, 90px) 0 clamp(28px, 5vh, 48px);
|
||||
}
|
||||
.mk-kicker {
|
||||
display: inline-flex; align-items: center; gap: 8px;
|
||||
border: 1px solid var(--line); color: var(--muted);
|
||||
background: var(--panel); border-radius: 999px; padding: 7px 16px;
|
||||
font-size: 12.5px; letter-spacing: .02em; margin-bottom: 24px;
|
||||
}
|
||||
.mk-display {
|
||||
font-family: var(--font-pixel);
|
||||
color: var(--heading);
|
||||
font-size: clamp(30px, 6.4vw, 74px);
|
||||
line-height: 1.06; letter-spacing: 0; font-weight: 400;
|
||||
max-width: 1080px;
|
||||
}
|
||||
.pt-hero { display: flex; flex-direction: column; align-items: center; text-align: center; padding: clamp(56px, 11vh, 132px) 0 clamp(40px, 7vh, 72px); }
|
||||
.mk-kicker { display: inline-flex; align-items: center; gap: 8px; border: 1px solid var(--line); color: var(--muted); background: var(--panel); border-radius: 999px; padding: 7px 16px; font-size: 12.5px; margin-bottom: 26px; }
|
||||
.mk-display { font-family: var(--font-pixel); color: var(--heading); font-size: clamp(30px, 6.4vw, 74px); line-height: 1.06; font-weight: 400; }
|
||||
.mk-display span { display: block; }
|
||||
.mk-display em {
|
||||
font-style: normal;
|
||||
background: var(--rainbow);
|
||||
-webkit-background-clip: text; background-clip: text;
|
||||
-webkit-text-fill-color: transparent; color: transparent;
|
||||
}
|
||||
.mk-display em { font-style: normal; background: var(--rainbow); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; }
|
||||
.mk-lede { max-width: 640px; margin-top: 26px; font-size: 17px; color: var(--text-soft); line-height: 1.75; }
|
||||
.mk-lede b { color: var(--heading); font-weight: 600; }
|
||||
.mk-cta { display: flex; gap: 12px; flex-wrap: wrap; justify-content: center; margin-top: 32px; }
|
||||
.btn-ghost {
|
||||
display: inline-flex; align-items: center; justify-content: center;
|
||||
border-radius: 999px; border: 1px solid var(--line); color: var(--text-soft);
|
||||
background: transparent; font-weight: 600; font-size: 14px; padding: 12px 26px;
|
||||
transition: border-color .2s ease, color .2s ease, transform .2s var(--ease);
|
||||
}
|
||||
.btn-ghost { display: inline-flex; align-items: center; justify-content: center; border-radius: 999px; border: 1px solid var(--line); color: var(--text-soft); background: transparent; font-weight: 600; font-size: 14px; padding: 12px 26px; transition: border-color .2s ease, color .2s ease, transform .2s var(--ease); }
|
||||
.btn-ghost:hover { border-color: var(--heading); color: var(--heading); transform: translateY(-1px); }
|
||||
|
||||
.mk-hero-stats {
|
||||
display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;
|
||||
width: 100%; max-width: 960px; margin-top: 56px;
|
||||
}
|
||||
.mk-hero-stat {
|
||||
background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-3xl);
|
||||
padding: 20px 12px; box-shadow: var(--shadow-sm-border);
|
||||
display: flex; flex-direction: column; align-items: center; gap: 4px;
|
||||
}
|
||||
.mk-hero-stat b { font-family: var(--font-display); font-size: clamp(26px, 3.4vw, 38px); color: var(--heading); letter-spacing: -.02em; line-height: 1; }
|
||||
.mk-hero-stat span { font-size: 12.5px; color: var(--muted); }
|
||||
/* ---------- 通用小节 ---------- */
|
||||
.pt-section { margin-top: clamp(72px, 12vh, 150px); }
|
||||
.pt-h { font-family: var(--font-sans); font-weight: 550; font-size: clamp(28px, 4.6vw, 56px); line-height: 1.12; letter-spacing: -.035em; color: var(--heading); }
|
||||
.pt-h .ac { color: var(--primary); }
|
||||
.pt-h.center { text-align: center; }
|
||||
.pt-p { margin-top: 18px; font-size: 16.5px; line-height: 1.7; color: var(--text-soft); max-width: 560px; }
|
||||
.pt-p.dim { color: var(--muted); }
|
||||
.pt-p.center { margin-left: auto; margin-right: auto; text-align: center; }
|
||||
|
||||
/* ---------- 便捷入口 ---------- */
|
||||
.mk-quick-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
|
||||
.mk-quick-card {
|
||||
position: relative; display: flex; flex-direction: column; align-items: flex-start;
|
||||
padding: 24px 22px; border-radius: var(--radius-3xl);
|
||||
background: var(--surface); border: 1px solid var(--border);
|
||||
box-shadow: var(--shadow-sm-border);
|
||||
transition: transform .3s var(--ease), box-shadow .3s ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
.mk-quick-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
|
||||
.mk-quick-icon {
|
||||
width: 46px; height: 46px; border-radius: 16px;
|
||||
background: var(--primary-soft); color: var(--primary);
|
||||
display: grid; place-items: center;
|
||||
}
|
||||
.mk-quick-en { margin-top: 16px; font-family: var(--font-mono); font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); }
|
||||
.mk-quick-title { margin-top: 4px; font-size: 18px; font-weight: 700; color: var(--heading); }
|
||||
.mk-quick-desc { margin-top: 6px; font-size: 13px; color: var(--text-soft); line-height: 1.5; }
|
||||
.mk-quick-arrow { position: absolute; right: 18px; top: 50%; transform: translateY(-50%); color: var(--muted); }
|
||||
/* ---------- 特征分栏 ---------- */
|
||||
.pt-split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(40px, 6vw, 88px); align-items: center; }
|
||||
.pt-stage { border-radius: 44px; min-height: clamp(320px, 40vh, 460px); display: grid; place-items: center; padding: clamp(30px, 5vw, 56px); position: relative; overflow: hidden; }
|
||||
.pt-stage::before { content: ''; position: absolute; inset: 0; }
|
||||
.pt-stage.blue { background: linear-gradient(160deg, #dfe9ff, #e6efff 45%, #f3eeff); }
|
||||
.pt-stage.blue::before { background: radial-gradient(60% 50% at 16% 20%, rgba(98,132,255,.32), transparent 60%), radial-gradient(50% 44% at 96% 90%, rgba(230,160,255,.28), transparent 60%); }
|
||||
.pt-stage.orange { background: linear-gradient(160deg, #ffefe2, #ffe9f2 45%, #f1ebff); }
|
||||
.pt-stage.orange::before { background: radial-gradient(60% 50% at 14% 18%, rgba(255,150,80,.30), transparent 60%), radial-gradient(50% 44% at 96% 90%, rgba(255,100,160,.24), transparent 60%); }
|
||||
.pt-window { position: relative; width: min(360px, 92%); background: var(--surface); border: 1px solid var(--border); border-radius: 24px; box-shadow: var(--shadow-md), 0 0 0 1px rgba(255,255,255,.4); padding: 22px; }
|
||||
.pt-window-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
|
||||
.pt-win-title { font-size: 15px; font-weight: 700; color: var(--heading); }
|
||||
.pt-live { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: var(--warning); background: var(--warning-soft); border-radius: 999px; padding: 3px 9px; }
|
||||
.pt-live i { width: 6px; height: 6px; border-radius: 50%; background: var(--warning); }
|
||||
.pt-win-order { display: flex; flex-direction: column; gap: 12px; }
|
||||
.pt-list { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--heading); }
|
||||
.pt-list b { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--heading); }
|
||||
.pt-list-sub { font-size: 12px; color: var(--muted); }
|
||||
.pt-send { display: flex; align-items: center; gap: 8px; margin-top: 10px; padding: 11px 14px; border-radius: 14px; background: var(--panel-2); border: 1px solid var(--border); color: var(--text-soft); font-size: 13px; }
|
||||
.pt-copy .pt-kicker { margin-bottom: 18px; }
|
||||
.pt-proof { margin-top: 22px; display: flex; align-items: center; gap: 12px; font-size: 13.5px; color: var(--muted); }
|
||||
.pt-avatars { display: flex; }
|
||||
.pt-ava { width: 30px; height: 30px; border-radius: 50%; background: var(--primary-gradient); border: 2px solid var(--surface); }
|
||||
.pt-ava:nth-child(1) { background: linear-gradient(135deg,#ffb38a,#ff5f86); }
|
||||
.pt-ava:nth-child(2) { background: linear-gradient(135deg,#8ad0ff,#3f8bff); margin-left: -8px; }
|
||||
.pt-ava:nth-child(3) { background: linear-gradient(135deg,#a8f0c8,#00cc3d); margin-left: -8px; }
|
||||
.pt-ava:nth-child(4) { background: linear-gradient(135deg,#ffd47a,#ffa13e); margin-left: -8px; }
|
||||
|
||||
/* ---------- 前后对比 ---------- */
|
||||
.mk-compare { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
|
||||
.mk-mside {
|
||||
background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-3xl);
|
||||
box-shadow: var(--shadow-sm-border); padding: 26px 26px; position: relative; overflow: hidden;
|
||||
}
|
||||
.mk-mside.new { border-color: var(--line); background: linear-gradient(150deg, #eaf0ff, #f2e8ff 52%, #e9f5fb); }
|
||||
.mk-mside h3 { font-size: 17px; font-weight: 700; margin-bottom: 16px; color: var(--heading); }
|
||||
.mk-mside.old h3 { color: var(--muted); }
|
||||
.mk-mside li {
|
||||
display: flex; align-items: flex-start; gap: 8px;
|
||||
font-size: 13.5px; color: var(--text-soft); line-height: 1.6; margin-top: 8px;
|
||||
}
|
||||
.mk-mside li .icon { color: var(--muted); margin-top: 2px; }
|
||||
.mk-mside.new li .icon { color: var(--success); }
|
||||
.mk-quote {
|
||||
margin-top: 20px; text-align: center;
|
||||
font-size: 16.5px; color: var(--heading); font-weight: 500; letter-spacing: .01em;
|
||||
}
|
||||
/* ---------- 居中主张(三句 + 漂浮芯片) ---------- */
|
||||
.pt-center { text-align: center; position: relative; padding: clamp(40px, 6vh, 80px) 0; }
|
||||
.pt-center .pt-kicker { margin-bottom: 20px; }
|
||||
.pt-center .pt-h { margin-top: 10px; }
|
||||
.pt-center .mk-cta { margin-top: 30px; }
|
||||
.pt-meta { display: inline-flex; align-items: center; gap: 6px; margin-top: 22px; font-size: 13px; color: var(--muted); }
|
||||
.pt-chips { position: absolute; inset: 0; pointer-events: none; }
|
||||
.pt-chip { position: absolute; width: 54px; height: 54px; border-radius: 18px; display: grid; place-items: center; background: var(--surface); border: 1px solid var(--border); box-shadow: var(--shadow-sm); color: var(--text-soft); opacity: .9; }
|
||||
.pt-chip.green { color: var(--success); background: var(--success-soft); border-color: transparent; }
|
||||
.pt-chip .icon { width: 26px; height: 26px; }
|
||||
|
||||
/* ---------- 产品 / 定价卡 ---------- */
|
||||
.mk-products { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
|
||||
.mk-product {
|
||||
position: relative; display: flex; flex-direction: column;
|
||||
background: var(--surface); border: 1px solid var(--border);
|
||||
border-radius: var(--radius-3xl); box-shadow: var(--shadow-sm-border);
|
||||
padding: 26px 24px; overflow: hidden;
|
||||
transition: transform .3s var(--ease), box-shadow .3s ease;
|
||||
}
|
||||
.mk-product:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
|
||||
.mk-product.hot { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary), var(--shadow-md); }
|
||||
.mk-badge-flag {
|
||||
position: absolute; top: 16px; right: -30px;
|
||||
background: var(--rainbow); color: #0a0a0a;
|
||||
font-size: 11px; font-weight: 700; padding: 4px 38px; transform: rotate(38deg);
|
||||
}
|
||||
.mk-tag { display: inline-block; font-size: 11px; font-weight: 700; color: var(--on-surface); background: var(--surface); border: 1px solid var(--border); border-radius: 999px; padding: 3px 12px; align-self: flex-start; margin-bottom: 14px; }
|
||||
.mk-tag.alt { background: var(--panel-2); color: var(--text); border-color: transparent; }
|
||||
.mk-pname { font-size: 19px; font-weight: 700; color: var(--heading); }
|
||||
.mk-pprice { font-size: 15px; color: var(--heading); font-weight: 600; margin-top: 4px; }
|
||||
.mk-pprice em { font-style: normal; font-size: 12px; color: var(--muted); font-weight: 500; }
|
||||
.mk-pdesc { font-size: 13.5px; color: var(--text-soft); line-height: 1.65; margin: 10px 0 16px; }
|
||||
.mk-pdel { list-style: none; margin-bottom: 22px; }
|
||||
.mk-pdel li { display: flex; align-items: flex-start; gap: 7px; font-size: 13px; color: var(--text-soft); line-height: 1.6; margin-top: 6px; }
|
||||
.mk-pdel li .icon { color: var(--primary); margin-top: 2px; }
|
||||
.mk-pcta { margin-top: auto; }
|
||||
/* ---------- 三步上手(细栏) ---------- */
|
||||
.pt-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; margin-top: 40px; }
|
||||
.pt-step { display: flex; align-items: flex-start; gap: 16px; padding: 4px 0; }
|
||||
.pt-step-icon { width: 46px; height: 46px; border-radius: 16px; background: var(--primary-soft); color: var(--primary); display: grid; place-items: center; flex-shrink: 0; }
|
||||
.pt-step h4 { font-size: 17px; font-weight: 700; color: var(--heading); }
|
||||
.pt-step p { margin-top: 5px; font-size: 14px; color: var(--text-soft); line-height: 1.6; }
|
||||
|
||||
/* ---------- 高亮带(手艺变产品 / 测评) ---------- */
|
||||
.mk-band {
|
||||
position: relative; overflow: hidden;
|
||||
display: grid; grid-template-columns: 1.5fr 1fr; gap: 32px; align-items: center;
|
||||
background: linear-gradient(135deg, var(--heading) 0%, #0a2b45 100%);
|
||||
border-radius: var(--radius-4xl); padding: clamp(30px, 5vw, 48px);
|
||||
}
|
||||
.mk-band::before {
|
||||
content: ''; position: absolute; inset: 0;
|
||||
background:
|
||||
radial-gradient(50% 60% at 90% 10%, rgba(38,192,255,.30), transparent 60%),
|
||||
radial-gradient(44% 50% at 6% 96%, rgba(230,0,194,.26), transparent 60%),
|
||||
radial-gradient(46% 56% at 92% 96%, rgba(0,204,61,.20), transparent 60%);
|
||||
}
|
||||
.mk-band-intro, .mk-band-side { position: relative; }
|
||||
.mk-band .mk-kicker { border-color: rgba(255,255,255,.24); color: #cfe0ff; background: rgba(255,255,255,.08); }
|
||||
.mk-band-intro h3 { font-size: clamp(26px, 4vw, 42px); font-weight: 500; letter-spacing: -.02em; color: #fff; line-height: 1.15; margin: 6px 0 14px; }
|
||||
.mk-band-intro p { max-width: 540px; font-size: 15px; color: #cfe0ff; line-height: 1.7; }
|
||||
.mk-band .mk-cta { justify-content: flex-start; }
|
||||
.mk-band-side {
|
||||
background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.14);
|
||||
border-radius: var(--radius-3xl); padding: 24px; backdrop-filter: blur(8px);
|
||||
}
|
||||
.mk-band-side .mk-quick-en { color: #9fc4ff; }
|
||||
.mk-band-side b { display: block; margin-top: 8px; font-size: 22px; font-weight: 600; color: #fff; letter-spacing: -.01em; }
|
||||
.mk-band-side p { margin-top: 10px; font-size: 13.5px; color: #cfe0ff; line-height: 1.7; }
|
||||
|
||||
/* ---------- 三步上手 ---------- */
|
||||
.mk-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
|
||||
.mk-step {
|
||||
position: relative; background: var(--surface); border: 1px solid var(--border);
|
||||
border-radius: var(--radius-3xl); box-shadow: var(--shadow-sm-border); padding: 26px 24px;
|
||||
}
|
||||
.mk-step-icon {
|
||||
width: 46px; height: 46px; border-radius: 16px;
|
||||
background: var(--primary-soft); color: var(--primary);
|
||||
display: grid; place-items: center;
|
||||
}
|
||||
.mk-step-no {
|
||||
position: absolute; top: 26px; right: 24px;
|
||||
font-family: var(--font-mono); font-size: 13px; color: var(--muted); letter-spacing: .08em;
|
||||
}
|
||||
.mk-step h4 { margin-top: 18px; font-size: 18px; font-weight: 700; color: var(--heading); }
|
||||
.mk-step p { margin-top: 8px; font-size: 13.5px; color: var(--text-soft); line-height: 1.6; }
|
||||
.mk-step-out {
|
||||
display: inline-block; margin-top: 16px; font-size: 12px; font-weight: 600;
|
||||
color: var(--primary); background: var(--primary-soft); border-radius: 999px; padding: 4px 12px;
|
||||
}
|
||||
|
||||
/* ---------- 同期排期 ---------- */
|
||||
.mk-row {
|
||||
display: flex; align-items: center; gap: 16px;
|
||||
background: var(--panel); border: 1px solid var(--line); border-radius: 16px; padding: 16px 20px;
|
||||
transition: border-color .2s ease, background .2s ease;
|
||||
}
|
||||
.mk-row:hover { background: var(--panel-2); }
|
||||
.mk-row .mk-tag { margin: 0; flex-shrink: 0; }
|
||||
.mk-row-body { flex: 1; min-width: 0; }
|
||||
.mk-row-item { font-size: 15px; font-weight: 600; color: var(--heading); }
|
||||
.mk-row-desc { font-size: 12.5px; color: var(--muted); margin-top: 3px; }
|
||||
.mk-row-arrow { color: var(--muted); flex-shrink: 0; }
|
||||
.mk-open-cta { margin-top: 16px; }
|
||||
.mk-count {
|
||||
background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-3xl);
|
||||
box-shadow: var(--shadow-sm-border); padding: 30px 26px; margin-bottom: 18px; position: relative; overflow: hidden;
|
||||
}
|
||||
/* ---------- 近期场次:倒计时 + 行列表 ---------- */
|
||||
.mk-count { background: var(--panel); border: 1px solid var(--line); border-radius: 28px; box-shadow: var(--shadow-sm-border); padding: 30px 26px; margin-bottom: 18px; position: relative; overflow: hidden; }
|
||||
.mk-count::before { content: ''; position: absolute; inset: 0; background: radial-gradient(420px 180px at 50% 0%, rgba(38,192,255,.12), transparent 70%); }
|
||||
.mk-count-lbl { position: relative; font-size: 12px; letter-spacing: .12em; color: var(--muted); text-transform: uppercase; }
|
||||
.mk-count-nums { position: relative; display: flex; justify-content: center; gap: 22px; margin: 18px 0 12px; flex-wrap: wrap; }
|
||||
.mk-count-nums span { display: flex; flex-direction: column; align-items: center; }
|
||||
.mk-count-nums b { font-family: var(--font-display); font-size: clamp(30px, 6vw, 46px); color: var(--heading); line-height: 1; }
|
||||
.mk-count-nums b { font-family: var(--font-pixel); font-size: clamp(30px, 6vw, 46px); color: var(--heading); line-height: 1; }
|
||||
.mk-count-nums small { margin-top: 4px; font-size: 12px; color: var(--muted); }
|
||||
.mk-count-name { position: relative; font-size: 15px; font-weight: 600; color: var(--heading); }
|
||||
.mk-note { margin-top: 16px; text-align: center; font-size: 13px; color: var(--muted); }
|
||||
.mk-opening { display: grid; gap: 10px; margin-top: 8px; }
|
||||
.mk-row { display: flex; align-items: center; gap: 16px; background: var(--panel); border: 1px solid var(--line); border-radius: 18px; padding: 16px 20px; transition: border-color .2s ease, background .2s ease; }
|
||||
.mk-row:hover { background: var(--panel-2); }
|
||||
.mk-tag { display: inline-block; font-size: 11px; font-weight: 700; color: var(--on-surface); background: var(--surface); border: 1px solid var(--border); border-radius: 999px; padding: 3px 12px; flex-shrink: 0; }
|
||||
.mk-tag.alt { background: var(--panel-2); color: var(--text); border-color: transparent; }
|
||||
.mk-row-body { flex: 1; min-width: 0; }
|
||||
.mk-row-item { font-size: 15px; font-weight: 600; color: var(--heading); }
|
||||
.mk-row-desc { font-size: 12.5px; color: var(--muted); margin-top: 3px; }
|
||||
.mk-row-arrow { color: var(--muted); flex-shrink: 0; }
|
||||
|
||||
/* ---------- FAQ ---------- */
|
||||
.mk-faq { display: grid; gap: 12px; max-width: 820px; }
|
||||
.mk-faq { display: grid; gap: 12px; max-width: 860px; margin-top: 40px; }
|
||||
.mk-faq-item { background: var(--panel); border: 1px solid var(--line); border-radius: 18px; overflow: hidden; }
|
||||
.mk-faq-item.open { box-shadow: var(--shadow-sm-border); border-color: var(--border); }
|
||||
.mk-faq-q {
|
||||
width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 12px;
|
||||
padding: 18px 22px; background: transparent; border: 0; text-align: left;
|
||||
font-family: inherit; font-size: 15.5px; font-weight: 600; color: var(--heading); cursor: pointer;
|
||||
}
|
||||
.mk-faq-q { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 18px 22px; background: transparent; border: 0; text-align: left; font-family: inherit; font-size: 15.5px; font-weight: 600; color: var(--heading); cursor: pointer; }
|
||||
.mk-faq-q .icon { color: var(--muted); flex-shrink: 0; transition: transform .2s ease; }
|
||||
.mk-faq-item.open .mk-faq-q .icon { transform: rotate(180deg); color: var(--primary); }
|
||||
.mk-faq-a { padding: 0 22px 18px; }
|
||||
.mk-faq-a span { font-size: 14px; color: var(--text-soft); line-height: 1.7; }
|
||||
|
||||
/* ---------- 报名 CTA ---------- */
|
||||
.mk-signup { text-align: center; padding: 20px 0 6px; }
|
||||
.mk-signup .mk-kicker { margin-bottom: 18px; }
|
||||
.mk-signup h3 { font-size: clamp(26px, 4vw, 40px); font-weight: 500; color: var(--heading); letter-spacing: -.02em; line-height: 1.2; }
|
||||
.mk-signup p { max-width: 560px; margin: 16px auto 0; font-size: 15px; color: var(--text-soft); line-height: 1.7; }
|
||||
.mk-signup .mk-cta { margin-top: 26px; }
|
||||
.pt-cta-band { text-align: center; padding: clamp(40px, 7vh, 80px) 0 20px; }
|
||||
|
||||
/* ---------- 响应式 ---------- */
|
||||
@media (max-width: 900px) {
|
||||
.mk-products, .mk-core, .mk-steps, .mk-quick-grid { grid-template-columns: repeat(2, 1fr); }
|
||||
.mk-compare, .mk-band { grid-template-columns: 1fr; }
|
||||
.mk-hero-stats { grid-template-columns: repeat(2, 1fr); }
|
||||
.pt-split { grid-template-columns: 1fr; }
|
||||
.pt-stage { order: 1; min-height: 300px; }
|
||||
.pt-steps { grid-template-columns: 1fr; }
|
||||
}
|
||||
@media (max-width: 720px) {
|
||||
.mk-display { font-size: clamp(30px, 9.5vw, 44px); letter-spacing: -.04em; }
|
||||
.mk-kicker { font-size: 11.5px; padding: 6px 13px; line-height: 1.5; }
|
||||
.mk-hero { min-height: auto; }
|
||||
.mk-products, .mk-steps, .mk-quick-grid { grid-template-columns: 1fr; }
|
||||
.mk-band { padding: 26px 20px; }
|
||||
.mk-band .mk-cta { justify-content: flex-start; }
|
||||
}
|
||||
@media (max-width: 420px) {
|
||||
.mk-quick-grid { grid-template-columns: 1fr; }
|
||||
.mk-hero-stats { grid-template-columns: repeat(2, 1fr); }
|
||||
.mk-display { font-size: clamp(28px, 9vw, 40px); }
|
||||
.pt-chip { display: none; }
|
||||
.pt-h { font-size: clamp(24px, 6vw, 34px); }
|
||||
}
|
||||
|
||||
+168
-250
@@ -1,11 +1,8 @@
|
||||
import React from 'react';
|
||||
import { Header, SiteFooter, Reveal } from '@/components/organisms';
|
||||
import { SectionHead, Button, Icon } from '@/components/atoms';
|
||||
import { Button, Icon } from '@/components/atoms';
|
||||
import Skeleton from '@/components/Skeleton';
|
||||
import {
|
||||
MK_HERO, MK_TRUST, MK_PRINCIPLE, MK_PRODUCTS,
|
||||
MK_OPENING, MK_ASSESS, MK_SIGNUP
|
||||
} from '@/data/home';
|
||||
import { MK_HERO, MK_OPENING, MK_SIGNUP } from '@/data/home';
|
||||
import { getCurrentEvents } from '@/services/ops';
|
||||
import '@/styles/home.css';
|
||||
|
||||
@@ -16,305 +13,195 @@ const fmtEvt = (iso) => {
|
||||
const week = ['日', '一', '二', '三', '四', '五', '六'][d.getDay()];
|
||||
return `${d.getMonth() + 1}月${d.getDate()}日 周${week} ${p(d.getHours())}:${p(d.getMinutes())}`;
|
||||
};
|
||||
|
||||
function CountdownBox({ target }) {
|
||||
const [now, setNow] = React.useState(Date.now());
|
||||
React.useEffect(() => {
|
||||
const t = setInterval(() => setNow(Date.now()), 1000);
|
||||
return () => clearInterval(t);
|
||||
}, []);
|
||||
React.useEffect(() => { const t = setInterval(() => setNow(Date.now()), 1000); return () => clearInterval(t); }, []);
|
||||
const diff = Math.max(0, new Date(target).getTime() - now);
|
||||
const d = Math.floor(diff / 86400000);
|
||||
const h = Math.floor((diff % 86400000) / 3600000);
|
||||
const m = Math.floor((diff % 3600000) / 60000);
|
||||
const s = Math.floor((diff % 60000) / 1000);
|
||||
const d = Math.floor(diff / 86400000), h = Math.floor((diff % 86400000) / 3600000);
|
||||
const m = Math.floor((diff % 3600000) / 60000), s = Math.floor((diff % 60000) / 1000);
|
||||
const pad = (n) => String(n).padStart(2, '0');
|
||||
return <div className="mk-count-nums"><span><b>{d}</b><small>天</small></span><span><b>{pad(h)}</b><small>时</small></span><span><b>{pad(m)}</b><small>分</small></span><span><b>{pad(s)}</b><small>秒</small></span></div>;
|
||||
}
|
||||
|
||||
/* ---------- 特征分栏 左:发光面板 + 单个悬浮窗口 ---------- */
|
||||
function Stage({ children, tone = 'blue' }) {
|
||||
return <div className={`pt-stage ${tone}`}><div className="pt-window">{children}</div></div>;
|
||||
}
|
||||
|
||||
function EventsWindow() {
|
||||
return (
|
||||
<div className="mk-count-nums">
|
||||
<span><b>{d}</b><small>天</small></span><span><b>{pad(h)}</b><small>时</small></span><span><b>{pad(m)}</b><small>分</small></span><span><b>{pad(s)}</b><small>秒</small></span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function Product({ p }) {
|
||||
return (
|
||||
<div className={`mk-product${p.highlight ? ' hot' : ''}`}>
|
||||
{p.highlight && <span className="mk-badge-flag">推荐</span>}
|
||||
<span className={`mk-tag${p.highlight ? '' : ' alt'}`}>{p.tag}</span>
|
||||
<div className="mk-pname">{p.name}</div>
|
||||
<div className="mk-pprice">{p.price} <em>{p.period}</em></div>
|
||||
<p className="mk-pdesc">{p.desc}</p>
|
||||
<ul className="mk-pdel">{p.deliverables.map((dd, i) => <li key={i}><Icon name="check" size="xs" />{dd}</li>)}</ul>
|
||||
<div className="mk-pcta"><Button variant={p.highlight ? 'cta' : 'white'} href={p.href}>{p.cta}</Button></div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function EventProduct({ e, tag, hot }) {
|
||||
return (
|
||||
<div className={`mk-product${hot ? ' hot' : ''}`}>
|
||||
{hot && <span className="mk-badge-flag">近期</span>}
|
||||
<span className={`mk-tag${hot ? '' : ' alt'}`}>{tag}</span>
|
||||
<div className="mk-pname">{e.title}</div>
|
||||
<div className="mk-pprice">{fmtEvt(e.startAt)} <em>{e.location}</em></div>
|
||||
<p className="mk-pdesc">{e.desc || e.subtitle}</p>
|
||||
<ul className="mk-pdel"><li><Icon name="check" size="xs" />{e.subtitle}</li></ul>
|
||||
<div className="mk-pcta"><Button variant={hot ? 'cta' : 'white'} href="#/events">查看活动</Button></div>
|
||||
</div>
|
||||
<>
|
||||
<div className="pt-window-head">
|
||||
<span className="pt-win-title">近期活动</span>
|
||||
<span className="pt-live"><i />Live</span>
|
||||
</div>
|
||||
<div className="pt-win-order">
|
||||
<div className="pt-list"><span className="pt-list-item">公益课 · 一周开一家公司</span><b>报名中</b></div>
|
||||
<div className="pt-list"><span className="pt-list-item">交流沙龙 · 技能产品化</span><b>报名中</b></div>
|
||||
<div className="pt-list"><span className="pt-list-item">OPC 创业基因测评</span><b>随时测</b></div>
|
||||
<div className="pt-send"><Icon name="arrow-right" size="sm" /><span>选一场,免费报名</span></div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
/* ---------- 近期场次(静态降级行) ---------- */
|
||||
function CurrentEvents() {
|
||||
const [data, setData] = React.useState(null);
|
||||
const [loaded, setLoaded] = React.useState(false);
|
||||
React.useEffect(() => { getCurrentEvents().then((d) => { setData(d || null); setLoaded(true); }); }, []);
|
||||
const next = data && data.next;
|
||||
|
||||
if (!loaded) {
|
||||
return (
|
||||
<Reveal as="section" id="events" className="section mk-section">
|
||||
<SectionHead no="05" title="近期场次 · 免费报名" en="Upcoming" />
|
||||
<Skeleton.Rows n={3} gap={14} style={{ marginTop: 20 }} />
|
||||
</Reveal>
|
||||
);
|
||||
}
|
||||
if (!loaded) return <Skeleton.Rows n={3} gap={14} style={{ marginTop: 20 }} />;
|
||||
|
||||
if (!next) {
|
||||
return (
|
||||
<Reveal as="section" id="events" className="section mk-section">
|
||||
<SectionHead no="05" title={MK_OPENING.title} en={MK_OPENING.en} />
|
||||
<div className="mk-opening">
|
||||
{MK_OPENING.rows.map((r) => (
|
||||
<div className="mk-row" key={r.item}>
|
||||
<span className={`mk-tag${r.tag === '公益' ? '' : ' alt'}`}>{r.tag}</span>
|
||||
<div className="mk-row-body">
|
||||
<div className="mk-row-item">{r.item}</div>
|
||||
<div className="mk-row-desc">{r.desc}</div>
|
||||
</div>
|
||||
<span className="mk-row-arrow"><Icon name="chevron-right" size="sm" /></span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="mk-open-cta">
|
||||
<Button variant="dark" href={MK_OPENING.cta.href}>{MK_OPENING.cta.label}</Button>
|
||||
</div>
|
||||
</Reveal>
|
||||
);
|
||||
}
|
||||
const rows = next
|
||||
? [
|
||||
{ e: data.free, tag: '公益课' }, { e: data.salon, tag: '沙龙' }
|
||||
].filter((x) => x.e).map((x) => ({ tag: x.tag, item: x.e.title, desc: `${fmtEvt(x.e.startAt)} · ${x.e.location}` }))
|
||||
: MK_OPENING.rows.map((r) => ({ tag: r.tag, item: r.item, desc: r.desc }));
|
||||
|
||||
return (
|
||||
<Reveal as="section" id="events" className="section mk-section">
|
||||
<SectionHead no="05" title="近期场次 · 免费报名" en="Upcoming" />
|
||||
<div className="mk-count">
|
||||
<div className="mk-count-lbl">距下一场开始</div>
|
||||
<CountdownBox target={next.startAt} />
|
||||
<div className="mk-count-name">{next.title}</div>
|
||||
</div>
|
||||
<div className="mk-products">
|
||||
{data.free && <EventProduct e={data.free} tag="公益课" hot />}
|
||||
{data.salon && <EventProduct e={data.salon} tag="沙龙" />}
|
||||
<div className="mk-product">
|
||||
<span className="mk-tag alt">测评</span>
|
||||
<div className="mk-pname">OPC 创业基因测评</div>
|
||||
<div className="mk-pprice">免费 <em>5 分钟</em></div>
|
||||
<p className="mk-pdesc">先测一测你适合做什么,带着结果来现场聊。</p>
|
||||
<ul className="mk-pdel"><li><Icon name="check" size="xs" />适配指数 + 推荐赛道 + 角色</li></ul>
|
||||
<div className="mk-pcta"><Button variant="white" href="#/opc-test">开始测评</Button></div>
|
||||
<>
|
||||
{next && (
|
||||
<div className="mk-count">
|
||||
<div className="mk-count-lbl">距下一场开始</div>
|
||||
<CountdownBox target={next.startAt} />
|
||||
<div className="mk-count-name">{next.title}</div>
|
||||
</div>
|
||||
</div>
|
||||
<p className="mk-note">{MK_OPENING.note}</p>
|
||||
</Reveal>
|
||||
);
|
||||
}
|
||||
|
||||
/* ---------- 新增内容:快捷入口 / 三步上手 / 手艺变产品 / FAQ ---------- */
|
||||
const QUICK = [
|
||||
{ icon: 'home', en: 'Park', title: '入驻申请', desc: '填写《入园申请表》入驻园区', href: '#/park-apply' },
|
||||
{ icon: 'shield', en: 'Cert', title: 'OPC 认证', desc: '提交资料认证超级个体', href: '#/cert-apply' },
|
||||
{ icon: 'route', en: 'Transfer', title: '转园申请', desc: '园区 OPC 转入其它园区', href: '#/park-transfer' },
|
||||
{ icon: 'book', en: 'News', title: '资讯中心', desc: '政策 / 资讯 / 技能 / 动态', href: '#/content' }
|
||||
];
|
||||
|
||||
const STEPS = [
|
||||
{ icon: 'book', step: '01', title: '听一场公益课', desc: '每周 1 场,先认识我们、看清「一人 + AI 开公司」是怎么回事。', out: '免费 · 无门槛' },
|
||||
{ icon: 'compass', step: '02', title: '测一测自己', desc: '5 分钟 OPC 基因测评,找到适配赛道、角色与 AI 协作方式。', out: '免费 · 随时测' },
|
||||
{ icon: 'shield', step: '03', title: '入驻 / 认证', desc: '想清楚后申请入驻园区,或提交资料认证 OPC 超级个体。', out: '按需申请' }
|
||||
];
|
||||
|
||||
const FAQ = [
|
||||
{ q: '什么是 OPC 超级个体?', a: 'OPC(One-Person Company)指「一个人 + AI」也能独立经营一家公司的组织形态。云超服帮你把这个形态落地成可执行的体系。' },
|
||||
{ q: '参加公益课 / 沙龙收费吗?', a: '不收费。公益课每周 1 场、沙龙每月 2–4 场,都是免费开放,先来认识我们、交个朋友。' },
|
||||
{ q: '怎么预约公益课 / 沙龙?', a: '本页「近期场次」选一场报名,或通过公众号菜单栏「报名」、现场扫码。' },
|
||||
{ q: '我不是创业者,适合来吗?', a: '适合。公益课 / 沙龙主打「先认识再判断」,无论你是在职、自由职业还是学生,都能先来看看适不适合这条路。' },
|
||||
{ q: 'OPC 测评有什么用?', a: '5 分钟测出适配指数、推荐赛道 TOP2–3、4 字母类型码与适合角色,帮你带着方向来现场深聊。' },
|
||||
{ q: '怎么入驻园区?', a: '填写《入园申请表》,上传创业计划书、身份 / 学历 / 营业执照等资料,审核通过即可入驻昆明市大学生创业园(及其他合作园区)。' },
|
||||
{ q: 'OPC 认证是什么?', a: '提交你的能力与成果、上传佐证材料,经平台审核后成为认证 OPC,获得平台标识与对接机会。' },
|
||||
{ q: '你们有付费课吗?', a: '线上以公益课 / 沙龙为主;需要进一步体系设计或陪跑时,再与顾问一对一定制,价格不在此公开。' }
|
||||
];
|
||||
|
||||
function Faq() {
|
||||
const [open, setOpen] = React.useState(0);
|
||||
return (
|
||||
<Reveal as="section" className="section mk-section">
|
||||
<SectionHead no="07" title="常见问题" en="FAQ" />
|
||||
<div className="mk-faq">
|
||||
{FAQ.map((f, i) => (
|
||||
<div className={`mk-faq-item${open === i ? ' open' : ''}`} key={i}>
|
||||
<button className="mk-faq-q" onClick={() => setOpen(open === i ? -1 : i)}>
|
||||
<span>{f.q}</span><Icon name="chevron-down" size="sm" />
|
||||
</button>
|
||||
{open === i && <div className="mk-faq-a"><span>{f.a}</span></div>}
|
||||
</div>
|
||||
)}
|
||||
<div className="mk-opening">
|
||||
{rows.map((r, i) => (
|
||||
<a className="mk-row" href="#/events" key={i}>
|
||||
<span className={`mk-tag${r.tag === '公益' ? '' : ' alt'}`}>{r.tag}</span>
|
||||
<div className="mk-row-body"><div className="mk-row-item">{r.item}</div><div className="mk-row-desc">{r.desc}</div></div>
|
||||
<span className="mk-row-arrow"><Icon name="arrow-right" size="sm" /></span>
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</Reveal>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
const SPLIT1 = {
|
||||
kicker: { icon: 'sparkles', text: '一站式 · 从诊断到陪跑' },
|
||||
h: (<><span className="ac">认识</span> → <span className="ac">方向</span> → <span className="ac">陪跑</span></>),
|
||||
sub: '把「一个人 + AI 开公司」落地成一条能走通的路:先看清自己、再找到方向、最后陪你跑到底。',
|
||||
p: '不同的是,我们交付的是方案、是智能体、是每周陪跑——而不是一页讲义。',
|
||||
proof: '已有 200+ 创业者先来听了一场公益课'
|
||||
};
|
||||
const SPLIT2 = {
|
||||
tone: 'orange',
|
||||
kicker: { icon: 'trending-up', text: '接单生态' },
|
||||
h: <><span className="ac">没单</span>?我们开放 <span className="ac">接单生态</span></>,
|
||||
sub: '把你的技能、经验、兴趣,变成能交付的东西——一段录课、一个模板、一次咨询、一份陪跑。',
|
||||
p: '平台把公域引到公益课 / 沙龙,需要进一步体系设计或陪跑时,再一对一定制。',
|
||||
proof: '先来交流沙龙,聊聊你那门手艺怎么变现'
|
||||
};
|
||||
|
||||
export default function Home() {
|
||||
const scrollTo = (id) => () => {
|
||||
const el = document.getElementById(id);
|
||||
if (el) el.scrollIntoView({ behavior: 'smooth' });
|
||||
};
|
||||
return (
|
||||
<div className="page-marketing">
|
||||
<Header active="" />
|
||||
|
||||
<main className="marketing-main">
|
||||
{/* 1 · Hero */}
|
||||
<section className="mk-hero">
|
||||
{/* 1 · Hero(像素彩虹标题 + 副文 + CTA) */}
|
||||
<section className="pt-hero">
|
||||
<span className="mk-kicker anim" style={{ '--d': '0.1s' }}><Icon name="sparkles" size="sm" />{MK_HERO.badge}</span>
|
||||
<h1 className="mk-display anim" style={{ '--d': '0.18s' }}>
|
||||
{MK_HERO.headline.map((l, i) => (
|
||||
<span key={i}>{i === MK_HERO.headline.length - 1 ? <em>{l}</em> : l}</span>
|
||||
))}
|
||||
{MK_HERO.headline.map((l, i) => <span key={i}>{i === MK_HERO.headline.length - 1 ? <em>{l}</em> : l}</span>)}
|
||||
</h1>
|
||||
<p className="mk-lede anim" style={{ '--d': '0.3s' }}>{MK_HERO.subhead}</p>
|
||||
<div className="mk-cta anim" style={{ '--d': '0.4s' }}>
|
||||
<Button variant="cta" href={MK_HERO.ctaPrimary.href}>{MK_HERO.ctaPrimary.label} <Icon name="arrow-right" size="sm" /></Button>
|
||||
<Button variant="ghost" href={MK_HERO.ctaSecondary.href}>{MK_HERO.ctaSecondary.label}</Button>
|
||||
</div>
|
||||
<div className="mk-hero-stats anim" style={{ '--d': '0.5s' }}>
|
||||
{MK_TRUST.map((s, i) => (
|
||||
<div className="mk-hero-stat" key={i}>
|
||||
<b>{s.value}{s.suffix}</b><span>{s.label}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* 2 · 数据带(4 枚统计,已并入 hero-stats) */}
|
||||
|
||||
{/* 3 · 便捷入口 */}
|
||||
<Reveal as="section" className="section mk-section">
|
||||
<SectionHead no="00" title="开始你的 OPC 之旅" en="Get started" />
|
||||
<div className="mk-quick-grid">
|
||||
{QUICK.map((q) => (
|
||||
<a className="mk-quick-card" href={q.href} key={q.title}>
|
||||
<span className="mk-quick-icon"><Icon name={q.icon} size="lg" /></span>
|
||||
<span className="mk-quick-en">{q.en}</span>
|
||||
<span className="mk-quick-title">{q.title}</span>
|
||||
<span className="mk-quick-desc">{q.desc}</span>
|
||||
<span className="mk-quick-arrow"><Icon name="arrow-right" size="sm" /></span>
|
||||
</a>
|
||||
))}
|
||||
{/* 2 · 特征分栏 1:三件套 */}
|
||||
<Reveal as="section" className="pt-section pt-split">
|
||||
<Stage tone="blue"><EventsWindow /></Stage>
|
||||
<div className="pt-copy">
|
||||
<span className="pt-kicker"><Icon name={SPLIT1.kicker.icon} size="sm" />{SPLIT1.kicker.text}</span>
|
||||
<h2 className="pt-h">{SPLIT1.h}</h2>
|
||||
<p className="pt-p">{SPLIT1.sub}</p>
|
||||
<p className="pt-p dim">{SPLIT1.p}</p>
|
||||
<div className="pt-proof"><Avatars /><span>{SPLIT1.proof}</span></div>
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
{/* 4 · 一站式特征:三件套 */}
|
||||
<Reveal as="section" className="section mk-section">
|
||||
<SectionHead no="01" title={MK_PRINCIPLE.title} en={MK_PRINCIPLE.en} />
|
||||
<div className="mk-compare">
|
||||
<div className="mk-mside">
|
||||
<h3>{MK_PRINCIPLE.oldTitle}</h3>
|
||||
<ul>{MK_PRINCIPLE.oldPoints.map((p, i) => <li key={i}><Icon name="close" size="xs" />{p}</li>)}</ul>
|
||||
</div>
|
||||
<div className="mk-mside new">
|
||||
<h3>{MK_PRINCIPLE.newTitle}</h3>
|
||||
<ul>{MK_PRINCIPLE.newPoints.map((p, i) => <li key={i}><Icon name="check" size="xs" />{p}</li>)}</ul>
|
||||
</div>
|
||||
{/* 3 · 居中价值主张(新增三句) */}
|
||||
<Reveal as="section" className="pt-section pt-center">
|
||||
<div className="pt-chips" aria-hidden="true">
|
||||
<span className="pt-chip" style={{ left: '8%', top: '18%' }}><Icon name="flask" size="lg" /></span>
|
||||
<span className="pt-chip" style={{ left: '16%', top: '70%' }}><Icon name="search" size="sm" /></span>
|
||||
<span className="pt-chip green" style={{ right: '10%', top: '28%' }}><Icon name="sparkles" size="sm" /></span>
|
||||
<span className="pt-chip" style={{ right: '20%', top: '72%' }}><Icon name="tools" size="lg" /></span>
|
||||
</div>
|
||||
<p className="mk-quote">—— {MK_PRINCIPLE.quote}</p>
|
||||
<span className="pt-kicker"><Icon name="compass" size="sm" />跟着云超服,把 OPC 做起来</span>
|
||||
<h2 className="pt-h center">不会?我们提供标准的<span className="ac">业务陪跑</span></h2>
|
||||
<h2 className="pt-h center">没地?一键<span className="ac">申请入驻园区</span></h2>
|
||||
<h2 className="pt-h center">没单?我们开放<span className="ac">接单生态</span></h2>
|
||||
<p className="pt-p center">从一场免费公益课开始,5 分钟测评找到方向,想清楚就到园区落地、到生态里接单。</p>
|
||||
<div className="mk-cta">
|
||||
<Button variant="cta" href={MK_HERO.ctaPrimary.href}>{MK_HERO.ctaPrimary.label}</Button>
|
||||
<Button variant="dark" href="#/opc-test">先做 OPC 测评</Button>
|
||||
</div>
|
||||
<span className="pt-meta"><Icon name="sparkles" size="sm" />免费 · 每周 1 场 · 昆明市大学生创业园</span>
|
||||
</Reveal>
|
||||
|
||||
{/* 5 · 三档免费产品 */}
|
||||
<Reveal as="section" id="products" className="section mk-section">
|
||||
<SectionHead no="02" title="公益课 & 沙龙 · 先来认识我们" en="Events" />
|
||||
<div className="mk-products">
|
||||
{MK_PRODUCTS.map((p) => <Product key={p.name} p={p} />)}
|
||||
{/* 4 · 特征分栏 2:接单生态 */}
|
||||
<Reveal as="section" className="pt-section pt-split">
|
||||
<Stage tone="orange">
|
||||
<div className="pt-win-order">
|
||||
<div className="pt-list"><span className="pt-live"><i />待接单</span><span className="pt-list-item">陪跑 · 30 天复盘</span><b>¥2,980</b></div>
|
||||
<div className="pt-list"><span className="pt-list-sub">AI 智能体搭建</span><span className="pt-list-item">按项目</span><b>¥1,200</b></div>
|
||||
<div className="pt-send"><Icon name="arrow-right" size="sm" /><span>看看近期场次,从公益课聊起</span></div>
|
||||
</div>
|
||||
</Stage>
|
||||
<div className="pt-copy">
|
||||
<span className="pt-kicker"><Icon name={SPLIT2.kicker.icon} size="sm" />{SPLIT2.kicker.text}</span>
|
||||
<h2 className="pt-h">{SPLIT2.h}</h2>
|
||||
<p className="pt-p">{SPLIT2.sub}</p>
|
||||
<p className="pt-p dim">{SPLIT2.p}</p>
|
||||
<div className="pt-proof"><Avatars /><span>{SPLIT2.proof}</span></div>
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
{/* 6 · 手艺变产品(新增特征卡) */}
|
||||
<Reveal as="section" className="section mk-section">
|
||||
<SectionHead no="03" title="把一门手艺,变成产品" en="From skill to product" />
|
||||
<div className="mk-band">
|
||||
<div className="mk-band-intro">
|
||||
<span className="mk-kicker"><Icon name="trending-up" size="sm" />技能产品化</span>
|
||||
<h3>「一个人 + AI」也能开一家公司</h3>
|
||||
<p>把你的技能、经验、兴趣,拆成能交付的东西——一段录课、一个模板、一次咨询、一份陪跑。来交流沙龙,聊聊你手里那门手艺怎么变现。</p>
|
||||
<div className="mk-cta">
|
||||
<Button variant="cta" href="#/events">预约沙龙聊聊</Button>
|
||||
<Button variant="white" onClick={scrollTo('contacts')}>看看怎么上手</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mk-band-side">
|
||||
<span className="mk-quick-en">One Person</span>
|
||||
<b>一条可执行的路</b>
|
||||
<p>诊断 → 体系设计 → 陪跑,交付的是结果,不是知识。需要时,我们把方案做给你。</p>
|
||||
</div>
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
{/* 7 · 三步上手(新增) */}
|
||||
<Reveal as="section" id="contacts" className="section mk-section">
|
||||
<SectionHead no="04" title="三步上手" en="Get started in 3 steps" />
|
||||
<div className="mk-steps">
|
||||
{STEPS.map((s) => (
|
||||
<div className="mk-step" key={s.step}>
|
||||
<span className="mk-step-icon"><Icon name={s.icon} size="lg" /></span>
|
||||
<span className="mk-step-no">{s.step}</span>
|
||||
<h4>{s.title}</h4>
|
||||
<p>{s.desc}</p>
|
||||
<span className="mk-step-out">{s.out}</span>
|
||||
{/* 5 · 三步上手(细栏,无重卡) */}
|
||||
<Reveal as="section" className="pt-section">
|
||||
<h2 className="pt-h center">三步上手</h2>
|
||||
<p className="pt-p center">预约 → 测评 → 入驻 / 认证,把 OPC 做起来。</p>
|
||||
<div className="pt-steps">
|
||||
{[
|
||||
{ icon: 'book', t: '听一场公益课', d: '每周 1 场,先认识我们。' },
|
||||
{ icon: 'compass', t: '测一测自己', d: '5 分钟找方向、赛道、角色。' },
|
||||
{ icon: 'shield', t: '入驻 / 认证', d: '到园区落地,成为认证 OPC。' }
|
||||
].map((s, i) => (
|
||||
<div className="pt-step" key={i}>
|
||||
<span className="pt-step-icon"><Icon name={s.icon} size="lg" /></span>
|
||||
<div><h4>{s.t}</h4><p>{s.d}</p></div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
{/* 8 · 同期排期 */}
|
||||
<CurrentEvents />
|
||||
|
||||
{/* 9 · 测评 + 调研 */}
|
||||
<Reveal as="section" className="section mk-section">
|
||||
<SectionHead no="06" title="认识你自己" en="Know yourself" />
|
||||
<div className="mk-band">
|
||||
<div className="mk-band-intro">
|
||||
<span className="mk-kicker"><Icon name="compass" size="sm" />{MK_ASSESS.badge}</span>
|
||||
<h3>{MK_ASSESS.title}</h3>
|
||||
<p>{MK_ASSESS.desc}</p>
|
||||
<div className="mk-cta">
|
||||
<Button variant="cta" href={MK_ASSESS.cta.href}>{MK_ASSESS.cta.label}</Button>
|
||||
<Button variant="white" href="#/survey">参与 OPC 调研</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mk-band-side">
|
||||
<span className="mk-quick-en">Survey</span>
|
||||
<b>OPC 创业伙伴调研</b>
|
||||
<p>5–8 分钟匿名问卷,聊聊行业、难题、AI 赋能与政策诉求,用于云南 OPC 创业生态与政策研究。</p>
|
||||
</div>
|
||||
</div>
|
||||
{/* 6 · 近期场次(倒计时 + 行列表) */}
|
||||
<Reveal as="section" className="pt-section">
|
||||
<h2 className="pt-h">{MK_OPENING.title}</h2>
|
||||
<p className="pt-p">免费公益课每周 1 场、沙龙每月 2–4 场。主题见公众号 / 社群每周预告。</p>
|
||||
<CurrentEvents />
|
||||
</Reveal>
|
||||
|
||||
{/* 10 · FAQ */}
|
||||
<Faq />
|
||||
{/* 7 · FAQ */}
|
||||
<Reveal as="section" className="pt-section">
|
||||
<h2 className="pt-h">常见问题</h2>
|
||||
<Faq />
|
||||
</Reveal>
|
||||
|
||||
{/* 11 · 报名 CTA */}
|
||||
<Reveal as="section" className="section mk-section">
|
||||
<div className="mk-signup">
|
||||
<span className="mk-kicker"><Icon name="sparkles" size="sm" />下一步</span>
|
||||
<h3>{MK_SIGNUP.title}</h3>
|
||||
<p>{MK_SIGNUP.desc}</p>
|
||||
{/* 8 · 报名 CTA */}
|
||||
<Reveal as="section" className="pt-section">
|
||||
<div className="pt-cta-band">
|
||||
<h2 className="pt-h center">{MK_SIGNUP.title}</h2>
|
||||
<p className="pt-p center">{MK_SIGNUP.desc}</p>
|
||||
<div className="mk-cta">
|
||||
<Button variant="cta" href={MK_SIGNUP.ctaPrimary.href}>{MK_SIGNUP.ctaPrimary.label}</Button>
|
||||
<Button variant="ghost" href={MK_SIGNUP.ctaSecondary.href}>{MK_SIGNUP.ctaSecondary.label}</Button>
|
||||
@@ -322,8 +209,39 @@ export default function Home() {
|
||||
</div>
|
||||
</Reveal>
|
||||
</main>
|
||||
|
||||
<SiteFooter />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/* 头像墙(装饰) */
|
||||
function Avatars() {
|
||||
return (
|
||||
<div className="pt-avatars">
|
||||
{[0, 1, 2, 3].map((i) => <span className="pt-ava" key={i} style={{ ['--i' ]: i }} />)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
const FAQ = [
|
||||
{ q: '什么是 OPC 超级个体?', a: 'OPC(One-Person Company)指「一个人 + AI」也能独立经营一家公司的组织形态。云超服帮你把它落地成可执行的体系。' },
|
||||
{ q: '参加公益课 / 沙龙收费吗?', a: '不收费。公益课每周 1 场、沙龙每月 2–4 场,免费开放,先来认识我们、交个朋友。' },
|
||||
{ q: '怎么预约公益课 / 沙龙?', a: '本页「近期场次」选一场报名,或通过公众号菜单栏「报名」、现场扫码。' },
|
||||
{ q: '我不是创业者,适合来吗?', a: '适合。主打「先认识再判断」,无论在职、自由职业还是学生,都能先看看这条路适不适合。' },
|
||||
{ q: 'OPC 测评有什么用?', a: '5 分钟测出适配指数、推荐赛道 TOP2–3、4 字母类型码与适合角色,带着方向来现场深聊。' },
|
||||
{ q: '怎么入驻园区 / 认证 / 转园?', a: '首页「便捷入口」或「我的」里面均有申请入口:入园申请表、OPC 认证、转园申请,按提示提交资料即可。' },
|
||||
{ q: '有付费课吗?', a: '线上以公益课 / 沙龙为主;需要进一步体系设计或陪跑时,与顾问一对一定制,价格不在此公开。' }
|
||||
];
|
||||
function Faq() {
|
||||
const [open, setOpen] = React.useState(0);
|
||||
return (
|
||||
<div className="mk-faq">
|
||||
{FAQ.map((f, i) => (
|
||||
<div className={`mk-faq-item${open === i ? ' open' : ''}`} key={i}>
|
||||
<button className="mk-faq-q" onClick={() => setOpen(open === i ? -1 : i)}><span>{f.q}</span><Icon name="chevron-down" size="sm" /></button>
|
||||
{open === i && <div className="mk-faq-a"><span>{f.a}</span></div>}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user