feat: 首页下方剧本评测展示页替换为ScriptReviewShowcase,团队token监控替换为ModelGenerationShowcase
This commit is contained in:
@@ -12,7 +12,11 @@ import type { WebViewKey, WebImageWorkbenchTool } from "../../types";
|
||||
import { useScrollEntrance } from "../../hooks/useScrollEntrance";
|
||||
import WelcomeSplash from "./WelcomeSplash";
|
||||
import ToolboxSection from "./ToolboxSection";
|
||||
import ScriptReviewVisual from "./ScriptReviewVisual";
|
||||
import ScriptReviewShowcase from "./ScriptReviewShowcase";
|
||||
import ModelGenerationShowcase from "./ModelGenerationShowcase";
|
||||
import ecommerceTemplate1 from "../../assets/home-features/home-ecommerce-template-1.png";
|
||||
import ecommerceTemplate2 from "../../assets/home-features/home-ecommerce-template-2.png";
|
||||
import ecommerceTemplate3 from "../../assets/home-features/home-ecommerce-template-3.png";
|
||||
|
||||
function ScrollEntrance({ children, className, ...rest }: { children: React.ReactNode; className?: string } & React.HTMLAttributes<HTMLElement>) {
|
||||
const { ref, isVisible } = useScrollEntrance<HTMLElement>();
|
||||
@@ -61,14 +65,14 @@ const HOME_FEATURES = [
|
||||
stats: ["六维评分", "质量量化", "逐项优化"],
|
||||
},
|
||||
{
|
||||
key: "token",
|
||||
eyebrow: "Team Tokens",
|
||||
title: "团队 Token 监控",
|
||||
description: "实时追踪团队 Token 消耗、项目分布和成员使用情况,让预算、配额和成本都能被清楚管理。",
|
||||
key: "model",
|
||||
eyebrow: "AI Generation",
|
||||
title: "模型生成",
|
||||
description: "通过AI模型生成文本、图片、视频,三种模式覆盖全内容类型,Agent对话式交互智能产出。",
|
||||
imageUrl: featureTokenImage,
|
||||
actionLabel: "查看面板",
|
||||
icon: <DashboardOutlined />,
|
||||
stats: ["实时概览", "成员明细", "成本分析"],
|
||||
actionLabel: "开始生成",
|
||||
icon: <ThunderboltOutlined />,
|
||||
stats: ["文本生成", "图片生成", "视频生成"],
|
||||
},
|
||||
{
|
||||
key: "ecommerce",
|
||||
@@ -89,6 +93,34 @@ const HOME_EXPERIENCE_POINTS = [
|
||||
{ label: "电商", meta: "商品视觉", tone: "amber" },
|
||||
];
|
||||
|
||||
const HOME_ECOMMERCE_TEMPLATES = [
|
||||
{
|
||||
title: "卖点详情图",
|
||||
tag: "详情",
|
||||
meta: "中文卖点标注",
|
||||
imageUrl: ecommerceTemplate1,
|
||||
},
|
||||
{
|
||||
title: "场景主图",
|
||||
tag: "主图",
|
||||
meta: "商品氛围构图",
|
||||
imageUrl: ecommerceTemplate2,
|
||||
},
|
||||
{
|
||||
title: "虚拟模特",
|
||||
tag: "模特",
|
||||
meta: "使用场景延展",
|
||||
imageUrl: ecommerceTemplate3,
|
||||
},
|
||||
];
|
||||
|
||||
const HOME_ECOMMERCE_TOOLS = [
|
||||
{ title: "主图", meta: "平台首图" },
|
||||
{ title: "详情", meta: "卖点拆解" },
|
||||
{ title: "模特", meta: "虚拟模特" },
|
||||
{ title: "短视频", meta: "首帧方案" },
|
||||
];
|
||||
|
||||
const HOME_CAROUSEL_SLOTS = [-4, -3, -2, -1, 0, 1, 2, 3, 4];
|
||||
const HOME_CAROUSEL_TRANSITION_MS = 860;
|
||||
|
||||
@@ -127,6 +159,43 @@ function getHomeCarouselCardStyle(offset: number): CSSProperties {
|
||||
} as CSSProperties;
|
||||
}
|
||||
|
||||
function EcommerceFeatureShowcase() {
|
||||
return (
|
||||
<div className="omni-home-ecommerce-showcase">
|
||||
<div className="omni-home-ecommerce-showcase__depth" />
|
||||
<div className="omni-home-ecommerce-showcase__grain" />
|
||||
|
||||
<div className="omni-home-ecommerce-showcase__prompt">
|
||||
<span>商品图 + 生成要求</span>
|
||||
<strong>生成整套电商视觉</strong>
|
||||
<p>主图、详情页、虚拟模特、短视频首帧一次整理。</p>
|
||||
</div>
|
||||
|
||||
<div className="omni-home-ecommerce-showcase__tools" aria-hidden="true">
|
||||
{HOME_ECOMMERCE_TOOLS.map((item) => (
|
||||
<div key={item.title} className="omni-home-ecommerce-showcase__tool">
|
||||
<b>{item.title}</b>
|
||||
<small>{item.meta}</small>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="omni-home-ecommerce-showcase__gallery" aria-hidden="true">
|
||||
{HOME_ECOMMERCE_TEMPLATES.map((item, index) => (
|
||||
<article key={item.title} className={`omni-home-ecommerce-showcase__shot is-${index + 1}`}>
|
||||
<img src={item.imageUrl} alt="" />
|
||||
<div>
|
||||
<span>{item.tag}</span>
|
||||
<strong>{item.title}</strong>
|
||||
<small>{item.meta}</small>
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function HomePage({ onOpenGenerate, onOpenEcommerce, onOpenScriptReview, onOpenTokenMonitor, onSelectView, onOpenImageTool }: HomePageProps) {
|
||||
const [splashDismissed, setSplashDismissed] = useState(() => sessionStorage.getItem("omniai:splash-seen") === "1");
|
||||
const [activeSlideIndex, setActiveSlideIndex] = useState(0);
|
||||
@@ -205,8 +274,8 @@ function HomePage({ onOpenGenerate, onOpenEcommerce, onOpenScriptReview, onOpenT
|
||||
(onOpenScriptReview ?? onOpenGenerate)();
|
||||
return;
|
||||
}
|
||||
if (featureKey === "token") {
|
||||
(onOpenTokenMonitor ?? onOpenGenerate)();
|
||||
if (featureKey === "model") {
|
||||
onOpenGenerate();
|
||||
return;
|
||||
}
|
||||
if (featureKey === "ecommerce") {
|
||||
@@ -312,7 +381,11 @@ function HomePage({ onOpenGenerate, onOpenEcommerce, onOpenScriptReview, onOpenT
|
||||
</div>
|
||||
<div className="omni-home__feature-visual" aria-hidden="true">
|
||||
{feature.key === "script" ? (
|
||||
<ScriptReviewVisual />
|
||||
<ScriptReviewShowcase />
|
||||
) : feature.key === "model" ? (
|
||||
<ModelGenerationShowcase />
|
||||
) : feature.key === "ecommerce" ? (
|
||||
<EcommerceFeatureShowcase />
|
||||
) : (
|
||||
<img src={feature.imageUrl} alt="" />
|
||||
)}
|
||||
|
||||
@@ -0,0 +1,282 @@
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
|
||||
type ShowMode = "agent" | "image" | "video";
|
||||
|
||||
const MODE_TABS = [
|
||||
{ key: "agent" as const, icon: "🤖", title: "Agent 模式", desc: "文本生成,对话式交互,智能推理" },
|
||||
{ key: "image" as const, icon: "🖼️", title: "图片模式", desc: "图像生成,风格迁移,场景合成" },
|
||||
{ key: "video" as const, icon: "🎬", title: "视频模式", desc: "视频生成,动态场景,数字人演绎" },
|
||||
];
|
||||
|
||||
const AGENT_OUTPUTS = [
|
||||
{ tag: "Agent", title: "营销文案", preview: "「未来已来,腕间即达」—— 全新智能手表,让每一秒都充满可能。健康监测、智能提醒、时尚设计,三合一体验。从晨跑配速到会议提醒,它比你更懂你的节奏。" },
|
||||
{ tag: "Agent", title: "产品描述", preview: "搭载最新AI芯片,支持实时心率/血氧/睡眠监测,50米防水,AMOLED视网膜屏,续航长达14天。钛合金表壳 + 硅胶快拆表带,商务运动自由切换。" },
|
||||
{ tag: "Agent", title: "剧本大纲", preview: "第一幕:品牌故事引入 → 第二幕:产品亮点展示 → 第三幕:用户见证与CTA引导。" },
|
||||
];
|
||||
|
||||
const IMAGE_OUTPUTS = [
|
||||
{ tag: "Image", title: "写实风格", icon: "📷", styleClass: "realistic" },
|
||||
{ tag: "Image", title: "插画风格", icon: "🎨", styleClass: "illustration" },
|
||||
{ tag: "Image", title: "电商风格", icon: "🛍️", styleClass: "ecommerce" },
|
||||
];
|
||||
|
||||
const VIDEO_OUTPUTS = [
|
||||
{ tag: "Video", title: "数字人播报", duration: "0:15" },
|
||||
{ tag: "Video", title: "场景动画", duration: "0:30" },
|
||||
{ tag: "Video", title: "产品展示", duration: "0:20" },
|
||||
];
|
||||
|
||||
function ModelGenerationShowcase() {
|
||||
const [mode, setMode] = useState<ShowMode>("agent");
|
||||
const [selectedImageOpt, setSelectedImageOpt] = useState(0);
|
||||
const [, setAnimated] = useState(false);
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const el = containerRef.current;
|
||||
if (!el) return;
|
||||
const observer = new IntersectionObserver(
|
||||
([entry]) => {
|
||||
if (entry?.isIntersecting) {
|
||||
setAnimated(true);
|
||||
observer.disconnect();
|
||||
}
|
||||
},
|
||||
{ threshold: 0.2 },
|
||||
);
|
||||
observer.observe(el);
|
||||
return () => observer.disconnect();
|
||||
}, []);
|
||||
|
||||
const workflowSteps = [
|
||||
{ label: "选择模式", active: mode === "agent" },
|
||||
{ label: "输入描述", active: mode === "image" },
|
||||
{ label: "AI生成", active: mode === "video" },
|
||||
{ label: "输出内容", active: false },
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="omni-model-gen-showcase" ref={containerRef}>
|
||||
{/* Left Panel */}
|
||||
<div className="mgs-left-panel">
|
||||
<div className="mgs-brand-section">
|
||||
<h1>模型生成<br />多模态内容一键产出</h1>
|
||||
<p className="mgs-subtitle">通过AI模型生成文本、图片、视频,三种模式覆盖全内容类型</p>
|
||||
</div>
|
||||
|
||||
<div className="mgs-mode-tabs">
|
||||
{MODE_TABS.map((tab) => (
|
||||
<div
|
||||
key={tab.key}
|
||||
className={`mgs-mode-tab${mode === tab.key ? " is-active" : ""}`}
|
||||
onClick={() => setMode(tab.key)}
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") setMode(tab.key); }}
|
||||
>
|
||||
<div className="mgs-mode-icon">{tab.icon}</div>
|
||||
<div className="mgs-mode-info">
|
||||
<h3>{tab.title}</h3>
|
||||
<p>{tab.desc}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="mgs-workflow">
|
||||
<div className="mgs-workflow-title">工作流程</div>
|
||||
<div className="mgs-workflow-steps">
|
||||
{workflowSteps.map((step, i) => (
|
||||
<span key={step.label}>
|
||||
{i > 0 && <span className="mgs-wf-arrow">→</span>}
|
||||
<span className={`mgs-wf-step${step.active ? " is-active" : ""}`}>{step.label}</span>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Center Area */}
|
||||
<div className="mgs-center-area">
|
||||
<div className="mgs-input-card">
|
||||
{/* Agent Mode */}
|
||||
{mode === "agent" && (
|
||||
<div className="mgs-mode-content is-active">
|
||||
<div className="mgs-card-header">
|
||||
<div className="mgs-card-mode-badge"><span className="mgs-dot" /> Agent 模式</div>
|
||||
<div className="mgs-card-status">在线 · GPT-4o</div>
|
||||
</div>
|
||||
<div className="mgs-prompt-area">
|
||||
<textarea
|
||||
className="mgs-prompt-input"
|
||||
placeholder="描述你的需求... 例如:帮我生成一段智能手表的营销文案,突出健康监测功能"
|
||||
readOnly
|
||||
/>
|
||||
</div>
|
||||
<div className="mgs-options">
|
||||
{["营销文案", "产品描述", "剧本大纲", "数据分析"].map((opt, i) => (
|
||||
<span key={opt} className={`mgs-opt${i === 0 ? " is-selected" : ""}`}>{opt}</span>
|
||||
))}
|
||||
</div>
|
||||
<div className="mgs-agent-output-area">
|
||||
<div className="mgs-agent-result">
|
||||
<div className="mgs-agent-result-label">AI 生成结果</div>
|
||||
<div className="mgs-agent-result-text">
|
||||
「未来已来,腕间即达」—— 全新智能手表,让每一秒都充满可能。健康监测、智能提醒、时尚设计,三合一体验。从晨跑配速到会议提醒,它比你更懂你的节奏。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mgs-chat-input-row">
|
||||
<input className="mgs-chat-input" placeholder="继续对话或修改需求..." readOnly />
|
||||
<button className="mgs-chat-send" type="button" tabIndex={-1}>◆ 生成</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Image Mode */}
|
||||
{mode === "image" && (
|
||||
<div className="mgs-mode-content is-active">
|
||||
<div className="mgs-card-header">
|
||||
<div className="mgs-card-mode-badge"><span className="mgs-dot" /> 图片模式</div>
|
||||
<div className="mgs-card-status">SDXL · Flux</div>
|
||||
</div>
|
||||
<div className="mgs-prompt-area">
|
||||
<textarea
|
||||
className="mgs-prompt-input"
|
||||
placeholder="描述你想生成的图片... 例如:未来科技感城市,赛博朋克风格,霓虹灯光"
|
||||
readOnly
|
||||
/>
|
||||
</div>
|
||||
<div className="mgs-options">
|
||||
{["写实风", "插画风", "电商风", "3D渲染"].map((opt, i) => (
|
||||
<span
|
||||
key={opt}
|
||||
className={`mgs-opt${selectedImageOpt === i ? " is-selected" : ""}`}
|
||||
onClick={() => setSelectedImageOpt(i)}
|
||||
>
|
||||
{opt}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
<div className="mgs-img-grid">
|
||||
<div className="mgs-img-cell">🎨</div>
|
||||
<div className="mgs-img-cell">🖼️</div>
|
||||
<div className="mgs-img-cell">✨</div>
|
||||
<div className="mgs-img-cell">🌈</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Video Mode */}
|
||||
{mode === "video" && (
|
||||
<div className="mgs-mode-content is-active">
|
||||
<div className="mgs-card-header">
|
||||
<div className="mgs-card-mode-badge"><span className="mgs-dot" /> 视频模式</div>
|
||||
<div className="mgs-card-status">Sora · Kling</div>
|
||||
</div>
|
||||
<div className="mgs-video-config">
|
||||
<div className="mgs-config-row">
|
||||
<span className="mgs-config-label">分辨率</span>
|
||||
<span className="mgs-config-value">1080p</span>
|
||||
</div>
|
||||
<div className="mgs-config-row">
|
||||
<span className="mgs-config-label">时长</span>
|
||||
<span className="mgs-config-value">15s</span>
|
||||
</div>
|
||||
<div className="mgs-config-row">
|
||||
<span className="mgs-config-label">帧率</span>
|
||||
<span className="mgs-config-value">30fps</span>
|
||||
</div>
|
||||
<div className="mgs-config-row">
|
||||
<span className="mgs-config-label">风格</span>
|
||||
<span className="mgs-config-value">数字人</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mgs-video-preview">
|
||||
<div className="mgs-play-btn">
|
||||
<svg viewBox="0 0 24 24"><polygon points="6,3 20,12 6,21" /></svg>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mgs-video-timeline">
|
||||
<div className="mgs-video-timeline-fill" />
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Right Panel */}
|
||||
<div className="mgs-right-panel">
|
||||
{/* Agent Outputs */}
|
||||
{mode === "agent" && (
|
||||
<div className="mgs-output-section">
|
||||
<div className="mgs-section-label">
|
||||
<span className="mgs-section-dot is-green" />
|
||||
Agent 文本产出
|
||||
</div>
|
||||
<div className="mgs-output-cards">
|
||||
{AGENT_OUTPUTS.map((item) => (
|
||||
<div key={item.title} className="mgs-out-card">
|
||||
<div className="mgs-out-card-top">
|
||||
<span className="mgs-out-tag">{item.tag}</span>
|
||||
<span className="mgs-out-title">{item.title}</span>
|
||||
</div>
|
||||
<div className="mgs-out-preview">{item.preview}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Image Outputs */}
|
||||
{mode === "image" && (
|
||||
<div className="mgs-output-section">
|
||||
<div className="mgs-section-label">
|
||||
<span className="mgs-section-dot is-blue" />
|
||||
图片产出
|
||||
</div>
|
||||
<div className="mgs-output-cards">
|
||||
{IMAGE_OUTPUTS.map((item) => (
|
||||
<div key={item.title} className="mgs-out-card">
|
||||
<div className="mgs-out-card-top">
|
||||
<span className="mgs-out-tag is-img">{item.tag}</span>
|
||||
<span className="mgs-out-title">{item.title}</span>
|
||||
</div>
|
||||
<div className={`mgs-out-img-placeholder is-${item.styleClass}`}>{item.icon}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Video Outputs */}
|
||||
{mode === "video" && (
|
||||
<div className="mgs-output-section">
|
||||
<div className="mgs-section-label">
|
||||
<span className="mgs-section-dot is-purple" />
|
||||
视频产出
|
||||
</div>
|
||||
<div className="mgs-output-cards">
|
||||
{VIDEO_OUTPUTS.map((item) => (
|
||||
<div key={item.title} className="mgs-out-card">
|
||||
<div className="mgs-out-card-top">
|
||||
<span className="mgs-out-tag is-video">{item.tag}</span>
|
||||
<span className="mgs-out-title">{item.title}</span>
|
||||
</div>
|
||||
<div className="mgs-out-video-placeholder">
|
||||
<div className="mgs-mini-play">
|
||||
<svg viewBox="0 0 24 24"><polygon points="6,3 20,12 6,21" /></svg>
|
||||
</div>
|
||||
<span className="mgs-video-duration">{item.duration}</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default ModelGenerationShowcase;
|
||||
@@ -0,0 +1,208 @@
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
|
||||
const DIMS = [
|
||||
{ name: "钩子设计", score: 16, max: 20, hue: 145, desc: "吸引力·悬念·黄金三秒", isPerfect: false, isLow: false },
|
||||
{ name: "角色塑造", score: 15, max: 15, hue: 155, desc: "立体度·动机·弧光", isPerfect: true, isLow: false },
|
||||
{ name: "剧情结构", score: 16, max: 20, hue: 165, desc: "起承转合·节奏·冲突", isPerfect: false, isLow: false },
|
||||
{ name: "逻辑严密", score: 12, max: 15, hue: 175, desc: "自洽·伏笔·因果链", isPerfect: false, isLow: false },
|
||||
{ name: "场景构建", score: 10, max: 15, hue: 185, desc: "空间·视听·画面感", isPerfect: false, isLow: true },
|
||||
{ name: "内容深度", score: 8, max: 15, hue: 195, desc: "主题·情感·思想内核", isPerfect: false, isLow: true },
|
||||
];
|
||||
|
||||
const HIGHLIGHTS = [
|
||||
{ dim: "角色塑造", score: "15/15 ★", text: "满分表现!人物立体度与弧光设计均达高水准" },
|
||||
{ dim: "钩子设计", score: "16/20", text: "开篇悬念精准,黄金三秒有效抓住注意力" },
|
||||
{ dim: "剧情结构", score: "16/20", text: "起承转合清晰,节奏把控得当,冲突自然递进" },
|
||||
];
|
||||
|
||||
const WEAKNESSES = [
|
||||
{ dim: "内容深度", score: "8/15", text: "主题偏表层,情感共鸣与思想内核挖掘不足" },
|
||||
{ dim: "场景构建", score: "10/15", text: "空间描写模糊,视听语言薄弱,画面感欠缺" },
|
||||
{ dim: "逻辑严密", score: "12/15", text: "世界观细节不足,部分伏笔缺乏回收" },
|
||||
];
|
||||
|
||||
const OPTIMIZATIONS = [
|
||||
{ dim: "场景构建 → 提升", priority: "高优先", priorityClass: "badge-red", text: "增加具体空间描写与视听语言,强化沉浸感" },
|
||||
{ dim: "内容深度 → 深挖", priority: "高优先", priorityClass: "badge-red", text: "围绕核心冲突深化人物选择与情感层次" },
|
||||
{ dim: "逻辑严密 → 补强", priority: "中优先", priorityClass: "badge-orange", text: "补充世界观细节,强化因果链与伏笔回收" },
|
||||
];
|
||||
|
||||
function animateNumber(el: HTMLElement | null, target: number, duration: number) {
|
||||
if (!el) return;
|
||||
const start = performance.now();
|
||||
const targetEl = el;
|
||||
function tick(now: number) {
|
||||
const p = Math.min((now - start) / duration, 1);
|
||||
targetEl.textContent = String(Math.round((1 - Math.pow(1 - p, 3)) * target));
|
||||
if (p < 1) requestAnimationFrame(tick);
|
||||
}
|
||||
requestAnimationFrame(tick);
|
||||
}
|
||||
|
||||
function ScriptReviewShowcase() {
|
||||
const [animated, setAnimated] = useState(false);
|
||||
const scoreRef = useRef<HTMLSpanElement>(null);
|
||||
const barRefs = useRef<(HTMLDivElement | null)[]>([]);
|
||||
const scoreValRefs = useRef<(HTMLSpanElement | null)[]>([]);
|
||||
|
||||
useEffect(() => {
|
||||
const el = document.getElementById("script-review-showcase");
|
||||
if (!el) return;
|
||||
const observer = new IntersectionObserver(
|
||||
([entry]) => {
|
||||
if (entry?.isIntersecting) {
|
||||
setAnimated(true);
|
||||
observer.disconnect();
|
||||
}
|
||||
},
|
||||
{ threshold: 0.25 },
|
||||
);
|
||||
observer.observe(el);
|
||||
return () => observer.disconnect();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!animated) return;
|
||||
const timer = setTimeout(() => {
|
||||
animateNumber(scoreRef.current, 77, 1400);
|
||||
barRefs.current.forEach((bar, i) => {
|
||||
if (!bar) return;
|
||||
const pct = parseFloat(bar.dataset.pct ?? "0");
|
||||
setTimeout(() => { bar.style.height = `${pct}%`; }, i * 100 + 400);
|
||||
});
|
||||
scoreValRefs.current.forEach((el, i) => {
|
||||
setTimeout(() => animateNumber(el, parseInt(el?.dataset.target ?? "0"), 800), i * 100 + 400);
|
||||
});
|
||||
}, 500);
|
||||
return () => clearTimeout(timer);
|
||||
}, [animated]);
|
||||
|
||||
return (
|
||||
<div className="omni-script-review-showcase" id="script-review-showcase">
|
||||
{/* Score Hero */}
|
||||
<div className="srs-score-hero">
|
||||
<div className="srs-score-left">
|
||||
<div className="srs-score-circle">
|
||||
<div className="srs-score-circle-inner">
|
||||
<span className="srs-score-num" ref={scoreRef}>0</span>
|
||||
<span className="srs-score-den">/ 100</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="srs-score-meta">
|
||||
<div className="srs-score-grade">A 级</div>
|
||||
<div className="srs-score-tags">
|
||||
<span className="srs-score-tag">现实剧情</span>
|
||||
<span className="srs-score-tag">58min</span>
|
||||
<span className="srs-score-tag">6角色</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="srs-score-divider" />
|
||||
<div className="srs-score-right">
|
||||
<div className="srs-score-proj">电商广告片生成项目计划 · 评测结果</div>
|
||||
<div className="srs-score-summary">
|
||||
现实剧情特征清晰,角色塑造表现突出。当前最值得继续打磨的是内容深度,建议围绕人物选择、冲突升级和可拍摄细节继续压实。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Vertical Bar Chart */}
|
||||
<div className="srs-chart-card">
|
||||
<div className="srs-chart-title">六维评分 Dimension Breakdown</div>
|
||||
<div className="srs-chart-body">
|
||||
{DIMS.map((dim, i) => {
|
||||
const pct = dim.score / dim.max;
|
||||
return (
|
||||
<div key={dim.name} className="srs-chart-col">
|
||||
<div className="srs-chart-bar-wrap">
|
||||
<div className="srs-chart-bar-bg" style={{ height: "100%" }} />
|
||||
<div
|
||||
ref={(el) => { barRefs.current[i] = el; }}
|
||||
className={`srs-chart-bar-fill${dim.isPerfect ? " is-perfect" : ""}${dim.isLow ? " is-low" : ""}`}
|
||||
data-pct={String(Math.round(pct * 100))}
|
||||
style={{ height: "0%" }}
|
||||
>
|
||||
<div className="srs-chart-bar-score">
|
||||
<span
|
||||
ref={(el) => { scoreValRefs.current[i] = el; }}
|
||||
data-target={String(dim.score)}
|
||||
>0</span>
|
||||
<span className="srs-chart-bar-sub">/{dim.max}</span>
|
||||
{dim.isPerfect && <span className="srs-chart-bar-star">★</span>}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="srs-chart-col-label">
|
||||
<div className="srs-chart-col-name">{dim.name}</div>
|
||||
<div className="srs-chart-col-desc">{dim.desc}</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Triple Section */}
|
||||
<div className="srs-triple-section">
|
||||
{/* Highlights */}
|
||||
<div className="srs-section-card is-highlight">
|
||||
<div className="srs-section-header">
|
||||
<div className="srs-section-icon">✦</div>
|
||||
<span className="srs-section-label">亮点</span>
|
||||
</div>
|
||||
<div className="srs-section-list">
|
||||
{HIGHLIGHTS.map((item) => (
|
||||
<div key={item.dim} className="srs-section-item">
|
||||
<div className="srs-section-item-head">
|
||||
<span className="srs-section-item-dim">{item.dim}</span>
|
||||
<span className="srs-section-item-score is-green">{item.score}</span>
|
||||
</div>
|
||||
<div className="srs-section-item-text">{item.text}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Weaknesses */}
|
||||
<div className="srs-section-card is-weakness">
|
||||
<div className="srs-section-header">
|
||||
<div className="srs-section-icon">✗</div>
|
||||
<span className="srs-section-label">缺点</span>
|
||||
</div>
|
||||
<div className="srs-section-list">
|
||||
{WEAKNESSES.map((item) => (
|
||||
<div key={item.dim} className="srs-section-item">
|
||||
<div className="srs-section-item-head">
|
||||
<span className="srs-section-item-dim">{item.dim}</span>
|
||||
<span className="srs-section-item-score is-red">{item.score}</span>
|
||||
</div>
|
||||
<div className="srs-section-item-text">{item.text}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Optimization */}
|
||||
<div className="srs-section-card is-optimize">
|
||||
<div className="srs-section-header">
|
||||
<div className="srs-section-icon">⚡</div>
|
||||
<span className="srs-section-label">优化路径</span>
|
||||
</div>
|
||||
<div className="srs-section-list">
|
||||
{OPTIMIZATIONS.map((item) => (
|
||||
<div key={item.dim} className="srs-section-item">
|
||||
<div className="srs-section-item-head">
|
||||
<span className="srs-section-item-dim">{item.dim}</span>
|
||||
<span className={`srs-section-item-badge ${item.priorityClass}`}>{item.priority}</span>
|
||||
</div>
|
||||
<div className="srs-section-item-text">{item.text}</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default ScriptReviewShowcase;
|
||||
@@ -7,6 +7,8 @@
|
||||
@import "./pages/welcome-splash.css";
|
||||
@import "./pages/toolbox.css";
|
||||
@import "./pages/script-review-visual.css";
|
||||
@import "./pages/script-review-showcase.css";
|
||||
@import "./pages/model-generation-showcase.css";
|
||||
@import "./pages/workbench.css";
|
||||
@import "./pages/ecommerce.css";
|
||||
@import "./pages/ecommerce-video.css";
|
||||
|
||||
+309
-1
@@ -468,7 +468,7 @@
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.omni-home__feature-page.is-token::before {
|
||||
.omni-home__feature-page.is-model::before {
|
||||
background:
|
||||
linear-gradient(90deg, rgb(5 8 13 / 96%) 0%, rgb(5 8 13 / 80%) 42%, rgb(5 8 13 / 48%) 100%),
|
||||
linear-gradient(180deg, rgb(255 255 255 / 6%), transparent 34%);
|
||||
@@ -594,6 +594,257 @@
|
||||
filter: saturate(1.1) contrast(1.06) brightness(1.04);
|
||||
}
|
||||
|
||||
.omni-home__feature-page.is-model .omni-home__feature-visual {
|
||||
aspect-ratio: 16 / 9;
|
||||
min-height: clamp(360px, 36vw, 620px);
|
||||
max-height: min(68vh, 680px);
|
||||
border-color: rgb(255 255 255 / 14%);
|
||||
border-radius: 8px;
|
||||
background: #0a0b12;
|
||||
box-shadow:
|
||||
0 34px 90px rgb(0 0 0 / 42%),
|
||||
inset 0 1px 0 rgb(255 255 255 / 7%);
|
||||
}
|
||||
|
||||
.omni-home__feature-page.is-ecommerce .omni-home__feature-visual {
|
||||
aspect-ratio: 16 / 9;
|
||||
min-height: clamp(360px, 36vw, 620px);
|
||||
max-height: min(68vh, 680px);
|
||||
border-color: rgb(255 255 255 / 14%);
|
||||
border-radius: 8px;
|
||||
background: #101214;
|
||||
box-shadow:
|
||||
0 34px 90px rgb(0 0 0 / 42%),
|
||||
inset 0 1px 0 rgb(255 255 255 / 7%);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase {
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(240px, 0.86fr) minmax(360px, 1.14fr);
|
||||
grid-template-rows: auto 1fr;
|
||||
gap: clamp(16px, 2vw, 28px);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
padding: clamp(22px, 3vw, 38px);
|
||||
background:
|
||||
linear-gradient(145deg, rgb(255 255 255 / 5%), transparent 28%),
|
||||
linear-gradient(180deg, #181b1d 0%, #0d0f10 100%);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__depth,
|
||||
.omni-home-ecommerce-showcase__grain {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__depth {
|
||||
z-index: -2;
|
||||
background:
|
||||
linear-gradient(90deg, rgb(255 255 255 / 5%) 1px, transparent 1px),
|
||||
linear-gradient(180deg, rgb(255 255 255 / 4%) 1px, transparent 1px),
|
||||
radial-gradient(circle at 50% 50%, transparent 0 42%, rgb(0 0 0 / 36%) 78%),
|
||||
linear-gradient(140deg, rgb(0 255 136 / 10%), transparent 40%);
|
||||
background-size: 32px 32px, 32px 32px, 100% 100%, 100% 100%;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__grain {
|
||||
z-index: -1;
|
||||
opacity: 0.22;
|
||||
background:
|
||||
repeating-linear-gradient(0deg, rgb(255 255 255 / 4%) 0 1px, transparent 1px 4px),
|
||||
repeating-linear-gradient(90deg, rgb(255 255 255 / 3%) 0 1px, transparent 1px 5px);
|
||||
mix-blend-mode: soft-light;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__prompt {
|
||||
display: grid;
|
||||
align-content: center;
|
||||
gap: 8px;
|
||||
min-height: 152px;
|
||||
border: 1px solid rgb(0 255 136 / 42%);
|
||||
border-radius: 8px;
|
||||
background:
|
||||
linear-gradient(135deg, rgb(0 255 136 / 12%), rgb(255 255 255 / 7%)),
|
||||
rgb(18 21 22 / 84%);
|
||||
padding: clamp(18px, 2.2vw, 26px);
|
||||
box-shadow:
|
||||
0 0 0 1px rgb(0 255 136 / 10%),
|
||||
0 20px 58px rgb(0 255 136 / 10%),
|
||||
inset 0 1px 0 rgb(255 255 255 / 10%);
|
||||
backdrop-filter: blur(20px);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__prompt span {
|
||||
color: rgb(0 255 136 / 86%);
|
||||
font-size: clamp(13px, 1vw, 16px);
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__prompt strong {
|
||||
color: #f7faf8;
|
||||
font-size: clamp(26px, 2.5vw, 44px);
|
||||
font-weight: 950;
|
||||
line-height: 1.08;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__prompt p {
|
||||
max-width: 420px;
|
||||
margin: 0;
|
||||
color: rgb(232 238 236 / 76%);
|
||||
font-size: clamp(14px, 1.18vw, 18px);
|
||||
font-weight: 700;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tools {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
align-self: end;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tool {
|
||||
display: grid;
|
||||
gap: 6px;
|
||||
min-height: 92px;
|
||||
align-content: center;
|
||||
border: 1px solid rgb(255 255 255 / 12%);
|
||||
border-radius: 8px;
|
||||
background: rgb(255 255 255 / 7%);
|
||||
padding: 15px 16px;
|
||||
box-shadow: 0 18px 42px rgb(0 0 0 / 20%);
|
||||
backdrop-filter: blur(20px);
|
||||
transition:
|
||||
transform 220ms cubic-bezier(0.16, 1, 0.3, 1),
|
||||
border-color 220ms ease,
|
||||
background 220ms ease;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tool:hover {
|
||||
border-color: rgb(0 255 136 / 36%);
|
||||
background: rgb(0 255 136 / 9%);
|
||||
transform: translateY(-3px) scale(1.01);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tool b {
|
||||
color: #ffffff;
|
||||
font-size: clamp(20px, 1.7vw, 28px);
|
||||
font-weight: 950;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tool small {
|
||||
color: rgb(232 238 236 / 58%);
|
||||
font-size: clamp(12px, 1vw, 15px);
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__gallery {
|
||||
position: relative;
|
||||
grid-row: 1 / 3;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot {
|
||||
position: absolute;
|
||||
display: grid;
|
||||
grid-template-rows: minmax(0, 1fr) auto;
|
||||
overflow: hidden;
|
||||
border: 1px solid rgb(255 255 255 / 14%);
|
||||
border-radius: 8px;
|
||||
background: rgb(255 255 255 / 8%);
|
||||
box-shadow:
|
||||
0 24px 62px rgb(0 0 0 / 32%),
|
||||
inset 0 1px 0 rgb(255 255 255 / 8%);
|
||||
backdrop-filter: blur(20px);
|
||||
transition:
|
||||
transform 240ms cubic-bezier(0.16, 1, 0.3, 1),
|
||||
border-color 220ms ease,
|
||||
box-shadow 220ms ease;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot:hover {
|
||||
border-color: rgb(0 255 136 / 32%);
|
||||
box-shadow: 0 30px 76px rgb(0 0 0 / 40%);
|
||||
transform: translateY(-4px) scale(1.015);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot.is-1 {
|
||||
z-index: 3;
|
||||
top: 3%;
|
||||
left: 18%;
|
||||
width: 61%;
|
||||
height: 65%;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot.is-2 {
|
||||
z-index: 2;
|
||||
bottom: 2%;
|
||||
left: 0;
|
||||
width: 47%;
|
||||
height: 43%;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot.is-3 {
|
||||
z-index: 2;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
width: 48%;
|
||||
height: 45%;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 0;
|
||||
object-fit: cover;
|
||||
object-position: center;
|
||||
filter: saturate(0.96) contrast(1.02);
|
||||
transform: none;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot:hover img {
|
||||
transform: none;
|
||||
filter: saturate(1.02) contrast(1.04);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot > div {
|
||||
display: grid;
|
||||
gap: 3px;
|
||||
border-top: 1px solid rgb(255 255 255 / 10%);
|
||||
background: rgb(12 14 15 / 88%);
|
||||
padding: 12px 14px 13px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot span {
|
||||
justify-self: start;
|
||||
border: 1px solid rgb(0 255 136 / 30%);
|
||||
border-radius: 999px;
|
||||
background: rgb(0 255 136 / 10%);
|
||||
color: rgb(0 255 136 / 92%);
|
||||
padding: 3px 9px;
|
||||
font-size: 12px;
|
||||
font-weight: 950;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot strong {
|
||||
color: #f7faf8;
|
||||
font-size: clamp(15px, 1.15vw, 20px);
|
||||
font-weight: 950;
|
||||
line-height: 1.15;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot small {
|
||||
color: rgb(232 238 236 / 58%);
|
||||
font-size: clamp(11px, 0.92vw, 14px);
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
|
||||
.omni-home__feature-stats {
|
||||
position: absolute;
|
||||
@@ -842,6 +1093,21 @@
|
||||
max-height: none;
|
||||
}
|
||||
|
||||
.omni-home__feature-page.is-model .omni-home__feature-visual,
|
||||
.omni-home__feature-page.is-ecommerce .omni-home__feature-visual {
|
||||
min-height: 620px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase {
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: auto auto minmax(360px, 1fr);
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__gallery {
|
||||
grid-row: auto;
|
||||
min-height: 360px;
|
||||
}
|
||||
|
||||
.omni-home__feature-stats {
|
||||
right: 22px;
|
||||
left: 22px;
|
||||
@@ -907,6 +1173,48 @@
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.omni-home__feature-page.is-ecommerce .omni-home__feature-visual {
|
||||
min-height: 0;
|
||||
aspect-ratio: auto;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase {
|
||||
gap: 14px;
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__prompt {
|
||||
min-height: 130px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tools {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__tool {
|
||||
min-height: 78px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__gallery {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.omni-home-ecommerce-showcase__shot,
|
||||
.omni-home-ecommerce-showcase__shot.is-1,
|
||||
.omni-home-ecommerce-showcase__shot.is-2,
|
||||
.omni-home-ecommerce-showcase__shot.is-3 {
|
||||
position: relative;
|
||||
inset: auto;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
aspect-ratio: 4 / 3;
|
||||
}
|
||||
|
||||
.omni-home__feature-stats {
|
||||
bottom: 34px;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,787 @@
|
||||
/* ===== Model Generation Showcase ===== */
|
||||
.omni-model-gen-showcase {
|
||||
--mgs-green: #00ff88;
|
||||
--mgs-blue: #4fc3f7;
|
||||
--mgs-purple: #a855f7;
|
||||
--mgs-bg: #0a0b12;
|
||||
--mgs-surface: rgba(14, 16, 38, 0.75);
|
||||
--mgs-elevated: rgba(20, 22, 52, 0.85);
|
||||
--mgs-border-subtle: rgba(0, 255, 136, 0.08);
|
||||
--mgs-border-default: rgba(0, 255, 136, 0.14);
|
||||
--mgs-border-hover: rgba(0, 255, 136, 0.28);
|
||||
--mgs-text-primary: #eef0f6;
|
||||
--mgs-text-secondary: #8b8fa7;
|
||||
--mgs-text-muted: #5a5e78;
|
||||
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 8px 10px;
|
||||
background: var(--mgs-bg);
|
||||
color: var(--mgs-text-primary);
|
||||
font-family: "Inter", "Noto Sans SC", sans-serif;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ===== Left Panel ===== */
|
||||
.mgs-left-panel {
|
||||
width: 166px;
|
||||
min-width: 166px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.mgs-brand-section {
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
.mgs-brand-section h1 {
|
||||
font-size: 13px;
|
||||
font-weight: 900;
|
||||
line-height: 1.25;
|
||||
background: linear-gradient(135deg, var(--mgs-green), var(--mgs-blue));
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
margin: 0 0 4px;
|
||||
}
|
||||
|
||||
.mgs-subtitle {
|
||||
font-size: 8px;
|
||||
line-height: 1.5;
|
||||
color: var(--mgs-text-secondary);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Mode Tabs */
|
||||
.mgs-mode-tabs {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.mgs-mode-tab {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
padding: 7px 9px;
|
||||
border-radius: 8px;
|
||||
background: var(--mgs-surface);
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mgs-mode-tab::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: linear-gradient(135deg, rgba(0, 255, 136, 0.05), transparent);
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
}
|
||||
|
||||
.mgs-mode-tab:hover {
|
||||
border-color: var(--mgs-border-hover);
|
||||
transform: translateX(3px);
|
||||
box-shadow: 0 3px 14px rgba(0, 255, 136, 0.08);
|
||||
}
|
||||
|
||||
.mgs-mode-tab:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.mgs-mode-tab.is-active {
|
||||
border-color: rgba(0, 255, 136, 0.25);
|
||||
background: var(--mgs-elevated);
|
||||
box-shadow: 0 0 16px rgba(0, 255, 136, 0.1), inset 0 0 14px rgba(0, 255, 136, 0.03);
|
||||
}
|
||||
|
||||
.mgs-mode-tab.is-active::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.mgs-mode-icon {
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
border-radius: 6px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 13px;
|
||||
flex-shrink: 0;
|
||||
background: rgba(0, 255, 136, 0.08);
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.mgs-mode-tab.is-active .mgs-mode-icon {
|
||||
background: rgba(0, 255, 136, 0.15);
|
||||
box-shadow: 0 0 8px rgba(0, 255, 136, 0.2);
|
||||
}
|
||||
|
||||
.mgs-mode-info h3 {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
margin: 0 0 1px;
|
||||
transition: color 0.3s;
|
||||
}
|
||||
|
||||
.mgs-mode-tab.is-active .mgs-mode-info h3 {
|
||||
color: var(--mgs-green);
|
||||
}
|
||||
|
||||
.mgs-mode-info p {
|
||||
font-size: 7px;
|
||||
color: var(--mgs-text-muted);
|
||||
line-height: 1.3;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Workflow */
|
||||
.mgs-workflow {
|
||||
margin-top: auto;
|
||||
padding: 8px 10px;
|
||||
border-radius: 8px;
|
||||
background: var(--mgs-surface);
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mgs-workflow::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -100%;
|
||||
width: 50%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, rgba(0, 255, 136, 0.06), transparent);
|
||||
animation: mgs-flow 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes mgs-flow {
|
||||
0% { left: -100%; }
|
||||
100% { left: 200%; }
|
||||
}
|
||||
|
||||
.mgs-workflow-title {
|
||||
font-size: 7px;
|
||||
color: var(--mgs-text-muted);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.mgs-workflow-steps {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
font-size: 7px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.mgs-wf-step {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
padding: 4px 2px;
|
||||
border-radius: 4px;
|
||||
color: var(--mgs-text-secondary);
|
||||
background: rgba(0, 255, 136, 0.04);
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
transition: all 0.3s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.mgs-wf-step.is-active {
|
||||
color: var(--mgs-green);
|
||||
border-color: rgba(0, 255, 136, 0.2);
|
||||
background: rgba(0, 255, 136, 0.08);
|
||||
animation: mgs-step-pulse 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes mgs-step-pulse {
|
||||
0%, 100% { box-shadow: 0 0 0 rgba(0, 255, 136, 0); }
|
||||
50% { box-shadow: 0 0 6px rgba(0, 255, 136, 0.15); }
|
||||
}
|
||||
|
||||
.mgs-wf-arrow {
|
||||
color: var(--mgs-text-muted);
|
||||
font-size: 7px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* ===== Center Area ===== */
|
||||
.mgs-center-area {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.mgs-input-card {
|
||||
width: 100%;
|
||||
max-width: 380px;
|
||||
border-radius: 12px;
|
||||
background: var(--mgs-elevated);
|
||||
border: 1px solid var(--mgs-border-default);
|
||||
padding: 14px;
|
||||
position: relative;
|
||||
box-shadow: 0 0 24px rgba(0, 255, 136, 0.04), 0 4px 16px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.mgs-card-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.mgs-card-mode-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 2px 8px;
|
||||
border-radius: 12px;
|
||||
font-size: 8px;
|
||||
font-weight: 700;
|
||||
background: rgba(0, 255, 136, 0.1);
|
||||
color: var(--mgs-green);
|
||||
border: 1px solid rgba(0, 255, 136, 0.15);
|
||||
}
|
||||
|
||||
.mgs-dot {
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
border-radius: 50%;
|
||||
background: var(--mgs-green);
|
||||
animation: mgs-pulse 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes mgs-pulse {
|
||||
0%, 100% { opacity: 1; transform: scale(1); }
|
||||
50% { opacity: 0.5; transform: scale(0.8); }
|
||||
}
|
||||
|
||||
.mgs-card-status {
|
||||
font-size: 7px;
|
||||
color: var(--mgs-text-muted);
|
||||
}
|
||||
|
||||
/* Prompt Area */
|
||||
.mgs-prompt-area {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.mgs-prompt-input {
|
||||
width: 100%;
|
||||
padding: 6px 8px;
|
||||
border-radius: 6px;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
border: 1px solid var(--mgs-border-default);
|
||||
color: var(--mgs-text-primary);
|
||||
font-size: 8px;
|
||||
font-family: inherit;
|
||||
outline: none;
|
||||
resize: none;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.mgs-prompt-input::placeholder {
|
||||
color: var(--mgs-text-muted);
|
||||
}
|
||||
|
||||
.mgs-prompt-input:focus {
|
||||
border-color: rgba(0, 255, 136, 0.3);
|
||||
}
|
||||
|
||||
/* Options */
|
||||
.mgs-options {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
margin-bottom: 8px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.mgs-opt {
|
||||
padding: 3px 7px;
|
||||
border-radius: 5px;
|
||||
font-size: 7px;
|
||||
font-weight: 600;
|
||||
background: rgba(0, 255, 136, 0.06);
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
color: var(--mgs-text-secondary);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.mgs-opt:hover {
|
||||
border-color: var(--mgs-border-hover);
|
||||
color: var(--mgs-green);
|
||||
}
|
||||
|
||||
.mgs-opt.is-selected {
|
||||
border-color: rgba(0, 255, 136, 0.25);
|
||||
color: var(--mgs-green);
|
||||
background: rgba(0, 255, 136, 0.1);
|
||||
}
|
||||
|
||||
/* Agent Result */
|
||||
.mgs-agent-output-area {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.mgs-agent-result {
|
||||
padding: 8px 10px;
|
||||
border-radius: 8px;
|
||||
background: rgba(0, 255, 136, 0.04);
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
}
|
||||
|
||||
.mgs-agent-result-label {
|
||||
font-size: 7px;
|
||||
font-weight: 700;
|
||||
color: var(--mgs-green);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-bottom: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.mgs-agent-result-label::before {
|
||||
content: "";
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
border-radius: 50%;
|
||||
background: var(--mgs-green);
|
||||
animation: mgs-pulse 2s infinite;
|
||||
}
|
||||
|
||||
.mgs-agent-result-text {
|
||||
font-size: 8px;
|
||||
line-height: 1.5;
|
||||
color: var(--mgs-text-secondary);
|
||||
}
|
||||
|
||||
/* Chat Input */
|
||||
.mgs-chat-input-row {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.mgs-chat-input {
|
||||
flex: 1;
|
||||
padding: 5px 8px;
|
||||
border-radius: 6px;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
border: 1px solid var(--mgs-border-default);
|
||||
color: var(--mgs-text-primary);
|
||||
font-size: 8px;
|
||||
font-family: inherit;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.mgs-chat-input::placeholder {
|
||||
color: var(--mgs-text-muted);
|
||||
}
|
||||
|
||||
.mgs-chat-send {
|
||||
padding: 5px 12px;
|
||||
border-radius: 6px;
|
||||
border: none;
|
||||
background: var(--mgs-green);
|
||||
color: #0a0b12;
|
||||
cursor: pointer;
|
||||
font-size: 8px;
|
||||
font-weight: 700;
|
||||
box-shadow: 0 0 8px rgba(0, 255, 136, 0.2);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Image Grid */
|
||||
.mgs-img-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.mgs-img-cell {
|
||||
aspect-ratio: 4 / 3;
|
||||
border-radius: 6px;
|
||||
background: linear-gradient(135deg, rgba(0, 255, 136, 0.05), rgba(79, 195, 247, 0.03));
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
color: var(--mgs-text-muted);
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.mgs-img-cell:hover {
|
||||
border-color: var(--mgs-border-hover);
|
||||
transform: scale(1.02);
|
||||
}
|
||||
|
||||
/* Video Config */
|
||||
.mgs-video-config {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.mgs-config-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 4px 0;
|
||||
border-bottom: 1px solid var(--mgs-border-subtle);
|
||||
font-size: 7px;
|
||||
}
|
||||
|
||||
.mgs-config-row:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.mgs-config-label {
|
||||
color: var(--mgs-text-secondary);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.mgs-config-value {
|
||||
color: var(--mgs-green);
|
||||
font-weight: 600;
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
background: rgba(0, 255, 136, 0.08);
|
||||
}
|
||||
|
||||
/* Video Preview */
|
||||
.mgs-video-preview {
|
||||
aspect-ratio: 16 / 9;
|
||||
border-radius: 8px;
|
||||
background: linear-gradient(135deg, rgba(0, 255, 136, 0.04), rgba(168, 85, 247, 0.04));
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.mgs-play-btn {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 50%;
|
||||
background: rgba(0, 255, 136, 0.15);
|
||||
border: 2px solid rgba(0, 255, 136, 0.3);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.mgs-play-btn:hover {
|
||||
background: rgba(0, 255, 136, 0.25);
|
||||
transform: scale(1.08);
|
||||
box-shadow: 0 0 14px rgba(0, 255, 136, 0.2);
|
||||
}
|
||||
|
||||
.mgs-play-btn svg {
|
||||
fill: var(--mgs-green);
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
.mgs-video-timeline {
|
||||
margin-top: 6px;
|
||||
height: 3px;
|
||||
border-radius: 2px;
|
||||
background: rgba(0, 255, 136, 0.1);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mgs-video-timeline-fill {
|
||||
height: 100%;
|
||||
width: 35%;
|
||||
border-radius: 2px;
|
||||
background: linear-gradient(90deg, var(--mgs-green), var(--mgs-blue));
|
||||
animation: mgs-timeline 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes mgs-timeline {
|
||||
0%, 100% { width: 30%; }
|
||||
50% { width: 45%; }
|
||||
}
|
||||
|
||||
/* ===== Right Panel ===== */
|
||||
.mgs-right-panel {
|
||||
width: 168px;
|
||||
min-width: 168px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.mgs-right-panel::-webkit-scrollbar {
|
||||
width: 2px;
|
||||
}
|
||||
|
||||
.mgs-right-panel::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 255, 136, 0.12);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.mgs-output-section {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.mgs-section-label {
|
||||
font-size: 7px;
|
||||
font-weight: 700;
|
||||
color: var(--mgs-text-muted);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
margin-bottom: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.mgs-section-dot {
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
border-radius: 50%;
|
||||
animation: mgs-pulse 2s infinite;
|
||||
}
|
||||
|
||||
.mgs-section-dot.is-green { background: var(--mgs-green); }
|
||||
.mgs-section-dot.is-blue { background: var(--mgs-blue); }
|
||||
.mgs-section-dot.is-purple { background: var(--mgs-purple); }
|
||||
|
||||
.mgs-output-cards {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.mgs-out-card {
|
||||
padding: 8px 10px;
|
||||
border-radius: 8px;
|
||||
background: var(--mgs-surface);
|
||||
border: 1px solid var(--mgs-border-subtle);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mgs-out-card::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: linear-gradient(135deg, rgba(0, 255, 136, 0.03), transparent);
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
}
|
||||
|
||||
.mgs-out-card:hover {
|
||||
border-color: var(--mgs-border-hover);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 16px rgba(0, 255, 136, 0.06);
|
||||
}
|
||||
|
||||
.mgs-out-card:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.mgs-out-card-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.mgs-out-tag {
|
||||
font-size: 7px;
|
||||
font-weight: 700;
|
||||
padding: 1px 6px;
|
||||
border-radius: 4px;
|
||||
background: rgba(0, 255, 136, 0.1);
|
||||
color: var(--mgs-green);
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.mgs-out-tag.is-img {
|
||||
background: rgba(79, 195, 247, 0.1);
|
||||
color: var(--mgs-blue);
|
||||
}
|
||||
|
||||
.mgs-out-tag.is-video {
|
||||
background: rgba(168, 85, 247, 0.1);
|
||||
color: var(--mgs-purple);
|
||||
}
|
||||
|
||||
.mgs-out-title {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.mgs-out-preview {
|
||||
font-size: 8px;
|
||||
color: var(--mgs-text-secondary);
|
||||
line-height: 1.45;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mgs-out-img-placeholder {
|
||||
height: 40px;
|
||||
border-radius: 5px;
|
||||
margin-top: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.mgs-out-img-placeholder.is-realistic {
|
||||
background: linear-gradient(135deg, rgba(0, 255, 136, 0.06), rgba(0, 255, 136, 0.02));
|
||||
border: 1px dashed rgba(0, 255, 136, 0.12);
|
||||
}
|
||||
|
||||
.mgs-out-img-placeholder.is-illustration {
|
||||
background: linear-gradient(135deg, rgba(79, 195, 247, 0.06), rgba(168, 85, 247, 0.04));
|
||||
border: 1px dashed rgba(79, 195, 247, 0.12);
|
||||
}
|
||||
|
||||
.mgs-out-img-placeholder.is-ecommerce {
|
||||
background: linear-gradient(135deg, rgba(168, 85, 247, 0.06), rgba(0, 255, 136, 0.03));
|
||||
border: 1px dashed rgba(168, 85, 247, 0.12);
|
||||
}
|
||||
|
||||
.mgs-out-video-placeholder {
|
||||
height: 36px;
|
||||
border-radius: 5px;
|
||||
margin-top: 4px;
|
||||
background: linear-gradient(135deg, rgba(168, 85, 247, 0.06), rgba(0, 255, 136, 0.03));
|
||||
border: 1px dashed rgba(168, 85, 247, 0.12);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.mgs-mini-play {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 50%;
|
||||
background: rgba(168, 85, 247, 0.2);
|
||||
border: 1.5px solid rgba(168, 85, 247, 0.3);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.mgs-mini-play svg {
|
||||
fill: var(--mgs-purple);
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
.mgs-video-duration {
|
||||
font-size: 7px;
|
||||
color: var(--mgs-text-muted);
|
||||
}
|
||||
|
||||
/* ===== Responsive ===== */
|
||||
@media (max-width: 980px) {
|
||||
.omni-model-gen-showcase {
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
padding: 6px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.mgs-left-panel {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.mgs-mode-tabs {
|
||||
flex-direction: row;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.mgs-mode-tab {
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
gap: 3px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.mgs-mode-tab:hover {
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.mgs-mode-icon {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.mgs-mode-info h3 {
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
.mgs-mode-info p {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.mgs-workflow {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.mgs-center-area {
|
||||
min-height: 200px;
|
||||
}
|
||||
|
||||
.mgs-right-panel {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
flex-direction: row;
|
||||
gap: 6px;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.mgs-output-cards {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.mgs-out-card {
|
||||
min-width: 150px;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 560px) {
|
||||
.mgs-input-card {
|
||||
padding: 10px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,478 @@
|
||||
/* ===== Script Review Showcase ===== */
|
||||
.omni-script-review-showcase {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 10px 12px;
|
||||
background: #0a0b12;
|
||||
color: #eeeef6;
|
||||
font-family: "Inter", "Noto Sans SC", sans-serif;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Score Hero */
|
||||
.srs-score-hero {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 8px 14px;
|
||||
border-radius: 12px;
|
||||
background: rgba(20, 22, 52, 0.85);
|
||||
border: 1px solid rgba(0, 255, 136, 0.14);
|
||||
flex: 0 0 auto;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.srs-score-hero::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: -1px;
|
||||
border-radius: 13px;
|
||||
background: linear-gradient(135deg, rgba(0, 255, 136, 0.2), rgba(79, 195, 247, 0.12));
|
||||
z-index: -1;
|
||||
opacity: 0.5;
|
||||
filter: blur(1px);
|
||||
}
|
||||
|
||||
.srs-score-left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.srs-score-circle {
|
||||
width: 52px;
|
||||
height: 52px;
|
||||
border-radius: 50%;
|
||||
background: conic-gradient(#00ff88 0deg, #00ff88 calc(77 * 3.6deg), rgba(255, 255, 255, 0.06) calc(77 * 3.6deg));
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
box-shadow: 0 0 20px rgba(0, 255, 136, 0.15);
|
||||
animation: srs-glow 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes srs-glow {
|
||||
0%, 100% { box-shadow: 0 0 20px rgba(0, 255, 136, 0.15); }
|
||||
50% { box-shadow: 0 0 30px rgba(0, 255, 136, 0.25); }
|
||||
}
|
||||
|
||||
.srs-score-circle-inner {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
border-radius: 50%;
|
||||
background: rgba(20, 22, 52, 0.95);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.srs-score-num {
|
||||
font-size: 18px;
|
||||
font-weight: 900;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.srs-score-den {
|
||||
font-size: 8px;
|
||||
color: rgba(150, 155, 185, 0.45);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.srs-score-meta {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.srs-score-grade {
|
||||
font-size: 16px;
|
||||
font-weight: 900;
|
||||
color: #00ff88;
|
||||
line-height: 1;
|
||||
text-shadow: 0 0 16px rgba(0, 255, 136, 0.3);
|
||||
}
|
||||
|
||||
.srs-score-tags {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.srs-score-tag {
|
||||
padding: 1px 6px;
|
||||
border-radius: 4px;
|
||||
font-size: 7px;
|
||||
font-weight: 600;
|
||||
background: rgba(0, 255, 136, 0.08);
|
||||
color: #00ff88;
|
||||
border: 1px solid rgba(0, 255, 136, 0.12);
|
||||
}
|
||||
|
||||
.srs-score-divider {
|
||||
width: 1px;
|
||||
height: 40px;
|
||||
background: linear-gradient(transparent, rgba(255, 255, 255, 0.08), transparent);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.srs-score-right {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.srs-score-proj {
|
||||
font-size: 9px;
|
||||
color: rgba(150, 155, 185, 0.45);
|
||||
margin-bottom: 3px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.srs-score-summary {
|
||||
font-size: 10px;
|
||||
line-height: 1.55;
|
||||
color: rgba(190, 195, 220, 0.72);
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Chart Card */
|
||||
.srs-chart-card {
|
||||
padding: 8px 12px;
|
||||
border-radius: 12px;
|
||||
background: rgba(20, 22, 52, 0.85);
|
||||
border: 1px solid rgba(0, 255, 136, 0.14);
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.srs-chart-title {
|
||||
font-size: 8px;
|
||||
font-weight: 700;
|
||||
color: rgba(190, 195, 220, 0.72);
|
||||
margin-bottom: 6px;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.srs-chart-body {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
gap: 10px;
|
||||
flex: 1;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.srs-chart-col {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.srs-chart-bar-wrap {
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.srs-chart-bar-bg {
|
||||
width: 100%;
|
||||
max-width: 42px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
border-radius: 6px 6px 0 0;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
}
|
||||
|
||||
.srs-chart-bar-fill {
|
||||
width: 100%;
|
||||
max-width: 42px;
|
||||
border-radius: 6px 6px 0 0;
|
||||
background: linear-gradient(180deg, rgba(0, 255, 136, 0.75), #00ff88);
|
||||
box-shadow: 0 0 10px rgba(0, 255, 136, 0.12);
|
||||
height: 0;
|
||||
transition: height 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.srs-chart-bar-fill.is-perfect {
|
||||
background: linear-gradient(180deg, #00ff88, rgba(0, 255, 136, 0.85));
|
||||
box-shadow: 0 0 14px rgba(0, 255, 136, 0.3);
|
||||
}
|
||||
|
||||
.srs-chart-bar-fill.is-low {
|
||||
background: linear-gradient(180deg, rgba(255, 165, 2, 0.65), rgba(255, 165, 2, 0.35));
|
||||
box-shadow: 0 0 10px rgba(255, 165, 2, 0.12);
|
||||
}
|
||||
|
||||
.srs-chart-bar-score {
|
||||
position: absolute;
|
||||
top: -16px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
font-size: 10px;
|
||||
font-weight: 900;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.srs-chart-bar-sub {
|
||||
font-size: 7px;
|
||||
color: rgba(150, 155, 185, 0.45);
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.srs-chart-bar-star {
|
||||
color: #00ff88;
|
||||
font-size: 8px;
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
.srs-chart-col-label {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.srs-chart-col-name {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
color: #eeeef6;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.srs-chart-col-desc {
|
||||
font-size: 7px;
|
||||
color: rgba(150, 155, 185, 0.45);
|
||||
margin-top: 1px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
/* Triple Section */
|
||||
.srs-triple-section {
|
||||
display: flex;
|
||||
gap: 7px;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.srs-section-card {
|
||||
flex: 1;
|
||||
padding: 8px 10px;
|
||||
border-radius: 10px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: all 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
||||
}
|
||||
|
||||
.srs-section-card:hover {
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.srs-section-card.is-highlight {
|
||||
background: rgba(0, 255, 136, 0.03);
|
||||
border: 1px solid rgba(0, 255, 136, 0.1);
|
||||
}
|
||||
|
||||
.srs-section-card.is-highlight::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 2px;
|
||||
background: linear-gradient(90deg, #00ff88, rgba(0, 255, 136, 0.3));
|
||||
border-radius: 10px 10px 0 0;
|
||||
}
|
||||
|
||||
.srs-section-card.is-highlight:hover {
|
||||
border-color: rgba(0, 255, 136, 0.22);
|
||||
box-shadow: 0 6px 24px rgba(0, 255, 136, 0.08);
|
||||
}
|
||||
|
||||
.srs-section-card.is-weakness {
|
||||
background: rgba(255, 71, 87, 0.02);
|
||||
border: 1px solid rgba(255, 71, 87, 0.08);
|
||||
}
|
||||
|
||||
.srs-section-card.is-weakness::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 2px;
|
||||
background: linear-gradient(90deg, #ff4757, rgba(255, 71, 87, 0.3));
|
||||
border-radius: 10px 10px 0 0;
|
||||
}
|
||||
|
||||
.srs-section-card.is-weakness:hover {
|
||||
border-color: rgba(255, 71, 87, 0.2);
|
||||
box-shadow: 0 6px 24px rgba(255, 71, 87, 0.06);
|
||||
}
|
||||
|
||||
.srs-section-card.is-optimize {
|
||||
background: rgba(79, 195, 247, 0.02);
|
||||
border: 1px solid rgba(79, 195, 247, 0.08);
|
||||
}
|
||||
|
||||
.srs-section-card.is-optimize::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 2px;
|
||||
background: linear-gradient(90deg, #4fc3f7, rgba(79, 195, 247, 0.3));
|
||||
border-radius: 10px 10px 0 0;
|
||||
}
|
||||
|
||||
.srs-section-card.is-optimize:hover {
|
||||
border-color: rgba(79, 195, 247, 0.2);
|
||||
box-shadow: 0 6px 24px rgba(79, 195, 247, 0.06);
|
||||
}
|
||||
|
||||
.srs-section-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.srs-section-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 5px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
.is-highlight .srs-section-icon { background: rgba(0, 255, 136, 0.12); }
|
||||
.is-weakness .srs-section-icon { background: rgba(255, 71, 87, 0.12); }
|
||||
.is-optimize .srs-section-icon { background: rgba(79, 195, 247, 0.12); }
|
||||
|
||||
.srs-section-label {
|
||||
font-size: 10px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.is-highlight .srs-section-label { color: #00ff88; }
|
||||
.is-weakness .srs-section-label { color: #ff4757; }
|
||||
.is-optimize .srs-section-label { color: #4fc3f7; }
|
||||
|
||||
.srs-section-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.srs-section-item {
|
||||
padding: 4px 6px;
|
||||
border-radius: 6px;
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
border: 1px solid rgba(255, 255, 255, 0.03);
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.srs-section-item:hover {
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
}
|
||||
|
||||
.srs-section-item-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.srs-section-item-dim {
|
||||
font-size: 9px;
|
||||
font-weight: 700;
|
||||
color: #eeeef6;
|
||||
}
|
||||
|
||||
.srs-section-item-score {
|
||||
font-size: 8px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.srs-section-item-score.is-green { color: #00ff88; }
|
||||
.srs-section-item-score.is-red { color: #ff4757; }
|
||||
|
||||
.srs-section-item-text {
|
||||
font-size: 8px;
|
||||
line-height: 1.4;
|
||||
color: rgba(150, 155, 185, 0.45);
|
||||
}
|
||||
|
||||
.srs-section-item-badge {
|
||||
font-size: 7px;
|
||||
font-weight: 700;
|
||||
padding: 1px 4px;
|
||||
border-radius: 3px;
|
||||
letter-spacing: 0.3px;
|
||||
}
|
||||
|
||||
.srs-section-item-badge.badge-red {
|
||||
background: rgba(255, 71, 87, 0.1);
|
||||
color: #ff4757;
|
||||
}
|
||||
|
||||
.srs-section-item-badge.badge-orange {
|
||||
background: rgba(255, 165, 2, 0.1);
|
||||
color: #ffa502;
|
||||
}
|
||||
|
||||
@media (max-width: 980px) {
|
||||
.omni-script-review-showcase {
|
||||
padding: 8px;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.srs-score-hero {
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.srs-score-divider {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.srs-triple-section {
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 560px) {
|
||||
.srs-score-circle {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.srs-score-circle-inner {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.srs-score-num {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.srs-chart-body {
|
||||
gap: 6px;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user