feat: polish website model radar

This commit is contained in:
boos
2026-06-06 16:14:05 +08:00
parent f0385c9c8c
commit d315f0ffe2
3 changed files with 97 additions and 36 deletions
+3 -3
View File
@@ -134,9 +134,9 @@ export function BossAiMotion({ children }: BossAiMotionProps) {
} as gsap.TweenVars); } as gsap.TweenVars);
gsap.to(routeRows, { gsap.to(routeRows, {
x: (index) => (index % 2 === 0 ? -12 : 10), x: (index) => (index % 2 === 0 ? -4 : 4),
y: (index) => -4 - index * 1.8, y: (index) => -2 - index * 0.9,
autoAlpha: (index) => 1 - index * 0.025, autoAlpha: (index) => 1 - index * 0.015,
ease: "none", ease: "none",
stagger: 0.03, stagger: 0.03,
scrollTrigger: { scrollTrigger: {
+72 -17
View File
@@ -373,8 +373,8 @@ a {
border: 1px solid var(--line); border: 1px solid var(--line);
border-radius: 32px; border-radius: 32px;
background: background:
radial-gradient(circle at 18% 18%, rgba(215, 255, 77, 0.15), transparent 32%), radial-gradient(circle at 18% 18%, rgba(215, 255, 77, 0.14), transparent 30%),
radial-gradient(circle at 86% 82%, rgba(139, 246, 255, 0.13), transparent 34%), radial-gradient(circle at 86% 82%, rgba(139, 246, 255, 0.09), transparent 34%),
linear-gradient(180deg, rgba(255, 255, 255, 0.09), rgba(255, 255, 255, 0.035)), linear-gradient(180deg, rgba(255, 255, 255, 0.09), rgba(255, 255, 255, 0.035)),
rgba(10, 20, 18, 0.84); rgba(10, 20, 18, 0.84);
padding: 18px; padding: 18px;
@@ -466,13 +466,17 @@ a {
.console-bar { .console-bar {
position: relative; position: relative;
z-index: 3; z-index: 4;
min-height: 54px; min-height: 54px;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
justify-content: flex-start; justify-content: flex-start;
border-radius: 18px; border-radius: 18px;
border-color: rgba(215, 255, 77, 0.22);
background:
linear-gradient(90deg, rgba(215, 255, 77, 0.11), rgba(255, 255, 255, 0.035) 42%, rgba(139, 246, 255, 0.06)),
rgba(255, 255, 255, 0.035);
padding: 0 16px; padding: 0 16px;
} }
@@ -495,7 +499,7 @@ a {
.route-list { .route-list {
position: relative; position: relative;
z-index: 3; z-index: 4;
display: grid; display: grid;
gap: 8px; gap: 8px;
margin-top: 12px; margin-top: 12px;
@@ -509,11 +513,26 @@ a {
align-items: center; align-items: center;
gap: 12px; gap: 12px;
border-radius: 18px; border-radius: 18px;
padding: 0 14px 0 32px; padding: 0 14px 0 34px;
overflow: hidden; overflow: hidden;
transform: translateZ(0); transform: translateZ(0);
} }
.route-row::after {
position: absolute;
inset: 0;
pointer-events: none;
content: "";
background: linear-gradient(110deg, rgba(255, 255, 255, 0.08), transparent 28%, transparent 76%, rgba(215, 255, 77, 0.06));
opacity: 0;
transition: opacity 180ms ease;
}
.route-row > * {
position: relative;
z-index: 1;
}
.route-row::before { .route-row::before {
position: absolute; position: absolute;
top: 50%; top: 50%;
@@ -525,6 +544,7 @@ a {
color: var(--blue); color: var(--blue);
font-size: 12px; font-size: 12px;
font-weight: 800; font-weight: 800;
letter-spacing: 0.04em;
} }
.route-row strong { .route-row strong {
@@ -537,9 +557,40 @@ a {
} }
.route-row em { .route-row em {
border: 1px solid rgba(255, 255, 255, 0.09);
border-radius: 999px;
background: rgba(0, 0, 0, 0.14);
padding: 5px 8px;
white-space: nowrap; white-space: nowrap;
} }
.route-row[data-featured="true"] {
min-height: 58px;
border-color: rgba(215, 255, 77, 0.34);
background:
linear-gradient(90deg, rgba(215, 255, 77, 0.13), rgba(255, 255, 255, 0.045) 42%, rgba(139, 246, 255, 0.045)),
rgba(255, 255, 255, 0.045);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.13),
0 18px 44px rgba(0, 0, 0, 0.18);
}
.route-row[data-featured="true"]::after {
opacity: 1;
}
.route-row[data-featured="true"] strong {
color: var(--text);
font-size: 15px;
letter-spacing: -0.035em;
}
.route-row[data-featured="true"] em {
border-color: rgba(215, 255, 77, 0.22);
background: rgba(215, 255, 77, 0.09);
color: rgba(248, 255, 244, 0.88);
}
.route-row[data-tone="hot"] span { .route-row[data-tone="hot"] span {
color: #ffec99; color: #ffec99;
} }
@@ -596,7 +647,7 @@ a {
.console-metrics { .console-metrics {
position: relative; position: relative;
z-index: 3; z-index: 4;
display: grid; display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px; gap: 8px;
@@ -621,7 +672,7 @@ a {
.mini-grid { .mini-grid {
position: relative; position: relative;
z-index: 3; z-index: 4;
display: grid; display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px; gap: 12px;
@@ -640,31 +691,35 @@ a {
.flow-glyph { .flow-glyph {
position: absolute; position: absolute;
z-index: 1; z-index: 1;
right: -22px; right: -92px;
bottom: -8px; bottom: -72px;
width: 92%; width: 112%;
max-width: 520px; max-width: 520px;
opacity: 0.68; opacity: 0.28;
pointer-events: none;
mask-image: linear-gradient(115deg, transparent 0%, black 22%, black 58%, transparent 88%);
mix-blend-mode: screen;
} }
.flow-line { .flow-line {
fill: none; fill: none;
stroke: url("#lineGradient"); stroke: url("#lineGradient");
stroke-width: 2.5; stroke-width: 2;
stroke-linecap: round; stroke-linecap: round;
stroke-dasharray: 12 18; stroke-dasharray: 9 26;
} }
.flow-line-b { .flow-line-b {
opacity: 0.62; opacity: 0.46;
} }
.flow-line-c { .flow-line-c {
opacity: 0.48; opacity: 0.32;
} }
.flow-dot { .flow-dot {
fill: var(--acid); fill: var(--acid);
opacity: 0.8;
} }
.dot-b { .dot-b {
@@ -672,8 +727,8 @@ a {
} }
.node { .node {
fill: rgba(255, 255, 255, 0.04); fill: rgba(255, 255, 255, 0.025);
stroke: rgba(215, 255, 77, 0.22); stroke: rgba(215, 255, 77, 0.13);
} }
.platform-section, .platform-section,
+22 -16
View File
@@ -36,11 +36,11 @@ const heroStats = [
]; ];
const routes = [ const routes = [
{ type: "Reason", model: "gpt-5.5", state: "xhigh", tone: "hot" }, { type: "GPT", model: "gpt-5.5", state: "深度推理", tone: "hot", featured: true },
{ type: "Image", model: "gpt-image-2", state: "图像生成", tone: "lime", featured: true },
{ type: "Claude", model: "claude-opus-4-8", state: "Messages", tone: "white" }, { type: "Claude", model: "claude-opus-4-8", state: "Messages", tone: "white" },
{ type: "Gemini", model: "gemini-3-pro-preview", state: "多模态", tone: "cyan" }, { type: "Gemini", model: "gemini-3-pro-preview", state: "多模态", tone: "cyan" },
{ type: "Image", model: "gpt-image-2", state: "生成中", tone: "lime" }, { type: "Video", model: "doubao-seedance-2-0-260128", state: "视频队列", tone: "blue" },
{ type: "Video", model: "doubao-seedance-2-0-260128", state: "排队中", tone: "blue" },
]; ];
const consoleMetrics = [ const consoleMetrics = [
@@ -141,7 +141,7 @@ const controlSignals = [
function FlowGlyph() { function FlowGlyph() {
return ( return (
<svg className="flow-glyph" viewBox="0 0 520 360" role="img" aria-label="BossAI 工作流动态图形"> <svg className="flow-glyph" viewBox="0 0 520 360" aria-hidden="true">
<defs> <defs>
<linearGradient id="lineGradient" x1="0" x2="1" y1="0" y2="1"> <linearGradient id="lineGradient" x1="0" x2="1" y1="0" y2="1">
<stop offset="0%" stopColor="#D7FF4D" /> <stop offset="0%" stopColor="#D7FF4D" />
@@ -159,26 +159,26 @@ function FlowGlyph() {
<path <path
className="flow-line flow-line-a" className="flow-line flow-line-a"
data-motion-line data-motion-line
d="M48 180 C130 62 232 62 314 180 S438 298 488 154" d="M32 110 C138 42 218 86 294 152 S414 238 496 132"
/> />
<path <path
className="flow-line flow-line-b" className="flow-line flow-line-b"
data-motion-line data-motion-line
d="M58 236 C154 318 222 286 274 184 S358 24 462 92" d="M78 238 C170 314 248 256 314 196 S402 92 486 84"
/> />
<path <path
className="flow-line flow-line-c" className="flow-line flow-line-c"
data-motion-line data-motion-line
d="M92 108 C178 164 214 180 260 180 S330 174 424 250" d="M92 170 C180 194 226 190 292 160 S382 150 452 236"
/> />
<g filter="url(#softGlow)"> <g filter="url(#softGlow)">
<circle className="flow-dot dot-a" data-motion-dot cx="48" cy="180" r="7" /> <circle className="flow-dot dot-a" data-motion-dot cx="32" cy="110" r="6" />
<circle className="flow-dot dot-b" data-motion-dot cx="260" cy="180" r="9" /> <circle className="flow-dot dot-b" data-motion-dot cx="294" cy="152" r="8" />
<circle className="flow-dot dot-c" data-motion-dot cx="488" cy="154" r="7" /> <circle className="flow-dot dot-c" data-motion-dot cx="496" cy="132" r="6" />
</g> </g>
<rect className="node node-a" data-motion="node" x="72" y="58" width="128" height="68" rx="18" /> <rect className="node node-a" data-motion="node" x="96" y="44" width="120" height="56" rx="16" />
<rect className="node node-b" data-motion="node" x="242" y="146" width="140" height="76" rx="20" /> <rect className="node node-b" data-motion="node" x="278" y="128" width="132" height="64" rx="18" />
<rect className="node node-c" data-motion="node" x="352" y="248" width="120" height="62" rx="17" /> <rect className="node node-c" data-motion="node" x="352" y="236" width="112" height="54" rx="16" />
</svg> </svg>
); );
} }
@@ -188,12 +188,18 @@ function HeroConsole() {
<div className="hero-console" data-motion="hero-console" aria-label="BossAI 路由状态预览"> <div className="hero-console" data-motion="hero-console" aria-label="BossAI 路由状态预览">
<div className="console-orbit" data-motion-orbit /> <div className="console-orbit" data-motion-orbit />
<div className="console-bar"> <div className="console-bar">
<span>Model Radar</span> <span>Model Router</span>
<strong>主流模型在线</strong> <strong>GPT-5.5 + Image 2 Ready</strong>
</div> </div>
<div className="route-list"> <div className="route-list">
{routes.map((route) => ( {routes.map((route) => (
<div className="route-row" data-motion="route-row" data-tone={route.tone} key={route.type}> <div
className="route-row"
data-featured={route.featured ? "true" : undefined}
data-motion="route-row"
data-tone={route.tone}
key={route.type}
>
<span>{route.type}</span> <span>{route.type}</span>
<strong>{route.model}</strong> <strong>{route.model}</strong>
<em>{route.state}</em> <em>{route.state}</em>